From python-checkins at python.org Sat Oct 1 01:05:28 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 01:05:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_pyexat_uses_the_new_Unicode?= =?utf8?q?_API?= Message-ID: http://hg.python.org/cpython/rev/a1be34457ccf changeset: 72548:a1be34457ccf user: Victor Stinner date: Sat Oct 01 01:05:40 2011 +0200 summary: pyexat uses the new Unicode API files: Modules/pyexpat.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -1234,11 +1234,13 @@ static PyObject * xmlparse_getattro(xmlparseobject *self, PyObject *nameobj) { - const Py_UNICODE *name; + Py_UCS4 first_char; int handlernum = -1; if (!PyUnicode_Check(nameobj)) goto generic; + if (PyUnicode_READY(nameobj)) + return NULL; handlernum = handlername2int(nameobj); @@ -1250,8 +1252,8 @@ return result; } - name = PyUnicode_AS_UNICODE(nameobj); - if (name[0] == 'E') { + first_char = PyUnicode_READ_CHAR(nameobj, 0); + if (first_char == 'E') { if (PyUnicode_CompareWithASCIIString(nameobj, "ErrorCode") == 0) return PyLong_FromLong((long) XML_GetErrorCode(self->itself)); @@ -1265,7 +1267,7 @@ return PyLong_FromLong((long) XML_GetErrorByteIndex(self->itself)); } - if (name[0] == 'C') { + if (first_char == 'C') { if (PyUnicode_CompareWithASCIIString(nameobj, "CurrentLineNumber") == 0) return PyLong_FromLong((long) XML_GetCurrentLineNumber(self->itself)); @@ -1276,7 +1278,7 @@ return PyLong_FromLong((long) XML_GetCurrentByteIndex(self->itself)); } - if (name[0] == 'b') { + if (first_char == 'b') { if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_size") == 0) return PyLong_FromLong((long) self->buffer_size); if (PyUnicode_CompareWithASCIIString(nameobj, "buffer_text") == 0) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 01:08:37 2011 From: python-checkins at python.org (guido.van.rossum) Date: Sat, 01 Oct 2011 01:08:37 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_posted_by_Greg_Ewing_to?= =?utf8?q?_python-ideas_today?= Message-ID: http://hg.python.org/peps/rev/31aa6576828d changeset: 3953:31aa6576828d user: Guido van Rossum date: Fri Sep 30 16:08:30 2011 -0700 summary: Update posted by Greg Ewing to python-ideas today files: pep-0335.txt | 329 +++++++++++++++++++++++++++++++++++++- 1 files changed, 317 insertions(+), 12 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -2,13 +2,13 @@ Title: Overloadable Boolean Operators Version: $Revision$ Last-Modified: $Date$ -Author: Greg Ewing +Author: Gregory Ewing Status: Draft Type: Standards Track Content-Type: text/x-rst Created: 29-Aug-2004 -Python-Version: 2.4 -Post-History: 05-Sep-2004 +Python-Version: 3.3 +Post-History: 05-Sep-2004, 30-Sep-2011 Abstract @@ -45,7 +45,7 @@ operators excluded from those able to be customised can be inconvenient. Examples include: -1. Numeric/Numarray, in which almost all the operators are defined on +1. NumPy, in which almost all the operators are defined on arrays so as to perform the appropriate operation between corresponding elements, and return an array of the results. For consistency, one would expect a boolean operation between two @@ -54,7 +54,7 @@ There is a precedent for an extension of this kind: comparison operators were originally restricted to returning boolean results, - and rich comparisons were added so that comparisons of Numeric + and rich comparisons were added so that comparisons of NumPy arrays could return arrays of booleans. 2. A symbolic algebra system, in which a Python expression is @@ -87,7 +87,7 @@ 2. There must not be any appreciable loss of speed in the default case. -3. If possible, the customisation mechanism should allow the object to +3. Ideally, the customisation mechanism should allow the object to provide either short-circuiting or non-short-circuiting semantics, at its discretion. @@ -131,14 +131,14 @@ To permit short-circuiting, processing of the 'and' and 'or' operators is split into two phases. Phase 1 occurs after evaluation of the first operand but before the second. If the first operand defines the -appropriate phase 1 method, it is called with the first operand as +relevant phase 1 method, it is called with the first operand as argument. If that method can determine the result without needing the second operand, it returns the result, and further processing is skipped. If the phase 1 method determines that the second operand is needed, it returns the special value NeedOtherOperand. This triggers the -evaluation of the second operand, and the calling of an appropriate +evaluation of the second operand, and the calling of a relevant phase 2 method. During phase 2, the __and2__/__rand2__ and __or2__/__ror2__ method pairs work as for other binary operators. @@ -149,7 +149,7 @@ no corresponding phase 1 method, the second operand is always evaluated and the phase 2 method called. This allows an object which does not want short-circuiting semantics to simply implement the -relevant phase 2 methods and ignore phase 1. +phase 2 methods and ignore phase 1. Bytecodes @@ -182,9 +182,9 @@ Type Slots ---------- -A the C level, the new special methods are manifested as five new +At the C level, the new special methods are manifested as five new slots in the type object. In the patch, they are added to the -tp_as_number substructure, since this allowed making use of some +tp_as_number substructure, since this allows making use of some existing code for dealing with unary and binary operators. Their existence is signalled by a new type flag, Py_TPFLAGS_HAVE_BOOLEAN_OVERLOAD. @@ -208,7 +208,312 @@ PyObject *PyObject_LogicalAnd1(PyObject *); PyObject *PyObject_LogicalOr1(PyObject *); PyObject *PyObject_LogicalAnd2(PyObject *, PyObject *); - PyObject *PyObject_LogicalOr2(PyObject *, PyObject *); + + + +Alternatives and Optimisations +============================== + +This section discusses some possible variations on the proposal, +and ways in which the bytecode sequences generated for boolean +expressions could be optimised. + +Reduced special method set +-------------------------- + +For completeness, the full version of this proposal includes a +mechanism for types to define their own customised short-circuiting +behaviour. However, the full mechanism is not needed to address the +main use cases put forward here, and it would be possible to +define a simplified version that only includes the phase 2 +methods. There would then only be 5 new special methods (__and2__, +__rand2__, __or2__, __ror2__, __not__) with 3 associated type slots +and 3 API functions. + +This simplified version could be expanded to the full version +later if desired. + +Additional bytecodes +-------------------- + +As defined here, the bytecode sequence for code that branches on +the result of a boolean expression would be slightly longer than +it currently is. For example, in Python 2.7, + +:: + + if a and b: + statement1 + else: + statement2 + +generates + +:: + + LOAD_GLOBAL a + POP_JUMP_IF_FALSE false_branch + LOAD_GLOBAL b + POP_JUMP_IF_FALSE false_branch + + JUMP_FORWARD end_branch + false_branch: + + end_branch: + +Under this proposal as described so far, it would become something like + +:: + + LOAD_GLOBAL a + LOGICAL_AND_1 test + LOAD_GLOBAL b + LOGICAL_AND_2 + test: + POP_JUMP_IF_FALSE false_branch + + JUMP_FORWARD end_branch + false_branch: + + end_branch: + +This involves executing one extra bytecode in the short-circuiting +case and two extra bytecodes in the non-short-circuiting case. + +However, by introducing extra bytecodes that combine the logical +operations with testing and branching on the result, it can be +reduced to the same number of bytecodes as the original: + +:: + + LOAD_GLOBAL a + AND1_JUMP true_branch, false_branch + LOAD_GLOBAL b + AND2_JUMP_IF_FALSE false_branch + true_branch: + + JUMP_FORWARD end_branch + false_branch: + + end_branch: + +Here, AND1_JUMP performs phase 1 processing as above, +and then examines the result. If there is a result, it is popped +from the stack, its truth value is tested and a branch taken to +one of two locations. + +Otherwise, the first operand is left on the stack and execution +continues to the next bytecode. The AND2_JUMP_IF_FALSE bytecode +performs phase 2 processing, pops the result and branches if +it tests false + +For the 'or' operator, there would be corresponding OR1_JUMP +and OR2_JUMP_IF_TRUE bytecodes. + +If the simplified version without phase 1 methods is used, then +early exiting can only occur if the first operand is false for +'and' and true for 'or'. Consequently, the two-target AND1_JUMP and +OR1_JUMP bytecodes can be replaced with AND1_JUMP_IF_FALSE and +OR1_JUMP_IF_TRUE, these being ordinary branch instructions with +only one target. + +Optimisation of 'not' +--------------------- + +Recent versions of Python implement a simple optimisation in +which branching on a negated boolean expression is implemented +by reversing the sense of the branch, saving a UNARY_NOT opcode. + +Taking a strict view, this optimisation should no longer be +performed, because the 'not' operator may be overridden to produce +quite different results from usual. However, in typical use cases, +it is not envisaged that expressions involving customised boolean +operations will be used for branching -- it is much more likely +that the result will be used in some other way. + +Therefore, it would probably do little harm to specify that the +compiler is allowed to use the laws of boolean algebra to +simplify any expression that appears directly in a boolean +context. If this is inconvenient, the result can always be assigned +to a temporary name first. + +This would allow the existing 'not' optimisation to remain, and +would permit future extensions of it such as using De Morgan's laws +to extend it deeper into the expression. + + +Usage Examples +============== + +Example 1: NumPy Arrays +----------------------- + +:: + + #----------------------------------------------------------------- + # + # This example creates a subclass of numpy array to which + # 'and', 'or' and 'not' can be applied, producing an array + # of booleans. + # + #----------------------------------------------------------------- + + from numpy import array, ndarray + + class BArray(ndarray): + + def __str__(self): + return "barray(%s)" % ndarray.__str__(self) + + def __and2__(self, other): + return (self & other) + + def __or2__(self, other): + return (self & other) + + def __not__(self): + return (self == 0) + + def barray(*args, **kwds): + return array(*args, **kwds).view(type = BArray) + + a0 = barray([0, 1, 2, 4]) + a1 = barray([1, 2, 3, 4]) + a2 = barray([5, 6, 3, 4]) + a3 = barray([5, 1, 2, 4]) + + print "a0:", a0 + print "a1:", a1 + print "a2:", a2 + print "a3:", a3 + print "not a0:", not a0 + print "a0 == a1 and a2 == a3:", a0 == a1 and a2 == a3 + print "a0 == a1 or a2 == a3:", a0 == a1 or a2 == a3 + +Example 1 Output +---------------- + +:: + + a0: barray([0 1 2 4]) + a1: barray([1 2 3 4]) + a2: barray([5 6 3 4]) + a3: barray([5 1 2 4]) + not a0: barray([ True False False False]) + a0 == a1 and a2 == a3: barray([False False False True]) + a0 == a1 or a2 == a3: barray([False False False True]) + + +Example 2: Database Queries +--------------------------- + +:: + + #----------------------------------------------------------------- + # + # This example demonstrates the creation of a DSL for database + # queries allowing 'and' and 'or' operators to be used to + # formulate the query. + # + #----------------------------------------------------------------- + + class SQLNode(object): + + def __and2__(self, other): + return SQLBinop("and", self, other) + + def __rand2__(self, other): + return SQLBinop("and", other, self) + + def __eq__(self, other): + return SQLBinop("=", self, other) + + + class Table(SQLNode): + + def __init__(self, name): + self.__tablename__ = name + + def __getattr__(self, name): + return SQLAttr(self, name) + + def __sql__(self): + return self.__tablename__ + + + class SQLBinop(SQLNode): + + def __init__(self, op, opnd1, opnd2): + self.op = op.upper() + self.opnd1 = opnd1 + self.opnd2 = opnd2 + + def __sql__(self): + return "(%s %s %s)" % (sql(self.opnd1), self.op, sql(self.opnd2)) + + + class SQLAttr(SQLNode): + + def __init__(self, table, name): + self.table = table + self.name = name + + def __sql__(self): + return "%s.%s" % (sql(self.table), self.name) + + + class SQLSelect(SQLNode): + + def __init__(self, targets): + self.targets = targets + self.where_clause = None + + def where(self, expr): + self.where_clause = expr + return self + + def __sql__(self): + result = "SELECT %s" % ", ".join([sql(target) for target in self.targets]) + if self.where_clause: + result = "%s WHERE %s" % (result, sql(self.where_clause)) + return result + + + def sql(expr): + if isinstance(expr, SQLNode): + return expr.__sql__() + elif isinstance(expr, str): + return "'%s'" % expr.replace("'", "''") + else: + return str(expr) + + + def select(*targets): + return SQLSelect(targets) + + +#-------------------------------------------------------------------------------- + + dishes = Table("dishes") + customers = Table("customers") + orders = Table("orders") + + query = select(customers.name, dishes.price, orders.amount).where( + customers.cust_id == orders.cust_id and orders.dish_id == dishes.dish_id + and dishes.name == "Spam, Eggs, Sausages and Spam") + + print repr(query) + print sql(query) + +Example 2 Output +---------------- + +:: + + <__main__.SQLSelect object at 0x1cc830> + SELECT customers.name, dishes.price, orders.amount WHERE + (((customers.cust_id = orders.cust_id) AND (orders.dish_id = + dishes.dish_id)) AND (dishes.name = 'Spam, Eggs, Sausages and Spam')) Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Oct 1 02:49:27 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FFromObject=28?= =?utf8?q?=29_reuses_PyUnicode=5FCopy=28=29?= Message-ID: http://hg.python.org/cpython/rev/d94b0b371878 changeset: 72549:d94b0b371878 user: Victor Stinner date: Sat Oct 01 01:16:59 2011 +0200 summary: PyUnicode_FromObject() reuses PyUnicode_Copy() * PyUnicode_Copy() is faster than substring() * Fix also a compiler warning files: Objects/unicodeobject.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2052,9 +2052,7 @@ if (PyUnicode_Check(obj)) { /* For a Unicode subtype that's not a Unicode object, return a true Unicode object with the same data. */ - if (PyUnicode_READY(obj) == -1) - return NULL; - return substring((PyUnicodeObject *)obj, 0, PyUnicode_GET_LENGTH(obj)); + return PyUnicode_Copy(obj); } PyErr_Format(PyExc_TypeError, "Can't convert '%.100s' object to str implicitly", @@ -11465,7 +11463,7 @@ return (PyObject*) self; } else - return PyUnicode_Copy(self); + return PyUnicode_Copy((PyObject*)self); } fill = width - _PyUnicode_LENGTH(self); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:27 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_commented_code=3A_st?= =?utf8?q?r+=3Dstr_is_no_more_super-optimized?= Message-ID: http://hg.python.org/cpython/rev/df6deb7bb772 changeset: 72550:df6deb7bb772 user: Victor Stinner date: Sat Oct 01 01:26:08 2011 +0200 summary: Remove commented code: str+=str is no more super-optimized files: Python/ceval.c | 118 +----------------------------------- 1 files changed, 6 insertions(+), 112 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -136,8 +136,6 @@ static int import_all_from(PyObject *, PyObject *); static void format_exc_check_arg(PyObject *, const char *, PyObject *); static void format_exc_unbound(PyCodeObject *co, int oparg); -static PyObject * unicode_concatenate(PyObject *, PyObject *, - PyFrameObject *, unsigned char *); static PyObject * special_lookup(PyObject *, char *, PyObject **); #define NAME_ERROR_MSG \ @@ -1509,17 +1507,11 @@ TARGET(BINARY_ADD) w = POP(); v = TOP(); - if (PyUnicode_CheckExact(v) && - PyUnicode_CheckExact(w)) { - x = unicode_concatenate(v, w, f, next_instr); - /* unicode_concatenate consumed the ref to v */ - goto skip_decref_vx; - } - else { + if (PyUnicode_Check(v) && PyUnicode_Check(w)) + x = PyUnicode_Concat(v, w); + else x = PyNumber_Add(v, w); - } Py_DECREF(v); - skip_decref_vx: Py_DECREF(w); SET_TOP(x); if (x != NULL) DISPATCH(); @@ -1670,17 +1662,11 @@ TARGET(INPLACE_ADD) w = POP(); v = TOP(); - if (PyUnicode_CheckExact(v) && - PyUnicode_CheckExact(w)) { - x = unicode_concatenate(v, w, f, next_instr); - /* unicode_concatenate consumed the ref to v */ - goto skip_decref_v; - } - else { + if (PyUnicode_Check(v) && PyUnicode_Check(w)) + x = PyUnicode_Concat(v, w); + else x = PyNumber_InPlaceAdd(v, w); - } Py_DECREF(v); - skip_decref_v: Py_DECREF(w); SET_TOP(x); if (x != NULL) DISPATCH(); @@ -4515,98 +4501,6 @@ } } -static PyObject * -unicode_concatenate(PyObject *v, PyObject *w, - PyFrameObject *f, unsigned char *next_instr) -{ - /* This function implements 'variable += expr' when both arguments - are (Unicode) strings. */ - - w = PyUnicode_Concat(v, w); - Py_DECREF(v); - return w; - - /* XXX: This optimization is currently disabled as unicode objects in the - new flexible representation are not in-place resizable anymore. */ -#if 0 - Py_ssize_t v_len = PyUnicode_GET_SIZE(v); - Py_ssize_t w_len = PyUnicode_GET_SIZE(w); - Py_ssize_t new_len = v_len + w_len; - if (new_len < 0) { - PyErr_SetString(PyExc_OverflowError, - "strings are too large to concat"); - return NULL; - } - - if (Py_REFCNT(v) == 2) { - /* In the common case, there are 2 references to the value - * stored in 'variable' when the += is performed: one on the - * value stack (in 'v') and one still stored in the - * 'variable'. We try to delete the variable now to reduce - * the refcnt to 1. - */ - switch (*next_instr) { - case STORE_FAST: - { - int oparg = PEEKARG(); - PyObject **fastlocals = f->f_localsplus; - if (GETLOCAL(oparg) == v) - SETLOCAL(oparg, NULL); - break; - } - case STORE_DEREF: - { - PyObject **freevars = (f->f_localsplus + - f->f_code->co_nlocals); - PyObject *c = freevars[PEEKARG()]; - if (PyCell_GET(c) == v) - PyCell_Set(c, NULL); - break; - } - case STORE_NAME: - { - PyObject *names = f->f_code->co_names; - PyObject *name = GETITEM(names, PEEKARG()); - PyObject *locals = f->f_locals; - if (PyDict_CheckExact(locals) && - PyDict_GetItem(locals, name) == v) { - if (PyDict_DelItem(locals, name) != 0) { - PyErr_Clear(); - } - } - break; - } - } - } - - if (Py_REFCNT(v) == 1 && !PyUnicode_CHECK_INTERNED(v) && - !PyUnicode_IS_COMPACT((PyUnicodeObject *)v)) { - /* Now we own the last reference to 'v', so we can resize it - * in-place. - */ - if (PyUnicode_Resize(&v, new_len) != 0) { - /* XXX if PyUnicode_Resize() fails, 'v' has been - * deallocated so it cannot be put back into - * 'variable'. The MemoryError is raised when there - * is no value in 'variable', which might (very - * remotely) be a cause of incompatibilities. - */ - return NULL; - } - /* copy 'w' into the newly allocated area of 'v' */ - memcpy(PyUnicode_AS_UNICODE(v) + v_len, - PyUnicode_AS_UNICODE(w), w_len*sizeof(Py_UNICODE)); - return v; - } - else { - /* When in-place resizing is not an option. */ - w = PyUnicode_Concat(v, w); - Py_DECREF(v); - return w; - } -#endif -} - #ifdef DYNAMIC_EXECUTION_PROFILE static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:28 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_PyUnicode=5FCopy?= =?utf8?q?=28=29=3A_don=27t_recompute_maximum_character?= Message-ID: http://hg.python.org/cpython/rev/b47e8c50a6a0 changeset: 72551:b47e8c50a6a0 user: Victor Stinner date: Sat Oct 01 01:34:32 2011 +0200 summary: Optimize PyUnicode_Copy(): don't recompute maximum character files: Objects/unicodeobject.c | 31 ++++++++++++++++++++++++++-- 1 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1212,15 +1212,40 @@ PyObject* PyUnicode_Copy(PyObject *unicode) { + Py_ssize_t size; + PyObject *copy; + void *data; + if (!PyUnicode_Check(unicode)) { PyErr_BadInternalCall(); return NULL; } if (PyUnicode_READY(unicode)) return NULL; - return PyUnicode_FromKindAndData(PyUnicode_KIND(unicode), - PyUnicode_DATA(unicode), - PyUnicode_GET_LENGTH(unicode)); + + size = PyUnicode_GET_LENGTH(unicode); + copy = PyUnicode_New(size, PyUnicode_MAX_CHAR_VALUE(unicode)); + if (!copy) + return NULL; + assert(PyUnicode_KIND(copy) == PyUnicode_KIND(unicode)); + + data = PyUnicode_DATA(unicode); + switch (PyUnicode_KIND(unicode)) + { + case PyUnicode_1BYTE_KIND: + memcpy(PyUnicode_1BYTE_DATA(copy), data, size); + break; + case PyUnicode_2BYTE_KIND: + memcpy(PyUnicode_2BYTE_DATA(copy), data, sizeof(Py_UCS2) * size); + break; + case PyUnicode_4BYTE_KIND: + memcpy(PyUnicode_4BYTE_DATA(copy), data, sizeof(Py_UCS4) * size); + break; + default: + assert(0); + break; + } + return copy; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:29 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_private_substring=28?= =?utf8?q?=29_function=2C_reuse_public_PyUnicode=5FSubstring=28=29?= Message-ID: http://hg.python.org/cpython/rev/6a98d9bde900 changeset: 72552:6a98d9bde900 user: Victor Stinner date: Sat Oct 01 01:53:49 2011 +0200 summary: Remove private substring() function, reuse public PyUnicode_Substring() * PyUnicode_Substring() now fails if start or end is invalid * PyUnicode_Substring() reuses PyUnicode_Copy() for non-exact strings files: Objects/unicodeobject.c | 90 ++++++++-------------------- 1 files changed, 25 insertions(+), 65 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -283,9 +283,6 @@ /* --- Unicode Object ----------------------------------------------------- */ static PyObject * -substring(PyUnicodeObject *self, Py_ssize_t start, Py_ssize_t len); - -static PyObject * fixup(PyUnicodeObject *self, Py_UCS4 (*fixfct)(PyUnicodeObject *s)); Py_LOCAL_INLINE(char *) findchar(void *s, int kind, @@ -10445,51 +10442,7 @@ j++; } - if (i == 0 && j == len && PyUnicode_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*)self; - } - else - return PyUnicode_Substring((PyObject*)self, i, j); -} - -/* Assumes an already ready self string. */ - -static PyObject * -substring(PyUnicodeObject *self, Py_ssize_t start, Py_ssize_t len) -{ - const int kind = PyUnicode_KIND(self); - void *data = PyUnicode_DATA(self); - Py_UCS4 maxchar = 0; - Py_ssize_t i; - PyObject *unicode; - - if (start < 0 || len < 0 || (start + len) > PyUnicode_GET_LENGTH(self)) { - PyErr_BadInternalCall(); - return NULL; - } - - if (len == PyUnicode_GET_LENGTH(self) && PyUnicode_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*)self; - } - - for (i = 0; i < len; ++i) { - const Py_UCS4 ch = PyUnicode_READ(kind, data, start + i); - if (ch > maxchar) - maxchar = ch; - } - - unicode = PyUnicode_New(len, maxchar); - if (unicode == NULL) - return NULL; - if (PyUnicode_CopyCharacters(unicode, 0, - (PyObject*)self, start, len) < 0) - { - Py_DECREF(unicode); - return NULL; - } - return unicode; + return PyUnicode_Substring((PyObject*)self, i, j); } PyObject* @@ -10497,24 +10450,34 @@ { unsigned char *data; int kind; - - if (start == 0 && end == PyUnicode_GET_LENGTH(self) - && PyUnicode_CheckExact(self)) + Py_ssize_t length; + + if (start == 0 && end == PyUnicode_GET_LENGTH(self)) { - Py_INCREF(self); - return (PyObject *)self; - } - - if ((end - start) == 1) + if (PyUnicode_CheckExact(self)) { + Py_INCREF(self); + return self; + } + else + return PyUnicode_Copy(self); + } + + length = end - start; + if (length == 1) return unicode_getitem((PyUnicodeObject*)self, start); + if (start < 0 || end < 0 || end > PyUnicode_GET_LENGTH(self)) { + PyErr_SetString(PyExc_IndexError, "string index out of range"); + return NULL; + } + if (PyUnicode_READY(self) == -1) return NULL; kind = PyUnicode_KIND(self); data = PyUnicode_1BYTE_DATA(self); return PyUnicode_FromKindAndData(kind, data + PyUnicode_KIND_SIZE(kind, start), - end-start); + length); } static PyObject * @@ -10546,12 +10509,7 @@ j++; } - if (i == 0 && j == len && PyUnicode_CheckExact(self)) { - Py_INCREF(self); - return (PyObject*)self; - } - else - return substring(self, i, j-i); + return PyUnicode_Substring((PyObject*)self, i, j); } @@ -11814,7 +11772,8 @@ Py_INCREF(self); return (PyObject *)self; } else if (step == 1) { - return substring(self, start, slicelength); + return PyUnicode_Substring((PyObject*)self, + start, start + slicelength); } else { source_buf = PyUnicode_AS_UNICODE((PyObject*)self); result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength* @@ -12051,7 +12010,8 @@ "incomplete format key"); goto onError; } - key = substring(uformat, keystart, keylen); + key = PyUnicode_Substring((PyObject*)uformat, + keystart, keystart + keylen); if (key == NULL) goto onError; if (args_owned) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:30 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_usage_of_PyUnicode=5FRE?= =?utf8?q?ADY_in_unicodeobject=2Ec?= Message-ID: http://hg.python.org/cpython/rev/beaa42dcbaec changeset: 72553:beaa42dcbaec user: Victor Stinner date: Sat Oct 01 02:14:59 2011 +0200 summary: Fix usage of PyUnicode_READY in unicodeobject.c files: Objects/unicodeobject.c | 35 +++++++++++----------------- 1 files changed, 14 insertions(+), 21 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7933,7 +7933,7 @@ if (!str_obj || PyUnicode_READY(str_obj) == -1) return -1; sub_obj = (PyUnicodeObject*) PyUnicode_FromObject(substr); - if (!sub_obj || PyUnicode_READY(str_obj) == -1) { + if (!sub_obj || PyUnicode_READY(sub_obj) == -1) { Py_DECREF(str_obj); return -1; } @@ -8460,7 +8460,7 @@ if (separator == NULL) { /* fall back to a blank space separator */ sep = PyUnicode_FromOrdinal(' '); - if (!sep || PyUnicode_READY(sep) == -1) + if (!sep) goto onError; } else { @@ -9190,10 +9190,6 @@ Py_DECREF(uniobj); return 0; } - if (PyUnicode_READY(uniobj)) { - Py_DECREF(uniobj); - return 0; - } *fillcharloc = PyUnicode_READ_CHAR(uniobj, 0); Py_DECREF(uniobj); return 1; @@ -9212,12 +9208,12 @@ Py_ssize_t width; Py_UCS4 fillchar = ' '; + if (!PyArg_ParseTuple(args, "n|O&:center", &width, convert_uc, &fillchar)) + return NULL; + if (PyUnicode_READY(self) == -1) return NULL; - if (!PyArg_ParseTuple(args, "n|O&:center", &width, convert_uc, &fillchar)) - return NULL; - if (_PyUnicode_LENGTH(self) >= width && PyUnicode_CheckExact(self)) { Py_INCREF(self); return (PyObject*) self; @@ -9437,7 +9433,7 @@ return -1; str = PyUnicode_FromObject(container); - if (!str || PyUnicode_READY(container) == -1) { + if (!str || PyUnicode_READY(str) == -1) { Py_DECREF(sub); return -1; } @@ -9515,9 +9511,6 @@ return v; } - if (PyUnicode_READY(u) == -1 || PyUnicode_READY(v) == -1) - goto onError; - maxchar = PyUnicode_MAX_CHAR_VALUE(u); maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(v)); @@ -10662,15 +10655,15 @@ PyObject *result; self = PyUnicode_FromObject(obj); - if (self == NULL || PyUnicode_READY(obj) == -1) + if (self == NULL || PyUnicode_READY(self) == -1) return NULL; str1 = PyUnicode_FromObject(subobj); - if (str1 == NULL || PyUnicode_READY(obj) == -1) { + if (str1 == NULL || PyUnicode_READY(str1) == -1) { Py_DECREF(self); return NULL; } str2 = PyUnicode_FromObject(replobj); - if (str2 == NULL || PyUnicode_READY(obj)) { + if (str2 == NULL || PyUnicode_READY(str2)) { Py_DECREF(self); Py_DECREF(str1); return NULL; @@ -10705,7 +10698,7 @@ if (str1 == NULL || PyUnicode_READY(str1) == -1) return NULL; str2 = PyUnicode_FromObject(str2); - if (str2 == NULL || PyUnicode_READY(str1) == -1) { + if (str2 == NULL || PyUnicode_READY(str2) == -1) { Py_DECREF(str1); return NULL; } @@ -10958,12 +10951,12 @@ Py_ssize_t width; Py_UCS4 fillchar = ' '; + if (!PyArg_ParseTuple(args, "n|O&:rjust", &width, convert_uc, &fillchar)) + return NULL; + if (PyUnicode_READY(self) == -1) return NULL; - if (!PyArg_ParseTuple(args, "n|O&:rjust", &width, convert_uc, &fillchar)) - return NULL; - if (_PyUnicode_LENGTH(self) >= width && PyUnicode_CheckExact(self)) { Py_INCREF(self); return (PyObject*) self; @@ -11032,7 +11025,7 @@ Py_ssize_t len1, len2; str_obj = PyUnicode_FromObject(str_in); - if (!str_obj || PyUnicode_READY(str_in) == -1) + if (!str_obj || PyUnicode_READY(str_obj) == -1) return NULL; sep_obj = PyUnicode_FromObject(sep_in); if (!sep_obj || PyUnicode_READY(sep_obj) == -1) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:30 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FCHARACTER=5FSIZ?= =?utf8?q?E=28=29=3A_add_a_reference_to_PyUnicode=5FKIND=5FSIZE=28=29?= Message-ID: http://hg.python.org/cpython/rev/2e9fb59a1484 changeset: 72554:2e9fb59a1484 user: Victor Stinner date: Sat Oct 01 02:39:37 2011 +0200 summary: PyUnicode_CHARACTER_SIZE(): add a reference to PyUnicode_KIND_SIZE() files: Include/unicodeobject.h | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -338,7 +338,9 @@ /* Return the number of bytes the string uses to represent single characters, - this can be 1, 2 or 4. */ + this can be 1, 2 or 4. + + See also PyUnicode_KIND_SIZE(). */ #define PyUnicode_CHARACTER_SIZE(op) \ (1 << (PyUnicode_KIND(op) - 1)) @@ -378,8 +380,9 @@ _PyUnicode_NONCOMPACT_DATA(op)) /* Compute (index * char_size) where char_size is 2 ** (kind - 1). + The index is a character index, the result is a size in bytes. - The index is a character index, the result is a size in bytes. */ + See also PyUnicode_CHARACTER_SIZE(). */ #define PyUnicode_KIND_SIZE(kind, index) ((index) << ((kind) - 1)) /* In the access macros below, "kind" may be evaluated more than once. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 02:49:31 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 02:49:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_I_want_a_super_fast_=27a=27?= =?utf8?q?_*_n!?= Message-ID: http://hg.python.org/cpython/rev/ba3e9f5bcbf6 changeset: 72555:ba3e9f5bcbf6 user: Victor Stinner date: Sat Oct 01 02:47:29 2011 +0200 summary: I want a super fast 'a' * n! * Optimize unicode_repeat() for a special case with memset() * Simplify integer overflow checking; remove the second check because PyUnicode_New() already does it and uses a smaller limit (Py_ssize_t vs size_t) files: Objects/unicodeobject.c | 25 ++++++++++--------------- 1 files changed, 10 insertions(+), 15 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10583,7 +10583,6 @@ { PyUnicodeObject *u; Py_ssize_t nchars, n; - size_t nbytes, char_size; if (len < 1) { Py_INCREF(unicode_empty); @@ -10599,32 +10598,28 @@ if (PyUnicode_READY(str) == -1) return NULL; - /* ensure # of chars needed doesn't overflow int and # of bytes - * needed doesn't overflow size_t - */ - nchars = len * PyUnicode_GET_LENGTH(str); - if (nchars / len != PyUnicode_GET_LENGTH(str)) { + if (len > PY_SSIZE_T_MAX / PyUnicode_GET_LENGTH(str)) { PyErr_SetString(PyExc_OverflowError, "repeated string is too long"); return NULL; } - char_size = PyUnicode_CHARACTER_SIZE(str); - nbytes = (nchars + 1) * char_size; - if (nbytes / char_size != (size_t)(nchars + 1)) { - PyErr_SetString(PyExc_OverflowError, - "repeated string is too long"); - return NULL; - } + nchars = len * PyUnicode_GET_LENGTH(str); + u = (PyUnicodeObject *)PyUnicode_New(nchars, PyUnicode_MAX_CHAR_VALUE(str)); if (!u) return NULL; + assert(PyUnicode_KIND(u) == PyUnicode_KIND(str)); if (PyUnicode_GET_LENGTH(str) == 1) { const int kind = PyUnicode_KIND(str); const Py_UCS4 fill_char = PyUnicode_READ(kind, PyUnicode_DATA(str), 0); void *to = PyUnicode_DATA(u); - for (n = 0; n < len; ++n) - PyUnicode_WRITE(kind, to, n, fill_char); + if (kind == PyUnicode_1BYTE_KIND) + memset(to, (unsigned char)fill_char, len); + else { + for (n = 0; n < len; ++n) + PyUnicode_WRITE(kind, to, n, fill_char); + } } else { /* number of characters copied this far */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 03:09:44 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 03:09:44 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FFromObject=28?= =?utf8?q?=29_ensures_that_its_output_is_a_ready_string?= Message-ID: http://hg.python.org/cpython/rev/58e3373f06d1 changeset: 72556:58e3373f06d1 user: Victor Stinner date: Sat Oct 01 03:09:33 2011 +0200 summary: PyUnicode_FromObject() ensures that its output is a ready string files: Objects/unicodeobject.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2068,6 +2068,8 @@ /* XXX Perhaps we should make this API an alias of PyObject_Str() instead ?! */ if (PyUnicode_CheckExact(obj)) { + if (PyUnicode_READY(obj)) + return NULL; Py_INCREF(obj); return obj; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 03:09:45 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 03:09:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Ooops=2C_avoid_a_division_b?= =?utf8?q?y_zero_in_unicode=5Frepeat=28=29?= Message-ID: http://hg.python.org/cpython/rev/17aba77fa99c changeset: 72557:17aba77fa99c user: Victor Stinner date: Sat Oct 01 03:09:58 2011 +0200 summary: Ooops, avoid a division by zero in unicode_repeat() files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10600,7 +10600,7 @@ if (PyUnicode_READY(str) == -1) return NULL; - if (len > PY_SSIZE_T_MAX / PyUnicode_GET_LENGTH(str)) { + if (PyUnicode_GET_LENGTH(str) > PY_SSIZE_T_MAX / len) { PyErr_SetString(PyExc_OverflowError, "repeated string is too long"); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 03:31:30 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 01 Oct 2011 03:31:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_remove_=22fast-path=22_for_?= =?utf8?q?=28i=29adding_strings?= Message-ID: http://hg.python.org/cpython/rev/6da962d77eb3 changeset: 72558:6da962d77eb3 user: Benjamin Peterson date: Fri Sep 30 21:31:21 2011 -0400 summary: remove "fast-path" for (i)adding strings These were just an artifact of the old unicode concatenation hack and likely just penalized other kinds of adding. Also, this fixes __(i)add__ on string subclasses. files: Lib/test/test_unicode.py | 12 ++++++++++++ Python/ceval.c | 10 ++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1760,6 +1760,18 @@ self.assertEqual(size, nchar) self.assertEqual(wchar, nonbmp + '\0') + def test_subclass_add(self): + class S(str): + def __add__(self, o): + return "3" + self.assertEqual(S("4") + S("5"), "3") + class S(str): + def __iadd__(self, o): + return "3" + s = S("1") + s += "4" + self.assertEqual(s, "3") + class StringModuleTest(unittest.TestCase): def test_formatter_parser(self): diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1507,10 +1507,7 @@ TARGET(BINARY_ADD) w = POP(); v = TOP(); - if (PyUnicode_Check(v) && PyUnicode_Check(w)) - x = PyUnicode_Concat(v, w); - else - x = PyNumber_Add(v, w); + x = PyNumber_Add(v, w); Py_DECREF(v); Py_DECREF(w); SET_TOP(x); @@ -1662,10 +1659,7 @@ TARGET(INPLACE_ADD) w = POP(); v = TOP(); - if (PyUnicode_Check(v) && PyUnicode_Check(w)) - x = PyUnicode_Concat(v, w); - else - x = PyNumber_InPlaceAdd(v, w); + x = PyNumber_InPlaceAdd(v, w); Py_DECREF(v); Py_DECREF(w); SET_TOP(x); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 04:02:21 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 04:02:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPyUnicode=5FAsKind=28=29?= =?utf8?q?_is_*not*_part_of_the_stable_ABI?= Message-ID: http://hg.python.org/cpython/rev/fc7d2c6db61b changeset: 72559:fc7d2c6db61b user: Victor Stinner date: Sat Oct 01 03:57:28 2011 +0200 summary: _PyUnicode_AsKind() is *not* part of the stable ABI files: Include/unicodeobject.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -795,7 +795,9 @@ Py_ssize_t *size /* number of characters of the result */ ); +#ifndef Py_LIMITED_API PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); +#endif #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 04:02:21 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 04:02:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FSubstring=28=29?= =?utf8?q?_now_accepts_end_bigger_than_string_length?= Message-ID: http://hg.python.org/cpython/rev/45f1de829d70 changeset: 72560:45f1de829d70 user: Victor Stinner date: Sat Oct 01 03:55:54 2011 +0200 summary: PyUnicode_Substring() now accepts end bigger than string length Fix also a bug: call PyUnicode_READY() before reading string length. files: Objects/unicodeobject.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10447,6 +10447,11 @@ int kind; Py_ssize_t length; + if (PyUnicode_READY(self) == -1) + return NULL; + + end = Py_MIN(end, PyUnicode_GET_LENGTH(self)); + if (start == 0 && end == PyUnicode_GET_LENGTH(self)) { if (PyUnicode_CheckExact(self)) { @@ -10461,13 +10466,11 @@ if (length == 1) return unicode_getitem((PyUnicodeObject*)self, start); - if (start < 0 || end < 0 || end > PyUnicode_GET_LENGTH(self)) { + if (start < 0 || end < 0) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return NULL; } - if (PyUnicode_READY(self) == -1) - return NULL; kind = PyUnicode_KIND(self); data = PyUnicode_1BYTE_DATA(self); return PyUnicode_FromKindAndData(kind, -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 1 05:26:42 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 01 Oct 2011 05:26:42 +0200 Subject: [Python-checkins] Daily reference leaks (17aba77fa99c): sum=0 Message-ID: results for 17aba77fa99c on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogZEmHtw', '-x'] From python-checkins at python.org Sat Oct 1 06:12:28 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 01 Oct 2011 06:12:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_remove_reference_to_non-exi?= =?utf8?q?stent_file?= Message-ID: http://hg.python.org/cpython/rev/bb0264220858 changeset: 72561:bb0264220858 parent: 72558:6da962d77eb3 user: Benjamin Peterson date: Sat Oct 01 00:11:09 2011 -0400 summary: remove reference to non-existent file files: Objects/unicodeobject.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1,8 +1,7 @@ /* Unicode implementation based on original code by Fredrik Lundh, -modified by Marc-Andre Lemburg according to the -Unicode Integration Proposal (see file Misc/unicode.txt). +modified by Marc-Andre Lemburg . Major speed upgrades to the method implementations at the Reykjavik NeedForSpeed sprint, by Fredrik Lundh and Andrew Dalke. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 06:12:29 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 01 Oct 2011 06:12:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/cb9334cdff18 changeset: 72562:cb9334cdff18 parent: 72561:bb0264220858 parent: 72560:45f1de829d70 user: Benjamin Peterson date: Sat Oct 01 00:12:20 2011 -0400 summary: merge heads files: Include/unicodeobject.h | 2 ++ Objects/unicodeobject.c | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -795,7 +795,9 @@ Py_ssize_t *size /* number of characters of the result */ ); +#ifndef Py_LIMITED_API PyAPI_FUNC(void*) _PyUnicode_AsKind(PyObject *s, unsigned int kind); +#endif #endif diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10446,6 +10446,11 @@ int kind; Py_ssize_t length; + if (PyUnicode_READY(self) == -1) + return NULL; + + end = Py_MIN(end, PyUnicode_GET_LENGTH(self)); + if (start == 0 && end == PyUnicode_GET_LENGTH(self)) { if (PyUnicode_CheckExact(self)) { @@ -10460,13 +10465,11 @@ if (length == 1) return unicode_getitem((PyUnicodeObject*)self, start); - if (start < 0 || end < 0 || end > PyUnicode_GET_LENGTH(self)) { + if (start < 0 || end < 0) { PyErr_SetString(PyExc_IndexError, "string index out of range"); return NULL; } - if (PyUnicode_READY(self) == -1) - return NULL; kind = PyUnicode_KIND(self); data = PyUnicode_1BYTE_DATA(self); return PyUnicode_FromKindAndData(kind, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 16:35:48 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 01 Oct 2011 16:35:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_13085=3A_Fix_some_mem?= =?utf8?q?ory_leaks=2E_Patch_by_Stefan_Krah=2E?= Message-ID: http://hg.python.org/cpython/rev/1b203e741fb2 changeset: 72563:1b203e741fb2 user: Martin v. L?wis date: Sat Oct 01 16:35:40 2011 +0200 summary: Issue 13085: Fix some memory leaks. Patch by Stefan Krah. files: Objects/unicodeobject.c | 1 + Python/import.c | 30 ++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9075,6 +9075,7 @@ PyUnicode_KIND_SIZE(rkind, slen-i)); } u = PyUnicode_FromKindAndData(rkind, res, new_size); + PyMem_Free(res); } if (srelease) PyMem_FREE(sbuf); diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1564,8 +1564,10 @@ if (py == NULL) goto error; - if (_Py_stat(py, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) + if (_Py_stat(py, &statbuf) == 0 && S_ISREG(statbuf.st_mode)) { + PyMem_Free(fileuni); return py; + } Py_DECREF(py); goto unchanged; @@ -3074,7 +3076,7 @@ Py_ssize_t len; Py_UCS4 *p; PyObject *fullname, *name, *result, *mark_name; - const Py_UCS4 *nameuni; + Py_UCS4 *nameuni; *p_outputname = NULL; @@ -3095,7 +3097,7 @@ if (len == 0) { PyErr_SetString(PyExc_ValueError, "Empty module name"); - return NULL; + goto error; } } else @@ -3104,7 +3106,7 @@ if (*p_buflen+len+1 >= bufsize) { PyErr_SetString(PyExc_ValueError, "Module name too long"); - return NULL; + goto error; } p = buf + *p_buflen; @@ -3119,12 +3121,12 @@ fullname = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buf, *p_buflen); if (fullname == NULL) - return NULL; + goto error; name = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, p, len); if (name == NULL) { Py_DECREF(fullname); - return NULL; + goto error; } result = import_submodule(mod, name, fullname); Py_DECREF(fullname); @@ -3138,12 +3140,12 @@ buf, *p_buflen); if (mark_name == NULL) { Py_DECREF(result); - return NULL; + goto error; } if (mark_miss(mark_name) != 0) { Py_DECREF(result); Py_DECREF(mark_name); - return NULL; + goto error; } Py_DECREF(mark_name); Py_UCS4_strncpy(buf, nameuni, len); @@ -3154,13 +3156,13 @@ else Py_DECREF(name); if (result == NULL) - return NULL; + goto error; if (result == Py_None) { Py_DECREF(result); PyErr_Format(PyExc_ImportError, "No module named %R", inputname); - return NULL; + goto error; } if (dot != NULL) { @@ -3168,11 +3170,17 @@ dot+1, Py_UCS4_strlen(dot+1)); if (*p_outputname == NULL) { Py_DECREF(result); - return NULL; + goto error; } } +out: + PyMem_Free(nameuni); return result; + +error: + PyMem_Free(nameuni); + return NULL; } static int -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 16:45:25 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 01 Oct 2011 16:45:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Backout_of_changeset_228fd2?= =?utf8?q?bd83a5_by_Nadeem_Vawda_in_branch_=27default=27=3A?= Message-ID: http://hg.python.org/cpython/rev/7fabd75a6ae4 changeset: 72564:7fabd75a6ae4 user: Antoine Pitrou date: Sat Oct 01 16:41:48 2011 +0200 summary: Backout of changeset 228fd2bd83a5 by Nadeem Vawda in branch 'default': Issue #12804: Prevent "make test" from using network resources. files: Tools/scripts/run_tests.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -37,7 +37,7 @@ if not any(is_multiprocess_flag(arg) for arg in regrtest_args): args.extend(['-j', '0']) # Use all CPU cores if not any(is_resource_use_flag(arg) for arg in regrtest_args): - args.extend(['-u', 'all,-largefile,-network,-urlfetch,-audio,-gui']) + args.extend(['-u', 'all,-largefile,-audio,-gui']) args.extend(regrtest_args) print(' '.join(args)) os.execv(sys.executable, args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 16:53:44 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 16:53:44 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_=5FPyUnicode=5FUTF8=28?= =?utf8?q?=29_and_=5FPyUnicode=5FUTF8=5FLENGTH=28=29_macros?= Message-ID: http://hg.python.org/cpython/rev/4afab01f5374 changeset: 72565:4afab01f5374 user: Victor Stinner date: Sat Oct 01 16:48:13 2011 +0200 summary: Add _PyUnicode_UTF8() and _PyUnicode_UTF8_LENGTH() macros * Rename existing _PyUnicode_UTF8() macro to PyUnicode_UTF8() * Rename existing _PyUnicode_UTF8_LENGTH() macro to PyUnicode_UTF8_LENGTH() * PyUnicode_UTF8() and PyUnicode_UTF8_LENGTH() are more strict files: Objects/unicodeobject.c | 97 ++++++++++++++++------------ 1 files changed, 55 insertions(+), 42 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -104,14 +104,22 @@ } \ } while (0) -#define _PyUnicode_UTF8(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ - ((char*)((PyASCIIObject*)(op) + 1)) : \ - ((PyCompactUnicodeObject*)(op))->utf8) +#define _PyUnicode_UTF8(op) \ + (((PyCompactUnicodeObject*)(op))->utf8) +#define PyUnicode_UTF8(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((char*)((PyASCIIObject*)(op) + 1)) : \ + _PyUnicode_UTF8(op)) #define _PyUnicode_UTF8_LENGTH(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ - ((PyASCIIObject*)(op))->length : \ - ((PyCompactUnicodeObject*)(op))->utf8_length) + (((PyCompactUnicodeObject*)(op))->utf8_length) +#define PyUnicode_UTF8_LENGTH(op) \ + (assert(PyUnicode_Check(op)), \ + assert(PyUnicode_IS_READY(op)), \ + PyUnicode_IS_COMPACT_ASCII(op) ? \ + ((PyASCIIObject*)(op))->length : \ + _PyUnicode_UTF8_LENGTH(op)) #define _PyUnicode_WSTR(op) (((PyASCIIObject*)(op))->wstr) #define _PyUnicode_WSTR_LENGTH(op) (((PyCompactUnicodeObject*)(op))->wstr_length) #define _PyUnicode_LENGTH(op) (((PyASCIIObject *)(op))->length) @@ -353,11 +361,11 @@ reset: if (unicode->data.any != NULL) { PyObject_FREE(unicode->data.any); - if (unicode->_base.utf8 && unicode->_base.utf8 != unicode->data.any) { - PyObject_FREE(unicode->_base.utf8); - } - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + if (_PyUnicode_UTF8(unicode) && _PyUnicode_UTF8(unicode) != unicode->data.any) { + PyObject_FREE(_PyUnicode_UTF8(unicode)); + } + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; unicode->data.any = NULL; _PyUnicode_LENGTH(unicode) = 0; _PyUnicode_STATE(unicode).interned = _PyUnicode_STATE(unicode).interned; @@ -435,8 +443,8 @@ _PyUnicode_STATE(unicode).ascii = 0; unicode->data.any = NULL; _PyUnicode_LENGTH(unicode) = 0; - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; return unicode; onError: @@ -452,7 +460,7 @@ /* Functions wrapping macros for use in debugger */ char *_PyUnicode_utf8(void *unicode){ - return _PyUnicode_UTF8(unicode); + return PyUnicode_UTF8(unicode); } void *_PyUnicode_compact_data(void *unicode) { @@ -799,7 +807,7 @@ assert(_PyUnicode_KIND(obj) == PyUnicode_WCHAR_KIND); assert(_PyUnicode_WSTR(unicode) != NULL); assert(unicode->data.any == NULL); - assert(unicode->_base.utf8 == NULL); + assert(_PyUnicode_UTF8(unicode) == NULL); /* Actually, it should neither be interned nor be anything else: */ assert(_PyUnicode_STATE(unicode).interned == SSTATE_NOT_INTERNED); @@ -825,12 +833,12 @@ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_1BYTE_KIND; if (maxchar < 128) { - unicode->_base.utf8 = unicode->data.any; - unicode->_base.utf8_length = _PyUnicode_WSTR_LENGTH(unicode); + _PyUnicode_UTF8(unicode) = unicode->data.any; + _PyUnicode_UTF8_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); } else { - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; } PyObject_FREE(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; @@ -848,8 +856,8 @@ PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; #else /* sizeof(wchar_t) == 4 */ unicode->data.any = PyObject_MALLOC( @@ -864,8 +872,8 @@ PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; PyObject_FREE(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; @@ -884,8 +892,8 @@ } _PyUnicode_LENGTH(unicode) = length_wo_surrogates; _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; if (unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode) < 0) { assert(0 && "ConvertWideCharToUCS4 failed"); @@ -899,8 +907,8 @@ unicode->data.any = _PyUnicode_WSTR(unicode); _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); - unicode->_base.utf8 = NULL; - unicode->_base.utf8_length = 0; + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; #endif PyUnicode_4BYTE_DATA(unicode)[_PyUnicode_LENGTH(unicode)] = '\0'; @@ -935,8 +943,10 @@ (!PyUnicode_IS_READY(unicode) || _PyUnicode_WSTR(unicode) != PyUnicode_DATA(unicode))) PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (_PyUnicode_UTF8(unicode) && _PyUnicode_UTF8(unicode) != PyUnicode_DATA(unicode)) - PyObject_DEL(unicode->_base.utf8); + if (!PyUnicode_IS_COMPACT_ASCII(unicode) + && _PyUnicode_UTF8(unicode) + && _PyUnicode_UTF8(unicode) != PyUnicode_DATA(unicode)) + PyObject_DEL(_PyUnicode_UTF8(unicode)); if (PyUnicode_IS_COMPACT(unicode)) { Py_TYPE(unicode)->tp_free((PyObject *)unicode); @@ -2648,23 +2658,24 @@ if (PyUnicode_READY(u) == -1) return NULL; - if (_PyUnicode_UTF8(unicode) == NULL) { + if (PyUnicode_UTF8(unicode) == NULL) { + assert(!PyUnicode_IS_COMPACT_ASCII(unicode)); bytes = _PyUnicode_AsUTF8String(unicode, "strict"); if (bytes == NULL) return NULL; - u->_base.utf8 = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); - if (u->_base.utf8 == NULL) { + _PyUnicode_UTF8(u) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); + if (_PyUnicode_UTF8(u) == NULL) { Py_DECREF(bytes); return NULL; } - u->_base.utf8_length = PyBytes_GET_SIZE(bytes); - Py_MEMCPY(u->_base.utf8, PyBytes_AS_STRING(bytes), u->_base.utf8_length + 1); + _PyUnicode_UTF8_LENGTH(u) = PyBytes_GET_SIZE(bytes); + Py_MEMCPY(_PyUnicode_UTF8(u), PyBytes_AS_STRING(bytes), _PyUnicode_UTF8_LENGTH(u) + 1); Py_DECREF(bytes); } if (psize) - *psize = _PyUnicode_UTF8_LENGTH(unicode); - return _PyUnicode_UTF8(unicode); + *psize = PyUnicode_UTF8_LENGTH(unicode); + return PyUnicode_UTF8(unicode); } char* @@ -3997,9 +4008,9 @@ if (PyUnicode_READY(unicode) == -1) return NULL; - if (_PyUnicode_UTF8(unicode)) - return PyBytes_FromStringAndSize(_PyUnicode_UTF8(unicode), - _PyUnicode_UTF8_LENGTH(unicode)); + if (PyUnicode_UTF8(unicode)) + return PyBytes_FromStringAndSize(PyUnicode_UTF8(unicode), + PyUnicode_UTF8_LENGTH(unicode)); kind = PyUnicode_KIND(unicode); data = PyUnicode_DATA(unicode); @@ -11625,8 +11636,10 @@ (!PyUnicode_IS_READY(v) || (PyUnicode_DATA(v) != _PyUnicode_WSTR(v)))) size += (PyUnicode_WSTR_LENGTH(v) + 1) * sizeof(wchar_t); - if (_PyUnicode_UTF8(v) && _PyUnicode_UTF8(v) != PyUnicode_DATA(v)) - size += _PyUnicode_UTF8_LENGTH(v) + 1; + if (!PyUnicode_IS_COMPACT_ASCII(v) + && _PyUnicode_UTF8(v) + && _PyUnicode_UTF8(v) != PyUnicode_DATA(v)) + size += PyUnicode_UTF8_LENGTH(v) + 1; return PyLong_FromSsize_t(size); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 16:53:45 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 01 Oct 2011 16:53:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_unicode=5Fsubtype?= =?utf8?q?=5Fnew=28=29=3A_don=27t_encode_to_wchar=5Ft_and_decode_from_wcha?= =?utf8?b?cl90?= Message-ID: http://hg.python.org/cpython/rev/756001a37949 changeset: 72566:756001a37949 user: Victor Stinner date: Sat Oct 01 16:16:43 2011 +0200 summary: Optimize unicode_subtype_new(): don't encode to wchar_t and decode from wchar_t Rewrite unicode_subtype_new(): allocate directly the right type. files: Lib/test/test_unicode.py | 11 +- Objects/unicodeobject.c | 121 +++++++++++++++++--------- 2 files changed, 85 insertions(+), 47 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1010,10 +1010,13 @@ class UnicodeSubclass(str): pass - self.assertEqual( - str(UnicodeSubclass('unicode subclass becomes unicode')), - 'unicode subclass becomes unicode' - ) + for text in ('ascii', '\xe9', '\u20ac', '\U0010FFFF'): + subclass = UnicodeSubclass(text) + self.assertEqual(str(subclass), text) + self.assertEqual(len(subclass), len(text)) + if text == 'ascii': + self.assertEqual(subclass.encode('ascii'), b'ascii') + self.assertEqual(subclass.encode('utf-8'), b'ascii') self.assertEqual( str('strings are converted to unicode'), diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12410,56 +12410,91 @@ static PyObject * unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyUnicodeObject *tmp, *pnew; - Py_ssize_t n; - PyObject *err = NULL; + PyUnicodeObject *unicode, *self; + Py_ssize_t length, char_size; + int share_wstr, share_utf8; + unsigned int kind; + void *data; assert(PyType_IsSubtype(type, &PyUnicode_Type)); - tmp = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds); - if (tmp == NULL) - return NULL; - assert(PyUnicode_Check(tmp)); - // TODO: Verify the PyUnicode_GET_SIZE does the right thing. - // it seems kind of strange that tp_alloc gets passed the size - // of the unicode string because there will follow another - // malloc. - pnew = (PyUnicodeObject *) type->tp_alloc(type, - n = PyUnicode_GET_SIZE(tmp)); - if (pnew == NULL) { - Py_DECREF(tmp); - return NULL; - } - _PyUnicode_WSTR(pnew) = (Py_UNICODE*) PyObject_MALLOC(sizeof(Py_UNICODE) * (n+1)); - if (_PyUnicode_WSTR(pnew) == NULL) { - err = PyErr_NoMemory(); + + unicode = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds); + if (unicode == NULL) + return NULL; + assert(PyUnicode_Check(unicode)); + if (PyUnicode_READY(unicode)) + return NULL; + + self = (PyUnicodeObject *) type->tp_alloc(type, 0); + if (self == NULL) { + Py_DECREF(unicode); + return NULL; + } + kind = PyUnicode_KIND(unicode); + length = PyUnicode_GET_LENGTH(unicode); + + _PyUnicode_LENGTH(self) = length; + _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode); + _PyUnicode_STATE(self).interned = 0; + _PyUnicode_STATE(self).kind = kind; + _PyUnicode_STATE(self).compact = 0; + _PyUnicode_STATE(self).ascii = 0; + _PyUnicode_STATE(self).ready = 1; + _PyUnicode_WSTR(self) = NULL; + _PyUnicode_UTF8_LENGTH(self) = 0; + _PyUnicode_UTF8(self) = NULL; + _PyUnicode_WSTR_LENGTH(self) = 0; + self->data.any = NULL; + + share_utf8 = 0; + share_wstr = 0; + if (kind == PyUnicode_1BYTE_KIND) { + char_size = 1; + if (PyUnicode_MAX_CHAR_VALUE(unicode) < 128) + share_utf8 = 1; + } + else if (kind == PyUnicode_2BYTE_KIND) { + char_size = 2; + if (sizeof(wchar_t) == 2) + share_wstr = 1; + } + else { + assert(kind == PyUnicode_4BYTE_KIND); + char_size = 4; + if (sizeof(wchar_t) == 4) + share_wstr = 1; + } + + /* Ensure we won't overflow the length. */ + if (length > (PY_SSIZE_T_MAX / char_size - 1)) { + PyErr_NoMemory(); goto onError; } - Py_UNICODE_COPY(_PyUnicode_WSTR(pnew), PyUnicode_AS_UNICODE(tmp), n+1); - _PyUnicode_WSTR_LENGTH(pnew) = n; - _PyUnicode_HASH(pnew) = _PyUnicode_HASH(tmp); - _PyUnicode_STATE(pnew).interned = 0; - _PyUnicode_STATE(pnew).kind = 0; - _PyUnicode_STATE(pnew).compact = 0; - _PyUnicode_STATE(pnew).ready = 0; - _PyUnicode_STATE(pnew).ascii = 0; - pnew->data.any = NULL; - _PyUnicode_LENGTH(pnew) = 0; - pnew->_base.utf8 = NULL; - pnew->_base.utf8_length = 0; - - if (PyUnicode_READY(pnew) == -1) { - PyObject_FREE(_PyUnicode_WSTR(pnew)); + data = PyObject_MALLOC((length + 1) * char_size); + if (data == NULL) { + PyErr_NoMemory(); goto onError; } - Py_DECREF(tmp); - return (PyObject *)pnew; - - onError: - _Py_ForgetReference((PyObject *)pnew); - PyObject_Del(pnew); - Py_DECREF(tmp); - return err; + self->data.any = data; + if (share_utf8) { + _PyUnicode_UTF8_LENGTH(self) = length; + _PyUnicode_UTF8(self) = data; + } + if (share_wstr) { + _PyUnicode_WSTR_LENGTH(self) = length; + _PyUnicode_WSTR(self) = (wchar_t *)data; + } + + Py_MEMCPY(data, PyUnicode_DATA(unicode), + PyUnicode_KIND_SIZE(kind, length + 1)); + Py_DECREF(unicode); + return (PyObject *)self; + +onError: + Py_DECREF(unicode); + Py_DECREF(self); + return NULL; } PyDoc_STRVAR(unicode_doc, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 19:26:02 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 01 Oct 2011 19:26:02 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDM0?= =?utf8?q?=3A_When_decoding_some_SSL_certificates=2C_the_subjectAltName_ex?= =?utf8?q?tension?= Message-ID: http://hg.python.org/cpython/rev/65e7f40fefd4 changeset: 72567:65e7f40fefd4 branch: 3.2 parent: 72531:160b52c9e8b3 user: Antoine Pitrou date: Sat Oct 01 19:20:25 2011 +0200 summary: Issue #13034: When decoding some SSL certificates, the subjectAltName extension could be unreported. files: Lib/test/nokia.pem | 31 +++++++++++++++++++++++++++++++ Lib/test/test_ssl.py | 26 ++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_ssl.c | 2 +- 4 files changed, 61 insertions(+), 1 deletions(-) diff --git a/Lib/test/nokia.pem b/Lib/test/nokia.pem new file mode 100644 --- /dev/null +++ b/Lib/test/nokia.pem @@ -0,0 +1,31 @@ +# Certificate for projects.developer.nokia.com:443 (see issue 13034) +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIQLubqdkCgdc7lAF9NfHlUmjANBgkqhkiG9w0BAQUFADCB +vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug +YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt +VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X +DTExMDkyMTAwMDAwMFoXDTEyMDkyMDIzNTk1OVowcTELMAkGA1UEBhMCRkkxDjAM +BgNVBAgTBUVzcG9vMQ4wDAYDVQQHFAVFc3BvbzEOMAwGA1UEChQFTm9raWExCzAJ +BgNVBAsUAkJJMSUwIwYDVQQDFBxwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29t +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr92w1bpHYSYxUEx8N/8Iddda2 +lYi+aXNtQfV/l2Fw9Ykv3Ipw4nLeGTj18FFlAZgMdPRlgrzF/NNXGw/9l3/qKdow +CypkQf8lLaxb9Ze1E/KKmkRJa48QTOqvo6GqKuTI6HCeGlG1RxDb8YSKcQWLiytn +yj3Wp4MgRQO266xmMQIDAQABo4IB9jCCAfIwQQYDVR0RBDowOIIccHJvamVjdHMu +ZGV2ZWxvcGVyLm5va2lhLmNvbYIYcHJvamVjdHMuZm9ydW0ubm9raWEuY29tMAkG +A1UdEwQCMAAwCwYDVR0PBAQDAgWgMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9T +VlJJbnRsLUczLWNybC52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNybDBEBgNVHSAE +PTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwKAYDVR0lBCEwHwYJYIZIAYb4QgQBBggrBgEFBQcDAQYI +KwYBBQUHAwIwcgYIKwYBBQUHAQEEZjBkMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz +cC52ZXJpc2lnbi5jb20wPAYIKwYBBQUHMAKGMGh0dHA6Ly9TVlJJbnRsLUczLWFp +YS52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNlcjBuBggrBgEFBQcBDARiMGChXqBc +MFowWDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRLa7kolgYMu9BSOJsprEsH +iyEFGDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvMS5naWYwDQYJ +KoZIhvcNAQEFBQADggEBACQuPyIJqXwUyFRWw9x5yDXgMW4zYFopQYOw/ItRY522 +O5BsySTh56BWS6mQB07XVfxmYUGAvRQDA5QHpmY8jIlNwSmN3s8RKo+fAtiNRlcL +x/mWSfuMs3D/S6ev3D6+dpEMZtjrhOdctsarMKp8n/hPbwhAbg5hVjpkW5n8vz2y +0KxvvkA1AxpLwpVv7OlK17ttzIHw8bp9HTlHBU5s8bKz4a565V/a5HI0CSEv/+0y +ko4/ghTnZc1CkmUngKKeFMSah/mT/xAh8XnE2l1AazFa8UKuYki1e+ArHaGZc4ix +UYOtiRphwfuYQhRZ7qX9q2MMkCMI65XNK/SaFrAbbG0= +-----END CERTIFICATE----- diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -51,6 +51,7 @@ BADCERT = data_file("badcert.pem") WRONGCERT = data_file("XXXnonexisting.pem") BADKEY = data_file("badkey.pem") +NOKIACERT = data_file("nokia.pem") def handle_error(prefix): @@ -117,6 +118,31 @@ p = ssl._ssl._test_decode_cert(CERTFILE) if support.verbose: sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['issuer'], + ((('countryName', 'XY'),), + (('localityName', 'Castle Anthrax'),), + (('organizationName', 'Python Software Foundation'),), + (('commonName', 'localhost'),)) + ) + self.assertEqual(p['notAfter'], 'Oct 5 23:01:56 2020 GMT') + self.assertEqual(p['notBefore'], 'Oct 8 23:01:56 2010 GMT') + self.assertEqual(p['serialNumber'], 'D7C7381919AFC24E') + self.assertEqual(p['subject'], + ((('countryName', 'XY'),), + (('localityName', 'Castle Anthrax'),), + (('organizationName', 'Python Software Foundation'),), + (('commonName', 'localhost'),)) + ) + self.assertEqual(p['subjectAltName'], (('DNS', 'localhost'),)) + # Issue #13034: the subjectAltName in some certificates + # (notably projects.developer.nokia.com:443) wasn't parsed + p = ssl._ssl._test_decode_cert(NOKIACERT) + if support.verbose: + sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['subjectAltName'], + (('DNS', 'projects.developer.nokia.com'), + ('DNS', 'projects.forum.nokia.com')) + ) def test_DER_to_PEM(self): with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Library ------- +- Issue #13034: When decoding some SSL certificates, the subjectAltName + extension could be unreported. + - Issue #9871: Prevent IDLE 3 crash when given byte stings with invalid hex escape sequences, like b'\x0'. (Original patch by Claudiu Popa.) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -578,7 +578,7 @@ /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); - i = 0; + i = -1; while ((i = X509_get_ext_by_NID( certificate, NID_subject_alt_name, i)) >= 0) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 19:26:03 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 01 Oct 2011 19:26:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313034=3A_When_decoding_some_SSL_certificates=2C_the?= =?utf8?q?_subjectAltName_extension?= Message-ID: http://hg.python.org/cpython/rev/90a06fbb1f85 changeset: 72568:90a06fbb1f85 parent: 72566:756001a37949 parent: 72567:65e7f40fefd4 user: Antoine Pitrou date: Sat Oct 01 19:22:30 2011 +0200 summary: Issue #13034: When decoding some SSL certificates, the subjectAltName extension could be unreported. files: Lib/test/nokia.pem | 31 +++++++++++++++++++++++++++++++ Lib/test/test_ssl.py | 26 ++++++++++++++++++++++++++ Misc/NEWS | 3 +++ Modules/_ssl.c | 2 +- 4 files changed, 61 insertions(+), 1 deletions(-) diff --git a/Lib/test/nokia.pem b/Lib/test/nokia.pem new file mode 100644 --- /dev/null +++ b/Lib/test/nokia.pem @@ -0,0 +1,31 @@ +# Certificate for projects.developer.nokia.com:443 (see issue 13034) +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIQLubqdkCgdc7lAF9NfHlUmjANBgkqhkiG9w0BAQUFADCB +vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug +YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt +VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X +DTExMDkyMTAwMDAwMFoXDTEyMDkyMDIzNTk1OVowcTELMAkGA1UEBhMCRkkxDjAM +BgNVBAgTBUVzcG9vMQ4wDAYDVQQHFAVFc3BvbzEOMAwGA1UEChQFTm9raWExCzAJ +BgNVBAsUAkJJMSUwIwYDVQQDFBxwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29t +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr92w1bpHYSYxUEx8N/8Iddda2 +lYi+aXNtQfV/l2Fw9Ykv3Ipw4nLeGTj18FFlAZgMdPRlgrzF/NNXGw/9l3/qKdow +CypkQf8lLaxb9Ze1E/KKmkRJa48QTOqvo6GqKuTI6HCeGlG1RxDb8YSKcQWLiytn +yj3Wp4MgRQO266xmMQIDAQABo4IB9jCCAfIwQQYDVR0RBDowOIIccHJvamVjdHMu +ZGV2ZWxvcGVyLm5va2lhLmNvbYIYcHJvamVjdHMuZm9ydW0ubm9raWEuY29tMAkG +A1UdEwQCMAAwCwYDVR0PBAQDAgWgMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9T +VlJJbnRsLUczLWNybC52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNybDBEBgNVHSAE +PTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwKAYDVR0lBCEwHwYJYIZIAYb4QgQBBggrBgEFBQcDAQYI +KwYBBQUHAwIwcgYIKwYBBQUHAQEEZjBkMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz +cC52ZXJpc2lnbi5jb20wPAYIKwYBBQUHMAKGMGh0dHA6Ly9TVlJJbnRsLUczLWFp +YS52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNlcjBuBggrBgEFBQcBDARiMGChXqBc +MFowWDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRLa7kolgYMu9BSOJsprEsH +iyEFGDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvMS5naWYwDQYJ +KoZIhvcNAQEFBQADggEBACQuPyIJqXwUyFRWw9x5yDXgMW4zYFopQYOw/ItRY522 +O5BsySTh56BWS6mQB07XVfxmYUGAvRQDA5QHpmY8jIlNwSmN3s8RKo+fAtiNRlcL +x/mWSfuMs3D/S6ev3D6+dpEMZtjrhOdctsarMKp8n/hPbwhAbg5hVjpkW5n8vz2y +0KxvvkA1AxpLwpVv7OlK17ttzIHw8bp9HTlHBU5s8bKz4a565V/a5HI0CSEv/+0y +ko4/ghTnZc1CkmUngKKeFMSah/mT/xAh8XnE2l1AazFa8UKuYki1e+ArHaGZc4ix +UYOtiRphwfuYQhRZ7qX9q2MMkCMI65XNK/SaFrAbbG0= +-----END CERTIFICATE----- diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -54,6 +54,7 @@ BADCERT = data_file("badcert.pem") WRONGCERT = data_file("XXXnonexisting.pem") BADKEY = data_file("badkey.pem") +NOKIACERT = data_file("nokia.pem") def handle_error(prefix): @@ -130,6 +131,31 @@ p = ssl._ssl._test_decode_cert(CERTFILE) if support.verbose: sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['issuer'], + ((('countryName', 'XY'),), + (('localityName', 'Castle Anthrax'),), + (('organizationName', 'Python Software Foundation'),), + (('commonName', 'localhost'),)) + ) + self.assertEqual(p['notAfter'], 'Oct 5 23:01:56 2020 GMT') + self.assertEqual(p['notBefore'], 'Oct 8 23:01:56 2010 GMT') + self.assertEqual(p['serialNumber'], 'D7C7381919AFC24E') + self.assertEqual(p['subject'], + ((('countryName', 'XY'),), + (('localityName', 'Castle Anthrax'),), + (('organizationName', 'Python Software Foundation'),), + (('commonName', 'localhost'),)) + ) + self.assertEqual(p['subjectAltName'], (('DNS', 'localhost'),)) + # Issue #13034: the subjectAltName in some certificates + # (notably projects.developer.nokia.com:443) wasn't parsed + p = ssl._ssl._test_decode_cert(NOKIACERT) + if support.verbose: + sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['subjectAltName'], + (('DNS', 'projects.developer.nokia.com'), + ('DNS', 'projects.forum.nokia.com')) + ) def test_DER_to_PEM(self): with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,9 @@ Library ------- +- Issue #13034: When decoding some SSL certificates, the subjectAltName + extension could be unreported. + - Issue #9871: Prevent IDLE 3 crash when given byte stings with invalid hex escape sequences, like b'\x0'. (Original patch by Claudiu Popa.) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -595,7 +595,7 @@ /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); - i = 0; + i = -1; while ((i = X509_get_ext_by_NID( certificate, NID_subject_alt_name, i)) >= 0) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 19:34:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 01 Oct 2011 19:34:38 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDM0?= =?utf8?q?=3A_When_decoding_some_SSL_certificates=2C_the_subjectAltName_ex?= =?utf8?q?tension?= Message-ID: http://hg.python.org/cpython/rev/8e6694387c98 changeset: 72569:8e6694387c98 branch: 2.7 parent: 72530:dec00ae64ca8 user: Antoine Pitrou date: Sat Oct 01 19:30:58 2011 +0200 summary: Issue #13034: When decoding some SSL certificates, the subjectAltName extension could be unreported. files: Lib/test/nokia.pem | 31 +++++++++++++++++++++++++++++++ Lib/test/test_ssl.py | 24 ++++++++++++++++++++++-- Modules/_ssl.c | 2 +- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/Lib/test/nokia.pem b/Lib/test/nokia.pem new file mode 100644 --- /dev/null +++ b/Lib/test/nokia.pem @@ -0,0 +1,31 @@ +# Certificate for projects.developer.nokia.com:443 (see issue 13034) +-----BEGIN CERTIFICATE----- +MIIFLDCCBBSgAwIBAgIQLubqdkCgdc7lAF9NfHlUmjANBgkqhkiG9w0BAQUFADCB +vDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2Ug +YXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL3JwYSAoYykxMDE2MDQGA1UEAxMt +VmVyaVNpZ24gQ2xhc3MgMyBJbnRlcm5hdGlvbmFsIFNlcnZlciBDQSAtIEczMB4X +DTExMDkyMTAwMDAwMFoXDTEyMDkyMDIzNTk1OVowcTELMAkGA1UEBhMCRkkxDjAM +BgNVBAgTBUVzcG9vMQ4wDAYDVQQHFAVFc3BvbzEOMAwGA1UEChQFTm9raWExCzAJ +BgNVBAsUAkJJMSUwIwYDVQQDFBxwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29t +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCr92w1bpHYSYxUEx8N/8Iddda2 +lYi+aXNtQfV/l2Fw9Ykv3Ipw4nLeGTj18FFlAZgMdPRlgrzF/NNXGw/9l3/qKdow +CypkQf8lLaxb9Ze1E/KKmkRJa48QTOqvo6GqKuTI6HCeGlG1RxDb8YSKcQWLiytn +yj3Wp4MgRQO266xmMQIDAQABo4IB9jCCAfIwQQYDVR0RBDowOIIccHJvamVjdHMu +ZGV2ZWxvcGVyLm5va2lhLmNvbYIYcHJvamVjdHMuZm9ydW0ubm9raWEuY29tMAkG +A1UdEwQCMAAwCwYDVR0PBAQDAgWgMEEGA1UdHwQ6MDgwNqA0oDKGMGh0dHA6Ly9T +VlJJbnRsLUczLWNybC52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNybDBEBgNVHSAE +PTA7MDkGC2CGSAGG+EUBBxcDMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZl +cmlzaWduLmNvbS9ycGEwKAYDVR0lBCEwHwYJYIZIAYb4QgQBBggrBgEFBQcDAQYI +KwYBBQUHAwIwcgYIKwYBBQUHAQEEZjBkMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz +cC52ZXJpc2lnbi5jb20wPAYIKwYBBQUHMAKGMGh0dHA6Ly9TVlJJbnRsLUczLWFp +YS52ZXJpc2lnbi5jb20vU1ZSSW50bEczLmNlcjBuBggrBgEFBQcBDARiMGChXqBc +MFowWDBWFglpbWFnZS9naWYwITAfMAcGBSsOAwIaBBRLa7kolgYMu9BSOJsprEsH +iyEFGDAmFiRodHRwOi8vbG9nby52ZXJpc2lnbi5jb20vdnNsb2dvMS5naWYwDQYJ +KoZIhvcNAQEFBQADggEBACQuPyIJqXwUyFRWw9x5yDXgMW4zYFopQYOw/ItRY522 +O5BsySTh56BWS6mQB07XVfxmYUGAvRQDA5QHpmY8jIlNwSmN3s8RKo+fAtiNRlcL +x/mWSfuMs3D/S6ev3D6+dpEMZtjrhOdctsarMKp8n/hPbwhAbg5hVjpkW5n8vz2y +0KxvvkA1AxpLwpVv7OlK17ttzIHw8bp9HTlHBU5s8bKz4a565V/a5HI0CSEv/+0y +ko4/ghTnZc1CkmUngKKeFMSah/mT/xAh8XnE2l1AazFa8UKuYki1e+ArHaGZc4ix +UYOtiRphwfuYQhRZ7qX9q2MMkCMI65XNK/SaFrAbbG0= +-----END CERTIFICATE----- diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -110,6 +110,23 @@ p = ssl._ssl._test_decode_cert(CERTFILE, False) if test_support.verbose: sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['subject'], + ((('countryName', u'US'),), + (('stateOrProvinceName', u'Delaware'),), + (('localityName', u'Wilmington'),), + (('organizationName', u'Python Software Foundation'),), + (('organizationalUnitName', u'SSL'),), + (('commonName', u'somemachine.python.org'),)), + ) + # Issue #13034: the subjectAltName in some certificates + # (notably projects.developer.nokia.com:443) wasn't parsed + p = ssl._ssl._test_decode_cert(NOKIACERT) + if test_support.verbose: + sys.stdout.write("\n" + pprint.pformat(p) + "\n") + self.assertEqual(p['subjectAltName'], + (('DNS', 'projects.developer.nokia.com'), + ('DNS', 'projects.forum.nokia.com')) + ) def test_DER_to_PEM(self): with open(SVN_PYTHON_ORG_ROOT_CERT, 'r') as f: @@ -1329,15 +1346,18 @@ def test_main(verbose=False): - global CERTFILE, SVN_PYTHON_ORG_ROOT_CERT + global CERTFILE, SVN_PYTHON_ORG_ROOT_CERT, NOKIACERT CERTFILE = os.path.join(os.path.dirname(__file__) or os.curdir, "keycert.pem") SVN_PYTHON_ORG_ROOT_CERT = os.path.join( os.path.dirname(__file__) or os.curdir, "https_svn_python_org_root.pem") + NOKIACERT = os.path.join(os.path.dirname(__file__) or os.curdir, + "nokia.pem") if (not os.path.exists(CERTFILE) or - not os.path.exists(SVN_PYTHON_ORG_ROOT_CERT)): + not os.path.exists(SVN_PYTHON_ORG_ROOT_CERT) or + not os.path.exists(NOKIACERT)): raise test_support.TestFailed("Can't read certificate files!") tests = [BasicTests, BasicSocketTests] diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -702,7 +702,7 @@ /* get a memory buffer */ biobuf = BIO_new(BIO_s_mem()); - i = 0; + i = -1; while ((i = X509_get_ext_by_NID( certificate, NID_subject_alt_name, i)) >= 0) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 22:49:14 2011 From: python-checkins at python.org (r.david.murray) Date: Sat, 01 Oct 2011 22:49:14 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzQxNDc6IG1pbmlk?= =?utf8?q?om=27s_toprettyxml_no_longer_adds_whitespace_to_text_nodes=2E?= Message-ID: http://hg.python.org/cpython/rev/086ca132e161 changeset: 72570:086ca132e161 branch: 3.2 parent: 72567:65e7f40fefd4 user: R David Murray date: Sat Oct 01 16:19:51 2011 -0400 summary: #4147: minidom's toprettyxml no longer adds whitespace to text nodes. Patch by Dan Kenigsberg. files: Lib/test/test_minidom.py | 7 +++++++ Lib/xml/dom/minidom.py | 6 ++++-- Misc/ACKS | 1 + Misc/NEWS | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -446,6 +446,13 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) + def test_toPrettyXML_perserves_content_of_text_node(self): + str = 'B' + dom = parseString(str) + dom2 = parseString(dom.toprettyxml()) + self.assertEqual(dom.childNodes[0].childNodes[0].toxml(), + dom2.childNodes[0].childNodes[0].toxml()) + def testProcessingInstruction(self): dom = parseString('') pi = dom.documentElement.firstChild diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -836,7 +836,9 @@ _write_data(writer, attrs[a_name].value) writer.write("\"") if self.childNodes: - writer.write(">%s"%(newl)) + writer.write(">") + if self.childNodes[0].nodeType != Node.TEXT_NODE: + writer.write(newl) for node in self.childNodes: node.writexml(writer,indent+addindent,addindent,newl) writer.write("%s%s" % (indent,self.tagName,newl)) @@ -1061,7 +1063,7 @@ return newText def writexml(self, writer, indent="", addindent="", newl=""): - _write_data(writer, "%s%s%s"%(indent, self.data, newl)) + _write_data(writer, self.data) # DOM Level 3 (WD 9 April 2002) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -468,6 +468,7 @@ Hiroaki Kawai Sebastien Keim Ryan Kelly +Dan Kenigsberg Robert Kern Randall Kern Magnus Kessler diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,8 @@ Library ------- +- Issue #4147: minidom's toprettyxml no longer adds whitespace to text nodes. + - Issue #13034: When decoding some SSL certificates, the subjectAltName extension could be unreported. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 22:49:15 2011 From: python-checkins at python.org (r.david.murray) Date: Sat, 01 Oct 2011 22:49:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_=234147=3A_minidom=27s_toprettyxml_no_longer_adds_whit?= =?utf8?q?espace_to_text_nodes=2E?= Message-ID: http://hg.python.org/cpython/rev/fa0b1e50270f changeset: 72571:fa0b1e50270f parent: 72568:90a06fbb1f85 parent: 72570:086ca132e161 user: R David Murray date: Sat Oct 01 16:22:35 2011 -0400 summary: merge #4147: minidom's toprettyxml no longer adds whitespace to text nodes. files: Lib/test/test_minidom.py | 7 +++++++ Lib/xml/dom/minidom.py | 6 ++++-- Misc/ACKS | 1 + Misc/NEWS | 2 ++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -467,6 +467,13 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) + def test_toPrettyXML_perserves_content_of_text_node(self): + str = 'B' + dom = parseString(str) + dom2 = parseString(dom.toprettyxml()) + self.assertEqual(dom.childNodes[0].childNodes[0].toxml(), + dom2.childNodes[0].childNodes[0].toxml()) + def testProcessingInstruction(self): dom = parseString('') pi = dom.documentElement.firstChild diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -836,7 +836,9 @@ _write_data(writer, attrs[a_name].value) writer.write("\"") if self.childNodes: - writer.write(">%s"%(newl)) + writer.write(">") + if self.childNodes[0].nodeType != Node.TEXT_NODE: + writer.write(newl) for node in self.childNodes: node.writexml(writer,indent+addindent,addindent,newl) writer.write("%s%s" % (indent,self.tagName,newl)) @@ -1061,7 +1063,7 @@ return newText def writexml(self, writer, indent="", addindent="", newl=""): - _write_data(writer, "%s%s%s"%(indent, self.data, newl)) + _write_data(writer, self.data) # DOM Level 3 (WD 9 April 2002) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -496,6 +496,7 @@ Hiroaki Kawai Sebastien Keim Ryan Kelly +Dan Kenigsberg Robert Kern Randall Kern Magnus Kessler diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,8 @@ Library ------- +- Issue #4147: minidom's toprettyxml no longer adds whitespace to text nodes. + - Issue #13034: When decoding some SSL certificates, the subjectAltName extension could be unreported. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 1 22:49:37 2011 From: python-checkins at python.org (r.david.murray) Date: Sat, 01 Oct 2011 22:49:37 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzQxNDc6IG1pbmlk?= =?utf8?q?om=27s_toprettyxml_no_longer_adds_whitespace_to_text_nodes=2E?= Message-ID: http://hg.python.org/cpython/rev/406c5b69cb1b changeset: 72572:406c5b69cb1b branch: 2.7 parent: 72569:8e6694387c98 user: R David Murray date: Sat Oct 01 16:49:25 2011 -0400 summary: #4147: minidom's toprettyxml no longer adds whitespace to text nodes. Patch by Dan Kenigsberg. files: Lib/test/test_minidom.py | 7 +++++++ Lib/xml/dom/minidom.py | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -439,6 +439,13 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) + def test_toPrettyXML_perserves_content_of_text_node(self): + str = 'B' + dom = parseString(str) + dom2 = parseString(dom.toprettyxml()) + self.assertEqual(dom.childNodes[0].childNodes[0].toxml(), + dom2.childNodes[0].childNodes[0].toxml()) + def testProcessingInstruction(self): dom = parseString('') pi = dom.documentElement.firstChild diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -806,7 +806,9 @@ _write_data(writer, attrs[a_name].value) writer.write("\"") if self.childNodes: - writer.write(">%s"%(newl)) + writer.write(">") + if self.childNodes[0].nodeType != Node.TEXT_NODE: + writer.write(newl) for node in self.childNodes: node.writexml(writer,indent+addindent,addindent,newl) writer.write("%s%s" % (indent,self.tagName,newl)) @@ -1031,7 +1033,7 @@ return newText def writexml(self, writer, indent="", addindent="", newl=""): - _write_data(writer, "%s%s%s"%(indent, self.data, newl)) + _write_data(writer, self.data) # DOM Level 3 (WD 9 April 2002) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:15 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FFromKindAndData?= =?utf8?q?=28=29_raises_a_ValueError_if_the_kind_is_unknown?= Message-ID: http://hg.python.org/cpython/rev/9124a00df142 changeset: 72573:9124a00df142 parent: 72571:fa0b1e50270f user: Victor Stinner date: Sat Oct 01 23:48:37 2011 +0200 summary: PyUnicode_FromKindAndData() raises a ValueError if the kind is unknown files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1211,7 +1211,7 @@ case PyUnicode_4BYTE_KIND: return _PyUnicode_FromUCS4(buffer, size); } - assert(0); + PyErr_SetString(PyExc_ValueError, "invalid kind"); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:16 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FReadChar=28=29_?= =?utf8?q?raises_a_IndexError_if_the_index_in_invalid?= Message-ID: http://hg.python.org/cpython/rev/ae2b07f9ede6 changeset: 72574:ae2b07f9ede6 user: Victor Stinner date: Sun Oct 02 00:25:40 2011 +0200 summary: PyUnicode_ReadChar() raises a IndexError if the index in invalid unicode_getitem() reuses PyUnicode_ReadChar() files: Objects/unicodeobject.c | 29 +++++++++++++---------------- 1 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2840,8 +2840,12 @@ Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) { - if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) != -1) { - return PyErr_BadArgument(); + if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) { + PyErr_BadArgument(); + return (Py_UCS4)-1; + } + if (index < 0 || index >= _PyUnicode_LENGTH(unicode)) { + PyErr_SetString(PyExc_IndexError, "string index out of range"); return (Py_UCS4)-1; } return PyUnicode_READ_CHAR(unicode, index); @@ -9808,18 +9812,11 @@ } static PyObject * -unicode_getitem(PyUnicodeObject *self, Py_ssize_t index) -{ - Py_UCS4 ch; - - if (PyUnicode_READY(self) == -1) - return NULL; - if (index < 0 || index >= _PyUnicode_LENGTH(self)) { - PyErr_SetString(PyExc_IndexError, "string index out of range"); - return NULL; - } - - ch = PyUnicode_READ(PyUnicode_KIND(self), PyUnicode_DATA(self), index); +unicode_getitem(PyObject *self, Py_ssize_t index) +{ + Py_UCS4 ch = PyUnicode_ReadChar(self, index); + if (ch == (Py_UCS4)-1) + return NULL; return PyUnicode_FromOrdinal(ch); } @@ -10475,7 +10472,7 @@ length = end - start; if (length == 1) - return unicode_getitem((PyUnicodeObject*)self, start); + return unicode_getitem(self, start); if (start < 0 || end < 0) { PyErr_SetString(PyExc_IndexError, "string index out of range"); @@ -11758,7 +11755,7 @@ return NULL; if (i < 0) i += PyUnicode_GET_LENGTH(self); - return unicode_getitem(self, i); + return unicode_getitem((PyObject*)self, i); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, cur, i; const Py_UNICODE* source_buf; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:17 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FWriteChar=28=29?= =?utf8?q?_raises_IndexError_on_invalid_index?= Message-ID: http://hg.python.org/cpython/rev/99aa46107a22 changeset: 72575:99aa46107a22 user: Victor Stinner date: Sun Oct 02 00:34:53 2011 +0200 summary: PyUnicode_WriteChar() raises IndexError on invalid index PyUnicode_WriteChar() raises also a ValueError if the string has more than 1 reference. files: Include/unicodeobject.h | 4 +++- Objects/unicodeobject.c | 28 +++++++++++++++++++++------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -647,7 +647,9 @@ ); /* Write a character to the string. The string must have been created through - PyUnicode_New, must not be shared, and must not have been hashed yet. */ + PyUnicode_New, must not be shared, and must not have been hashed yet. + + Return 0 on success, -1 on error. */ PyAPI_FUNC(int) PyUnicode_WriteChar( PyObject *unicode, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -622,6 +622,19 @@ } #endif +static int +_PyUnicode_Dirty(PyObject *unicode) +{ + assert(PyUnicode_Check(unicode)); + if (Py_REFCNT(unicode) != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot modify a string having more than 1 reference"); + return -1; + } + _PyUnicode_DIRTY(unicode); + return 0; +} + Py_ssize_t PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, @@ -651,12 +664,8 @@ if (how_many == 0) return 0; - if (Py_REFCNT(to) != 1) { - PyErr_SetString(PyExc_ValueError, - "Cannot modify a string having more than 1 reference"); + if (_PyUnicode_Dirty(to)) return -1; - } - _PyUnicode_DIRTY(to); from_kind = PyUnicode_KIND(from); from_data = PyUnicode_DATA(from); @@ -2855,10 +2864,15 @@ PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, Py_UCS4 ch) { if (!PyUnicode_Check(unicode) || !PyUnicode_IS_COMPACT(unicode)) { - return PyErr_BadArgument(); + PyErr_BadArgument(); return -1; } - + if (index < 0 || index >= _PyUnicode_LENGTH(unicode)) { + PyErr_SetString(PyExc_IndexError, "string index out of range"); + return -1; + } + if (_PyUnicode_Dirty(unicode)) + return -1; PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), index, ch); return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:18 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_Py=5FUCS1_instead_of_un?= =?utf8?q?signed_char_in_unicodeobject=2Eh?= Message-ID: http://hg.python.org/cpython/rev/5231de1080b0 changeset: 72577:5231de1080b0 user: Victor Stinner date: Sun Oct 02 00:55:25 2011 +0200 summary: Use Py_UCS1 instead of unsigned char in unicodeobject.h files: Include/unicodeobject.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -417,7 +417,7 @@ #define PyUnicode_READ(kind, data, index) \ ((Py_UCS4) \ ((kind) == PyUnicode_1BYTE_KIND ? \ - ((const unsigned char *)(data))[(index)] : \ + ((const Py_UCS1 *)(data))[(index)] : \ ((kind) == PyUnicode_2BYTE_KIND ? \ ((const Py_UCS2 *)(data))[(index)] : \ ((const Py_UCS4 *)(data))[(index)] \ @@ -431,7 +431,7 @@ #define PyUnicode_READ_CHAR(unicode, index) \ ((Py_UCS4) \ (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ - ((const unsigned char *)(PyUnicode_DATA((unicode))))[(index)] : \ + ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:18 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_usage_of_PyUnicode=5FRE?= =?utf8?q?ADY=28=29_in_PyUnicode=5FGetLength=28=29?= Message-ID: http://hg.python.org/cpython/rev/745fe40c9bbe changeset: 72576:745fe40c9bbe user: Victor Stinner date: Sun Oct 02 00:36:53 2011 +0200 summary: Fix usage of PyUnicode_READY() in PyUnicode_GetLength() files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2838,7 +2838,7 @@ Py_ssize_t PyUnicode_GetLength(PyObject *unicode) { - if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) != -1) { + if (!PyUnicode_Check(unicode) || PyUnicode_READY(unicode) == -1) { PyErr_BadArgument(); return -1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:19 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_=5FPyUnicode=5FAsK?= =?utf8?q?ind=28=29_for_UCS1-=3EUCS4_and_UCS2-=3EUCS4?= Message-ID: http://hg.python.org/cpython/rev/329a981b9143 changeset: 72578:329a981b9143 user: Victor Stinner date: Sun Oct 02 01:00:40 2011 +0200 summary: Optimize _PyUnicode_AsKind() for UCS1->UCS4 and UCS2->UCS4 * Ensure that the input string is ready * Raise a ValueError instead of of a fatal error files: Objects/unicodeobject.c | 72 ++++++++++++++++++---------- 1 files changed, 45 insertions(+), 27 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1264,43 +1264,61 @@ } -/* Widen Unicode objects to larger buffers. - Return NULL if the string is too wide already. */ +/* Widen Unicode objects to larger buffers. Don't write terminating null + character. Return NULL on error. */ void* _PyUnicode_AsKind(PyObject *s, unsigned int kind) { - Py_ssize_t i; - Py_ssize_t len = PyUnicode_GET_LENGTH(s); - void *d = PyUnicode_DATA(s); - unsigned int skind = PyUnicode_KIND(s); - if (PyUnicode_KIND(s) >= kind) { + Py_ssize_t len; + void *result; + unsigned int skind; + + if (PyUnicode_READY(s)) + return NULL; + + len = PyUnicode_GET_LENGTH(s); + skind = PyUnicode_KIND(s); + if (skind >= kind) { PyErr_SetString(PyExc_RuntimeError, "invalid widening attempt"); return NULL; } switch(kind) { - case PyUnicode_2BYTE_KIND: { - Py_UCS2 *result = PyMem_Malloc(PyUnicode_GET_LENGTH(s) * sizeof(Py_UCS2)); - if (!result) { - PyErr_NoMemory(); - return 0; - } - for (i = 0; i < len; i++) - result[i] = ((Py_UCS1*)d)[i]; + case PyUnicode_2BYTE_KIND: + result = PyMem_Malloc(len * sizeof(Py_UCS2)); + if (!result) + return PyErr_NoMemory(); + assert(skind == PyUnicode_1BYTE_KIND); + _PyUnicode_CONVERT_BYTES( + Py_UCS1, Py_UCS2, + PyUnicode_1BYTE_DATA(s), + PyUnicode_1BYTE_DATA(s) + len, + result); return result; - } - case PyUnicode_4BYTE_KIND: { - Py_UCS4 *result = PyMem_Malloc(PyUnicode_GET_LENGTH(s) * sizeof(Py_UCS4)); - if (!result) { - PyErr_NoMemory(); - return 0; - } - for (i = 0; i < len; i++) - result[i] = PyUnicode_READ(skind, d, i); + case PyUnicode_4BYTE_KIND: + result = PyMem_Malloc(len * sizeof(Py_UCS4)); + if (!result) + return PyErr_NoMemory(); + if (skind == PyUnicode_2BYTE_KIND) { + _PyUnicode_CONVERT_BYTES( + Py_UCS2, Py_UCS4, + PyUnicode_2BYTE_DATA(s), + PyUnicode_2BYTE_DATA(s) + len, + result); + } + else { + assert(skind == PyUnicode_1BYTE_KIND); + _PyUnicode_CONVERT_BYTES( + Py_UCS1, Py_UCS4, + PyUnicode_1BYTE_DATA(s), + PyUnicode_1BYTE_DATA(s) + len, + result); + } return result; - } - } - Py_FatalError("invalid kind"); + default: + break; + } + PyErr_SetString(PyExc_ValueError, "invalid kind"); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 01:14:20 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 02 Oct 2011 01:14:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FFindChar=28=29_?= =?utf8?q?raises_a_IndexError_on_invalid_index?= Message-ID: http://hg.python.org/cpython/rev/6bd6cc7f2c8d changeset: 72579:6bd6cc7f2c8d user: Victor Stinner date: Sun Oct 02 01:08:37 2011 +0200 summary: PyUnicode_FindChar() raises a IndexError on invalid index files: Objects/unicodeobject.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8089,6 +8089,10 @@ int kind; if (PyUnicode_READY(str) == -1) return -2; + if (start < 0 || end < 0) { + PyErr_SetString(PyExc_IndexError, "string index out of range"); + return -2; + } if (end > PyUnicode_GET_LENGTH(str)) end = PyUnicode_GET_LENGTH(str); kind = PyUnicode_KIND(str); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Oct 2 05:23:14 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 02 Oct 2011 05:23:14 +0200 Subject: [Python-checkins] Daily reference leaks (6bd6cc7f2c8d): sum=0 Message-ID: results for 6bd6cc7f2c8d on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogbB32ed', '-x'] From python-checkins at python.org Sun Oct 2 11:47:23 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 02 Oct 2011 11:47:23 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMDc2OiBmaXgg?= =?utf8?q?links_to_datetime=2Etime=2E?= Message-ID: http://hg.python.org/cpython/rev/854e31d80151 changeset: 72580:854e31d80151 branch: 2.7 parent: 72572:406c5b69cb1b user: Ezio Melotti date: Sun Oct 02 12:22:13 2011 +0300 summary: #13076: fix links to datetime.time. files: Doc/library/datetime.rst | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -1164,19 +1164,19 @@ .. attribute:: time.min - The earliest representable :class:`time`, ``time(0, 0, 0, 0)``. + The earliest representable :class:`.time`, ``time(0, 0, 0, 0)``. .. attribute:: time.max - The latest representable :class:`time`, ``time(23, 59, 59, 999999)``. + The latest representable :class:`.time`, ``time(23, 59, 59, 999999)``. .. attribute:: time.resolution - The smallest possible difference between non-equal :class:`time` objects, - ``timedelta(microseconds=1)``, although note that arithmetic on :class:`time` - objects is not supported. + The smallest possible difference between non-equal :class:`.time` objects, + ``timedelta(microseconds=1)``, although note that arithmetic on + :class:`.time` objects is not supported. Instance attributes (read-only): @@ -1203,7 +1203,7 @@ .. attribute:: time.tzinfo - The object passed as the tzinfo argument to the :class:`time` constructor, or + The object passed as the tzinfo argument to the :class:`.time` constructor, or ``None`` if none was passed. @@ -1234,10 +1234,10 @@ .. method:: time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) - Return a :class:`time` with the same value, except for those attributes given + Return a :class:`.time` with the same value, except for those attributes given new values by whichever keyword arguments are specified. Note that - ``tzinfo=None`` can be specified to create a naive :class:`time` from an - aware :class:`time`, without conversion of the time data. + ``tzinfo=None`` can be specified to create a naive :class:`.time` from an + aware :class:`.time`, without conversion of the time data. .. method:: time.isoformat() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 11:47:24 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 02 Oct 2011 11:47:24 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMDc2OiBmaXgg?= =?utf8?q?links_to_datetime=2Etime_and_datetime=2Edatetime=2E?= Message-ID: http://hg.python.org/cpython/rev/95689ed69097 changeset: 72581:95689ed69097 branch: 3.2 parent: 72570:086ca132e161 user: Ezio Melotti date: Sun Oct 02 12:44:50 2011 +0300 summary: #13076: fix links to datetime.time and datetime.datetime. files: Doc/library/datetime.rst | 152 +++++++++++++------------- 1 files changed, 76 insertions(+), 76 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -18,13 +18,13 @@ There are two kinds of date and time objects: "naive" and "aware". This distinction refers to whether the object has any notion of time zone, daylight saving time, or other kind of algorithmic or political time adjustment. Whether -a naive :class:`datetime` object represents Coordinated Universal Time (UTC), +a naive :class:`.datetime` object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program, just like it's up to the program whether a particular number represents metres, -miles, or mass. Naive :class:`datetime` objects are easy to understand and to +miles, or mass. Naive :class:`.datetime` objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. -For applications requiring more, :class:`datetime` and :class:`time` objects +For applications requiring more, :class:`.datetime` and :class:`.time` objects have an optional time zone information attribute, :attr:`tzinfo`, that can be set to an instance of a subclass of the abstract :class:`tzinfo` class. These :class:`tzinfo` objects capture information about the offset from UTC time, the @@ -41,13 +41,13 @@ .. data:: MINYEAR - The smallest year number allowed in a :class:`date` or :class:`datetime` object. + The smallest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MINYEAR` is ``1``. .. data:: MAXYEAR - The largest year number allowed in a :class:`date` or :class:`datetime` object. + The largest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MAXYEAR` is ``9999``. @@ -91,14 +91,14 @@ .. class:: timedelta :noindex: - A duration expressing the difference between two :class:`date`, :class:`time`, - or :class:`datetime` instances to microsecond resolution. + A duration expressing the difference between two :class:`date`, :class:`.time`, + or :class:`.datetime` instances to microsecond resolution. .. class:: tzinfo An abstract base class for time zone information objects. These are used by the - :class:`datetime` and :class:`time` classes to provide a customizable notion of + :class:`.datetime` and :class:`.time` classes to provide a customizable notion of time adjustment (for example, to account for time zone and/or daylight saving time). @@ -114,7 +114,7 @@ Objects of the :class:`date` type are always naive. -An object *d* of type :class:`time` or :class:`datetime` may be naive or aware. +An object *d* of type :class:`.time` or :class:`.datetime` may be naive or aware. *d* is aware if ``d.tzinfo`` is not ``None`` and ``d.tzinfo.utcoffset(d)`` does not return ``None``. If ``d.tzinfo`` is ``None``, or if ``d.tzinfo`` is not ``None`` but ``d.tzinfo.utcoffset(d)`` returns ``None``, *d* is naive. @@ -299,7 +299,7 @@ -1 day, 19:00:00 In addition to the operations listed above :class:`timedelta` objects support -certain additions and subtractions with :class:`date` and :class:`datetime` +certain additions and subtractions with :class:`date` and :class:`.datetime` objects (see below). .. versionchanged:: 3.2 @@ -638,10 +638,10 @@ :class:`datetime` Objects ------------------------- -A :class:`datetime` object is a single object containing all the information -from a :class:`date` object and a :class:`time` object. Like a :class:`date` -object, :class:`datetime` assumes the current Gregorian calendar extended in -both directions; like a time object, :class:`datetime` assumes there are exactly +A :class:`.datetime` object is a single object containing all the information +from a :class:`date` object and a :class:`.time` object. Like a :class:`date` +object, :class:`.datetime` assumes the current Gregorian calendar extended in +both directions; like a time object, :class:`.datetime` assumes there are exactly 3600\*24 seconds in every day. Constructor: @@ -689,7 +689,7 @@ Return the current UTC date and time, with :attr:`tzinfo` ``None``. This is like :meth:`now`, but returns the current UTC date and time, as a naive - :class:`datetime` object. An aware current UTC datetime can be obtained by + :class:`.datetime` object. An aware current UTC datetime can be obtained by calling ``datetime.now(timezone.utc)``. See also :meth:`now`. .. classmethod:: datetime.fromtimestamp(timestamp, tz=None) @@ -697,7 +697,7 @@ Return the local date and time corresponding to the POSIX timestamp, such as is returned by :func:`time.time`. If optional argument *tz* is ``None`` or not specified, the timestamp is converted to the platform's local date and time, and - the returned :class:`datetime` object is naive. + the returned :class:`.datetime` object is naive. Else *tz* must be an instance of a class :class:`tzinfo` subclass, and the timestamp is converted to *tz*'s time zone. In this case the result is @@ -710,12 +710,12 @@ 1970 through 2038. Note that on non-POSIX systems that include leap seconds in their notion of a timestamp, leap seconds are ignored by :meth:`fromtimestamp`, and then it's possible to have two timestamps differing by a second that yield - identical :class:`datetime` objects. See also :meth:`utcfromtimestamp`. + identical :class:`.datetime` objects. See also :meth:`utcfromtimestamp`. .. classmethod:: datetime.utcfromtimestamp(timestamp) - Return the UTC :class:`datetime` corresponding to the POSIX timestamp, with + Return the UTC :class:`.datetime` corresponding to the POSIX timestamp, with :attr:`tzinfo` ``None``. This may raise :exc:`ValueError`, if the timestamp is out of the range of values supported by the platform C :c:func:`gmtime` function. It's common for this to be restricted to years in 1970 through 2038. See also @@ -724,7 +724,7 @@ .. classmethod:: datetime.fromordinal(ordinal) - Return the :class:`datetime` corresponding to the proleptic Gregorian ordinal, + Return the :class:`.datetime` corresponding to the proleptic Gregorian ordinal, where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and microsecond of the result are all 0, and :attr:`tzinfo` is ``None``. @@ -732,18 +732,18 @@ .. classmethod:: datetime.combine(date, time) - Return a new :class:`datetime` object whose date components are equal to the + Return a new :class:`.datetime` object whose date components are equal to the given :class:`date` object's, and whose time components and :attr:`tzinfo` - attributes are equal to the given :class:`time` object's. For any - :class:`datetime` object *d*, + attributes are equal to the given :class:`.time` object's. For any + :class:`.datetime` object *d*, ``d == datetime.combine(d.date(), d.timetz())``. If date is a - :class:`datetime` object, its time components and :attr:`tzinfo` attributes + :class:`.datetime` object, its time components and :attr:`tzinfo` attributes are ignored. .. classmethod:: datetime.strptime(date_string, format) - Return a :class:`datetime` corresponding to *date_string*, parsed according to + Return a :class:`.datetime` corresponding to *date_string*, parsed according to *format*. This is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. :exc:`ValueError` is raised if the date_string and format can't be parsed by :func:`time.strptime` or if it returns a value which isn't a @@ -755,19 +755,19 @@ .. attribute:: datetime.min - The earliest representable :class:`datetime`, ``datetime(MINYEAR, 1, 1, + The earliest representable :class:`.datetime`, ``datetime(MINYEAR, 1, 1, tzinfo=None)``. .. attribute:: datetime.max - The latest representable :class:`datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, + The latest representable :class:`.datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)``. .. attribute:: datetime.resolution - The smallest possible difference between non-equal :class:`datetime` objects, + The smallest possible difference between non-equal :class:`.datetime` objects, ``timedelta(microseconds=1)``. @@ -810,24 +810,24 @@ .. attribute:: datetime.tzinfo - The object passed as the *tzinfo* argument to the :class:`datetime` constructor, + The object passed as the *tzinfo* argument to the :class:`.datetime` constructor, or ``None`` if none was passed. Supported operations: -+---------------------------------------+-------------------------------+ -| Operation | Result | -+=======================================+===============================+ -| ``datetime2 = datetime1 + timedelta`` | \(1) | -+---------------------------------------+-------------------------------+ -| ``datetime2 = datetime1 - timedelta`` | \(2) | -+---------------------------------------+-------------------------------+ -| ``timedelta = datetime1 - datetime2`` | \(3) | -+---------------------------------------+-------------------------------+ -| ``datetime1 < datetime2`` | Compares :class:`datetime` to | -| | :class:`datetime`. (4) | -+---------------------------------------+-------------------------------+ ++---------------------------------------+--------------------------------+ +| Operation | Result | ++=======================================+================================+ +| ``datetime2 = datetime1 + timedelta`` | \(1) | ++---------------------------------------+--------------------------------+ +| ``datetime2 = datetime1 - timedelta`` | \(2) | ++---------------------------------------+--------------------------------+ +| ``timedelta = datetime1 - datetime2`` | \(3) | ++---------------------------------------+--------------------------------+ +| ``datetime1 < datetime2`` | Compares :class:`.datetime` to | +| | :class:`.datetime`. (4) | ++---------------------------------------+--------------------------------+ (1) datetime2 is a duration of timedelta removed from datetime1, moving forward in @@ -846,7 +846,7 @@ in isolation can overflow in cases where datetime1 - timedelta does not. (3) - Subtraction of a :class:`datetime` from a :class:`datetime` is defined only if + Subtraction of a :class:`.datetime` from a :class:`.datetime` is defined only if both operands are naive, or if both are aware. If one is aware and the other is naive, :exc:`TypeError` is raised. @@ -875,16 +875,16 @@ In order to stop comparison from falling back to the default scheme of comparing object addresses, datetime comparison normally raises :exc:`TypeError` if the - other comparand isn't also a :class:`datetime` object. However, + other comparand isn't also a :class:`.datetime` object. However, ``NotImplemented`` is returned instead if the other comparand has a :meth:`timetuple` attribute. This hook gives other kinds of date objects a - chance at implementing mixed-type comparison. If not, when a :class:`datetime` + chance at implementing mixed-type comparison. If not, when a :class:`.datetime` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. -:class:`datetime` objects can be used as dictionary keys. In Boolean contexts, -all :class:`datetime` objects are considered to be true. +:class:`.datetime` objects can be used as dictionary keys. In Boolean contexts, +all :class:`.datetime` objects are considered to be true. Instance methods: @@ -895,13 +895,13 @@ .. method:: datetime.time() - Return :class:`time` object with same hour, minute, second and microsecond. + Return :class:`.time` object with same hour, minute, second and microsecond. :attr:`tzinfo` is ``None``. See also method :meth:`timetz`. .. method:: datetime.timetz() - Return :class:`time` object with same hour, minute, second, microsecond, and + Return :class:`.time` object with same hour, minute, second, microsecond, and tzinfo attributes. See also method :meth:`time`. @@ -915,7 +915,7 @@ .. method:: datetime.astimezone(tz) - Return a :class:`datetime` object with new :attr:`tzinfo` attribute *tz*, + Return a :class:`.datetime` object with new :attr:`tzinfo` attribute *tz*, adjusting the date and time data so the result is the same UTC time as *self*, but in *tz*'s local time. @@ -989,7 +989,7 @@ .. method:: datetime.utctimetuple() - If :class:`datetime` instance *d* is naive, this is the same as + If :class:`.datetime` instance *d* is naive, this is the same as ``d.timetuple()`` except that :attr:`tm_isdst` is forced to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a UTC time. @@ -1050,7 +1050,7 @@ .. method:: datetime.__str__() - For a :class:`datetime` instance *d*, ``str(d)`` is equivalent to + For a :class:`.datetime` instance *d*, ``str(d)`` is equivalent to ``d.isoformat(' ')``. @@ -1199,19 +1199,19 @@ .. attribute:: time.min - The earliest representable :class:`time`, ``time(0, 0, 0, 0)``. + The earliest representable :class:`.time`, ``time(0, 0, 0, 0)``. .. attribute:: time.max - The latest representable :class:`time`, ``time(23, 59, 59, 999999)``. + The latest representable :class:`.time`, ``time(23, 59, 59, 999999)``. .. attribute:: time.resolution - The smallest possible difference between non-equal :class:`time` objects, - ``timedelta(microseconds=1)``, although note that arithmetic on :class:`time` - objects is not supported. + The smallest possible difference between non-equal :class:`.time` objects, + ``timedelta(microseconds=1)``, although note that arithmetic on + :class:`.time` objects is not supported. Instance attributes (read-only): @@ -1238,13 +1238,13 @@ .. attribute:: time.tzinfo - The object passed as the tzinfo argument to the :class:`time` constructor, or + The object passed as the tzinfo argument to the :class:`.time` constructor, or ``None`` if none was passed. Supported operations: -* comparison of :class:`time` to :class:`time`, where *a* is considered less +* comparison of :class:`.time` to :class:`.time`, where *a* is considered less than *b* when *a* precedes *b* in time. If one comparand is naive and the other is aware, :exc:`TypeError` is raised. If both comparands are aware, and have the same :attr:`tzinfo` attribute, the common :attr:`tzinfo` attribute is @@ -1252,7 +1252,7 @@ have different :attr:`tzinfo` attributes, the comparands are first adjusted by subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order to stop mixed-type comparisons from falling back to the default comparison by - object address, when a :class:`time` object is compared to an object of a + object address, when a :class:`.time` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. @@ -1260,7 +1260,7 @@ * efficient pickling -* in Boolean contexts, a :class:`time` object is considered to be true if and +* in Boolean contexts, a :class:`.time` object is considered to be true if and only if, after converting it to minutes and subtracting :meth:`utcoffset` (or ``0`` if that's ``None``), the result is non-zero. @@ -1269,10 +1269,10 @@ .. method:: time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) - Return a :class:`time` with the same value, except for those attributes given + Return a :class:`.time` with the same value, except for those attributes given new values by whichever keyword arguments are specified. Note that - ``tzinfo=None`` can be specified to create a naive :class:`time` from an - aware :class:`time`, without conversion of the time data. + ``tzinfo=None`` can be specified to create a naive :class:`.time` from an + aware :class:`.time`, without conversion of the time data. .. method:: time.isoformat() @@ -1350,13 +1350,13 @@ :class:`tzinfo` is an abstract base class, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standard :class:`tzinfo` methods needed by the -:class:`datetime` methods you use. The :mod:`datetime` module supplies +:class:`.datetime` methods you use. The :mod:`datetime` module supplies a simple concrete subclass of :class:`tzinfo` :class:`timezone` which can reprsent timezones with fixed offset from UTC such as UTC itself or North American EST and EDT. An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the -constructors for :class:`datetime` and :class:`time` objects. The latter objects +constructors for :class:`.datetime` and :class:`.time` objects. The latter objects view their attributes as being in local time, and the :class:`tzinfo` object supports methods revealing offset of local time from UTC, the name of the time zone, and DST offset, all relative to a date or time object passed to them. @@ -1411,7 +1411,7 @@ ``tz.utcoffset(dt) - tz.dst(dt)`` - must return the same result for every :class:`datetime` *dt* with ``dt.tzinfo == + must return the same result for every :class:`.datetime` *dt* with ``dt.tzinfo == tz`` For sane :class:`tzinfo` subclasses, this expression yields the time zone's "standard offset", which should not depend on the date or the time, but only on geographic location. The implementation of :meth:`datetime.astimezone` @@ -1443,7 +1443,7 @@ .. method:: tzinfo.tzname(dt) - Return the time zone name corresponding to the :class:`datetime` object *dt*, as + Return the time zone name corresponding to the :class:`.datetime` object *dt*, as a string. Nothing about string names is defined by the :mod:`datetime` module, and there's no requirement that it mean anything in particular. For example, "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all @@ -1456,11 +1456,11 @@ The default implementation of :meth:`tzname` raises :exc:`NotImplementedError`. -These methods are called by a :class:`datetime` or :class:`time` object, in -response to their methods of the same names. A :class:`datetime` object passes -itself as the argument, and a :class:`time` object passes ``None`` as the +These methods are called by a :class:`.datetime` or :class:`.time` object, in +response to their methods of the same names. A :class:`.datetime` object passes +itself as the argument, and a :class:`.time` object passes ``None`` as the argument. A :class:`tzinfo` subclass's methods should therefore be prepared to -accept a *dt* argument of ``None``, or of class :class:`datetime`. +accept a *dt* argument of ``None``, or of class :class:`.datetime`. When ``None`` is passed, it's up to the class designer to decide the best response. For example, returning ``None`` is appropriate if the class wishes to @@ -1468,7 +1468,7 @@ may be more useful for ``utcoffset(None)`` to return the standard UTC offset, as there is no other convention for discovering the standard offset. -When a :class:`datetime` object is passed in response to a :class:`datetime` +When a :class:`.datetime` object is passed in response to a :class:`.datetime` method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can rely on this, unless user code calls :class:`tzinfo` methods directly. The intent is that the :class:`tzinfo` methods interpret *dt* as being in local @@ -1606,7 +1606,7 @@ .. method:: timezone.fromutc(dt) Return ``dt + offset``. The *dt* argument must be an aware - :class:`datetime` instance, with ``tzinfo`` set to ``self``. + :class:`.datetime` instance, with ``tzinfo`` set to ``self``. Class attributes: @@ -1620,18 +1620,18 @@ :meth:`strftime` and :meth:`strptime` Behavior ---------------------------------------------- -:class:`date`, :class:`datetime`, and :class:`time` objects all support a +:class:`date`, :class:`.datetime`, and :class:`.time` objects all support a ``strftime(format)`` method, to create a string representing the time under the control of an explicit format string. Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` although not all objects support a :meth:`timetuple` method. Conversely, the :meth:`datetime.strptime` class method creates a -:class:`datetime` object from a string representing a date and time and a +:class:`.datetime` object from a string representing a date and time and a corresponding format string. ``datetime.strptime(date_string, format)`` is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. -For :class:`time` objects, the format codes for year, month, and day should not +For :class:`.time` objects, the format codes for year, month, and day should not be used, as time objects have no such values. If they're used anyway, ``1900`` is substituted for the year, and ``1`` for the month and day. @@ -1789,5 +1789,5 @@ .. versionchanged:: 3.2 When the ``%z`` directive is provided to the :meth:`strptime` method, an - aware :class:`datetime` object will be produced. The ``tzinfo`` of the + aware :class:`.datetime` object will be produced. The ``tzinfo`` of the result will be set to a :class:`timezone` instance. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 11:47:25 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 02 Oct 2011 11:47:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313076=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/175cd2a51ea9 changeset: 72582:175cd2a51ea9 parent: 72579:6bd6cc7f2c8d parent: 72581:95689ed69097 user: Ezio Melotti date: Sun Oct 02 12:47:10 2011 +0300 summary: #13076: merge with 3.2. files: Doc/library/datetime.rst | 152 +++++++++++++------------- 1 files changed, 76 insertions(+), 76 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -18,13 +18,13 @@ There are two kinds of date and time objects: "naive" and "aware". This distinction refers to whether the object has any notion of time zone, daylight saving time, or other kind of algorithmic or political time adjustment. Whether -a naive :class:`datetime` object represents Coordinated Universal Time (UTC), +a naive :class:`.datetime` object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program, just like it's up to the program whether a particular number represents metres, -miles, or mass. Naive :class:`datetime` objects are easy to understand and to +miles, or mass. Naive :class:`.datetime` objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. -For applications requiring more, :class:`datetime` and :class:`time` objects +For applications requiring more, :class:`.datetime` and :class:`.time` objects have an optional time zone information attribute, :attr:`tzinfo`, that can be set to an instance of a subclass of the abstract :class:`tzinfo` class. These :class:`tzinfo` objects capture information about the offset from UTC time, the @@ -41,13 +41,13 @@ .. data:: MINYEAR - The smallest year number allowed in a :class:`date` or :class:`datetime` object. + The smallest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MINYEAR` is ``1``. .. data:: MAXYEAR - The largest year number allowed in a :class:`date` or :class:`datetime` object. + The largest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MAXYEAR` is ``9999``. @@ -91,14 +91,14 @@ .. class:: timedelta :noindex: - A duration expressing the difference between two :class:`date`, :class:`time`, - or :class:`datetime` instances to microsecond resolution. + A duration expressing the difference between two :class:`date`, :class:`.time`, + or :class:`.datetime` instances to microsecond resolution. .. class:: tzinfo An abstract base class for time zone information objects. These are used by the - :class:`datetime` and :class:`time` classes to provide a customizable notion of + :class:`.datetime` and :class:`.time` classes to provide a customizable notion of time adjustment (for example, to account for time zone and/or daylight saving time). @@ -114,7 +114,7 @@ Objects of the :class:`date` type are always naive. -An object *d* of type :class:`time` or :class:`datetime` may be naive or aware. +An object *d* of type :class:`.time` or :class:`.datetime` may be naive or aware. *d* is aware if ``d.tzinfo`` is not ``None`` and ``d.tzinfo.utcoffset(d)`` does not return ``None``. If ``d.tzinfo`` is ``None``, or if ``d.tzinfo`` is not ``None`` but ``d.tzinfo.utcoffset(d)`` returns ``None``, *d* is naive. @@ -299,7 +299,7 @@ -1 day, 19:00:00 In addition to the operations listed above :class:`timedelta` objects support -certain additions and subtractions with :class:`date` and :class:`datetime` +certain additions and subtractions with :class:`date` and :class:`.datetime` objects (see below). .. versionchanged:: 3.2 @@ -638,10 +638,10 @@ :class:`datetime` Objects ------------------------- -A :class:`datetime` object is a single object containing all the information -from a :class:`date` object and a :class:`time` object. Like a :class:`date` -object, :class:`datetime` assumes the current Gregorian calendar extended in -both directions; like a time object, :class:`datetime` assumes there are exactly +A :class:`.datetime` object is a single object containing all the information +from a :class:`date` object and a :class:`.time` object. Like a :class:`date` +object, :class:`.datetime` assumes the current Gregorian calendar extended in +both directions; like a time object, :class:`.datetime` assumes there are exactly 3600\*24 seconds in every day. Constructor: @@ -689,7 +689,7 @@ Return the current UTC date and time, with :attr:`tzinfo` ``None``. This is like :meth:`now`, but returns the current UTC date and time, as a naive - :class:`datetime` object. An aware current UTC datetime can be obtained by + :class:`.datetime` object. An aware current UTC datetime can be obtained by calling ``datetime.now(timezone.utc)``. See also :meth:`now`. .. classmethod:: datetime.fromtimestamp(timestamp, tz=None) @@ -697,7 +697,7 @@ Return the local date and time corresponding to the POSIX timestamp, such as is returned by :func:`time.time`. If optional argument *tz* is ``None`` or not specified, the timestamp is converted to the platform's local date and time, and - the returned :class:`datetime` object is naive. + the returned :class:`.datetime` object is naive. Else *tz* must be an instance of a class :class:`tzinfo` subclass, and the timestamp is converted to *tz*'s time zone. In this case the result is @@ -710,12 +710,12 @@ 1970 through 2038. Note that on non-POSIX systems that include leap seconds in their notion of a timestamp, leap seconds are ignored by :meth:`fromtimestamp`, and then it's possible to have two timestamps differing by a second that yield - identical :class:`datetime` objects. See also :meth:`utcfromtimestamp`. + identical :class:`.datetime` objects. See also :meth:`utcfromtimestamp`. .. classmethod:: datetime.utcfromtimestamp(timestamp) - Return the UTC :class:`datetime` corresponding to the POSIX timestamp, with + Return the UTC :class:`.datetime` corresponding to the POSIX timestamp, with :attr:`tzinfo` ``None``. This may raise :exc:`ValueError`, if the timestamp is out of the range of values supported by the platform C :c:func:`gmtime` function. It's common for this to be restricted to years in 1970 through 2038. See also @@ -740,7 +740,7 @@ .. classmethod:: datetime.fromordinal(ordinal) - Return the :class:`datetime` corresponding to the proleptic Gregorian ordinal, + Return the :class:`.datetime` corresponding to the proleptic Gregorian ordinal, where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and microsecond of the result are all 0, and :attr:`tzinfo` is ``None``. @@ -748,18 +748,18 @@ .. classmethod:: datetime.combine(date, time) - Return a new :class:`datetime` object whose date components are equal to the + Return a new :class:`.datetime` object whose date components are equal to the given :class:`date` object's, and whose time components and :attr:`tzinfo` - attributes are equal to the given :class:`time` object's. For any - :class:`datetime` object *d*, + attributes are equal to the given :class:`.time` object's. For any + :class:`.datetime` object *d*, ``d == datetime.combine(d.date(), d.timetz())``. If date is a - :class:`datetime` object, its time components and :attr:`tzinfo` attributes + :class:`.datetime` object, its time components and :attr:`tzinfo` attributes are ignored. .. classmethod:: datetime.strptime(date_string, format) - Return a :class:`datetime` corresponding to *date_string*, parsed according to + Return a :class:`.datetime` corresponding to *date_string*, parsed according to *format*. This is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. :exc:`ValueError` is raised if the date_string and format can't be parsed by :func:`time.strptime` or if it returns a value which isn't a @@ -771,19 +771,19 @@ .. attribute:: datetime.min - The earliest representable :class:`datetime`, ``datetime(MINYEAR, 1, 1, + The earliest representable :class:`.datetime`, ``datetime(MINYEAR, 1, 1, tzinfo=None)``. .. attribute:: datetime.max - The latest representable :class:`datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, + The latest representable :class:`.datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)``. .. attribute:: datetime.resolution - The smallest possible difference between non-equal :class:`datetime` objects, + The smallest possible difference between non-equal :class:`.datetime` objects, ``timedelta(microseconds=1)``. @@ -826,24 +826,24 @@ .. attribute:: datetime.tzinfo - The object passed as the *tzinfo* argument to the :class:`datetime` constructor, + The object passed as the *tzinfo* argument to the :class:`.datetime` constructor, or ``None`` if none was passed. Supported operations: -+---------------------------------------+-------------------------------+ -| Operation | Result | -+=======================================+===============================+ -| ``datetime2 = datetime1 + timedelta`` | \(1) | -+---------------------------------------+-------------------------------+ -| ``datetime2 = datetime1 - timedelta`` | \(2) | -+---------------------------------------+-------------------------------+ -| ``timedelta = datetime1 - datetime2`` | \(3) | -+---------------------------------------+-------------------------------+ -| ``datetime1 < datetime2`` | Compares :class:`datetime` to | -| | :class:`datetime`. (4) | -+---------------------------------------+-------------------------------+ ++---------------------------------------+--------------------------------+ +| Operation | Result | ++=======================================+================================+ +| ``datetime2 = datetime1 + timedelta`` | \(1) | ++---------------------------------------+--------------------------------+ +| ``datetime2 = datetime1 - timedelta`` | \(2) | ++---------------------------------------+--------------------------------+ +| ``timedelta = datetime1 - datetime2`` | \(3) | ++---------------------------------------+--------------------------------+ +| ``datetime1 < datetime2`` | Compares :class:`.datetime` to | +| | :class:`.datetime`. (4) | ++---------------------------------------+--------------------------------+ (1) datetime2 is a duration of timedelta removed from datetime1, moving forward in @@ -862,7 +862,7 @@ in isolation can overflow in cases where datetime1 - timedelta does not. (3) - Subtraction of a :class:`datetime` from a :class:`datetime` is defined only if + Subtraction of a :class:`.datetime` from a :class:`.datetime` is defined only if both operands are naive, or if both are aware. If one is aware and the other is naive, :exc:`TypeError` is raised. @@ -891,16 +891,16 @@ In order to stop comparison from falling back to the default scheme of comparing object addresses, datetime comparison normally raises :exc:`TypeError` if the - other comparand isn't also a :class:`datetime` object. However, + other comparand isn't also a :class:`.datetime` object. However, ``NotImplemented`` is returned instead if the other comparand has a :meth:`timetuple` attribute. This hook gives other kinds of date objects a - chance at implementing mixed-type comparison. If not, when a :class:`datetime` + chance at implementing mixed-type comparison. If not, when a :class:`.datetime` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. -:class:`datetime` objects can be used as dictionary keys. In Boolean contexts, -all :class:`datetime` objects are considered to be true. +:class:`.datetime` objects can be used as dictionary keys. In Boolean contexts, +all :class:`.datetime` objects are considered to be true. Instance methods: @@ -911,13 +911,13 @@ .. method:: datetime.time() - Return :class:`time` object with same hour, minute, second and microsecond. + Return :class:`.time` object with same hour, minute, second and microsecond. :attr:`tzinfo` is ``None``. See also method :meth:`timetz`. .. method:: datetime.timetz() - Return :class:`time` object with same hour, minute, second, microsecond, and + Return :class:`.time` object with same hour, minute, second, microsecond, and tzinfo attributes. See also method :meth:`time`. @@ -931,7 +931,7 @@ .. method:: datetime.astimezone(tz) - Return a :class:`datetime` object with new :attr:`tzinfo` attribute *tz*, + Return a :class:`.datetime` object with new :attr:`tzinfo` attribute *tz*, adjusting the date and time data so the result is the same UTC time as *self*, but in *tz*'s local time. @@ -1005,7 +1005,7 @@ .. method:: datetime.utctimetuple() - If :class:`datetime` instance *d* is naive, this is the same as + If :class:`.datetime` instance *d* is naive, this is the same as ``d.timetuple()`` except that :attr:`tm_isdst` is forced to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a UTC time. @@ -1066,7 +1066,7 @@ .. method:: datetime.__str__() - For a :class:`datetime` instance *d*, ``str(d)`` is equivalent to + For a :class:`.datetime` instance *d*, ``str(d)`` is equivalent to ``d.isoformat(' ')``. @@ -1215,19 +1215,19 @@ .. attribute:: time.min - The earliest representable :class:`time`, ``time(0, 0, 0, 0)``. + The earliest representable :class:`.time`, ``time(0, 0, 0, 0)``. .. attribute:: time.max - The latest representable :class:`time`, ``time(23, 59, 59, 999999)``. + The latest representable :class:`.time`, ``time(23, 59, 59, 999999)``. .. attribute:: time.resolution - The smallest possible difference between non-equal :class:`time` objects, - ``timedelta(microseconds=1)``, although note that arithmetic on :class:`time` - objects is not supported. + The smallest possible difference between non-equal :class:`.time` objects, + ``timedelta(microseconds=1)``, although note that arithmetic on + :class:`.time` objects is not supported. Instance attributes (read-only): @@ -1254,13 +1254,13 @@ .. attribute:: time.tzinfo - The object passed as the tzinfo argument to the :class:`time` constructor, or + The object passed as the tzinfo argument to the :class:`.time` constructor, or ``None`` if none was passed. Supported operations: -* comparison of :class:`time` to :class:`time`, where *a* is considered less +* comparison of :class:`.time` to :class:`.time`, where *a* is considered less than *b* when *a* precedes *b* in time. If one comparand is naive and the other is aware, :exc:`TypeError` is raised. If both comparands are aware, and have the same :attr:`tzinfo` attribute, the common :attr:`tzinfo` attribute is @@ -1268,7 +1268,7 @@ have different :attr:`tzinfo` attributes, the comparands are first adjusted by subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order to stop mixed-type comparisons from falling back to the default comparison by - object address, when a :class:`time` object is compared to an object of a + object address, when a :class:`.time` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. @@ -1276,7 +1276,7 @@ * efficient pickling -* in Boolean contexts, a :class:`time` object is considered to be true if and +* in Boolean contexts, a :class:`.time` object is considered to be true if and only if, after converting it to minutes and subtracting :meth:`utcoffset` (or ``0`` if that's ``None``), the result is non-zero. @@ -1285,10 +1285,10 @@ .. method:: time.replace([hour[, minute[, second[, microsecond[, tzinfo]]]]]) - Return a :class:`time` with the same value, except for those attributes given + Return a :class:`.time` with the same value, except for those attributes given new values by whichever keyword arguments are specified. Note that - ``tzinfo=None`` can be specified to create a naive :class:`time` from an - aware :class:`time`, without conversion of the time data. + ``tzinfo=None`` can be specified to create a naive :class:`.time` from an + aware :class:`.time`, without conversion of the time data. .. method:: time.isoformat() @@ -1366,13 +1366,13 @@ :class:`tzinfo` is an abstract base class, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standard :class:`tzinfo` methods needed by the -:class:`datetime` methods you use. The :mod:`datetime` module supplies +:class:`.datetime` methods you use. The :mod:`datetime` module supplies a simple concrete subclass of :class:`tzinfo` :class:`timezone` which can reprsent timezones with fixed offset from UTC such as UTC itself or North American EST and EDT. An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the -constructors for :class:`datetime` and :class:`time` objects. The latter objects +constructors for :class:`.datetime` and :class:`.time` objects. The latter objects view their attributes as being in local time, and the :class:`tzinfo` object supports methods revealing offset of local time from UTC, the name of the time zone, and DST offset, all relative to a date or time object passed to them. @@ -1427,7 +1427,7 @@ ``tz.utcoffset(dt) - tz.dst(dt)`` - must return the same result for every :class:`datetime` *dt* with ``dt.tzinfo == + must return the same result for every :class:`.datetime` *dt* with ``dt.tzinfo == tz`` For sane :class:`tzinfo` subclasses, this expression yields the time zone's "standard offset", which should not depend on the date or the time, but only on geographic location. The implementation of :meth:`datetime.astimezone` @@ -1459,7 +1459,7 @@ .. method:: tzinfo.tzname(dt) - Return the time zone name corresponding to the :class:`datetime` object *dt*, as + Return the time zone name corresponding to the :class:`.datetime` object *dt*, as a string. Nothing about string names is defined by the :mod:`datetime` module, and there's no requirement that it mean anything in particular. For example, "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all @@ -1472,11 +1472,11 @@ The default implementation of :meth:`tzname` raises :exc:`NotImplementedError`. -These methods are called by a :class:`datetime` or :class:`time` object, in -response to their methods of the same names. A :class:`datetime` object passes -itself as the argument, and a :class:`time` object passes ``None`` as the +These methods are called by a :class:`.datetime` or :class:`.time` object, in +response to their methods of the same names. A :class:`.datetime` object passes +itself as the argument, and a :class:`.time` object passes ``None`` as the argument. A :class:`tzinfo` subclass's methods should therefore be prepared to -accept a *dt* argument of ``None``, or of class :class:`datetime`. +accept a *dt* argument of ``None``, or of class :class:`.datetime`. When ``None`` is passed, it's up to the class designer to decide the best response. For example, returning ``None`` is appropriate if the class wishes to @@ -1484,7 +1484,7 @@ may be more useful for ``utcoffset(None)`` to return the standard UTC offset, as there is no other convention for discovering the standard offset. -When a :class:`datetime` object is passed in response to a :class:`datetime` +When a :class:`.datetime` object is passed in response to a :class:`.datetime` method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can rely on this, unless user code calls :class:`tzinfo` methods directly. The intent is that the :class:`tzinfo` methods interpret *dt* as being in local @@ -1623,7 +1623,7 @@ .. method:: timezone.fromutc(dt) Return ``dt + offset``. The *dt* argument must be an aware - :class:`datetime` instance, with ``tzinfo`` set to ``self``. + :class:`.datetime` instance, with ``tzinfo`` set to ``self``. Class attributes: @@ -1637,18 +1637,18 @@ :meth:`strftime` and :meth:`strptime` Behavior ---------------------------------------------- -:class:`date`, :class:`datetime`, and :class:`time` objects all support a +:class:`date`, :class:`.datetime`, and :class:`.time` objects all support a ``strftime(format)`` method, to create a string representing the time under the control of an explicit format string. Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` although not all objects support a :meth:`timetuple` method. Conversely, the :meth:`datetime.strptime` class method creates a -:class:`datetime` object from a string representing a date and time and a +:class:`.datetime` object from a string representing a date and time and a corresponding format string. ``datetime.strptime(date_string, format)`` is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. -For :class:`time` objects, the format codes for year, month, and day should not +For :class:`.time` objects, the format codes for year, month, and day should not be used, as time objects have no such values. If they're used anyway, ``1900`` is substituted for the year, and ``1`` for the month and day. @@ -1806,5 +1806,5 @@ .. versionchanged:: 3.2 When the ``%z`` directive is provided to the :meth:`strptime` method, an - aware :class:`datetime` object will be produced. The ``tzinfo`` of the + aware :class:`.datetime` object will be produced. The ``tzinfo`` of the result will be set to a :class:`timezone` instance. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 18:33:35 2011 From: python-checkins at python.org (charles-francois.natali) Date: Sun, 02 Oct 2011 18:33:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313084=3A_Fix_a_tes?= =?utf8?q?t=5Fsignal_failure=3A_the_delivery_order_is_only_defined_for?= Message-ID: http://hg.python.org/cpython/rev/e4f4272479d0 changeset: 72583:e4f4272479d0 user: Charles-Fran?ois Natali date: Sun Oct 02 18:36:05 2011 +0200 summary: Issue #13084: Fix a test_signal failure: the delivery order is only defined for real-time signals. files: Lib/test/test_signal.py | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -224,7 +224,7 @@ @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): - def check_wakeup(self, test_body, *signals): + def check_wakeup(self, test_body, *signals, ordered=True): # use a subprocess to have only one thread code = """if 1: import fcntl @@ -240,6 +240,9 @@ def check_signum(signals): data = os.read(read, len(signals)+1) raised = struct.unpack('%uB' % len(data), data) + if not {!r}: + raised = set(raised) + signals = set(signals) if raised != signals: raise Exception("%r != %r" % (raised, signals)) @@ -258,7 +261,7 @@ os.close(read) os.close(write) - """.format(signals, test_body) + """.format(signals, ordered, test_body) assert_python_ok('-c', code) @@ -319,11 +322,6 @@ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), 'need signal.pthread_sigmask()') def test_pending(self): - signals = (signal.SIGUSR1, signal.SIGUSR2) - # when signals are unblocked, pending signal ared delivered in the - # reverse order of their number - signals = tuple(sorted(signals, reverse=True)) - self.check_wakeup("""def test(): signum1 = signal.SIGUSR1 signum2 = signal.SIGUSR2 @@ -336,7 +334,7 @@ os.kill(os.getpid(), signum2) # Unblocking the 2 signals calls the C signal handler twice signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2)) - """, *signals) + """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") -- Repository URL: http://hg.python.org/cpython From riscutiavlad at gmail.com Sun Oct 2 18:47:47 2011 From: riscutiavlad at gmail.com (Vlad Riscutia) Date: Sun, 2 Oct 2011 09:47:47 -0700 Subject: [Python-checkins] [Python-Dev] Hg tips (was Re: cpython (merge default -> default): Merge heads.) In-Reply-To: References: Message-ID: Great tips. Can we add them to the developer guide somewhere? Thank you, Vlad On Thu, Sep 29, 2011 at 12:54 AM, Ezio Melotti wrote: > Tip 1 -- merging heads: > > A while ago ?ric suggested a nice tip to make merges easier and since I > haven't seen many people using it and now I got a chance to use it again, I > think it might be worth showing it once more: > > # so assume you just committed some changes: > $ hg ci Doc/whatsnew/3.3.rst -m 'Update and reorganize the whatsnew entry > for PEP 393.' > # you push them, but someone else pushed something in the meanwhile, so the > push fails > $ hg push > pushing to ssh://hg at hg.python.org/cpython > searching for changes > abort: push creates new remote heads on branch 'default'! > (you should pull and merge or use push -f to force) > # so you pull the other changes > $ hg pull -u > pulling from ssh://hg at hg.python.org/cpython > searching for changes > adding changesets > adding manifests > adding file changes > added 4 changesets with 5 changes to 5 files (+1 heads) > not updating, since new heads added > (run 'hg heads' to see heads, 'hg merge' to merge) > # and use "hg heads ." to see the two heads (yours and the one you pulled) > in the current branch > $ hg heads . > changeset: 72521:e6a2b54c1d16 > tag: tip > user: Victor Stinner > date: Thu Sep 29 04:02:13 2011 +0200 > summary: Fix hex_digit_to_int() prototype: expect Py_UCS4, not > Py_UNICODE > > changeset: 72517:ba6ee5cc9ed6 > user: Ezio Melotti > date: Thu Sep 29 08:34:36 2011 +0300 > summary: Update and reorganize the whatsnew entry for PEP 393. > # here comes the tip: before merging you switch to the other head (i.e. the > one pushed by Victor), > # if you don't switch, you'll be merging Victor changeset and in case of > conflicts you will have to review > # and modify his code (e.g. put a Misc/NEWS entry in the right section or > something more complicated) > $ hg up e6a2b54c1d16 > 6 files updated, 0 files merged, 0 files removed, 0 files unresolved > # after the switch you will merge the changeset you just committed, so in > case of conflicts > # reviewing and merging is much easier because you know the changes already > $ hg merge > 1 files updated, 0 files merged, 0 files removed, 0 files unresolved > (branch merge, don't forget to commit) > # here everything went fine and there were no conflicts, and in the diff I > can see my last changeset > $ hg di > diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst > [...] > # everything looks fine, so I can commit the merge and push > $ hg ci -m 'Merge heads.' > $ hg push > pushing to ssh://hg at hg.python.org/cpython > searching for changes > remote: adding > changesets > > remote: adding manifests > remote: adding file changes > remote: added 2 changesets with 1 changes to 1 files > remote: buildbot: 2 changes sent successfully > remote: notified python-checkins at python.org of incoming changeset > ba6ee5cc9ed6 > remote: notified python-checkins at python.org of incoming changeset > e7672fe3cd35 > > This tip is not only useful while merging, but it's also useful for > python-checkins reviews, because the "merge" mail has the same diff of the > previous mail rather than having 15 unrelated changesets from the last week > because the committer didn't pull in a while. > > > Tip 2 -- extended diffs: > > If you haven't already, enable git diffs, adding to your ~/.hgrc the > following two lines: > >> [diff] >> git = True >> > (this is already in the devguide, even if 'git = on' is used there. The > mercurial website uses git = True too.) > More info: > http://hgtip.com/tips/beginner/2009-10-22-always-use-git-diffs/ > > > Tip 3 -- extensions: > > I personally like the 'color' extension, it makes the output of commands > like 'hg diff' and 'hg stat' more readable (e.g. it shows removed lines in > red and added ones in green). > If you want to give it a try, add to your ~/.hgrc the following two lines: > >> [extensions] >> color = >> > > If you find operations like pulling, updating or cloning too slow, you > might also want to look at the 'progress' extension, which displays a > progress bar during these operations: > >> [extensions] >> progress = >> > > > Tip 4 -- porting from 2.7 to 3.2: > > The devguide suggests: >> >> hg export a7df1a869e4a | hg import --no-commit - >> > but it's not always necessary to copy the changeset number manually. > If you are porting your last commit you can just use 'hg export 2.7' (or > any other branch name): > * using the one-dir-per-branch setup: > wolf at hp:~/dev/py/2.7$ hg ci -m 'Fix some bug.' > wolf at hp:~/dev/py/2.7$ cd ../3.2 > wolf at hp:~/dev/py/3.2$ hg pull -u ../2.7 > wolf at hp:~/dev/py/3.2$ hg export 2.7 | hg import --no-commit - > * using the single-dir setup: > wolf at hp:~/dev/python$ hg branch > 2.7 > wolf at hp:~/dev/python$ hg ci -m 'Fix some bug.' > wolf at hp:~/dev/python$ hg up 3.2 # here you might enjoy the progress > extension > wolf at hp:~/dev/python$ hg export 2.7 | hg import --no-commit - > And then you can check that everything is fine, and commit on 3.2 too. > Of course it works the other way around (from 3.2 to 2.7) too. > > > I hope you'll find these tips useful. > > Best Regards, > Ezio Melotti > > > On Thu, Sep 29, 2011 at 8:36 AM, ezio.melotti wrote: > >> http://hg.python.org/cpython/rev/e7672fe3cd35 >> changeset: 72522:e7672fe3cd35 >> parent: 72520:e6a2b54c1d16 >> parent: 72521:ba6ee5cc9ed6 >> user: Ezio Melotti >> date: Thu Sep 29 08:36:23 2011 +0300 >> summary: >> Merge heads. >> >> files: >> Doc/whatsnew/3.3.rst | 63 +++++++++++++++++++++---------- >> 1 files changed, 42 insertions(+), 21 deletions(-) >> >> > > _______________________________________________ > Python-Dev mailing list > Python-Dev at python.org > http://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > http://mail.python.org/mailman/options/python-dev/riscutiavlad%40gmail.com > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sun Oct 2 19:19:34 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 02 Oct 2011 19:19:34 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_remove_unused_label?= Message-ID: http://hg.python.org/cpython/rev/e5019967a60a changeset: 72584:e5019967a60a parent: 72582:175cd2a51ea9 user: Benjamin Peterson date: Sun Oct 02 13:19:16 2011 -0400 summary: remove unused label files: Python/import.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -3174,7 +3174,6 @@ } } -out: PyMem_Free(nameuni); return result; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 19:19:35 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 02 Oct 2011 19:19:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/08223e6cf325 changeset: 72585:08223e6cf325 parent: 72584:e5019967a60a parent: 72583:e4f4272479d0 user: Benjamin Peterson date: Sun Oct 02 13:19:30 2011 -0400 summary: merge heads files: Lib/test/test_signal.py | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py --- a/Lib/test/test_signal.py +++ b/Lib/test/test_signal.py @@ -224,7 +224,7 @@ @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") class WakeupSignalTests(unittest.TestCase): - def check_wakeup(self, test_body, *signals): + def check_wakeup(self, test_body, *signals, ordered=True): # use a subprocess to have only one thread code = """if 1: import fcntl @@ -240,6 +240,9 @@ def check_signum(signals): data = os.read(read, len(signals)+1) raised = struct.unpack('%uB' % len(data), data) + if not {!r}: + raised = set(raised) + signals = set(signals) if raised != signals: raise Exception("%r != %r" % (raised, signals)) @@ -258,7 +261,7 @@ os.close(read) os.close(write) - """.format(signals, test_body) + """.format(signals, ordered, test_body) assert_python_ok('-c', code) @@ -319,11 +322,6 @@ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'), 'need signal.pthread_sigmask()') def test_pending(self): - signals = (signal.SIGUSR1, signal.SIGUSR2) - # when signals are unblocked, pending signal ared delivered in the - # reverse order of their number - signals = tuple(sorted(signals, reverse=True)) - self.check_wakeup("""def test(): signum1 = signal.SIGUSR1 signum2 = signal.SIGUSR2 @@ -336,7 +334,7 @@ os.kill(os.getpid(), signum2) # Unblocking the 2 signals calls the C signal handler twice signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2)) - """, *signals) + """, signal.SIGUSR1, signal.SIGUSR2, ordered=False) @unittest.skipIf(sys.platform == "win32", "Not valid on Windows") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 23:41:33 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 02 Oct 2011 23:41:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_ResourceWar?= =?utf8?q?nings_in_the_TIPC_socket_tests=2E?= Message-ID: http://hg.python.org/cpython/rev/77397669c62f changeset: 72586:77397669c62f branch: 3.2 parent: 72581:95689ed69097 user: Antoine Pitrou date: Sun Oct 02 23:33:19 2011 +0200 summary: Fix ResourceWarnings in the TIPC socket tests. files: Lib/test/test_socket.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1869,10 +1869,12 @@ print("TIPC module is not loaded, please 'sudo modprobe tipc'") return False -class TIPCTest (unittest.TestCase): +class TIPCTest(unittest.TestCase): def testRDM(self): srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM) cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM) + self.addCleanup(srv.close) + self.addCleanup(cli.close) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE, @@ -1889,13 +1891,14 @@ self.assertEqual(msg, MSG) -class TIPCThreadableTest (unittest.TestCase, ThreadableTest): +class TIPCThreadableTest(unittest.TestCase, ThreadableTest): def __init__(self, methodName = 'runTest'): unittest.TestCase.__init__(self, methodName = methodName) ThreadableTest.__init__(self) def setUp(self): self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM) + self.addCleanup(self.srv.close) self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE, TIPC_LOWER, TIPC_UPPER) @@ -1903,6 +1906,7 @@ self.srv.listen(5) self.serverExplicitReady() self.conn, self.connaddr = self.srv.accept() + self.addCleanup(self.conn.close) def clientSetUp(self): # The is a hittable race between serverExplicitReady() and the @@ -1910,6 +1914,7 @@ # we could get an exception time.sleep(0.1) self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM) + self.addCleanup(self.cli.close) addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE, TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0) self.cli.connect(addr) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 2 23:41:34 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 02 Oct 2011 23:41:34 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Fix_ResourceWarnings_in_the_TIPC_socket_tests=2E?= Message-ID: http://hg.python.org/cpython/rev/d3194ef040df changeset: 72587:d3194ef040df parent: 72585:08223e6cf325 parent: 72586:77397669c62f user: Antoine Pitrou date: Sun Oct 02 23:37:41 2011 +0200 summary: Fix ResourceWarnings in the TIPC socket tests. files: Lib/test/test_socket.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -3999,10 +3999,12 @@ print("TIPC module is not loaded, please 'sudo modprobe tipc'") return False -class TIPCTest (unittest.TestCase): +class TIPCTest(unittest.TestCase): def testRDM(self): srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM) cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM) + self.addCleanup(srv.close) + self.addCleanup(cli.close) srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE, @@ -4019,13 +4021,14 @@ self.assertEqual(msg, MSG) -class TIPCThreadableTest (unittest.TestCase, ThreadableTest): +class TIPCThreadableTest(unittest.TestCase, ThreadableTest): def __init__(self, methodName = 'runTest'): unittest.TestCase.__init__(self, methodName = methodName) ThreadableTest.__init__(self) def setUp(self): self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM) + self.addCleanup(self.srv.close) self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE, TIPC_LOWER, TIPC_UPPER) @@ -4033,6 +4036,7 @@ self.srv.listen(5) self.serverExplicitReady() self.conn, self.connaddr = self.srv.accept() + self.addCleanup(self.conn.close) def clientSetUp(self): # The is a hittable race between serverExplicitReady() and the @@ -4040,6 +4044,7 @@ # we could get an exception time.sleep(0.1) self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM) + self.addCleanup(self.cli.close) addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE, TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0) self.cli.connect(addr) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 01:38:22 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 03 Oct 2011 01:38:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Document_messag?= =?utf8?q?e=5Fbody_arg_in_HTTPConnection=2Eendheaders?= Message-ID: http://hg.python.org/cpython/rev/a3f2dba93743 changeset: 72588:a3f2dba93743 branch: 3.2 parent: 72586:77397669c62f user: Senthil Kumaran date: Mon Oct 03 07:27:06 2011 +0800 summary: Document message_body arg in HTTPConnection.endheaders files: Doc/library/http.client.rst | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -472,9 +472,13 @@ an argument. -.. method:: HTTPConnection.endheaders() +.. method:: HTTPConnection.endheaders(message_body=None) - Send a blank line to the server, signalling the end of the headers. + Send a blank line to the server, signalling the end of the headers. The + optional message_body argument can be used to pass message body + associated with the request. The message body will be sent in + the same packet as the message headers if possible. The + message_body should be a string. .. method:: HTTPConnection.send(data) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 01:38:23 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 03 Oct 2011 01:38:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2_-__Document_message=5Fbody_arg_in_HTTPConne?= =?utf8?q?ction=2Eendheaders?= Message-ID: http://hg.python.org/cpython/rev/1ed413b52af3 changeset: 72589:1ed413b52af3 parent: 72587:d3194ef040df parent: 72588:a3f2dba93743 user: Senthil Kumaran date: Mon Oct 03 07:28:00 2011 +0800 summary: merge from 3.2 - Document message_body arg in HTTPConnection.endheaders files: Doc/library/http.client.rst | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -472,9 +472,13 @@ an argument. -.. method:: HTTPConnection.endheaders() +.. method:: HTTPConnection.endheaders(message_body=None) - Send a blank line to the server, signalling the end of the headers. + Send a blank line to the server, signalling the end of the headers. The + optional message_body argument can be used to pass message body + associated with the request. The message body will be sent in + the same packet as the message headers if possible. The + message_body should be a string. .. method:: HTTPConnection.send(data) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 01:38:23 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 03 Oct 2011 01:38:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_update_2=2E7_-_?= =?utf8?q?Document_message=5Fbody_arg_in_HTTPConnection=2Eendheaders?= Message-ID: http://hg.python.org/cpython/rev/277688052c5a changeset: 72590:277688052c5a branch: 2.7 parent: 72580:854e31d80151 user: Senthil Kumaran date: Mon Oct 03 07:37:58 2011 +0800 summary: update 2.7 - Document message_body arg in HTTPConnection.endheaders files: Doc/library/httplib.rst | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Doc/library/httplib.rst b/Doc/library/httplib.rst --- a/Doc/library/httplib.rst +++ b/Doc/library/httplib.rst @@ -492,9 +492,13 @@ an argument. -.. method:: HTTPConnection.endheaders() +.. method:: HTTPConnection.endheaders(message_body=None) Send a blank line to the server, signalling the end of the headers. + The optional message_body argument can be used to pass message body + associated with the request. The message body will be sent in + the same packet as the message headers if possible. The + message_body should be a string. .. method:: HTTPConnection.send(data) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:15 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyCodec=5FReplaceErrors=28?= =?utf8?q?=29_uses_=22C=22_format_instead_of_=22u=23=22_to_build_result?= Message-ID: http://hg.python.org/cpython/rev/611c57aa694a changeset: 72591:611c57aa694a parent: 72589:1ed413b52af3 user: Victor Stinner date: Sun Oct 02 19:00:15 2011 +0200 summary: PyCodec_ReplaceErrors() uses "C" format instead of "u#" to build result files: Python/codecs.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Python/codecs.c b/Python/codecs.c --- a/Python/codecs.c +++ b/Python/codecs.c @@ -534,10 +534,11 @@ return Py_BuildValue("(Nn)", res, end); } else if (PyObject_IsInstance(exc, PyExc_UnicodeDecodeError)) { - Py_UNICODE res = Py_UNICODE_REPLACEMENT_CHARACTER; if (PyUnicodeDecodeError_GetEnd(exc, &end)) return NULL; - return Py_BuildValue("(u#n)", &res, 1, end); + return Py_BuildValue("(Cn)", + (int)Py_UNICODE_REPLACEMENT_CHARACTER, + end); } else if (PyObject_IsInstance(exc, PyExc_UnicodeTranslateError)) { PyObject *res; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:16 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Check_error_when_calling_Py?= =?utf8?q?Unicode=5FAppendAndDel=28=29?= Message-ID: http://hg.python.org/cpython/rev/8d29cdf28216 changeset: 72592:8d29cdf28216 user: Victor Stinner date: Sun Oct 02 20:35:10 2011 +0200 summary: Check error when calling PyUnicode_AppendAndDel() files: Modules/_ctypes/callproc.c | 4 ++-- Python/dynload_win.c | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -944,9 +944,9 @@ else { PyErr_Clear(); PyUnicode_AppendAndDel(&s, PyUnicode_FromString("???")); - if (s == NULL) - goto error; } + if (s == NULL) + goto error; PyErr_SetObject(exc_class, s); error: Py_XDECREF(tp); diff --git a/Python/dynload_win.c b/Python/dynload_win.c --- a/Python/dynload_win.c +++ b/Python/dynload_win.c @@ -187,7 +187,7 @@ HINSTANCE hDLL = NULL; unsigned int old_mode; ULONG_PTR cookie = 0; - + /* Don't display a message box when Python can't load a DLL */ old_mode = SetErrorMode(SEM_FAILCRITICALERRORS); @@ -248,8 +248,10 @@ theInfo, theLength)); } - PyErr_SetObject(PyExc_ImportError, message); - Py_XDECREF(message); + if (message != NULL) { + PyErr_SetObject(PyExc_ImportError, message); + Py_DECREF(message); + } return NULL; } else { char buffer[256]; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:17 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicode=5Fempty_and_unicode?= =?utf8?q?=5Flatin1_are_PyObject*_objects=2C_not_PyUnicodeObject*?= Message-ID: http://hg.python.org/cpython/rev/5656f5517feb changeset: 72593:5656f5517feb user: Victor Stinner date: Sun Oct 02 20:39:30 2011 +0200 summary: unicode_empty and unicode_latin1 are PyObject* objects, not PyUnicodeObject* files: Objects/unicodeobject.c | 30 ++++++++++++++-------------- 1 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -147,11 +147,11 @@ static PyObject *interned; /* The empty Unicode object is shared to improve performance. */ -static PyUnicodeObject *unicode_empty; +static PyObject *unicode_empty; /* Single character Unicode strings in the Latin-1 range are being shared as well. */ -static PyUnicodeObject *unicode_latin1[256]; +static PyObject *unicode_latin1[256]; /* Fast detection of the most frequent whitespace characters */ const unsigned char _Py_ascii_whitespace[] = { @@ -398,7 +398,7 @@ /* Optimization for empty strings */ if (length == 0 && unicode_empty != NULL) { Py_INCREF(unicode_empty); - return unicode_empty; + return (PyUnicodeObject*)unicode_empty; } /* Ensure we won't overflow the size. */ @@ -491,7 +491,7 @@ /* Optimization for empty strings */ if (size == 0 && unicode_empty != NULL) { Py_INCREF(unicode_empty); - return (PyObject *)unicode_empty; + return unicode_empty; } #ifdef Py_DEBUG @@ -1017,16 +1017,16 @@ static PyObject* get_latin1_char(unsigned char ch) { - PyUnicodeObject *unicode = unicode_latin1[ch]; + PyObject *unicode = unicode_latin1[ch]; if (!unicode) { - unicode = (PyUnicodeObject *)PyUnicode_New(1, ch); + unicode = PyUnicode_New(1, ch); if (!unicode) return NULL; PyUnicode_1BYTE_DATA(unicode)[0] = ch; unicode_latin1[ch] = unicode; } Py_INCREF(unicode); - return (PyObject *)unicode; + return unicode; } PyObject * @@ -1045,7 +1045,7 @@ /* Optimization for empty strings */ if (size == 0 && unicode_empty != NULL) { Py_INCREF(unicode_empty); - return (PyObject *)unicode_empty; + return unicode_empty; } /* Single character Unicode objects in the Latin-1 range are @@ -1117,7 +1117,7 @@ /* Optimization for empty strings */ if (size == 0 && unicode_empty != NULL) { Py_INCREF(unicode_empty); - return (PyObject *)unicode_empty; + return unicode_empty; } /* Single characters are shared when using this constructor. @@ -2137,7 +2137,7 @@ if (PyBytes_Check(obj)) { if (PyBytes_GET_SIZE(obj) == 0) { Py_INCREF(unicode_empty); - v = (PyObject *) unicode_empty; + v = unicode_empty; } else { v = PyUnicode_Decode( @@ -2164,7 +2164,7 @@ if (buffer.len == 0) { Py_INCREF(unicode_empty); - v = (PyObject *) unicode_empty; + v = unicode_empty; } else v = PyUnicode_Decode((char*) buffer.buf, buffer.len, encoding, errors); @@ -9555,11 +9555,11 @@ goto onError; /* Shortcuts */ - if (v == (PyObject*)unicode_empty) { + if (v == unicode_empty) { Py_DECREF(v); return u; } - if (u == (PyObject*)unicode_empty) { + if (u == unicode_empty) { Py_DECREF(u); return v; } @@ -10635,7 +10635,7 @@ if (len < 1) { Py_INCREF(unicode_empty); - return (PyObject *)unicode_empty; + return unicode_empty; } if (len == 1 && PyUnicode_CheckExact(str)) { @@ -12602,7 +12602,7 @@ }; /* Init the implementation */ - unicode_empty = (PyUnicodeObject *) PyUnicode_New(0, 0); + unicode_empty = PyUnicode_New(0, 0); if (!unicode_empty) Py_FatalError("Can't create empty string"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:18 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_=5FPyUnicode=5FDATA=5FA?= =?utf8?q?NY=28op=29_private_macro?= Message-ID: http://hg.python.org/cpython/rev/2203ccbc4895 changeset: 72594:2203ccbc4895 user: Victor Stinner date: Sun Oct 02 20:39:55 2011 +0200 summary: Add _PyUnicode_DATA_ANY(op) private macro files: Objects/unicodeobject.c | 34 ++++++++++++++-------------- 1 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -131,11 +131,11 @@ #define _PyUnicode_GET_LENGTH(op) \ (assert(PyUnicode_Check(op)), \ ((PyASCIIObject *)(op))->length) +#define _PyUnicode_DATA_ANY(op) (((PyUnicodeObject*)(op))->data.any) /* The Unicode string has been modified: reset the hash */ #define _PyUnicode_DIRTY(op) do { _PyUnicode_HASH(op) = -1; } while (0) - /* This dictionary holds all interned unicode strings. Note that references to strings in this dictionary are *not* counted in the string's ob_refcnt. When the interned string reaches a refcnt of 0 the string deallocation @@ -441,7 +441,7 @@ _PyUnicode_STATE(unicode).compact = 0; _PyUnicode_STATE(unicode).ready = 0; _PyUnicode_STATE(unicode).ascii = 0; - unicode->data.any = NULL; + _PyUnicode_DATA_ANY(unicode) = NULL; _PyUnicode_LENGTH(unicode) = 0; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; @@ -815,7 +815,7 @@ assert(!PyUnicode_IS_COMPACT(obj)); assert(_PyUnicode_KIND(obj) == PyUnicode_WCHAR_KIND); assert(_PyUnicode_WSTR(unicode) != NULL); - assert(unicode->data.any == NULL); + assert(_PyUnicode_DATA_ANY(unicode) == NULL); assert(_PyUnicode_UTF8(unicode) == NULL); /* Actually, it should neither be interned nor be anything else: */ assert(_PyUnicode_STATE(unicode).interned == SSTATE_NOT_INTERNED); @@ -830,8 +830,8 @@ return -1; if (maxchar < 256) { - unicode->data.any = PyObject_MALLOC(_PyUnicode_WSTR_LENGTH(unicode) + 1); - if (!unicode->data.any) { + _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(_PyUnicode_WSTR_LENGTH(unicode) + 1); + if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); return -1; } @@ -842,7 +842,7 @@ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_1BYTE_KIND; if (maxchar < 128) { - _PyUnicode_UTF8(unicode) = unicode->data.any; + _PyUnicode_UTF8(unicode) = _PyUnicode_DATA_ANY(unicode); _PyUnicode_UTF8_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); } else { @@ -861,7 +861,7 @@ #if SIZEOF_WCHAR_T == 2 /* We can share representations and are done. */ - unicode->data.any = _PyUnicode_WSTR(unicode); + _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode); PyUnicode_2BYTE_DATA(unicode)[_PyUnicode_WSTR_LENGTH(unicode)] = '\0'; _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_2BYTE_KIND; @@ -869,9 +869,9 @@ _PyUnicode_UTF8_LENGTH(unicode) = 0; #else /* sizeof(wchar_t) == 4 */ - unicode->data.any = PyObject_MALLOC( + _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC( 2 * (_PyUnicode_WSTR_LENGTH(unicode) + 1)); - if (!unicode->data.any) { + if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); return -1; } @@ -894,8 +894,8 @@ /* in case the native representation is 2-bytes, we need to allocate a new normalized 4-byte version. */ length_wo_surrogates = _PyUnicode_WSTR_LENGTH(unicode) - num_surrogates; - unicode->data.any = PyObject_MALLOC(4 * (length_wo_surrogates + 1)); - if (!unicode->data.any) { + _PyUnicode_DATA_ANY(unicode) = PyObject_MALLOC(4 * (length_wo_surrogates + 1)); + if (!_PyUnicode_DATA_ANY(unicode)) { PyErr_NoMemory(); return -1; } @@ -914,7 +914,7 @@ #else assert(num_surrogates == 0); - unicode->data.any = _PyUnicode_WSTR(unicode); + _PyUnicode_DATA_ANY(unicode) = _PyUnicode_WSTR(unicode); _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; @@ -961,8 +961,8 @@ Py_TYPE(unicode)->tp_free((PyObject *)unicode); } else { - if (unicode->data.any) - PyObject_DEL(unicode->data.any); + if (_PyUnicode_DATA_ANY(unicode)) + PyObject_DEL(_PyUnicode_DATA_ANY(unicode)); Py_TYPE(unicode)->tp_free((PyObject *)unicode); } } @@ -11657,7 +11657,7 @@ /* If it is a two-block object, account for base object, and for character block if present. */ size = sizeof(PyUnicodeObject); - if (v->data.any) + if (_PyUnicode_DATA_ANY(v)) size += (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_CHARACTER_SIZE(v); } @@ -12477,7 +12477,7 @@ _PyUnicode_UTF8_LENGTH(self) = 0; _PyUnicode_UTF8(self) = NULL; _PyUnicode_WSTR_LENGTH(self) = 0; - self->data.any = NULL; + _PyUnicode_DATA_ANY(self) = NULL; share_utf8 = 0; share_wstr = 0; @@ -12509,7 +12509,7 @@ goto onError; } - self->data.any = data; + _PyUnicode_DATA_ANY(self) = data; if (share_utf8) { _PyUnicode_UTF8_LENGTH(self) = length; _PyUnicode_UTF8(self) = data; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:19 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicode=5Fconvert=5Fwchar?= =?utf8?q?=5Fto=5Fucs4=28=29_cannot_fail?= Message-ID: http://hg.python.org/cpython/rev/43cd1d9552de changeset: 72595:43cd1d9552de user: Victor Stinner date: Sun Oct 02 21:33:54 2011 +0200 summary: unicode_convert_wchar_to_ucs4() cannot fail files: Objects/unicodeobject.c | 14 ++++---------- 1 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -590,7 +590,7 @@ This function assumes that unicode can hold one more code point than wstr characters for a terminating null character. */ -static int +static void unicode_convert_wchar_to_ucs4(const wchar_t *begin, const wchar_t *end, PyUnicodeObject *unicode) { @@ -757,6 +757,7 @@ { const wchar_t *iter; + assert(num_surrogates != NULL && maxchar != NULL); if (num_surrogates == NULL || maxchar == NULL) { PyErr_SetString(PyExc_SystemError, "unexpected NULL arguments to " @@ -903,11 +904,7 @@ _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; - if (unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, - unicode) < 0) { - assert(0 && "ConvertWideCharToUCS4 failed"); - return -1; - } + unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode); PyObject_FREE(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; @@ -1081,10 +1078,7 @@ #if SIZEOF_WCHAR_T == 2 /* This is the only case which has to process surrogates, thus a simple copy loop is not enough and we need a function. */ - if (unicode_convert_wchar_to_ucs4(u, u + size, unicode) < 0) { - Py_DECREF(unicode); - return NULL; - } + unicode_convert_wchar_to_ucs4(u, u + size, unicode); #else assert(num_surrogates == 0); Py_MEMCPY(PyUnicode_4BYTE_DATA(unicode), u, size * 4); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:19 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FCopyCharacters?= =?utf8?q?=28=29_fails_when_copying_latin1_into_ascii?= Message-ID: http://hg.python.org/cpython/rev/d64b5c1e3d94 changeset: 72596:d64b5c1e3d94 user: Victor Stinner date: Sun Oct 02 23:33:16 2011 +0200 summary: PyUnicode_CopyCharacters() fails when copying latin1 into ascii files: Objects/unicodeobject.c | 63 +++++++++++++++++++++++++--- 1 files changed, 56 insertions(+), 7 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -455,6 +455,46 @@ return NULL; } +static const char* +unicode_kind_name(PyObject *unicode) +{ + assert(PyUnicode_Check(unicode)); + if (!PyUnicode_IS_COMPACT(unicode)) + { + if (!PyUnicode_IS_READY(unicode)) + return "wstr"; + switch(PyUnicode_KIND(unicode)) + { + case PyUnicode_1BYTE_KIND: + if (PyUnicode_IS_COMPACT_ASCII(unicode)) + return "legacy ascii"; + else + return "legacy latin1"; + case PyUnicode_2BYTE_KIND: + return "legacy UCS2"; + case PyUnicode_4BYTE_KIND: + return "legacy UCS4"; + default: + return ""; + } + } + assert(PyUnicode_IS_READY(unicode)); + switch(PyUnicode_KIND(unicode)) + { + case PyUnicode_1BYTE_KIND: + if (PyUnicode_IS_COMPACT_ASCII(unicode)) + return "ascii"; + else + return "compact latin1"; + case PyUnicode_2BYTE_KIND: + return "compact UCS2"; + case PyUnicode_4BYTE_KIND: + return "compact UCS4"; + default: + return ""; + } +} + #ifdef Py_DEBUG int unicode_new_new_calls = 0; @@ -672,8 +712,10 @@ to_kind = PyUnicode_KIND(to); to_data = PyUnicode_DATA(to); - if (from_kind == to_kind) { - /* fast path */ + if (from_kind == to_kind + /* deny latin1 => ascii */ + && PyUnicode_MAX_CHAR_VALUE(to) >= PyUnicode_MAX_CHAR_VALUE(from)) + { Py_MEMCPY((char*)to_data + PyUnicode_KIND_SIZE(to_kind, to_start), (char*)from_data @@ -712,7 +754,14 @@ } else { int invalid_kinds; - if (from_kind > to_kind) { + + /* check if max_char(from substring) <= max_char(to) */ + if (from_kind > to_kind + /* latin1 => ascii */ + || (PyUnicode_IS_COMPACT_ASCII(to) + && to_kind == PyUnicode_1BYTE_KIND + && !PyUnicode_IS_COMPACT_ASCII(from))) + { /* slow path to check for character overflow */ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); Py_UCS4 ch, maxchar; @@ -736,10 +785,10 @@ invalid_kinds = 1; if (invalid_kinds) { PyErr_Format(PyExc_ValueError, - "Cannot copy UCS%u characters " - "into a string of UCS%u characters", - 1 << (from_kind - 1), - 1 << (to_kind -1)); + "Cannot copy %s characters " + "into a string of %s characters", + unicode_kind_name(from), + unicode_kind_name(to)); return -1; } } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:20 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Write_=5FPyUnicode=5FDump?= =?utf8?q?=28=29_to_help_debugging?= Message-ID: http://hg.python.org/cpython/rev/0f227b4bd20c changeset: 72597:0f227b4bd20c user: Victor Stinner date: Mon Oct 03 02:59:31 2011 +0200 summary: Write _PyUnicode_Dump() to help debugging files: Objects/unicodeobject.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -515,6 +515,29 @@ printf("compact data %p\n", _PyUnicode_COMPACT_DATA(unicode)); return PyUnicode_DATA(unicode); } + +void +_PyUnicode_Dump(PyObject *op) +{ + PyASCIIObject *ascii = (PyASCIIObject *)op; + printf("%s: len=%zu, wstr=%p", + unicode_kind_name(op), + ascii->length, + ascii->wstr); + if (!ascii->state.ascii) { + PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; + printf(" (%zu), utf8=%p (%zu)", + compact->wstr_length, + compact->utf8, + compact->utf8_length); + } + if (!ascii->state.compact) { + PyUnicodeObject *unicode = (PyUnicodeObject *)op; + printf(", data=%p", + unicode->data.any); + } + printf("\n"); +} #endif PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 03:45:21 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 03:45:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FREAD=5FCHAR=28?= =?utf8?q?=29_ensures_that_the_string_is_ready?= Message-ID: http://hg.python.org/cpython/rev/3a0af974f1b5 changeset: 72598:3a0af974f1b5 user: Victor Stinner date: Sun Oct 02 20:33:18 2011 +0200 summary: PyUnicode_READ_CHAR() ensures that the string is ready files: Include/unicodeobject.h | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -429,14 +429,16 @@ PyUnicode_READ_CHAR, for multiple consecutive reads callers should cache kind and use PyUnicode_READ instead. */ #define PyUnicode_READ_CHAR(unicode, index) \ - ((Py_UCS4) \ - (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ - ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ - (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ - ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ - ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ - ) \ - )) + (assert(PyUnicode_Check(unicode)), \ + assert(PyUnicode_IS_READY(unicode)), \ + (Py_UCS4) \ + (PyUnicode_KIND((unicode)) == PyUnicode_1BYTE_KIND ? \ + ((const Py_UCS1 *)(PyUnicode_DATA((unicode))))[(index)] : \ + (PyUnicode_KIND((unicode)) == PyUnicode_2BYTE_KIND ? \ + ((const Py_UCS2 *)(PyUnicode_DATA((unicode))))[(index)] : \ + ((const Py_UCS4 *)(PyUnicode_DATA((unicode))))[(index)] \ + ) \ + )) /* Returns the length of the unicode string. The caller has to make sure that the string has it's canonical representation set before calling -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:35 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_=5FPyUnicode=5FHAS=5FUT?= =?utf8?q?F8=5FMEMORY=28=29_macro?= Message-ID: http://hg.python.org/cpython/rev/d7c96f8f79db changeset: 72599:d7c96f8f79db user: Victor Stinner date: Mon Oct 03 01:08:02 2011 +0200 summary: Add _PyUnicode_HAS_UTF8_MEMORY() macro files: Objects/unicodeobject.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -133,6 +133,15 @@ ((PyASCIIObject *)(op))->length) #define _PyUnicode_DATA_ANY(op) (((PyUnicodeObject*)(op))->data.any) +/* true if the Unicode object has an allocated UTF-8 memory block + (not shared with other data) */ +#define _PyUnicode_HAS_UTF8_MEMORY(op) \ + (assert(PyUnicode_Check(op)), \ + (!PyUnicode_IS_COMPACT_ASCII(op) \ + && _PyUnicode_UTF8(op) \ + && _PyUnicode_UTF8(op) != PyUnicode_DATA(op))) + + /* The Unicode string has been modified: reset the hash */ #define _PyUnicode_DIRTY(op) do { _PyUnicode_HASH(op) = -1; } while (0) @@ -1021,9 +1030,7 @@ (!PyUnicode_IS_READY(unicode) || _PyUnicode_WSTR(unicode) != PyUnicode_DATA(unicode))) PyObject_DEL(_PyUnicode_WSTR(unicode)); - if (!PyUnicode_IS_COMPACT_ASCII(unicode) - && _PyUnicode_UTF8(unicode) - && _PyUnicode_UTF8(unicode) != PyUnicode_DATA(unicode)) + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) PyObject_DEL(_PyUnicode_UTF8(unicode)); if (PyUnicode_IS_COMPACT(unicode)) { @@ -11735,9 +11742,7 @@ (!PyUnicode_IS_READY(v) || (PyUnicode_DATA(v) != _PyUnicode_WSTR(v)))) size += (PyUnicode_WSTR_LENGTH(v) + 1) * sizeof(wchar_t); - if (!PyUnicode_IS_COMPACT_ASCII(v) - && _PyUnicode_UTF8(v) - && _PyUnicode_UTF8(v) != PyUnicode_DATA(v)) + if (_PyUnicode_HAS_UTF8_MEMORY(v)) size += PyUnicode_UTF8_LENGTH(v) + 1; return PyLong_FromSsize_t(size); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:36 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Rewrite_PyUnicode=5FResize?= =?utf8?b?KCk=?= Message-ID: http://hg.python.org/cpython/rev/970c4aa11825 changeset: 72600:970c4aa11825 user: Victor Stinner date: Mon Oct 03 03:52:20 2011 +0200 summary: Rewrite PyUnicode_Resize() * Rename _PyUnicode_Resize() to unicode_resize() * unicode_resize() creates a copy if the string cannot be resized instead of failing * Optimize resize_copy() for wstr strings * Disable temporary resize_inplace() files: Objects/unicodeobject.c | 330 ++++++++++++++++++--------- 1 files changed, 221 insertions(+), 109 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -193,6 +193,8 @@ 0, 0, 0, 0, 0, 0, 0, 0 }; +static PyUnicodeObject *_PyUnicode_New(Py_ssize_t length); + static PyObject * unicode_encode_call_errorhandler(const char *errors, PyObject **errorHandler,const char *encoding, const char *reason, @@ -320,71 +322,144 @@ return NULL; } +static PyObject* +resize_compact(PyObject *unicode, Py_ssize_t length) +{ + Py_ssize_t char_size; + Py_ssize_t struct_size; + Py_ssize_t new_size; + int share_wstr; + + assert(PyUnicode_IS_READY(unicode)); + char_size = PyUnicode_CHARACTER_SIZE(unicode); + if (PyUnicode_IS_COMPACT_ASCII(unicode)) + struct_size = sizeof(PyASCIIObject); + else + struct_size = sizeof(PyCompactUnicodeObject); + share_wstr = (_PyUnicode_WSTR(unicode) == PyUnicode_DATA(unicode)); + + _Py_DEC_REFTOTAL; + _Py_ForgetReference(unicode); + + if (length > ((PY_SSIZE_T_MAX - struct_size) / char_size - 1)) { + PyErr_NoMemory(); + return NULL; + } + new_size = (struct_size + (length + 1) * char_size); + + unicode = (PyObject *)PyObject_REALLOC((char *)unicode, new_size); + if (unicode == NULL) { + PyObject_Del(unicode); + PyErr_NoMemory(); + return NULL; + } + _Py_NewReference(unicode); + _PyUnicode_LENGTH(unicode) = length; + if (share_wstr) + _PyUnicode_WSTR(unicode) = PyUnicode_DATA(unicode); + PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), + length, 0); + return unicode; +} + static int -unicode_resize(register PyUnicodeObject *unicode, - Py_ssize_t length) +resize_inplace(register PyUnicodeObject *unicode, Py_ssize_t length) { void *oldstr; - /* Resizing is only supported for old unicode objects. */ assert(!PyUnicode_IS_COMPACT(unicode)); - assert(_PyUnicode_WSTR(unicode) != NULL); - - /* ... and only if they have not been readied yet, because - callees usually rely on the wstr representation when resizing. */ - assert(unicode->data.any == NULL); - - /* Shortcut if there's nothing much to do. */ - if (_PyUnicode_WSTR_LENGTH(unicode) == length) - goto reset; - - /* Resizing shared object (unicode_empty or single character - objects) in-place is not allowed. Use PyUnicode_Resize() - instead ! */ - - if (unicode == unicode_empty || - (_PyUnicode_WSTR_LENGTH(unicode) == 1 && - _PyUnicode_WSTR(unicode)[0] < 256U && - unicode_latin1[_PyUnicode_WSTR(unicode)[0]] == unicode)) { - PyErr_SetString(PyExc_SystemError, - "can't resize shared str objects"); - return -1; - } - - /* We allocate one more byte to make sure the string is Ux0000 terminated. - The overallocation is also used by fastsearch, which assumes that it's - safe to look at str[length] (without making any assumptions about what - it contains). */ - - oldstr = _PyUnicode_WSTR(unicode); - _PyUnicode_WSTR(unicode) = PyObject_REALLOC(_PyUnicode_WSTR(unicode), - sizeof(Py_UNICODE) * (length + 1)); - if (!_PyUnicode_WSTR(unicode)) { - _PyUnicode_WSTR(unicode) = (Py_UNICODE *)oldstr; - PyErr_NoMemory(); - return -1; - } - _PyUnicode_WSTR(unicode)[length] = 0; - _PyUnicode_WSTR_LENGTH(unicode) = length; - - reset: - if (unicode->data.any != NULL) { - PyObject_FREE(unicode->data.any); - if (_PyUnicode_UTF8(unicode) && _PyUnicode_UTF8(unicode) != unicode->data.any) { - PyObject_FREE(_PyUnicode_UTF8(unicode)); - } + + assert(Py_REFCNT(unicode) == 1); + _PyUnicode_DIRTY(unicode); + + if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) + { + PyObject_DEL(_PyUnicode_UTF8(unicode)); _PyUnicode_UTF8(unicode) = NULL; - _PyUnicode_UTF8_LENGTH(unicode) = 0; - unicode->data.any = NULL; - _PyUnicode_LENGTH(unicode) = 0; - _PyUnicode_STATE(unicode).interned = _PyUnicode_STATE(unicode).interned; - _PyUnicode_STATE(unicode).kind = PyUnicode_WCHAR_KIND; - } - _PyUnicode_DIRTY(unicode); - + } + + if (PyUnicode_IS_READY(unicode)) { + Py_ssize_t char_size; + Py_ssize_t new_size; + int share_wstr; + void *data; + + data = _PyUnicode_DATA_ANY(unicode); + assert(data != NULL); + char_size = PyUnicode_CHARACTER_SIZE(unicode); + share_wstr = (_PyUnicode_WSTR(unicode) == data); + + if (length > (PY_SSIZE_T_MAX / char_size - 1)) { + PyErr_NoMemory(); + return -1; + } + new_size = (length + 1) * char_size; + + data = (PyObject *)PyObject_REALLOC(data, new_size); + if (data == NULL) { + PyErr_NoMemory(); + return -1; + } + _PyUnicode_DATA_ANY(unicode) = data; + if (share_wstr) + _PyUnicode_WSTR(unicode) = data; + _PyUnicode_LENGTH(unicode) = length; + PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); + if (share_wstr) + return 0; + } + if (_PyUnicode_WSTR(unicode) != NULL) { + assert(_PyUnicode_WSTR(unicode) != NULL); + + oldstr = _PyUnicode_WSTR(unicode); + _PyUnicode_WSTR(unicode) = PyObject_REALLOC(_PyUnicode_WSTR(unicode), + sizeof(Py_UNICODE) * (length + 1)); + if (!_PyUnicode_WSTR(unicode)) { + _PyUnicode_WSTR(unicode) = (Py_UNICODE *)oldstr; + PyErr_NoMemory(); + return -1; + } + _PyUnicode_WSTR(unicode)[length] = 0; + _PyUnicode_WSTR_LENGTH(unicode) = length; + } return 0; } +static PyObject* +resize_copy(PyObject *unicode, Py_ssize_t length) +{ + Py_ssize_t copy_length; + if (PyUnicode_IS_COMPACT(unicode)) { + PyObject *copy; + assert(PyUnicode_IS_READY(unicode)); + + copy = PyUnicode_New(length, PyUnicode_MAX_CHAR_VALUE(unicode)); + if (copy == NULL) + return NULL; + + copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode)); + if (PyUnicode_CopyCharacters(copy, 0, + unicode, 0, + copy_length) < 0) + { + Py_DECREF(copy); + return NULL; + } + return copy; + } else { + assert(_PyUnicode_WSTR(unicode) != NULL); + assert(_PyUnicode_DATA_ANY(unicode) == NULL); + PyUnicodeObject *w = _PyUnicode_New(length); + if (w == NULL) + return NULL; + copy_length = _PyUnicode_WSTR_LENGTH(unicode); + copy_length = Py_MIN(copy_length, length); + Py_UNICODE_COPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode), + copy_length); + return (PyObject*)w; + } +} + /* We allocate one more byte to make sure the string is Ux0000 terminated; some code (e.g. new_identifier) relies on that. @@ -690,7 +765,6 @@ assert(ucs4_out == (PyUnicode_4BYTE_DATA(unicode) + _PyUnicode_GET_LENGTH(unicode))); - return 0; } #endif @@ -1044,50 +1118,84 @@ } static int -_PyUnicode_Resize(PyUnicodeObject **unicode, Py_ssize_t length) -{ - register PyUnicodeObject *v; - - /* Argument checks */ - if (unicode == NULL) { +unicode_resizable(PyObject *unicode) +{ + if (Py_REFCNT(unicode) != 1) + return 0; + if (PyUnicode_CHECK_INTERNED(unicode)) + return 0; + if (unicode == unicode_empty) + return 0; + if (PyUnicode_WSTR_LENGTH(unicode) == 1) { + Py_UCS4 ch; + if (PyUnicode_IS_COMPACT(unicode)) + ch = PyUnicode_READ_CHAR(unicode, 0); + else + ch = _PyUnicode_WSTR(unicode)[0]; + if (ch < 256 && unicode_latin1[ch] == unicode) + return 0; + } + /* FIXME: reenable resize_inplace */ + if (!PyUnicode_IS_COMPACT(unicode)) + return 0; + return 1; +} + +static int +unicode_resize(PyObject **p_unicode, Py_ssize_t length) +{ + PyObject *unicode; + Py_ssize_t old_length; + + assert(p_unicode != NULL); + unicode = *p_unicode; + + assert(unicode != NULL); + assert(PyUnicode_Check(unicode)); + assert(0 <= length); + + if (!PyUnicode_IS_COMPACT(unicode) && !PyUnicode_IS_READY(unicode)) + old_length = PyUnicode_WSTR_LENGTH(unicode); + else + old_length = PyUnicode_GET_LENGTH(unicode); + if (old_length == length) + return 0; + + /* FIXME: really create a new object? */ + if (!unicode_resizable(unicode)) { + PyObject *copy = resize_copy(unicode, length); + if (copy == NULL) + return -1; + Py_DECREF(*p_unicode); + *p_unicode = copy; + return 0; + } + + if (PyUnicode_IS_COMPACT(unicode)) { + *p_unicode = resize_compact(unicode, length); + if (*p_unicode == NULL) + return -1; + return 0; + } else + return resize_inplace((PyUnicodeObject*)unicode, length); +} + +int +PyUnicode_Resize(PyObject **p_unicode, Py_ssize_t length) +{ + PyObject *unicode; + if (p_unicode == NULL) { PyErr_BadInternalCall(); return -1; } - v = *unicode; - if (v == NULL || !PyUnicode_Check(v) || Py_REFCNT(v) != 1 || length < 0 || - PyUnicode_IS_COMPACT(v) || _PyUnicode_WSTR(v) == NULL) { + unicode = *p_unicode; + if (unicode == NULL || !PyUnicode_Check(unicode) || length < 0 + || _PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND) + { PyErr_BadInternalCall(); return -1; } - - /* Resizing unicode_empty and single character objects is not - possible since these are being shared. - The same goes for new-representation unicode objects or objects which - have already been readied. - For these, we simply return a fresh copy with the same Unicode content. - */ - if ((_PyUnicode_WSTR_LENGTH(v) != length && - (v == unicode_empty || _PyUnicode_WSTR_LENGTH(v) == 1)) || - PyUnicode_IS_COMPACT(v) || v->data.any) { - PyUnicodeObject *w = _PyUnicode_New(length); - if (w == NULL) - return -1; - Py_UNICODE_COPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(v), - length < _PyUnicode_WSTR_LENGTH(v) ? length : _PyUnicode_WSTR_LENGTH(v)); - Py_DECREF(*unicode); - *unicode = w; - return 0; - } - - /* Note that we don't have to modify *unicode for unshared Unicode - objects, since we can modify them in-place. */ - return unicode_resize(v, length); -} - -int -PyUnicode_Resize(PyObject **unicode, Py_ssize_t length) -{ - return _PyUnicode_Resize((PyUnicodeObject **)unicode, length); + return unicode_resize(p_unicode, length); } static PyObject* @@ -3085,7 +3193,7 @@ if (requiredsize > outsize) { if (requiredsize<2*outsize) requiredsize = 2*outsize; - if (_PyUnicode_Resize(output, requiredsize) < 0) + if (PyUnicode_Resize((PyObject**)output, requiredsize) < 0) goto onError; *outptr = PyUnicode_AS_UNICODE(*output) + *outpos; } @@ -3375,7 +3483,7 @@ } } - if (_PyUnicode_Resize(&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) + if (PyUnicode_Resize((PyObject**)&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) goto onError; Py_XDECREF(errorHandler); @@ -3944,7 +4052,7 @@ /* Adjust length and ready string when it contained errors and is of the old resizable kind. */ if (kind == PyUnicode_WCHAR_KIND) { - if (_PyUnicode_Resize(&unicode, i) < 0 || + if (PyUnicode_Resize((PyObject**)&unicode, i) < 0 || PyUnicode_READY(unicode) == -1) goto onError; } @@ -4449,7 +4557,7 @@ *consumed = (const char *)q-starts; /* Adjust length */ - if (_PyUnicode_Resize(&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) + if (PyUnicode_Resize((PyObject**)&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) goto onError; Py_XDECREF(errorHandler); @@ -4847,7 +4955,7 @@ *consumed = (const char *)q-starts; /* Adjust length */ - if (_PyUnicode_Resize(&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) + if (PyUnicode_Resize((PyObject**)&unicode, p - PyUnicode_AS_UNICODE(unicode)) < 0) goto onError; Py_XDECREF(errorHandler); @@ -5304,9 +5412,13 @@ /* Ensure the length prediction worked in case of ASCII strings */ assert(kind == PyUnicode_WCHAR_KIND || i == ascii_length); - if (kind == PyUnicode_WCHAR_KIND && (_PyUnicode_Resize(&v, i) < 0 || - PyUnicode_READY(v) == -1)) - goto onError; + if (kind == PyUnicode_WCHAR_KIND) + { + if (PyUnicode_Resize((PyObject**)&v, i) < 0) + goto onError; + if (PyUnicode_READY(v) == -1) + goto onError; + } Py_XDECREF(errorHandler); Py_XDECREF(exc); return (PyObject *)v; @@ -5602,7 +5714,7 @@ nextByte: ; } - if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0) + if (PyUnicode_Resize((PyObject**)&v, p - PyUnicode_AS_UNICODE(v)) < 0) goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); @@ -5790,7 +5902,7 @@ } } - if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0) + if (PyUnicode_Resize((PyObject**)&v, p - PyUnicode_AS_UNICODE(v)) < 0) goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); @@ -6216,7 +6328,7 @@ } } if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) - if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0) + if (PyUnicode_Resize((PyObject**)&v, p - PyUnicode_AS_UNICODE(v)) < 0) goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); @@ -6343,7 +6455,7 @@ else { /* Extend unicode object */ n = PyUnicode_GET_SIZE(*v); - if (_PyUnicode_Resize(v, n + usize) < 0) + if (PyUnicode_Resize(v, n + usize) < 0) return -1; } @@ -6682,7 +6794,7 @@ (targetsize << 2); extrachars += needed; /* XXX overflow detection missing */ - if (_PyUnicode_Resize(&v, + if (PyUnicode_Resize((PyObject**)&v, PyUnicode_GET_SIZE(v) + needed) < 0) { Py_DECREF(x); goto onError; @@ -6709,7 +6821,7 @@ } } if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) - if (_PyUnicode_Resize(&v, p - PyUnicode_AS_UNICODE(v)) < 0) + if (PyUnicode_Resize((PyObject**)&v, p - PyUnicode_AS_UNICODE(v)) < 0) goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:36 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FAppend=28=29_no?= =?utf8?q?w_works_in-place_when_it=27s_possible?= Message-ID: http://hg.python.org/cpython/rev/c346f879afbc changeset: 72601:c346f879afbc user: Victor Stinner date: Mon Oct 03 03:54:37 2011 +0200 summary: PyUnicode_Append() now works in-place when it's possible files: Objects/unicodeobject.c | 85 ++++++++++++++++++++++++---- 1 files changed, 73 insertions(+), 12 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9775,19 +9775,80 @@ } void -PyUnicode_Append(PyObject **pleft, PyObject *right) -{ - PyObject *new; - if (*pleft == NULL) +PyUnicode_Append(PyObject **p_left, PyObject *right) +{ + PyObject *left, *res; + + if (p_left == NULL) { + if (!PyErr_Occurred()) + PyErr_BadInternalCall(); return; - if (right == NULL || !PyUnicode_Check(*pleft)) { - Py_DECREF(*pleft); - *pleft = NULL; - return; - } - new = PyUnicode_Concat(*pleft, right); - Py_DECREF(*pleft); - *pleft = new; + } + left = *p_left; + if (right == NULL || !PyUnicode_Check(left)) { + if (!PyErr_Occurred()) + PyErr_BadInternalCall(); + goto error; + } + + if (PyUnicode_CheckExact(left) && left != unicode_empty + && PyUnicode_CheckExact(right) && right != unicode_empty + && unicode_resizable(left) + && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) + || _PyUnicode_WSTR(left) != NULL)) + { + Py_ssize_t u_len, v_len, new_len, copied; + + /* FIXME: don't make wstr string ready */ + if (PyUnicode_READY(left)) + goto error; + if (PyUnicode_READY(right)) + goto error; + + /* FIXME: support ascii+latin1, PyASCIIObject => PyCompactUnicodeObject */ + if (PyUnicode_MAX_CHAR_VALUE(right) <= PyUnicode_MAX_CHAR_VALUE(left)) + { + u_len = PyUnicode_GET_LENGTH(left); + v_len = PyUnicode_GET_LENGTH(right); + if (u_len > PY_SSIZE_T_MAX - v_len) { + PyErr_SetString(PyExc_OverflowError, + "strings are too large to concat"); + goto error; + } + new_len = u_len + v_len; + + /* Now we own the last reference to 'left', so we can resize it + * in-place. + */ + if (unicode_resize(&left, new_len) != 0) { + /* XXX if _PyUnicode_Resize() fails, 'left' has been + * deallocated so it cannot be put back into + * 'variable'. The MemoryError is raised when there + * is no value in 'variable', which might (very + * remotely) be a cause of incompatibilities. + */ + goto error; + } + /* copy 'right' into the newly allocated area of 'left' */ + copied = PyUnicode_CopyCharacters(left, u_len, + right, 0, + v_len); + assert(0 <= copied); + *p_left = left; + return; + } + } + + res = PyUnicode_Concat(left, right); + if (res == NULL) + goto error; + Py_DECREF(left); + *p_left = res; + return; + +error: + Py_DECREF(*p_left); + *p_left = NULL; } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:37 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:37 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_In_release_mode=2C_PyUnicod?= =?utf8?q?e=5FInternInPlace=28=29_does_nothing_if_the_input_is_NULL_or?= Message-ID: http://hg.python.org/cpython/rev/6ca9bb281c37 changeset: 72602:6ca9bb281c37 user: Victor Stinner date: Mon Oct 03 02:01:52 2011 +0200 summary: In release mode, PyUnicode_InternInPlace() does nothing if the input is NULL or not a unicode, instead of failing with a fatal error. Use assertions in debug mode (provide better error messages). files: Objects/unicodeobject.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12893,9 +12893,13 @@ { register PyUnicodeObject *s = (PyUnicodeObject *)(*p); PyObject *t; +#ifdef Py_DEBUG + assert(s != NULL); + assert(_PyUnicode_CHECK(s)); +#else if (s == NULL || !PyUnicode_Check(s)) - Py_FatalError( - "PyUnicode_InternInPlace: unicode strings only please!"); + return; +#endif /* If it's a subclass, we don't really know what putting it in the interned dict might do. */ if (!PyUnicode_CheckExact(s)) @@ -12903,7 +12907,7 @@ if (PyUnicode_CHECK_INTERNED(s)) return; if (PyUnicode_READY(s) == -1) { - assert(0 && "ready fail in intern..."); + assert(0 && "PyUnicode_READY fail in PyUnicode_InternInPlace"); return; } if (interned == NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:38 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_=5FPyUnicode=5FCheckCon?= =?utf8?q?sistency=28=29_macro_to_help_debugging?= Message-ID: http://hg.python.org/cpython/rev/dbb9313c3ed8 changeset: 72603:dbb9313c3ed8 user: Victor Stinner date: Mon Oct 03 03:20:16 2011 +0200 summary: Add _PyUnicode_CheckConsistency() macro to help debugging * Document Unicode string states * Use _PyUnicode_CheckConsistency() to ensure that objects are always consistent. files: Include/unicodeobject.h | 46 +++++++++ Objects/unicodeobject.c | 135 ++++++++++++++++++++------- 2 files changed, 144 insertions(+), 37 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -206,6 +206,52 @@ immediately follow the structure. utf8_length and wstr_length can be found in the length field; the utf8 pointer is equal to the data pointer. */ typedef struct { + /* Unicode strings can be in 4 states: + + - compact ascii: + + * structure = PyASCIIObject + * kind = PyUnicode_1BYTE_KIND + * compact = 1 + * ascii = 1 + * ready = 1 + * utf8 = data + + - compact: + + * structure = PyCompactUnicodeObject + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 1 + * ready = 1 + * (ascii = 0) + + - string created by the legacy API (not ready): + + * structure = PyUnicodeObject + * kind = PyUnicode_WCHAR_KIND + * compact = 0 + * ready = 0 + * wstr is not NULL + * data.any is NULL + * utf8 is NULL + * interned = SSTATE_NOT_INTERNED + * (ascii = 0) + + - string created by the legacy API, ready: + + * structure = PyUnicodeObject structure + * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or + PyUnicode_4BYTE_KIND + * compact = 0 + * ready = 1 + * data.any is not NULL + * (ascii = 0) + + String created by the legacy API becomes ready when calling + PyUnicode_READY(). + + See also _PyUnicode_CheckConsistency(). */ PyObject_HEAD Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -89,25 +89,16 @@ extern "C" { #endif -/* Generic helper macro to convert characters of different types. - from_type and to_type have to be valid type names, begin and end - are pointers to the source characters which should be of type - "from_type *". to is a pointer of type "to_type *" and points to the - buffer where the result characters are written to. */ -#define _PyUnicode_CONVERT_BYTES(from_type, to_type, begin, end, to) \ - do { \ - const from_type *iter_; to_type *to_; \ - for (iter_ = (begin), to_ = (to_type *)(to); \ - iter_ < (end); \ - ++iter_, ++to_) { \ - *to_ = (to_type)*iter_; \ - } \ - } while (0) +#ifdef Py_DEBUG +# define _PyUnicode_CHECK(op) _PyUnicode_CheckConsistency(op) +#else +# define _PyUnicode_CHECK(op) PyUnicode_Check(op) +#endif #define _PyUnicode_UTF8(op) \ (((PyCompactUnicodeObject*)(op))->utf8) #define PyUnicode_UTF8(op) \ - (assert(PyUnicode_Check(op)), \ + (assert(_PyUnicode_CHECK(op)), \ assert(PyUnicode_IS_READY(op)), \ PyUnicode_IS_COMPACT_ASCII(op) ? \ ((char*)((PyASCIIObject*)(op) + 1)) : \ @@ -115,7 +106,7 @@ #define _PyUnicode_UTF8_LENGTH(op) \ (((PyCompactUnicodeObject*)(op))->utf8_length) #define PyUnicode_UTF8_LENGTH(op) \ - (assert(PyUnicode_Check(op)), \ + (assert(_PyUnicode_CHECK(op)), \ assert(PyUnicode_IS_READY(op)), \ PyUnicode_IS_COMPACT_ASCII(op) ? \ ((PyASCIIObject*)(op))->length : \ @@ -125,22 +116,42 @@ #define _PyUnicode_LENGTH(op) (((PyASCIIObject *)(op))->length) #define _PyUnicode_STATE(op) (((PyASCIIObject *)(op))->state) #define _PyUnicode_HASH(op) (((PyASCIIObject *)(op))->hash) -#define _PyUnicode_KIND(op) \ - (assert(PyUnicode_Check(op)), \ +#define _PyUnicode_KIND(op) \ + (assert(_PyUnicode_CHECK(op)), \ ((PyASCIIObject *)(op))->state.kind) -#define _PyUnicode_GET_LENGTH(op) \ - (assert(PyUnicode_Check(op)), \ +#define _PyUnicode_GET_LENGTH(op) \ + (assert(_PyUnicode_CHECK(op)), \ ((PyASCIIObject *)(op))->length) #define _PyUnicode_DATA_ANY(op) (((PyUnicodeObject*)(op))->data.any) +#undef PyUnicode_READY +#define PyUnicode_READY(op) \ + (assert(_PyUnicode_CHECK(op)), \ + (PyUnicode_IS_READY(op) ? \ + 0 : _PyUnicode_Ready((PyObject *)(op)))) + /* true if the Unicode object has an allocated UTF-8 memory block (not shared with other data) */ -#define _PyUnicode_HAS_UTF8_MEMORY(op) \ - (assert(PyUnicode_Check(op)), \ - (!PyUnicode_IS_COMPACT_ASCII(op) \ - && _PyUnicode_UTF8(op) \ +#define _PyUnicode_HAS_UTF8_MEMORY(op) \ + (assert(_PyUnicode_CHECK(op)), \ + (!PyUnicode_IS_COMPACT_ASCII(op) \ + && _PyUnicode_UTF8(op) \ && _PyUnicode_UTF8(op) != PyUnicode_DATA(op))) +/* Generic helper macro to convert characters of different types. + from_type and to_type have to be valid type names, begin and end + are pointers to the source characters which should be of type + "from_type *". to is a pointer of type "to_type *" and points to the + buffer where the result characters are written to. */ +#define _PyUnicode_CONVERT_BYTES(from_type, to_type, begin, end, to) \ + do { \ + const from_type *iter_; to_type *to_; \ + for (iter_ = (begin), to_ = (to_type *)(to); \ + iter_ < (end); \ + ++iter_, ++to_) { \ + *to_ = (to_type)*iter_; \ + } \ + } while (0) /* The Unicode string has been modified: reset the hash */ #define _PyUnicode_DIRTY(op) do { _PyUnicode_HASH(op) = -1; } while (0) @@ -250,6 +261,57 @@ #endif } +#ifdef Py_DEBUG +static int +_PyUnicode_CheckConsistency(void *op) +{ + PyASCIIObject *ascii; + unsigned int kind; + + assert(PyUnicode_Check(op)); + + ascii = (PyASCIIObject *)op; + kind = ascii->state.kind; + + if (ascii->state.ascii == 1) { + assert(kind == PyUnicode_1BYTE_KIND); + assert(ascii->state.compact == 1); + assert(ascii->state.ready == 1); + } + else if (ascii->state.compact == 1) { + assert(kind == PyUnicode_1BYTE_KIND + || kind == PyUnicode_2BYTE_KIND + || kind == PyUnicode_4BYTE_KIND); + assert(ascii->state.compact == 1); + assert(ascii->state.ascii == 0); + assert(ascii->state.ready == 1); + } else { + PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; + PyUnicodeObject *unicode = (PyUnicodeObject *)op; + + if (kind == PyUnicode_WCHAR_KIND) { + assert(!ascii->state.compact == 1); + assert(ascii->state.ascii == 0); + assert(!ascii->state.ready == 1); + assert(ascii->wstr != NULL); + assert(unicode->data.any == NULL); + assert(compact->utf8 == NULL); + assert(ascii->state.interned == SSTATE_NOT_INTERNED); + } + else { + assert(kind == PyUnicode_1BYTE_KIND + || kind == PyUnicode_2BYTE_KIND + || kind == PyUnicode_4BYTE_KIND); + assert(!ascii->state.compact == 1); + assert(ascii->state.ready == 1); + assert(unicode->data.any != NULL); + assert(ascii->state.ascii == 0); + } + } + return 1; +} +#endif + /* --- Bloom Filters ----------------------------------------------------- */ /* stuff to implement simple "bloom filters" for Unicode characters. @@ -542,7 +604,7 @@ static const char* unicode_kind_name(PyObject *unicode) { - assert(PyUnicode_Check(unicode)); + assert(_PyUnicode_CHECK(unicode)); if (!PyUnicode_IS_COMPACT(unicode)) { if (!PyUnicode_IS_READY(unicode)) @@ -744,7 +806,8 @@ const wchar_t *iter; Py_UCS4 *ucs4_out; - assert(unicode && PyUnicode_Check(unicode)); + assert(unicode != NULL); + assert(_PyUnicode_CHECK(unicode)); assert(_PyUnicode_KIND(unicode) == PyUnicode_4BYTE_KIND); ucs4_out = PyUnicode_4BYTE_DATA(unicode); @@ -771,7 +834,7 @@ static int _PyUnicode_Dirty(PyObject *unicode) { - assert(PyUnicode_Check(unicode)); + assert(_PyUnicode_CHECK(unicode)); if (Py_REFCNT(unicode) != 1) { PyErr_SetString(PyExc_ValueError, "Cannot modify a string having more than 1 reference"); @@ -966,10 +1029,8 @@ strings were created using _PyObject_New() and where no canonical representation (the str field) has been set yet aka strings which are not yet ready. */ - assert(PyUnicode_Check(obj)); - assert(!PyUnicode_IS_READY(obj)); - assert(!PyUnicode_IS_COMPACT(obj)); - assert(_PyUnicode_KIND(obj) == PyUnicode_WCHAR_KIND); + assert(_PyUnicode_CHECK(unicode)); + assert(_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND); assert(_PyUnicode_WSTR(unicode) != NULL); assert(_PyUnicode_DATA_ANY(unicode) == NULL); assert(_PyUnicode_UTF8(unicode) == NULL); @@ -1154,7 +1215,7 @@ assert(PyUnicode_Check(unicode)); assert(0 <= length); - if (!PyUnicode_IS_COMPACT(unicode) && !PyUnicode_IS_READY(unicode)) + if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) old_length = PyUnicode_WSTR_LENGTH(unicode); else old_length = PyUnicode_GET_LENGTH(unicode); @@ -1907,7 +1968,7 @@ case 'U': { PyObject *obj = va_arg(count, PyObject *); - assert(obj && PyUnicode_Check(obj)); + assert(obj && _PyUnicode_CHECK(obj)); if (PyUnicode_READY(obj) == -1) goto fail; argmaxchar = PyUnicode_MAX_CHAR_VALUE(obj); @@ -1921,7 +1982,7 @@ const char *str = va_arg(count, const char *); PyObject *str_obj; assert(obj || str); - assert(!obj || PyUnicode_Check(obj)); + assert(!obj || _PyUnicode_CHECK(obj)); if (obj) { if (PyUnicode_READY(obj) == -1) goto fail; @@ -9570,7 +9631,7 @@ void *data; Py_UCS4 chr; - assert(PyUnicode_Check(uni)); + assert(_PyUnicode_CHECK(uni)); if (PyUnicode_READY(uni) == -1) return -1; kind = PyUnicode_KIND(uni); @@ -12698,7 +12759,7 @@ unicode = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds); if (unicode == NULL) return NULL; - assert(PyUnicode_Check(unicode)); + assert(_PyUnicode_CHECK(unicode)); if (PyUnicode_READY(unicode)) return NULL; @@ -13054,7 +13115,7 @@ seq = it->it_seq; if (seq == NULL) return NULL; - assert(PyUnicode_Check(seq)); + assert(_PyUnicode_CHECK(seq)); if (it->it_index < PyUnicode_GET_LENGTH(seq)) { int kind = PyUnicode_KIND(seq); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:39 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_PyUnicode=5FWCHAR=5FKIN?= =?utf8?q?D_to_check_if_a_string_is_a_wstr_string?= Message-ID: http://hg.python.org/cpython/rev/2f9ac1eb1a99 changeset: 72604:2f9ac1eb1a99 user: Victor Stinner date: Mon Oct 03 02:16:37 2011 +0200 summary: Use PyUnicode_WCHAR_KIND to check if a string is a wstr string Simplify the test in wstr pointer in unicode_sizeof(). files: Objects/unicodeobject.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1181,18 +1181,23 @@ static int unicode_resizable(PyObject *unicode) { + Py_ssize_t len; if (Py_REFCNT(unicode) != 1) return 0; if (PyUnicode_CHECK_INTERNED(unicode)) return 0; if (unicode == unicode_empty) return 0; - if (PyUnicode_WSTR_LENGTH(unicode) == 1) { + if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) + len = PyUnicode_WSTR_LENGTH(unicode); + else + len = PyUnicode_GET_LENGTH(unicode); + if (len == 1) { Py_UCS4 ch; - if (PyUnicode_IS_COMPACT(unicode)) + if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) + ch = _PyUnicode_WSTR(unicode)[0]; + else ch = PyUnicode_READ_CHAR(unicode, 0); - else - ch = _PyUnicode_WSTR(unicode)[0]; if (ch < 256 && unicode_latin1[ch] == unicode) return 0; } @@ -11969,12 +11974,9 @@ PyUnicode_CHARACTER_SIZE(v); } /* If the wstr pointer is present, account for it unless it is shared - with the data pointer. Since PyUnicode_DATA will crash if the object - is not ready, check whether it's either not ready (in which case the - data is entirely in wstr) or if the data is not shared. */ + with the data pointer. Check if the data is not shared. */ if (_PyUnicode_WSTR(v) && - (!PyUnicode_IS_READY(v) || - (PyUnicode_DATA(v) != _PyUnicode_WSTR(v)))) + (PyUnicode_DATA(v) != _PyUnicode_WSTR(v))) size += (PyUnicode_WSTR_LENGTH(v) + 1) * sizeof(wchar_t); if (_PyUnicode_HAS_UTF8_MEMORY(v)) size += PyUnicode_UTF8_LENGTH(v) + 1; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:02:39 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:02:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_ceval=2Ec=3A_restore_str+?= =?utf8?q?=3Dstr_optimization?= Message-ID: http://hg.python.org/cpython/rev/07d27d865e2c changeset: 72605:07d27d865e2c user: Victor Stinner date: Sun Oct 02 20:34:20 2011 +0200 summary: ceval.c: restore str+=str optimization files: Python/ceval.c | 76 ++++++++++++++++++++++++++++++++++++- 1 files changed, 73 insertions(+), 3 deletions(-) diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -136,6 +136,8 @@ static int import_all_from(PyObject *, PyObject *); static void format_exc_check_arg(PyObject *, const char *, PyObject *); static void format_exc_unbound(PyCodeObject *co, int oparg); +static PyObject * unicode_concatenate(PyObject *, PyObject *, + PyFrameObject *, unsigned char *); static PyObject * special_lookup(PyObject *, char *, PyObject **); #define NAME_ERROR_MSG \ @@ -1507,8 +1509,17 @@ TARGET(BINARY_ADD) w = POP(); v = TOP(); - x = PyNumber_Add(v, w); + if (PyUnicode_CheckExact(v) && + PyUnicode_CheckExact(w)) { + x = unicode_concatenate(v, w, f, next_instr); + /* unicode_concatenate consumed the ref to v */ + goto skip_decref_vx; + } + else { + x = PyNumber_Add(v, w); + } Py_DECREF(v); + skip_decref_vx: Py_DECREF(w); SET_TOP(x); if (x != NULL) DISPATCH(); @@ -1659,8 +1670,17 @@ TARGET(INPLACE_ADD) w = POP(); v = TOP(); - x = PyNumber_InPlaceAdd(v, w); + if (PyUnicode_CheckExact(v) && + PyUnicode_CheckExact(w)) { + x = unicode_concatenate(v, w, f, next_instr); + /* unicode_concatenate consumed the ref to v */ + goto skip_decref_v; + } + else { + x = PyNumber_InPlaceAdd(v, w); + } Py_DECREF(v); + skip_decref_v: Py_DECREF(w); SET_TOP(x); if (x != NULL) DISPATCH(); @@ -3399,7 +3419,7 @@ f->f_exc_traceback = tstate->exc_traceback; Py_XDECREF(type); Py_XDECREF(value); - Py_XDECREF(traceback); + Py_XDECREF(traceback); } static void @@ -4495,6 +4515,56 @@ } } +static PyObject * +unicode_concatenate(PyObject *v, PyObject *w, + PyFrameObject *f, unsigned char *next_instr) +{ + PyObject *res; + if (Py_REFCNT(v) == 2) { + /* In the common case, there are 2 references to the value + * stored in 'variable' when the += is performed: one on the + * value stack (in 'v') and one still stored in the + * 'variable'. We try to delete the variable now to reduce + * the refcnt to 1. + */ + switch (*next_instr) { + case STORE_FAST: + { + int oparg = PEEKARG(); + PyObject **fastlocals = f->f_localsplus; + if (GETLOCAL(oparg) == v) + SETLOCAL(oparg, NULL); + break; + } + case STORE_DEREF: + { + PyObject **freevars = (f->f_localsplus + + f->f_code->co_nlocals); + PyObject *c = freevars[PEEKARG()]; + if (PyCell_GET(c) == v) + PyCell_Set(c, NULL); + break; + } + case STORE_NAME: + { + PyObject *names = f->f_code->co_names; + PyObject *name = GETITEM(names, PEEKARG()); + PyObject *locals = f->f_locals; + if (PyDict_CheckExact(locals) && + PyDict_GetItem(locals, name) == v) { + if (PyDict_DelItem(locals, name) != 0) { + PyErr_Clear(); + } + } + break; + } + } + } + res = v; + PyUnicode_Append(&res, w); + return res; +} + #ifdef DYNAMIC_EXECUTION_PROFILE static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:05:43 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:05:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_error_on_Wi?= =?utf8?q?ndows?= Message-ID: http://hg.python.org/cpython/rev/5c79977313e4 changeset: 72606:5c79977313e4 user: Victor Stinner date: Mon Oct 03 04:06:05 2011 +0200 summary: Fix compilation error on Windows Fix also a compiler warning. files: Objects/unicodeobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -509,9 +509,10 @@ } return copy; } else { + PyUnicodeObject *w; assert(_PyUnicode_WSTR(unicode) != NULL); assert(_PyUnicode_DATA_ANY(unicode) == NULL); - PyUnicodeObject *w = _PyUnicode_New(length); + w = _PyUnicode_New(length); if (w == NULL) return NULL; copy_length = _PyUnicode_WSTR_LENGTH(unicode); @@ -6521,7 +6522,7 @@ else { /* Extend unicode object */ n = PyUnicode_GET_SIZE(*v); - if (PyUnicode_Resize(v, n + usize) < 0) + if (PyUnicode_Resize((PyObject**)v, n + usize) < 0) return -1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:17:49 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:17:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPyUnicode=5FReady=28=29_?= =?utf8?q?for_16-bit_wchar=5Ft?= Message-ID: http://hg.python.org/cpython/rev/8720e6fa6fc5 changeset: 72607:8720e6fa6fc5 user: Victor Stinner date: Mon Oct 03 04:17:10 2011 +0200 summary: _PyUnicode_Ready() for 16-bit wchar_t files: Objects/unicodeobject.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1121,6 +1121,8 @@ _PyUnicode_STATE(unicode).kind = PyUnicode_4BYTE_KIND; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; + /* unicode_convert_wchar_to_ucs4() requires a ready string */ + _PyUnicode_STATE(unicode).ready = 1; unicode_convert_wchar_to_ucs4(_PyUnicode_WSTR(unicode), end, unicode); PyObject_FREE(_PyUnicode_WSTR(unicode)); _PyUnicode_WSTR(unicode) = NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 04:17:50 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 04:17:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Disable_unicode=5Fresize=28?= =?utf8?q?=29_optimization_on_Windows_=2816-bit_wchar=5Ft=29?= Message-ID: http://hg.python.org/cpython/rev/26d63e7eac17 changeset: 72608:26d63e7eac17 user: Victor Stinner date: Mon Oct 03 04:18:04 2011 +0200 summary: Disable unicode_resize() optimization on Windows (16-bit wchar_t) files: Objects/unicodeobject.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1185,6 +1185,10 @@ unicode_resizable(PyObject *unicode) { Py_ssize_t len; +#if SIZEOF_WCHAR_T == 2 + /* FIXME: unicode_resize() is buggy on Windows */ + return 0; +#endif if (Py_REFCNT(unicode) != 1) return 0; if (PyUnicode_CHECK_INTERNED(unicode)) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 3 05:23:35 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 03 Oct 2011 05:23:35 +0200 Subject: [Python-checkins] Daily reference leaks (1ed413b52af3): sum=0 Message-ID: results for 1ed413b52af3 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogpbOnRq', '-x'] From python-checkins at python.org Mon Oct 3 12:21:41 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 12:21:41 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_resize=5Finplace=28=29?= =?utf8?q?=3A_update_shared_utf8_pointer?= Message-ID: http://hg.python.org/cpython/rev/f96d8f8a6e37 changeset: 72609:f96d8f8a6e37 user: Victor Stinner date: Mon Oct 03 12:11:00 2011 +0200 summary: Fix resize_inplace(): update shared utf8 pointer files: Objects/unicodeobject.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -443,13 +443,14 @@ if (PyUnicode_IS_READY(unicode)) { Py_ssize_t char_size; Py_ssize_t new_size; - int share_wstr; + int share_wstr, share_utf8; void *data; data = _PyUnicode_DATA_ANY(unicode); assert(data != NULL); char_size = PyUnicode_CHARACTER_SIZE(unicode); share_wstr = (_PyUnicode_WSTR(unicode) == data); + share_utf8 = (_PyUnicode_UTF8(unicode) == data); if (length > (PY_SSIZE_T_MAX / char_size - 1)) { PyErr_NoMemory(); @@ -465,6 +466,8 @@ _PyUnicode_DATA_ANY(unicode) = data; if (share_wstr) _PyUnicode_WSTR(unicode) = data; + if (share_utf8) + _PyUnicode_UTF8(unicode) = data; _PyUnicode_LENGTH(unicode) = length; PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); if (share_wstr) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 12:21:42 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 12:21:42 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPyUnicode=5FDump=28=29_i?= =?utf8?q?ndicates_if_wstr_and/or_utf8_are_shared?= Message-ID: http://hg.python.org/cpython/rev/fca7280aad8d changeset: 72610:fca7280aad8d user: Victor Stinner date: Mon Oct 03 12:12:11 2011 +0200 summary: _PyUnicode_Dump() indicates if wstr and/or utf8 are shared files: Objects/unicodeobject.c | 33 ++++++++++++++-------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -670,23 +670,24 @@ _PyUnicode_Dump(PyObject *op) { PyASCIIObject *ascii = (PyASCIIObject *)op; - printf("%s: len=%zu, wstr=%p", - unicode_kind_name(op), - ascii->length, - ascii->wstr); + PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; + PyUnicodeObject *unicode = (PyUnicodeObject *)op; + void *data; + printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length); + if (ascii->state.compact) + data = (compact + 1); + else + data = unicode->data.any; + if (ascii->wstr == data) + printf("shared "); + printf("wstr=%p", ascii->wstr); if (!ascii->state.ascii) { - PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; - printf(" (%zu), utf8=%p (%zu)", - compact->wstr_length, - compact->utf8, - compact->utf8_length); - } - if (!ascii->state.compact) { - PyUnicodeObject *unicode = (PyUnicodeObject *)op; - printf(", data=%p", - unicode->data.any); - } - printf("\n"); + printf(" (%zu), ", compact->wstr_length); + if (!ascii->state.compact && compact->utf8 == unicode->data.any) + printf("shared "); + printf("utf8=%p (%zu)", compact->utf8, compact->utf8_length); + } + printf(", data=%p\n", data); } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 12:21:42 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 12:21:42 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_resize=5Finplace=28=29_has_?= =?utf8?q?been_fixed=3A_reenable_this_optimization?= Message-ID: http://hg.python.org/cpython/rev/6bb850f6a438 changeset: 72611:6bb850f6a438 user: Victor Stinner date: Mon Oct 03 12:21:33 2011 +0200 summary: resize_inplace() has been fixed: reenable this optimization files: Objects/unicodeobject.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1212,9 +1212,6 @@ if (ch < 256 && unicode_latin1[ch] == unicode) return 0; } - /* FIXME: reenable resize_inplace */ - if (!PyUnicode_IS_COMPACT(unicode)) - return 0; return 1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 12:52:05 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 12:52:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_resize=5Fcompact=28=29_?= =?utf8?q?and_resize=5Finplace=28=29=3B_reenable_full_resize_optimizations?= Message-ID: http://hg.python.org/cpython/rev/78183a564462 changeset: 72612:78183a564462 user: Victor Stinner date: Mon Oct 03 12:52:27 2011 +0200 summary: Fix resize_compact() and resize_inplace(); reenable full resize optimizations * resize_compact() updates also wstr_len for non-ascii strings sharing wstr * resize_inplace() updates also utf8_len/wstr_len for strings sharing utf8/wstr files: Objects/unicodeobject.c | 31 +++++++++++++++++++--------- 1 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -130,6 +130,14 @@ (PyUnicode_IS_READY(op) ? \ 0 : _PyUnicode_Ready((PyObject *)(op)))) +#define _PyUnicode_SHARE_UTF8(op) \ + (assert(_PyUnicode_CHECK(op)), \ + assert(!PyUnicode_IS_COMPACT_ASCII(op)), \ + (_PyUnicode_UTF8(op) == PyUnicode_DATA(op))) +#define _PyUnicode_SHARE_WSTR(op) \ + (assert(_PyUnicode_CHECK(op)), \ + (_PyUnicode_WSTR(unicode) == PyUnicode_DATA(op))) + /* true if the Unicode object has an allocated UTF-8 memory block (not shared with other data) */ #define _PyUnicode_HAS_UTF8_MEMORY(op) \ @@ -398,7 +406,7 @@ struct_size = sizeof(PyASCIIObject); else struct_size = sizeof(PyCompactUnicodeObject); - share_wstr = (_PyUnicode_WSTR(unicode) == PyUnicode_DATA(unicode)); + share_wstr = _PyUnicode_SHARE_WSTR(unicode); _Py_DEC_REFTOTAL; _Py_ForgetReference(unicode); @@ -417,8 +425,11 @@ } _Py_NewReference(unicode); _PyUnicode_LENGTH(unicode) = length; - if (share_wstr) + if (share_wstr) { _PyUnicode_WSTR(unicode) = PyUnicode_DATA(unicode); + if (!PyUnicode_IS_COMPACT_ASCII(unicode)) + _PyUnicode_WSTR_LENGTH(unicode) = length; + } PyUnicode_WRITE(PyUnicode_KIND(unicode), PyUnicode_DATA(unicode), length, 0); return unicode; @@ -449,8 +460,8 @@ data = _PyUnicode_DATA_ANY(unicode); assert(data != NULL); char_size = PyUnicode_CHARACTER_SIZE(unicode); - share_wstr = (_PyUnicode_WSTR(unicode) == data); - share_utf8 = (_PyUnicode_UTF8(unicode) == data); + share_wstr = _PyUnicode_SHARE_WSTR(unicode); + share_utf8 = _PyUnicode_SHARE_UTF8(unicode); if (length > (PY_SSIZE_T_MAX / char_size - 1)) { PyErr_NoMemory(); @@ -464,10 +475,14 @@ return -1; } _PyUnicode_DATA_ANY(unicode) = data; - if (share_wstr) + if (share_wstr) { _PyUnicode_WSTR(unicode) = data; - if (share_utf8) + _PyUnicode_WSTR_LENGTH(unicode) = length; + } + if (share_utf8) { _PyUnicode_UTF8(unicode) = data; + _PyUnicode_UTF8_LENGTH(unicode) = length; + } _PyUnicode_LENGTH(unicode) = length; PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); if (share_wstr) @@ -1189,10 +1204,6 @@ unicode_resizable(PyObject *unicode) { Py_ssize_t len; -#if SIZEOF_WCHAR_T == 2 - /* FIXME: unicode_resize() is buggy on Windows */ - return 0; -#endif if (Py_REFCNT(unicode) != 1) return 0; if (PyUnicode_CHECK_INTERNED(unicode)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 14:01:35 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 14:01:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Create_=5FPyUnicode=5FREADY?= =?utf8?q?=5FREPLACE=28=29_to_reuse_singleton?= Message-ID: http://hg.python.org/cpython/rev/0312400eaa48 changeset: 72613:0312400eaa48 user: Victor Stinner date: Mon Oct 03 13:28:14 2011 +0200 summary: Create _PyUnicode_READY_REPLACE() to reuse singleton Only use _PyUnicode_READY_REPLACE() on just created strings. files: Objects/unicodeobject.c | 96 ++++++++++++++++++++++------ 1 files changed, 73 insertions(+), 23 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -130,6 +130,11 @@ (PyUnicode_IS_READY(op) ? \ 0 : _PyUnicode_Ready((PyObject *)(op)))) +#define _PyUnicode_READY_REPLACE(p_obj) \ + (assert(_PyUnicode_CHECK(*p_obj)), \ + (PyUnicode_IS_READY(*p_obj) ? \ + 0 : _PyUnicode_ReadyReplace((PyObject **)(p_obj)))) + #define _PyUnicode_SHARE_UTF8(op) \ (assert(_PyUnicode_CHECK(op)), \ assert(!PyUnicode_IS_COMPACT_ASCII(op)), \ @@ -212,7 +217,9 @@ 0, 0, 0, 0, 0, 0, 0, 0 }; +/* forward */ static PyUnicodeObject *_PyUnicode_New(Py_ssize_t length); +static PyObject* get_latin1_char(unsigned char ch); static PyObject * unicode_encode_call_errorhandler(const char *errors, @@ -1034,10 +1041,10 @@ int unicode_ready_calls = 0; #endif -int -_PyUnicode_Ready(PyObject *obj) -{ - PyUnicodeObject *unicode = (PyUnicodeObject *)obj; +static int +unicode_ready(PyObject **p_obj, int replace) +{ + PyUnicodeObject *unicode; wchar_t *end; Py_UCS4 maxchar = 0; Py_ssize_t num_surrogates; @@ -1045,6 +1052,9 @@ Py_ssize_t length_wo_surrogates; #endif + assert(p_obj != NULL); + unicode = (PyUnicodeObject *)*p_obj; + /* _PyUnicode_Ready() is only intented for old-style API usage where strings were created using _PyObject_New() and where no canonical representation (the str field) has been set yet aka strings @@ -1061,6 +1071,32 @@ ++unicode_ready_calls; #endif +#ifdef Py_DEBUG + assert(!replace || Py_REFCNT(unicode) == 1); +#else + if (replace && Py_REFCNT(unicode) != 1) + replace = 0; +#endif + if (replace) { + Py_ssize_t len = _PyUnicode_WSTR_LENGTH(unicode); + wchar_t *wstr = _PyUnicode_WSTR(unicode); + /* Optimization for empty strings */ + if (len == 0) { + Py_INCREF(unicode_empty); + Py_DECREF(*p_obj); + *p_obj = unicode_empty; + return 0; + } + if (len == 1 && wstr[0] < 256) { + PyObject *latin1_char = get_latin1_char((unsigned char)wstr[0]); + if (latin1_char == NULL) + return -1; + Py_DECREF(*p_obj); + *p_obj = latin1_char; + return 0; + } + } + end = _PyUnicode_WSTR(unicode) + _PyUnicode_WSTR_LENGTH(unicode); if (find_maxchar_surrogates(_PyUnicode_WSTR(unicode), end, &maxchar, &num_surrogates) == -1) @@ -1161,6 +1197,18 @@ return 0; } +int +_PyUnicode_ReadyReplace(PyObject **op) +{ + return unicode_ready(op, 1); +} + +int +_PyUnicode_Ready(PyObject *op) +{ + return unicode_ready(&op, 0); +} + static void unicode_dealloc(register PyUnicodeObject *unicode) { @@ -2524,7 +2572,7 @@ goto onError; } Py_DECREF(buffer); - if (PyUnicode_READY(unicode)) { + if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } @@ -3573,7 +3621,7 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(unicode) == -1) { + if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } @@ -4137,14 +4185,13 @@ /* Adjust length and ready string when it contained errors and is of the old resizable kind. */ if (kind == PyUnicode_WCHAR_KIND) { - if (PyUnicode_Resize((PyObject**)&unicode, i) < 0 || - PyUnicode_READY(unicode) == -1) + if (PyUnicode_Resize((PyObject**)&unicode, i) < 0) goto onError; } Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(unicode) == -1) { + if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } @@ -4647,7 +4694,7 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(unicode) == -1) { + if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } @@ -5045,7 +5092,7 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(unicode) == -1) { + if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } @@ -5501,11 +5548,13 @@ { if (PyUnicode_Resize((PyObject**)&v, i) < 0) goto onError; - if (PyUnicode_READY(v) == -1) - goto onError; } Py_XDECREF(errorHandler); Py_XDECREF(exc); + if (_PyUnicode_READY_REPLACE(&v)) { + Py_DECREF(v); + return NULL; + } return (PyObject *)v; ucnhashError: @@ -5803,7 +5852,7 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(v) == -1) { + if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } @@ -5991,7 +6040,7 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(v) == -1) { + if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } @@ -6417,7 +6466,7 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(v) == -1) { + if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } @@ -6611,7 +6660,7 @@ goto retry; } #endif - if (PyUnicode_READY(v) == -1) { + if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } @@ -6910,7 +6959,7 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); - if (PyUnicode_READY(v) == -1) { + if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } @@ -7816,7 +7865,7 @@ repunicode = unicode_translate_call_errorhandler(errors, &errorHandler, reason, input, &exc, collstart, collend, &newpos); - if (repunicode == NULL || PyUnicode_READY(repunicode) == -1) + if (repunicode == NULL || _PyUnicode_READY_REPLACE(&repunicode)) goto onError; /* generate replacement */ repsize = PyUnicode_GET_LENGTH(repunicode); @@ -8793,7 +8842,7 @@ Py_TYPE(separator)->tp_name); goto onError; } - if (PyUnicode_READY(separator) == -1) + if (PyUnicode_READY(separator)) goto onError; sep = separator; seplen = PyUnicode_GET_LENGTH(separator); @@ -10126,7 +10175,7 @@ j = 0; } - if (PyUnicode_READY(u) == -1) { + if (_PyUnicode_READY_REPLACE(&u)) { Py_DECREF(u); return NULL; } @@ -12781,7 +12830,7 @@ if (unicode == NULL) return NULL; assert(_PyUnicode_CHECK(unicode)); - if (PyUnicode_READY(unicode)) + if (_PyUnicode_READY_REPLACE(&unicode)) return NULL; self = (PyUnicodeObject *) type->tp_alloc(type, 0); @@ -12988,10 +13037,11 @@ return; if (PyUnicode_CHECK_INTERNED(s)) return; - if (PyUnicode_READY(s) == -1) { + if (_PyUnicode_READY_REPLACE(p)) { assert(0 && "PyUnicode_READY fail in PyUnicode_InternInPlace"); return; } + s = (PyUnicodeObject *)(*p); if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 14:01:36 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 14:01:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FReady=28=29_now?= =?utf8?q?_sets_ascii=3D1_if_maxchar_=3C_128?= Message-ID: http://hg.python.org/cpython/rev/93f033c7cfea changeset: 72614:93f033c7cfea user: Victor Stinner date: Mon Oct 03 13:53:37 2011 +0200 summary: PyUnicode_Ready() now sets ascii=1 if maxchar < 128 ascii=1 is no more reserved to PyASCIIObject. Use PyUnicode_IS_COMPACT_ASCII(obj) to check if obj is a PyASCIIObject (as before). files: Include/unicodeobject.h | 41 +++++++++++++++++----------- Objects/unicodeobject.c | 29 +++++++++---------- Tools/gdb/libpython.py | 5 ++- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -224,7 +224,7 @@ PyUnicode_4BYTE_KIND * compact = 1 * ready = 1 - * (ascii = 0) + * ascii = 0 - string created by the legacy API (not ready): @@ -236,7 +236,7 @@ * data.any is NULL * utf8 is NULL * interned = SSTATE_NOT_INTERNED - * (ascii = 0) + * ascii = 0 - string created by the legacy API, ready: @@ -246,7 +246,6 @@ * compact = 0 * ready = 1 * data.any is not NULL - * (ascii = 0) String created by the legacy API becomes ready when calling PyUnicode_READY(). @@ -278,8 +277,9 @@ one block for the PyUnicodeObject struct and another for its data buffer. */ unsigned int compact:1; - /* Compact objects which are ASCII-only also have the state.compact - flag set, and use the PyASCIIObject struct. */ + /* kind is PyUnicode_1BYTE_KIND but data contains only ASCII + characters. If ascii is 1 and compact is 1, use the PyASCIIObject + structure. */ unsigned int ascii:1; /* The ready flag indicates whether the object layout is initialized completely. This means that this is either a compact object, or @@ -304,7 +304,7 @@ /* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the PyUnicodeObject structure. The actual string data is initially in the wstr - block, and copied into the data block using PyUnicode_Ready. */ + block, and copied into the data block using _PyUnicode_Ready. */ typedef struct { PyCompactUnicodeObject _base; union { @@ -327,7 +327,7 @@ #ifndef Py_LIMITED_API #define PyUnicode_WSTR_LENGTH(op) \ - (((PyASCIIObject*)op)->state.ascii ? \ + (PyUnicode_IS_COMPACT_ASCII(op) ? \ ((PyASCIIObject*)op)->length : \ ((PyCompactUnicodeObject*)op)->wstr_length) @@ -369,10 +369,24 @@ #define SSTATE_INTERNED_MORTAL 1 #define SSTATE_INTERNED_IMMORTAL 2 -#define PyUnicode_IS_COMPACT_ASCII(op) (((PyASCIIObject*)op)->state.ascii) +/* Return true if the string contains only ASCII characters, or 0 if not. The + string may be compact (PyUnicode_IS_COMPACT_ASCII) or not. No type checks + or Ready calls are performed. */ +#define PyUnicode_IS_ASCII(op) \ + (((PyASCIIObject*)op)->state.ascii) + +/* Return true if the string is compact or 0 if not. + No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT(op) \ + (((PyASCIIObject*)(op))->state.compact) + +/* Return true if the string is a compact ASCII string (use PyASCIIObject + structure), or 0 if not. No type checks or Ready calls are performed. */ +#define PyUnicode_IS_COMPACT_ASCII(op) \ + (PyUnicode_IS_ASCII(op) && PyUnicode_IS_COMPACT(op)) /* String contains only wstr byte characters. This is only possible - when the string was created with a legacy API and PyUnicode_Ready() + when the string was created with a legacy API and _PyUnicode_Ready() has not been called yet. */ #define PyUnicode_WCHAR_KIND 0 @@ -399,11 +413,6 @@ #define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) #define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op)) -/* Return true if the string is compact or 0 if not. - No type checks or Ready calls are performed. */ -#define PyUnicode_IS_COMPACT(op) \ - (((PyASCIIObject*)(op))->state.compact) - /* Return one of the PyUnicode_*_KIND values defined above. */ #define PyUnicode_KIND(op) \ (assert(PyUnicode_Check(op)), \ @@ -500,9 +509,9 @@ #define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready) -/* PyUnicode_READY() does less work than PyUnicode_Ready() in the best +/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best case. If the canonical representation is not yet set, it will still call - PyUnicode_Ready(). + _PyUnicode_Ready(). Returns 0 on success and -1 on errors. */ #define PyUnicode_READY(op) \ (assert(PyUnicode_Check(op)), \ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -288,16 +288,14 @@ ascii = (PyASCIIObject *)op; kind = ascii->state.kind; - if (ascii->state.ascii == 1) { + if (ascii->state.ascii == 1 && ascii->state.compact == 1) { assert(kind == PyUnicode_1BYTE_KIND); - assert(ascii->state.compact == 1); assert(ascii->state.ready == 1); } else if (ascii->state.compact == 1) { assert(kind == PyUnicode_1BYTE_KIND || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); - assert(ascii->state.compact == 1); assert(ascii->state.ascii == 0); assert(ascii->state.ready == 1); } else { @@ -305,9 +303,9 @@ PyUnicodeObject *unicode = (PyUnicodeObject *)op; if (kind == PyUnicode_WCHAR_KIND) { - assert(!ascii->state.compact == 1); + assert(ascii->state.compact == 0); assert(ascii->state.ascii == 0); - assert(!ascii->state.ready == 1); + assert(ascii->state.ready == 0); assert(ascii->wstr != NULL); assert(unicode->data.any == NULL); assert(compact->utf8 == NULL); @@ -317,10 +315,9 @@ assert(kind == PyUnicode_1BYTE_KIND || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); - assert(!ascii->state.compact == 1); + assert(ascii->state.compact == 0); assert(ascii->state.ready == 1); assert(unicode->data.any != NULL); - assert(ascii->state.ascii == 0); } } return 1; @@ -638,7 +635,7 @@ switch(PyUnicode_KIND(unicode)) { case PyUnicode_1BYTE_KIND: - if (PyUnicode_IS_COMPACT_ASCII(unicode)) + if (PyUnicode_IS_ASCII(unicode)) return "legacy ascii"; else return "legacy latin1"; @@ -654,14 +651,14 @@ switch(PyUnicode_KIND(unicode)) { case PyUnicode_1BYTE_KIND: - if (PyUnicode_IS_COMPACT_ASCII(unicode)) + if (PyUnicode_IS_ASCII(unicode)) return "ascii"; else - return "compact latin1"; + return "latin1"; case PyUnicode_2BYTE_KIND: - return "compact UCS2"; + return "UCS2"; case PyUnicode_4BYTE_KIND: - return "compact UCS4"; + return "UCS4"; default: return ""; } @@ -703,7 +700,7 @@ if (ascii->wstr == data) printf("shared "); printf("wstr=%p", ascii->wstr); - if (!ascii->state.ascii) { + if (!(ascii->state.ascii == 1 && ascii->state.compact == 1)) { printf(" (%zu), ", compact->wstr_length); if (!ascii->state.compact && compact->utf8 == unicode->data.any) printf("shared "); @@ -954,9 +951,9 @@ /* check if max_char(from substring) <= max_char(to) */ if (from_kind > to_kind /* latin1 => ascii */ - || (PyUnicode_IS_COMPACT_ASCII(to) + || (PyUnicode_IS_ASCII(to) && to_kind == PyUnicode_1BYTE_KIND - && !PyUnicode_IS_COMPACT_ASCII(from))) + && !PyUnicode_IS_ASCII(from))) { /* slow path to check for character overflow */ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); @@ -1115,10 +1112,12 @@ _PyUnicode_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); _PyUnicode_STATE(unicode).kind = PyUnicode_1BYTE_KIND; if (maxchar < 128) { + _PyUnicode_STATE(unicode).ascii = 1; _PyUnicode_UTF8(unicode) = _PyUnicode_DATA_ANY(unicode); _PyUnicode_UTF8_LENGTH(unicode) = _PyUnicode_WSTR_LENGTH(unicode); } else { + _PyUnicode_STATE(unicode).ascii = 0; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; } diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1132,15 +1132,16 @@ compact = self.field('_base') ascii = compact['_base'] state = ascii['state'] + is_compact_ascii = (int(state['ascii']) and int(state['compact'])) field_length = long(ascii['length']) if not int(state['ready']): # string is not ready may_have_surrogates = True field_str = ascii['wstr'] - if not int(state['ascii']): + if not is_compact_ascii: field_length = compact('wstr_length') else: - if int(state['ascii']): + if is_compact_ascii: field_str = ascii.address + 1 elif int(state['compact']): field_str = compact.address + 1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 14:51:25 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 14:51:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicode=5Fkind=5Fname=28=29?= =?utf8?q?_doesn=27t_check_consistency_anymore?= Message-ID: http://hg.python.org/cpython/rev/9fe93afc57b5 changeset: 72615:9fe93afc57b5 user: Victor Stinner date: Mon Oct 03 14:41:45 2011 +0200 summary: unicode_kind_name() doesn't check consistency anymore It is is called from _PyUnicode_Dump() and so must not fail. files: Objects/unicodeobject.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -627,7 +627,8 @@ static const char* unicode_kind_name(PyObject *unicode) { - assert(_PyUnicode_CHECK(unicode)); + /* don't check consistency: unicode_kind_name() is called from + _PyUnicode_Dump() */ if (!PyUnicode_IS_COMPACT(unicode)) { if (!PyUnicode_IS_READY(unicode)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 14:51:25 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 14:51:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicode=5Fsubtype=5Fnew=28?= =?utf8?q?=29_copies_also_the_ascii_flag?= Message-ID: http://hg.python.org/cpython/rev/54d77a25736d changeset: 72616:54d77a25736d user: Victor Stinner date: Mon Oct 03 14:42:15 2011 +0200 summary: unicode_subtype_new() copies also the ascii flag files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12846,7 +12846,7 @@ _PyUnicode_STATE(self).interned = 0; _PyUnicode_STATE(self).kind = kind; _PyUnicode_STATE(self).compact = 0; - _PyUnicode_STATE(self).ascii = 0; + _PyUnicode_STATE(self).ascii = _PyUnicode_STATE(unicode).ascii; _PyUnicode_STATE(self).ready = 1; _PyUnicode_WSTR(self) = NULL; _PyUnicode_UTF8_LENGTH(self) = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 14:51:26 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 14:51:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPyUnicode=5FCheckConsist?= =?utf8?q?ency=28=29_checks_utf8_field_consistency?= Message-ID: http://hg.python.org/cpython/rev/ec481f3f79cd changeset: 72617:ec481f3f79cd user: Victor Stinner date: Mon Oct 03 14:42:39 2011 +0200 summary: _PyUnicode_CheckConsistency() checks utf8 field consistency files: Include/unicodeobject.h | 2 ++ Objects/unicodeobject.c | 6 ++++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -225,6 +225,7 @@ * compact = 1 * ready = 1 * ascii = 0 + * utf8 != data - string created by the legacy API (not ready): @@ -246,6 +247,7 @@ * compact = 0 * ready = 1 * data.any is not NULL + * utf8 = data if ascii is 1 String created by the legacy API becomes ready when calling PyUnicode_READY(). diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -293,11 +293,13 @@ assert(ascii->state.ready == 1); } else if (ascii->state.compact == 1) { + PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; assert(kind == PyUnicode_1BYTE_KIND || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); assert(ascii->state.ascii == 0); assert(ascii->state.ready == 1); + assert (compact->utf8 != (void*)(compact + 1)); } else { PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op; @@ -318,6 +320,10 @@ assert(ascii->state.compact == 0); assert(ascii->state.ready == 1); assert(unicode->data.any != NULL); + if (ascii->state.ascii) + assert (compact->utf8 == unicode->data.any); + else + assert (compact->utf8 != unicode->data.any); } } return 1; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 19:41:05 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 03 Oct 2011 19:41:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Introduce_support=2Erequire?= =?utf8?q?s=5Ffreebsd=5Fversion_decorator=2E?= Message-ID: http://hg.python.org/cpython/rev/3b1859f80e6d changeset: 72618:3b1859f80e6d user: Charles-Fran?ois Natali date: Mon Oct 03 19:40:37 2011 +0200 summary: Introduce support.requires_freebsd_version decorator. files: Lib/test/support.py | 40 +++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 12 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -44,8 +44,8 @@ "Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", "get_original_stdout", "unload", "unlink", "rmtree", "forget", - "is_resource_enabled", "requires", "requires_linux_version", - "requires_mac_ver", "find_unused_port", "bind_port", + "is_resource_enabled", "requires", "requires_freebsd_version", + "requires_linux_version", "requires_mac_ver", "find_unused_port", "bind_port", "IPV6_ENABLED", "is_jython", "TESTFN", "HOST", "SAVEDCWD", "temp_cwd", "findfile", "create_empty_file", "sortdict", "check_syntax_error", "open_urlresource", "check_warnings", "CleanImport", "EnvironmentVarGuard", "TransientResource", @@ -312,17 +312,17 @@ msg = "Use of the %r resource not enabled" % resource raise ResourceDenied(msg) -def requires_linux_version(*min_version): - """Decorator raising SkipTest if the OS is Linux and the kernel version is - less than min_version. +def _requires_unix_version(sysname, min_version): + """Decorator raising SkipTest if the OS is `sysname` and the version is less + than `min_version`. - For example, @requires_linux_version(2, 6, 35) raises SkipTest if the Linux - kernel version is less than 2.6.35. + For example, @_requires_unix_version('FreeBSD', (7, 2)) raises SkipTest if + the FreeBSD version is less than 7.2. """ def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): - if sys.platform == 'linux': + if platform.system() == sysname: version_txt = platform.release().split('-', 1)[0] try: version = tuple(map(int, version_txt.split('.'))) @@ -332,13 +332,29 @@ if version < min_version: min_version_txt = '.'.join(map(str, min_version)) raise unittest.SkipTest( - "Linux kernel %s or higher required, not %s" - % (min_version_txt, version_txt)) - return func(*args, **kw) - wrapper.min_version = min_version + "%s version %s or higher required, not %s" + % (sysname, min_version_txt, version_txt)) return wrapper return decorator +def requires_freebsd_version(*min_version): + """Decorator raising SkipTest if the OS is FreeBSD and the FreeBSD version is + less than `min_version`. + + For example, @requires_freebsd_version(7, 2) raises SkipTest if the FreeBSD + version is less than 7.2. + """ + return _requires_unix_version('FreeBSD', min_version) + +def requires_linux_version(*min_version): + """Decorator raising SkipTest if the OS is Linux and the Linux version is + less than `min_version`. + + For example, @requires_linux_version(2, 6, 32) raises SkipTest if the Linux + version is less than 2.6.32. + """ + return _requires_unix_version('Linux', min_version) + def requires_mac_ver(*min_version): """Decorator raising SkipTest if the OS is Mac OS X and the OS X version if less than min_version. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 19:41:06 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 03 Oct 2011 19:41:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313001=3A_Fix_test?= =?utf8?q?=5Fsocket=2EtestRecvmsgTrunc_failure_on_FreeBSD_=3C_8=2C_which?= Message-ID: http://hg.python.org/cpython/rev/4378bae6b8dc changeset: 72619:4378bae6b8dc user: Charles-Fran?ois Natali date: Mon Oct 03 19:43:15 2011 +0200 summary: Issue #13001: Fix test_socket.testRecvmsgTrunc failure on FreeBSD < 8, which doesn't always set the MSG_TRUNC flag when a truncated datagram is received. files: Lib/test/test_socket.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1659,6 +1659,9 @@ def _testRecvmsgShorter(self): self.sendToServer(MSG) + # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated + # datagram is received (issue #13001). + @support.requires_freebsd_version(8) def testRecvmsgTrunc(self): # Receive part of message, check for truncation indicators. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, @@ -1668,6 +1671,7 @@ self.assertEqual(ancdata, []) self.checkFlags(flags, eor=False) + @support.requires_freebsd_version(8) def _testRecvmsgTrunc(self): self.sendToServer(MSG) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 20:06:28 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 20:06:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_unicode=5Fresizabl?= =?utf8?q?e=28=29=3A_singletons_reference_count_is_at_least_2?= Message-ID: http://hg.python.org/cpython/rev/6fbc5e9141fc changeset: 72620:6fbc5e9141fc user: Victor Stinner date: Mon Oct 03 20:06:05 2011 +0200 summary: Simplify unicode_resizable(): singletons reference count is at least 2 files: Objects/unicodeobject.c | 20 +++++++------------- 1 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1257,26 +1257,20 @@ static int unicode_resizable(PyObject *unicode) { - Py_ssize_t len; if (Py_REFCNT(unicode) != 1) return 0; if (PyUnicode_CHECK_INTERNED(unicode)) return 0; - if (unicode == unicode_empty) - return 0; - if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) - len = PyUnicode_WSTR_LENGTH(unicode); - else - len = PyUnicode_GET_LENGTH(unicode); - if (len == 1) { - Py_UCS4 ch; - if (_PyUnicode_KIND(unicode) == PyUnicode_WCHAR_KIND) - ch = _PyUnicode_WSTR(unicode)[0]; - else - ch = PyUnicode_READ_CHAR(unicode, 0); + assert (unicode != unicode_empty); +#ifdef Py_DEBUG + if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND + && PyUnicode_GET_LENGTH(unicode) == 1) + { + Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); if (ch < 256 && unicode_latin1[ch] == unicode) return 0; } +#endif return 1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 23:35:47 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 23:35:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_string_forms_and_Py?= =?utf8?q?Unicode=5FResize=28=29_documentation?= Message-ID: http://hg.python.org/cpython/rev/fe10f0bcc860 changeset: 72621:fe10f0bcc860 user: Victor Stinner date: Mon Oct 03 23:19:21 2011 +0200 summary: Improve string forms and PyUnicode_Resize() documentation Remove also the FIXME for resize_copy(): as discussed with Martin, copy the string on resize if the string is not resizable is just fine. files: Include/unicodeobject.h | 35 ++++++++++++++++++---------- Objects/unicodeobject.c | 4 +- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -206,7 +206,7 @@ immediately follow the structure. utf8_length and wstr_length can be found in the length field; the utf8 pointer is equal to the data pointer. */ typedef struct { - /* Unicode strings can be in 4 states: + /* There a 4 forms of Unicode strings: - compact ascii: @@ -227,7 +227,7 @@ * ascii = 0 * utf8 != data - - string created by the legacy API (not ready): + - legacy string, not ready: * structure = PyUnicodeObject * kind = PyUnicode_WCHAR_KIND @@ -239,7 +239,7 @@ * interned = SSTATE_NOT_INTERNED * ascii = 0 - - string created by the legacy API, ready: + - legacy string, ready: * structure = PyUnicodeObject structure * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or @@ -249,10 +249,16 @@ * data.any is not NULL * utf8 = data if ascii is 1 - String created by the legacy API becomes ready when calling - PyUnicode_READY(). + Compact strings use only one memory block (structure + characters), + whereas legacy strings use one block for the structure and one block + for characters. - See also _PyUnicode_CheckConsistency(). */ + Legacy strings are created by PyUnicode_FromUnicode() and + PyUnicode_FromStringAndSize(NULL, size) functions. They become ready + when PyUnicode_READY() is called. + + See also _PyUnicode_CheckConsistency(). + */ PyObject_HEAD Py_ssize_t length; /* Number of code points in the string */ Py_hash_t hash; /* Hash value; -1 if not set */ @@ -721,19 +727,22 @@ PyAPI_FUNC(Py_UNICODE) PyUnicode_GetMax(void); #endif -/* Resize an already allocated Unicode object to the new size length. +/* Resize an Unicode object allocated by the legacy API (e.g. + PyUnicode_FromUnicode). Unicode objects allocated by the new API (e.g. + PyUnicode_New) cannot be resized by this function. + + The length is a number of Py_UNICODE characters (and not the number of code + points). *unicode is modified to point to the new (resized) object and 0 returned on success. - This API may only be called by the function which also called the - Unicode constructor. The refcount on the object must be 1. Otherwise, - an error is returned. + If the refcount on the object is 1, the function resizes the string in + place, which is usually faster than allocating a new string (and copy + characters). Error handling is implemented as follows: an exception is set, -1 - is returned and *unicode left untouched. - -*/ + is returned and *unicode left untouched. */ PyAPI_FUNC(int) PyUnicode_Resize( PyObject **unicode, /* Pointer to the Unicode object */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -536,7 +536,8 @@ return NULL; } return copy; - } else { + } + else { PyUnicodeObject *w; assert(_PyUnicode_WSTR(unicode) != NULL); assert(_PyUnicode_DATA_ANY(unicode) == NULL); @@ -1294,7 +1295,6 @@ if (old_length == length) return 0; - /* FIXME: really create a new object? */ if (!unicode_resizable(unicode)) { PyObject *copy = resize_copy(unicode, length); if (copy == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 23:35:48 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 23:35:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_compiler_warning_in_P?= =?utf8?q?yUnicode=5FAppend=28=29?= Message-ID: http://hg.python.org/cpython/rev/bf6dbd1b10b4 changeset: 72622:bf6dbd1b10b4 user: Victor Stinner date: Mon Oct 03 23:27:56 2011 +0200 summary: Fix a compiler warning in PyUnicode_Append() Don't check PyUnicode_CopyCharacters() in release mode. Rename also some variables. files: Objects/unicodeobject.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9931,9 +9931,11 @@ && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) || _PyUnicode_WSTR(left) != NULL)) { - Py_ssize_t u_len, v_len, new_len, copied; - - /* FIXME: don't make wstr string ready */ + Py_ssize_t left_len, right_len, new_len; +#ifdef Py_DEBUG + Py_ssize_t copied; +#endif + if (PyUnicode_READY(left)) goto error; if (PyUnicode_READY(right)) @@ -9942,14 +9944,14 @@ /* FIXME: support ascii+latin1, PyASCIIObject => PyCompactUnicodeObject */ if (PyUnicode_MAX_CHAR_VALUE(right) <= PyUnicode_MAX_CHAR_VALUE(left)) { - u_len = PyUnicode_GET_LENGTH(left); - v_len = PyUnicode_GET_LENGTH(right); - if (u_len > PY_SSIZE_T_MAX - v_len) { + left_len = PyUnicode_GET_LENGTH(left); + right_len = PyUnicode_GET_LENGTH(right); + if (left_len > PY_SSIZE_T_MAX - right_len) { PyErr_SetString(PyExc_OverflowError, "strings are too large to concat"); goto error; } - new_len = u_len + v_len; + new_len = left_len + right_len; /* Now we own the last reference to 'left', so we can resize it * in-place. @@ -9964,10 +9966,14 @@ goto error; } /* copy 'right' into the newly allocated area of 'left' */ - copied = PyUnicode_CopyCharacters(left, u_len, +#ifdef Py_DEBUG + copied = PyUnicode_CopyCharacters(left, left_len, right, 0, - v_len); + right_len); assert(0 <= copied); +#else + PyUnicode_CopyCharacters(left, left_len, right, 0, right_len); +#endif *p_left = left; return; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 3 23:35:49 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 03 Oct 2011 23:35:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FJoin=28=29_chec?= =?utf8?q?ks_output_length_in_debug_mode?= Message-ID: http://hg.python.org/cpython/rev/bfd8b5d35f9c changeset: 72623:bfd8b5d35f9c user: Victor Stinner date: Mon Oct 03 23:36:02 2011 +0200 summary: PyUnicode_Join() checks output length in debug mode PyUnicode_CopyCharacters() may copies less character than requested size, if the input string is smaller than the argument. (This is very unlikely, but who knows!?) Avoid also calling PyUnicode_CopyCharacters() if the string is empty. files: Objects/unicodeobject.c | 34 +++++++++++++++++++--------- 1 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8890,20 +8890,32 @@ /* Catenate everything. */ for (i = 0, res_offset = 0; i < seqlen; ++i) { - Py_ssize_t itemlen; + Py_ssize_t itemlen, copied; item = items[i]; + /* Copy item, and maybe the separator. */ + if (i && seplen != 0) { + copied = PyUnicode_CopyCharacters(res, res_offset, + sep, 0, seplen); + if (copied < 0) + goto onError; +#ifdef Py_DEBUG + res_offset += copied; +#else + res_offset += seplen; +#endif + } itemlen = PyUnicode_GET_LENGTH(item); - /* Copy item, and maybe the separator. */ - if (i) { - if (PyUnicode_CopyCharacters(res, res_offset, - sep, 0, seplen) < 0) + if (itemlen != 0) { + copied = PyUnicode_CopyCharacters(res, res_offset, + item, 0, itemlen); + if (copied < 0) goto onError; - res_offset += seplen; - } - if (PyUnicode_CopyCharacters(res, res_offset, - item, 0, itemlen) < 0) - goto onError; - res_offset += itemlen; +#ifdef Py_DEBUG + res_offset += copied; +#else + res_offset += itemlen; +#endif + } } assert(res_offset == PyUnicode_GET_LENGTH(res)); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 00:09:10 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 00:09:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_=5FPyUnicode=5FHAS=5FWS?= =?utf8?q?TR=5FMEMORY=28=29_macro?= Message-ID: http://hg.python.org/cpython/rev/65ff63a8347b changeset: 72624:65ff63a8347b user: Victor Stinner date: Mon Oct 03 23:45:12 2011 +0200 summary: Add _PyUnicode_HAS_WSTR_MEMORY() macro files: Objects/unicodeobject.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -151,6 +151,14 @@ && _PyUnicode_UTF8(op) \ && _PyUnicode_UTF8(op) != PyUnicode_DATA(op))) +/* true if the Unicode object has an allocated wstr memory block + (not shared with other data) */ +#define _PyUnicode_HAS_WSTR_MEMORY(op) \ + (assert(_PyUnicode_CHECK(op)), \ + (_PyUnicode_WSTR(op) && \ + (!PyUnicode_IS_READY(op) || \ + _PyUnicode_WSTR(op) != PyUnicode_DATA(op)))) + /* Generic helper macro to convert characters of different types. from_type and to_type have to be valid type names, begin and end are pointers to the source characters which should be of type @@ -1238,9 +1246,7 @@ Py_FatalError("Inconsistent interned string state."); } - if (_PyUnicode_WSTR(unicode) && - (!PyUnicode_IS_READY(unicode) || - _PyUnicode_WSTR(unicode) != PyUnicode_DATA(unicode))) + if (_PyUnicode_HAS_WSTR_MEMORY(unicode)) PyObject_DEL(_PyUnicode_WSTR(unicode)); if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) PyObject_DEL(_PyUnicode_UTF8(unicode)); @@ -12061,8 +12067,7 @@ } /* If the wstr pointer is present, account for it unless it is shared with the data pointer. Check if the data is not shared. */ - if (_PyUnicode_WSTR(v) && - (PyUnicode_DATA(v) != _PyUnicode_WSTR(v))) + if (_PyUnicode_HAS_WSTR_MEMORY(v)) size += (PyUnicode_WSTR_LENGTH(v) + 1) * sizeof(wchar_t); if (_PyUnicode_HAS_UTF8_MEMORY(v)) size += PyUnicode_UTF8_LENGTH(v) + 1; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 00:09:11 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 00:09:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Unicode=3A_document_when_th?= =?utf8?q?e_wstr_pointer_is_shared_with_data?= Message-ID: http://hg.python.org/cpython/rev/3889fa2194f2 changeset: 72625:3889fa2194f2 user: Victor Stinner date: Tue Oct 04 00:00:20 2011 +0200 summary: Unicode: document when the wstr pointer is shared with data Add also related assertions to _PyUnicode_CheckConsistency(). files: Include/unicodeobject.h | 8 +++++++- Objects/unicodeobject.c | 24 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -226,6 +226,9 @@ * ready = 1 * ascii = 0 * utf8 != data + * wstr is shared with data if kind=PyUnicode_2BYTE_KIND + and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and + sizeof(wchar_4)=4 - legacy string, not ready: @@ -247,7 +250,10 @@ * compact = 0 * ready = 1 * data.any is not NULL - * utf8 = data if ascii is 1 + * utf8 is shared with data.any if ascii = 1 + * wstr is shared with data.any if kind=PyUnicode_2BYTE_KIND + and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and + sizeof(wchar_4)=4 Compact strings use only one memory block (structure + characters), whereas legacy strings use one block for the structure and one block diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -302,12 +302,24 @@ } else if (ascii->state.compact == 1) { PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; + void *data; assert(kind == PyUnicode_1BYTE_KIND || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); assert(ascii->state.ascii == 0); assert(ascii->state.ready == 1); - assert (compact->utf8 != (void*)(compact + 1)); + data = compact + 1; + assert (compact->utf8 != data); + if ( +#if SIZEOF_WCHAR_T == 2 + kind == PyUnicode_2BYTE_KIND +#else + kind == PyUnicode_4BYTE_KIND +#endif + ) + assert(ascii->wstr == data); + else + assert(ascii->wstr != data); } else { PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op; @@ -332,6 +344,16 @@ assert (compact->utf8 == unicode->data.any); else assert (compact->utf8 != unicode->data.any); + if ( +#if SIZEOF_WCHAR_T == 2 + kind == PyUnicode_2BYTE_KIND +#else + kind == PyUnicode_4BYTE_KIND +#endif + ) + assert(ascii->wstr == unicode->data.any); + else + assert(ascii->wstr != unicode->data.any); } } return 1; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 00:09:12 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 00:09:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Unicode=3A_raise_SystemErro?= =?utf8?q?r_instead_of_ValueError_or_RuntimeError_on_invalid?= Message-ID: http://hg.python.org/cpython/rev/721bb2e59815 changeset: 72626:721bb2e59815 user: Victor Stinner date: Tue Oct 04 00:04:26 2011 +0200 summary: Unicode: raise SystemError instead of ValueError or RuntimeError on invalid state files: Objects/unicodeobject.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -898,7 +898,7 @@ { assert(_PyUnicode_CHECK(unicode)); if (Py_REFCNT(unicode) != 1) { - PyErr_SetString(PyExc_ValueError, + PyErr_SetString(PyExc_SystemError, "Cannot modify a string having more than 1 reference"); return -1; } @@ -926,7 +926,7 @@ how_many = Py_MIN(PyUnicode_GET_LENGTH(from), how_many); if (to_start + how_many > PyUnicode_GET_LENGTH(to)) { - PyErr_Format(PyExc_ValueError, + PyErr_Format(PyExc_SystemError, "Cannot write %zi characters at %zi " "in a string of %zi characters", how_many, to_start, PyUnicode_GET_LENGTH(to)); @@ -1015,7 +1015,7 @@ else invalid_kinds = 1; if (invalid_kinds) { - PyErr_Format(PyExc_ValueError, + PyErr_Format(PyExc_SystemError, "Cannot copy %s characters " "into a string of %s characters", unicode_kind_name(from), @@ -1562,7 +1562,7 @@ case PyUnicode_4BYTE_KIND: return _PyUnicode_FromUCS4(buffer, size); } - PyErr_SetString(PyExc_ValueError, "invalid kind"); + PyErr_SetString(PyExc_SystemError, "invalid kind"); return NULL; } @@ -1622,7 +1622,7 @@ len = PyUnicode_GET_LENGTH(s); skind = PyUnicode_KIND(s); if (skind >= kind) { - PyErr_SetString(PyExc_RuntimeError, "invalid widening attempt"); + PyErr_SetString(PyExc_SystemError, "invalid widening attempt"); return NULL; } switch(kind) { @@ -1660,7 +1660,7 @@ default: break; } - PyErr_SetString(PyExc_ValueError, "invalid kind"); + PyErr_SetString(PyExc_SystemError, "invalid kind"); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:16:14 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:16:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FNew=28=29_sets_?= =?utf8?q?utf8=5Flength_to_zero_for_latin1?= Message-ID: http://hg.python.org/cpython/rev/e59f4265033b changeset: 72627:e59f4265033b user: Victor Stinner date: Tue Oct 04 01:02:02 2011 +0200 summary: PyUnicode_New() sets utf8_length to zero for latin1 files: Objects/unicodeobject.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -755,7 +755,7 @@ PyCompactUnicodeObject *unicode; void *data; int kind_state; - int is_sharing = 0, is_ascii = 0; + int is_sharing, is_ascii; Py_ssize_t char_size; Py_ssize_t struct_size; @@ -769,6 +769,8 @@ ++unicode_new_new_calls; #endif + is_ascii = 0; + is_sharing = 0; struct_size = sizeof(PyCompactUnicodeObject); if (maxchar < 128) { kind_state = PyUnicode_1BYTE_KIND; @@ -833,11 +835,12 @@ ((char*)data)[size] = 0; _PyUnicode_WSTR(unicode) = NULL; _PyUnicode_WSTR_LENGTH(unicode) = 0; + unicode->utf8 = NULL; unicode->utf8_length = 0; - unicode->utf8 = NULL; } else { unicode->utf8 = NULL; + unicode->utf8_length = 0; if (kind_state == PyUnicode_2BYTE_KIND) ((Py_UCS2*)data)[size] = 0; else /* kind_state == PyUnicode_4BYTE_KIND */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:16:15 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:16:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_resize=5Finplace=28=29_sets?= =?utf8?q?_utf8=5Flength_to_zero_if_the_utf8_is_not_shared8?= Message-ID: http://hg.python.org/cpython/rev/96a9f62c6b6d changeset: 72628:96a9f62c6b6d user: Victor Stinner date: Tue Oct 04 01:03:50 2011 +0200 summary: resize_inplace() sets utf8_length to zero if the utf8 is not shared8 Cleanup also the code. files: Objects/unicodeobject.c | 59 +++++++++++++++------------- 1 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -476,21 +476,14 @@ } static int -resize_inplace(register PyUnicodeObject *unicode, Py_ssize_t length) -{ - void *oldstr; - +resize_inplace(PyUnicodeObject *unicode, Py_ssize_t length) +{ + wchar_t *wstr; assert(!PyUnicode_IS_COMPACT(unicode)); - assert(Py_REFCNT(unicode) == 1); + _PyUnicode_DIRTY(unicode); - if (_PyUnicode_HAS_UTF8_MEMORY(unicode)) - { - PyObject_DEL(_PyUnicode_UTF8(unicode)); - _PyUnicode_UTF8(unicode) = NULL; - } - if (PyUnicode_IS_READY(unicode)) { Py_ssize_t char_size; Py_ssize_t new_size; @@ -502,6 +495,12 @@ char_size = PyUnicode_CHARACTER_SIZE(unicode); share_wstr = _PyUnicode_SHARE_WSTR(unicode); share_utf8 = _PyUnicode_SHARE_UTF8(unicode); + if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) + { + PyObject_DEL(_PyUnicode_UTF8(unicode)); + _PyUnicode_UTF8(unicode) = NULL; + _PyUnicode_UTF8_LENGTH(unicode) = 0; + } if (length > (PY_SSIZE_T_MAX / char_size - 1)) { PyErr_NoMemory(); @@ -525,23 +524,28 @@ } _PyUnicode_LENGTH(unicode) = length; PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); - if (share_wstr) + if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) { + _PyUnicode_CHECK(unicode); return 0; - } - if (_PyUnicode_WSTR(unicode) != NULL) { - assert(_PyUnicode_WSTR(unicode) != NULL); - - oldstr = _PyUnicode_WSTR(unicode); - _PyUnicode_WSTR(unicode) = PyObject_REALLOC(_PyUnicode_WSTR(unicode), - sizeof(Py_UNICODE) * (length + 1)); - if (!_PyUnicode_WSTR(unicode)) { - _PyUnicode_WSTR(unicode) = (Py_UNICODE *)oldstr; - PyErr_NoMemory(); - return -1; - } - _PyUnicode_WSTR(unicode)[length] = 0; - _PyUnicode_WSTR_LENGTH(unicode) = length; - } + } + } + assert(_PyUnicode_WSTR(unicode) != NULL); + + /* check for integer overflow */ + if (length > PY_SSIZE_T_MAX / sizeof(wchar_t) - 1) { + PyErr_NoMemory(); + return -1; + } + wstr = _PyUnicode_WSTR(unicode); + wstr = PyObject_REALLOC(wstr, sizeof(wchar_t) * (length + 1)); + if (!wstr) { + PyErr_NoMemory(); + return -1; + } + _PyUnicode_WSTR(unicode) = wstr; + _PyUnicode_WSTR(unicode)[length] = 0; + _PyUnicode_WSTR_LENGTH(unicode) = length; + _PyUnicode_CHECK(unicode); return 0; } @@ -1339,6 +1343,7 @@ *p_unicode = resize_compact(unicode, length); if (*p_unicode == NULL) return -1; + _PyUnicode_CHECK(*p_unicode); return 0; } else return resize_inplace((PyUnicodeObject*)unicode, length); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:16:16 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:16:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Document_utf8=5Flength_and_?= =?utf8?q?wstr=5Flength_states?= Message-ID: http://hg.python.org/cpython/rev/5346409167a7 changeset: 72629:5346409167a7 user: Victor Stinner date: Tue Oct 04 01:05:08 2011 +0200 summary: Document utf8_length and wstr_length states Ensure these states with assertions in _PyUnicode_CheckConsistency(). files: Include/unicodeobject.h | 19 +++-- Objects/unicodeobject.c | 88 +++++++++++++++------------- 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -226,9 +226,11 @@ * ready = 1 * ascii = 0 * utf8 != data - * wstr is shared with data if kind=PyUnicode_2BYTE_KIND - and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and - sizeof(wchar_4)=4 + * utf8_length = 0 if utf8 is NULL + * wstr is shared with data and wstr_length=length + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 + * wstr_length = 0 if wstr is NULL - legacy string, not ready: @@ -239,6 +241,7 @@ * wstr is not NULL * data.any is NULL * utf8 is NULL + * utf8_length = 0 * interned = SSTATE_NOT_INTERNED * ascii = 0 @@ -250,10 +253,12 @@ * compact = 0 * ready = 1 * data.any is not NULL - * utf8 is shared with data.any if ascii = 1 - * wstr is shared with data.any if kind=PyUnicode_2BYTE_KIND - and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and - sizeof(wchar_4)=4 + * utf8 is shared and utf8_length = length with data.any if ascii = 1 + * utf8_length = 0 if utf8 is NULL + * wstr is shared and wstr_length = length with data.any + if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 + or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 + * wstr_length = 0 if wstr is NULL Compact strings use only one memory block (structure + characters), whereas legacy strings use one block for the structure and one block diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -300,50 +300,47 @@ assert(kind == PyUnicode_1BYTE_KIND); assert(ascii->state.ready == 1); } - else if (ascii->state.compact == 1) { + else { PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; void *data; - assert(kind == PyUnicode_1BYTE_KIND - || kind == PyUnicode_2BYTE_KIND - || kind == PyUnicode_4BYTE_KIND); - assert(ascii->state.ascii == 0); - assert(ascii->state.ready == 1); - data = compact + 1; - assert (compact->utf8 != data); - if ( -#if SIZEOF_WCHAR_T == 2 - kind == PyUnicode_2BYTE_KIND -#else - kind == PyUnicode_4BYTE_KIND -#endif - ) - assert(ascii->wstr == data); - else - assert(ascii->wstr != data); - } else { - PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; - PyUnicodeObject *unicode = (PyUnicodeObject *)op; - - if (kind == PyUnicode_WCHAR_KIND) { - assert(ascii->state.compact == 0); - assert(ascii->state.ascii == 0); - assert(ascii->state.ready == 0); - assert(ascii->wstr != NULL); - assert(unicode->data.any == NULL); - assert(compact->utf8 == NULL); - assert(ascii->state.interned == SSTATE_NOT_INTERNED); - } - else { + + if (ascii->state.compact == 1) { + data = compact + 1; assert(kind == PyUnicode_1BYTE_KIND || kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_4BYTE_KIND); - assert(ascii->state.compact == 0); + assert(ascii->state.ascii == 0); assert(ascii->state.ready == 1); - assert(unicode->data.any != NULL); - if (ascii->state.ascii) - assert (compact->utf8 == unicode->data.any); - else - assert (compact->utf8 != unicode->data.any); + assert (compact->utf8 != data); + } else { + PyUnicodeObject *unicode = (PyUnicodeObject *)op; + + data = unicode->data.any; + if (kind == PyUnicode_WCHAR_KIND) { + assert(ascii->state.compact == 0); + assert(ascii->state.ascii == 0); + assert(ascii->state.ready == 0); + assert(ascii->wstr != NULL); + assert(data == NULL); + assert(compact->utf8 == NULL); + assert(ascii->state.interned == SSTATE_NOT_INTERNED); + } + else { + assert(kind == PyUnicode_1BYTE_KIND + || kind == PyUnicode_2BYTE_KIND + || kind == PyUnicode_4BYTE_KIND); + assert(ascii->state.compact == 0); + assert(ascii->state.ready == 1); + assert(data != NULL); + if (ascii->state.ascii) { + assert (compact->utf8 == data); + assert (compact->utf8_length == ascii->length); + } + else + assert (compact->utf8 != data); + } + } + if (kind != PyUnicode_WCHAR_KIND) { if ( #if SIZEOF_WCHAR_T == 2 kind == PyUnicode_2BYTE_KIND @@ -351,10 +348,17 @@ kind == PyUnicode_4BYTE_KIND #endif ) - assert(ascii->wstr == unicode->data.any); - else - assert(ascii->wstr != unicode->data.any); - } + { + assert(ascii->wstr == data); + assert(compact->wstr_length == ascii->length); + } else + assert(ascii->wstr != data); + } + + if (compact->utf8 == NULL) + assert(compact->utf8_length == 0); + if (ascii->wstr == NULL) + assert(compact->wstr_length == 0); } return 1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:16:16 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:16:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Reindent_internal_Unicode_m?= =?utf8?q?acros?= Message-ID: http://hg.python.org/cpython/rev/3dd3e8ff7296 changeset: 72630:3dd3e8ff7296 user: Victor Stinner date: Tue Oct 04 01:07:11 2011 +0200 summary: Reindent internal Unicode macros files: Objects/unicodeobject.c | 21 ++++++++++++++------- 1 files changed, 14 insertions(+), 7 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -111,24 +111,31 @@ PyUnicode_IS_COMPACT_ASCII(op) ? \ ((PyASCIIObject*)(op))->length : \ _PyUnicode_UTF8_LENGTH(op)) -#define _PyUnicode_WSTR(op) (((PyASCIIObject*)(op))->wstr) -#define _PyUnicode_WSTR_LENGTH(op) (((PyCompactUnicodeObject*)(op))->wstr_length) -#define _PyUnicode_LENGTH(op) (((PyASCIIObject *)(op))->length) -#define _PyUnicode_STATE(op) (((PyASCIIObject *)(op))->state) -#define _PyUnicode_HASH(op) (((PyASCIIObject *)(op))->hash) +#define _PyUnicode_WSTR(op) \ + (((PyASCIIObject*)(op))->wstr) +#define _PyUnicode_WSTR_LENGTH(op) \ + (((PyCompactUnicodeObject*)(op))->wstr_length) +#define _PyUnicode_LENGTH(op) \ + (((PyASCIIObject *)(op))->length) +#define _PyUnicode_STATE(op) \ + (((PyASCIIObject *)(op))->state) +#define _PyUnicode_HASH(op) \ + (((PyASCIIObject *)(op))->hash) #define _PyUnicode_KIND(op) \ (assert(_PyUnicode_CHECK(op)), \ ((PyASCIIObject *)(op))->state.kind) #define _PyUnicode_GET_LENGTH(op) \ (assert(_PyUnicode_CHECK(op)), \ ((PyASCIIObject *)(op))->length) -#define _PyUnicode_DATA_ANY(op) (((PyUnicodeObject*)(op))->data.any) +#define _PyUnicode_DATA_ANY(op) \ + (((PyUnicodeObject*)(op))->data.any) #undef PyUnicode_READY #define PyUnicode_READY(op) \ (assert(_PyUnicode_CHECK(op)), \ (PyUnicode_IS_READY(op) ? \ - 0 : _PyUnicode_Ready((PyObject *)(op)))) + 0 : \ + _PyUnicode_Ready((PyObject *)(op)))) #define _PyUnicode_READY_REPLACE(p_obj) \ (assert(_PyUnicode_CHECK(*p_obj)), \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:17:22 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:17:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Move_in-place_Unicode_appen?= =?utf8?q?d_to_its_own_subfunction?= Message-ID: http://hg.python.org/cpython/rev/714a039c6fa6 changeset: 72631:714a039c6fa6 user: Victor Stinner date: Tue Oct 04 01:17:31 2011 +0200 summary: Move in-place Unicode append to its own subfunction files: Objects/unicodeobject.c | 92 +++++++++++++++++----------- 1 files changed, 54 insertions(+), 38 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9967,6 +9967,54 @@ return NULL; } +static void +unicode_append_inplace(PyObject **p_left, PyObject *right) +{ + Py_ssize_t left_len, right_len, new_len; +#ifdef Py_DEBUG + Py_ssize_t copied; +#endif + + assert(PyUnicode_IS_READY(*p_left)); + assert(PyUnicode_IS_READY(right)); + + left_len = PyUnicode_GET_LENGTH(*p_left); + right_len = PyUnicode_GET_LENGTH(right); + if (left_len > PY_SSIZE_T_MAX - right_len) { + PyErr_SetString(PyExc_OverflowError, + "strings are too large to concat"); + goto error; + } + new_len = left_len + right_len; + + /* Now we own the last reference to 'left', so we can resize it + * in-place. + */ + if (unicode_resize(p_left, new_len) != 0) { + /* XXX if _PyUnicode_Resize() fails, 'left' has been + * deallocated so it cannot be put back into + * 'variable'. The MemoryError is raised when there + * is no value in 'variable', which might (very + * remotely) be a cause of incompatibilities. + */ + goto error; + } + /* copy 'right' into the newly allocated area of 'left' */ +#ifdef Py_DEBUG + copied = PyUnicode_CopyCharacters(*p_left, left_len, + right, 0, + right_len); + assert(0 <= copied); +#else + PyUnicode_CopyCharacters(*p_left, left_len, right, 0, right_len); +#endif + return; + +error: + Py_DECREF(*p_left); + *p_left = NULL; +} + void PyUnicode_Append(PyObject **p_left, PyObject *right) { @@ -9990,50 +10038,18 @@ && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) || _PyUnicode_WSTR(left) != NULL)) { - Py_ssize_t left_len, right_len, new_len; -#ifdef Py_DEBUG - Py_ssize_t copied; -#endif - if (PyUnicode_READY(left)) goto error; if (PyUnicode_READY(right)) goto error; - /* FIXME: support ascii+latin1, PyASCIIObject => PyCompactUnicodeObject */ - if (PyUnicode_MAX_CHAR_VALUE(right) <= PyUnicode_MAX_CHAR_VALUE(left)) + /* Don't resize for ascii += latin1. Convert ascii to latin1 requires + to change the structure size, but characters are stored just after + the structure, and so it requires to move all charactres which is + not so different than duplicating the string. */ + if (!(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right))) { - left_len = PyUnicode_GET_LENGTH(left); - right_len = PyUnicode_GET_LENGTH(right); - if (left_len > PY_SSIZE_T_MAX - right_len) { - PyErr_SetString(PyExc_OverflowError, - "strings are too large to concat"); - goto error; - } - new_len = left_len + right_len; - - /* Now we own the last reference to 'left', so we can resize it - * in-place. - */ - if (unicode_resize(&left, new_len) != 0) { - /* XXX if _PyUnicode_Resize() fails, 'left' has been - * deallocated so it cannot be put back into - * 'variable'. The MemoryError is raised when there - * is no value in 'variable', which might (very - * remotely) be a cause of incompatibilities. - */ - goto error; - } - /* copy 'right' into the newly allocated area of 'left' */ -#ifdef Py_DEBUG - copied = PyUnicode_CopyCharacters(left, left_len, - right, 0, - right_len); - assert(0 <= copied); -#else - PyUnicode_CopyCharacters(left, left_len, right, 0, right_len); -#endif - *p_left = left; + unicode_append_inplace(p_left, right); return; } } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:32:25 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 01:32:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Complete_documentation_of_c?= =?utf8?q?ompact_ASCII_strings?= Message-ID: http://hg.python.org/cpython/rev/9c9ebb07d053 changeset: 72632:9c9ebb07d053 user: Victor Stinner date: Tue Oct 04 01:32:45 2011 +0200 summary: Complete documentation of compact ASCII strings files: Include/unicodeobject.h | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -215,7 +215,9 @@ * compact = 1 * ascii = 1 * ready = 1 - * utf8 = data + * (length is the length of the utf8 and wstr strings) + * (data starts just after the structure) + * (since ASCII is decoded from UTF-8, the utf8 string are the data) - compact: @@ -225,25 +227,26 @@ * compact = 1 * ready = 1 * ascii = 0 - * utf8 != data + * utf8 is not shared with data * utf8_length = 0 if utf8 is NULL * wstr is shared with data and wstr_length=length if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4 * wstr_length = 0 if wstr is NULL + * (data starts just after the structure) - legacy string, not ready: * structure = PyUnicodeObject * kind = PyUnicode_WCHAR_KIND * compact = 0 + * ascii = 0 * ready = 0 * wstr is not NULL * data.any is NULL * utf8 is NULL * utf8_length = 0 * interned = SSTATE_NOT_INTERNED - * ascii = 0 - legacy string, ready: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:34:17 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 04 Oct 2011 01:34:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_compiler_warnings?= Message-ID: http://hg.python.org/cpython/rev/afb60b190f1c changeset: 72633:afb60b190f1c user: Benjamin Peterson date: Mon Oct 03 19:34:12 2011 -0400 summary: fix compiler warnings files: Objects/unicodeobject.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -369,6 +369,12 @@ } return 1; } +#else +static int +_PyUnicode_CheckConsistency(void *op) +{ + return 1; +} #endif /* --- Bloom Filters ----------------------------------------------------- */ @@ -536,7 +542,7 @@ _PyUnicode_LENGTH(unicode) = length; PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) { - _PyUnicode_CHECK(unicode); + _PyUnicode_CheckConsistency(unicode); return 0; } } @@ -556,7 +562,7 @@ _PyUnicode_WSTR(unicode) = wstr; _PyUnicode_WSTR(unicode)[length] = 0; _PyUnicode_WSTR_LENGTH(unicode) = length; - _PyUnicode_CHECK(unicode); + _PyUnicode_CheckConsistency(unicode); return 0; } @@ -1354,7 +1360,7 @@ *p_unicode = resize_compact(unicode, length); if (*p_unicode == NULL) return -1; - _PyUnicode_CHECK(*p_unicode); + _PyUnicode_CheckConsistency(*p_unicode); return 0; } else return resize_inplace((PyUnicodeObject*)unicode, length); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:35:12 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 04 Oct 2011 01:35:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_formatting?= Message-ID: http://hg.python.org/cpython/rev/64495ad8aa54 changeset: 72634:64495ad8aa54 user: Benjamin Peterson date: Mon Oct 03 19:35:07 2011 -0400 summary: fix formatting files: Objects/unicodeobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1362,8 +1362,8 @@ return -1; _PyUnicode_CheckConsistency(*p_unicode); return 0; - } else - return resize_inplace((PyUnicodeObject*)unicode, length); + } + return resize_inplace((PyUnicodeObject*)unicode, length); } int -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 01:37:36 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 04 Oct 2011 01:37:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_parens?= Message-ID: http://hg.python.org/cpython/rev/61de28fa5537 changeset: 72635:61de28fa5537 user: Benjamin Peterson date: Mon Oct 03 19:37:29 2011 -0400 summary: fix parens files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1314,7 +1314,7 @@ return 0; if (PyUnicode_CHECK_INTERNED(unicode)) return 0; - assert (unicode != unicode_empty); + assert(unicode != unicode_empty); #ifdef Py_DEBUG if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND && PyUnicode_GET_LENGTH(unicode) == 1) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 4 05:26:43 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 04 Oct 2011 05:26:43 +0200 Subject: [Python-checkins] Daily reference leaks (61de28fa5537): sum=0 Message-ID: results for 61de28fa5537 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogsu5co9', '-x'] From python-checkins at python.org Tue Oct 4 05:40:20 2011 From: python-checkins at python.org (meador.inge) Date: Tue, 04 Oct 2011 05:40:20 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEyODgx?= =?utf8?q?=3A_ctypes=3A_Fix_segfault_with_large_structure_field_names=2E?= Message-ID: http://hg.python.org/cpython/rev/aa3ebc2dfc15 changeset: 72636:aa3ebc2dfc15 branch: 2.7 parent: 72590:277688052c5a user: Meador Inge date: Mon Oct 03 21:34:04 2011 -0500 summary: Issue #12881: ctypes: Fix segfault with large structure field names. files: Lib/ctypes/test/test_structures.py | 12 ++++++++++++ Misc/NEWS | 2 ++ Modules/_ctypes/stgdict.c | 8 +++++++- 3 files changed, 21 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -332,6 +332,18 @@ else: self.assertEqual(msg, "(Phone) exceptions.TypeError: too many initializers") + def test_huge_field_name(self): + # issue12881: segfault with large structure field names + def create_class(length): + class S(Structure): + _fields_ = [('x' * length, c_int)] + + for length in [10 ** i for i in range(0, 8)]: + try: + create_class(length) + except MemoryError: + # MemoryErrors are OK, we just don't want to segfault + pass def get_except(self, func, *args): try: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -210,6 +210,8 @@ Extension Modules ----------------- +- Issue #12881: ctypes: Fix segfault with large structure field names. + - Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype. Thanks to Suman Saha for finding the bug and providing a patch. diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -508,13 +508,19 @@ } len = strlen(fieldname) + strlen(fieldfmt); - buf = alloca(len + 2 + 1); + buf = PyMem_Malloc(len + 2 + 1); + if (buf == NULL) { + Py_DECREF(pair); + PyErr_NoMemory(); + return -1; + } sprintf(buf, "%s:%s:", fieldfmt, fieldname); ptr = stgdict->format; stgdict->format = _ctypes_alloc_format_string(stgdict->format, buf); PyMem_Free(ptr); + PyMem_Free(buf); if (stgdict->format == NULL) { Py_DECREF(pair); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 05:40:21 2011 From: python-checkins at python.org (meador.inge) Date: Tue, 04 Oct 2011 05:40:21 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEyODgx?= =?utf8?q?=3A_ctypes=3A_Fix_segfault_with_large_structure_field_names=2E?= Message-ID: http://hg.python.org/cpython/rev/d05350c14e77 changeset: 72637:d05350c14e77 branch: 3.2 parent: 72588:a3f2dba93743 user: Meador Inge date: Mon Oct 03 21:44:22 2011 -0500 summary: Issue #12881: ctypes: Fix segfault with large structure field names. files: Lib/ctypes/test/test_structures.py | 12 ++++++++++++ Misc/NEWS | 2 ++ Modules/_ctypes/stgdict.c | 8 +++++++- 3 files changed, 21 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -326,6 +326,18 @@ else: self.assertEqual(msg, "(Phone) TypeError: too many initializers") + def test_huge_field_name(self): + # issue12881: segfault with large structure field names + def create_class(length): + class S(Structure): + _fields_ = [('x' * length, c_int)] + + for length in [10 ** i for i in range(0, 8)]: + try: + create_class(length) + except MemoryError: + # MemoryErrors are OK, we just don't want to segfault + pass def get_except(self, func, *args): try: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -87,6 +87,8 @@ Extension Modules ----------------- +- Issue #12881: ctypes: Fix segfault with large structure field names. + - Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by Thomas Jarosch. diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -496,13 +496,19 @@ } len = strlen(fieldname) + strlen(fieldfmt); - buf = alloca(len + 2 + 1); + buf = PyMem_Malloc(len + 2 + 1); + if (buf == NULL) { + Py_DECREF(pair); + PyErr_NoMemory(); + return -1; + } sprintf(buf, "%s:%s:", fieldfmt, fieldname); ptr = stgdict->format; stgdict->format = _ctypes_alloc_format_string(stgdict->format, buf); PyMem_Free(ptr); + PyMem_Free(buf); if (stgdict->format == NULL) { Py_DECREF(pair); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 05:40:21 2011 From: python-checkins at python.org (meador.inge) Date: Tue, 04 Oct 2011 05:40:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2312881=3A_ctypes=3A_Fix_segfault_with_large_structur?= =?utf8?q?e_field_names=2E?= Message-ID: http://hg.python.org/cpython/rev/2eab632864f6 changeset: 72638:2eab632864f6 parent: 72635:61de28fa5537 parent: 72637:d05350c14e77 user: Meador Inge date: Mon Oct 03 21:48:30 2011 -0500 summary: Issue #12881: ctypes: Fix segfault with large structure field names. files: Lib/ctypes/test/test_structures.py | 12 ++++++++++++ Misc/NEWS | 2 ++ Modules/_ctypes/stgdict.c | 8 +++++++- 3 files changed, 21 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py --- a/Lib/ctypes/test/test_structures.py +++ b/Lib/ctypes/test/test_structures.py @@ -326,6 +326,18 @@ else: self.assertEqual(msg, "(Phone) TypeError: too many initializers") + def test_huge_field_name(self): + # issue12881: segfault with large structure field names + def create_class(length): + class S(Structure): + _fields_ = [('x' * length, c_int)] + + for length in [10 ** i for i in range(0, 8)]: + try: + create_class(length) + except MemoryError: + # MemoryErrors are OK, we just don't want to segfault + pass def get_except(self, func, *args): try: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1303,6 +1303,8 @@ Extension Modules ----------------- +- Issue #12881: ctypes: Fix segfault with large structure field names. + - Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by Thomas Jarosch. diff --git a/Modules/_ctypes/stgdict.c b/Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c +++ b/Modules/_ctypes/stgdict.c @@ -493,13 +493,19 @@ } len = strlen(fieldname) + strlen(fieldfmt); - buf = alloca(len + 2 + 1); + buf = PyMem_Malloc(len + 2 + 1); + if (buf == NULL) { + Py_DECREF(pair); + PyErr_NoMemory(); + return -1; + } sprintf(buf, "%s:%s:", fieldfmt, fieldname); ptr = stgdict->format; stgdict->format = _ctypes_alloc_format_string(stgdict->format, buf); PyMem_Free(ptr); + PyMem_Free(buf); if (stgdict->format == NULL) { Py_DECREF(pair); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 09:34:54 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 09:34:54 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzc2ODk6?= =?utf8?q?_Allow_pickling_of_dynamically_created_classes_when_their?= Message-ID: http://hg.python.org/cpython/rev/760ac320fa3d changeset: 72639:760ac320fa3d branch: 3.2 parent: 72637:d05350c14e77 user: Antoine Pitrou date: Tue Oct 04 09:23:04 2011 +0200 summary: Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig Citro. files: Lib/pickle.py | 18 +++++++++--------- Lib/test/pickletester.py | 21 +++++++++++++++++++++ Misc/ACKS | 2 ++ Misc/NEWS | 4 ++++ Modules/_pickle.c | 8 ++++---- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Lib/pickle.py b/Lib/pickle.py --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -299,20 +299,20 @@ f(self, obj) # Call unbound method with explicit self return - # Check for a class with a custom metaclass; treat as regular class - try: - issc = issubclass(t, type) - except TypeError: # t is not a class (old Boost; see SF #502085) - issc = 0 - if issc: - self.save_global(obj) - return - # Check copyreg.dispatch_table reduce = dispatch_table.get(t) if reduce: rv = reduce(obj) else: + # Check for a class with a custom metaclass; treat as regular class + try: + issc = issubclass(t, type) + except TypeError: # t is not a class (old Boost; see SF #502085) + issc = False + if issc: + self.save_global(obj) + return + # Check for a __reduce_ex__ method, fall back to __reduce__ reduce = getattr(obj, "__reduce_ex__", None) if reduce: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -121,6 +121,19 @@ class use_metaclass(object, metaclass=metaclass): pass +class pickling_metaclass(type): + def __eq__(self, other): + return (type(self) == type(other) and + self.reduce_args == other.reduce_args) + + def __reduce__(self): + return (create_dynamic_class, self.reduce_args) + +def create_dynamic_class(name, bases): + result = pickling_metaclass(name, bases, dict()) + result.reduce_args = (name, bases) + return result + # DATA0 .. DATA2 are the pickles we expect under the various protocols, for # the object returned by create_data(). @@ -695,6 +708,14 @@ b = self.loads(s) self.assertEqual(a.__class__, b.__class__) + def test_dynamic_class(self): + a = create_dynamic_class("my_dynamic_class", (object,)) + copyreg.pickle(pickling_metaclass, pickling_metaclass.__reduce__) + for proto in protocols: + s = self.dumps(a, proto) + b = self.loads(s) + self.assertEqual(a, b) + def test_structseq(self): import time import os diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -164,6 +164,7 @@ Tom Christiansen Vadim Chugunov David Cinege +Craig Citro Mike Clarkson Andrew Clegg Brad Clements @@ -881,6 +882,7 @@ Mikhail Terekhov Richard M. Tew Tobias Thelen +Nicolas M. Thi?ry James Thomas Robin Thomas Stephen Thorne diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Library ------- +- Issue #7689: Allow pickling of dynamically created classes when their + metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig + Citro. + - Issue #4147: minidom's toprettyxml no longer adds whitespace to text nodes. - Issue #13034: When decoding some SSL certificates, the subjectAltName diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -3141,10 +3141,6 @@ status = save_global(self, obj, NULL); goto done; } - else if (PyType_IsSubtype(type, &PyType_Type)) { - status = save_global(self, obj, NULL); - goto done; - } /* XXX: This part needs some unit tests. */ @@ -3163,6 +3159,10 @@ Py_INCREF(obj); reduce_value = _Pickler_FastCall(self, reduce_func, obj); } + else if (PyType_IsSubtype(type, &PyType_Type)) { + status = save_global(self, obj, NULL); + goto done; + } else { static PyObject *reduce_str = NULL; static PyObject *reduce_ex_str = NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 09:34:55 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 09:34:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=237689=3A_Allow_pickling_of_dynamically_created_class?= =?utf8?q?es_when_their?= Message-ID: http://hg.python.org/cpython/rev/46c026a5ccb9 changeset: 72640:46c026a5ccb9 parent: 72638:2eab632864f6 parent: 72639:760ac320fa3d user: Antoine Pitrou date: Tue Oct 04 09:25:28 2011 +0200 summary: Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig Citro. files: Lib/pickle.py | 18 +++++++++--------- Lib/test/pickletester.py | 21 +++++++++++++++++++++ Misc/ACKS | 2 ++ Misc/NEWS | 4 ++++ Modules/_pickle.c | 8 ++++---- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Lib/pickle.py b/Lib/pickle.py --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -297,20 +297,20 @@ f(self, obj) # Call unbound method with explicit self return - # Check for a class with a custom metaclass; treat as regular class - try: - issc = issubclass(t, type) - except TypeError: # t is not a class (old Boost; see SF #502085) - issc = 0 - if issc: - self.save_global(obj) - return - # Check copyreg.dispatch_table reduce = dispatch_table.get(t) if reduce: rv = reduce(obj) else: + # Check for a class with a custom metaclass; treat as regular class + try: + issc = issubclass(t, type) + except TypeError: # t is not a class (old Boost; see SF #502085) + issc = False + if issc: + self.save_global(obj) + return + # Check for a __reduce_ex__ method, fall back to __reduce__ reduce = getattr(obj, "__reduce_ex__", None) if reduce: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -122,6 +122,19 @@ class use_metaclass(object, metaclass=metaclass): pass +class pickling_metaclass(type): + def __eq__(self, other): + return (type(self) == type(other) and + self.reduce_args == other.reduce_args) + + def __reduce__(self): + return (create_dynamic_class, self.reduce_args) + +def create_dynamic_class(name, bases): + result = pickling_metaclass(name, bases, dict()) + result.reduce_args = (name, bases) + return result + # DATA0 .. DATA2 are the pickles we expect under the various protocols, for # the object returned by create_data(). @@ -696,6 +709,14 @@ b = self.loads(s) self.assertEqual(a.__class__, b.__class__) + def test_dynamic_class(self): + a = create_dynamic_class("my_dynamic_class", (object,)) + copyreg.pickle(pickling_metaclass, pickling_metaclass.__reduce__) + for proto in protocols: + s = self.dumps(a, proto) + b = self.loads(s) + self.assertEqual(a, b) + def test_structseq(self): import time import os diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -174,6 +174,7 @@ Tom Christiansen Vadim Chugunov David Cinege +Craig Citro Mike Clarkson Andrew Clegg Brad Clements @@ -941,6 +942,7 @@ Mikhail Terekhov Richard M. Tew Tobias Thelen +Nicolas M. Thi?ry James Thomas Robin Thomas Stephen Thorne diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,10 @@ Library ------- +- Issue #7689: Allow pickling of dynamically created classes when their + metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig + Citro. + - Issue #4147: minidom's toprettyxml no longer adds whitespace to text nodes. - Issue #13034: When decoding some SSL certificates, the subjectAltName diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -3134,10 +3134,6 @@ status = save_global(self, obj, NULL); goto done; } - else if (PyType_IsSubtype(type, &PyType_Type)) { - status = save_global(self, obj, NULL); - goto done; - } /* XXX: This part needs some unit tests. */ @@ -3156,6 +3152,10 @@ Py_INCREF(obj); reduce_value = _Pickler_FastCall(self, reduce_func, obj); } + else if (PyType_IsSubtype(type, &PyType_Type)) { + status = save_global(self, obj, NULL); + goto done; + } else { static PyObject *reduce_str = NULL; static PyObject *reduce_ex_str = NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 09:39:13 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 09:39:13 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzc2ODk6?= =?utf8?q?_Allow_pickling_of_dynamically_created_classes_when_their?= Message-ID: http://hg.python.org/cpython/rev/64053bd79590 changeset: 72641:64053bd79590 branch: 2.7 parent: 72636:aa3ebc2dfc15 user: Antoine Pitrou date: Tue Oct 04 09:34:48 2011 +0200 summary: Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig Citro. files: Lib/pickle.py | 18 +++++++++--------- Lib/test/pickletester.py | 21 +++++++++++++++++++++ Misc/ACKS | 2 ++ Misc/NEWS | 4 ++++ Modules/cPickle.c | 10 +++++----- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/Lib/pickle.py b/Lib/pickle.py --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -286,20 +286,20 @@ f(self, obj) # Call unbound method with explicit self return - # Check for a class with a custom metaclass; treat as regular class - try: - issc = issubclass(t, TypeType) - except TypeError: # t is not a class (old Boost; see SF #502085) - issc = 0 - if issc: - self.save_global(obj) - return - # Check copy_reg.dispatch_table reduce = dispatch_table.get(t) if reduce: rv = reduce(obj) else: + # Check for a class with a custom metaclass; treat as regular class + try: + issc = issubclass(t, TypeType) + except TypeError: # t is not a class (old Boost; see SF #502085) + issc = 0 + if issc: + self.save_global(obj) + return + # Check for a __reduce_ex__ method, fall back to __reduce__ reduce = getattr(obj, "__reduce_ex__", None) if reduce: diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -124,6 +124,19 @@ class use_metaclass(object): __metaclass__ = metaclass +class pickling_metaclass(type): + def __eq__(self, other): + return (type(self) == type(other) and + self.reduce_args == other.reduce_args) + + def __reduce__(self): + return (create_dynamic_class, self.reduce_args) + +def create_dynamic_class(name, bases): + result = pickling_metaclass(name, bases, dict()) + result.reduce_args = (name, bases) + return result + # DATA0 .. DATA2 are the pickles we expect under the various protocols, for # the object returned by create_data(). @@ -609,6 +622,14 @@ b = self.loads(s) self.assertEqual(a.__class__, b.__class__) + def test_dynamic_class(self): + a = create_dynamic_class("my_dynamic_class", (object,)) + copy_reg.pickle(pickling_metaclass, pickling_metaclass.__reduce__) + for proto in protocols: + s = self.dumps(a, proto) + b = self.loads(s) + self.assertEqual(a, b) + def test_structseq(self): import time import os diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -147,6 +147,7 @@ Tom Christiansen Vadim Chugunov David Cinege +Craig Citro Mike Clarkson Andrew Clegg Brad Clements @@ -817,6 +818,7 @@ Mikhail Terekhov Richard M. Tew Tobias Thelen +Nicolas M. Thi?ry James Thomas Robin Thomas Stephen Thorne diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,10 @@ Library ------- +- Issue #7689: Allow pickling of dynamically created classes when their + metaclass is registered with copy_reg. Patch by Nicolas M. Thi?ry and + Craig Citro. + - Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by Thomas Jarosch. diff --git a/Modules/cPickle.c b/Modules/cPickle.c --- a/Modules/cPickle.c +++ b/Modules/cPickle.c @@ -2697,11 +2697,6 @@ } } - if (PyType_IsSubtype(type, &PyType_Type)) { - res = save_global(self, args, NULL); - goto finally; - } - /* Get a reduction callable, and call it. This may come from * copy_reg.dispatch_table, the object's __reduce_ex__ method, * or the object's __reduce__ method. @@ -2717,6 +2712,11 @@ } } else { + if (PyType_IsSubtype(type, &PyType_Type)) { + res = save_global(self, args, NULL); + goto finally; + } + /* Check for a __reduce_ex__ method. */ __reduce__ = PyObject_GetAttr(args, __reduce_ex___str); if (__reduce__ != NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 10:32:22 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 10:32:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Start_fixing_te?= =?utf8?q?st=5Fbigmem=3A?= Message-ID: http://hg.python.org/cpython/rev/bf39434dd506 changeset: 72642:bf39434dd506 branch: 3.2 parent: 72639:760ac320fa3d user: Antoine Pitrou date: Tue Oct 04 10:22:36 2011 +0200 summary: Start fixing test_bigmem: - bigmemtest is replaced by precisionbigmemtest - add a poor man's watchdog thread to print memory consumption files: Lib/test/pickletester.py | 12 +- Lib/test/support.py | 92 +++++-- Lib/test/test_bigmem.py | 239 +++++++++++----------- Lib/test/test_hashlib.py | 6 +- Lib/test/test_xml_etree_c.py | 4 +- Lib/test/test_zlib.py | 14 +- 6 files changed, 203 insertions(+), 164 deletions(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -8,7 +8,7 @@ from test.support import ( TestFailed, TESTFN, run_with_locale, - _2G, _4G, precisionbigmemtest, + _2G, _4G, bigmemtest, ) from pickle import bytes_types @@ -1159,7 +1159,7 @@ # Binary protocols can serialize longs of up to 2GB-1 - @precisionbigmemtest(size=_2G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False) def test_huge_long_32b(self, size): data = 1 << (8 * size) try: @@ -1175,7 +1175,7 @@ # (older protocols don't have a dedicated opcode for bytes and are # too inefficient) - @precisionbigmemtest(size=_2G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False) def test_huge_bytes_32b(self, size): data = b"abcd" * (size // 4) try: @@ -1191,7 +1191,7 @@ finally: data = None - @precisionbigmemtest(size=_4G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_4G, memuse=1 + 1, dry_run=False) def test_huge_bytes_64b(self, size): data = b"a" * size try: @@ -1206,7 +1206,7 @@ # All protocols use 1-byte per printable ASCII character; we add another # byte because the encoded form has to be copied into the internal buffer. - @precisionbigmemtest(size=_2G, memuse=2 + character_size, dry_run=False) + @bigmemtest(size=_2G, memuse=2 + character_size, dry_run=False) def test_huge_str_32b(self, size): data = "abcd" * (size // 4) try: @@ -1223,7 +1223,7 @@ # BINUNICODE (protocols 1, 2 and 3) cannot carry more than # 2**32 - 1 bytes of utf-8 encoded unicode. - @precisionbigmemtest(size=_4G, memuse=1 + character_size, dry_run=False) + @bigmemtest(size=_4G, memuse=1 + character_size, dry_run=False) def test_huge_str_64b(self, size): data = "a" * size try: diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1053,45 +1053,54 @@ raise ValueError('Memory limit %r too low to be useful' % (limit,)) max_memuse = memlimit -def bigmemtest(minsize, memuse): +def _memory_watchdog(start_evt, finish_evt, period=10.0): + """A function which periodically watches the process' memory consumption + and prints it out. + """ + # XXX: because of the GIL, and because the very long operations tested + # in most bigmem tests are uninterruptible, the loop below gets woken up + # much less often than expected. + # The polling code should be rewritten in raw C, without holding the GIL, + # and push results onto an anonymous pipe. + try: + page_size = os.sysconf('SC_PAGESIZE') + except (ValueError, AttributeError): + try: + page_size = os.sysconf('SC_PAGE_SIZE') + except (ValueError, AttributeError): + page_size = 4096 + procfile = '/proc/{pid}/statm'.format(pid=os.getpid()) + try: + f = open(procfile, 'rb') + except IOError as e: + warnings.warn('/proc not available for stats: {}'.format(e), + RuntimeWarning) + sys.stderr.flush() + return + with f: + start_evt.set() + old_data = -1 + while not finish_evt.wait(period): + f.seek(0) + statm = f.read().decode('ascii') + data = int(statm.split()[5]) + if data != old_data: + old_data = data + print(" ... process data size: {data:.1f}G" + .format(data=data * page_size / (1024 ** 3))) + +def bigmemtest(size, memuse, dry_run=True): """Decorator for bigmem tests. 'minsize' is the minimum useful size for the test (in arbitrary, test-interpreted units.) 'memuse' is the number of 'bytes per size' for the test, or a good estimate of it. - The decorator tries to guess a good value for 'size' and passes it to - the decorated test function. If minsize * memuse is more than the - allowed memory use (as defined by max_memuse), the test is skipped. - Otherwise, minsize is adjusted upward to use up to max_memuse. + if 'dry_run' is False, it means the test doesn't support dummy runs + when -M is not specified. """ def decorator(f): def wrapper(self): - # Retrieve values in case someone decided to adjust them - minsize = wrapper.minsize - memuse = wrapper.memuse - if not max_memuse: - # If max_memuse is 0 (the default), - # we still want to run the tests with size set to a few kb, - # to make sure they work. We still want to avoid using - # too much memory, though, but we do that noisily. - maxsize = 5147 - self.assertFalse(maxsize * memuse > 20 * _1M) - else: - maxsize = int(max_memuse / memuse) - if maxsize < minsize: - raise unittest.SkipTest( - "not enough memory: %.1fG minimum needed" - % (minsize * memuse / (1024 ** 3))) - return f(self, maxsize) - wrapper.minsize = minsize - wrapper.memuse = memuse - return wrapper - return decorator - -def precisionbigmemtest(size, memuse, dry_run=True): - def decorator(f): - def wrapper(self): size = wrapper.size memuse = wrapper.memuse if not real_max_memuse: @@ -1105,7 +1114,28 @@ "not enough memory: %.1fG minimum needed" % (size * memuse / (1024 ** 3))) - return f(self, maxsize) + if real_max_memuse and verbose and threading: + print() + print(" ... expected peak memory use: {peak:.1f}G" + .format(peak=size * memuse / (1024 ** 3))) + sys.stdout.flush() + start_evt = threading.Event() + finish_evt = threading.Event() + t = threading.Thread(target=_memory_watchdog, + args=(start_evt, finish_evt, 0.5)) + t.daemon = True + t.start() + start_evt.set() + else: + t = None + + try: + return f(self, maxsize) + finally: + if t: + finish_evt.set() + t.join() + wrapper.size = size wrapper.memuse = memuse return wrapper diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -1,5 +1,5 @@ from test import support -from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest +from test.support import bigmemtest, _1G, _2G, _4G import unittest import operator @@ -25,10 +25,10 @@ # a large object, make the subobject of a length that is not a power of # 2. That way, int-wrapping problems are more easily detected. # -# - While the bigmemtest decorator speaks of 'minsize', all tests will -# actually be called with a much smaller number too, in the normal -# test run (5Kb currently.) This is so the tests themselves get frequent -# testing. Consequently, always make all large allocations based on the +# - Despite the bigmemtest decorator, all tests will actually be called +# with a much smaller number too, in the normal test run (5Kb currently.) +# This is so the tests themselves get frequent testing. +# Consequently, always make all large allocations based on the # passed-in 'size', and don't rely on the size being very large. Also, # memuse-per-size should remain sane (less than a few thousand); if your # test uses more, adjust 'size' upward, instead. @@ -42,7 +42,7 @@ class BaseStrTest: - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_capitalize(self, size): _ = self.from_latin1 SUBSTR = self.from_latin1(' abc def ghi') @@ -52,7 +52,7 @@ SUBSTR.capitalize()) self.assertEqual(caps.lstrip(_('-')), SUBSTR) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_center(self, size): SUBSTR = self.from_latin1(' abc def ghi') s = SUBSTR.center(size) @@ -63,7 +63,7 @@ self.assertEqual(s[lpadsize:-rpadsize], SUBSTR) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_count(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -75,7 +75,7 @@ self.assertEqual(s.count(_('i')), 1) self.assertEqual(s.count(_('j')), 0) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_endswith(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -87,7 +87,7 @@ self.assertFalse(s.endswith(_('a') + SUBSTR)) self.assertFalse(SUBSTR.endswith(s)) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_expandtabs(self, size): _ = self.from_latin1 s = _('-') * size @@ -100,7 +100,7 @@ self.assertEqual(len(s), size - remainder) self.assertEqual(len(s.strip(_(' '))), 0) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_find(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -117,7 +117,7 @@ sublen + size + SUBSTR.find(_('i'))) self.assertEqual(s.find(_('j')), -1) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_index(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -134,7 +134,7 @@ sublen + size + SUBSTR.index(_('i'))) self.assertRaises(ValueError, s.index, _('j')) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isalnum(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -143,7 +143,7 @@ s += _('.') self.assertFalse(s.isalnum()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isalpha(self, size): _ = self.from_latin1 SUBSTR = _('zzzzzzz') @@ -152,7 +152,7 @@ s += _('.') self.assertFalse(s.isalpha()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isdigit(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -161,7 +161,7 @@ s += _('z') self.assertFalse(s.isdigit()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_islower(self, size): _ = self.from_latin1 chars = _(''.join( @@ -172,7 +172,7 @@ s += _('A') self.assertFalse(s.islower()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isspace(self, size): _ = self.from_latin1 whitespace = _(' \f\n\r\t\v') @@ -182,7 +182,7 @@ s += _('j') self.assertFalse(s.isspace()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_istitle(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -193,7 +193,7 @@ s += _('aA') self.assertFalse(s.istitle()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isupper(self, size): _ = self.from_latin1 chars = _(''.join( @@ -204,7 +204,7 @@ s += _('a') self.assertFalse(s.isupper()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_join(self, size): _ = self.from_latin1 s = _('A') * size @@ -214,7 +214,7 @@ self.assertTrue(x.startswith(_('aaaaaA'))) self.assertTrue(x.endswith(_('Abbbbb'))) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_ljust(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -223,7 +223,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_lower(self, size): _ = self.from_latin1 s = _('A') * size @@ -231,7 +231,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.count(_('a')), size) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_lstrip(self, size): _ = self.from_latin1 SUBSTR = _('abc def ghi') @@ -246,7 +246,7 @@ stripped = s.lstrip() self.assertTrue(stripped is s) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_replace(self, size): _ = self.from_latin1 replacement = _('a') @@ -259,7 +259,7 @@ self.assertEqual(s.count(replacement), 4) self.assertEqual(s[-10:], _(' aaaa')) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_rfind(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -275,7 +275,7 @@ SUBSTR.rfind(_('i'))) self.assertEqual(s.rfind(_('j')), -1) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_rindex(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -294,7 +294,7 @@ SUBSTR.rindex(_('i'))) self.assertRaises(ValueError, s.rindex, _('j')) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_rjust(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -303,7 +303,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_rstrip(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -321,7 +321,7 @@ # The test takes about size bytes to build a string, and then about # sqrt(size) substrings of sqrt(size) in size and a list to # hold sqrt(size) items. It's close but just over 2x size. - @bigmemtest(minsize=_2G, memuse=2.1) + @bigmemtest(size=_2G, memuse=2.1) def test_split_small(self, size): _ = self.from_latin1 # Crudely calculate an estimate so that the result of s.split won't @@ -347,7 +347,7 @@ # suffer for the list size. (Otherwise, it'd cost another 48 times # size in bytes!) Nevertheless, a list of size takes # 8*size bytes. - @bigmemtest(minsize=_2G + 5, memuse=10) + @bigmemtest(size=_2G + 5, memuse=10) def test_split_large(self, size): _ = self.from_latin1 s = _(' a') * size + _(' ') @@ -359,7 +359,7 @@ self.assertEqual(len(l), size + 1) self.assertEqual(set(l), set([_(' ')])) - @bigmemtest(minsize=_2G, memuse=2.1) + @bigmemtest(size=_2G, memuse=2.1) def test_splitlines(self, size): _ = self.from_latin1 # Crudely calculate an estimate so that the result of s.split won't @@ -373,7 +373,7 @@ for item in l: self.assertEqual(item, expected) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_startswith(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -382,7 +382,7 @@ self.assertTrue(s.startswith(_('-') * size)) self.assertFalse(s.startswith(SUBSTR)) - @bigmemtest(minsize=_2G, memuse=1) + @bigmemtest(size=_2G, memuse=1) def test_strip(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi ') @@ -394,7 +394,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_swapcase(self, size): _ = self.from_latin1 SUBSTR = _("aBcDeFG12.'\xa9\x00") @@ -406,7 +406,7 @@ self.assertEqual(s[:sublen * 3], SUBSTR.swapcase() * 3) self.assertEqual(s[-sublen * 3:], SUBSTR.swapcase() * 3) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_title(self, size): _ = self.from_latin1 SUBSTR = _('SpaaHAaaAaham') @@ -415,7 +415,7 @@ self.assertTrue(s.startswith((SUBSTR * 3).title())) self.assertTrue(s.endswith(SUBSTR.lower() * 3)) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_translate(self, size): _ = self.from_latin1 SUBSTR = _('aZz.z.Aaz.') @@ -438,7 +438,7 @@ self.assertEqual(s.count(_('!')), repeats * 2) self.assertEqual(s.count(_('z')), repeats * 3) - @bigmemtest(minsize=_2G + 5, memuse=2) + @bigmemtest(size=_2G + 5, memuse=2) def test_upper(self, size): _ = self.from_latin1 s = _('a') * size @@ -446,7 +446,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.count(_('A')), size) - @bigmemtest(minsize=_2G + 20, memuse=1) + @bigmemtest(size=_2G + 20, memuse=1) def test_zfill(self, size): _ = self.from_latin1 SUBSTR = _('-568324723598234') @@ -458,7 +458,7 @@ # This test is meaningful even with size < 2G, as long as the # doubled string is > 2G (but it tests more if both are > 2G :) - @bigmemtest(minsize=_1G + 2, memuse=3) + @bigmemtest(size=_1G + 2, memuse=3) def test_concat(self, size): _ = self.from_latin1 s = _('.') * size @@ -469,7 +469,7 @@ # This test is meaningful even with size < 2G, as long as the # repeated string is > 2G (but it tests more if both are > 2G :) - @bigmemtest(minsize=_1G + 2, memuse=3) + @bigmemtest(size=_1G + 2, memuse=3) def test_repeat(self, size): _ = self.from_latin1 s = _('.') * size @@ -478,7 +478,7 @@ self.assertEqual(len(s), size * 2) self.assertEqual(s.count(_('.')), size * 2) - @bigmemtest(minsize=_2G + 20, memuse=2) + @bigmemtest(size=_2G + 20, memuse=2) def test_slice_and_getitem(self, size): _ = self.from_latin1 SUBSTR = _('0123456789') @@ -512,7 +512,7 @@ self.assertRaises(IndexError, operator.getitem, s, len(s) + 1) self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_contains(self, size): _ = self.from_latin1 SUBSTR = _('0123456789') @@ -526,7 +526,7 @@ s += _('a') self.assertIn(_('a'), s) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_compare(self, size): _ = self.from_latin1 s1 = _('-') * size @@ -539,7 +539,7 @@ s2 = _('.') * size self.assertFalse(s1 == s2) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_hash(self, size): # Not sure if we can do any meaningful tests here... Even if we # start relying on the exact algorithm used, the result will be @@ -590,46 +590,36 @@ getattr(type(self), name).memuse = memuse # the utf8 encoder preallocates big time (4x the number of characters) - @bigmemtest(minsize=_2G + 2, memuse=character_size + 4) + @bigmemtest(size=_2G + 2, memuse=character_size + 4) def test_encode(self, size): return self.basic_encode_test(size, 'utf-8') - @precisionbigmemtest(size=_4G // 6 + 2, memuse=character_size + 1) + @bigmemtest(size=_4G // 6 + 2, memuse=character_size + 1) def test_encode_raw_unicode_escape(self, size): try: return self.basic_encode_test(size, 'raw_unicode_escape') except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_4G // 5 + 70, memuse=character_size + 1) + @bigmemtest(size=_4G // 5 + 70, memuse=character_size + 1) def test_encode_utf7(self, size): try: return self.basic_encode_test(size, 'utf7') except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_4G // 4 + 5, memuse=character_size + 4) + @bigmemtest(size=_4G // 4 + 5, memuse=character_size + 4) def test_encode_utf32(self, size): try: return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4) except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_2G - 1, memuse=character_size + 1) + @bigmemtest(size=_2G - 1, memuse=character_size + 1) def test_encode_ascii(self, size): return self.basic_encode_test(size, 'ascii', c='A') - @precisionbigmemtest(size=_4G // 5, memuse=character_size * (6 + 1)) - def test_unicode_repr_overflow(self, size): - try: - s = "\uDCBA"*size - r = repr(s) - except MemoryError: - pass # acceptable on 32-bit - else: - self.assertTrue(s == eval(r)) - - @bigmemtest(minsize=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=character_size * 2) def test_format(self, size): s = '-' * size sf = '%s' % (s,) @@ -650,7 +640,7 @@ self.assertEqual(s.count('.'), 3) self.assertEqual(s.count('-'), size * 2) - @bigmemtest(minsize=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=character_size * 2) def test_repr_small(self, size): s = '-' * size s = repr(s) @@ -671,7 +661,7 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(minsize=_2G + 10, memuse=character_size * 5) + @bigmemtest(size=_2G + 10, memuse=character_size * 5) def test_repr_large(self, size): s = '\x00' * size s = repr(s) @@ -681,27 +671,46 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(minsize=2**32 / 5, memuse=character_size * 7) + @bigmemtest(size=_2G // 5 + 1, memuse=character_size * 7) def test_unicode_repr(self, size): # Use an assigned, but not printable code point. # It is in the range of the low surrogates \uDC00-\uDFFF. - s = "\uDCBA" * size - for f in (repr, ascii): - r = f(s) - self.assertTrue(len(r) > size) - self.assertTrue(r.endswith(r"\udcba'"), r[-10:]) - del r + char = "\uDCBA" + s = char * size + try: + for f in (repr, ascii): + r = f(s) + self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) + self.assertTrue(r.endswith(r"\udcba'"), r[-10:]) + r = None + finally: + r = s = None # The character takes 4 bytes even in UCS-2 builds because it will # be decomposed into surrogates. - @bigmemtest(minsize=2**32 / 5, memuse=4 + character_size * 9) + @bigmemtest(size=_2G // 5 + 1, memuse=4 + character_size * 9) def test_unicode_repr_wide(self, size): - s = "\U0001DCBA" * size - for f in (repr, ascii): - r = f(s) - self.assertTrue(len(r) > size) - self.assertTrue(r.endswith(r"\U0001dcba'"), r[-12:]) - del r + char = "\U0001DCBA" + s = char * size + try: + for f in (repr, ascii): + r = f(s) + self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) + self.assertTrue(r.endswith(r"\U0001dcba'"), r[-12:]) + r = None + finally: + r = s = None + + @bigmemtest(size=_4G // 5, memuse=character_size * (6 + 1)) + def _test_unicode_repr_overflow(self, size): + # XXX not sure what this test is about + char = "\uDCBA" + s = char * size + try: + r = repr(s) + self.assertTrue(s == eval(r)) + finally: + r = s = None class BytesTest(unittest.TestCase, BaseStrTest): @@ -709,7 +718,7 @@ def from_latin1(self, s): return s.encode("latin1") - @bigmemtest(minsize=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + character_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -720,7 +729,7 @@ def from_latin1(self, s): return bytearray(s.encode("latin1")) - @bigmemtest(minsize=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + character_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -739,7 +748,7 @@ # having more than 2<<31 references to any given object. Hence the # use of different types of objects as contents in different tests. - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_compare(self, size): t1 = ('',) * size t2 = ('',) * size @@ -762,15 +771,15 @@ t = t + t self.assertEqual(len(t), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_concat_small(self, size): return self.basic_concat_test(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_concat_large(self, size): return self.basic_concat_test(size) - @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 10, memuse=8 * 5) def test_contains(self, size): t = (1, 2, 3, 4, 5) * size self.assertEqual(len(t), size * 5) @@ -778,7 +787,7 @@ self.assertNotIn((1, 2, 3, 4, 5), t) self.assertNotIn(0, t) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_hash(self, size): t1 = (0,) * size h1 = hash(t1) @@ -786,7 +795,7 @@ t2 = (0,) * (size + 1) self.assertFalse(h1 == hash(t2)) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_index_and_slice(self, size): t = (None,) * size self.assertEqual(len(t), size) @@ -811,19 +820,19 @@ t = t * 2 self.assertEqual(len(t), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_repeat_small(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_repeat_large(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_1G - 1, memuse=12) + @bigmemtest(size=_1G - 1, memuse=12) def test_repeat_large_2(self, size): return self.basic_test_repeat(size) - @precisionbigmemtest(size=_1G - 1, memuse=9) + @bigmemtest(size=_1G - 1, memuse=9) def test_from_2G_generator(self, size): self.skipTest("test needs much more memory than advertised, see issue5438") try: @@ -837,7 +846,7 @@ count += 1 self.assertEqual(count, size) - @precisionbigmemtest(size=_1G - 25, memuse=9) + @bigmemtest(size=_1G - 25, memuse=9) def test_from_almost_2G_generator(self, size): self.skipTest("test needs much more memory than advertised, see issue5438") try: @@ -860,11 +869,11 @@ self.assertEqual(s[-5:], '0, 0)') self.assertEqual(s.count('0'), size) - @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(minsize=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) def test_repr_large(self, size): return self.basic_test_repr(size) @@ -875,7 +884,7 @@ # lists hold references to various objects to test their refcount # limits. - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_compare(self, size): l1 = [''] * size l2 = [''] * size @@ -898,11 +907,11 @@ l = l + l self.assertEqual(len(l), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_concat_small(self, size): return self.basic_test_concat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_concat_large(self, size): return self.basic_test_concat(size) @@ -913,15 +922,15 @@ self.assertTrue(l[0] is l[-1]) self.assertTrue(l[size - 1] is l[size + 1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_inplace_concat_small(self, size): return self.basic_test_inplace_concat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_inplace_concat_large(self, size): return self.basic_test_inplace_concat(size) - @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 10, memuse=8 * 5) def test_contains(self, size): l = [1, 2, 3, 4, 5] * size self.assertEqual(len(l), size * 5) @@ -929,12 +938,12 @@ self.assertNotIn([1, 2, 3, 4, 5], l) self.assertNotIn(0, l) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_hash(self, size): l = [0] * size self.assertRaises(TypeError, hash, l) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_index_and_slice(self, size): l = [None] * size self.assertEqual(len(l), size) @@ -998,11 +1007,11 @@ l = l * 2 self.assertEqual(len(l), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_repeat_small(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_repeat_large(self, size): return self.basic_test_repeat(size) @@ -1018,11 +1027,11 @@ self.assertEqual(len(l), size * 2) self.assertTrue(l[size - 1] is l[-1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=16) + @bigmemtest(size=_2G // 2 + 2, memuse=16) def test_inplace_repeat_small(self, size): return self.basic_test_inplace_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_inplace_repeat_large(self, size): return self.basic_test_inplace_repeat(size) @@ -1035,17 +1044,17 @@ self.assertEqual(s[-5:], '0, 0]') self.assertEqual(s.count('0'), size) - @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(minsize=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) def test_repr_large(self, size): return self.basic_test_repr(size) # list overallocates ~1/8th of the total size (on first expansion) so # the single list.append call puts memuse at 9 bytes per size. - @bigmemtest(minsize=_2G, memuse=9) + @bigmemtest(size=_2G, memuse=9) def test_append(self, size): l = [object()] * size l.append(object()) @@ -1053,7 +1062,7 @@ self.assertTrue(l[-3] is l[-2]) self.assertFalse(l[-2] is l[-1]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_count(self, size): l = [1, 2, 3, 4, 5] * size self.assertEqual(l.count(1), size) @@ -1066,15 +1075,15 @@ self.assertTrue(l[0] is l[-1]) self.assertTrue(l[size - 1] is l[size + 1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=16) + @bigmemtest(size=_2G // 2 + 2, memuse=16) def test_extend_small(self, size): return self.basic_test_extend(size) - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_extend_large(self, size): return self.basic_test_extend(size) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_index(self, size): l = [1, 2, 3, 4, 5] * size size *= 5 @@ -1085,7 +1094,7 @@ self.assertRaises(ValueError, l.index, 6) # This tests suffers from overallocation, just like test_append. - @bigmemtest(minsize=_2G + 10, memuse=9) + @bigmemtest(size=_2G + 10, memuse=9) def test_insert(self, size): l = [1.0] * size l.insert(size - 1, "A") @@ -1104,7 +1113,7 @@ self.assertEqual(l[:3], [1.0, "C", 1.0]) self.assertEqual(l[size - 3:], ["A", 1.0, "B"]) - @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 4, memuse=8 * 5) def test_pop(self, size): l = ["a", "b", "c", "d", "e"] * size size *= 5 @@ -1128,7 +1137,7 @@ self.assertEqual(item, "c") self.assertEqual(l[-2:], ["b", "d"]) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_remove(self, size): l = [10] * size self.assertEqual(len(l), size) @@ -1148,7 +1157,7 @@ self.assertEqual(len(l), size) self.assertEqual(l[-2:], [10, 10]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_reverse(self, size): l = [1, 2, 3, 4, 5] * size l.reverse() @@ -1156,7 +1165,7 @@ self.assertEqual(l[-5:], [5, 4, 3, 2, 1]) self.assertEqual(l[:5], [5, 4, 3, 2, 1]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_sort(self, size): l = [1, 2, 3, 4, 5] * size l.sort() diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -17,7 +17,7 @@ import unittest import warnings from test import support -from test.support import _4G, precisionbigmemtest +from test.support import _4G, bigmemtest # Were we compiled --with-pydebug or with #define Py_DEBUG? COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') @@ -196,7 +196,7 @@ b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'd174ab98d277d9f5a5611c2c9f419d9f') - @precisionbigmemtest(size=_4G + 5, memuse=1) + @bigmemtest(size=_4G + 5, memuse=1) def test_case_md5_huge(self, size): if size == _4G + 5: try: @@ -204,7 +204,7 @@ except OverflowError: pass # 32-bit arch - @precisionbigmemtest(size=_4G - 1, memuse=1) + @bigmemtest(size=_4G - 1, memuse=1) def test_case_md5_uintmax(self, size): if size == _4G - 1: try: diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -1,7 +1,7 @@ # xml.etree test for cElementTree from test import support -from test.support import precisionbigmemtest, _2G +from test.support import bigmemtest, _2G import unittest cET = support.import_module('xml.etree.cElementTree') @@ -35,7 +35,7 @@ class MiscTests(unittest.TestCase): # Issue #8651. - @support.precisionbigmemtest(size=support._2G + 100, memuse=1) + @support.bigmemtest(size=support._2G + 100, memuse=1) def test_length_overflow(self, size): if size < support._2G + 100: self.skipTest("not enough free memory, need at least 2 GB") diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -3,7 +3,7 @@ import binascii import random import sys -from test.support import precisionbigmemtest, _1G, _4G +from test.support import bigmemtest, _1G, _4G zlib = support.import_module('zlib') @@ -177,16 +177,16 @@ # Memory use of the following functions takes into account overallocation - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) + @bigmemtest(size=_1G + 1024 * 1024, memuse=3) def test_big_compress_buffer(self, size): compress = lambda s: zlib.compress(s, 1) self.check_big_compress_buffer(size, compress) - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) + @bigmemtest(size=_1G + 1024 * 1024, memuse=2) def test_big_decompress_buffer(self, size): self.check_big_decompress_buffer(size, zlib.decompress) - @precisionbigmemtest(size=_4G + 100, memuse=1) + @bigmemtest(size=_4G + 100, memuse=1) def test_length_overflow(self, size): if size < _4G + 100: self.skipTest("not enough free memory, need at least 4 GB") @@ -511,19 +511,19 @@ # Memory use of the following functions takes into account overallocation - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) + @bigmemtest(size=_1G + 1024 * 1024, memuse=3) def test_big_compress_buffer(self, size): c = zlib.compressobj(1) compress = lambda s: c.compress(s) + c.flush() self.check_big_compress_buffer(size, compress) - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) + @bigmemtest(size=_1G + 1024 * 1024, memuse=2) def test_big_decompress_buffer(self, size): d = zlib.decompressobj() decompress = lambda s: d.decompress(s) + d.flush() self.check_big_decompress_buffer(size, decompress) - @precisionbigmemtest(size=_4G + 100, memuse=1) + @bigmemtest(size=_4G + 100, memuse=1) def test_length_overflow(self, size): if size < _4G + 100: self.skipTest("not enough free memory, need at least 4 GB") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 10:32:22 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 10:32:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Start_fixing_test=5Fbigmem=3A?= Message-ID: http://hg.python.org/cpython/rev/dac5dd1911b4 changeset: 72643:dac5dd1911b4 parent: 72640:46c026a5ccb9 parent: 72642:bf39434dd506 user: Antoine Pitrou date: Tue Oct 04 10:28:37 2011 +0200 summary: Start fixing test_bigmem: - bigmemtest is replaced by precisionbigmemtest - add a poor man's watchdog thread to print memory consumption files: Lib/test/pickletester.py | 12 +- Lib/test/support.py | 97 +++++--- Lib/test/test_bigmem.py | 241 +++++++++++----------- Lib/test/test_bz2.py | 6 +- Lib/test/test_hashlib.py | 6 +- Lib/test/test_xml_etree_c.py | 4 +- Lib/test/test_zlib.py | 14 +- 7 files changed, 207 insertions(+), 173 deletions(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -9,7 +9,7 @@ from test.support import ( TestFailed, TESTFN, run_with_locale, no_tracing, - _2G, _4G, precisionbigmemtest, + _2G, _4G, bigmemtest, ) from pickle import bytes_types @@ -1188,7 +1188,7 @@ # Binary protocols can serialize longs of up to 2GB-1 - @precisionbigmemtest(size=_2G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False) def test_huge_long_32b(self, size): data = 1 << (8 * size) try: @@ -1204,7 +1204,7 @@ # (older protocols don't have a dedicated opcode for bytes and are # too inefficient) - @precisionbigmemtest(size=_2G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_2G, memuse=1 + 1, dry_run=False) def test_huge_bytes_32b(self, size): data = b"abcd" * (size // 4) try: @@ -1220,7 +1220,7 @@ finally: data = None - @precisionbigmemtest(size=_4G, memuse=1 + 1, dry_run=False) + @bigmemtest(size=_4G, memuse=1 + 1, dry_run=False) def test_huge_bytes_64b(self, size): data = b"a" * size try: @@ -1235,7 +1235,7 @@ # All protocols use 1-byte per printable ASCII character; we add another # byte because the encoded form has to be copied into the internal buffer. - @precisionbigmemtest(size=_2G, memuse=2 + character_size, dry_run=False) + @bigmemtest(size=_2G, memuse=2 + character_size, dry_run=False) def test_huge_str_32b(self, size): data = "abcd" * (size // 4) try: @@ -1252,7 +1252,7 @@ # BINUNICODE (protocols 1, 2 and 3) cannot carry more than # 2**32 - 1 bytes of utf-8 encoded unicode. - @precisionbigmemtest(size=_4G, memuse=1 + character_size, dry_run=False) + @bigmemtest(size=_4G, memuse=1 + character_size, dry_run=False) def test_huge_str_64b(self, size): data = "a" * size try: diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1133,47 +1133,51 @@ raise ValueError('Memory limit %r too low to be useful' % (limit,)) max_memuse = memlimit -def bigmemtest(minsize, memuse): +def _memory_watchdog(start_evt, finish_evt, period=10.0): + """A function which periodically watches the process' memory consumption + and prints it out. + """ + # XXX: because of the GIL, and because the very long operations tested + # in most bigmem tests are uninterruptible, the loop below gets woken up + # much less often than expected. + # The polling code should be rewritten in raw C, without holding the GIL, + # and push results onto an anonymous pipe. + try: + page_size = os.sysconf('SC_PAGESIZE') + except (ValueError, AttributeError): + try: + page_size = os.sysconf('SC_PAGE_SIZE') + except (ValueError, AttributeError): + page_size = 4096 + procfile = '/proc/{pid}/statm'.format(pid=os.getpid()) + try: + f = open(procfile, 'rb') + except IOError as e: + warnings.warn('/proc not available for stats: {}'.format(e), + RuntimeWarning) + sys.stderr.flush() + return + with f: + start_evt.set() + old_data = -1 + while not finish_evt.wait(period): + f.seek(0) + statm = f.read().decode('ascii') + data = int(statm.split()[5]) + if data != old_data: + old_data = data + print(" ... process data size: {data:.1f}G" + .format(data=data * page_size / (1024 ** 3))) + +def bigmemtest(size, memuse, dry_run=True): """Decorator for bigmem tests. 'minsize' is the minimum useful size for the test (in arbitrary, test-interpreted units.) 'memuse' is the number of 'bytes per size' for the test, or a good estimate of it. - The decorator tries to guess a good value for 'size' and passes it to - the decorated test function. If minsize * memuse is more than the - allowed memory use (as defined by max_memuse), the test is skipped. - Otherwise, minsize is adjusted upward to use up to max_memuse. - """ - def decorator(f): - def wrapper(self): - # Retrieve values in case someone decided to adjust them - minsize = wrapper.minsize - memuse = wrapper.memuse - if not max_memuse: - # If max_memuse is 0 (the default), - # we still want to run the tests with size set to a few kb, - # to make sure they work. We still want to avoid using - # too much memory, though, but we do that noisily. - maxsize = 5147 - self.assertFalse(maxsize * memuse > 20 * _1M) - else: - maxsize = int(max_memuse / memuse) - if maxsize < minsize: - raise unittest.SkipTest( - "not enough memory: %.1fG minimum needed" - % (minsize * memuse / (1024 ** 3))) - return f(self, maxsize) - wrapper.minsize = minsize - wrapper.memuse = memuse - return wrapper - return decorator - -def precisionbigmemtest(size, memuse, dry_run=True): - """Decorator for bigmem tests that need exact sizes. - - Like bigmemtest, but without the size scaling upward to fill available - memory. + if 'dry_run' is False, it means the test doesn't support dummy runs + when -M is not specified. """ def decorator(f): def wrapper(self): @@ -1190,7 +1194,28 @@ "not enough memory: %.1fG minimum needed" % (size * memuse / (1024 ** 3))) - return f(self, maxsize) + if real_max_memuse and verbose and threading: + print() + print(" ... expected peak memory use: {peak:.1f}G" + .format(peak=size * memuse / (1024 ** 3))) + sys.stdout.flush() + start_evt = threading.Event() + finish_evt = threading.Event() + t = threading.Thread(target=_memory_watchdog, + args=(start_evt, finish_evt, 0.5)) + t.daemon = True + t.start() + start_evt.set() + else: + t = None + + try: + return f(self, maxsize) + finally: + if t: + finish_evt.set() + t.join() + wrapper.size = size wrapper.memuse = memuse return wrapper diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -9,7 +9,7 @@ """ from test import support -from test.support import bigmemtest, _1G, _2G, _4G, precisionbigmemtest +from test.support import bigmemtest, _1G, _2G, _4G import unittest import operator @@ -50,11 +50,11 @@ # a large object, make the subobject of a length that is not a power of # 2. That way, int-wrapping problems are more easily detected. # -# - While the bigmem decorators speak of 'minsize', all tests will actually -# be called with a much smaller number too, in the normal test run (5Kb -# currently.) This is so the tests themselves get frequent testing. -# Consequently, always make all large allocations based on the passed-in -# 'size', and don't rely on the size being very large. Also, +# - Despite the bigmemtest decorator, all tests will actually be called +# with a much smaller number too, in the normal test run (5Kb currently.) +# This is so the tests themselves get frequent testing. +# Consequently, always make all large allocations based on the +# passed-in 'size', and don't rely on the size being very large. Also, # memuse-per-size should remain sane (less than a few thousand); if your # test uses more, adjust 'size' upward, instead. @@ -67,7 +67,7 @@ class BaseStrTest: - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_capitalize(self, size): _ = self.from_latin1 SUBSTR = self.from_latin1(' abc def ghi') @@ -77,7 +77,7 @@ SUBSTR.capitalize()) self.assertEqual(caps.lstrip(_('-')), SUBSTR) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_center(self, size): SUBSTR = self.from_latin1(' abc def ghi') s = SUBSTR.center(size) @@ -88,7 +88,7 @@ self.assertEqual(s[lpadsize:-rpadsize], SUBSTR) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_count(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -100,7 +100,7 @@ self.assertEqual(s.count(_('i')), 1) self.assertEqual(s.count(_('j')), 0) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_endswith(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -112,7 +112,7 @@ self.assertFalse(s.endswith(_('a') + SUBSTR)) self.assertFalse(SUBSTR.endswith(s)) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_expandtabs(self, size): _ = self.from_latin1 s = _('-') * size @@ -125,7 +125,7 @@ self.assertEqual(len(s), size - remainder) self.assertEqual(len(s.strip(_(' '))), 0) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_find(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -142,7 +142,7 @@ sublen + size + SUBSTR.find(_('i'))) self.assertEqual(s.find(_('j')), -1) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_index(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -159,7 +159,7 @@ sublen + size + SUBSTR.index(_('i'))) self.assertRaises(ValueError, s.index, _('j')) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isalnum(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -168,7 +168,7 @@ s += _('.') self.assertFalse(s.isalnum()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isalpha(self, size): _ = self.from_latin1 SUBSTR = _('zzzzzzz') @@ -177,7 +177,7 @@ s += _('.') self.assertFalse(s.isalpha()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isdigit(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -186,7 +186,7 @@ s += _('z') self.assertFalse(s.isdigit()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_islower(self, size): _ = self.from_latin1 chars = _(''.join( @@ -197,7 +197,7 @@ s += _('A') self.assertFalse(s.islower()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isspace(self, size): _ = self.from_latin1 whitespace = _(' \f\n\r\t\v') @@ -207,7 +207,7 @@ s += _('j') self.assertFalse(s.isspace()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_istitle(self, size): _ = self.from_latin1 SUBSTR = _('123456') @@ -218,7 +218,7 @@ s += _('aA') self.assertFalse(s.istitle()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_isupper(self, size): _ = self.from_latin1 chars = _(''.join( @@ -229,7 +229,7 @@ s += _('a') self.assertFalse(s.isupper()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_join(self, size): _ = self.from_latin1 s = _('A') * size @@ -239,7 +239,7 @@ self.assertTrue(x.startswith(_('aaaaaA'))) self.assertTrue(x.endswith(_('Abbbbb'))) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_ljust(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -248,7 +248,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_lower(self, size): _ = self.from_latin1 s = _('A') * size @@ -256,7 +256,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.count(_('a')), size) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_lstrip(self, size): _ = self.from_latin1 SUBSTR = _('abc def ghi') @@ -271,7 +271,7 @@ stripped = s.lstrip() self.assertTrue(stripped is s) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_replace(self, size): _ = self.from_latin1 replacement = _('a') @@ -284,7 +284,7 @@ self.assertEqual(s.count(replacement), 4) self.assertEqual(s[-10:], _(' aaaa')) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_rfind(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -300,7 +300,7 @@ SUBSTR.rfind(_('i'))) self.assertEqual(s.rfind(_('j')), -1) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_rindex(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -319,7 +319,7 @@ SUBSTR.rindex(_('i'))) self.assertRaises(ValueError, s.rindex, _('j')) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_rjust(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -328,7 +328,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_rstrip(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -346,7 +346,7 @@ # The test takes about size bytes to build a string, and then about # sqrt(size) substrings of sqrt(size) in size and a list to # hold sqrt(size) items. It's close but just over 2x size. - @bigmemtest(minsize=_2G, memuse=2.1) + @bigmemtest(size=_2G, memuse=2.1) def test_split_small(self, size): _ = self.from_latin1 # Crudely calculate an estimate so that the result of s.split won't @@ -372,7 +372,7 @@ # suffer for the list size. (Otherwise, it'd cost another 48 times # size in bytes!) Nevertheless, a list of size takes # 8*size bytes. - @bigmemtest(minsize=_2G + 5, memuse=10) + @bigmemtest(size=_2G + 5, memuse=10) def test_split_large(self, size): _ = self.from_latin1 s = _(' a') * size + _(' ') @@ -384,7 +384,7 @@ self.assertEqual(len(l), size + 1) self.assertEqual(set(l), set([_(' ')])) - @bigmemtest(minsize=_2G, memuse=2.1) + @bigmemtest(size=_2G, memuse=2.1) def test_splitlines(self, size): _ = self.from_latin1 # Crudely calculate an estimate so that the result of s.split won't @@ -398,7 +398,7 @@ for item in l: self.assertEqual(item, expected) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_startswith(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi') @@ -407,7 +407,7 @@ self.assertTrue(s.startswith(_('-') * size)) self.assertFalse(s.startswith(SUBSTR)) - @bigmemtest(minsize=_2G, memuse=1) + @bigmemtest(size=_2G, memuse=1) def test_strip(self, size): _ = self.from_latin1 SUBSTR = _(' abc def ghi ') @@ -419,7 +419,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.strip(), SUBSTR.strip()) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_swapcase(self, size): _ = self.from_latin1 SUBSTR = _("aBcDeFG12.'\xa9\x00") @@ -431,7 +431,7 @@ self.assertEqual(s[:sublen * 3], SUBSTR.swapcase() * 3) self.assertEqual(s[-sublen * 3:], SUBSTR.swapcase() * 3) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_title(self, size): _ = self.from_latin1 SUBSTR = _('SpaaHAaaAaham') @@ -440,7 +440,7 @@ self.assertTrue(s.startswith((SUBSTR * 3).title())) self.assertTrue(s.endswith(SUBSTR.lower() * 3)) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_translate(self, size): _ = self.from_latin1 SUBSTR = _('aZz.z.Aaz.') @@ -463,7 +463,7 @@ self.assertEqual(s.count(_('!')), repeats * 2) self.assertEqual(s.count(_('z')), repeats * 3) - @bigmemtest(minsize=_2G + 5, memuse=2) + @bigmemtest(size=_2G + 5, memuse=2) def test_upper(self, size): _ = self.from_latin1 s = _('a') * size @@ -471,7 +471,7 @@ self.assertEqual(len(s), size) self.assertEqual(s.count(_('A')), size) - @bigmemtest(minsize=_2G + 20, memuse=1) + @bigmemtest(size=_2G + 20, memuse=1) def test_zfill(self, size): _ = self.from_latin1 SUBSTR = _('-568324723598234') @@ -483,7 +483,7 @@ # This test is meaningful even with size < 2G, as long as the # doubled string is > 2G (but it tests more if both are > 2G :) - @bigmemtest(minsize=_1G + 2, memuse=3) + @bigmemtest(size=_1G + 2, memuse=3) def test_concat(self, size): _ = self.from_latin1 s = _('.') * size @@ -494,7 +494,7 @@ # This test is meaningful even with size < 2G, as long as the # repeated string is > 2G (but it tests more if both are > 2G :) - @bigmemtest(minsize=_1G + 2, memuse=3) + @bigmemtest(size=_1G + 2, memuse=3) def test_repeat(self, size): _ = self.from_latin1 s = _('.') * size @@ -503,7 +503,7 @@ self.assertEqual(len(s), size * 2) self.assertEqual(s.count(_('.')), size * 2) - @bigmemtest(minsize=_2G + 20, memuse=2) + @bigmemtest(size=_2G + 20, memuse=2) def test_slice_and_getitem(self, size): _ = self.from_latin1 SUBSTR = _('0123456789') @@ -537,7 +537,7 @@ self.assertRaises(IndexError, operator.getitem, s, len(s) + 1) self.assertRaises(IndexError, operator.getitem, s, len(s) + 1<<31) - @bigmemtest(minsize=_2G, memuse=2) + @bigmemtest(size=_2G, memuse=2) def test_contains(self, size): _ = self.from_latin1 SUBSTR = _('0123456789') @@ -551,7 +551,7 @@ s += _('a') self.assertTrue(_('a') in s) - @bigmemtest(minsize=_2G + 10, memuse=2) + @bigmemtest(size=_2G + 10, memuse=2) def test_compare(self, size): _ = self.from_latin1 s1 = _('-') * size @@ -564,7 +564,7 @@ s2 = _('.') * size self.assertFalse(s1 == s2) - @bigmemtest(minsize=_2G + 10, memuse=1) + @bigmemtest(size=_2G + 10, memuse=1) def test_hash(self, size): # Not sure if we can do any meaningful tests here... Even if we # start relying on the exact algorithm used, the result will be @@ -615,46 +615,36 @@ getattr(type(self), name).memuse = memuse # the utf8 encoder preallocates big time (4x the number of characters) - @bigmemtest(minsize=_2G + 2, memuse=character_size + 4) + @bigmemtest(size=_2G + 2, memuse=character_size + 4) def test_encode(self, size): return self.basic_encode_test(size, 'utf-8') - @precisionbigmemtest(size=_4G // 6 + 2, memuse=character_size + 1) + @bigmemtest(size=_4G // 6 + 2, memuse=character_size + 1) def test_encode_raw_unicode_escape(self, size): try: return self.basic_encode_test(size, 'raw_unicode_escape') except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_4G // 5 + 70, memuse=character_size + 1) + @bigmemtest(size=_4G // 5 + 70, memuse=character_size + 1) def test_encode_utf7(self, size): try: return self.basic_encode_test(size, 'utf7') except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_4G // 4 + 5, memuse=character_size + 4) + @bigmemtest(size=_4G // 4 + 5, memuse=character_size + 4) def test_encode_utf32(self, size): try: return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4) except MemoryError: pass # acceptable on 32-bit - @precisionbigmemtest(size=_2G - 1, memuse=character_size + 1) + @bigmemtest(size=_2G - 1, memuse=character_size + 1) def test_encode_ascii(self, size): return self.basic_encode_test(size, 'ascii', c='A') - @precisionbigmemtest(size=_4G // 5, memuse=character_size * (6 + 1)) - def test_unicode_repr_overflow(self, size): - try: - s = "\uDCBA"*size - r = repr(s) - except MemoryError: - pass # acceptable on 32-bit - else: - self.assertTrue(s == eval(r)) - - @bigmemtest(minsize=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=character_size * 2) def test_format(self, size): s = '-' * size sf = '%s' % (s,) @@ -675,7 +665,7 @@ self.assertEqual(s.count('.'), 3) self.assertEqual(s.count('-'), size * 2) - @bigmemtest(minsize=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=character_size * 2) def test_repr_small(self, size): s = '-' * size s = repr(s) @@ -696,7 +686,7 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(minsize=_2G + 10, memuse=character_size * 5) + @bigmemtest(size=_2G + 10, memuse=character_size * 5) def test_repr_large(self, size): s = '\x00' * size s = repr(s) @@ -706,27 +696,46 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(minsize=2**32 / 5, memuse=character_size * 7) + @bigmemtest(size=_2G // 5 + 1, memuse=character_size * 7) def test_unicode_repr(self, size): # Use an assigned, but not printable code point. # It is in the range of the low surrogates \uDC00-\uDFFF. - s = "\uDCBA" * size - for f in (repr, ascii): - r = f(s) - self.assertTrue(len(r) > size) - self.assertTrue(r.endswith(r"\udcba'"), r[-10:]) - del r + char = "\uDCBA" + s = char * size + try: + for f in (repr, ascii): + r = f(s) + self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) + self.assertTrue(r.endswith(r"\udcba'"), r[-10:]) + r = None + finally: + r = s = None # The character takes 4 bytes even in UCS-2 builds because it will # be decomposed into surrogates. - @bigmemtest(minsize=2**32 / 5, memuse=4 + character_size * 9) + @bigmemtest(size=_2G // 5 + 1, memuse=4 + character_size * 9) def test_unicode_repr_wide(self, size): - s = "\U0001DCBA" * size - for f in (repr, ascii): - r = f(s) - self.assertTrue(len(r) > size) - self.assertTrue(r.endswith(r"\U0001dcba'"), r[-12:]) - del r + char = "\U0001DCBA" + s = char * size + try: + for f in (repr, ascii): + r = f(s) + self.assertEqual(len(r), 2 + (len(f(char)) - 2) * size) + self.assertTrue(r.endswith(r"\U0001dcba'"), r[-12:]) + r = None + finally: + r = s = None + + @bigmemtest(size=_4G // 5, memuse=character_size * (6 + 1)) + def _test_unicode_repr_overflow(self, size): + # XXX not sure what this test is about + char = "\uDCBA" + s = char * size + try: + r = repr(s) + self.assertTrue(s == eval(r)) + finally: + r = s = None class BytesTest(unittest.TestCase, BaseStrTest): @@ -734,7 +743,7 @@ def from_latin1(self, s): return s.encode("latin-1") - @bigmemtest(minsize=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + character_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -745,7 +754,7 @@ def from_latin1(self, s): return bytearray(s.encode("latin-1")) - @bigmemtest(minsize=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + character_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -764,7 +773,7 @@ # having more than 2<<31 references to any given object. Hence the # use of different types of objects as contents in different tests. - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_compare(self, size): t1 = ('',) * size t2 = ('',) * size @@ -787,15 +796,15 @@ t = t + t self.assertEqual(len(t), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_concat_small(self, size): return self.basic_concat_test(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_concat_large(self, size): return self.basic_concat_test(size) - @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 10, memuse=8 * 5) def test_contains(self, size): t = (1, 2, 3, 4, 5) * size self.assertEqual(len(t), size * 5) @@ -803,7 +812,7 @@ self.assertFalse((1, 2, 3, 4, 5) in t) self.assertFalse(0 in t) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_hash(self, size): t1 = (0,) * size h1 = hash(t1) @@ -811,7 +820,7 @@ t2 = (0,) * (size + 1) self.assertFalse(h1 == hash(t2)) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_index_and_slice(self, size): t = (None,) * size self.assertEqual(len(t), size) @@ -836,19 +845,19 @@ t = t * 2 self.assertEqual(len(t), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_repeat_small(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_repeat_large(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_1G - 1, memuse=12) + @bigmemtest(size=_1G - 1, memuse=12) def test_repeat_large_2(self, size): return self.basic_test_repeat(size) - @precisionbigmemtest(size=_1G - 1, memuse=9) + @bigmemtest(size=_1G - 1, memuse=9) def test_from_2G_generator(self, size): self.skipTest("test needs much more memory than advertised, see issue5438") try: @@ -862,7 +871,7 @@ count += 1 self.assertEqual(count, size) - @precisionbigmemtest(size=_1G - 25, memuse=9) + @bigmemtest(size=_1G - 25, memuse=9) def test_from_almost_2G_generator(self, size): self.skipTest("test needs much more memory than advertised, see issue5438") try: @@ -885,11 +894,11 @@ self.assertEqual(s[-5:], '0, 0)') self.assertEqual(s.count('0'), size) - @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(minsize=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) def test_repr_large(self, size): return self.basic_test_repr(size) @@ -900,7 +909,7 @@ # lists hold references to various objects to test their refcount # limits. - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_compare(self, size): l1 = [''] * size l2 = [''] * size @@ -923,11 +932,11 @@ l = l + l self.assertEqual(len(l), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_concat_small(self, size): return self.basic_test_concat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_concat_large(self, size): return self.basic_test_concat(size) @@ -938,15 +947,15 @@ self.assertTrue(l[0] is l[-1]) self.assertTrue(l[size - 1] is l[size + 1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_inplace_concat_small(self, size): return self.basic_test_inplace_concat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_inplace_concat_large(self, size): return self.basic_test_inplace_concat(size) - @bigmemtest(minsize=_2G // 5 + 10, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 10, memuse=8 * 5) def test_contains(self, size): l = [1, 2, 3, 4, 5] * size self.assertEqual(len(l), size * 5) @@ -954,12 +963,12 @@ self.assertFalse([1, 2, 3, 4, 5] in l) self.assertFalse(0 in l) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_hash(self, size): l = [0] * size self.assertRaises(TypeError, hash, l) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_index_and_slice(self, size): l = [None] * size self.assertEqual(len(l), size) @@ -1023,11 +1032,11 @@ l = l * 2 self.assertEqual(len(l), size * 2) - @bigmemtest(minsize=_2G // 2 + 2, memuse=24) + @bigmemtest(size=_2G // 2 + 2, memuse=24) def test_repeat_small(self, size): return self.basic_test_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=24) + @bigmemtest(size=_2G + 2, memuse=24) def test_repeat_large(self, size): return self.basic_test_repeat(size) @@ -1043,11 +1052,11 @@ self.assertEqual(len(l), size * 2) self.assertTrue(l[size - 1] is l[-1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=16) + @bigmemtest(size=_2G // 2 + 2, memuse=16) def test_inplace_repeat_small(self, size): return self.basic_test_inplace_repeat(size) - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_inplace_repeat_large(self, size): return self.basic_test_inplace_repeat(size) @@ -1060,17 +1069,17 @@ self.assertEqual(s[-5:], '0, 0]') self.assertEqual(s.count('0'), size) - @bigmemtest(minsize=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(minsize=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) def test_repr_large(self, size): return self.basic_test_repr(size) # list overallocates ~1/8th of the total size (on first expansion) so # the single list.append call puts memuse at 9 bytes per size. - @bigmemtest(minsize=_2G, memuse=9) + @bigmemtest(size=_2G, memuse=9) def test_append(self, size): l = [object()] * size l.append(object()) @@ -1078,7 +1087,7 @@ self.assertTrue(l[-3] is l[-2]) self.assertFalse(l[-2] is l[-1]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_count(self, size): l = [1, 2, 3, 4, 5] * size self.assertEqual(l.count(1), size) @@ -1091,15 +1100,15 @@ self.assertTrue(l[0] is l[-1]) self.assertTrue(l[size - 1] is l[size + 1]) - @bigmemtest(minsize=_2G // 2 + 2, memuse=16) + @bigmemtest(size=_2G // 2 + 2, memuse=16) def test_extend_small(self, size): return self.basic_test_extend(size) - @bigmemtest(minsize=_2G + 2, memuse=16) + @bigmemtest(size=_2G + 2, memuse=16) def test_extend_large(self, size): return self.basic_test_extend(size) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_index(self, size): l = [1, 2, 3, 4, 5] * size size *= 5 @@ -1110,7 +1119,7 @@ self.assertRaises(ValueError, l.index, 6) # This tests suffers from overallocation, just like test_append. - @bigmemtest(minsize=_2G + 10, memuse=9) + @bigmemtest(size=_2G + 10, memuse=9) def test_insert(self, size): l = [1.0] * size l.insert(size - 1, "A") @@ -1129,7 +1138,7 @@ self.assertEqual(l[:3], [1.0, "C", 1.0]) self.assertEqual(l[size - 3:], ["A", 1.0, "B"]) - @bigmemtest(minsize=_2G // 5 + 4, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 4, memuse=8 * 5) def test_pop(self, size): l = ["a", "b", "c", "d", "e"] * size size *= 5 @@ -1153,7 +1162,7 @@ self.assertEqual(item, "c") self.assertEqual(l[-2:], ["b", "d"]) - @bigmemtest(minsize=_2G + 10, memuse=8) + @bigmemtest(size=_2G + 10, memuse=8) def test_remove(self, size): l = [10] * size self.assertEqual(len(l), size) @@ -1173,7 +1182,7 @@ self.assertEqual(len(l), size) self.assertEqual(l[-2:], [10, 10]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_reverse(self, size): l = [1, 2, 3, 4, 5] * size l.reverse() @@ -1181,7 +1190,7 @@ self.assertEqual(l[-5:], [5, 4, 3, 2, 1]) self.assertEqual(l[:5], [5, 4, 3, 2, 1]) - @bigmemtest(minsize=_2G // 5 + 2, memuse=8 * 5) + @bigmemtest(size=_2G // 5 + 2, memuse=8 * 5) def test_sort(self, size): l = [1, 2, 3, 4, 5] * size l.sort() diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 from test import support -from test.support import TESTFN, precisionbigmemtest, _4G +from test.support import TESTFN, bigmemtest, _4G import unittest from io import BytesIO @@ -497,7 +497,7 @@ data += bz2c.flush() self.assertEqual(self.decompress(data), self.TEXT) - @precisionbigmemtest(size=_4G + 100, memuse=2) + @bigmemtest(size=_4G + 100, memuse=2) def testCompress4G(self, size): # "Test BZ2Compressor.compress()/flush() with >4GiB input" bz2c = BZ2Compressor() @@ -548,7 +548,7 @@ text = bz2d.decompress(self.DATA) self.assertRaises(EOFError, bz2d.decompress, b"anything") - @precisionbigmemtest(size=_4G + 100, memuse=3) + @bigmemtest(size=_4G + 100, memuse=3) def testDecompress4G(self, size): # "Test BZ2Decompressor.decompress() with >4GiB input" blocksize = 10 * 1024 * 1024 diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py --- a/Lib/test/test_hashlib.py +++ b/Lib/test/test_hashlib.py @@ -17,7 +17,7 @@ import unittest import warnings from test import support -from test.support import _4G, precisionbigmemtest +from test.support import _4G, bigmemtest # Were we compiled --with-pydebug or with #define Py_DEBUG? COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') @@ -196,7 +196,7 @@ b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 'd174ab98d277d9f5a5611c2c9f419d9f') - @precisionbigmemtest(size=_4G + 5, memuse=1) + @bigmemtest(size=_4G + 5, memuse=1) def test_case_md5_huge(self, size): if size == _4G + 5: try: @@ -204,7 +204,7 @@ except OverflowError: pass # 32-bit arch - @precisionbigmemtest(size=_4G - 1, memuse=1) + @bigmemtest(size=_4G - 1, memuse=1) def test_case_md5_uintmax(self, size): if size == _4G - 1: try: diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -1,7 +1,7 @@ # xml.etree test for cElementTree from test import support -from test.support import precisionbigmemtest, _2G +from test.support import bigmemtest, _2G import unittest cET = support.import_module('xml.etree.cElementTree') @@ -35,7 +35,7 @@ class MiscTests(unittest.TestCase): # Issue #8651. - @support.precisionbigmemtest(size=support._2G + 100, memuse=1) + @support.bigmemtest(size=support._2G + 100, memuse=1) def test_length_overflow(self, size): if size < support._2G + 100: self.skipTest("not enough free memory, need at least 2 GB") diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -3,7 +3,7 @@ import binascii import random import sys -from test.support import precisionbigmemtest, _1G, _4G +from test.support import bigmemtest, _1G, _4G zlib = support.import_module('zlib') @@ -188,16 +188,16 @@ # Memory use of the following functions takes into account overallocation - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) + @bigmemtest(size=_1G + 1024 * 1024, memuse=3) def test_big_compress_buffer(self, size): compress = lambda s: zlib.compress(s, 1) self.check_big_compress_buffer(size, compress) - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) + @bigmemtest(size=_1G + 1024 * 1024, memuse=2) def test_big_decompress_buffer(self, size): self.check_big_decompress_buffer(size, zlib.decompress) - @precisionbigmemtest(size=_4G + 100, memuse=1) + @bigmemtest(size=_4G + 100, memuse=1) def test_length_overflow(self, size): if size < _4G + 100: self.skipTest("not enough free memory, need at least 4 GB") @@ -542,19 +542,19 @@ # Memory use of the following functions takes into account overallocation - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=3) + @bigmemtest(size=_1G + 1024 * 1024, memuse=3) def test_big_compress_buffer(self, size): c = zlib.compressobj(1) compress = lambda s: c.compress(s) + c.flush() self.check_big_compress_buffer(size, compress) - @precisionbigmemtest(size=_1G + 1024 * 1024, memuse=2) + @bigmemtest(size=_1G + 1024 * 1024, memuse=2) def test_big_decompress_buffer(self, size): d = zlib.decompressobj() decompress = lambda s: d.decompress(s) + d.flush() self.check_big_decompress_buffer(size, decompress) - @precisionbigmemtest(size=_4G + 100, memuse=1) + @bigmemtest(size=_4G + 100, memuse=1) def test_length_overflow(self, size): if size < _4G + 100: self.skipTest("not enough free memory, need at least 4 GB") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 10:43:26 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 10:43:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_test_failure?= Message-ID: http://hg.python.org/cpython/rev/c4b6d9312da1 changeset: 72644:c4b6d9312da1 user: Antoine Pitrou date: Tue Oct 04 10:39:54 2011 +0200 summary: Fix test failure files: Lib/test/json_tests/test_dump.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/json_tests/test_dump.py b/Lib/test/json_tests/test_dump.py --- a/Lib/test/json_tests/test_dump.py +++ b/Lib/test/json_tests/test_dump.py @@ -1,7 +1,7 @@ from io import StringIO from test.json_tests import PyTest, CTest -from test.support import precisionbigmemtest, _1G +from test.support import bigmemtest, _1G class TestDump: def test_dump(self): @@ -30,7 +30,7 @@ # system memory management, since this may allocate a lot of # small objects). - @precisionbigmemtest(size=_1G, memuse=1) + @bigmemtest(size=_1G, memuse=1) def test_large_list(self, size): N = int(30 * 1024 * 1024 * (size / _1G)) l = [1] * N -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 11:55:04 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 11:55:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_the_faulthandler_module?= =?utf8?q?=27s_infrastructure_to_write_a_GIL-less?= Message-ID: http://hg.python.org/cpython/rev/8eaa4c3f8633 changeset: 72645:8eaa4c3f8633 user: Antoine Pitrou date: Tue Oct 04 11:51:23 2011 +0200 summary: Use the faulthandler module's infrastructure to write a GIL-less memory watchdog for timely stats collection. files: Lib/test/support.py | 109 ++++++++++------ Modules/faulthandler.c | 183 +++++++++++++++++++++++++++++ 2 files changed, 249 insertions(+), 43 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -23,6 +23,7 @@ import sysconfig import fnmatch import logging.handlers +import struct try: import _thread, threading @@ -34,6 +35,10 @@ except ImportError: multiprocessing = None +try: + import faulthandler +except ImportError: + faulthandler = None try: import zlib @@ -1133,41 +1138,66 @@ raise ValueError('Memory limit %r too low to be useful' % (limit,)) max_memuse = memlimit -def _memory_watchdog(start_evt, finish_evt, period=10.0): - """A function which periodically watches the process' memory consumption +class _MemoryWatchdog: + """An object which periodically watches the process' memory consumption and prints it out. """ - # XXX: because of the GIL, and because the very long operations tested - # in most bigmem tests are uninterruptible, the loop below gets woken up - # much less often than expected. - # The polling code should be rewritten in raw C, without holding the GIL, - # and push results onto an anonymous pipe. - try: - page_size = os.sysconf('SC_PAGESIZE') - except (ValueError, AttributeError): + + def __init__(self): + self.procfile = '/proc/{pid}/statm'.format(pid=os.getpid()) + self.started = False + self.thread = None try: - page_size = os.sysconf('SC_PAGE_SIZE') + self.page_size = os.sysconf('SC_PAGESIZE') except (ValueError, AttributeError): - page_size = 4096 - procfile = '/proc/{pid}/statm'.format(pid=os.getpid()) - try: - f = open(procfile, 'rb') - except IOError as e: - warnings.warn('/proc not available for stats: {}'.format(e), - RuntimeWarning) - sys.stderr.flush() - return - with f: - start_evt.set() - old_data = -1 - while not finish_evt.wait(period): - f.seek(0) - statm = f.read().decode('ascii') - data = int(statm.split()[5]) - if data != old_data: - old_data = data + try: + self.page_size = os.sysconf('SC_PAGE_SIZE') + except (ValueError, AttributeError): + self.page_size = 4096 + + def consumer(self, fd): + HEADER = "l" + header_size = struct.calcsize(HEADER) + try: + while True: + header = os.read(fd, header_size) + if len(header) < header_size: + # Pipe closed on other end + break + data_len, = struct.unpack(HEADER, header) + data = os.read(fd, data_len) + statm = data.decode('ascii') + data = int(statm.split()[5]) print(" ... process data size: {data:.1f}G" - .format(data=data * page_size / (1024 ** 3))) + .format(data=data * self.page_size / (1024 ** 3))) + finally: + os.close(fd) + + def start(self): + if not faulthandler or not hasattr(faulthandler, '_file_watchdog'): + return + try: + rfd = os.open(self.procfile, os.O_RDONLY) + except OSError as e: + warnings.warn('/proc not available for stats: {}'.format(e), + RuntimeWarning) + sys.stderr.flush() + return + pipe_fd, wfd = os.pipe() + # _file_watchdog() doesn't take the GIL in its child thread, and + # therefore collects statistics timely + faulthandler._file_watchdog(rfd, wfd, 3.0) + self.started = True + self.thread = threading.Thread(target=self.consumer, args=(pipe_fd,)) + self.thread.daemon = True + self.thread.start() + + def stop(self): + if not self.started: + return + faulthandler._cancel_file_watchdog() + self.thread.join() + def bigmemtest(size, memuse, dry_run=True): """Decorator for bigmem tests. @@ -1194,27 +1224,20 @@ "not enough memory: %.1fG minimum needed" % (size * memuse / (1024 ** 3))) - if real_max_memuse and verbose and threading: + if real_max_memuse and verbose and faulthandler and threading: print() print(" ... expected peak memory use: {peak:.1f}G" .format(peak=size * memuse / (1024 ** 3))) - sys.stdout.flush() - start_evt = threading.Event() - finish_evt = threading.Event() - t = threading.Thread(target=_memory_watchdog, - args=(start_evt, finish_evt, 0.5)) - t.daemon = True - t.start() - start_evt.set() + watchdog = _MemoryWatchdog() + watchdog.start() else: - t = None + watchdog = None try: return f(self, maxsize) finally: - if t: - finish_evt.set() - t.join() + if watchdog: + watchdog.stop() wrapper.size = size wrapper.memuse = memuse diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -13,6 +13,7 @@ #ifdef WITH_THREAD # define FAULTHANDLER_LATER +# define FAULTHANDLER_WATCHDOG #endif #ifndef MS_WINDOWS @@ -65,6 +66,20 @@ } thread; #endif +#ifdef FAULTHANDLER_WATCHDOG +static struct { + int rfd; + int wfd; + PY_TIMEOUT_T period_us; /* period in microseconds */ + /* The main thread always holds this lock. It is only released when + faulthandler_watchdog() is interrupted before this thread exits, or at + Python exit. */ + PyThread_type_lock cancel_event; + /* released by child thread when joined */ + PyThread_type_lock running; +} watchdog; +#endif + #ifdef FAULTHANDLER_USER typedef struct { int enabled; @@ -587,6 +602,138 @@ } #endif /* FAULTHANDLER_LATER */ +#ifdef FAULTHANDLER_WATCHDOG + +static void +file_watchdog(void *unused) +{ + PyLockStatus st; + PY_TIMEOUT_T timeout; + + const int MAXDATA = 1024; + char buf1[MAXDATA], buf2[MAXDATA]; + char *data = buf1, *old_data = buf2; + Py_ssize_t data_len, old_data_len = -1; + +#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) + sigset_t set; + + /* we don't want to receive any signal */ + sigfillset(&set); + pthread_sigmask(SIG_SETMASK, &set, NULL); +#endif + + /* On first pass, feed file contents immediately */ + timeout = 0; + do { + st = PyThread_acquire_lock_timed(watchdog.cancel_event, + timeout, 0); + timeout = watchdog.period_us; + if (st == PY_LOCK_ACQUIRED) { + PyThread_release_lock(watchdog.cancel_event); + break; + } + /* Timeout => read and write data */ + assert(st == PY_LOCK_FAILURE); + + if (lseek(watchdog.rfd, 0, SEEK_SET) < 0) { + break; + } + data_len = read(watchdog.rfd, data, MAXDATA); + if (data_len < 0) { + break; + } + if (data_len != old_data_len || memcmp(data, old_data, data_len)) { + char *tdata; + Py_ssize_t tlen; + /* Contents changed, feed them to wfd */ + long x = (long) data_len; + /* We can't do anything if the consumer is too slow, just bail out */ + if (write(watchdog.wfd, (void *) &x, sizeof(x)) < sizeof(x)) + break; + if (write(watchdog.wfd, data, data_len) < data_len) + break; + tdata = data; + data = old_data; + old_data = tdata; + tlen = data_len; + data_len = old_data_len; + old_data_len = tlen; + } + } while (1); + + close(watchdog.rfd); + close(watchdog.wfd); + + /* The only way out */ + PyThread_release_lock(watchdog.running); +} + +static void +cancel_file_watchdog(void) +{ + /* Notify cancellation */ + PyThread_release_lock(watchdog.cancel_event); + + /* Wait for thread to join */ + PyThread_acquire_lock(watchdog.running, 1); + PyThread_release_lock(watchdog.running); + + /* The main thread should always hold the cancel_event lock */ + PyThread_acquire_lock(watchdog.cancel_event, 1); +} + +static PyObject* +faulthandler_file_watchdog(PyObject *self, + PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"rfd", "wfd", "period", NULL}; + double period; + PY_TIMEOUT_T period_us; + int rfd, wfd; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, + "iid:_file_watchdog", kwlist, + &rfd, &wfd, &period)) + return NULL; + if ((period * 1e6) >= (double) PY_TIMEOUT_MAX) { + PyErr_SetString(PyExc_OverflowError, "period value is too large"); + return NULL; + } + period_us = (PY_TIMEOUT_T)(period * 1e6); + if (period_us <= 0) { + PyErr_SetString(PyExc_ValueError, "period must be greater than 0"); + return NULL; + } + + /* Cancel previous thread, if running */ + cancel_file_watchdog(); + + watchdog.rfd = rfd; + watchdog.wfd = wfd; + watchdog.period_us = period_us; + + /* Arm these locks to serve as events when released */ + PyThread_acquire_lock(watchdog.running, 1); + + if (PyThread_start_new_thread(file_watchdog, NULL) == -1) { + PyThread_release_lock(watchdog.running); + PyErr_SetString(PyExc_RuntimeError, + "unable to start file watchdog thread"); + return NULL; + } + + Py_RETURN_NONE; +} + +static PyObject* +faulthandler_cancel_file_watchdog(PyObject *self) +{ + cancel_file_watchdog(); + Py_RETURN_NONE; +} +#endif /* FAULTHANDLER_WATCHDOG */ + #ifdef FAULTHANDLER_USER static int faulthandler_register(int signum, int chain, _Py_sighandler_t *p_previous) @@ -973,6 +1120,18 @@ "to dump_tracebacks_later().")}, #endif +#ifdef FAULTHANDLER_WATCHDOG + {"_file_watchdog", + (PyCFunction)faulthandler_file_watchdog, METH_VARARGS|METH_KEYWORDS, + PyDoc_STR("_file_watchdog(rfd, wfd, period):\n" + "feed the contents of 'rfd' to 'wfd', if changed,\n" + "every 'period seconds'.")}, + {"_cancel_file_watchdog", + (PyCFunction)faulthandler_cancel_file_watchdog, METH_NOARGS, + PyDoc_STR("_cancel_file_watchdog():\ncancel the previous call " + "to _file_watchdog().")}, +#endif + #ifdef FAULTHANDLER_USER {"register", (PyCFunction)faulthandler_register_py, METH_VARARGS|METH_KEYWORDS, @@ -1097,6 +1256,16 @@ } PyThread_acquire_lock(thread.cancel_event, 1); #endif +#ifdef FAULTHANDLER_WATCHDOG + watchdog.cancel_event = PyThread_allocate_lock(); + watchdog.running = PyThread_allocate_lock(); + if (!watchdog.cancel_event || !watchdog.running) { + PyErr_SetString(PyExc_RuntimeError, + "could not allocate locks for faulthandler"); + return -1; + } + PyThread_acquire_lock(watchdog.cancel_event, 1); +#endif return faulthandler_env_options(); } @@ -1121,6 +1290,20 @@ } #endif +#ifdef FAULTHANDLER_WATCHDOG + /* file watchdog */ + cancel_file_watchdog(); + if (watchdog.cancel_event) { + PyThread_release_lock(watchdog.cancel_event); + PyThread_free_lock(watchdog.cancel_event); + watchdog.cancel_event = NULL; + } + if (watchdog.running) { + PyThread_free_lock(watchdog.running); + watchdog.running = NULL; + } +#endif + #ifdef FAULTHANDLER_USER /* user */ if (user_signals != NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 12:03:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 12:03:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Avoid_testing_s?= =?utf8?q?tuff_that=27s_been_fixed_in_2=2E7_on_older_Pythons?= Message-ID: http://hg.python.org/cpython/rev/05c58e0873f0 changeset: 72646:05c58e0873f0 branch: 2.7 parent: 72641:64053bd79590 user: Antoine Pitrou date: Tue Oct 04 12:00:13 2011 +0200 summary: Avoid testing stuff that's been fixed in 2.7 on older Pythons files: Lib/test/test_xpickle.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_xpickle.py b/Lib/test/test_xpickle.py --- a/Lib/test/test_xpickle.py +++ b/Lib/test/test_xpickle.py @@ -154,6 +154,10 @@ def test_unicode_high_plane(self): pass + # This tests a fix that's in 2.7 only + def test_dynamic_class(self): + pass + if test_support.have_unicode: # This is a cut-down version of pickletester's test_unicode. Backwards # compatibility was explicitly broken in r67934 to fix a bug. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 12:09:39 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 12:09:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Collect_stats_a_bit_more_of?= =?utf8?q?ten?= Message-ID: http://hg.python.org/cpython/rev/f2ed0310adec changeset: 72647:f2ed0310adec parent: 72645:8eaa4c3f8633 user: Antoine Pitrou date: Tue Oct 04 12:06:06 2011 +0200 summary: Collect stats a bit more often files: Lib/test/support.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1186,7 +1186,7 @@ pipe_fd, wfd = os.pipe() # _file_watchdog() doesn't take the GIL in its child thread, and # therefore collects statistics timely - faulthandler._file_watchdog(rfd, wfd, 3.0) + faulthandler._file_watchdog(rfd, wfd, 1.0) self.started = True self.thread = threading.Thread(target=self.consumer, args=(pipe_fd,)) self.thread.daemon = True -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 12:33:00 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 12:33:00 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDg3?= =?utf8?q?=3A_BufferedReader=2Eseek=28=29_now_always_raises_UnsupportedOpe?= =?utf8?q?ration?= Message-ID: http://hg.python.org/cpython/rev/d287f0654349 changeset: 72648:d287f0654349 branch: 3.2 parent: 72642:bf39434dd506 user: Antoine Pitrou date: Tue Oct 04 12:26:20 2011 +0200 summary: Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation if the underlying raw stream is unseekable, even if the seek could be satisfied using the internal buffer. Patch by John O'Connor. files: Lib/test/test_io.py | 8 ++++++++ Misc/NEWS | 4 ++++ Modules/_io/bufferedio.c | 3 +++ 3 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -922,6 +922,14 @@ finally: support.unlink(support.TESTFN) + def test_unseekable(self): + bufio = self.tp(self.MockUnseekableIO(b"A" * 10)) + self.assertRaises(self.UnsupportedOperation, bufio.tell) + self.assertRaises(self.UnsupportedOperation, bufio.seek, 0) + bufio.read(1) + self.assertRaises(self.UnsupportedOperation, bufio.seek, 0) + self.assertRaises(self.UnsupportedOperation, bufio.tell) + def test_misbehaved_io(self): rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg")) bufio = self.tp(rawio) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,10 @@ Library ------- +- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation + if the underlying raw stream is unseekable, even if the seek could be + satisfied using the internal buffer. Patch by John O'Connor. + - Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig Citro. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1086,6 +1086,9 @@ CHECK_CLOSED(self, "seek of closed file") + if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL) + return NULL; + target = PyNumber_AsOff_t(targetobj, PyExc_ValueError); if (target == -1 && PyErr_Occurred()) return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 12:33:01 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 12:33:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_John_to_ACK?= =?utf8?q?S?= Message-ID: http://hg.python.org/cpython/rev/94c32dff61c7 changeset: 72649:94c32dff61c7 branch: 3.2 user: Antoine Pitrou date: Tue Oct 04 12:26:34 2011 +0200 summary: Add John to ACKS files: Misc/ACKS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -652,6 +652,7 @@ Michal Nowikowski Steffen Daode Nurpmeso Nigel O'Brian +John O'Connor Kevin O'Connor Tim O'Malley Pascal Oberndoerfer -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 12:33:02 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 12:33:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313087=3A_BufferedReader=2Eseek=28=29_now_always_rai?= =?utf8?q?ses_UnsupportedOperation?= Message-ID: http://hg.python.org/cpython/rev/0cf38407a3a2 changeset: 72650:0cf38407a3a2 parent: 72647:f2ed0310adec parent: 72649:94c32dff61c7 user: Antoine Pitrou date: Tue Oct 04 12:28:52 2011 +0200 summary: Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation if the underlying raw stream is unseekable, even if the seek could be satisfied using the internal buffer. Patch by John OConnor. files: Lib/test/test_io.py | 8 ++++++++ Misc/NEWS | 4 ++++ Modules/_io/bufferedio.c | 3 +++ 3 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -928,6 +928,14 @@ finally: support.unlink(support.TESTFN) + def test_unseekable(self): + bufio = self.tp(self.MockUnseekableIO(b"A" * 10)) + self.assertRaises(self.UnsupportedOperation, bufio.tell) + self.assertRaises(self.UnsupportedOperation, bufio.seek, 0) + bufio.read(1) + self.assertRaises(self.UnsupportedOperation, bufio.seek, 0) + self.assertRaises(self.UnsupportedOperation, bufio.tell) + def test_misbehaved_io(self): rawio = self.MisbehavedRawIO((b"abc", b"d", b"efg")) bufio = self.tp(rawio) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,10 @@ Library ------- +- Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation + if the underlying raw stream is unseekable, even if the seek could be + satisfied using the internal buffer. Patch by John O'Connor. + - Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copyreg. Patch by Nicolas M. Thi?ry and Craig Citro. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -1155,6 +1155,9 @@ CHECK_CLOSED(self, "seek of closed file") + if (_PyIOBase_check_seekable(self->raw, Py_True) == NULL) + return NULL; + target = PyNumber_AsOff_t(targetobj, PyExc_ValueError); if (target == -1 && PyErr_Occurred()) return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:03:36 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:03:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_error_under?= =?utf8?q?_Windows?= Message-ID: http://hg.python.org/cpython/rev/dc21b26d80f9 changeset: 72651:dc21b26d80f9 user: Antoine Pitrou date: Tue Oct 04 13:00:02 2011 +0200 summary: Fix compilation error under Windows files: Modules/faulthandler.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -610,7 +610,7 @@ PyLockStatus st; PY_TIMEOUT_T timeout; - const int MAXDATA = 1024; +#define MAXDATA 1024 char buf1[MAXDATA], buf2[MAXDATA]; char *data = buf1, *old_data = buf2; Py_ssize_t data_len, old_data_len = -1; @@ -667,6 +667,7 @@ /* The only way out */ PyThread_release_lock(watchdog.running); +#undef MAXDATA } static void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:41:45 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:41:45 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDk5?= =?utf8?q?=3A_Fix_sqlite3=2ECursor=2Elastrowid_under_a_Turkish_locale=2E?= Message-ID: http://hg.python.org/cpython/rev/469555867244 changeset: 72652:469555867244 branch: 3.2 parent: 72649:94c32dff61c7 user: Antoine Pitrou date: Tue Oct 04 13:35:28 2011 +0200 summary: Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/cursor.c | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -488,6 +488,7 @@ Bob Kline Matthias Klose Jeremy Kloth +Thomas Kluyver Kim Knapp Lenny Kneler Pat Knight diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -36,6 +36,9 @@ Library ------- +- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. + Reported and diagnosed by Thomas Kluyver. + - Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation if the underlying raw stream is unseekable, even if the seek could be satisfied using the internal buffer. Patch by John O'Connor. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -55,8 +55,8 @@ dst = buf; *dst = 0; - while (isalpha(*src) && dst - buf < sizeof(buf) - 2) { - *dst++ = tolower(*src++); + while (Py_ISALPHA(*src) && dst - buf < sizeof(buf) - 2) { + *dst++ = Py_TOLOWER(*src++); } *dst = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:41:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:41:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313099=3A_Fix_sqlite3=2ECursor=2Elastrowid_under_a_T?= =?utf8?q?urkish_locale=2E?= Message-ID: http://hg.python.org/cpython/rev/652e2dacbf4b changeset: 72653:652e2dacbf4b parent: 72651:dc21b26d80f9 parent: 72652:469555867244 user: Antoine Pitrou date: Tue Oct 04 13:37:06 2011 +0200 summary: Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/cursor.c | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -516,6 +516,7 @@ Bob Kline Matthias Klose Jeremy Kloth +Thomas Kluyver Kim Knapp Lenny Kneler Pat Knight diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,9 @@ Library ------- +- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. + Reported and diagnosed by Thomas Kluyver. + - Issue #13087: BufferedReader.seek() now always raises UnsupportedOperation if the underlying raw stream is unseekable, even if the seek could be satisfied using the internal buffer. Patch by John O'Connor. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -55,8 +55,8 @@ dst = buf; *dst = 0; - while (isalpha(*src) && dst - buf < sizeof(buf) - 2) { - *dst++ = tolower(*src++); + while (Py_ISALPHA(*src) && dst - buf < sizeof(buf) - 2) { + *dst++ = Py_TOLOWER(*src++); } *dst = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:41:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:41:46 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDk5?= =?utf8?q?=3A_Fix_sqlite3=2ECursor=2Elastrowid_under_a_Turkish_locale=2E?= Message-ID: http://hg.python.org/cpython/rev/89713606b654 changeset: 72654:89713606b654 branch: 2.7 parent: 72646:05c58e0873f0 user: Antoine Pitrou date: Tue Oct 04 13:38:04 2011 +0200 summary: Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/cursor.c | 4 ++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -450,6 +450,7 @@ Bob Kline Matthias Klose Jeremy Kloth +Thomas Kluyver Kim Knapp Lenny Kneler Pat Knight diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,9 @@ Library ------- +- Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. + Reported and diagnosed by Thomas Kluyver. + - Issue #7689: Allow pickling of dynamically created classes when their metaclass is registered with copy_reg. Patch by Nicolas M. Thi?ry and Craig Citro. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -55,8 +55,8 @@ dst = buf; *dst = 0; - while (isalpha(*src) && dst - buf < sizeof(buf) - 2) { - *dst++ = tolower(*src++); + while (Py_ISALPHA(*src) && dst - buf < sizeof(buf) - 2) { + *dst++ = Py_TOLOWER(*src++); } *dst = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:56:36 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:56:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Remove_all_othe?= =?utf8?q?r_uses_of_the_C_tolower=28=29/toupper=28=29_which_could_break_wi?= =?utf8?q?th_a?= Message-ID: http://hg.python.org/cpython/rev/fe48e2b3dbee changeset: 72655:fe48e2b3dbee branch: 3.2 parent: 72652:469555867244 user: Antoine Pitrou date: Tue Oct 04 13:50:21 2011 +0200 summary: Remove all other uses of the C tolower()/toupper() which could break with a Turkish locale. files: Modules/_tkinter.c | 4 ++-- Modules/binascii.c | 4 ++-- Modules/unicodedata.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -661,8 +661,8 @@ } strcpy(argv0, className); - if (isupper(Py_CHARMASK(argv0[0]))) - argv0[0] = tolower(Py_CHARMASK(argv0[0])); + if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) + argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); ckfree(argv0); diff --git a/Modules/binascii.c b/Modules/binascii.c --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1102,8 +1102,8 @@ if (isdigit(c)) return c - '0'; else { - if (isupper(c)) - c = tolower(c); + if (Py_ISUPPER(c)) + c = Py_TOLOWER(c); if (c >= 'a' && c <= 'f') return c - 'a' + 10; } diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -830,7 +830,7 @@ unsigned long h = 0; unsigned long ix; for (i = 0; i < len; i++) { - h = (h * scale) + (unsigned char) toupper(Py_CHARMASK(s[i])); + h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i])); ix = h & 0xff000000; if (ix) h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff; @@ -980,7 +980,7 @@ if (!_getucname(self, code, buffer, sizeof(buffer))) return 0; for (i = 0; i < namelen; i++) { - if (toupper(Py_CHARMASK(name[i])) != buffer[i]) + if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) return 0; } return buffer[namelen] == '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:56:37 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:56:37 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Remove_all_other_uses_of_the_C_tolower=28=29/toupper=28=29_w?= =?utf8?q?hich_could_break_with_a?= Message-ID: http://hg.python.org/cpython/rev/969bbc6700a0 changeset: 72656:969bbc6700a0 parent: 72653:652e2dacbf4b parent: 72655:fe48e2b3dbee user: Antoine Pitrou date: Tue Oct 04 13:53:01 2011 +0200 summary: Remove all other uses of the C tolower()/toupper() which could break with a Turkish locale. files: Modules/_tkinter.c | 4 ++-- Modules/binascii.c | 4 ++-- Modules/unicodedata.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -649,8 +649,8 @@ } strcpy(argv0, className); - if (isupper(Py_CHARMASK(argv0[0]))) - argv0[0] = tolower(Py_CHARMASK(argv0[0])); + if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) + argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); ckfree(argv0); diff --git a/Modules/binascii.c b/Modules/binascii.c --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1102,8 +1102,8 @@ if (isdigit(c)) return c - '0'; else { - if (isupper(c)) - c = tolower(c); + if (Py_ISUPPER(c)) + c = Py_TOLOWER(c); if (c >= 'a' && c <= 'f') return c - 'a' + 10; } diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -875,7 +875,7 @@ unsigned long h = 0; unsigned long ix; for (i = 0; i < len; i++) { - h = (h * scale) + (unsigned char) toupper(Py_CHARMASK(s[i])); + h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i])); ix = h & 0xff000000; if (ix) h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff; @@ -1025,7 +1025,7 @@ if (!_getucname(self, code, buffer, sizeof(buffer))) return 0; for (i = 0; i < namelen; i++) { - if (toupper(Py_CHARMASK(name[i])) != buffer[i]) + if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) return 0; } return buffer[namelen] == '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 13:59:11 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 13:59:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Remove_all_othe?= =?utf8?q?r_uses_of_the_C_tolower=28=29/toupper=28=29_which_could_break_wi?= =?utf8?q?th_a?= Message-ID: http://hg.python.org/cpython/rev/60d80880bf88 changeset: 72657:60d80880bf88 branch: 2.7 parent: 72654:89713606b654 user: Antoine Pitrou date: Tue Oct 04 13:55:37 2011 +0200 summary: Remove all other uses of the C tolower()/toupper() which could break with a Turkish locale. (except in the strop module, which is deprecated anyway) files: Modules/_tkinter.c | 4 ++-- Modules/binascii.c | 4 ++-- Modules/unicodedata.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -663,8 +663,8 @@ } strcpy(argv0, className); - if (isupper(Py_CHARMASK(argv0[0]))) - argv0[0] = tolower(Py_CHARMASK(argv0[0])); + if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) + argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); ckfree(argv0); diff --git a/Modules/binascii.c b/Modules/binascii.c --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1105,8 +1105,8 @@ if (isdigit(c)) return c - '0'; else { - if (isupper(c)) - c = tolower(c); + if (Py_ISUPPER(c)) + c = Py_TOLOWER(c); if (c >= 'a' && c <= 'f') return c - 'a' + 10; } diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -830,7 +830,7 @@ unsigned long h = 0; unsigned long ix; for (i = 0; i < len; i++) { - h = (h * scale) + (unsigned char) toupper(Py_CHARMASK(s[i])); + h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i])); ix = h & 0xff000000; if (ix) h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff; @@ -978,7 +978,7 @@ if (!_getucname(self, code, buffer, sizeof(buffer))) return 0; for (i = 0; i < namelen; i++) { - if (toupper(Py_CHARMASK(name[i])) != buffer[i]) + if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) return 0; } return buffer[namelen] == '\0'; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 14:48:08 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 14:48:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Try_to_fix_link?= =?utf8?q?ing_failures_under_Windows?= Message-ID: http://hg.python.org/cpython/rev/2484b2b8876e changeset: 72658:2484b2b8876e branch: 3.2 parent: 72655:fe48e2b3dbee user: Antoine Pitrou date: Tue Oct 04 14:43:47 2011 +0200 summary: Try to fix linking failures under Windows files: Include/pyctype.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/pyctype.h b/Include/pyctype.h --- a/Include/pyctype.h +++ b/Include/pyctype.h @@ -10,7 +10,7 @@ #define PY_CTF_SPACE 0x08 #define PY_CTF_XDIGIT 0x10 -extern const unsigned int _Py_ctype_table[256]; +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; /* Unlike their C counterparts, the following macros are not meant to * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument @@ -23,8 +23,8 @@ #define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) #define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) -extern const unsigned char _Py_ctype_tolower[256]; -extern const unsigned char _Py_ctype_toupper[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; #define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) #define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 14:48:09 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 14:48:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Try_to_fix_linking_failures_under_Windows?= Message-ID: http://hg.python.org/cpython/rev/f0dcc71e00ab changeset: 72659:f0dcc71e00ab parent: 72656:969bbc6700a0 parent: 72658:2484b2b8876e user: Antoine Pitrou date: Tue Oct 04 14:44:35 2011 +0200 summary: Try to fix linking failures under Windows files: Include/pyctype.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/pyctype.h b/Include/pyctype.h --- a/Include/pyctype.h +++ b/Include/pyctype.h @@ -10,7 +10,7 @@ #define PY_CTF_SPACE 0x08 #define PY_CTF_XDIGIT 0x10 -extern const unsigned int _Py_ctype_table[256]; +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; /* Unlike their C counterparts, the following macros are not meant to * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument @@ -23,8 +23,8 @@ #define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) #define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) -extern const unsigned char _Py_ctype_tolower[256]; -extern const unsigned char _Py_ctype_toupper[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; #define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) #define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 14:49:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 14:49:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Try_to_fix_link?= =?utf8?q?ing_failures_under_Windows?= Message-ID: http://hg.python.org/cpython/rev/504981afa007 changeset: 72660:504981afa007 branch: 2.7 parent: 72657:60d80880bf88 user: Antoine Pitrou date: Tue Oct 04 14:45:32 2011 +0200 summary: Try to fix linking failures under Windows files: Include/pyctype.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Include/pyctype.h b/Include/pyctype.h --- a/Include/pyctype.h +++ b/Include/pyctype.h @@ -9,7 +9,7 @@ #define PY_CTF_SPACE 0x08 #define PY_CTF_XDIGIT 0x10 -extern const unsigned int _Py_ctype_table[256]; +PyAPI_DATA(const unsigned int) _Py_ctype_table[256]; /* Unlike their C counterparts, the following macros are not meant to * handle an int with any of the values [EOF, 0-UCHAR_MAX]. The argument @@ -22,8 +22,8 @@ #define Py_ISALNUM(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_ALNUM) #define Py_ISSPACE(c) (_Py_ctype_table[Py_CHARMASK(c)] & PY_CTF_SPACE) -extern const unsigned char _Py_ctype_tolower[256]; -extern const unsigned char _Py_ctype_toupper[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_tolower[256]; +PyAPI_DATA(const unsigned char) _Py_ctype_toupper[256]; #define Py_TOLOWER(c) (_Py_ctype_tolower[Py_CHARMASK(c)]) #define Py_TOUPPER(c) (_Py_ctype_toupper[Py_CHARMASK(c)]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 15:59:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 15:59:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Migrate_str=2Eexpandtabs_to?= =?utf8?q?_the_new_API?= Message-ID: http://hg.python.org/cpython/rev/ab5086539ab9 changeset: 72661:ab5086539ab9 parent: 72659:f0dcc71e00ab user: Antoine Pitrou date: Tue Oct 04 15:55:09 2011 +0200 summary: Migrate str.expandtabs to the new API files: Objects/unicodeobject.c | 95 +++++++++++++--------------- 1 files changed, 43 insertions(+), 52 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10190,87 +10190,78 @@ static PyObject* unicode_expandtabs(PyUnicodeObject *self, PyObject *args) { - Py_UNICODE *e; - Py_UNICODE *p; - Py_UNICODE *q; - Py_UNICODE *qe; - Py_ssize_t i, j, incr, wstr_length; - PyUnicodeObject *u; + Py_ssize_t i, j, line_pos, src_len, incr; + Py_UCS4 ch; + PyObject *u; + void *src_data, *dest_data; int tabsize = 8; + int kind; if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) return NULL; - if (PyUnicode_AsUnicodeAndSize((PyObject *)self, &wstr_length) == NULL) - return NULL; - /* First pass: determine size of output string */ - i = 0; /* chars up to and including most recent \n or \r */ - j = 0; /* chars since most recent \n or \r (use in tab calculations) */ - e = _PyUnicode_WSTR(self) + wstr_length; /* end of input */ - for (p = _PyUnicode_WSTR(self); p < e; p++) - if (*p == '\t') { + src_len = PyUnicode_GET_LENGTH(self); + i = j = line_pos = 0; + kind = PyUnicode_KIND(self); + src_data = PyUnicode_DATA(self); + for (; i < src_len; i++) { + ch = PyUnicode_READ(kind, src_data, i); + if (ch == '\t') { if (tabsize > 0) { - incr = tabsize - (j % tabsize); /* cannot overflow */ + incr = tabsize - (line_pos % tabsize); /* cannot overflow */ if (j > PY_SSIZE_T_MAX - incr) - goto overflow1; + goto overflow; + line_pos += incr; j += incr; } } else { if (j > PY_SSIZE_T_MAX - 1) - goto overflow1; + goto overflow; + line_pos++; j++; - if (*p == '\n' || *p == '\r') { - if (i > PY_SSIZE_T_MAX - j) - goto overflow1; - i += j; - j = 0; - } - } - - if (i > PY_SSIZE_T_MAX - j) - goto overflow1; + if (ch == '\n' || ch == '\r') + line_pos = 0; + } + } /* Second pass: create output string and fill it */ - u = _PyUnicode_New(i + j); + u = PyUnicode_New(j, PyUnicode_MAX_CHAR_VALUE(self)); if (!u) return NULL; - - j = 0; /* same as in first pass */ - q = _PyUnicode_WSTR(u); /* next output char */ - qe = _PyUnicode_WSTR(u) + PyUnicode_GET_SIZE(u); /* end of output */ - - for (p = _PyUnicode_WSTR(self); p < e; p++) - if (*p == '\t') { + dest_data = PyUnicode_DATA(u); + + i = j = line_pos = 0; + + for (; i < src_len; i++) { + ch = PyUnicode_READ(kind, src_data, i); + if (ch == '\t') { if (tabsize > 0) { - i = tabsize - (j % tabsize); - j += i; - while (i--) { - if (q >= qe) - goto overflow2; - *q++ = ' '; + incr = tabsize - (line_pos % tabsize); + line_pos += incr; + while (incr--) { + PyUnicode_WRITE(kind, dest_data, j, ' '); + j++; } } } else { - if (q >= qe) - goto overflow2; - *q++ = *p; + line_pos++; + PyUnicode_WRITE(kind, dest_data, j, ch); j++; - if (*p == '\n' || *p == '\r') - j = 0; - } - - if (_PyUnicode_READY_REPLACE(&u)) { + if (ch == '\n' || ch == '\r') + line_pos = 0; + } + } + assert (j == PyUnicode_GET_LENGTH(u)); + if (PyUnicode_READY(u)) { Py_DECREF(u); return NULL; } return (PyObject*) u; - overflow2: - Py_DECREF(u); - overflow1: + overflow: PyErr_SetString(PyExc_OverflowError, "new string is too long"); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 15:59:19 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 15:59:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Migrate_test=5Fbigmem_to_PE?= =?utf8?q?P_393-compliant_size_calculations_=28hopefully=29?= Message-ID: http://hg.python.org/cpython/rev/9457bd55820d changeset: 72662:9457bd55820d user: Antoine Pitrou date: Tue Oct 04 15:55:44 2011 +0200 summary: Migrate test_bigmem to PEP 393-compliant size calculations (hopefully) files: Lib/test/test_bigmem.py | 54 +++++++++++----------------- 1 files changed, 21 insertions(+), 33 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -62,7 +62,9 @@ # fail as well. I do not know whether it is due to memory fragmentation # issues, or other specifics of the platform malloc() routine. -character_size = 4 if sys.maxunicode > 0xFFFF else 2 +ascii_char_size = 1 +ucs2_char_size = 2 +ucs4_char_size = 2 class BaseStrTest: @@ -588,7 +590,6 @@ def basic_encode_test(self, size, enc, c='.', expectedsize=None): if expectedsize is None: expectedsize = size - try: s = c * size self.assertEqual(len(s.encode(enc)), expectedsize) @@ -607,7 +608,7 @@ memuse = meth.memuse except AttributeError: continue - meth.memuse = character_size * memuse + meth.memuse = ascii_char_size * memuse self._adjusted[name] = memuse def tearDown(self): @@ -615,36 +616,36 @@ getattr(type(self), name).memuse = memuse # the utf8 encoder preallocates big time (4x the number of characters) - @bigmemtest(size=_2G + 2, memuse=character_size + 4) + @bigmemtest(size=_2G + 2, memuse=ascii_char_size + 4) def test_encode(self, size): return self.basic_encode_test(size, 'utf-8') - @bigmemtest(size=_4G // 6 + 2, memuse=character_size + 1) + @bigmemtest(size=_4G // 6 + 2, memuse=ascii_char_size + 1) def test_encode_raw_unicode_escape(self, size): try: return self.basic_encode_test(size, 'raw_unicode_escape') except MemoryError: pass # acceptable on 32-bit - @bigmemtest(size=_4G // 5 + 70, memuse=character_size + 1) + @bigmemtest(size=_4G // 5 + 70, memuse=ascii_char_size + 1) def test_encode_utf7(self, size): try: return self.basic_encode_test(size, 'utf7') except MemoryError: pass # acceptable on 32-bit - @bigmemtest(size=_4G // 4 + 5, memuse=character_size + 4) + @bigmemtest(size=_4G // 4 + 5, memuse=ascii_char_size + 4) def test_encode_utf32(self, size): try: - return self.basic_encode_test(size, 'utf32', expectedsize=4*size+4) + return self.basic_encode_test(size, 'utf32', expectedsize=4 * size + 4) except MemoryError: pass # acceptable on 32-bit - @bigmemtest(size=_2G - 1, memuse=character_size + 1) + @bigmemtest(size=_2G - 1, memuse=ascii_char_size + 1) def test_encode_ascii(self, size): return self.basic_encode_test(size, 'ascii', c='A') - @bigmemtest(size=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2) def test_format(self, size): s = '-' * size sf = '%s' % (s,) @@ -665,7 +666,7 @@ self.assertEqual(s.count('.'), 3) self.assertEqual(s.count('-'), size * 2) - @bigmemtest(size=_2G + 10, memuse=character_size * 2) + @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2) def test_repr_small(self, size): s = '-' * size s = repr(s) @@ -686,7 +687,7 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(size=_2G + 10, memuse=character_size * 5) + @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 5) def test_repr_large(self, size): s = '\x00' * size s = repr(s) @@ -696,7 +697,7 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(size=_2G // 5 + 1, memuse=character_size * 7) + @bigmemtest(size=_2G // 5 + 1, memuse=ucs2_char_size + ascii_char_size * 6) def test_unicode_repr(self, size): # Use an assigned, but not printable code point. # It is in the range of the low surrogates \uDC00-\uDFFF. @@ -711,9 +712,7 @@ finally: r = s = None - # The character takes 4 bytes even in UCS-2 builds because it will - # be decomposed into surrogates. - @bigmemtest(size=_2G // 5 + 1, memuse=4 + character_size * 9) + @bigmemtest(size=_2G // 5 + 1, memuse=ucs4_char_size + ascii_char_size * 10) def test_unicode_repr_wide(self, size): char = "\U0001DCBA" s = char * size @@ -726,24 +725,13 @@ finally: r = s = None - @bigmemtest(size=_4G // 5, memuse=character_size * (6 + 1)) - def _test_unicode_repr_overflow(self, size): - # XXX not sure what this test is about - char = "\uDCBA" - s = char * size - try: - r = repr(s) - self.assertTrue(s == eval(r)) - finally: - r = s = None - class BytesTest(unittest.TestCase, BaseStrTest): def from_latin1(self, s): return s.encode("latin-1") - @bigmemtest(size=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -754,7 +742,7 @@ def from_latin1(self, s): return bytearray(s.encode("latin-1")) - @bigmemtest(size=_2G + 2, memuse=1 + character_size) + @bigmemtest(size=_2G + 2, memuse=1 + ascii_char_size) def test_decode(self, size): s = self.from_latin1('.') * size self.assertEqual(len(s.decode('utf-8')), size) @@ -894,11 +882,11 @@ self.assertEqual(s[-5:], '0, 0)') self.assertEqual(s.count('0'), size) - @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * ascii_char_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * ascii_char_size) def test_repr_large(self, size): return self.basic_test_repr(size) @@ -1069,11 +1057,11 @@ self.assertEqual(s[-5:], '0, 0]') self.assertEqual(s.count('0'), size) - @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G // 3 + 2, memuse=8 + 3 * ascii_char_size) def test_repr_small(self, size): return self.basic_test_repr(size) - @bigmemtest(size=_2G + 2, memuse=8 + 3 * character_size) + @bigmemtest(size=_2G + 2, memuse=8 + 3 * ascii_char_size) def test_repr_large(self, size): return self.basic_test_repr(size) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 16:07:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 16:07:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_When_expandtabs=28=29_would?= =?utf8?q?_be_a_no-op=2C_don=27t_create_a_duplicate_string?= Message-ID: http://hg.python.org/cpython/rev/447f521ac6d9 changeset: 72663:447f521ac6d9 user: Antoine Pitrou date: Tue Oct 04 16:04:01 2011 +0200 summary: When expandtabs() would be a no-op, don't create a duplicate string files: Lib/test/test_unicode.py | 4 ++++ Objects/unicodeobject.c | 7 +++++++ 2 files changed, 11 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -1585,6 +1585,10 @@ return self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxsize) + def test_expandtabs_optimization(self): + s = 'abc' + self.assertIs(s.expandtabs(), s) + def test_raiseMemError(self): if struct.calcsize('P') == 8: # 64 bits pointers diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10196,6 +10196,7 @@ void *src_data, *dest_data; int tabsize = 8; int kind; + int found; if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) return NULL; @@ -10205,9 +10206,11 @@ i = j = line_pos = 0; kind = PyUnicode_KIND(self); src_data = PyUnicode_DATA(self); + found = 0; for (; i < src_len; i++) { ch = PyUnicode_READ(kind, src_data, i); if (ch == '\t') { + found = 1; if (tabsize > 0) { incr = tabsize - (line_pos % tabsize); /* cannot overflow */ if (j > PY_SSIZE_T_MAX - incr) @@ -10225,6 +10228,10 @@ line_pos = 0; } } + if (!found && PyUnicode_CheckExact(self)) { + Py_INCREF((PyObject *) self); + return (PyObject *) self; + } /* Second pass: create output string and fill it */ u = PyUnicode_New(j, PyUnicode_MAX_CHAR_VALUE(self)); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 16:11:11 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 16:11:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_An_embarassing_litle_typo?= Message-ID: http://hg.python.org/cpython/rev/3daf24c9df50 changeset: 72664:3daf24c9df50 user: Antoine Pitrou date: Tue Oct 04 16:07:27 2011 +0200 summary: An embarassing litle typo files: Lib/test/test_bigmem.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -64,7 +64,7 @@ ascii_char_size = 1 ucs2_char_size = 2 -ucs4_char_size = 2 +ucs4_char_size = 4 class BaseStrTest: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 16:21:48 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 16:21:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Also_fix_pickletester?= Message-ID: http://hg.python.org/cpython/rev/56eb9a509460 changeset: 72665:56eb9a509460 user: Antoine Pitrou date: Tue Oct 04 16:18:15 2011 +0200 summary: Also fix pickletester files: Lib/test/pickletester.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/test/pickletester.py b/Lib/test/pickletester.py --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@ -19,7 +19,7 @@ # kind of outer loop. protocols = range(pickle.HIGHEST_PROTOCOL + 1) -character_size = 4 if sys.maxunicode > 0xFFFF else 2 +ascii_char_size = 1 # Return True if opcode code appears in the pickle, else False. @@ -1235,7 +1235,7 @@ # All protocols use 1-byte per printable ASCII character; we add another # byte because the encoded form has to be copied into the internal buffer. - @bigmemtest(size=_2G, memuse=2 + character_size, dry_run=False) + @bigmemtest(size=_2G, memuse=2 + ascii_char_size, dry_run=False) def test_huge_str_32b(self, size): data = "abcd" * (size // 4) try: @@ -1252,7 +1252,7 @@ # BINUNICODE (protocols 1, 2 and 3) cannot carry more than # 2**32 - 1 bytes of utf-8 encoded unicode. - @bigmemtest(size=_4G, memuse=1 + character_size, dry_run=False) + @bigmemtest(size=_4G, memuse=1 + ascii_char_size, dry_run=False) def test_huge_str_64b(self, size): data = "a" * size try: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 18:06:23 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 04 Oct 2011 18:06:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2313054=3A_fix_usage_of_sy?= =?utf8?q?s=2Emaxunicode_after_PEP-393=2E?= Message-ID: http://hg.python.org/cpython/rev/f39b26ca7f3d changeset: 72666:f39b26ca7f3d user: Ezio Melotti date: Tue Oct 04 19:06:00 2011 +0300 summary: #13054: fix usage of sys.maxunicode after PEP-393. files: Lib/sre_compile.py | 4 +++- Lib/test/test_builtin.py | 3 +-- Lib/test/test_codeccallbacks.py | 16 ++++------------ Lib/test/test_multibytecodec.py | 7 +------ Lib/test/test_unicode.py | 20 ++++---------------- Tools/pybench/pybench.py | 1 + Tools/unicode/comparecodecs.py | 2 +- 7 files changed, 15 insertions(+), 38 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -318,11 +318,13 @@ # XXX: could expand category return charset # cannot compress except IndexError: - # non-BMP characters + # non-BMP characters; XXX now they should work return charset if negate: if sys.maxunicode != 65535: # XXX: negation does not work with big charsets + # XXX2: now they should work, but removing this will make the + # charmap 17 times bigger return charset for i in range(65536): charmap[i] = not charmap[i] diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -249,8 +249,7 @@ self.assertEqual(chr(0xff), '\xff') self.assertRaises(ValueError, chr, 1<<24) self.assertEqual(chr(sys.maxunicode), - str(('\\U%08x' % (sys.maxunicode)).encode("ascii"), - 'unicode-escape')) + str('\\U0010ffff'.encode("ascii"), 'unicode-escape')) self.assertRaises(TypeError, chr) self.assertEqual(chr(0x0000FFFF), "\U0000FFFF") self.assertEqual(chr(0x00010000), "\U00010000") diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -138,22 +138,14 @@ def test_backslashescape(self): # Does the same as the "unicode-escape" encoding, but with different # base encodings. - sin = "a\xac\u1234\u20ac\u8000" - if sys.maxunicode > 0xffff: - sin += chr(sys.maxunicode) - sout = b"a\\xac\\u1234\\u20ac\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sin = "a\xac\u1234\u20ac\u8000\U0010ffff" + sout = b"a\\xac\\u1234\\u20ac\\u8000\\U0010ffff" self.assertEqual(sin.encode("ascii", "backslashreplace"), sout) - sout = b"a\xac\\u1234\\u20ac\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sout = b"a\xac\\u1234\\u20ac\\u8000\\U0010ffff" self.assertEqual(sin.encode("latin-1", "backslashreplace"), sout) - sout = b"a\xac\\u1234\xa4\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sout = b"a\xac\\u1234\xa4\\u8000\\U0010ffff" self.assertEqual(sin.encode("iso-8859-15", "backslashreplace"), sout) def test_decoding_callbacks(self): diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py --- a/Lib/test/test_multibytecodec.py +++ b/Lib/test/test_multibytecodec.py @@ -247,14 +247,9 @@ self.assertFalse(any(x > 0x80 for x in e)) def test_bug1572832(self): - if sys.maxunicode >= 0x10000: - myunichr = chr - else: - myunichr = lambda x: chr(0xD7C0+(x>>10)) + chr(0xDC00+(x&0x3FF)) - for x in range(0x10000, 0x110000): # Any ISO 2022 codec will cause the segfault - myunichr(x).encode('iso_2022_jp', 'ignore') + chr(x).encode('iso_2022_jp', 'ignore') class TestStateful(unittest.TestCase): text = '\u4E16\u4E16' diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -13,10 +13,6 @@ from test import support, string_tests import _string -# decorator to skip tests on narrow builds -requires_wide_build = unittest.skipIf(sys.maxunicode == 65535, - 'requires wide build') - # Error handling (bad decoder return) def search_function(encoding): def decode1(input, errors="strict"): @@ -519,7 +515,6 @@ self.assertFalse(meth(s), '%a.%s() is False' % (s, meth_name)) - @requires_wide_build def test_lower(self): string_tests.CommonTest.test_lower(self) self.assertEqual('\U00010427'.lower(), '\U0001044F') @@ -530,7 +525,6 @@ self.assertEqual('X\U00010427x\U0001044F'.lower(), 'x\U0001044Fx\U0001044F') - @requires_wide_build def test_upper(self): string_tests.CommonTest.test_upper(self) self.assertEqual('\U0001044F'.upper(), '\U00010427') @@ -541,7 +535,6 @@ self.assertEqual('X\U00010427x\U0001044F'.upper(), 'X\U00010427X\U00010427') - @requires_wide_build def test_capitalize(self): string_tests.CommonTest.test_capitalize(self) self.assertEqual('\U0001044F'.capitalize(), '\U00010427') @@ -554,7 +547,6 @@ self.assertEqual('X\U00010427x\U0001044F'.capitalize(), 'X\U0001044Fx\U0001044F') - @requires_wide_build def test_title(self): string_tests.MixinStrUnicodeUserStringTest.test_title(self) self.assertEqual('\U0001044F'.title(), '\U00010427') @@ -569,7 +561,6 @@ self.assertEqual('X\U00010427x\U0001044F X\U00010427x\U0001044F'.title(), 'X\U0001044Fx\U0001044F X\U0001044Fx\U0001044F') - @requires_wide_build def test_swapcase(self): string_tests.CommonTest.test_swapcase(self) self.assertEqual('\U0001044F'.swapcase(), '\U00010427') @@ -1114,15 +1105,12 @@ def test_codecs_utf8(self): self.assertEqual(''.encode('utf-8'), b'') self.assertEqual('\u20ac'.encode('utf-8'), b'\xe2\x82\xac') - if sys.maxunicode == 65535: - self.assertEqual('\ud800\udc02'.encode('utf-8'), b'\xf0\x90\x80\x82') - self.assertEqual('\ud84d\udc56'.encode('utf-8'), b'\xf0\xa3\x91\x96') + self.assertEqual('\U00010002'.encode('utf-8'), b'\xf0\x90\x80\x82') + self.assertEqual('\U00023456'.encode('utf-8'), b'\xf0\xa3\x91\x96') self.assertEqual('\ud800'.encode('utf-8', 'surrogatepass'), b'\xed\xa0\x80') self.assertEqual('\udc00'.encode('utf-8', 'surrogatepass'), b'\xed\xb0\x80') - if sys.maxunicode == 65535: - self.assertEqual( - ('\ud800\udc02'*1000).encode('utf-8'), - b'\xf0\x90\x80\x82'*1000) + self.assertEqual(('\U00010002'*10).encode('utf-8'), + b'\xf0\x90\x80\x82'*10) self.assertEqual( '\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f' '\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00' diff --git a/Tools/pybench/pybench.py b/Tools/pybench/pybench.py --- a/Tools/pybench/pybench.py +++ b/Tools/pybench/pybench.py @@ -107,6 +107,7 @@ print('Getting machine details...') buildno, builddate = platform.python_build() python = platform.python_version() + # XXX this is now always UCS4, maybe replace it with 'PEP393' in 3.3+? if sys.maxunicode == 65535: # UCS2 build (standard) unitype = 'UCS2' diff --git a/Tools/unicode/comparecodecs.py b/Tools/unicode/comparecodecs.py --- a/Tools/unicode/comparecodecs.py +++ b/Tools/unicode/comparecodecs.py @@ -14,7 +14,7 @@ print('Comparing encoding/decoding of %r and %r' % (encoding1, encoding2)) mismatch = 0 # Check encoding - for i in range(sys.maxunicode): + for i in range(sys.maxunicode+1): u = chr(i) try: c1 = u.encode(encoding1) -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Tue Oct 4 18:45:55 2011 From: martin at v.loewis.de (=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?=) Date: Tue, 04 Oct 2011 18:45:55 +0200 Subject: [Python-checkins] cpython: Migrate str.expandtabs to the new API In-Reply-To: References: Message-ID: <4E8B3843.4030505@v.loewis.de> > Migrate str.expandtabs to the new API This needs if (PyUnicode_READY(self) == -1) return NULL; right after the ParseTuple call. In most cases, the check will be a noop. But if it's not, omitting it will make expandtabs have no effect, since the string length will be 0 (in a debug build, you also get an assertion failure). Regards, Martin From python-checkins at python.org Tue Oct 4 19:15:57 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 19:15:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_string_slicing_to_?= =?utf8?q?use_the_new_API?= Message-ID: http://hg.python.org/cpython/rev/1b4f886dc9e2 changeset: 72667:1b4f886dc9e2 parent: 72665:56eb9a509460 user: Antoine Pitrou date: Tue Oct 04 19:08:01 2011 +0200 summary: Optimize string slicing to use the new API files: Objects/unicodeobject.c | 36 +++++++++++++--------------- 1 files changed, 17 insertions(+), 19 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12253,9 +12253,9 @@ return unicode_getitem((PyObject*)self, i); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, cur, i; - const Py_UNICODE* source_buf; - Py_UNICODE* result_buf; - PyObject* result; + PyObject *result; + void *src_data, *dest_data; + int kind; if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), &start, &stop, &step, &slicelength) < 0) { @@ -12272,22 +12272,20 @@ } else if (step == 1) { return PyUnicode_Substring((PyObject*)self, start, start + slicelength); - } else { - source_buf = PyUnicode_AS_UNICODE((PyObject*)self); - result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength* - sizeof(Py_UNICODE)); - - if (result_buf == NULL) - return PyErr_NoMemory(); - - for (cur = start, i = 0; i < slicelength; cur += step, i++) { - result_buf[i] = source_buf[cur]; - } - - result = PyUnicode_FromUnicode(result_buf, slicelength); - PyObject_FREE(result_buf); - return result; - } + } + /* General (less optimized) case */ + result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); + if (result == NULL) + return NULL; + kind = PyUnicode_KIND(self); + src_data = PyUnicode_DATA(self); + dest_data = PyUnicode_DATA(result); + + for (cur = start, i = 0; i < slicelength; cur += step, i++) { + Py_UCS4 ch = PyUnicode_READ(kind, src_data, cur); + PyUnicode_WRITE(kind, dest_data, i, ch); + } + return result; } else { PyErr_SetString(PyExc_TypeError, "string indices must be integers"); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 19:15:58 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 19:15:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_a_necessary_call_to_PyU?= =?utf8?q?nicode=5FREADY=28=29_=28followup_to_ab5086539ab9=29?= Message-ID: http://hg.python.org/cpython/rev/e6cc71820bf3 changeset: 72668:e6cc71820bf3 user: Antoine Pitrou date: Tue Oct 04 19:10:51 2011 +0200 summary: Add a necessary call to PyUnicode_READY() (followup to ab5086539ab9) files: Objects/unicodeobject.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10201,6 +10201,9 @@ if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) return NULL; + if (PyUnicode_READY(self) == -1) + return NULL; + /* First pass: determine size of output string */ src_len = PyUnicode_GET_LENGTH(self); i = j = line_pos = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 19:15:58 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 19:15:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/ec6ee2a82583 changeset: 72669:ec6ee2a82583 parent: 72668:e6cc71820bf3 parent: 72666:f39b26ca7f3d user: Antoine Pitrou date: Tue Oct 04 19:11:34 2011 +0200 summary: Merge files: Lib/sre_compile.py | 4 +++- Lib/test/test_builtin.py | 3 +-- Lib/test/test_codeccallbacks.py | 16 ++++------------ Lib/test/test_multibytecodec.py | 7 +------ Lib/test/test_unicode.py | 20 ++++---------------- Tools/pybench/pybench.py | 1 + Tools/unicode/comparecodecs.py | 2 +- 7 files changed, 15 insertions(+), 38 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -318,11 +318,13 @@ # XXX: could expand category return charset # cannot compress except IndexError: - # non-BMP characters + # non-BMP characters; XXX now they should work return charset if negate: if sys.maxunicode != 65535: # XXX: negation does not work with big charsets + # XXX2: now they should work, but removing this will make the + # charmap 17 times bigger return charset for i in range(65536): charmap[i] = not charmap[i] diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -249,8 +249,7 @@ self.assertEqual(chr(0xff), '\xff') self.assertRaises(ValueError, chr, 1<<24) self.assertEqual(chr(sys.maxunicode), - str(('\\U%08x' % (sys.maxunicode)).encode("ascii"), - 'unicode-escape')) + str('\\U0010ffff'.encode("ascii"), 'unicode-escape')) self.assertRaises(TypeError, chr) self.assertEqual(chr(0x0000FFFF), "\U0000FFFF") self.assertEqual(chr(0x00010000), "\U00010000") diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -138,22 +138,14 @@ def test_backslashescape(self): # Does the same as the "unicode-escape" encoding, but with different # base encodings. - sin = "a\xac\u1234\u20ac\u8000" - if sys.maxunicode > 0xffff: - sin += chr(sys.maxunicode) - sout = b"a\\xac\\u1234\\u20ac\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sin = "a\xac\u1234\u20ac\u8000\U0010ffff" + sout = b"a\\xac\\u1234\\u20ac\\u8000\\U0010ffff" self.assertEqual(sin.encode("ascii", "backslashreplace"), sout) - sout = b"a\xac\\u1234\\u20ac\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sout = b"a\xac\\u1234\\u20ac\\u8000\\U0010ffff" self.assertEqual(sin.encode("latin-1", "backslashreplace"), sout) - sout = b"a\xac\\u1234\xa4\\u8000" - if sys.maxunicode > 0xffff: - sout += bytes("\\U%08x" % sys.maxunicode, "ascii") + sout = b"a\xac\\u1234\xa4\\u8000\\U0010ffff" self.assertEqual(sin.encode("iso-8859-15", "backslashreplace"), sout) def test_decoding_callbacks(self): diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py --- a/Lib/test/test_multibytecodec.py +++ b/Lib/test/test_multibytecodec.py @@ -247,14 +247,9 @@ self.assertFalse(any(x > 0x80 for x in e)) def test_bug1572832(self): - if sys.maxunicode >= 0x10000: - myunichr = chr - else: - myunichr = lambda x: chr(0xD7C0+(x>>10)) + chr(0xDC00+(x&0x3FF)) - for x in range(0x10000, 0x110000): # Any ISO 2022 codec will cause the segfault - myunichr(x).encode('iso_2022_jp', 'ignore') + chr(x).encode('iso_2022_jp', 'ignore') class TestStateful(unittest.TestCase): text = '\u4E16\u4E16' diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -13,10 +13,6 @@ from test import support, string_tests import _string -# decorator to skip tests on narrow builds -requires_wide_build = unittest.skipIf(sys.maxunicode == 65535, - 'requires wide build') - # Error handling (bad decoder return) def search_function(encoding): def decode1(input, errors="strict"): @@ -519,7 +515,6 @@ self.assertFalse(meth(s), '%a.%s() is False' % (s, meth_name)) - @requires_wide_build def test_lower(self): string_tests.CommonTest.test_lower(self) self.assertEqual('\U00010427'.lower(), '\U0001044F') @@ -530,7 +525,6 @@ self.assertEqual('X\U00010427x\U0001044F'.lower(), 'x\U0001044Fx\U0001044F') - @requires_wide_build def test_upper(self): string_tests.CommonTest.test_upper(self) self.assertEqual('\U0001044F'.upper(), '\U00010427') @@ -541,7 +535,6 @@ self.assertEqual('X\U00010427x\U0001044F'.upper(), 'X\U00010427X\U00010427') - @requires_wide_build def test_capitalize(self): string_tests.CommonTest.test_capitalize(self) self.assertEqual('\U0001044F'.capitalize(), '\U00010427') @@ -554,7 +547,6 @@ self.assertEqual('X\U00010427x\U0001044F'.capitalize(), 'X\U0001044Fx\U0001044F') - @requires_wide_build def test_title(self): string_tests.MixinStrUnicodeUserStringTest.test_title(self) self.assertEqual('\U0001044F'.title(), '\U00010427') @@ -569,7 +561,6 @@ self.assertEqual('X\U00010427x\U0001044F X\U00010427x\U0001044F'.title(), 'X\U0001044Fx\U0001044F X\U0001044Fx\U0001044F') - @requires_wide_build def test_swapcase(self): string_tests.CommonTest.test_swapcase(self) self.assertEqual('\U0001044F'.swapcase(), '\U00010427') @@ -1114,15 +1105,12 @@ def test_codecs_utf8(self): self.assertEqual(''.encode('utf-8'), b'') self.assertEqual('\u20ac'.encode('utf-8'), b'\xe2\x82\xac') - if sys.maxunicode == 65535: - self.assertEqual('\ud800\udc02'.encode('utf-8'), b'\xf0\x90\x80\x82') - self.assertEqual('\ud84d\udc56'.encode('utf-8'), b'\xf0\xa3\x91\x96') + self.assertEqual('\U00010002'.encode('utf-8'), b'\xf0\x90\x80\x82') + self.assertEqual('\U00023456'.encode('utf-8'), b'\xf0\xa3\x91\x96') self.assertEqual('\ud800'.encode('utf-8', 'surrogatepass'), b'\xed\xa0\x80') self.assertEqual('\udc00'.encode('utf-8', 'surrogatepass'), b'\xed\xb0\x80') - if sys.maxunicode == 65535: - self.assertEqual( - ('\ud800\udc02'*1000).encode('utf-8'), - b'\xf0\x90\x80\x82'*1000) + self.assertEqual(('\U00010002'*10).encode('utf-8'), + b'\xf0\x90\x80\x82'*10) self.assertEqual( '\u6b63\u78ba\u306b\u8a00\u3046\u3068\u7ffb\u8a33\u306f' '\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4e00' diff --git a/Tools/pybench/pybench.py b/Tools/pybench/pybench.py --- a/Tools/pybench/pybench.py +++ b/Tools/pybench/pybench.py @@ -107,6 +107,7 @@ print('Getting machine details...') buildno, builddate = platform.python_build() python = platform.python_version() + # XXX this is now always UCS4, maybe replace it with 'PEP393' in 3.3+? if sys.maxunicode == 65535: # UCS2 build (standard) unitype = 'UCS2' diff --git a/Tools/unicode/comparecodecs.py b/Tools/unicode/comparecodecs.py --- a/Tools/unicode/comparecodecs.py +++ b/Tools/unicode/comparecodecs.py @@ -14,7 +14,7 @@ print('Comparing encoding/decoding of %r and %r' % (encoding1, encoding2)) mismatch = 0 # Check encoding - for i in range(sys.maxunicode): + for i in range(sys.maxunicode+1): u = chr(i) try: c1 = u.encode(encoding1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 19:17:50 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 19:17:50 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzExOTU2?= =?utf8?q?=3A_Skip_test=5Fimport=2Etest=5Funwritable=5Fdirectory_on_FreeBS?= =?utf8?q?D_when_run_as?= Message-ID: http://hg.python.org/cpython/rev/7697223df6df changeset: 72670:7697223df6df branch: 3.2 parent: 72658:2484b2b8876e user: Charles-Fran?ois Natali date: Tue Oct 04 19:17:26 2011 +0200 summary: Issue #11956: Skip test_import.test_unwritable_directory on FreeBSD when run as root (directory permissions are ignored). files: Lib/test/test_import.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -4,6 +4,7 @@ from importlib.test.import_ import util as importlib_util import marshal import os +import platform import py_compile import random import stat @@ -546,6 +547,8 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") + @unittest.skipIf(platform.system() == 'FreeBSD' and os.geteuid() == 0, + "due to non-standard filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be # unwritable, the import still succeeds but no .pyc file is written. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 19:17:51 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 19:17:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2311956=3A_Skip_test=5Fimport=2Etest=5Funwritable=5Fd?= =?utf8?q?irectory_on_FreeBSD_when_run_as?= Message-ID: http://hg.python.org/cpython/rev/58870fe9a604 changeset: 72671:58870fe9a604 parent: 72666:f39b26ca7f3d parent: 72670:7697223df6df user: Charles-Fran?ois Natali date: Tue Oct 04 19:19:21 2011 +0200 summary: Issue #11956: Skip test_import.test_unwritable_directory on FreeBSD when run as root (directory permissions are ignored). files: Lib/test/test_import.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -4,6 +4,7 @@ from importlib.test.import_ import util as importlib_util import marshal import os +import platform import py_compile import random import stat @@ -544,6 +545,8 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") + @unittest.skipIf(platform.system() == 'FreeBSD' and os.geteuid() == 0, + "due to non-standard filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be # unwritable, the import still succeeds but no .pyc file is written. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 19:17:52 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 19:17:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2Uu?= Message-ID: http://hg.python.org/cpython/rev/eb6a33791fdf changeset: 72672:eb6a33791fdf parent: 72671:58870fe9a604 parent: 72669:ec6ee2a82583 user: Charles-Fran?ois Natali date: Tue Oct 04 19:20:52 2011 +0200 summary: Merge. files: Objects/unicodeobject.c | 39 ++++++++++++++-------------- 1 files changed, 20 insertions(+), 19 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10201,6 +10201,9 @@ if (!PyArg_ParseTuple(args, "|i:expandtabs", &tabsize)) return NULL; + if (PyUnicode_READY(self) == -1) + return NULL; + /* First pass: determine size of output string */ src_len = PyUnicode_GET_LENGTH(self); i = j = line_pos = 0; @@ -12253,9 +12256,9 @@ return unicode_getitem((PyObject*)self, i); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, cur, i; - const Py_UNICODE* source_buf; - Py_UNICODE* result_buf; - PyObject* result; + PyObject *result; + void *src_data, *dest_data; + int kind; if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), &start, &stop, &step, &slicelength) < 0) { @@ -12272,22 +12275,20 @@ } else if (step == 1) { return PyUnicode_Substring((PyObject*)self, start, start + slicelength); - } else { - source_buf = PyUnicode_AS_UNICODE((PyObject*)self); - result_buf = (Py_UNICODE *)PyObject_MALLOC(slicelength* - sizeof(Py_UNICODE)); - - if (result_buf == NULL) - return PyErr_NoMemory(); - - for (cur = start, i = 0; i < slicelength; cur += step, i++) { - result_buf[i] = source_buf[cur]; - } - - result = PyUnicode_FromUnicode(result_buf, slicelength); - PyObject_FREE(result_buf); - return result; - } + } + /* General (less optimized) case */ + result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); + if (result == NULL) + return NULL; + kind = PyUnicode_KIND(self); + src_data = PyUnicode_DATA(self); + dest_data = PyUnicode_DATA(result); + + for (cur = start, i = 0; i < slicelength; cur += step, i++) { + Py_UCS4 ch = PyUnicode_READ(kind, src_data, cur); + PyUnicode_WRITE(kind, dest_data, i, ch); + } + return result; } else { PyErr_SetString(PyExc_TypeError, "string indices must be integers"); return NULL; -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Tue Oct 4 19:49:09 2011 From: martin at v.loewis.de (=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?=) Date: Tue, 04 Oct 2011 19:49:09 +0200 Subject: [Python-checkins] cpython: Optimize string slicing to use the new API In-Reply-To: References: Message-ID: <4E8B4715.6020907@v.loewis.de> > + result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); This is incorrect: the maxchar of the slice might be smaller than the maxchar of the input string. So you'll need to iterate over the input string first, compute the maxchar, and then allocate the result string. Or you allocate a temporary buffer of (1<<(kind-1)) * slicelength bytes, copy the slice, allocate the target object with PyUnicode_FromKindAndData, and release the temporary buffer. Regards, Martin From solipsis at pitrou.net Tue Oct 4 19:50:30 2011 From: solipsis at pitrou.net (Antoine Pitrou) Date: Tue, 4 Oct 2011 19:50:30 +0200 Subject: [Python-checkins] cpython: Optimize string slicing to use the new API References: <4E8B4715.6020907@v.loewis.de> Message-ID: <20111004195030.6ecaf999@pitrou.net> On Tue, 04 Oct 2011 19:49:09 +0200 "Martin v. L?wis" wrote: > > + result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); > > This is incorrect: the maxchar of the slice might be smaller than the > maxchar of the input string. I thought that heuristic would be good enough. I'll try to fix it. Regards Antoine. From python-checkins at python.org Tue Oct 4 20:08:56 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 04 Oct 2011 20:08:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_na=C3=AFve_heuristic_in?= =?utf8?q?_unicode_slicing_=28followup_to_1b4f886dc9e2=29?= Message-ID: http://hg.python.org/cpython/rev/981deff56707 changeset: 72673:981deff56707 user: Antoine Pitrou date: Tue Oct 04 20:00:49 2011 +0200 summary: Fix na?ve heuristic in unicode slicing (followup to 1b4f886dc9e2) files: Objects/unicodeobject.c | 22 +++++++++++++++------- 1 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12258,7 +12258,8 @@ Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *result; void *src_data, *dest_data; - int kind; + int src_kind, dest_kind; + Py_UCS4 ch, max_char; if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), &start, &stop, &step, &slicelength) < 0) { @@ -12276,17 +12277,24 @@ return PyUnicode_Substring((PyObject*)self, start, start + slicelength); } - /* General (less optimized) case */ - result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); + /* General case */ + max_char = 127; + src_kind = PyUnicode_KIND(self); + src_data = PyUnicode_DATA(self); + for (cur = start, i = 0; i < slicelength; cur += step, i++) { + ch = PyUnicode_READ(src_kind, src_data, cur); + if (ch > max_char) + max_char = ch; + } + result = PyUnicode_New(slicelength, max_char); if (result == NULL) return NULL; - kind = PyUnicode_KIND(self); - src_data = PyUnicode_DATA(self); + dest_kind = PyUnicode_KIND(result); dest_data = PyUnicode_DATA(result); for (cur = start, i = 0; i < slicelength; cur += step, i++) { - Py_UCS4 ch = PyUnicode_READ(kind, src_data, cur); - PyUnicode_WRITE(kind, dest_data, i, ch); + Py_UCS4 ch = PyUnicode_READ(src_kind, src_data, cur); + PyUnicode_WRITE(dest_kind, dest_data, i, ch); } return result; } else { -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Tue Oct 4 20:09:06 2011 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Tue, 04 Oct 2011 20:09:06 +0200 Subject: [Python-checkins] cpython: Optimize string slicing to use the new API In-Reply-To: <20111004195030.6ecaf999@pitrou.net> References: <4E8B4715.6020907@v.loewis.de> <20111004195030.6ecaf999@pitrou.net> Message-ID: <4E8B4BC2.8030804@v.loewis.de> Am 04.10.11 19:50, schrieb Antoine Pitrou: > On Tue, 04 Oct 2011 19:49:09 +0200 > "Martin v. L?wis" wrote: > >>> + result = PyUnicode_New(slicelength, PyUnicode_MAX_CHAR_VALUE(self)); >> >> This is incorrect: the maxchar of the slice might be smaller than the >> maxchar of the input string. > > I thought that heuristic would be good enough. I'll try to fix it. No - strings must always be in the canonical form. For example, PyUnicode_RichCompare considers string unequal if they have different kinds. As a consequence, your slice result may not compare equal to a canonical variant of itself. From python-checkins at python.org Tue Oct 4 20:40:50 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 20:40:50 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzExOTU2?= =?utf8?q?=3A_Always_skip_test=5Fimport=2Etest=5Funwritable=5Fdirectory_wh?= =?utf8?q?en_run_as?= Message-ID: http://hg.python.org/cpython/rev/cbda512c6d7f changeset: 72674:cbda512c6d7f branch: 3.2 parent: 72670:7697223df6df user: Charles-Fran?ois Natali date: Tue Oct 04 20:40:58 2011 +0200 summary: Issue #11956: Always skip test_import.test_unwritable_directory when run as root, since the semantics varies across Unix variants. files: Lib/test/test_import.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -547,8 +547,8 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") - @unittest.skipIf(platform.system() == 'FreeBSD' and os.geteuid() == 0, - "due to non-standard filesystem permission semantics (issue #11956)") + @unittest.skipIf(os.geteuid() == 0, + "due to varying filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be # unwritable, the import still succeeds but no .pyc file is written. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 20:40:51 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 20:40:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2311956=3A_Always_skip_test=5Fimport=2Etest=5Funwrita?= =?utf8?q?ble=5Fdirectory_when_run_as?= Message-ID: http://hg.python.org/cpython/rev/971093a75613 changeset: 72675:971093a75613 parent: 72673:981deff56707 parent: 72674:cbda512c6d7f user: Charles-Fran?ois Natali date: Tue Oct 04 20:41:52 2011 +0200 summary: Issue #11956: Always skip test_import.test_unwritable_directory when run as root, since the semantics varies across Unix variants. files: Lib/test/test_import.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -545,8 +545,8 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") - @unittest.skipIf(platform.system() == 'FreeBSD' and os.geteuid() == 0, - "due to non-standard filesystem permission semantics (issue #11956)") + @unittest.skipIf(os.geteuid() == 0, + "due to varying filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be # unwritable, the import still succeeds but no .pyc file is written. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 20:52:53 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 20:52:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_assertion_to_=5FPy=5FRe?= =?utf8?q?leaseInternedUnicodeStrings=28=29_if_READY_fails?= Message-ID: http://hg.python.org/cpython/rev/3e721c405093 changeset: 72676:3e721c405093 user: Victor Stinner date: Tue Oct 04 20:04:52 2011 +0200 summary: Add assertion to _Py_ReleaseInternedUnicodeStrings() if READY fails files: Objects/unicodeobject.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13131,7 +13131,7 @@ if (PyUnicode_CHECK_INTERNED(s)) return; if (_PyUnicode_READY_REPLACE(p)) { - assert(0 && "PyUnicode_READY fail in PyUnicode_InternInPlace"); + assert(0 && "_PyUnicode_READY_REPLACE fail in PyUnicode_InternInPlace"); return; } s = (PyUnicodeObject *)(*p); @@ -13217,8 +13217,10 @@ n); for (i = 0; i < n; i++) { s = (PyUnicodeObject *) PyList_GET_ITEM(keys, i); - if (PyUnicode_READY(s) == -1) + if (PyUnicode_READY(s) == -1) { + assert(0 && "could not ready string"); fprintf(stderr, "could not ready string\n"); + } switch (PyUnicode_CHECK_INTERNED(s)) { case SSTATE_NOT_INTERNED: /* XXX Shouldn't happen */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 20:52:53 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 20:52:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_DONT=5FMAKE=5FRESULT=5F?= =?utf8?q?READY_to_unicodeobject=2Ec_to_help_detecting_bugs?= Message-ID: http://hg.python.org/cpython/rev/411c0734cf48 changeset: 72677:411c0734cf48 user: Victor Stinner date: Tue Oct 04 20:05:46 2011 +0200 summary: Add DONT_MAKE_RESULT_READY to unicodeobject.c to help detecting bugs Use also _PyUnicode_READY_REPLACE() when it's applicable. files: Objects/unicodeobject.c | 30 +++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2625,10 +2625,12 @@ goto onError; } Py_DECREF(buffer); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return unicode; onError: @@ -3674,10 +3676,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -4244,10 +4248,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -4747,10 +4753,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -5145,10 +5153,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -5604,10 +5614,12 @@ } Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; ucnhashError: @@ -5905,10 +5917,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6093,10 +6107,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6519,10 +6535,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6713,10 +6731,12 @@ goto retry; } #endif +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; } @@ -7012,10 +7032,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -8057,10 +8079,12 @@ p[i] = '0' + decimal; } } - if (PyUnicode_READY((PyUnicodeObject*)result) == -1) { +#ifndef DONT_MAKE_RESULT_READY + if (_PyUnicode_READY_REPLACE(&result)) { Py_DECREF(result); return NULL; } +#endif return result; } /* --- Decimal Encoder ---------------------------------------------------- */ @@ -10265,10 +10289,12 @@ } } assert (j == PyUnicode_GET_LENGTH(u)); - if (PyUnicode_READY(u)) { +#ifndef DONT_MAKE_RESULT_READY + if (_PyUnicode_READY_REPLACE(&u)) { Py_DECREF(u); return NULL; } +#endif return (PyObject*) u; overflow: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 20:52:54 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 20:52:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPyUnicode=5FREADY=5FREPL?= =?utf8?q?ACE=28=29_cannot_be_used_in_unicode=5Fsubtype=5Fnew=28=29?= Message-ID: http://hg.python.org/cpython/rev/a81f5ced46a8 changeset: 72678:a81f5ced46a8 user: Victor Stinner date: Tue Oct 04 20:52:31 2011 +0200 summary: _PyUnicode_READY_REPLACE() cannot be used in unicode_subtype_new() files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12949,7 +12949,7 @@ if (unicode == NULL) return NULL; assert(_PyUnicode_CHECK(unicode)); - if (_PyUnicode_READY_REPLACE(&unicode)) + if (PyUnicode_READY(unicode)) return NULL; self = (PyUnicodeObject *) type->tp_alloc(type, 0); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 20:52:55 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 04 Oct 2011 20:52:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_usage_og_PyUnicode=5FRE?= =?utf8?b?QURZKCk=?= Message-ID: http://hg.python.org/cpython/rev/b66033a0f140 changeset: 72679:b66033a0f140 user: Victor Stinner date: Tue Oct 04 20:53:03 2011 +0200 summary: Fix usage og PyUnicode_READY() files: Modules/_io/stringio.c | 4 ++++ Objects/unicodeobject.c | 14 +++++++++----- Python/getargs.c | 21 ++++++++++++++------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -131,6 +131,10 @@ return -1; assert(PyUnicode_Check(decoded)); + if (PyUnicode_READY(decoded)) { + Py_DECREF(decoded); + return -1; + } len = PyUnicode_GET_LENGTH(decoded); assert(len >= 0); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2120,6 +2120,10 @@ str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace"); if (!str_obj) goto fail; + if (PyUnicode_READY(str_obj)) { + Py_DECREF(str_obj); + goto fail; + } argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj); maxchar = Py_MAX(maxchar, argmaxchar); n += PyUnicode_GET_LENGTH(str_obj); @@ -10062,17 +10066,17 @@ goto error; } + if (PyUnicode_READY(left)) + goto error; + if (PyUnicode_READY(right)) + goto error; + if (PyUnicode_CheckExact(left) && left != unicode_empty && PyUnicode_CheckExact(right) && right != unicode_empty && unicode_resizable(left) && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) || _PyUnicode_WSTR(left) != NULL)) { - if (PyUnicode_READY(left)) - goto error; - if (PyUnicode_READY(right)) - goto error; - /* Don't resize for ascii += latin1. Convert ascii to latin1 requires to change the structure size, but characters are stored just after the structure, and so it requires to move all charactres which is diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -834,14 +834,21 @@ case 'C': {/* unicode char */ int *p = va_arg(*p_va, int *); - if (PyUnicode_Check(arg) && - PyUnicode_GET_LENGTH(arg) == 1) { - int kind = PyUnicode_KIND(arg); - void *data = PyUnicode_DATA(arg); - *p = PyUnicode_READ(kind, data, 0); - } - else + int kind; + void *data; + + if (!PyUnicode_Check(arg)) return converterr("a unicode character", arg, msgbuf, bufsize); + + if (PyUnicode_READY(arg)) + RETURN_ERR_OCCURRED; + + if (PyUnicode_GET_LENGTH(arg) != 1) + return converterr("a unicode character", arg, msgbuf, bufsize); + + kind = PyUnicode_KIND(arg); + data = PyUnicode_DATA(arg); + *p = PyUnicode_READ(kind, data, 0); break; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 23:34:46 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 23:34:46 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogb3MuZ2V0ZXVpZCgp?= =?utf8?q?_may_not_be_available=2E=2E=2E?= Message-ID: http://hg.python.org/cpython/rev/7a2127ca6c8a changeset: 72680:7a2127ca6c8a branch: 3.2 parent: 72674:cbda512c6d7f user: Charles-Fran?ois Natali date: Tue Oct 04 23:35:47 2011 +0200 summary: os.geteuid() may not be available... files: Lib/test/test_import.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -547,7 +547,7 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") - @unittest.skipIf(os.geteuid() == 0, + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "due to varying filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 23:34:47 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 23:34:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_os=2Egeteuid=28=29_may_not_be_available=2E=2E=2E?= Message-ID: http://hg.python.org/cpython/rev/08dd0f9b79fa changeset: 72681:08dd0f9b79fa parent: 72675:971093a75613 parent: 72680:7a2127ca6c8a user: Charles-Fran?ois Natali date: Tue Oct 04 23:36:49 2011 +0200 summary: os.geteuid() may not be available... files: Lib/test/test_import.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -545,7 +545,7 @@ @unittest.skipUnless(os.name == 'posix', "test meaningful only on posix systems") - @unittest.skipIf(os.geteuid() == 0, + @unittest.skipIf(hasattr(os, 'geteuid') and os.geteuid() == 0, "due to varying filesystem permission semantics (issue #11956)") def test_unwritable_directory(self): # When the umask causes the new __pycache__ directory to be -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 4 23:34:48 2011 From: python-checkins at python.org (charles-francois.natali) Date: Tue, 04 Oct 2011 23:34:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2Uu?= Message-ID: http://hg.python.org/cpython/rev/f62c13f5e689 changeset: 72682:f62c13f5e689 parent: 72681:08dd0f9b79fa parent: 72679:b66033a0f140 user: Charles-Fran?ois Natali date: Tue Oct 04 23:37:43 2011 +0200 summary: Merge. files: Modules/_io/stringio.c | 4 ++ Objects/unicodeobject.c | 52 +++++++++++++++++++++++----- Python/getargs.c | 21 +++++++--- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -131,6 +131,10 @@ return -1; assert(PyUnicode_Check(decoded)); + if (PyUnicode_READY(decoded)) { + Py_DECREF(decoded); + return -1; + } len = PyUnicode_GET_LENGTH(decoded); assert(len >= 0); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2120,6 +2120,10 @@ str_obj = PyUnicode_DecodeUTF8(str, strlen(str), "replace"); if (!str_obj) goto fail; + if (PyUnicode_READY(str_obj)) { + Py_DECREF(str_obj); + goto fail; + } argmaxchar = PyUnicode_MAX_CHAR_VALUE(str_obj); maxchar = Py_MAX(maxchar, argmaxchar); n += PyUnicode_GET_LENGTH(str_obj); @@ -2625,10 +2629,12 @@ goto onError; } Py_DECREF(buffer); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return unicode; onError: @@ -3674,10 +3680,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -4244,10 +4252,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -4747,10 +4757,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -5145,10 +5157,12 @@ Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&unicode)) { Py_DECREF(unicode); return NULL; } +#endif return (PyObject *)unicode; onError: @@ -5604,10 +5618,12 @@ } Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; ucnhashError: @@ -5905,10 +5921,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6093,10 +6111,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6519,10 +6539,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -6713,10 +6735,12 @@ goto retry; } #endif +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; } @@ -7012,10 +7036,12 @@ goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); +#ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); return NULL; } +#endif return (PyObject *)v; onError: @@ -8057,10 +8083,12 @@ p[i] = '0' + decimal; } } - if (PyUnicode_READY((PyUnicodeObject*)result) == -1) { +#ifndef DONT_MAKE_RESULT_READY + if (_PyUnicode_READY_REPLACE(&result)) { Py_DECREF(result); return NULL; } +#endif return result; } /* --- Decimal Encoder ---------------------------------------------------- */ @@ -10038,17 +10066,17 @@ goto error; } + if (PyUnicode_READY(left)) + goto error; + if (PyUnicode_READY(right)) + goto error; + if (PyUnicode_CheckExact(left) && left != unicode_empty && PyUnicode_CheckExact(right) && right != unicode_empty && unicode_resizable(left) && (_PyUnicode_KIND(right) <= _PyUnicode_KIND(left) || _PyUnicode_WSTR(left) != NULL)) { - if (PyUnicode_READY(left)) - goto error; - if (PyUnicode_READY(right)) - goto error; - /* Don't resize for ascii += latin1. Convert ascii to latin1 requires to change the structure size, but characters are stored just after the structure, and so it requires to move all charactres which is @@ -10265,10 +10293,12 @@ } } assert (j == PyUnicode_GET_LENGTH(u)); - if (PyUnicode_READY(u)) { +#ifndef DONT_MAKE_RESULT_READY + if (_PyUnicode_READY_REPLACE(&u)) { Py_DECREF(u); return NULL; } +#endif return (PyObject*) u; overflow: @@ -12923,7 +12953,7 @@ if (unicode == NULL) return NULL; assert(_PyUnicode_CHECK(unicode)); - if (_PyUnicode_READY_REPLACE(&unicode)) + if (PyUnicode_READY(unicode)) return NULL; self = (PyUnicodeObject *) type->tp_alloc(type, 0); @@ -13131,7 +13161,7 @@ if (PyUnicode_CHECK_INTERNED(s)) return; if (_PyUnicode_READY_REPLACE(p)) { - assert(0 && "PyUnicode_READY fail in PyUnicode_InternInPlace"); + assert(0 && "_PyUnicode_READY_REPLACE fail in PyUnicode_InternInPlace"); return; } s = (PyUnicodeObject *)(*p); @@ -13217,8 +13247,10 @@ n); for (i = 0; i < n; i++) { s = (PyUnicodeObject *) PyList_GET_ITEM(keys, i); - if (PyUnicode_READY(s) == -1) + if (PyUnicode_READY(s) == -1) { + assert(0 && "could not ready string"); fprintf(stderr, "could not ready string\n"); + } switch (PyUnicode_CHECK_INTERNED(s)) { case SSTATE_NOT_INTERNED: /* XXX Shouldn't happen */ diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -834,14 +834,21 @@ case 'C': {/* unicode char */ int *p = va_arg(*p_va, int *); - if (PyUnicode_Check(arg) && - PyUnicode_GET_LENGTH(arg) == 1) { - int kind = PyUnicode_KIND(arg); - void *data = PyUnicode_DATA(arg); - *p = PyUnicode_READ(kind, data, 0); - } - else + int kind; + void *data; + + if (!PyUnicode_Check(arg)) return converterr("a unicode character", arg, msgbuf, bufsize); + + if (PyUnicode_READY(arg)) + RETURN_ERR_OCCURRED; + + if (PyUnicode_GET_LENGTH(arg) != 1) + return converterr("a unicode character", arg, msgbuf, bufsize); + + kind = PyUnicode_KIND(arg); + data = PyUnicode_DATA(arg); + *p = PyUnicode_READ(kind, data, 0); break; } -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 5 05:26:02 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 05 Oct 2011 05:26:02 +0200 Subject: [Python-checkins] Daily reference leaks (f62c13f5e689): sum=0 Message-ID: results for f62c13f5e689 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflognfw3pH', '-x'] From python-checkins at python.org Wed Oct 5 13:05:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 05 Oct 2011 13:05:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_text_failures_when_ctyp?= =?utf8?q?es_is_not_available?= Message-ID: http://hg.python.org/cpython/rev/da3bfa2e9daa changeset: 72683:da3bfa2e9daa user: Antoine Pitrou date: Wed Oct 05 13:01:41 2011 +0200 summary: Fix text failures when ctypes is not available (followup to Victor's 85d11cf67aa8 and 7a50e549bd11) files: Lib/test/test_codeccallbacks.py | 58 +++++++++++--------- Lib/test/test_codecs.py | 9 ++- 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/Lib/test/test_codeccallbacks.py b/Lib/test/test_codeccallbacks.py --- a/Lib/test/test_codeccallbacks.py +++ b/Lib/test/test_codeccallbacks.py @@ -1,8 +1,13 @@ import test.support, unittest import sys, codecs, html.entities, unicodedata -import ctypes -SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar) +try: + import ctypes +except ImportError: + ctypes = None + SIZEOF_WCHAR_T = -1 +else: + SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar) class PosReturn: # this can be used for configurable callbacks @@ -572,33 +577,34 @@ UnicodeEncodeError("ascii", "\uffff", 0, 1, "ouch")), ("\\uffff", 1) ) - if ctypes.sizeof(ctypes.c_wchar) == 2: + if SIZEOF_WCHAR_T == 2: len_wide = 2 else: len_wide = 1 - self.assertEqual( - codecs.backslashreplace_errors( - UnicodeEncodeError("ascii", "\U00010000", - 0, len_wide, "ouch")), - ("\\U00010000", len_wide) - ) - self.assertEqual( - codecs.backslashreplace_errors( - UnicodeEncodeError("ascii", "\U0010ffff", - 0, len_wide, "ouch")), - ("\\U0010ffff", len_wide) - ) - # Lone surrogates (regardless of unicode width) - self.assertEqual( - codecs.backslashreplace_errors( - UnicodeEncodeError("ascii", "\ud800", 0, 1, "ouch")), - ("\\ud800", 1) - ) - self.assertEqual( - codecs.backslashreplace_errors( - UnicodeEncodeError("ascii", "\udfff", 0, 1, "ouch")), - ("\\udfff", 1) - ) + if SIZEOF_WCHAR_T > 0: + self.assertEqual( + codecs.backslashreplace_errors( + UnicodeEncodeError("ascii", "\U00010000", + 0, len_wide, "ouch")), + ("\\U00010000", len_wide) + ) + self.assertEqual( + codecs.backslashreplace_errors( + UnicodeEncodeError("ascii", "\U0010ffff", + 0, len_wide, "ouch")), + ("\\U0010ffff", len_wide) + ) + # Lone surrogates (regardless of unicode width) + self.assertEqual( + codecs.backslashreplace_errors( + UnicodeEncodeError("ascii", "\ud800", 0, 1, "ouch")), + ("\\ud800", 1) + ) + self.assertEqual( + codecs.backslashreplace_errors( + UnicodeEncodeError("ascii", "\udfff", 0, 1, "ouch")), + ("\\udfff", 1) + ) def test_badhandlerresults(self): results = ( 42, "foo", (1,2,3), ("foo", 1, 3), ("foo", None), ("foo",), ("foo", 1, 3), ("foo", None), ("foo",) ) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -3,9 +3,14 @@ import codecs import locale import sys, _testcapi, io -import ctypes -SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar) +try: + import ctypes +except ImportError: + ctypes = None + SIZEOF_WCHAR_T = -1 +else: + SIZEOF_WCHAR_T = ctypes.sizeof(ctypes.c_wchar) class Queue(object): """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 14:13:31 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 14:13:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Speedup_the_ASCII_decoder?= Message-ID: http://hg.python.org/cpython/rev/392cfd37e312 changeset: 72684:392cfd37e312 user: Victor Stinner date: Wed Oct 05 13:50:52 2011 +0200 summary: Speedup the ASCII decoder It is faster for long string and a little bit faster for short strings, benchmark on Linux 32 bits, Intel Core i5 @ 3.33GHz: ./python -m timeit 'x=b"a"' 'x.decode("ascii")' ./python -m timeit 'x=b"x"*80' 'x.decode("ascii")' ./python -m timeit 'x=b"abc"*4096' 'x.decode("ascii")' length | before | after -------+------------+----------- 1 | 0.234 usec | 0.229 usec 80 | 0.381 usec | 0.357 usec 12,288 | 11.2 usec | 3.01 usec files: Objects/unicodeobject.c | 82 +++++++++++++++++++--------- 1 files changed, 54 insertions(+), 28 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1515,6 +1515,16 @@ } static PyObject* +unicode_fromascii(const unsigned char* u, Py_ssize_t size) +{ + PyObject *res = PyUnicode_New(size, 127); + if (!res) + return NULL; + memcpy(PyUnicode_1BYTE_DATA(res), u, size); + return res; +} + +static PyObject* _PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size) { PyObject *res; @@ -6477,65 +6487,81 @@ { const char *starts = s; PyUnicodeObject *v; - Py_UNICODE *p; + Py_UNICODE *u; Py_ssize_t startinpos; Py_ssize_t endinpos; Py_ssize_t outpos; const char *e; - unsigned char* d; + int has_error; + const unsigned char *p = (const unsigned char *)s; + const unsigned char *end = p + size; + const unsigned char *aligned_end = (const unsigned char *) ((size_t) end & ~LONG_PTR_MASK); PyObject *errorHandler = NULL; PyObject *exc = NULL; - Py_ssize_t i; /* ASCII is equivalent to the first 128 ordinals in Unicode. */ - if (size == 1 && *(unsigned char*)s < 128) - return PyUnicode_FromOrdinal(*(unsigned char*)s); - - /* Fast path. Assume the input actually *is* ASCII, and allocate - a single-block Unicode object with that assumption. If there is - an error, drop the object and start over. */ - v = (PyUnicodeObject*)PyUnicode_New(size, 127); - if (v == NULL) - goto onError; - d = PyUnicode_1BYTE_DATA(v); - for (i = 0; i < size; i++) { - unsigned char ch = ((unsigned char*)s)[i]; - if (ch < 128) - d[i] = ch; - else + if (size == 1 && (unsigned char)s[0] < 128) + return get_latin1_char((unsigned char)s[0]); + + has_error = 0; + while (p < end && !has_error) { + /* Fast path, see below in PyUnicode_DecodeUTF8Stateful for + an explanation. */ + if (!((size_t) p & LONG_PTR_MASK)) { + /* Help register allocation */ + register const unsigned char *_p = p; + while (_p < aligned_end) { + unsigned long value = *(unsigned long *) _p; + if (value & ASCII_CHAR_MASK) { + has_error = 1; + break; + } + _p += SIZEOF_LONG; + } + if (_p == end) + break; + if (has_error) + break; + p = _p; + } + if (*p & 0x80) { + has_error = 1; break; - } - if (i == size) - return (PyObject*)v; - Py_DECREF(v); /* start over */ + } + else { + ++p; + } + } + if (!has_error) + return unicode_fromascii((const unsigned char *)s, size); v = _PyUnicode_New(size); if (v == NULL) goto onError; if (size == 0) return (PyObject *)v; - p = PyUnicode_AS_UNICODE(v); + u = PyUnicode_AS_UNICODE(v); e = s + size; while (s < e) { register unsigned char c = (unsigned char)*s; if (c < 128) { - *p++ = c; + *u++ = c; ++s; } else { startinpos = s-starts; endinpos = startinpos + 1; - outpos = p - (Py_UNICODE *)PyUnicode_AS_UNICODE(v); + outpos = u - (Py_UNICODE *)PyUnicode_AS_UNICODE(v); if (unicode_decode_call_errorhandler( errors, &errorHandler, "ascii", "ordinal not in range(128)", &starts, &e, &startinpos, &endinpos, &exc, &s, - &v, &outpos, &p)) + &v, &outpos, &u)) goto onError; } } - if (p - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) - if (PyUnicode_Resize((PyObject**)&v, p - PyUnicode_AS_UNICODE(v)) < 0) + if (u - PyUnicode_AS_UNICODE(v) < PyUnicode_GET_SIZE(v)) + if (PyUnicode_Resize((PyObject**)&v, u - PyUnicode_AS_UNICODE(v)) < 0) goto onError; Py_XDECREF(errorHandler); Py_XDECREF(exc); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 14:13:32 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 14:13:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Speedup_str=5Ba=3Ab=5D_and_?= =?utf8?q?PyUnicode=5FFromKindAndData?= Message-ID: http://hg.python.org/cpython/rev/61ca5262b6c4 changeset: 72685:61ca5262b6c4 user: Victor Stinner date: Wed Oct 05 14:01:42 2011 +0200 summary: Speedup str[a:b] and PyUnicode_FromKindAndData * str[a:b] doesn't scan the string for the maximum character if the string is ascii only * PyUnicode_FromKindAndData() stops if we are sure that we cannot use a shorter character type. For example, _PyUnicode_FromUCS1() stops if we have at least one character in range U+0080-U+00FF files: Include/unicodeobject.h | 2 + Objects/unicodeobject.c | 78 ++++++++++++++++++---------- 2 files changed, 52 insertions(+), 28 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -654,6 +654,8 @@ const char *u /* UTF-8 encoded string */ ); +/* Create a new string from a buffer of Py_UCS1, Py_UCS2 or Py_UCS4 characters. + Scan the string to find the maximum character. */ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject*) PyUnicode_FromKindAndData( int kind, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -969,7 +969,7 @@ if (from_kind == to_kind /* deny latin1 => ascii */ - && PyUnicode_MAX_CHAR_VALUE(to) >= PyUnicode_MAX_CHAR_VALUE(from)) + && !(!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to))) { Py_MEMCPY((char*)to_data + PyUnicode_KIND_SIZE(to_kind, to_start), @@ -1013,9 +1013,7 @@ /* check if max_char(from substring) <= max_char(to) */ if (from_kind > to_kind /* latin1 => ascii */ - || (PyUnicode_IS_ASCII(to) - && to_kind == PyUnicode_1BYTE_KIND - && !PyUnicode_IS_ASCII(from))) + || (!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to))) { /* slow path to check for character overflow */ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); @@ -1528,15 +1526,17 @@ _PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size) { PyObject *res; - unsigned char max = 127; + unsigned char max_char = 127; Py_ssize_t i; + + assert(size >= 0); for (i = 0; i < size; i++) { if (u[i] & 0x80) { - max = 255; + max_char = 255; break; } } - res = PyUnicode_New(size, max); + res = PyUnicode_New(size, max_char); if (!res) return NULL; memcpy(PyUnicode_1BYTE_DATA(res), u, size); @@ -1547,15 +1547,21 @@ _PyUnicode_FromUCS2(const Py_UCS2 *u, Py_ssize_t size) { PyObject *res; - Py_UCS2 max = 0; + Py_UCS2 max_char = 0; Py_ssize_t i; - for (i = 0; i < size; i++) - if (u[i] > max) - max = u[i]; - res = PyUnicode_New(size, max); + + assert(size >= 0); + for (i = 0; i < size; i++) { + if (u[i] > max_char) { + max_char = u[i]; + if (max_char >= 256) + break; + } + } + res = PyUnicode_New(size, max_char); if (!res) return NULL; - if (max >= 256) + if (max_char >= 256) memcpy(PyUnicode_2BYTE_DATA(res), u, sizeof(Py_UCS2)*size); else for (i = 0; i < size; i++) @@ -1567,15 +1573,21 @@ _PyUnicode_FromUCS4(const Py_UCS4 *u, Py_ssize_t size) { PyObject *res; - Py_UCS4 max = 0; + Py_UCS4 max_char = 0; Py_ssize_t i; - for (i = 0; i < size; i++) - if (u[i] > max) - max = u[i]; - res = PyUnicode_New(size, max); + + assert(size >= 0); + for (i = 0; i < size; i++) { + if (u[i] > max_char) { + max_char = u[i]; + if (max_char >= 0x10000) + break; + } + } + res = PyUnicode_New(size, max_char); if (!res) return NULL; - if (max >= 0x10000) + if (max_char >= 0x10000) memcpy(PyUnicode_4BYTE_DATA(res), u, sizeof(Py_UCS4)*size); else { int kind = PyUnicode_KIND(res); @@ -1596,9 +1608,11 @@ return _PyUnicode_FromUCS2(buffer, size); case PyUnicode_4BYTE_KIND: return _PyUnicode_FromUCS4(buffer, size); - } - PyErr_SetString(PyExc_SystemError, "invalid kind"); - return NULL; + default: + assert(0 && "invalid kind"); + PyErr_SetString(PyExc_SystemError, "invalid kind"); + return NULL; + } } PyObject* @@ -9383,11 +9397,12 @@ maxchar = PyUnicode_MAX_CHAR_VALUE(self); /* Replacing u1 with u2 may cause a maxchar reduction in the result string. */ - mayshrink = maxchar > 127; if (u2 > maxchar) { maxchar = u2; mayshrink = 0; } + else + mayshrink = maxchar > 127; u = PyUnicode_New(slen, maxchar); if (!u) goto error; @@ -11039,11 +11054,18 @@ return NULL; } - kind = PyUnicode_KIND(self); - data = PyUnicode_1BYTE_DATA(self); - return PyUnicode_FromKindAndData(kind, - data + PyUnicode_KIND_SIZE(kind, start), - length); + if (PyUnicode_IS_ASCII(self)) { + kind = PyUnicode_KIND(self); + data = PyUnicode_1BYTE_DATA(self); + return unicode_fromascii(data + start, length); + } + else { + kind = PyUnicode_KIND(self); + data = PyUnicode_1BYTE_DATA(self); + return PyUnicode_FromKindAndData(kind, + data + PyUnicode_KIND_SIZE(kind, start), + length); + } } static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 14:13:33 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 14:13:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Speedup_find=5Fmaxchar=5Fsu?= =?utf8?q?rrogates=28=29_for_32-bit_wchar=5Ft?= Message-ID: http://hg.python.org/cpython/rev/b8d4c4a89065 changeset: 72686:b8d4c4a89065 user: Victor Stinner date: Wed Oct 05 14:02:44 2011 +0200 summary: Speedup find_maxchar_surrogates() for 32-bit wchar_t If we have at least one character in U+10000-U+10FFFF, we know that we must use PyUnicode_4BYTE_KIND kind. files: Objects/unicodeobject.c | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1060,19 +1060,17 @@ const wchar_t *iter; assert(num_surrogates != NULL && maxchar != NULL); - if (num_surrogates == NULL || maxchar == NULL) { - PyErr_SetString(PyExc_SystemError, - "unexpected NULL arguments to " - "PyUnicode_FindMaxCharAndNumSurrogatePairs"); - return -1; - } - *num_surrogates = 0; *maxchar = 0; for (iter = begin; iter < end; ) { - if (*iter > *maxchar) + if (*iter > *maxchar) { *maxchar = *iter; +#if SIZEOF_WCHAR_T != 2 + if (*maxchar >= 0x10000) + return 0; +#endif + } #if SIZEOF_WCHAR_T == 2 if (*iter >= 0xD800 && *iter <= 0xDBFF && (iter+1) < end && iter[1] >= 0xDC00 && iter[1] <= 0xDFFF) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 14:13:34 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 14:13:34 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Speedup_str=5Ba=3Ab=3Astep?= =?utf8?q?=5D_for_step_!=3D_1?= Message-ID: http://hg.python.org/cpython/rev/ceffb5751d52 changeset: 72687:ceffb5751d52 user: Victor Stinner date: Wed Oct 05 14:13:28 2011 +0200 summary: Speedup str[a:b:step] for step != 1 Try to stop the scanner of the maximum character before the end using a limit depending on the kind (e.g. 256 for PyUnicode_2BYTE_KIND). files: Objects/unicodeobject.c | 26 +++++++++++++++++++++++--- 1 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1520,6 +1520,22 @@ return res; } +static Py_UCS4 +kind_maxchar_limit(unsigned int kind) +{ + switch(kind) { + case PyUnicode_1BYTE_KIND: + return 0x80; + case PyUnicode_2BYTE_KIND: + return 0x100; + case PyUnicode_4BYTE_KIND: + return 0x10000; + default: + assert(0 && "invalid kind"); + return 0x10ffff; + } +} + static PyObject* _PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size) { @@ -12335,7 +12351,7 @@ PyObject *result; void *src_data, *dest_data; int src_kind, dest_kind; - Py_UCS4 ch, max_char; + Py_UCS4 ch, max_char, kind_limit; if (PySlice_GetIndicesEx(item, PyUnicode_GET_LENGTH(self), &start, &stop, &step, &slicelength) < 0) { @@ -12354,13 +12370,17 @@ start, start + slicelength); } /* General case */ - max_char = 127; + max_char = 0; src_kind = PyUnicode_KIND(self); + kind_limit = kind_maxchar_limit(src_kind); src_data = PyUnicode_DATA(self); for (cur = start, i = 0; i < slicelength; cur += step, i++) { ch = PyUnicode_READ(src_kind, src_data, cur); - if (ch > max_char) + if (ch > max_char) { max_char = ch; + if (max_char >= kind_limit) + break; + } } result = PyUnicode_New(slicelength, max_char); if (result == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 16:12:19 2011 From: python-checkins at python.org (georg.brandl) Date: Wed, 05 Oct 2011 16:12:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_grammar=2E?= Message-ID: http://hg.python.org/cpython/rev/6d4701a0e76b changeset: 72688:6d4701a0e76b user: Georg Brandl date: Wed Oct 05 16:12:21 2011 +0200 summary: Fix grammar. files: Include/unicodeobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -426,7 +426,7 @@ #define PyUnicode_CHARACTER_SIZE(op) \ (1 << (PyUnicode_KIND(op) - 1)) -/* Return pointers to the canonical representation casted as unsigned char, +/* Return pointers to the canonical representation cast to unsigned char, Py_UCS2, or Py_UCS4 for direct character access. No checks are performed, use PyUnicode_CHARACTER_SIZE or PyUnicode_KIND() before to ensure these will work correctly. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 16:24:01 2011 From: python-checkins at python.org (georg.brandl) Date: Wed, 05 Oct 2011 16:24:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_few_typos_in_the_unic?= =?utf8?q?ode_header=2E?= Message-ID: http://hg.python.org/cpython/rev/aa79b4e62c38 changeset: 72689:aa79b4e62c38 user: Georg Brandl date: Wed Oct 05 16:23:09 2011 +0200 summary: Fix a few typos in the unicode header. files: Include/unicodeobject.h | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -85,7 +85,7 @@ /* Py_UNICODE was the native Unicode storage format (code unit) used by Python and represents a single Unicode element in the Unicode type. - With PEP 393, Py_UNICODE is deprected and replaced with a + With PEP 393, Py_UNICODE is deprecated and replaced with a typedef to wchar_t. */ #ifndef Py_LIMITED_API @@ -115,7 +115,7 @@ # include #endif -/* Py_UCS4 and Py_UCS2 are typdefs for the respecitve +/* Py_UCS4 and Py_UCS2 are typedefs for the respective unicode representations. */ #if SIZEOF_INT >= 4 typedef unsigned int Py_UCS4; @@ -313,7 +313,7 @@ } PyASCIIObject; /* Non-ASCII strings allocated through PyUnicode_New use the - PyCompactUnicodeOject structure. state.compact is set, and the data + PyCompactUnicodeObject structure. state.compact is set, and the data immediately follow the structure. */ typedef struct { PyASCIIObject _base; @@ -382,7 +382,7 @@ ((const char *)(PyUnicode_AS_UNICODE(op))) -/* --- Flexible String Representaion Helper Macros (PEP 393) -------------- */ +/* --- Flexible String Representation Helper Macros (PEP 393) -------------- */ /* Values for PyUnicodeObject.state: */ @@ -468,9 +468,9 @@ /* Write into the canonical representation, this macro does not do any sanity checks and is intended for usage in loops. The caller should cache the - kind and data pointers optained form other macro calls. + kind and data pointers obtained form other macro calls. index is the index in the string (starts at 0) and value is the new - code point value which shoule be written to that location. */ + code point value which should be written to that location. */ #define PyUnicode_WRITE(kind, data, index, value) \ do { \ switch ((kind)) { \ @@ -542,7 +542,7 @@ /* Return a maximum character value which is suitable for creating another string based on op. This is always an approximation but more efficient - than interating over the string. */ + than iterating over the string. */ #define PyUnicode_MAX_CHAR_VALUE(op) \ (assert(PyUnicode_IS_READY(op)), \ (PyUnicode_IS_COMPACT_ASCII(op) ? 0x7f: \ @@ -936,8 +936,8 @@ In case of an error, no *size is set. - This funcation caches the UTF-8 encoded string in the unicodeobject - and subsequent calls will return the same string. The memory is relased + This function caches the UTF-8 encoded string in the unicodeobject + and subsequent calls will return the same string. The memory is released when the unicodeobject is deallocated. _PyUnicode_AsStringAndSize is a #define for PyUnicode_AsUTF8AndSize to @@ -1587,7 +1587,7 @@ These are capable of handling Unicode objects and strings on input (we refer to them as strings in the descriptions) and return - Unicode objects or integers as apporpriate. */ + Unicode objects or integers as appropriate. */ /* Concat two strings giving a new Unicode string. */ @@ -1767,7 +1767,7 @@ /* Rich compare two strings and return one of the following: - NULL in case an exception was raised - - Py_True or Py_False for successfuly comparisons + - Py_True or Py_False for successfully comparisons - Py_NotImplemented in case the type combination is unknown Note that Py_EQ and Py_NE comparisons can cause a UnicodeWarning in -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 16:36:44 2011 From: python-checkins at python.org (georg.brandl) Date: Wed, 05 Oct 2011 16:36:44 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_typoes=2E?= Message-ID: http://hg.python.org/cpython/rev/63ac488538cb changeset: 72690:63ac488538cb user: Georg Brandl date: Wed Oct 05 16:36:47 2011 +0200 summary: More typoes. files: Objects/unicodeobject.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -881,7 +881,7 @@ #if SIZEOF_WCHAR_T == 2 /* Helper function to convert a 16-bits wchar_t representation to UCS4, this will decode surrogate pairs, the other conversions are implemented as macros - for efficency. + for efficiency. This function assumes that unicode can hold one more code point than wstr characters for a terminating null character. */ @@ -1110,7 +1110,7 @@ assert(p_obj != NULL); unicode = (PyUnicodeObject *)*p_obj; - /* _PyUnicode_Ready() is only intented for old-style API usage where + /* _PyUnicode_Ready() is only intended for old-style API usage where strings were created using _PyObject_New() and where no canonical representation (the str field) has been set yet aka strings which are not yet ready. */ @@ -1950,8 +1950,8 @@ * (we call PyObject_Str()/PyObject_Repr()/PyObject_ASCII()/ * PyUnicode_DecodeUTF8() for these objects once during step 3 and put the * result in an array) - * also esimate a upper bound for all the number formats in the string, - * numbers will be formated in step 3 and be keept in a '\0'-separated + * also estimate a upper bound for all the number formats in the string, + * numbers will be formatted in step 3 and be kept in a '\0'-separated * buffer before putting everything together. */ for (f = format; *f; f++) { if (*f == '%') { @@ -3967,7 +3967,7 @@ err = 1; } /* Instead of number of overall bytes for this code point, - n containts the number of following bytes: */ + n contains the number of following bytes: */ --n; /* Check if the follow up chars are all valid continuation bytes */ if (n >= 1) { @@ -8982,7 +8982,7 @@ sep = separator; seplen = PyUnicode_GET_LENGTH(separator); maxchar = PyUnicode_MAX_CHAR_VALUE(separator); - /* inc refcount to keep this code path symetric with the + /* inc refcount to keep this code path symmetric with the above case of a blank separator */ Py_INCREF(sep); } @@ -10134,7 +10134,7 @@ { /* Don't resize for ascii += latin1. Convert ascii to latin1 requires to change the structure size, but characters are stored just after - the structure, and so it requires to move all charactres which is + the structure, and so it requires to move all characters which is not so different than duplicating the string. */ if (!(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right))) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 16:47:34 2011 From: python-checkins at python.org (georg.brandl) Date: Wed, 05 Oct 2011 16:47:34 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_fixes=2E?= Message-ID: http://hg.python.org/cpython/rev/c2127d79f7c1 changeset: 72691:c2127d79f7c1 user: Georg Brandl date: Wed Oct 05 16:47:38 2011 +0200 summary: More fixes. files: Include/unicodeobject.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -468,7 +468,7 @@ /* Write into the canonical representation, this macro does not do any sanity checks and is intended for usage in loops. The caller should cache the - kind and data pointers obtained form other macro calls. + kind and data pointers obtained from other macro calls. index is the index in the string (starts at 0) and value is the new code point value which should be written to that location. */ #define PyUnicode_WRITE(kind, data, index, value) \ @@ -489,7 +489,7 @@ } \ } while (0) -/* Read a code point form the string's canonical representation. No checks +/* Read a code point from the string's canonical representation. No checks or ready calls are performed. */ #define PyUnicode_READ(kind, data, index) \ ((Py_UCS4) \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 17:27:51 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 05 Oct 2011 17:27:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue__=2313073?= =?utf8?q?_-_Address_the_review_comments_made_by_Ezio=2E?= Message-ID: http://hg.python.org/cpython/rev/befa7b926aad changeset: 72692:befa7b926aad branch: 3.2 parent: 72680:7a2127ca6c8a user: Senthil Kumaran date: Wed Oct 05 23:26:49 2011 +0800 summary: Issue #13073 - Address the review comments made by Ezio. files: Doc/library/http.client.rst | 9 ++++----- Lib/http/client.py | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -475,11 +475,10 @@ .. method:: HTTPConnection.endheaders(message_body=None) Send a blank line to the server, signalling the end of the headers. The - optional message_body argument can be used to pass message body - associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. - + optional *message_body* argument can be used to pass a message body + associated with the request. The message body will be sent in the same + packet as the message headers if it is string, otherwise it is sent in a + separate packet. .. method:: HTTPConnection.send(data) diff --git a/Lib/http/client.py b/Lib/http/client.py --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -947,11 +947,11 @@ def endheaders(self, message_body=None): """Indicate that the last header line has been sent to the server. - This method sends the request to the server. The optional - message_body argument can be used to pass message body - associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. + This method sends the request to the server. The optional message_body + argument can be used to pass a message body associated with the + request. The message body will be sent in the same packet as the + message headers if it is a string, otherwise it is sent as a separate + packet. """ if self.__state == _CS_REQ_STARTED: self.__state = _CS_REQ_SENT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 17:27:52 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 05 Oct 2011 17:27:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2=2E_Issue__=2313073_-_Address_the_review_com?= =?utf8?q?ments_made_by_Ezio=2E?= Message-ID: http://hg.python.org/cpython/rev/a7b7ba225de7 changeset: 72693:a7b7ba225de7 parent: 72691:c2127d79f7c1 parent: 72692:befa7b926aad user: Senthil Kumaran date: Wed Oct 05 23:27:37 2011 +0800 summary: merge from 3.2. Issue #13073 - Address the review comments made by Ezio. files: Doc/library/http.client.rst | 9 ++++----- Lib/http/client.py | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -475,11 +475,10 @@ .. method:: HTTPConnection.endheaders(message_body=None) Send a blank line to the server, signalling the end of the headers. The - optional message_body argument can be used to pass message body - associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. - + optional *message_body* argument can be used to pass a message body + associated with the request. The message body will be sent in the same + packet as the message headers if it is string, otherwise it is sent in a + separate packet. .. method:: HTTPConnection.send(data) diff --git a/Lib/http/client.py b/Lib/http/client.py --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -947,11 +947,11 @@ def endheaders(self, message_body=None): """Indicate that the last header line has been sent to the server. - This method sends the request to the server. The optional - message_body argument can be used to pass message body - associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. + This method sends the request to the server. The optional message_body + argument can be used to pass a message body associated with the + request. The message body will be sent in the same packet as the + message headers if it is a string, otherwise it is sent as a separate + packet. """ if self.__state == _CS_REQ_STARTED: self.__state = _CS_REQ_SENT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 17:53:11 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 05 Oct 2011 17:53:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue13073_-_Ad?= =?utf8?q?dress_review_comments_and_add_versionchanged_information_in_the?= Message-ID: http://hg.python.org/cpython/rev/64fae6f7b64c changeset: 72694:64fae6f7b64c branch: 2.7 parent: 72660:504981afa007 user: Senthil Kumaran date: Wed Oct 05 23:52:49 2011 +0800 summary: Issue13073 - Address review comments and add versionchanged information in the docs. files: Doc/library/httplib.rst | 13 ++++++++----- Lib/httplib.py | 6 +++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Doc/library/httplib.rst b/Doc/library/httplib.rst --- a/Doc/library/httplib.rst +++ b/Doc/library/httplib.rst @@ -494,11 +494,14 @@ .. method:: HTTPConnection.endheaders(message_body=None) - Send a blank line to the server, signalling the end of the headers. - The optional message_body argument can be used to pass message body - associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. + Send a blank line to the server, signalling the end of the headers. The + optional *message_body* argument can be used to pass a message body + associated with the request. The message body will be sent in the same + packet as the message headers if it is string, otherwise it is sent in a + separate packet. + + .. versionchanged:: 2.7 + *message_body* was added. .. method:: HTTPConnection.send(data) diff --git a/Lib/httplib.py b/Lib/httplib.py --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -939,10 +939,10 @@ """Indicate that the last header line has been sent to the server. This method sends the request to the server. The optional - message_body argument can be used to pass message body + message_body argument can be used to pass a message body associated with the request. The message body will be sent in - the same packet as the message headers if possible. The - message_body should be a string. + the same packet as the message headers if it is string, otherwise it is + sent as a separate packet. """ if self.__state == _CS_REQ_STARTED: self.__state = _CS_REQ_SENT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 18:33:07 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 05 Oct 2011 18:33:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue13104_-_Fi?= =?utf8?q?x_urllib=2Erequest=2Ethishost=28=29_utility_function=2E?= Message-ID: http://hg.python.org/cpython/rev/805a0a1e3c2b changeset: 72695:805a0a1e3c2b branch: 3.2 parent: 72692:befa7b926aad user: Senthil Kumaran date: Thu Oct 06 00:32:02 2011 +0800 summary: Issue13104 - Fix urllib.request.thishost() utility function. files: Lib/test/test_urllib.py | 4 ++++ Lib/urllib/request.py | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1058,6 +1058,10 @@ self.assertEqual(('user', 'a\vb'),urllib.parse.splitpasswd('user:a\vb')) self.assertEqual(('user', 'a:b'),urllib.parse.splitpasswd('user:a:b')) + def test_thishost(self): + """Test the urllib.request.thishost utility function returns a tuple""" + self.assertIsInstance(urllib.request.thishost(), tuple) + class URLopener_Tests(unittest.TestCase): """Testcase to test the open method of URLopener class.""" diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2116,7 +2116,7 @@ """Return the IP addresses of the current host.""" global _thishost if _thishost is None: - _thishost = tuple(socket.gethostbyname_ex(socket.gethostname()[2])) + _thishost = tuple(socket.gethostbyname_ex(socket.gethostname())[2]) return _thishost _ftperrors = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 18:33:08 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 05 Oct 2011 18:33:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2=2E__Issue13104_-_Fix_urllib=2Erequest=2Ethi?= =?utf8?q?shost=28=29_utility_function=2E?= Message-ID: http://hg.python.org/cpython/rev/a228e59ad693 changeset: 72696:a228e59ad693 parent: 72693:a7b7ba225de7 parent: 72695:805a0a1e3c2b user: Senthil Kumaran date: Thu Oct 06 00:32:52 2011 +0800 summary: merge from 3.2. Issue13104 - Fix urllib.request.thishost() utility function. files: Lib/test/test_urllib.py | 4 ++++ Lib/urllib/request.py | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1058,6 +1058,10 @@ self.assertEqual(('user', 'a\vb'),urllib.parse.splitpasswd('user:a\vb')) self.assertEqual(('user', 'a:b'),urllib.parse.splitpasswd('user:a:b')) + def test_thishost(self): + """Test the urllib.request.thishost utility function returns a tuple""" + self.assertIsInstance(urllib.request.thishost(), tuple) + class URLopener_Tests(unittest.TestCase): """Testcase to test the open method of URLopener class.""" diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -2125,7 +2125,7 @@ """Return the IP addresses of the current host.""" global _thishost if _thishost is None: - _thishost = tuple(socket.gethostbyname_ex(socket.gethostname()[2])) + _thishost = tuple(socket.gethostbyname_ex(socket.gethostname())[2]) return _thishost _ftperrors = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:43:09 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 19:43:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicodeobject=2Ec_doesn=27t?= =?utf8?q?_make_output_strings_ready_in_debug_mode?= Message-ID: http://hg.python.org/cpython/rev/78a2374e1d83 changeset: 72697:78a2374e1d83 user: Victor Stinner date: Wed Oct 05 00:42:43 2011 +0200 summary: unicodeobject.c doesn't make output strings ready in debug mode Try to only create non ready strings in debug mode to ensure that all functions (not only in unicodeobject.c, everywhere) make input strings ready. files: Objects/unicodeobject.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -46,6 +46,10 @@ #include #endif +#ifdef Py_DEBUG +# define DONT_MAKE_RESULT_READY +#endif + /* Limit for the Unicode object free list */ #define PyUnicode_MAXFREELIST 1024 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:43:10 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 19:43:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_PyUnicodeObject*_wi?= =?utf8?q?th_PyObject*_where_it_was_inappropriate?= Message-ID: http://hg.python.org/cpython/rev/5564bcb0035e changeset: 72698:5564bcb0035e user: Victor Stinner date: Wed Oct 05 00:59:23 2011 +0200 summary: Replace PyUnicodeObject* with PyObject* where it was inappropriate files: Objects/unicodeobject.c | 84 ++++++++++++++-------------- 1 files changed, 42 insertions(+), 42 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -432,7 +432,7 @@ /* --- Unicode Object ----------------------------------------------------- */ static PyObject * -fixup(PyUnicodeObject *self, Py_UCS4 (*fixfct)(PyUnicodeObject *s)); +fixup(PyObject *self, Py_UCS4 (*fixfct)(PyObject *s)); Py_LOCAL_INLINE(char *) findchar(void *s, int kind, Py_ssize_t size, Py_UCS4 ch, @@ -8066,7 +8066,7 @@ } static Py_UCS4 -fix_decimal_and_space_to_ascii(PyUnicodeObject *self) +fix_decimal_and_space_to_ascii(PyObject *self) { /* No need to call PyUnicode_READY(self) because this function is only called as a callback from fixup() which does it already. */ @@ -8116,7 +8116,7 @@ Py_INCREF(unicode); return unicode; } - return fixup((PyUnicodeObject *)unicode, fix_decimal_and_space_to_ascii); + return fixup(unicode, fix_decimal_and_space_to_ascii); } PyObject * @@ -8661,8 +8661,8 @@ reference to the modified object */ static PyObject * -fixup(PyUnicodeObject *self, - Py_UCS4 (*fixfct)(PyUnicodeObject *s)) +fixup(PyObject *self, + Py_UCS4 (*fixfct)(PyObject *s)) { PyObject *u; Py_UCS4 maxchar_old, maxchar_new = 0; @@ -8682,7 +8682,7 @@ if the kind of the resulting unicode object does not change, everything is fine. Otherwise we need to change the string kind and re-run the fix function. */ - maxchar_new = fixfct((PyUnicodeObject*)u); + maxchar_new = fixfct(u); if (maxchar_new == 0) /* do nothing, keep maxchar_new at 0 which means no changes. */; else if (maxchar_new <= 127) @@ -8724,7 +8724,7 @@ Py_DECREF(u); return NULL; } - maxchar_old = fixfct((PyUnicodeObject*)v); + maxchar_old = fixfct(v); assert(maxchar_old > 0 && maxchar_old <= maxchar_new); } else { @@ -8743,7 +8743,7 @@ } static Py_UCS4 -fixupper(PyUnicodeObject *self) +fixupper(PyObject *self) { /* No need to call PyUnicode_READY(self) because this function is only called as a callback from fixup() which does it already. */ @@ -8774,7 +8774,7 @@ } static Py_UCS4 -fixlower(PyUnicodeObject *self) +fixlower(PyObject *self) { /* No need to call PyUnicode_READY(self) because fixup() which does it. */ const Py_ssize_t len = PyUnicode_GET_LENGTH(self); @@ -8804,7 +8804,7 @@ } static Py_UCS4 -fixswapcase(PyUnicodeObject *self) +fixswapcase(PyObject *self) { /* No need to call PyUnicode_READY(self) because fixup() which does it. */ const Py_ssize_t len = PyUnicode_GET_LENGTH(self); @@ -8840,7 +8840,7 @@ } static Py_UCS4 -fixcapitalize(PyUnicodeObject *self) +fixcapitalize(PyObject *self) { /* No need to call PyUnicode_READY(self) because fixup() which does it. */ const Py_ssize_t len = PyUnicode_GET_LENGTH(self); @@ -8881,7 +8881,7 @@ } static Py_UCS4 -fixtitle(PyUnicodeObject *self) +fixtitle(PyObject *self) { /* No need to call PyUnicode_READY(self) because fixup() which does it. */ const Py_ssize_t len = PyUnicode_GET_LENGTH(self); @@ -9093,8 +9093,8 @@ } \ } while (0) -static PyUnicodeObject * -pad(PyUnicodeObject *self, +static PyObject * +pad(PyObject *self, Py_ssize_t left, Py_ssize_t right, Py_UCS4 fill) @@ -9178,8 +9178,8 @@ } static PyObject * -split(PyUnicodeObject *self, - PyUnicodeObject *substring, +split(PyObject *self, + PyObject *substring, Py_ssize_t maxcount) { int kind1, kind2, kind; @@ -9260,8 +9260,8 @@ } static PyObject * -rsplit(PyUnicodeObject *self, - PyUnicodeObject *substring, +rsplit(PyObject *self, + PyObject *substring, Py_ssize_t maxcount) { int kind1, kind2, kind; @@ -9639,7 +9639,7 @@ characters, all remaining cased characters have lower case."); static PyObject* -unicode_title(PyUnicodeObject *self) +unicode_title(PyObject *self) { return fixup(self, fixtitle); } @@ -9651,7 +9651,7 @@ have upper case and the rest lower case."); static PyObject* -unicode_capitalize(PyUnicodeObject *self) +unicode_capitalize(PyObject *self) { return fixup(self, fixcapitalize); } @@ -9726,7 +9726,7 @@ done using the specified fill character (default is a space)"); static PyObject * -unicode_center(PyUnicodeObject *self, PyObject *args) +unicode_center(PyObject *self, PyObject *args) { Py_ssize_t marg, left; Py_ssize_t width; @@ -9746,7 +9746,7 @@ marg = width - _PyUnicode_LENGTH(self); left = marg / 2 + (marg & width & 1); - return (PyObject*) pad(self, left, marg - left, fillchar); + return pad(self, left, marg - left, fillchar); } #if 0 @@ -10963,7 +10963,7 @@ done using the specified fill character (default is a space)."); static PyObject * -unicode_ljust(PyUnicodeObject *self, PyObject *args) +unicode_ljust(PyObject *self, PyObject *args) { Py_ssize_t width; Py_UCS4 fillchar = ' '; @@ -10988,7 +10988,7 @@ Return a copy of the string S converted to lowercase."); static PyObject* -unicode_lower(PyUnicodeObject *self) +unicode_lower(PyObject *self) { return fixup(self, fixlower); } @@ -11554,7 +11554,7 @@ done using the specified fill character (default is a space)."); static PyObject * -unicode_rjust(PyUnicodeObject *self, PyObject *args) +unicode_rjust(PyObject *self, PyObject *args) { Py_ssize_t width; Py_UCS4 fillchar = ' '; @@ -11589,7 +11589,7 @@ } } - result = split((PyUnicodeObject *)s, (PyUnicodeObject *)sep, maxsplit); + result = split(s, sep, maxsplit); Py_DECREF(s); Py_XDECREF(sep); @@ -11606,7 +11606,7 @@ removed from the result."); static PyObject* -unicode_split(PyUnicodeObject *self, PyObject *args) +unicode_split(PyObject *self, PyObject *args) { PyObject *substring = Py_None; Py_ssize_t maxcount = -1; @@ -11617,7 +11617,7 @@ if (substring == Py_None) return split(self, NULL, maxcount); else if (PyUnicode_Check(substring)) - return split(self, (PyUnicodeObject *)substring, maxcount); + return split(self, substring, maxcount); else return PyUnicode_Split((PyObject *)self, substring, maxcount); } @@ -11767,9 +11767,9 @@ found, return S and two empty strings."); static PyObject* -unicode_partition(PyUnicodeObject *self, PyObject *separator) -{ - return PyUnicode_Partition((PyObject *)self, separator); +unicode_partition(PyObject *self, PyObject *separator) +{ + return PyUnicode_Partition(self, separator); } PyDoc_STRVAR(rpartition__doc__, @@ -11780,9 +11780,9 @@ separator is not found, return two empty strings and S."); static PyObject* -unicode_rpartition(PyUnicodeObject *self, PyObject *separator) -{ - return PyUnicode_RPartition((PyObject *)self, separator); +unicode_rpartition(PyObject *self, PyObject *separator) +{ + return PyUnicode_RPartition(self, separator); } PyObject * @@ -11801,7 +11801,7 @@ } } - result = rsplit((PyUnicodeObject *)s, (PyUnicodeObject *)sep, maxsplit); + result = rsplit(s, sep, maxsplit); Py_DECREF(s); Py_XDECREF(sep); @@ -11818,7 +11818,7 @@ is a separator."); static PyObject* -unicode_rsplit(PyUnicodeObject *self, PyObject *args) +unicode_rsplit(PyObject *self, PyObject *args) { PyObject *substring = Py_None; Py_ssize_t maxcount = -1; @@ -11829,9 +11829,9 @@ if (substring == Py_None) return rsplit(self, NULL, maxcount); else if (PyUnicode_Check(substring)) - return rsplit(self, (PyUnicodeObject *)substring, maxcount); + return rsplit(self, substring, maxcount); else - return PyUnicode_RSplit((PyObject *)self, substring, maxcount); + return PyUnicode_RSplit(self, substring, maxcount); } PyDoc_STRVAR(splitlines__doc__, @@ -11872,7 +11872,7 @@ and vice versa."); static PyObject* -unicode_swapcase(PyUnicodeObject *self) +unicode_swapcase(PyObject *self) { return fixup(self, fixswapcase); } @@ -12014,7 +12014,7 @@ Return a copy of S converted to uppercase."); static PyObject* -unicode_upper(PyUnicodeObject *self) +unicode_upper(PyObject *self) { return fixup(self, fixupper); } @@ -12026,10 +12026,10 @@ of the specified width. The string S is never truncated."); static PyObject * -unicode_zfill(PyUnicodeObject *self, PyObject *args) +unicode_zfill(PyObject *self, PyObject *args) { Py_ssize_t fill; - PyUnicodeObject *u; + PyObject *u; Py_ssize_t width; int kind; void *data; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:43:11 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 19:43:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Document_requierements_of_U?= =?utf8?q?nicode_kinds?= Message-ID: http://hg.python.org/cpython/rev/055174308822 changeset: 72699:055174308822 user: Victor Stinner date: Wed Oct 05 01:31:05 2011 +0200 summary: Document requierements of Unicode kinds files: Include/unicodeobject.h | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -288,10 +288,26 @@ unsigned int interned:2; /* Character size: - PyUnicode_WCHAR_KIND (0): wchar_t* - PyUnicode_1BYTE_KIND (1): Py_UCS1* - PyUnicode_2BYTE_KIND (2): Py_UCS2* - PyUnicode_4BYTE_KIND (3): Py_UCS4* + - PyUnicode_WCHAR_KIND (0): + + * character type = wchar_t (16 or 32 bits, depending on the + platform) + + - PyUnicode_1BYTE_KIND (1): + + * character type = Py_UCS1 (8 bits, unsigned) + * if ascii is 1, at least one character must be in range + U+80-U+FF, otherwise all characters must be in range U+00-U+7F + + - PyUnicode_2BYTE_KIND (2): + + * character type = Py_UCS2 (16 bits, unsigned) + * at least one character must be in range U+0100-U+1FFFF + + - PyUnicode_4BYTE_KIND (3): + + * character type = Py_UCS4 (32 bits, unsigned) + * at least one character must be in range U+10000-U+10FFFF */ unsigned int kind:2; /* Compact is with respect to the allocation scheme. Compact unicode -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:43:12 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 19:43:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Ensure_that_newly_created_s?= =?utf8?q?trings_use_the_most_efficient_store_in_debug_mode?= Message-ID: http://hg.python.org/cpython/rev/5f11621a6f51 changeset: 72700:5f11621a6f51 user: Victor Stinner date: Wed Oct 05 01:34:17 2011 +0200 summary: Ensure that newly created strings use the most efficient store in debug mode files: Objects/unicodeobject.c | 89 ++++++++++++++++++++++++---- 1 files changed, 75 insertions(+), 14 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -94,7 +94,7 @@ #endif #ifdef Py_DEBUG -# define _PyUnicode_CHECK(op) _PyUnicode_CheckConsistency(op) +# define _PyUnicode_CHECK(op) _PyUnicode_CheckConsistency(op, 0) #else # define _PyUnicode_CHECK(op) PyUnicode_Check(op) #endif @@ -297,7 +297,8 @@ #ifdef Py_DEBUG static int -_PyUnicode_CheckConsistency(void *op) +/* FIXME: use PyObject* type for op */ +_PyUnicode_CheckConsistency(void *op, int check_content) { PyASCIIObject *ascii; unsigned int kind; @@ -371,12 +372,29 @@ if (ascii->wstr == NULL) assert(compact->wstr_length == 0); } - return 1; -} -#else -static int -_PyUnicode_CheckConsistency(void *op) -{ + /* check that the best kind is used */ + if (check_content && kind != PyUnicode_WCHAR_KIND) + { + Py_ssize_t i; + Py_UCS4 maxchar = 0; + void *data = PyUnicode_DATA(ascii); + for (i=0; i < ascii->length; i++) + { + Py_UCS4 ch = PyUnicode_READ(kind, data, i); + if (ch > maxchar) + maxchar = ch; + } + if (kind == PyUnicode_1BYTE_KIND) { + if (ascii->state.ascii == 0) + assert(maxchar >= 128); + else + assert(maxchar < 128); + } + else if (kind == PyUnicode_2BYTE_KIND) + assert(maxchar >= 0x100); + else + assert(maxchar >= 0x10000); + } return 1; } #endif @@ -546,7 +564,7 @@ _PyUnicode_LENGTH(unicode) = length; PyUnicode_WRITE(PyUnicode_KIND(unicode), data, length, 0); if (share_wstr || _PyUnicode_WSTR(unicode) == NULL) { - _PyUnicode_CheckConsistency(unicode); + assert(_PyUnicode_CheckConsistency(unicode, 0)); return 0; } } @@ -566,7 +584,7 @@ _PyUnicode_WSTR(unicode) = wstr; _PyUnicode_WSTR(unicode)[length] = 0; _PyUnicode_WSTR_LENGTH(unicode) = length; - _PyUnicode_CheckConsistency(unicode); + assert(_PyUnicode_CheckConsistency(unicode, 0)); return 0; } @@ -879,6 +897,7 @@ _PyUnicode_WSTR(unicode) = NULL; } } + assert(_PyUnicode_CheckConsistency(unicode, 0)); return obj; } @@ -1255,6 +1274,7 @@ PyUnicode_4BYTE_DATA(unicode)[_PyUnicode_LENGTH(unicode)] = '\0'; } _PyUnicode_STATE(unicode).ready = 1; + assert(_PyUnicode_CheckConsistency(unicode, 1)); return 0; } @@ -1360,7 +1380,7 @@ *p_unicode = resize_compact(unicode, length); if (*p_unicode == NULL) return -1; - _PyUnicode_CheckConsistency(*p_unicode); + assert(_PyUnicode_CheckConsistency(*p_unicode, 0)); return 0; } return resize_inplace((PyUnicodeObject*)unicode, length); @@ -1393,6 +1413,7 @@ if (!unicode) return NULL; PyUnicode_1BYTE_DATA(unicode)[0] = ch; + assert(_PyUnicode_CheckConsistency(unicode, 1)); unicode_latin1[ch] = unicode; } Py_INCREF(unicode); @@ -1461,6 +1482,7 @@ assert(0 && "Impossible state"); } + assert(_PyUnicode_CheckConsistency(unicode, 1)); return (PyObject *)unicode; } @@ -1558,6 +1580,7 @@ if (!res) return NULL; memcpy(PyUnicode_1BYTE_DATA(res), u, size); + assert(_PyUnicode_CheckConsistency(res, 1)); return res; } @@ -1584,6 +1607,7 @@ else for (i = 0; i < size; i++) PyUnicode_1BYTE_DATA(res)[i] = (Py_UCS1)u[i]; + assert(_PyUnicode_CheckConsistency(res, 1)); return res; } @@ -1613,6 +1637,7 @@ for (i = 0; i < size; i++) PyUnicode_WRITE(kind, data, i, u[i]); } + assert(_PyUnicode_CheckConsistency(res, 1)); return res; } @@ -1669,6 +1694,7 @@ assert(0); break; } + assert(_PyUnicode_CheckConsistency(copy, 1)); return copy; } @@ -2378,6 +2404,7 @@ PyObject_Free(callresults); if (numberresults) PyObject_Free(numberresults); + assert(_PyUnicode_CheckConsistency(string, 1)); return (PyObject *)string; fail: if (callresults) { @@ -2508,6 +2535,7 @@ if (v == NULL) return NULL; PyUnicode_WRITE(PyUnicode_KIND(v), PyUnicode_DATA(v), 0, ordinal); + assert(_PyUnicode_CheckConsistency(v, 1)); return v; } @@ -2677,6 +2705,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(unicode, 1)); return unicode; onError: @@ -2703,6 +2732,7 @@ v = PyCodec_Decode(unicode, encoding, errors); if (v == NULL) goto onError; + assert(_PyUnicode_CheckConsistency(v, 1)); return v; onError: @@ -2735,6 +2765,7 @@ Py_DECREF(v); goto onError; } + assert(_PyUnicode_CheckConsistency(v, 1)); return v; onError: @@ -3728,6 +3759,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(unicode, 1)); return (PyObject *)unicode; onError: @@ -4300,6 +4332,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(unicode, 1)); return (PyObject *)unicode; onError: @@ -4805,6 +4838,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(unicode, 1)); return (PyObject *)unicode; onError: @@ -5205,6 +5239,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(unicode, 1)); return (PyObject *)unicode; onError: @@ -5666,6 +5701,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; ucnhashError: @@ -5969,6 +6005,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; onError: @@ -6159,6 +6196,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; onError: @@ -6603,6 +6641,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; onError: @@ -6799,6 +6838,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; } @@ -7100,6 +7140,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(v, 1)); return (PyObject *)v; onError: @@ -8147,6 +8188,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(result, 1)); return result; } /* --- Decimal Encoder ---------------------------------------------------- */ @@ -8738,6 +8780,7 @@ } Py_DECREF(u); + assert(_PyUnicode_CheckConsistency(v, 1)); return v; } } @@ -9061,6 +9104,7 @@ Done: Py_DECREF(fseq); Py_XDECREF(sep); + assert(_PyUnicode_CheckConsistency(res, 1)); return res; onError: @@ -9140,7 +9184,8 @@ return NULL; } - return (PyUnicodeObject*)u; + assert(_PyUnicode_CheckConsistency(u, 1)); + return u; } #undef FILL @@ -9605,6 +9650,7 @@ PyMem_FREE(buf1); if (release2) PyMem_FREE(buf2); + assert(_PyUnicode_CheckConsistency(u, 1)); return u; nothing: @@ -10052,6 +10098,7 @@ goto onError; Py_DECREF(u); Py_DECREF(v); + assert(_PyUnicode_CheckConsistency(w, 1)); return w; onError: @@ -10143,6 +10190,8 @@ if (!(PyUnicode_IS_ASCII(left) && !PyUnicode_IS_ASCII(right))) { unicode_append_inplace(p_left, right); + if (p_left != NULL) + assert(_PyUnicode_CheckConsistency(*p_left, 1)); return; } } @@ -10151,6 +10200,7 @@ if (res == NULL) goto error; Py_DECREF(left); + assert(_PyUnicode_CheckConsistency(res, 1)); *p_left = res; return; @@ -10358,6 +10408,7 @@ return NULL; } #endif + assert(_PyUnicode_CheckConsistency(u, 1)); return (PyObject*) u; overflow: @@ -11248,6 +11299,7 @@ } } + assert(_PyUnicode_CheckConsistency(u, 1)); return (PyObject*) u; } @@ -11465,6 +11517,7 @@ } } /* Closing quote already added at the beginning */ + assert(_PyUnicode_CheckConsistency(unicode, 1)); return repr; } @@ -12067,6 +12120,7 @@ PyUnicode_WRITE(kind, data, fill, '0'); } + assert(_PyUnicode_CheckConsistency(u, 1)); return (PyObject*) u; } @@ -12191,13 +12245,16 @@ static PyObject * unicode__format__(PyObject* self, PyObject* args) { - PyObject *format_spec; + PyObject *format_spec, *out; if (!PyArg_ParseTuple(args, "U:__format__", &format_spec)) return NULL; - return _PyUnicode_FormatAdvanced(self, format_spec, 0, + out = _PyUnicode_FormatAdvanced(self, format_spec, 0, PyUnicode_GET_LENGTH(format_spec)); + if (out != NULL) + assert(_PyUnicode_CheckConsistency(out, 1)); + return out; } PyDoc_STRVAR(p_format__doc__, @@ -12396,6 +12453,7 @@ Py_UCS4 ch = PyUnicode_READ(src_kind, src_data, cur); PyUnicode_WRITE(dest_kind, dest_data, i, ch); } + assert(_PyUnicode_CheckConsistency(result, 1)); return result; } else { PyErr_SetString(PyExc_TypeError, "string indices must be integers"); @@ -12973,6 +13031,7 @@ Py_DECREF(args); } Py_DECREF(uformat); + assert(_PyUnicode_CheckConsistency(result, 1)); return (PyObject *)result; onError: @@ -13090,6 +13149,7 @@ Py_MEMCPY(data, PyUnicode_DATA(unicode), PyUnicode_KIND_SIZE(kind, length + 1)); Py_DECREF(unicode); + assert(_PyUnicode_CheckConsistency(self, 1)); return (PyObject *)self; onError: @@ -13171,6 +13231,7 @@ /* Init the implementation */ unicode_empty = PyUnicode_New(0, 0); + assert(_PyUnicode_CheckConsistency(unicode_empty, 1)); if (!unicode_empty) Py_FatalError("Can't create empty string"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:53:30 2011 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 05 Oct 2011 19:53:30 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDcw?= =?utf8?q?=3A_Fix_a_crash_when_a_TextIOWrapper_caught_in_a_reference_cycle?= Message-ID: http://hg.python.org/cpython/rev/d60c00015f01 changeset: 72701:d60c00015f01 branch: 3.2 parent: 72695:805a0a1e3c2b user: Charles-Fran?ois Natali date: Wed Oct 05 19:53:43 2011 +0200 summary: Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. files: Lib/test/test_io.py | 15 +++++++++++++++ Misc/NEWS | 4 ++++ Modules/_io/bufferedio.c | 5 +++++ 3 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2414,6 +2414,21 @@ with self.open(support.TESTFN, "rb") as f: self.assertEqual(f.read(), b"456def") + def test_rwpair_cleared_before_textio(self): + # Issue 13070: TextIOWrapper's finalization would crash when called + # after the reference to the underlying BufferedRWPair's writer got + # cleared by the GC. + for i in range(1000): + b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t1 = self.TextIOWrapper(b1, encoding="ascii") + b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t2 = self.TextIOWrapper(b2, encoding="ascii") + # circular references + t1.buddy = t2 + t2.buddy = t1 + support.gc_collect() + + class PyTextIOWrapperTest(TextIOWrapperTest): pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,10 @@ Extension Modules ----------------- +- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle + would be finalized after the reference to its underlying BufferedRWPair's + writer got cleared by the GC. + - Issue #12881: ctypes: Fix segfault with large structure field names. - Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2212,6 +2212,11 @@ static PyObject * bufferedrwpair_closed_get(rwpair *self, void *context) { + if (self->writer == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "the BufferedRWPair object is being garbage-collected"); + return NULL; + } return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 19:53:35 2011 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 05 Oct 2011 19:53:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313070=3A_Fix_a_crash_when_a_TextIOWrapper_caught_in?= =?utf8?q?_a_reference_cycle?= Message-ID: http://hg.python.org/cpython/rev/7defc1e5d13a changeset: 72702:7defc1e5d13a parent: 72700:5f11621a6f51 parent: 72701:d60c00015f01 user: Charles-Fran?ois Natali date: Wed Oct 05 19:55:56 2011 +0200 summary: Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. files: Lib/test/test_io.py | 15 +++++++++++++++ Misc/NEWS | 4 ++++ Modules/_io/bufferedio.c | 5 +++++ 3 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2421,6 +2421,21 @@ with self.open(support.TESTFN, "rb") as f: self.assertEqual(f.read(), b"456def") + def test_rwpair_cleared_before_textio(self): + # Issue 13070: TextIOWrapper's finalization would crash when called + # after the reference to the underlying BufferedRWPair's writer got + # cleared by the GC. + for i in range(1000): + b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t1 = self.TextIOWrapper(b1, encoding="ascii") + b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t2 = self.TextIOWrapper(b2, encoding="ascii") + # circular references + t1.buddy = t2 + t2.buddy = t1 + support.gc_collect() + + class PyTextIOWrapperTest(TextIOWrapperTest): pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1314,6 +1314,10 @@ Extension Modules ----------------- +- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle + would be finalized after the reference to its underlying BufferedRWPair's + writer got cleared by the GC. + - Issue #12881: ctypes: Fix segfault with large structure field names. - Issue #13058: ossaudiodev: fix a file descriptor leak on error. Patch by diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2307,6 +2307,11 @@ static PyObject * bufferedrwpair_closed_get(rwpair *self, void *context) { + if (self->writer == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "the BufferedRWPair object is being garbage-collected"); + return NULL; + } return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 20:14:39 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 20:14:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_my=5Fbasename=28=29=3A_?= =?utf8?q?make_the_string_ready?= Message-ID: http://hg.python.org/cpython/rev/eb2821cc3edf changeset: 72703:eb2821cc3edf user: Victor Stinner date: Wed Oct 05 20:14:23 2011 +0200 summary: Fix my_basename(): make the string ready files: Objects/exceptions.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -963,8 +963,13 @@ my_basename(PyObject *name) { Py_ssize_t i, size, offset; - int kind = PyUnicode_KIND(name); - void *data = PyUnicode_DATA(name); + int kind; + void *data; + + if (PyUnicode_READY(name)) + return NULL; + kind = PyUnicode_KIND(name); + data = PyUnicode_DATA(name); size = PyUnicode_GET_LENGTH(name); offset = 0; for(i=0; i < size; i++) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 21:30:45 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 21:30:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_PyUnicode=5FPartition?= =?utf8?b?KCk6IHN0cl9pbi0+c3RyX29iag==?= Message-ID: http://hg.python.org/cpython/rev/891b0c54297d changeset: 72704:891b0c54297d user: Victor Stinner date: Wed Oct 05 20:58:25 2011 +0200 summary: Fix PyUnicode_Partition(): str_in->str_obj files: Objects/unicodeobject.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11694,12 +11694,12 @@ return NULL; } - kind1 = PyUnicode_KIND(str_in); + kind1 = PyUnicode_KIND(str_obj); kind2 = PyUnicode_KIND(sep_obj); - kind = kind1 > kind2 ? kind1 : kind2; - buf1 = PyUnicode_DATA(str_in); + kind = Py_MAX(kind1, kind2); + buf1 = PyUnicode_DATA(str_obj); if (kind1 != kind) - buf1 = _PyUnicode_AsKind(str_in, kind); + buf1 = _PyUnicode_AsKind(str_obj, kind); if (!buf1) goto onError; buf2 = PyUnicode_DATA(sep_obj); @@ -11710,7 +11710,7 @@ len1 = PyUnicode_GET_LENGTH(str_obj); len2 = PyUnicode_GET_LENGTH(sep_obj); - switch(PyUnicode_KIND(str_in)) { + switch(PyUnicode_KIND(str_obj)) { case PyUnicode_1BYTE_KIND: out = ucs1lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2); break; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 21:30:46 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 21:30:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_asciilib=3A_similar_to_?= =?utf8?q?ucs1=2C_ucs2_and_ucs4_library=2C_but_specialized_to_ASCII?= Message-ID: http://hg.python.org/cpython/rev/05ed6e5f2cf4 changeset: 72705:05ed6e5f2cf4 user: Victor Stinner date: Wed Oct 05 21:24:08 2011 +0200 summary: Add asciilib: similar to ucs1, ucs2 and ucs4 library, but specialized to ASCII ucs1, ucs2 and ucs4 libraries have to scan created substring to find the maximum character, whereas it is not need to ASCII strings. Because ASCII strings are common, it is useful to optimize ASCII. files: Include/unicodeobject.h | 1 + Objects/stringlib/asciilib.h | 34 ++++ Objects/unicodeobject.c | 163 ++++++++++++++++------ Python/formatter_unicode.c | 4 +- 4 files changed, 153 insertions(+), 49 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1851,6 +1851,7 @@ see Objects/stringlib/localeutil.h */ #ifndef Py_LIMITED_API PyAPI_FUNC(Py_ssize_t) _PyUnicode_InsertThousandsGrouping( + PyObject *unicode, int kind, void *buffer, Py_ssize_t n_buffer, diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h new file mode 100644 --- /dev/null +++ b/Objects/stringlib/asciilib.h @@ -0,0 +1,34 @@ +/* this is sort of a hack. there's at least one place (formatting + floats) where some stringlib code takes a different path if it's + compiled as unicode. */ +#define STRINGLIB_IS_UNICODE 1 + +#define FASTSEARCH asciilib_fastsearch +#define STRINGLIB(F) asciilib_##F +#define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_CHAR Py_UCS1 +#define STRINGLIB_TYPE_NAME "unicode" +#define STRINGLIB_PARSE_CODE "U" +#define STRINGLIB_EMPTY unicode_empty +#define STRINGLIB_ISSPACE Py_UNICODE_ISSPACE +#define STRINGLIB_ISLINEBREAK BLOOM_LINEBREAK +#define STRINGLIB_ISDECIMAL Py_UNICODE_ISDECIMAL +#define STRINGLIB_TODECIMAL Py_UNICODE_TODECIMAL +#define STRINGLIB_TOUPPER Py_UNICODE_TOUPPER +#define STRINGLIB_TOLOWER Py_UNICODE_TOLOWER +#define STRINGLIB_FILL Py_UNICODE_FILL +#define STRINGLIB_STR PyUnicode_1BYTE_DATA +#define STRINGLIB_LEN PyUnicode_GET_LENGTH +#define STRINGLIB_NEW unicode_fromascii +#define STRINGLIB_RESIZE not_supported +#define STRINGLIB_CHECK PyUnicode_Check +#define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact +#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping +#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale + +#define STRINGLIB_TOSTR PyObject_Str +#define STRINGLIB_TOASCII PyObject_ASCII + +#define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping +#define _Py_InsertThousandsGroupingLocale _PyUnicode_ascii_InsertThousandsGroupingLocale + diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8331,6 +8331,15 @@ /* --- Helpers ------------------------------------------------------------ */ +#include "stringlib/asciilib.h" +#include "stringlib/fastsearch.h" +#include "stringlib/partition.h" +#include "stringlib/split.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/localeutil.h" +#include "stringlib/undef.h" + #include "stringlib/ucs1lib.h" #include "stringlib/fastsearch.h" #include "stringlib/partition.h" @@ -8359,7 +8368,10 @@ #include "stringlib/undef.h" static Py_ssize_t -any_find_slice(Py_ssize_t Py_LOCAL_CALLBACK(ucs1)(const Py_UCS1*, Py_ssize_t, +any_find_slice(Py_ssize_t Py_LOCAL_CALLBACK(ascii)(const Py_UCS1*, Py_ssize_t, + const Py_UCS1*, Py_ssize_t, + Py_ssize_t, Py_ssize_t), + Py_ssize_t Py_LOCAL_CALLBACK(ucs1)(const Py_UCS1*, Py_ssize_t, const Py_UCS1*, Py_ssize_t, Py_ssize_t, Py_ssize_t), Py_ssize_t Py_LOCAL_CALLBACK(ucs2)(const Py_UCS2*, Py_ssize_t, @@ -8396,7 +8408,10 @@ switch(kind) { case PyUnicode_1BYTE_KIND: - result = ucs1(buf1, len1, buf2, len2, start, end); + if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2)) + result = ascii(buf1, len1, buf2, len2, start, end); + else + result = ucs1(buf1, len1, buf2, len2, start, end); break; case PyUnicode_2BYTE_KIND: result = ucs2(buf1, len1, buf2, len2, start, end); @@ -8417,7 +8432,7 @@ } Py_ssize_t -_PyUnicode_InsertThousandsGrouping(int kind, void *data, +_PyUnicode_InsertThousandsGrouping(PyObject *unicode, int kind, void *data, Py_ssize_t n_buffer, void *digits, Py_ssize_t n_digits, Py_ssize_t min_width, @@ -8426,9 +8441,14 @@ { switch(kind) { case PyUnicode_1BYTE_KIND: - return _PyUnicode_ucs1_InsertThousandsGrouping( - (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, thousands_sep); + if (unicode != NULL && PyUnicode_IS_ASCII(unicode)) + return _PyUnicode_ascii_InsertThousandsGrouping( + (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, + min_width, grouping, thousands_sep); + else + return _PyUnicode_ucs1_InsertThousandsGrouping( + (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, + min_width, grouping, thousands_sep); case PyUnicode_2BYTE_KIND: return _PyUnicode_ucs2_InsertThousandsGrouping( (Py_UCS2*)data, n_buffer, (Py_UCS2*)digits, n_digits, @@ -8505,10 +8525,16 @@ ADJUST_INDICES(start, end, len1); switch(kind) { case PyUnicode_1BYTE_KIND: - result = ucs1lib_count( - ((Py_UCS1*)buf1) + start, end - start, - buf2, len2, PY_SSIZE_T_MAX - ); + if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sub_obj)) + result = asciilib_count( + ((Py_UCS1*)buf1) + start, end - start, + buf2, len2, PY_SSIZE_T_MAX + ); + else + result = ucs1lib_count( + ((Py_UCS1*)buf1) + start, end - start, + buf2, len2, PY_SSIZE_T_MAX + ); break; case PyUnicode_2BYTE_KIND: result = ucs2lib_count( @@ -8565,12 +8591,14 @@ if (direction > 0) result = any_find_slice( - ucs1lib_find_slice, ucs2lib_find_slice, ucs4lib_find_slice, + asciilib_find_slice, ucs1lib_find_slice, + ucs2lib_find_slice, ucs4lib_find_slice, str, sub, start, end ); else result = any_find_slice( - ucs1lib_rfind_slice, ucs2lib_rfind_slice, ucs4lib_rfind_slice, + asciilib_find_slice, ucs1lib_rfind_slice, + ucs2lib_rfind_slice, ucs4lib_rfind_slice, str, sub, start, end ); @@ -9200,9 +9228,14 @@ switch(PyUnicode_KIND(string)) { case PyUnicode_1BYTE_KIND: - list = ucs1lib_splitlines( - (PyObject*) string, PyUnicode_1BYTE_DATA(string), - PyUnicode_GET_LENGTH(string), keepends); + if (PyUnicode_IS_ASCII(string)) + list = asciilib_splitlines( + (PyObject*) string, PyUnicode_1BYTE_DATA(string), + PyUnicode_GET_LENGTH(string), keepends); + else + list = ucs1lib_splitlines( + (PyObject*) string, PyUnicode_1BYTE_DATA(string), + PyUnicode_GET_LENGTH(string), keepends); break; case PyUnicode_2BYTE_KIND: list = ucs2lib_splitlines( @@ -9241,10 +9274,16 @@ if (substring == NULL) switch(PyUnicode_KIND(self)) { case PyUnicode_1BYTE_KIND: - return ucs1lib_split_whitespace( - (PyObject*) self, PyUnicode_1BYTE_DATA(self), - PyUnicode_GET_LENGTH(self), maxcount - ); + if (PyUnicode_IS_ASCII(self)) + return asciilib_split_whitespace( + (PyObject*) self, PyUnicode_1BYTE_DATA(self), + PyUnicode_GET_LENGTH(self), maxcount + ); + else + return ucs1lib_split_whitespace( + (PyObject*) self, PyUnicode_1BYTE_DATA(self), + PyUnicode_GET_LENGTH(self), maxcount + ); case PyUnicode_2BYTE_KIND: return ucs2lib_split_whitespace( (PyObject*) self, PyUnicode_2BYTE_DATA(self), @@ -9283,8 +9322,12 @@ switch(kind) { case PyUnicode_1BYTE_KIND: - out = ucs1lib_split( - (PyObject*) self, buf1, len1, buf2, len2, maxcount); + if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(substring)) + out = asciilib_split( + (PyObject*) self, buf1, len1, buf2, len2, maxcount); + else + out = ucs1lib_split( + (PyObject*) self, buf1, len1, buf2, len2, maxcount); break; case PyUnicode_2BYTE_KIND: out = ucs2lib_split( @@ -9323,10 +9366,16 @@ if (substring == NULL) switch(PyUnicode_KIND(self)) { case PyUnicode_1BYTE_KIND: - return ucs1lib_rsplit_whitespace( - (PyObject*) self, PyUnicode_1BYTE_DATA(self), - PyUnicode_GET_LENGTH(self), maxcount - ); + if (PyUnicode_IS_ASCII(self)) + return asciilib_rsplit_whitespace( + (PyObject*) self, PyUnicode_1BYTE_DATA(self), + PyUnicode_GET_LENGTH(self), maxcount + ); + else + return ucs1lib_rsplit_whitespace( + (PyObject*) self, PyUnicode_1BYTE_DATA(self), + PyUnicode_GET_LENGTH(self), maxcount + ); case PyUnicode_2BYTE_KIND: return ucs2lib_rsplit_whitespace( (PyObject*) self, PyUnicode_2BYTE_DATA(self), @@ -9365,8 +9414,12 @@ switch(kind) { case PyUnicode_1BYTE_KIND: - out = ucs1lib_rsplit( - (PyObject*) self, buf1, len1, buf2, len2, maxcount); + if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(substring)) + out = asciilib_rsplit( + (PyObject*) self, buf1, len1, buf2, len2, maxcount); + else + out = ucs1lib_rsplit( + (PyObject*) self, buf1, len1, buf2, len2, maxcount); break; case PyUnicode_2BYTE_KIND: out = ucs2lib_rsplit( @@ -9387,12 +9440,15 @@ } static Py_ssize_t -anylib_find(int kind, void *buf1, Py_ssize_t len1, - void *buf2, Py_ssize_t len2, Py_ssize_t offset) +anylib_find(int kind, PyObject *str1, void *buf1, Py_ssize_t len1, + PyObject *str2, void *buf2, Py_ssize_t len2, Py_ssize_t offset) { switch(kind) { case PyUnicode_1BYTE_KIND: - return ucs1lib_find(buf1, len1, buf2, len2, offset); + if (PyUnicode_IS_ASCII(str1) && PyUnicode_IS_ASCII(str2)) + return asciilib_find(buf1, len1, buf2, len2, offset); + else + return ucs1lib_find(buf1, len1, buf2, len2, offset); case PyUnicode_2BYTE_KIND: return ucs2lib_find(buf1, len1, buf2, len2, offset); case PyUnicode_4BYTE_KIND: @@ -9403,12 +9459,15 @@ } static Py_ssize_t -anylib_count(int kind, void* sbuf, Py_ssize_t slen, - void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) +anylib_count(int kind, PyObject *sstr, void* sbuf, Py_ssize_t slen, + PyObject *str1, void *buf1, Py_ssize_t len1, Py_ssize_t maxcount) { switch(kind) { case PyUnicode_1BYTE_KIND: - return ucs1lib_count(sbuf, slen, buf1, len1, maxcount); + if (PyUnicode_IS_ASCII(sstr) && PyUnicode_IS_ASCII(str1)) + return asciilib_count(sbuf, slen, buf1, len1, maxcount); + else + return ucs1lib_count(sbuf, slen, buf1, len1, maxcount); case PyUnicode_2BYTE_KIND: return ucs2lib_count(sbuf, slen, buf1, len1, maxcount); case PyUnicode_4BYTE_KIND: @@ -9497,7 +9556,7 @@ if (!buf1) goto error; release1 = 1; } - i = anylib_find(rkind, sbuf, slen, buf1, len1, 0); + i = anylib_find(rkind, self, sbuf, slen, str1, buf1, len1, 0); if (i < 0) goto nothing; if (rkind > kind2) { @@ -9530,9 +9589,9 @@ i += len1; while ( --maxcount > 0) { - i = anylib_find(rkind, sbuf+PyUnicode_KIND_SIZE(rkind, i), - slen-i, - buf1, len1, i); + i = anylib_find(rkind, self, + sbuf+PyUnicode_KIND_SIZE(rkind, i), slen-i, + str1, buf1, len1, i); if (i == -1) break; memcpy(res + PyUnicode_KIND_SIZE(rkind, i), @@ -9557,7 +9616,7 @@ if (!buf1) goto error; release1 = 1; } - n = anylib_count(rkind, sbuf, slen, buf1, len1, maxcount); + n = anylib_count(rkind, self, sbuf, slen, str1, buf1, len1, maxcount); if (n == 0) goto nothing; if (kind2 < rkind) { @@ -9596,9 +9655,9 @@ if (len1 > 0) { while (n-- > 0) { /* look for next match */ - j = anylib_find(rkind, - sbuf + PyUnicode_KIND_SIZE(rkind, i), - slen-i, buf1, len1, i); + j = anylib_find(rkind, self, + sbuf + PyUnicode_KIND_SIZE(rkind, i), slen-i, + str1, buf1, len1, i); if (j == -1) break; else if (j > i) { @@ -10443,7 +10502,8 @@ return NULL; result = any_find_slice( - ucs1lib_find_slice, ucs2lib_find_slice, ucs4lib_find_slice, + asciilib_find_slice, ucs1lib_find_slice, + ucs2lib_find_slice, ucs4lib_find_slice, self, (PyObject*)substring, start, end ); @@ -10536,7 +10596,8 @@ return NULL; result = any_find_slice( - ucs1lib_find_slice, ucs2lib_find_slice, ucs4lib_find_slice, + asciilib_find_slice, ucs1lib_find_slice, + ucs2lib_find_slice, ucs4lib_find_slice, self, (PyObject*)substring, start, end ); @@ -11548,7 +11609,8 @@ return NULL; result = any_find_slice( - ucs1lib_rfind_slice, ucs2lib_rfind_slice, ucs4lib_rfind_slice, + asciilib_rfind_slice, ucs1lib_rfind_slice, + ucs2lib_rfind_slice, ucs4lib_rfind_slice, self, (PyObject*)substring, start, end ); @@ -11583,7 +11645,8 @@ return NULL; result = any_find_slice( - ucs1lib_rfind_slice, ucs2lib_rfind_slice, ucs4lib_rfind_slice, + asciilib_rfind_slice, ucs1lib_rfind_slice, + ucs2lib_rfind_slice, ucs4lib_rfind_slice, self, (PyObject*)substring, start, end ); @@ -11712,7 +11775,10 @@ switch(PyUnicode_KIND(str_obj)) { case PyUnicode_1BYTE_KIND: - out = ucs1lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2); + if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sep_obj)) + out = asciilib_partition(str_obj, buf1, len1, sep_obj, buf2, len2); + else + out = ucs1lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2); break; case PyUnicode_2BYTE_KIND: out = ucs2lib_partition(str_obj, buf1, len1, sep_obj, buf2, len2); @@ -11781,7 +11847,10 @@ switch(PyUnicode_KIND(str_in)) { case PyUnicode_1BYTE_KIND: - out = ucs1lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2); + if (PyUnicode_IS_ASCII(str_obj) && PyUnicode_IS_ASCII(sep_obj)) + out = asciilib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2); + else + out = ucs1lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2); break; case PyUnicode_2BYTE_KIND: out = ucs2lib_rpartition(str_obj, buf1, len1, sep_obj, buf2, len2); diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -501,7 +501,7 @@ spec->n_grouped_digits = 0; else spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping( - PyUnicode_1BYTE_KIND, NULL, 0, NULL, + NULL, PyUnicode_1BYTE_KIND, NULL, 0, NULL, spec->n_digits, spec->n_min_width, locale->grouping, locale->thousands_sep); @@ -603,7 +603,7 @@ r = #endif _PyUnicode_InsertThousandsGrouping( - kind, + out, kind, (char*)data + PyUnicode_KIND_SIZE(kind, pos), spec->n_grouped_digits, pdigits + PyUnicode_KIND_SIZE(kind, d_pos), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 22:29:05 2011 From: python-checkins at python.org (amaury.forgeotdarc) Date: Wed, 05 Oct 2011 22:29:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_few_ResourceWarnings_?= =?utf8?q?in_idle?= Message-ID: http://hg.python.org/cpython/rev/3a5a0943b201 changeset: 72706:3a5a0943b201 user: Amaury Forgeot d'Arc date: Mon Oct 03 20:33:24 2011 +0200 summary: Fix a few ResourceWarnings in idle files: Lib/idlelib/configHandler.py | 3 ++- Lib/idlelib/rpc.py | 4 ++++ 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Lib/idlelib/configHandler.py b/Lib/idlelib/configHandler.py --- a/Lib/idlelib/configHandler.py +++ b/Lib/idlelib/configHandler.py @@ -145,7 +145,8 @@ except IOError: os.unlink(fname) cfgFile = open(fname, 'w') - self.write(cfgFile) + with cfgFile: + self.write(cfgFile) else: self.RemoveFile() diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -534,6 +534,10 @@ def get_remote_proxy(self, oid): return RPCProxy(self, oid) + def close(self): + self.listening_sock.close() + SocketIO.close(self) + class RPCProxy(object): __methods = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 22:37:58 2011 From: python-checkins at python.org (amaury.forgeotdarc) Date: Wed, 05 Oct 2011 22:37:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Enable_the_only?= =?utf8?q?_tests_for_sys=2Egettrace?= Message-ID: http://hg.python.org/cpython/rev/16c4137a413c changeset: 72707:16c4137a413c branch: 2.7 parent: 72694:64fae6f7b64c user: Amaury Forgeot d'Arc date: Wed Oct 05 22:34:51 2011 +0200 summary: Enable the only tests for sys.gettrace files: Lib/test/test_sys_settrace.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -282,11 +282,11 @@ self.compare_events(func.func_code.co_firstlineno, tracer.events, func.events) - def set_and_retrieve_none(self): + def test_set_and_retrieve_none(self): sys.settrace(None) assert sys.gettrace() is None - def set_and_retrieve_func(self): + def test_set_and_retrieve_func(self): def fn(*args): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 22:37:59 2011 From: python-checkins at python.org (amaury.forgeotdarc) Date: Wed, 05 Oct 2011 22:37:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Enable_the_only?= =?utf8?q?_tests_for_sys=2Egettrace?= Message-ID: http://hg.python.org/cpython/rev/a0393cbe4872 changeset: 72708:a0393cbe4872 branch: 3.2 parent: 72701:d60c00015f01 user: Amaury Forgeot d'Arc date: Wed Oct 05 22:36:05 2011 +0200 summary: Enable the only tests for sys.gettrace files: Lib/test/test_sys_settrace.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -282,11 +282,11 @@ self.compare_events(func.__code__.co_firstlineno, tracer.events, func.events) - def set_and_retrieve_none(self): + def test_set_and_retrieve_none(self): sys.settrace(None) assert sys.gettrace() is None - def set_and_retrieve_func(self): + def test_set_and_retrieve_func(self): def fn(*args): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 22:38:00 2011 From: python-checkins at python.org (amaury.forgeotdarc) Date: Wed, 05 Oct 2011 22:38:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e9cf6e6d6b1f changeset: 72709:e9cf6e6d6b1f parent: 72706:3a5a0943b201 parent: 72708:a0393cbe4872 user: Amaury Forgeot d'Arc date: Wed Oct 05 22:37:06 2011 +0200 summary: Merge from 3.2 files: Lib/test/test_sys_settrace.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -283,11 +283,11 @@ self.compare_events(func.__code__.co_firstlineno, tracer.events, func.events) - def set_and_retrieve_none(self): + def test_set_and_retrieve_none(self): sys.settrace(None) assert sys.gettrace() is None - def set_and_retrieve_func(self): + def test_set_and_retrieve_func(self): def fn(*args): pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 5 22:44:12 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 05 Oct 2011 22:44:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_traceback=3A_fix_dump=5Fasc?= =?utf8?q?ii=28=29_for_string_with_kind=3DPyUnicode=5FWCHAR=5FKIND?= Message-ID: http://hg.python.org/cpython/rev/2a8ccff8f337 changeset: 72710:2a8ccff8f337 user: Victor Stinner date: Wed Oct 05 22:44:12 2011 +0200 summary: traceback: fix dump_ascii() for string with kind=PyUnicode_WCHAR_KIND files: Python/traceback.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -483,7 +483,8 @@ Py_ssize_t i, size; int truncated; int kind; - void *data; + void *data = NULL; + wchar_t *wstr = NULL; Py_UCS4 ch; size = ascii->length; @@ -494,11 +495,17 @@ else data = ((PyCompactUnicodeObject*)text) + 1; } - else { + else if (kind != PyUnicode_WCHAR_KIND) { data = ((PyUnicodeObject *)text)->data.any; if (data == NULL) return; } + else { + wstr = ((PyASCIIObject *)text)->wstr; + if (wstr == NULL) + return; + size = ((PyCompactUnicodeObject *)text)->wstr_length; + } if (MAX_STRING_LENGTH < size) { size = MAX_STRING_LENGTH; @@ -508,7 +515,10 @@ truncated = 0; for (i=0; i < size; i++) { - ch = PyUnicode_READ(kind, data, i); + if (kind != PyUnicode_WCHAR_KIND) + ch = PyUnicode_READ(kind, data, i); + else + ch = wstr[i]; if (ch < 128) { char c = (char)ch; write(fd, &c, 1); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 01:50:59 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 01:50:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_unicode=5Ffromascii=28=29_c?= =?utf8?q?hecks_that_the_input_is_ASCII_in_debug_mode?= Message-ID: http://hg.python.org/cpython/rev/2bf53a7e253f changeset: 72711:2bf53a7e253f user: Victor Stinner date: Wed Oct 05 23:26:01 2011 +0200 summary: unicode_fromascii() checks that the input is ASCII in debug mode files: Objects/unicodeobject.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1537,12 +1537,20 @@ } static PyObject* -unicode_fromascii(const unsigned char* u, Py_ssize_t size) -{ - PyObject *res = PyUnicode_New(size, 127); +unicode_fromascii(const unsigned char* s, Py_ssize_t size) +{ + PyObject *res; +#ifdef Py_DEBUG + const unsigned char *p; + const unsigned char *end = s + size; + for (p=s; p < end; p++) { + assert(*p < 128); + } +#endif + res = PyUnicode_New(size, 127); if (!res) return NULL; - memcpy(PyUnicode_1BYTE_DATA(res), u, size); + memcpy(PyUnicode_1BYTE_DATA(res), s, size); return res; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 01:51:00 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 01:51:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_replace=28=29_uses_unicode?= =?utf8?q?=5Ffromascii=28=29_if_the_input_and_replace_string_is_ASCII?= Message-ID: http://hg.python.org/cpython/rev/b2330e70b41e changeset: 72712:b2330e70b41e user: Victor Stinner date: Wed Oct 05 23:27:08 2011 +0200 summary: replace() uses unicode_fromascii() if the input and replace string is ASCII files: Objects/unicodeobject.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9708,7 +9708,10 @@ sbuf + PyUnicode_KIND_SIZE(rkind, i), PyUnicode_KIND_SIZE(rkind, slen-i)); } - u = PyUnicode_FromKindAndData(rkind, res, new_size); + if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(str2)) + u = unicode_fromascii((unsigned char*)res, new_size); + else + u = PyUnicode_FromKindAndData(rkind, res, new_size); PyMem_Free(res); } if (srelease) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 01:51:01 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 01:51:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_post-condition_in_unico?= =?utf8?q?de=5Frepr=28=29=3A_check_the_result=2C_not_the_input?= Message-ID: http://hg.python.org/cpython/rev/18e5c247c625 changeset: 72713:18e5c247c625 user: Victor Stinner date: Thu Oct 06 01:13:58 2011 +0200 summary: Fix post-condition in unicode_repr(): check the result, not the input files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11589,7 +11589,7 @@ } } /* Closing quote already added at the beginning */ - assert(_PyUnicode_CheckConsistency(unicode, 1)); + assert(_PyUnicode_CheckConsistency(repr, 1)); return repr; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 01:51:02 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 01:51:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Don=27t_check_for_the_maxim?= =?utf8?q?um_character_when_copying_from_unicodeobject=2Ec?= Message-ID: http://hg.python.org/cpython/rev/6f03716079a9 changeset: 72714:6f03716079a9 user: Victor Stinner date: Thu Oct 06 01:45:57 2011 +0200 summary: Don't check for the maximum character when copying from unicodeobject.c * Create copy_characters() function which doesn't check for the maximum character in release mode * _PyUnicode_CheckConsistency() is no more static to be able to use it in _PyUnicode_FormatAdvanced() (in formatter_unicode.c) * _PyUnicode_CheckConsistency() checks the string hash files: Include/unicodeobject.h | 7 + Objects/unicodeobject.c | 378 ++++++++++++------------ Python/formatter_unicode.c | 16 +- 3 files changed, 203 insertions(+), 198 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2030,6 +2030,13 @@ ); #endif /* Py_LIMITED_API */ +#if defined(Py_DEBUG) && !defined(Py_LIMITED_API) +/* FIXME: use PyObject* type for op */ +PyAPI_FUNC(int) _PyUnicode_CheckConsistency( + void *op, + int check_content); +#endif + #ifdef __cplusplus } #endif diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -239,6 +239,11 @@ /* forward */ static PyUnicodeObject *_PyUnicode_New(Py_ssize_t length); static PyObject* get_latin1_char(unsigned char ch); +static void copy_characters( + PyObject *to, Py_ssize_t to_start, + PyObject *from, Py_ssize_t from_start, + Py_ssize_t how_many); +static int unicode_is_singleton(PyObject *unicode); static PyObject * unicode_encode_call_errorhandler(const char *errors, @@ -296,7 +301,7 @@ } #ifdef Py_DEBUG -static int +int /* FIXME: use PyObject* type for op */ _PyUnicode_CheckConsistency(void *op, int check_content) { @@ -395,6 +400,8 @@ else assert(maxchar >= 0x10000); } + if (check_content && !unicode_is_singleton((PyObject*)ascii)) + assert(ascii->hash == -1); return 1; } #endif @@ -601,13 +608,7 @@ return NULL; copy_length = Py_MIN(length, PyUnicode_GET_LENGTH(unicode)); - if (PyUnicode_CopyCharacters(copy, 0, - unicode, 0, - copy_length) < 0) - { - Py_DECREF(copy); - return NULL; - } + copy_characters(copy, 0, unicode, 0, copy_length); return copy; } else { @@ -953,47 +954,55 @@ return 0; } -Py_ssize_t -PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, - PyObject *from, Py_ssize_t from_start, - Py_ssize_t how_many) +static int +_copy_characters(PyObject *to, Py_ssize_t to_start, + PyObject *from, Py_ssize_t from_start, + Py_ssize_t how_many, int check_maxchar) { unsigned int from_kind, to_kind; void *from_data, *to_data; - - if (!PyUnicode_Check(from) || !PyUnicode_Check(to)) { - PyErr_BadInternalCall(); - return -1; - } - - if (PyUnicode_READY(from)) - return -1; - if (PyUnicode_READY(to)) - return -1; - - how_many = Py_MIN(PyUnicode_GET_LENGTH(from), how_many); - if (to_start + how_many > PyUnicode_GET_LENGTH(to)) { - PyErr_Format(PyExc_SystemError, - "Cannot write %zi characters at %zi " - "in a string of %zi characters", - how_many, to_start, PyUnicode_GET_LENGTH(to)); - return -1; - } + int fast; + + assert(PyUnicode_Check(from)); + assert(PyUnicode_Check(to)); + assert(PyUnicode_IS_READY(from)); + assert(PyUnicode_IS_READY(to)); + + assert(PyUnicode_GET_LENGTH(from) >= how_many); + assert(to_start + how_many <= PyUnicode_GET_LENGTH(to)); + assert(0 <= how_many); + if (how_many == 0) return 0; - if (_PyUnicode_Dirty(to)) - return -1; - from_kind = PyUnicode_KIND(from); from_data = PyUnicode_DATA(from); to_kind = PyUnicode_KIND(to); to_data = PyUnicode_DATA(to); - if (from_kind == to_kind +#ifdef Py_DEBUG + if (!check_maxchar + && (from_kind > to_kind + || (!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to)))) + { + const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); + Py_UCS4 ch; + Py_ssize_t i; + for (i=0; i < how_many; i++) { + ch = PyUnicode_READ(from_kind, from_data, from_start + i); + assert(ch <= to_maxchar); + } + } +#endif + fast = (from_kind == to_kind); + if (check_maxchar + && (!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to))) + { /* deny latin1 => ascii */ - && !(!PyUnicode_IS_ASCII(from) && PyUnicode_IS_ASCII(to))) - { + fast = 0; + } + + if (fast) { Py_MEMCPY((char*)to_data + PyUnicode_KIND_SIZE(to_kind, to_start), (char*)from_data @@ -1031,8 +1040,6 @@ ); } else { - int invalid_kinds; - /* check if max_char(from substring) <= max_char(to) */ if (from_kind > to_kind /* latin1 => ascii */ @@ -1040,34 +1047,77 @@ { /* slow path to check for character overflow */ const Py_UCS4 to_maxchar = PyUnicode_MAX_CHAR_VALUE(to); - Py_UCS4 ch, maxchar; + Py_UCS4 ch; Py_ssize_t i; - maxchar = 0; - invalid_kinds = 0; for (i=0; i < how_many; i++) { ch = PyUnicode_READ(from_kind, from_data, from_start + i); - if (ch > maxchar) { - maxchar = ch; - if (maxchar > to_maxchar) { - invalid_kinds = 1; - break; - } + if (check_maxchar) { + if (ch > to_maxchar) + return 1; + } + else { + assert(ch <= to_maxchar); } PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); } } - else - invalid_kinds = 1; - if (invalid_kinds) { - PyErr_Format(PyExc_SystemError, - "Cannot copy %s characters " - "into a string of %s characters", - unicode_kind_name(from), - unicode_kind_name(to)); + else { return -1; } } + return 0; +} + +static void +copy_characters(PyObject *to, Py_ssize_t to_start, + PyObject *from, Py_ssize_t from_start, + Py_ssize_t how_many) +{ + (void)_copy_characters(to, to_start, from, from_start, how_many, 0); +} + +Py_ssize_t +PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, + PyObject *from, Py_ssize_t from_start, + Py_ssize_t how_many) +{ + int err; + + if (!PyUnicode_Check(from) || !PyUnicode_Check(to)) { + PyErr_BadInternalCall(); + return -1; + } + + if (PyUnicode_READY(from)) + return -1; + if (PyUnicode_READY(to)) + return -1; + + how_many = Py_MIN(PyUnicode_GET_LENGTH(from), how_many); + if (to_start + how_many > PyUnicode_GET_LENGTH(to)) { + PyErr_Format(PyExc_SystemError, + "Cannot write %zi characters at %zi " + "in a string of %zi characters", + how_many, to_start, PyUnicode_GET_LENGTH(to)); + return -1; + } + + if (how_many == 0) + return 0; + + if (_PyUnicode_Dirty(to)) + return -1; + + err = _copy_characters(to, to_start, from, from_start, how_many, 1); + if (err) { + PyErr_Format(PyExc_SystemError, + "Cannot copy %s characters " + "into a string of %s characters", + unicode_kind_name(from), + unicode_kind_name(to)); + return -1; + } return how_many; } @@ -1327,6 +1377,23 @@ } } +#ifdef Py_DEBUG +static int +unicode_is_singleton(PyObject *unicode) +{ + PyASCIIObject *ascii = (PyASCIIObject *)unicode; + if (unicode == unicode_empty) + return 1; + if (ascii->state.kind != PyUnicode_WCHAR_KIND && ascii->length == 1) + { + Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); + if (ch < 256 && unicode_latin1[ch] == unicode) + return 1; + } + return 0; +} +#endif + static int unicode_resizable(PyObject *unicode) { @@ -1334,15 +1401,9 @@ return 0; if (PyUnicode_CHECK_INTERNED(unicode)) return 0; - assert(unicode != unicode_empty); #ifdef Py_DEBUG - if (_PyUnicode_KIND(unicode) != PyUnicode_WCHAR_KIND - && PyUnicode_GET_LENGTH(unicode) == 1) - { - Py_UCS4 ch = PyUnicode_READ_CHAR(unicode, 0); - if (ch < 256 && unicode_latin1[ch] == unicode) - return 0; - } + /* singleton refcount is greater than 1 */ + assert(!unicode_is_singleton(unicode)); #endif return 1; } @@ -1971,7 +2032,7 @@ int precision = 0; int zeropad; const char* f; - PyUnicodeObject *string; + PyObject *string; /* used by sprintf */ char fmt[61]; /* should be enough for %0width.precisionlld */ Py_UCS4 maxchar = 127; /* result is ASCII by default */ @@ -2270,7 +2331,7 @@ /* Since we've analyzed how much space we need, we don't have to resize the string. There can be no errors beyond this point. */ - string = (PyUnicodeObject *)PyUnicode_New(n, maxchar); + string = PyUnicode_New(n, maxchar); if (!string) goto fail; kind = PyUnicode_KIND(string); @@ -2321,10 +2382,7 @@ (void) va_arg(vargs, char *); size = PyUnicode_GET_LENGTH(*callresult); assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string)); - if (PyUnicode_CopyCharacters((PyObject*)string, i, - *callresult, 0, - size) < 0) - goto fail; + copy_characters(string, i, *callresult, 0, size); i += size; /* We're done with the unicode()/repr() => forget it */ Py_DECREF(*callresult); @@ -2338,10 +2396,7 @@ Py_ssize_t size; assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string)); size = PyUnicode_GET_LENGTH(obj); - if (PyUnicode_CopyCharacters((PyObject*)string, i, - obj, 0, - size) < 0) - goto fail; + copy_characters(string, i, obj, 0, size); i += size; break; } @@ -2353,19 +2408,13 @@ if (obj) { size = PyUnicode_GET_LENGTH(obj); assert(PyUnicode_KIND(obj) <= PyUnicode_KIND(string)); - if (PyUnicode_CopyCharacters((PyObject*)string, i, - obj, 0, - size) < 0) - goto fail; + copy_characters(string, i, obj, 0, size); i += size; } else { size = PyUnicode_GET_LENGTH(*callresult); assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string)); - if (PyUnicode_CopyCharacters((PyObject*)string, i, - *callresult, - 0, size) < 0) - goto fail; + copy_characters(string, i, *callresult, 0, size); i += size; Py_DECREF(*callresult); } @@ -2376,14 +2425,12 @@ case 'R': case 'A': { + Py_ssize_t size = PyUnicode_GET_LENGTH(*callresult); /* unused, since we already have the result */ (void) va_arg(vargs, PyObject *); assert(PyUnicode_KIND(*callresult) <= PyUnicode_KIND(string)); - if (PyUnicode_CopyCharacters((PyObject*)string, i, - *callresult, 0, - PyUnicode_GET_LENGTH(*callresult)) < 0) - goto fail; - i += PyUnicode_GET_LENGTH(*callresult); + copy_characters(string, i, *callresult, 0, size); + i += size; /* We're done with the unicode()/repr() => forget it */ Py_DECREF(*callresult); /* switch to next unicode()/repr() result */ @@ -8795,24 +8842,12 @@ /* If the maxchar increased so that the kind changed, not all characters are representable anymore and we need to fix the string again. This only happens in very few cases. */ - if (PyUnicode_CopyCharacters(v, 0, - (PyObject*)self, 0, - PyUnicode_GET_LENGTH(self)) < 0) - { - Py_DECREF(u); - return NULL; - } + copy_characters(v, 0, self, 0, PyUnicode_GET_LENGTH(self)); maxchar_old = fixfct(v); assert(maxchar_old > 0 && maxchar_old <= maxchar_new); } else { - if (PyUnicode_CopyCharacters(v, 0, - u, 0, - PyUnicode_GET_LENGTH(self)) < 0) - { - Py_DECREF(u); - return NULL; - } + copy_characters(v, 0, u, 0, PyUnicode_GET_LENGTH(self)); } Py_DECREF(u); @@ -9016,7 +9051,7 @@ PyObject **items; PyObject *item; Py_ssize_t sz, i, res_offset; - Py_UCS4 maxchar = 0; + Py_UCS4 maxchar; Py_UCS4 item_maxchar; fseq = PySequence_Fast(seq, ""); @@ -9031,44 +9066,45 @@ seqlen = PySequence_Fast_GET_SIZE(fseq); /* If empty sequence, return u"". */ if (seqlen == 0) { - res = PyUnicode_New(0, 0); - goto Done; - } + Py_DECREF(fseq); + Py_INCREF(unicode_empty); + res = unicode_empty; + return res; + } + + /* If singleton sequence with an exact Unicode, return that. */ items = PySequence_Fast_ITEMS(fseq); - /* If singleton sequence with an exact Unicode, return that. */ - if (seqlen == 1) { - item = items[0]; - if (PyUnicode_CheckExact(item)) { - Py_INCREF(item); - res = item; - goto Done; - } + if (seqlen == 1 && PyUnicode_CheckExact(items[0])) { + res = items[0]; + Py_INCREF(res); + Py_DECREF(fseq); + return res; + } + + /* Set up sep and seplen */ + if (separator == NULL) { + /* fall back to a blank space separator */ + sep = PyUnicode_FromOrdinal(' '); + if (!sep) + goto onError; + maxchar = 32; } else { - /* Set up sep and seplen */ - if (separator == NULL) { - /* fall back to a blank space separator */ - sep = PyUnicode_FromOrdinal(' '); - if (!sep) - goto onError; - } - else { - if (!PyUnicode_Check(separator)) { - PyErr_Format(PyExc_TypeError, - "separator: expected str instance," - " %.80s found", - Py_TYPE(separator)->tp_name); - goto onError; - } - if (PyUnicode_READY(separator)) - goto onError; - sep = separator; - seplen = PyUnicode_GET_LENGTH(separator); - maxchar = PyUnicode_MAX_CHAR_VALUE(separator); - /* inc refcount to keep this code path symmetric with the - above case of a blank separator */ - Py_INCREF(sep); - } + if (!PyUnicode_Check(separator)) { + PyErr_Format(PyExc_TypeError, + "separator: expected str instance," + " %.80s found", + Py_TYPE(separator)->tp_name); + goto onError; + } + if (PyUnicode_READY(separator)) + goto onError; + sep = separator; + seplen = PyUnicode_GET_LENGTH(separator); + maxchar = PyUnicode_MAX_CHAR_VALUE(separator); + /* inc refcount to keep this code path symmetric with the + above case of a blank separator */ + Py_INCREF(sep); } /* There are at least two things to join, or else we have a subclass @@ -9108,36 +9144,21 @@ /* Catenate everything. */ for (i = 0, res_offset = 0; i < seqlen; ++i) { - Py_ssize_t itemlen, copied; + Py_ssize_t itemlen; item = items[i]; /* Copy item, and maybe the separator. */ if (i && seplen != 0) { - copied = PyUnicode_CopyCharacters(res, res_offset, - sep, 0, seplen); - if (copied < 0) - goto onError; -#ifdef Py_DEBUG - res_offset += copied; -#else + copy_characters(res, res_offset, sep, 0, seplen); res_offset += seplen; -#endif } itemlen = PyUnicode_GET_LENGTH(item); if (itemlen != 0) { - copied = PyUnicode_CopyCharacters(res, res_offset, - item, 0, itemlen); - if (copied < 0) - goto onError; -#ifdef Py_DEBUG - res_offset += copied; -#else + copy_characters(res, res_offset, item, 0, itemlen); res_offset += itemlen; -#endif } } assert(res_offset == PyUnicode_GET_LENGTH(res)); - Done: Py_DECREF(fseq); Py_XDECREF(sep); assert(_PyUnicode_CheckConsistency(res, 1)); @@ -9212,14 +9233,7 @@ FILL(kind, data, fill, 0, left); if (right) FILL(kind, data, fill, left + _PyUnicode_LENGTH(self), right); - if (PyUnicode_CopyCharacters(u, left, - (PyObject*)self, 0, - _PyUnicode_LENGTH(self)) < 0) - { - Py_DECREF(u); - return NULL; - } - + copy_characters(u, left, self, 0, _PyUnicode_LENGTH(self)); assert(_PyUnicode_CheckConsistency(u, 1)); return u; } @@ -9536,12 +9550,7 @@ u = PyUnicode_New(slen, maxchar); if (!u) goto error; - if (PyUnicode_CopyCharacters(u, 0, - (PyObject*)self, 0, slen) < 0) - { - Py_DECREF(u); - return NULL; - } + copy_characters(u, 0, self, 0, slen); rkind = PyUnicode_KIND(u); for (i = 0; i < PyUnicode_GET_LENGTH(u); i++) if (PyUnicode_READ(rkind, PyUnicode_DATA(u), i) == u1) { @@ -10160,12 +10169,8 @@ maxchar); if (w == NULL) goto onError; - if (PyUnicode_CopyCharacters(w, 0, u, 0, PyUnicode_GET_LENGTH(u)) < 0) - goto onError; - if (PyUnicode_CopyCharacters(w, PyUnicode_GET_LENGTH(u), - v, 0, - PyUnicode_GET_LENGTH(v)) < 0) - goto onError; + copy_characters(w, 0, u, 0, PyUnicode_GET_LENGTH(u)); + copy_characters(w, PyUnicode_GET_LENGTH(u), v, 0, PyUnicode_GET_LENGTH(v)); Py_DECREF(u); Py_DECREF(v); assert(_PyUnicode_CheckConsistency(w, 1)); @@ -10181,9 +10186,6 @@ unicode_append_inplace(PyObject **p_left, PyObject *right) { Py_ssize_t left_len, right_len, new_len; -#ifdef Py_DEBUG - Py_ssize_t copied; -#endif assert(PyUnicode_IS_READY(*p_left)); assert(PyUnicode_IS_READY(right)); @@ -10210,14 +10212,8 @@ goto error; } /* copy 'right' into the newly allocated area of 'left' */ -#ifdef Py_DEBUG - copied = PyUnicode_CopyCharacters(*p_left, left_len, - right, 0, - right_len); - assert(0 <= copied); -#else - PyUnicode_CopyCharacters(*p_left, left_len, right, 0, right_len); -#endif + copy_characters(*p_left, left_len, right, 0, right_len); + _PyUnicode_DIRTY(*p_left); return; error: @@ -10270,7 +10266,6 @@ if (res == NULL) goto error; Py_DECREF(left); - assert(_PyUnicode_CheckConsistency(res, 1)); *p_left = res; return; @@ -12332,8 +12327,6 @@ out = _PyUnicode_FormatAdvanced(self, format_spec, 0, PyUnicode_GET_LENGTH(format_spec)); - if (out != NULL) - assert(_PyUnicode_CheckConsistency(out, 1)); return out; } @@ -13174,7 +13167,11 @@ length = PyUnicode_GET_LENGTH(unicode); _PyUnicode_LENGTH(self) = length; +#ifdef Py_DEBUG + _PyUnicode_HASH(self) = -1; +#else _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode); +#endif _PyUnicode_STATE(self).interned = 0; _PyUnicode_STATE(self).kind = kind; _PyUnicode_STATE(self).compact = 0; @@ -13230,6 +13227,9 @@ PyUnicode_KIND_SIZE(kind, length + 1)); Py_DECREF(unicode); assert(_PyUnicode_CheckConsistency(self, 1)); +#ifdef Py_DEBUG + _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode); +#endif return (PyObject *)self; onError: diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -1284,33 +1284,31 @@ Py_ssize_t start, Py_ssize_t end) { InternalFormatSpec format; - PyObject *result = NULL; + PyObject *result; /* check for the special case of zero length format spec, make it equivalent to str(obj) */ - if (start == end) { - result = PyObject_Str(obj); - goto done; - } + if (start == end) + return PyObject_Str(obj); /* parse the format_spec */ if (!parse_internal_render_format_spec(format_spec, start, end, &format, 's', '<')) - goto done; + return NULL; /* type conversion? */ switch (format.type) { case 's': /* no type conversion needed, already a string. do the formatting */ result = format_string_internal(obj, &format); + if (result != NULL) + assert(_PyUnicode_CheckConsistency(result, 1)); break; default: /* unknown */ unknown_presentation_type(format.type, obj->ob_type->tp_name); - goto done; + result = NULL; } - -done: return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 01:51:03 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 01:51:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_rephrase_PyUnicode=5F1BYTE?= =?utf8?q?=5FKIND_documentation?= Message-ID: http://hg.python.org/cpython/rev/341c3002ffb2 changeset: 72715:341c3002ffb2 user: Victor Stinner date: Thu Oct 06 01:51:19 2011 +0200 summary: rephrase PyUnicode_1BYTE_KIND documentation files: Include/unicodeobject.h | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -296,13 +296,14 @@ - PyUnicode_1BYTE_KIND (1): * character type = Py_UCS1 (8 bits, unsigned) - * if ascii is 1, at least one character must be in range - U+80-U+FF, otherwise all characters must be in range U+00-U+7F + * if ascii is set, all characters must be in range + U+0000-U+007F, otherwise at least one character must be in range + U+0080-U+00FF - PyUnicode_2BYTE_KIND (2): * character type = Py_UCS2 (16 bits, unsigned) - * at least one character must be in range U+0100-U+1FFFF + * at least one character must be in range U+0100-U+FFFF - PyUnicode_4BYTE_KIND (3): @@ -315,9 +316,9 @@ one block for the PyUnicodeObject struct and another for its data buffer. */ unsigned int compact:1; - /* kind is PyUnicode_1BYTE_KIND but data contains only ASCII - characters. If ascii is 1 and compact is 1, use the PyASCIIObject - structure. */ + /* The string only contains characters in range U+0000-U+007F (ASCII) + and the kind is PyUnicode_1BYTE_KIND. If ascii is set and compact is + set, use the PyASCIIObject structure. */ unsigned int ascii:1; /* The ready flag indicates whether the object layout is initialized completely. This means that this is either a compact object, or -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 02:37:42 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 02:37:42 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_=5Fwarnings=2Ec=3A_make?= =?utf8?q?_the_filename_string_ready?= Message-ID: http://hg.python.org/cpython/rev/b1e5ade81097 changeset: 72716:b1e5ade81097 user: Victor Stinner date: Thu Oct 06 02:34:51 2011 +0200 summary: Fix _warnings.c: make the filename string ready files: Python/_warnings.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -497,9 +497,16 @@ /* Setup filename. */ *filename = PyDict_GetItemString(globals, "__file__"); if (*filename != NULL && PyUnicode_Check(*filename)) { - Py_ssize_t len = PyUnicode_GetSize(*filename); - int kind = PyUnicode_KIND(*filename); - void *data = PyUnicode_DATA(*filename); + Py_ssize_t len; + int kind; + void *data; + + if (PyUnicode_READY(*filename)) + goto handle_error; + + len = PyUnicode_GetSize(*filename); + kind = PyUnicode_KIND(*filename); + data = PyUnicode_DATA(*filename); /* if filename.lower().endswith((".pyc", ".pyo")): */ if (len >= 4 && -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 02:37:43 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 02:37:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_compiler_warning=3A_d?= =?utf8?q?on=27t_define_unicode=5Fis=5Fsingleton=28=29_in_release_mode?= Message-ID: http://hg.python.org/cpython/rev/0535bf5e1ea6 changeset: 72717:0535bf5e1ea6 user: Victor Stinner date: Thu Oct 06 02:36:59 2011 +0200 summary: Fix a compiler warning: don't define unicode_is_singleton() in release mode files: Objects/unicodeobject.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -243,7 +243,9 @@ PyObject *to, Py_ssize_t to_start, PyObject *from, Py_ssize_t from_start, Py_ssize_t how_many); +#ifdef Py_DEBUG static int unicode_is_singleton(PyObject *unicode); +#endif static PyObject * unicode_encode_call_errorhandler(const char *errors, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 02:39:14 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 02:39:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_find=5Fmodule=5Fpath=28?= =?utf8?q?=29=3A_make_the_string_ready?= Message-ID: http://hg.python.org/cpython/rev/c97ba8f80935 changeset: 72718:c97ba8f80935 user: Victor Stinner date: Thu Oct 06 02:39:42 2011 +0200 summary: Fix find_module_path(): make the string ready files: Python/import.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1785,6 +1785,9 @@ else return 0; + if (PyUnicode_READY(path_unicode)) + return -1; + len = PyUnicode_GET_LENGTH(path_unicode); if (!PyUnicode_AsUCS4(path_unicode, buf, Py_ARRAY_LENGTH(buf), 1)) { Py_DECREF(path_unicode); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 02:47:07 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 02:47:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5Fcopy=5Fcharacters=28=29_?= =?utf8?q?fails_more_quickly_in_debug_mode_on_inconsistent_state?= Message-ID: http://hg.python.org/cpython/rev/357750802e86 changeset: 72719:357750802e86 user: Victor Stinner date: Thu Oct 06 02:47:11 2011 +0200 summary: _copy_characters() fails more quickly in debug mode on inconsistent state files: Objects/unicodeobject.c | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1052,20 +1052,32 @@ Py_UCS4 ch; Py_ssize_t i; +#ifdef Py_DEBUG for (i=0; i < how_many; i++) { ch = PyUnicode_READ(from_kind, from_data, from_start + i); - if (check_maxchar) { + assert(ch <= to_maxchar); + PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); + } +#else + if (!check_maxchar) { + for (i=0; i < how_many; i++) { + ch = PyUnicode_READ(from_kind, from_data, from_start + i); + PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); + } + } + else { + for (i=0; i < how_many; i++) { + ch = PyUnicode_READ(from_kind, from_data, from_start + i); if (ch > to_maxchar) return 1; - } - else { - assert(ch <= to_maxchar); - } - PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); - } + PyUnicode_WRITE(to_kind, to_data, to_start + i, ch); + } + } +#endif } else { - return -1; + assert(0 && "inconsistent state"); + return 1; } } return 0; -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 6 05:26:04 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 06 Oct 2011 05:26:04 +0200 Subject: [Python-checkins] Daily reference leaks (357750802e86): sum=0 Message-ID: results for 357750802e86 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogsv0ruJ', '-x'] From python-checkins at python.org Thu Oct 6 12:37:17 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 12:37:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_str=2Ereplace=28=29_avoids_?= =?utf8?q?memory_when_it=27s_possible?= Message-ID: http://hg.python.org/cpython/rev/79c68caacb73 changeset: 72720:79c68caacb73 user: Victor Stinner date: Thu Oct 06 12:31:55 2011 +0200 summary: str.replace() avoids memory when it's possible files: Objects/unicodeobject.c | 102 +++++++++++++++++++++++---- 1 files changed, 84 insertions(+), 18 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1741,6 +1741,63 @@ } } +/* Ensure that a string uses the most efficient storage, if it is not the + case: create a new string with of the right kind. Write NULL into *p_unicode + on error. */ +void +unicode_adjust_maxchar(PyObject **p_unicode) +{ + PyObject *unicode, *copy; + Py_UCS4 max_char; + Py_ssize_t i, len; + unsigned int kind; + + assert(p_unicode != NULL); + unicode = *p_unicode; + assert(PyUnicode_IS_READY(unicode)); + if (PyUnicode_IS_ASCII(unicode)) + return; + + len = PyUnicode_GET_LENGTH(unicode); + kind = PyUnicode_KIND(unicode); + if (kind == PyUnicode_1BYTE_KIND) { + const Py_UCS1 *u = PyUnicode_1BYTE_DATA(unicode); + for (i = 0; i < len; i++) { + if (u[i] & 0x80) + return; + } + max_char = 127; + } + else if (kind == PyUnicode_2BYTE_KIND) { + const Py_UCS2 *u = PyUnicode_2BYTE_DATA(unicode); + max_char = 0; + for (i = 0; i < len; i++) { + if (u[i] > max_char) { + max_char = u[i]; + if (max_char >= 256) + return; + } + } + } + else { + assert(kind == PyUnicode_4BYTE_KIND); + const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode); + max_char = 0; + for (i = 0; i < len; i++) { + if (u[i] > max_char) { + max_char = u[i]; + if (max_char >= 0x10000) + return; + } + } + } + assert(max_char > PyUnicode_MAX_CHAR_VALUE(unicode)); + copy = PyUnicode_New(len, max_char); + copy_characters(copy, 0, unicode, 0, len); + Py_DECREF(unicode); + *p_unicode = copy; +} + PyObject* PyUnicode_Copy(PyObject *unicode) { @@ -9573,14 +9630,16 @@ PyUnicode_WRITE(rkind, PyUnicode_DATA(u), i, u2); } if (mayshrink) { - PyObject *tmp = u; - u = PyUnicode_FromKindAndData(rkind, PyUnicode_DATA(tmp), - PyUnicode_GET_LENGTH(tmp)); - Py_DECREF(tmp); + unicode_adjust_maxchar(&u); + if (u == NULL) + goto error; } } else { int rkind = skind; char *res; + PyObject *rstr; + Py_UCS4 maxchar; + if (kind1 < rkind) { /* widen substring */ buf1 = _PyUnicode_AsKind(str1, rkind); @@ -9607,11 +9666,13 @@ if (!buf1) goto error; release1 = 1; } - res = PyMem_Malloc(PyUnicode_KIND_SIZE(rkind, slen)); - if (!res) { - PyErr_NoMemory(); + maxchar = PyUnicode_MAX_CHAR_VALUE(self); + maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(str2)); + rstr = PyUnicode_New(slen, maxchar); + if (!rstr) goto error; - } + res = PyUnicode_DATA(rstr); + memcpy(res, sbuf, PyUnicode_KIND_SIZE(rkind, slen)); /* change everything in-place, starting with this one */ memcpy(res + PyUnicode_KIND_SIZE(rkind, i), @@ -9631,16 +9692,19 @@ i += len1; } - u = PyUnicode_FromKindAndData(rkind, res, slen); - PyMem_Free(res); - if (!u) goto error; + u = rstr; + unicode_adjust_maxchar(&u); + if (!u) + goto error; } } else { Py_ssize_t n, i, j, ires; Py_ssize_t product, new_size; int rkind = skind; + PyObject *rstr; char *res; + Py_UCS4 maxchar; if (kind1 < rkind) { buf1 = _PyUnicode_AsKind(str1, rkind); @@ -9679,9 +9743,12 @@ "replace string is too long"); goto error; } - res = PyMem_Malloc(PyUnicode_KIND_SIZE(rkind, new_size)); - if (!res) + maxchar = PyUnicode_MAX_CHAR_VALUE(self); + maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(str2)); + rstr = PyUnicode_New(new_size, maxchar); + if (!rstr) goto error; + res = PyUnicode_DATA(rstr); ires = i = 0; if (len1 > 0) { while (n-- > 0) { @@ -9731,11 +9798,10 @@ sbuf + PyUnicode_KIND_SIZE(rkind, i), PyUnicode_KIND_SIZE(rkind, slen-i)); } - if (PyUnicode_IS_ASCII(self) && PyUnicode_IS_ASCII(str2)) - u = unicode_fromascii((unsigned char*)res, new_size); - else - u = PyUnicode_FromKindAndData(rkind, res, new_size); - PyMem_Free(res); + u = rstr; + unicode_adjust_maxchar(&u); + if (u == NULL) + goto error; } if (srelease) PyMem_FREE(sbuf); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 12:37:17 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 12:37:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_my_last_change_on_PyUni?= =?utf8?q?code=5FJoin=28=29=3A_don=27t_process_separator_if_len=3D=3D1?= Message-ID: http://hg.python.org/cpython/rev/3636a39fa557 changeset: 72721:3636a39fa557 user: Victor Stinner date: Thu Oct 06 12:32:37 2011 +0200 summary: Fix my last change on PyUnicode_Join(): don't process separator if len==1 files: Objects/unicodeobject.c | 62 +++++++++++++++------------- 1 files changed, 33 insertions(+), 29 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9145,37 +9145,41 @@ /* If singleton sequence with an exact Unicode, return that. */ items = PySequence_Fast_ITEMS(fseq); - if (seqlen == 1 && PyUnicode_CheckExact(items[0])) { - res = items[0]; - Py_INCREF(res); - Py_DECREF(fseq); - return res; - } - - /* Set up sep and seplen */ - if (separator == NULL) { - /* fall back to a blank space separator */ - sep = PyUnicode_FromOrdinal(' '); - if (!sep) - goto onError; - maxchar = 32; + if (seqlen == 1) { + if (PyUnicode_CheckExact(items[0])) { + res = items[0]; + Py_INCREF(res); + Py_DECREF(fseq); + return res; + } + sep = NULL; } else { - if (!PyUnicode_Check(separator)) { - PyErr_Format(PyExc_TypeError, - "separator: expected str instance," - " %.80s found", - Py_TYPE(separator)->tp_name); - goto onError; - } - if (PyUnicode_READY(separator)) - goto onError; - sep = separator; - seplen = PyUnicode_GET_LENGTH(separator); - maxchar = PyUnicode_MAX_CHAR_VALUE(separator); - /* inc refcount to keep this code path symmetric with the - above case of a blank separator */ - Py_INCREF(sep); + /* Set up sep and seplen */ + if (separator == NULL) { + /* fall back to a blank space separator */ + sep = PyUnicode_FromOrdinal(' '); + if (!sep) + goto onError; + maxchar = 32; + } + else { + if (!PyUnicode_Check(separator)) { + PyErr_Format(PyExc_TypeError, + "separator: expected str instance," + " %.80s found", + Py_TYPE(separator)->tp_name); + goto onError; + } + if (PyUnicode_READY(separator)) + goto onError; + sep = separator; + seplen = PyUnicode_GET_LENGTH(separator); + maxchar = PyUnicode_MAX_CHAR_VALUE(separator); + /* inc refcount to keep this code path symmetric with the + above case of a blank separator */ + Py_INCREF(sep); + } } /* There are at least two things to join, or else we have a subclass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:19:43 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:19:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Move_doc_of_sys?= =?utf8?q?=2Edont=5Fwrite=5Fbytecode_to_make_all_attributes_sorted_again?= Message-ID: http://hg.python.org/cpython/rev/8ef2436b14ec changeset: 72722:8ef2436b14ec branch: 2.7 parent: 72660:504981afa007 user: ?ric Araujo date: Wed Oct 05 02:25:58 2011 +0200 summary: Move doc of sys.dont_write_bytecode to make all attributes sorted again files: Doc/library/sys.rst | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -95,6 +95,17 @@ customized by assigning another one-argument function to ``sys.displayhook``. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. versionadded:: 2.6 + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -786,17 +797,6 @@ .. versionadded:: 2.6 -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. versionadded:: 2.6 - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:19:44 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:19:44 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_markup_used?= =?utf8?q?_in_the_documentation_of_sys=2Eprefix_and_sys=2Eexec=5Fprefix=2E?= Message-ID: http://hg.python.org/cpython/rev/9f6704da4abb changeset: 72723:9f6704da4abb branch: 2.7 user: ?ric Araujo date: Wed Oct 05 02:34:28 2011 +0200 summary: Fix markup used in the documentation of sys.prefix and sys.exec_prefix. - Using the file role with {placeholders} is IMO clearer than fake Python code. - The fact that sys.version[:3] gives '2.7' is a CPython detail and should not be advertised (see #9442), even if some stdlib modules currently rely on that detail. files: Doc/library/sys.rst | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -207,10 +207,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``2.7``. .. data:: executable @@ -766,10 +766,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``2.7``. .. data:: ps1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:19:45 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:19:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_typo_and_ca?= =?utf8?q?se_in_a_recently_added_test?= Message-ID: http://hg.python.org/cpython/rev/3b2aea6b1628 changeset: 72724:3b2aea6b1628 branch: 2.7 user: ?ric Araujo date: Wed Oct 05 02:35:09 2011 +0200 summary: Fix typo and case in a recently added test files: Lib/test/test_minidom.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -439,7 +439,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:19:46 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:19:46 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/83c486c1112c changeset: 72725:83c486c1112c branch: 2.7 parent: 72707:16c4137a413c parent: 72724:3b2aea6b1628 user: ?ric Araujo date: Thu Oct 06 13:19:34 2011 +0200 summary: Branch merge files: Doc/library/sys.rst | 36 ++++++++++++++-------------- Lib/test/test_minidom.py | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -95,6 +95,17 @@ customized by assigning another one-argument function to ``sys.displayhook``. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. versionadded:: 2.6 + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -196,10 +207,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``2.7``. .. data:: executable @@ -755,10 +766,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``2.7``. .. data:: ps1 @@ -786,17 +797,6 @@ .. versionadded:: 2.6 -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. versionadded:: 2.6 - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -439,7 +439,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:20:50 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:50 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Add_tests_for_comparing_?= =?utf8?q?candidate_and_final_versions_=28=2311841=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/1f1de3b5b520 changeset: 1197:1f1de3b5b520 parent: 1195:9e4d083c4ad6 user: ?ric Araujo date: Wed Oct 05 00:58:40 2011 +0200 summary: Add tests for comparing candidate and final versions (#11841). This used to be buggy; Filip Gruszczy?ski contributed these tests and a code patch but the latter is not needed. files: distutils2/tests/test_version.py | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/distutils2/tests/test_version.py b/distutils2/tests/test_version.py --- a/distutils2/tests/test_version.py +++ b/distutils2/tests/test_version.py @@ -101,8 +101,18 @@ True >>> V('1.2.0') >= V('1.2.3') False + >>> V('1.2.0rc1') >= V('1.2.0') + False >>> (V('1.0') > V('1.0b2')) True + >>> V('1.0') > V('1.0c2') + True + >>> V('1.0') > V('1.0rc2') + True + >>> V('1.0rc2') > V('1.0rc1') + True + >>> V('1.0c4') > V('1.0c1') + True >>> (V('1.0') > V('1.0c2') > V('1.0c1') > V('1.0b2') > V('1.0b1') ... > V('1.0a2') > V('1.0a1')) True @@ -129,6 +139,8 @@ ... < V('1.0.dev18') ... < V('1.0.dev456') ... < V('1.0.dev1234') + ... < V('1.0rc1') + ... < V('1.0rc2') ... < V('1.0') ... < V('1.0.post456.dev623') # development version of a post release ... < V('1.0.post456')) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:50 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:50 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Cosmetic_fixes_for_white?= =?utf8?q?space_and_a_regex=2E?= Message-ID: http://hg.python.org/distutils2/rev/b42d7955f76a changeset: 1198:b42d7955f76a user: ?ric Araujo date: Wed Oct 05 01:08:51 2011 +0200 summary: Cosmetic fixes for whitespace and a regex. The goal of the regex is to catch a (alpha), b (beta), c or rc (release candidate), so the existing pattern puzzled me. Tests were OK before and after the change. files: distutils2/tests/test_version.py | 8 ++++---- distutils2/version.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/distutils2/tests/test_version.py b/distutils2/tests/test_version.py --- a/distutils2/tests/test_version.py +++ b/distutils2/tests/test_version.py @@ -103,7 +103,7 @@ False >>> V('1.2.0rc1') >= V('1.2.0') False - >>> (V('1.0') > V('1.0b2')) + >>> V('1.0') > V('1.0b2') True >>> V('1.0') > V('1.0c2') True @@ -248,9 +248,9 @@ def test_parse_numdots(self): # For code coverage completeness, as pad_zeros_length can't be set or # influenced from the public interface - self.assertEqual(V('1.0')._parse_numdots('1.0', '1.0', - pad_zeros_length=3), - [1, 0, 0]) + self.assertEqual( + V('1.0')._parse_numdots('1.0', '1.0', pad_zeros_length=3), + [1, 0, 0]) def test_suite(): diff --git a/distutils2/version.py b/distutils2/version.py --- a/distutils2/version.py +++ b/distutils2/version.py @@ -253,7 +253,7 @@ # if we have something like "b-2" or "a.2" at the end of the # version, that is pobably beta, alpha, etc # let's remove the dash or dot - rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) # 1.0-dev-r371 -> 1.0.dev371 # 0.1-dev-r79 -> 0.1.dev79 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:50 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:50 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_=2311841_and_other_changes_from_default?= Message-ID: http://hg.python.org/distutils2/rev/46c31c3c8839 changeset: 1199:46c31c3c8839 branch: python3 parent: 1196:51bb31c537cb parent: 1198:b42d7955f76a user: ?ric Araujo date: Wed Oct 05 01:10:36 2011 +0200 summary: Merge #11841 and other changes from default files: distutils2/tests/test_version.py | 20 ++++++++++++++++---- distutils2/version.py | 2 +- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/distutils2/tests/test_version.py b/distutils2/tests/test_version.py --- a/distutils2/tests/test_version.py +++ b/distutils2/tests/test_version.py @@ -101,7 +101,17 @@ True >>> V('1.2.0') >= V('1.2.3') False - >>> (V('1.0') > V('1.0b2')) + >>> V('1.2.0rc1') >= V('1.2.0') + False + >>> V('1.0') > V('1.0b2') + True + >>> V('1.0') > V('1.0c2') + True + >>> V('1.0') > V('1.0rc2') + True + >>> V('1.0rc2') > V('1.0rc1') + True + >>> V('1.0c4') > V('1.0c1') True >>> (V('1.0') > V('1.0c2') > V('1.0c1') > V('1.0b2') > V('1.0b1') ... > V('1.0a2') > V('1.0a1')) @@ -129,6 +139,8 @@ ... < V('1.0.dev18') ... < V('1.0.dev456') ... < V('1.0.dev1234') + ... < V('1.0rc1') + ... < V('1.0rc2') ... < V('1.0') ... < V('1.0.post456.dev623') # development version of a post release ... < V('1.0.post456')) @@ -236,9 +248,9 @@ def test_parse_numdots(self): # For code coverage completeness, as pad_zeros_length can't be set or # influenced from the public interface - self.assertEqual(V('1.0')._parse_numdots('1.0', '1.0', - pad_zeros_length=3), - [1, 0, 0]) + self.assertEqual( + V('1.0')._parse_numdots('1.0', '1.0', pad_zeros_length=3), + [1, 0, 0]) def test_suite(): diff --git a/distutils2/version.py b/distutils2/version.py --- a/distutils2/version.py +++ b/distutils2/version.py @@ -253,7 +253,7 @@ # if we have something like "b-2" or "a.2" at the end of the # version, that is pobably beta, alpha, etc # let's remove the dash or dot - rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) # 1.0-dev-r371 -> 1.0.dev371 # 0.1-dev-r79 -> 0.1.dev79 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:50 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:50 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Change_one_name_in_test?= =?utf8?q?=5Funinstall_to_avoid_confusion=2E?= Message-ID: http://hg.python.org/distutils2/rev/8be41269957e changeset: 1200:8be41269957e parent: 1198:b42d7955f76a user: ?ric Araujo date: Thu Oct 06 05:34:42 2011 +0200 summary: Change one name in test_uninstall to avoid confusion. install_lib may be the name of a module, a command or an option, so I find it clearer to use site_packages to refer to a string object containing the path of the site-packages directory created in a temporary directory during tests. files: distutils2/tests/test_uninstall.py | 24 +++++++++--------- 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -86,26 +86,26 @@ old_out = sys.stderr sys.stderr = StringIO() dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) - install_lib = self.get_path(dist, 'purelib') - return dist, install_lib + site_packages = self.get_path(dist, 'purelib') + return dist, site_packages def test_uninstall_unknow_distribution(self): self.assertRaises(PackagingError, remove, 'Foo', paths=[self.root_dir]) def test_uninstall(self): - dist, install_lib = self.install_dist() - self.assertIsFile(install_lib, 'foo', '__init__.py') - self.assertIsFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') - self.assertTrue(remove('Foo', paths=[install_lib])) - self.assertIsNotFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsNotFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') + dist, site_packages = self.install_dist() + self.assertIsFile(site_packages, 'foo', '__init__.py') + self.assertIsFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') + self.assertTrue(remove('Foo', paths=[site_packages])) + self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') def test_remove_issue(self): # makes sure if there are OSErrors (like permission denied) # remove() stops and display a clean error - dist, install_lib = self.install_dist('Meh') + dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename @@ -115,11 +115,11 @@ os.rename = _rename try: - self.assertFalse(remove('Meh', paths=[install_lib])) + self.assertFalse(remove('Meh', paths=[site_packages])) finally: os.rename = old - self.assertTrue(remove('Meh', paths=[install_lib])) + self.assertTrue(remove('Meh', paths=[site_packages])) def test_suite(): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:51 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:51 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_incorrect_test=2E?= Message-ID: http://hg.python.org/distutils2/rev/61b0f35818a9 changeset: 1201:61b0f35818a9 user: ?ric Araujo date: Thu Oct 06 05:35:54 2011 +0200 summary: Fix incorrect test. The distutils2.install.remove function (a.k.a. the uninstall feature) takes a path argument to allow client code to use custom directories instead of sys.path. The test used to give self.root_dir as path, which corresponds to a prefix option, but prefix is not on sys.path, it?s only the base directory used to compute the stdlib and site-packages directory paths. The test now gives a valid site-packages path to the function. files: distutils2/tests/test_uninstall.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -89,9 +89,10 @@ site_packages = self.get_path(dist, 'purelib') return dist, site_packages - def test_uninstall_unknow_distribution(self): + def test_uninstall_unknown_distribution(self): + dist, site_packages = self.install_dist('Foospam') self.assertRaises(PackagingError, remove, 'Foo', - paths=[self.root_dir]) + paths=[site_packages]) def test_uninstall(self): dist, site_packages = self.install_dist() -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:51 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:51 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Add_test_that_was_promis?= =?utf8?q?ed_in_a_comment_but_not_actually_written?= Message-ID: http://hg.python.org/distutils2/rev/0125e6e2eda2 changeset: 1202:0125e6e2eda2 user: ?ric Araujo date: Thu Oct 06 05:37:40 2011 +0200 summary: Add test that was promised in a comment but not actually written files: distutils2/tests/test_uninstall.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -1,6 +1,7 @@ """Tests for the uninstall command.""" import os import sys +import logging from StringIO import StringIO import stat import distutils2.util @@ -105,14 +106,14 @@ def test_remove_issue(self): # makes sure if there are OSErrors (like permission denied) - # remove() stops and display a clean error + # remove() stops and displays a clean error dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename def _rename(source, target): - raise OSError + raise OSError(42, 'impossible operation') os.rename = _rename try: @@ -120,6 +121,10 @@ finally: os.rename = old + logs = [log for log in self.get_logs(logging.INFO) + if log.startswith('Error:')] + self.assertEqual(logs, ['Error: [Errno 42] impossible operation']) + self.assertTrue(remove('Meh', paths=[site_packages])) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:51 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:51 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Minor=3A_improve_one_tes?= =?utf8?q?t_name=2C_address_pyflakes_warnings?= Message-ID: http://hg.python.org/distutils2/rev/b5b96ab18810 changeset: 1203:b5b96ab18810 user: ?ric Araujo date: Thu Oct 06 05:40:04 2011 +0200 summary: Minor: improve one test name, address pyflakes warnings files: distutils2/tests/test_uninstall.py | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -1,15 +1,14 @@ -"""Tests for the uninstall command.""" +"""Tests for the distutils2.uninstall module.""" import os import sys import logging -from StringIO import StringIO -import stat import distutils2.util -from distutils2.database import disable_cache, enable_cache +from StringIO import StringIO from distutils2.run import main from distutils2.errors import PackagingError from distutils2.install import remove +from distutils2.database import disable_cache, enable_cache from distutils2.command.install_dist import install_dist from distutils2.tests import unittest, support @@ -84,7 +83,6 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - old_out = sys.stderr sys.stderr = StringIO() dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) site_packages = self.get_path(dist, 'purelib') @@ -104,7 +102,7 @@ self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') - def test_remove_issue(self): + def test_uninstall_error_handling(self): # makes sure if there are OSErrors (like permission denied) # remove() stops and displays a clean error dist, site_packages = self.install_dist('Meh') -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:51 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:51 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_return_code_of_?= =?utf8?b?4oCccHlzZXR1cCBydW4gQ09NTUFOROKAnSAoY2xvc2VzICMxMjIyMik=?= Message-ID: http://hg.python.org/distutils2/rev/3749fcae0dce changeset: 1204:3749fcae0dce user: ?ric Araujo date: Thu Oct 06 05:43:56 2011 +0200 summary: Fix return code of ?pysetup run COMMAND? (closes #12222) files: distutils2/run.py | 5 +- distutils2/tests/test_uninstall.py | 30 +++++++++-------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/distutils2/run.py b/distutils2/run.py --- a/distutils2/run.py +++ b/distutils2/run.py @@ -283,10 +283,11 @@ dist.parse_config_files() for cmd in dispatcher.commands: + # FIXME need to catch MetadataMissingError here (from the check command + # e.g.)--or catch any exception, print an error message and exit with 1 dist.run_command(cmd, dispatcher.command_options[cmd]) - # XXX this is crappy - return dist + return 0 @action_help("""\ diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -4,12 +4,9 @@ import logging import distutils2.util -from StringIO import StringIO -from distutils2.run import main from distutils2.errors import PackagingError from distutils2.install import remove from distutils2.database import disable_cache, enable_cache -from distutils2.command.install_dist import install_dist from distutils2.tests import unittest, support @@ -47,16 +44,12 @@ distutils2.util._path_created.clear() super(UninstallTestCase, self).tearDown() - def run_setup(self, *args): - # run setup with args - args = ['run'] + list(args) - dist = main(args) - return dist - def get_path(self, dist, name): - cmd = install_dist(dist) - cmd.prefix = self.root_dir - cmd.finalize_options() + # the dist argument must contain an install_dist command correctly + # initialized with a prefix option and finalized befored this method + # can be called successfully; practically, this means that you should + # call self.install_dist before self.get_path + cmd = dist.get_command_obj('install_dist') return getattr(cmd, 'install_' + name) def make_dist(self, name='Foo', **kw): @@ -83,8 +76,17 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - sys.stderr = StringIO() - dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) + + dist = support.TestDistribution() + # for some unfathomable reason, the tests will fail horribly if the + # parse_config_files method is not called, even if it doesn't do + # anything useful; trying to build and use a command object manually + # also fails + dist.parse_config_files() + dist.finalize_options() + dist.run_command('install_dist', + {'prefix': ('command line', self.root_dir)}) + site_packages = self.get_path(dist, 'purelib') return dist, site_packages -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:20:51 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:20:51 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_fix_for_=2312222_and_other_changes_from_default?= Message-ID: http://hg.python.org/distutils2/rev/b9f449eb1e36 changeset: 1205:b9f449eb1e36 branch: python3 parent: 1199:46c31c3c8839 parent: 1204:3749fcae0dce user: ?ric Araujo date: Thu Oct 06 06:02:05 2011 +0200 summary: Merge fix for #12222 and other changes from default files: distutils2/run.py | 5 +- distutils2/tests/test_uninstall.py | 76 +++++++++-------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/distutils2/run.py b/distutils2/run.py --- a/distutils2/run.py +++ b/distutils2/run.py @@ -283,10 +283,11 @@ dist.parse_config_files() for cmd in dispatcher.commands: + # FIXME need to catch MetadataMissingError here (from the check command + # e.g.)--or catch any exception, print an error message and exit with 1 dist.run_command(cmd, dispatcher.command_options[cmd]) - # XXX this is crappy - return dist + return 0 @action_help("""\ diff --git a/distutils2/tests/test_uninstall.py b/distutils2/tests/test_uninstall.py --- a/distutils2/tests/test_uninstall.py +++ b/distutils2/tests/test_uninstall.py @@ -1,15 +1,12 @@ -"""Tests for the uninstall command.""" +"""Tests for the distutils2.uninstall module.""" import os import sys -from io import StringIO -import stat +import logging import distutils2.util -from distutils2.database import disable_cache, enable_cache -from distutils2.run import main from distutils2.errors import PackagingError from distutils2.install import remove -from distutils2.command.install_dist import install_dist +from distutils2.database import disable_cache, enable_cache from distutils2.tests import unittest, support @@ -47,16 +44,12 @@ distutils2.util._path_created.clear() super(UninstallTestCase, self).tearDown() - def run_setup(self, *args): - # run setup with args - args = ['run'] + list(args) - dist = main(args) - return dist - def get_path(self, dist, name): - cmd = install_dist(dist) - cmd.prefix = self.root_dir - cmd.finalize_options() + # the dist argument must contain an install_dist command correctly + # initialized with a prefix option and finalized befored this method + # can be called successfully; practically, this means that you should + # call self.install_dist before self.get_path + cmd = dist.get_command_obj('install_dist') return getattr(cmd, 'install_' + name) def make_dist(self, name='Foo', **kw): @@ -83,43 +76,56 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - old_out = sys.stderr - sys.stderr = StringIO() - dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) - install_lib = self.get_path(dist, 'purelib') - return dist, install_lib - def test_uninstall_unknow_distribution(self): + dist = support.TestDistribution() + # for some unfathomable reason, the tests will fail horribly if the + # parse_config_files method is not called, even if it doesn't do + # anything useful; trying to build and use a command object manually + # also fails + dist.parse_config_files() + dist.finalize_options() + dist.run_command('install_dist', + {'prefix': ('command line', self.root_dir)}) + + site_packages = self.get_path(dist, 'purelib') + return dist, site_packages + + def test_uninstall_unknown_distribution(self): + dist, site_packages = self.install_dist('Foospam') self.assertRaises(PackagingError, remove, 'Foo', - paths=[self.root_dir]) + paths=[site_packages]) def test_uninstall(self): - dist, install_lib = self.install_dist() - self.assertIsFile(install_lib, 'foo', '__init__.py') - self.assertIsFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') - self.assertTrue(remove('Foo', paths=[install_lib])) - self.assertIsNotFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsNotFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') + dist, site_packages = self.install_dist() + self.assertIsFile(site_packages, 'foo', '__init__.py') + self.assertIsFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') + self.assertTrue(remove('Foo', paths=[site_packages])) + self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') - def test_remove_issue(self): + def test_uninstall_error_handling(self): # makes sure if there are OSErrors (like permission denied) - # remove() stops and display a clean error - dist, install_lib = self.install_dist('Meh') + # remove() stops and displays a clean error + dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename def _rename(source, target): - raise OSError + raise OSError(42, 'impossible operation') os.rename = _rename try: - self.assertFalse(remove('Meh', paths=[install_lib])) + self.assertFalse(remove('Meh', paths=[site_packages])) finally: os.rename = old - self.assertTrue(remove('Meh', paths=[install_lib])) + logs = [log for log in self.get_logs(logging.INFO) + if log.startswith('Error:')] + self.assertEqual(logs, ['Error: [Errno 42] impossible operation']) + + self.assertTrue(remove('Meh', paths=[site_packages])) def test_suite(): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Thu Oct 6 13:24:03 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Minor_updates_to_the_whatsn?= =?utf8?q?ew_maintenance_rules?= Message-ID: http://hg.python.org/cpython/rev/7cd4f1be101b changeset: 72726:7cd4f1be101b parent: 72665:56eb9a509460 user: ?ric Araujo date: Wed Oct 05 01:03:34 2011 +0200 summary: Minor updates to the whatsnew maintenance rules files: Doc/whatsnew/3.3.rst | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -6,8 +6,7 @@ :Release: |release| :Date: |today| -.. $Id$ - Rules for maintenance: +.. Rules for maintenance: * Anyone can add text to this document. Do not spend very much time on the wording of your changes, because your text will probably @@ -40,12 +39,11 @@ * It's helpful to add the bug/patch number as a comment: - % Patch 12345 XXX Describe the transmogrify() function added to the socket module. - (Contributed by P.Y. Developer.) + (Contributed by P.Y. Developer in :issue:`12345`.) - This saves the maintainer the effort of going through the SVN log + This saves the maintainer the effort of going through the Mercurial log when researching a change. This article explains the new features in Python 3.3, compared to 3.2. @@ -109,6 +107,7 @@ XXX mention new and deprecated functions and macros + Other Language Changes ====================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:04 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_info_about_PEP_393_in_?= =?utf8?q?whatsnew_and_NEWS?= Message-ID: http://hg.python.org/cpython/rev/a55513a45742 changeset: 72727:a55513a45742 user: ?ric Araujo date: Wed Oct 05 01:04:18 2011 +0200 summary: More info about PEP 393 in whatsnew and NEWS files: Doc/whatsnew/3.3.rst | 11 ++++++----- Misc/NEWS | 2 ++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -49,14 +49,15 @@ This article explains the new features in Python 3.3, compared to 3.2. -PEP XXX: Stub -============= - - PEP 393: Flexible String Representation ======================================= -XXX Give a short introduction about :pep:`393`. +[Abstract copied from the PEP: The Unicode string type is changed to support +multiple internal representations, depending on the character with the largest +Unicode ordinal (1, 2, or 4 bytes). This allows a space-efficient +representation in common cases, but gives access to full UCS-4 on all systems. +For compatibility with existing APIs, several representations may exist in +parallel; over time, this compatibility should be phased out.] PEP 393 is fully backward compatible. The legacy API should remain available at least five years. Applications using the legacy API will not diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1261,6 +1261,8 @@ Build ----- +- PEP 393: the configure option --with-wide-unicode is removed. + - Issue #12852: Set _XOPEN_SOURCE to 700, instead of 600, to get POSIX 2008 functions on OpenBSD (e.g. fdopendir). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:05 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_minor_wording_issue=2E?= Message-ID: http://hg.python.org/cpython/rev/024e849b0d2c changeset: 72728:024e849b0d2c user: ?ric Araujo date: Wed Oct 05 01:06:31 2011 +0200 summary: Fix minor wording issue. sys.maxunicode is not called and thus does not return anything; it *is* something. (I checked the doc quickly to see if it tells that expression return things but found nothing.) I also removed markup that would just generate a useless link to the enclosing section. files: Doc/library/sys.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -629,7 +629,7 @@ i.e. ``1114111`` (``0x10FFFF`` in hexadecimal). .. versionchanged:: 3.3 - Before :pep:`393`, :data:`sys.maxunicode` used to return either ``0xFFFF`` + Before :pep:`393`, ``sys.maxunicode`` used to be either ``0xFFFF`` or ``0x10FFFF``, depending on the configuration option that specified whether Unicode characters were stored as UCS-2 or UCS-4. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:06 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo?= Message-ID: http://hg.python.org/cpython/rev/109c8b9f2828 changeset: 72729:109c8b9f2828 user: ?ric Araujo date: Wed Oct 05 01:11:12 2011 +0200 summary: Fix typo files: Include/unicodeobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -206,7 +206,7 @@ immediately follow the structure. utf8_length and wstr_length can be found in the length field; the utf8 pointer is equal to the data pointer. */ typedef struct { - /* There a 4 forms of Unicode strings: + /* There are 4 forms of Unicode strings: - compact ascii: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:06 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_inline_comment=2C_no?= =?utf8?q?_longer_supported_by_configparser=2E?= Message-ID: http://hg.python.org/cpython/rev/285950ceee8a changeset: 72730:285950ceee8a user: ?ric Araujo date: Wed Oct 05 01:14:02 2011 +0200 summary: Remove inline comment, no longer supported by configparser. (Deleted rather than moved because multilib implementations vary.) files: Lib/sysconfig.cfg | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/sysconfig.cfg b/Lib/sysconfig.cfg --- a/Lib/sysconfig.cfg +++ b/Lib/sysconfig.cfg @@ -31,7 +31,7 @@ # be used directly in [resource_locations]. confdir = /etc datadir = /usr/share -libdir = /usr/lib ; or /usr/lib64 on a multilib system +libdir = /usr/lib statedir = /var # User resource directory local = ~/.local/{distribution.name} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:07 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_tests_for_comparing_can?= =?utf8?q?didate_and_final_versions_in_packaging_=28=2311841=29=2E?= Message-ID: http://hg.python.org/cpython/rev/2105ab8553b7 changeset: 72731:2105ab8553b7 user: ?ric Araujo date: Wed Oct 05 01:41:14 2011 +0200 summary: Add tests for comparing candidate and final versions in packaging (#11841). This used to be buggy; Filip Gruszczy?ski contributed tests and a code patch but the latter is not needed. files: Lib/packaging/tests/test_version.py | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -101,8 +101,18 @@ True >>> V('1.2.0') >= V('1.2.3') False + >>> V('1.2.0rc1') >= V('1.2.0') + False >>> (V('1.0') > V('1.0b2')) True + >>> V('1.0') > V('1.0c2') + True + >>> V('1.0') > V('1.0rc2') + True + >>> V('1.0rc2') > V('1.0rc1') + True + >>> V('1.0c4') > V('1.0c1') + True >>> (V('1.0') > V('1.0c2') > V('1.0c1') > V('1.0b2') > V('1.0b1') ... > V('1.0a2') > V('1.0a1')) True @@ -129,6 +139,8 @@ ... < V('1.0.dev18') ... < V('1.0.dev456') ... < V('1.0.dev1234') + ... < V('1.0rc1') + ... < V('1.0rc2') ... < V('1.0') ... < V('1.0.post456.dev623') # development version of a post release ... < V('1.0.post456')) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:08 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Cosmetic_fixes_for_whitespa?= =?utf8?q?ce_and_a_regex_in_packaging=2E?= Message-ID: http://hg.python.org/cpython/rev/c17b91e08b60 changeset: 72732:c17b91e08b60 user: ?ric Araujo date: Wed Oct 05 01:46:37 2011 +0200 summary: Cosmetic fixes for whitespace and a regex in packaging. The goal of the regex is to catch a (alpha), b (beta), c or rc (release candidate), so the existing pattern puzzled me. Tests were OK before and after the change. files: Lib/packaging/tests/test_version.py | 8 ++++---- Lib/packaging/version.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -103,7 +103,7 @@ False >>> V('1.2.0rc1') >= V('1.2.0') False - >>> (V('1.0') > V('1.0b2')) + >>> V('1.0') > V('1.0b2') True >>> V('1.0') > V('1.0c2') True @@ -248,9 +248,9 @@ def test_parse_numdots(self): # For code coverage completeness, as pad_zeros_length can't be set or # influenced from the public interface - self.assertEqual(V('1.0')._parse_numdots('1.0', '1.0', - pad_zeros_length=3), - [1, 0, 0]) + self.assertEqual( + V('1.0')._parse_numdots('1.0', '1.0', pad_zeros_length=3), + [1, 0, 0]) def test_suite(): diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py --- a/Lib/packaging/version.py +++ b/Lib/packaging/version.py @@ -253,7 +253,7 @@ # if we have something like "b-2" or "a.2" at the end of the # version, that is pobably beta, alpha, etc # let's remove the dash or dot - rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) # 1.0-dev-r371 -> 1.0.dev371 # 0.1-dev-r79 -> 0.1.dev79 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:09 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_skip_message_printed?= =?utf8?q?_by_test=2Esupport=2Eget=5Fattribute=2E?= Message-ID: http://hg.python.org/cpython/rev/472ee6ed7949 changeset: 72733:472ee6ed7949 user: ?ric Araujo date: Wed Oct 05 01:50:22 2011 +0200 summary: Update skip message printed by test.support.get_attribute. This helper was changed to work with any object instead of only modules (or technically something with a __name__ attribute, see code in 3.2) but the message stayed as is. files: Lib/test/support.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -187,8 +187,7 @@ try: attribute = getattr(obj, name) except AttributeError: - raise unittest.SkipTest("module %s has no attribute %s" % ( - repr(obj), name)) + raise unittest.SkipTest("object %r has no attribute %r" % (obj, name)) else: return attribute -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:09 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Move_doc_of_sys?= =?utf8?q?=2Edont=5Fwrite=5Fbytecode_to_make_all_attributes_sorted_again?= Message-ID: http://hg.python.org/cpython/rev/c5342904aeab changeset: 72734:c5342904aeab branch: 3.2 parent: 72658:2484b2b8876e user: ?ric Araujo date: Wed Oct 05 01:17:38 2011 +0200 summary: Move doc of sys.dont_write_bytecode to make all attributes sorted again files: Doc/library/sys.rst | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -121,6 +121,15 @@ Use ``'backslashreplace'`` error handler on :exc:`UnicodeEncodeError`. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -764,15 +773,6 @@ implement a dynamic prompt. -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:10 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_markup_used?= =?utf8?q?_in_the_documentation_of_sys=2Eprefix_and_sys=2Eexec=5Fprefix=2E?= Message-ID: http://hg.python.org/cpython/rev/6ea47522f466 changeset: 72735:6ea47522f466 branch: 3.2 user: ?ric Araujo date: Wed Oct 05 01:28:24 2011 +0200 summary: Fix markup used in the documentation of sys.prefix and sys.exec_prefix. - Using the file role with {placeholders} is IMO clearer than fake Python code. - The fact that sys.version[:3] gives '3.2' is a CPython detail and should not be advertised (see #9442), even if some stdlib modules currently rely on that detail. files: Doc/library/sys.rst | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -194,10 +194,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``3.2``. .. data:: executable @@ -752,10 +752,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``3.2``. .. data:: ps1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:11 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_typo_and_ca?= =?utf8?q?se_in_a_recently_added_test?= Message-ID: http://hg.python.org/cpython/rev/bfb02edcad12 changeset: 72736:bfb02edcad12 branch: 3.2 user: ?ric Araujo date: Wed Oct 05 01:29:22 2011 +0200 summary: Fix typo and case in a recently added test files: Lib/test/test_minidom.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -446,7 +446,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:12 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/2e48fbc8170c changeset: 72737:2e48fbc8170c parent: 72733:472ee6ed7949 parent: 72736:bfb02edcad12 user: ?ric Araujo date: Wed Oct 05 01:52:45 2011 +0200 summary: Merge 3.2 files: Doc/library/sys.rst | 32 ++++++++++++++-------------- Lib/test/test_minidom.py | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -121,6 +121,15 @@ Use ``'backslashreplace'`` error handler on :exc:`UnicodeEncodeError`. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -185,10 +194,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``3.2``. .. data:: executable @@ -750,10 +759,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``3.2``. .. data:: ps1 @@ -771,15 +780,6 @@ implement a dynamic prompt. -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -467,7 +467,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:13 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_regrtest_check_for_cach?= =?utf8?q?es_in_packaging=2Edatabase_=28see_=2312167=29?= Message-ID: http://hg.python.org/cpython/rev/e76c6aaff135 changeset: 72738:e76c6aaff135 user: ?ric Araujo date: Thu Oct 06 02:44:19 2011 +0200 summary: Add regrtest check for caches in packaging.database (see #12167) files: Lib/test/regrtest.py | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -173,6 +173,7 @@ import json import logging import os +import packaging.database import platform import random import re @@ -967,6 +968,7 @@ 'sys.warnoptions', 'threading._dangling', 'multiprocessing.process._dangling', 'sysconfig._CONFIG_VARS', 'sysconfig._SCHEMES', + 'packaging.database_caches', ) def get_sys_argv(self): @@ -1054,6 +1056,28 @@ # Can't easily revert the logging state pass + def get_packaging_database_caches(self): + # caching system used by the PEP 376 implementation + # we have one boolean and four dictionaries, initially empty + switch = packaging.database._cache_enabled + saved = [] + for name in ('_cache_name', '_cache_name_egg', + '_cache_path', '_cache_path_egg'): + cache = getattr(packaging.database, name) + saved.append((id(cache), cache, cache.copy())) + return switch, saved + def restore_packaging_database_caches(self, saved): + switch, saved_caches = saved + packaging.database._cache_enabled = switch + for offset, name in enumerate(('_cache_name', '_cache_name_egg', + '_cache_path', '_cache_path_egg')): + _, cache, items = saved_caches[offset] + # put back the same object in place + setattr(packaging.database, name, cache) + # now restore its items + cache.clear() + cache.update(items) + def get_sys_warnoptions(self): return id(sys.warnoptions), sys.warnoptions, sys.warnoptions[:] def restore_sys_warnoptions(self, saved_options): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:13 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Change_one_name_in_packagin?= =?utf8?q?g=E2=80=99s_test=5Funinstall_to_avoid_confusion=2E?= Message-ID: http://hg.python.org/cpython/rev/fd2d239699a5 changeset: 72739:fd2d239699a5 user: ?ric Araujo date: Thu Oct 06 04:59:41 2011 +0200 summary: Change one name in packaging?s test_uninstall to avoid confusion. install_lib may be the name of a module, a command or an option, so I find it clearer to use site_packages to refer to a string object containing the path of the site-packages directory created in a temporary directory during tests. files: Lib/packaging/tests/test_uninstall.py | 24 +++++++------- 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -86,26 +86,26 @@ old_out = sys.stderr sys.stderr = StringIO() dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) - install_lib = self.get_path(dist, 'purelib') - return dist, install_lib + site_packages = self.get_path(dist, 'purelib') + return dist, site_packages def test_uninstall_unknow_distribution(self): self.assertRaises(PackagingError, remove, 'Foo', paths=[self.root_dir]) def test_uninstall(self): - dist, install_lib = self.install_dist() - self.assertIsFile(install_lib, 'foo', '__init__.py') - self.assertIsFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') - self.assertTrue(remove('Foo', paths=[install_lib])) - self.assertIsNotFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsNotFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') + dist, site_packages = self.install_dist() + self.assertIsFile(site_packages, 'foo', '__init__.py') + self.assertIsFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') + self.assertTrue(remove('Foo', paths=[site_packages])) + self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') def test_remove_issue(self): # makes sure if there are OSErrors (like permission denied) # remove() stops and display a clean error - dist, install_lib = self.install_dist('Meh') + dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename @@ -115,11 +115,11 @@ os.rename = _rename try: - self.assertFalse(remove('Meh', paths=[install_lib])) + self.assertFalse(remove('Meh', paths=[site_packages])) finally: os.rename = old - self.assertTrue(remove('Meh', paths=[install_lib])) + self.assertTrue(remove('Meh', paths=[site_packages])) def test_suite(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:14 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_incorrect_test=2E?= Message-ID: http://hg.python.org/cpython/rev/45274853d5ef changeset: 72740:45274853d5ef user: ?ric Araujo date: Thu Oct 06 05:10:09 2011 +0200 summary: Fix incorrect test. The packaging.install.remove function (a.k.a. the uninstall feature) takes a path argument to allow client code to use custom directories instead of sys.path. The test used to give self.root_dir as path, which corresponds to a prefix option, but prefix is not on sys.path, it?s only the base directory used to compute the stdlib and site-packages directory paths. The test now gives a valid site-packages path to the function. files: Lib/packaging/tests/test_uninstall.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -89,9 +89,10 @@ site_packages = self.get_path(dist, 'purelib') return dist, site_packages - def test_uninstall_unknow_distribution(self): + def test_uninstall_unknown_distribution(self): + dist, site_packages = self.install_dist('Foospam') self.assertRaises(PackagingError, remove, 'Foo', - paths=[self.root_dir]) + paths=[site_packages]) def test_uninstall(self): dist, site_packages = self.install_dist() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:14 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_test_that_was_promised_?= =?utf8?q?in_a_comment_but_not_actually_written?= Message-ID: http://hg.python.org/cpython/rev/2d5b7993fae1 changeset: 72741:2d5b7993fae1 user: ?ric Araujo date: Thu Oct 06 05:15:09 2011 +0200 summary: Add test that was promised in a comment but not actually written files: Lib/packaging/tests/test_uninstall.py | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -1,6 +1,7 @@ """Tests for the uninstall command.""" import os import sys +import logging from io import StringIO import stat import packaging.util @@ -105,14 +106,14 @@ def test_remove_issue(self): # makes sure if there are OSErrors (like permission denied) - # remove() stops and display a clean error + # remove() stops and displays a clean error dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename def _rename(source, target): - raise OSError + raise OSError(42, 'impossible operation') os.rename = _rename try: @@ -120,6 +121,10 @@ finally: os.rename = old + logs = [log for log in self.get_logs(logging.INFO) + if log.startswith('Error:')] + self.assertEqual(logs, ['Error: [Errno 42] impossible operation']) + self.assertTrue(remove('Meh', paths=[site_packages])) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:15 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Minor=3A_improve_one_test_n?= =?utf8?q?ame=2C_address_pyflakes_warnings?= Message-ID: http://hg.python.org/cpython/rev/4846e84c0360 changeset: 72742:4846e84c0360 user: ?ric Araujo date: Thu Oct 06 05:18:41 2011 +0200 summary: Minor: improve one test name, address pyflakes warnings files: Lib/packaging/tests/test_uninstall.py | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -1,15 +1,14 @@ -"""Tests for the uninstall command.""" +"""Tests for the packaging.uninstall module.""" import os import sys import logging -from io import StringIO -import stat import packaging.util -from packaging.database import disable_cache, enable_cache +from io import StringIO from packaging.run import main from packaging.errors import PackagingError from packaging.install import remove +from packaging.database import disable_cache, enable_cache from packaging.command.install_dist import install_dist from packaging.tests import unittest, support @@ -84,7 +83,6 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - old_out = sys.stderr sys.stderr = StringIO() dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) site_packages = self.get_path(dist, 'purelib') @@ -104,7 +102,7 @@ self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') - def test_remove_issue(self): + def test_uninstall_error_handling(self): # makes sure if there are OSErrors (like permission denied) # remove() stops and displays a clean error dist, site_packages = self.install_dist('Meh') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:16 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_return_code_of_?= =?utf8?b?4oCccHlzZXR1cCBydW4gQ09NTUFOROKAnSAoY2xvc2VzICMxMjIyMik=?= Message-ID: http://hg.python.org/cpython/rev/ab125793243f changeset: 72743:ab125793243f user: ?ric Araujo date: Thu Oct 06 05:28:56 2011 +0200 summary: Fix return code of ?pysetup run COMMAND? (closes #12222) files: Lib/packaging/run.py | 5 +- Lib/packaging/tests/test_uninstall.py | 30 ++++++++------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -283,10 +283,11 @@ dist.parse_config_files() for cmd in dispatcher.commands: + # FIXME need to catch MetadataMissingError here (from the check command + # e.g.)--or catch any exception, print an error message and exit with 1 dist.run_command(cmd, dispatcher.command_options[cmd]) - # XXX this is crappy - return dist + return 0 @action_help("""\ diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -4,12 +4,9 @@ import logging import packaging.util -from io import StringIO -from packaging.run import main from packaging.errors import PackagingError from packaging.install import remove from packaging.database import disable_cache, enable_cache -from packaging.command.install_dist import install_dist from packaging.tests import unittest, support @@ -47,16 +44,12 @@ packaging.util._path_created.clear() super(UninstallTestCase, self).tearDown() - def run_setup(self, *args): - # run setup with args - args = ['run'] + list(args) - dist = main(args) - return dist - def get_path(self, dist, name): - cmd = install_dist(dist) - cmd.prefix = self.root_dir - cmd.finalize_options() + # the dist argument must contain an install_dist command correctly + # initialized with a prefix option and finalized befored this method + # can be called successfully; practically, this means that you should + # call self.install_dist before self.get_path + cmd = dist.get_command_obj('install_dist') return getattr(cmd, 'install_' + name) def make_dist(self, name='Foo', **kw): @@ -83,8 +76,17 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - sys.stderr = StringIO() - dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) + + dist = support.TestDistribution() + # for some unfathomable reason, the tests will fail horribly if the + # parse_config_files method is not called, even if it doesn't do + # anything useful; trying to build and use a command object manually + # also fails + dist.parse_config_files() + dist.finalize_options() + dist.run_command('install_dist', + {'prefix': ('command line', self.root_dir)}) + site_packages = self.get_path(dist, 'purelib') return dist, site_packages -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:17 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:17 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/7b277d5530bc changeset: 72744:7b277d5530bc branch: 3.2 parent: 72708:a0393cbe4872 parent: 72736:bfb02edcad12 user: ?ric Araujo date: Thu Oct 06 13:10:34 2011 +0200 summary: Branch merge files: Doc/library/sys.rst | 32 ++++++++++++++-------------- Lib/test/test_minidom.py | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -121,6 +121,15 @@ Use ``'backslashreplace'`` error handler on :exc:`UnicodeEncodeError`. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -185,10 +194,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``3.2``. .. data:: executable @@ -743,10 +752,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``3.2``. .. data:: ps1 @@ -764,15 +773,6 @@ implement a dynamic prompt. -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -446,7 +446,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:17 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/4001211484e1 changeset: 72745:4001211484e1 parent: 72721:3636a39fa557 parent: 72743:ab125793243f user: ?ric Araujo date: Thu Oct 06 13:22:21 2011 +0200 summary: Branch merge files: Doc/library/sys.rst | 34 +++--- Doc/whatsnew/3.3.rst | 20 +- Include/unicodeobject.h | 2 +- Lib/packaging/run.py | 5 +- Lib/packaging/tests/test_uninstall.py | 76 ++++++++------ Lib/packaging/tests/test_version.py | 20 +++- Lib/packaging/version.py | 2 +- Lib/sysconfig.cfg | 2 +- Lib/test/regrtest.py | 24 ++++ Lib/test/support.py | 3 +- Lib/test/test_minidom.py | 2 +- Misc/NEWS | 2 + 12 files changed, 118 insertions(+), 74 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -121,6 +121,15 @@ Use ``'backslashreplace'`` error handler on :exc:`UnicodeEncodeError`. +.. data:: dont_write_bytecode + + If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the + import of source modules. This value is initially set to ``True`` or + ``False`` depending on the :option:`-B` command line option and the + :envvar:`PYTHONDONTWRITEBYTECODE` environment variable, but you can set it + yourself to control bytecode file generation. + + .. function:: excepthook(type, value, traceback) This function prints out a given traceback and exception to ``sys.stderr``. @@ -185,10 +194,10 @@ Python files are installed; by default, this is also ``'/usr/local'``. This can be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the - :file:`pyconfig.h` header file) are installed in the directory ``exec_prefix + - '/lib/pythonversion/config'``, and shared library modules are installed in - ``exec_prefix + '/lib/pythonversion/lib-dynload'``, where *version* is equal to - ``version[:3]``. + :file:`pyconfig.h` header file) are installed in the directory + :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* + is the version number of Python, for example ``3.2``. .. data:: executable @@ -629,7 +638,7 @@ i.e. ``1114111`` (``0x10FFFF`` in hexadecimal). .. versionchanged:: 3.3 - Before :pep:`393`, :data:`sys.maxunicode` used to return either ``0xFFFF`` + Before :pep:`393`, ``sys.maxunicode`` used to be either ``0xFFFF`` or ``0x10FFFF``, depending on the configuration option that specified whether Unicode characters were stored as UCS-2 or UCS-4. @@ -750,10 +759,10 @@ independent Python files are installed; by default, this is the string ``'/usr/local'``. This can be set at build time with the ``--prefix`` argument to the :program:`configure` script. The main collection of Python - library modules is installed in the directory ``prefix + '/lib/pythonversion'`` + library modules is installed in the directory :file:`{prefix}/lib/python{X.Y}`` while the platform independent header files (all except :file:`pyconfig.h`) are - stored in ``prefix + '/include/pythonversion'``, where *version* is equal to - ``version[:3]``. + stored in :file:`{prefix}/include/python{X.Y}``, where *X.Y* is the version + number of Python, for example ``3.2``. .. data:: ps1 @@ -771,15 +780,6 @@ implement a dynamic prompt. -.. data:: dont_write_bytecode - - If this is true, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. This value is initially set to ``True`` or ``False`` - depending on the ``-B`` command line option and the ``PYTHONDONTWRITEBYTECODE`` - environment variable, but you can set it yourself to control bytecode file - generation. - - .. function:: setcheckinterval(interval) Set the interpreter's "check interval". This integer value determines how often diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -6,8 +6,7 @@ :Release: |release| :Date: |today| -.. $Id$ - Rules for maintenance: +.. Rules for maintenance: * Anyone can add text to this document. Do not spend very much time on the wording of your changes, because your text will probably @@ -40,25 +39,25 @@ * It's helpful to add the bug/patch number as a comment: - % Patch 12345 XXX Describe the transmogrify() function added to the socket module. - (Contributed by P.Y. Developer.) + (Contributed by P.Y. Developer in :issue:`12345`.) - This saves the maintainer the effort of going through the SVN log + This saves the maintainer the effort of going through the Mercurial log when researching a change. This article explains the new features in Python 3.3, compared to 3.2. -PEP XXX: Stub -============= - - PEP 393: Flexible String Representation ======================================= -XXX Give a short introduction about :pep:`393`. +[Abstract copied from the PEP: The Unicode string type is changed to support +multiple internal representations, depending on the character with the largest +Unicode ordinal (1, 2, or 4 bytes). This allows a space-efficient +representation in common cases, but gives access to full UCS-4 on all systems. +For compatibility with existing APIs, several representations may exist in +parallel; over time, this compatibility should be phased out.] PEP 393 is fully backward compatible. The legacy API should remain available at least five years. Applications using the legacy API will not @@ -109,6 +108,7 @@ XXX mention new and deprecated functions and macros + Other Language Changes ====================== diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -206,7 +206,7 @@ immediately follow the structure. utf8_length and wstr_length can be found in the length field; the utf8 pointer is equal to the data pointer. */ typedef struct { - /* There a 4 forms of Unicode strings: + /* There are 4 forms of Unicode strings: - compact ascii: diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -283,10 +283,11 @@ dist.parse_config_files() for cmd in dispatcher.commands: + # FIXME need to catch MetadataMissingError here (from the check command + # e.g.)--or catch any exception, print an error message and exit with 1 dist.run_command(cmd, dispatcher.command_options[cmd]) - # XXX this is crappy - return dist + return 0 @action_help("""\ diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -1,15 +1,12 @@ -"""Tests for the uninstall command.""" +"""Tests for the packaging.uninstall module.""" import os import sys -from io import StringIO -import stat +import logging import packaging.util -from packaging.database import disable_cache, enable_cache -from packaging.run import main from packaging.errors import PackagingError from packaging.install import remove -from packaging.command.install_dist import install_dist +from packaging.database import disable_cache, enable_cache from packaging.tests import unittest, support @@ -47,16 +44,12 @@ packaging.util._path_created.clear() super(UninstallTestCase, self).tearDown() - def run_setup(self, *args): - # run setup with args - args = ['run'] + list(args) - dist = main(args) - return dist - def get_path(self, dist, name): - cmd = install_dist(dist) - cmd.prefix = self.root_dir - cmd.finalize_options() + # the dist argument must contain an install_dist command correctly + # initialized with a prefix option and finalized befored this method + # can be called successfully; practically, this means that you should + # call self.install_dist before self.get_path + cmd = dist.get_command_obj('install_dist') return getattr(cmd, 'install_' + name) def make_dist(self, name='Foo', **kw): @@ -83,43 +76,56 @@ if not dirname: dirname = self.make_dist(name, **kw) os.chdir(dirname) - old_out = sys.stderr - sys.stderr = StringIO() - dist = self.run_setup('install_dist', '--prefix=' + self.root_dir) - install_lib = self.get_path(dist, 'purelib') - return dist, install_lib - def test_uninstall_unknow_distribution(self): + dist = support.TestDistribution() + # for some unfathomable reason, the tests will fail horribly if the + # parse_config_files method is not called, even if it doesn't do + # anything useful; trying to build and use a command object manually + # also fails + dist.parse_config_files() + dist.finalize_options() + dist.run_command('install_dist', + {'prefix': ('command line', self.root_dir)}) + + site_packages = self.get_path(dist, 'purelib') + return dist, site_packages + + def test_uninstall_unknown_distribution(self): + dist, site_packages = self.install_dist('Foospam') self.assertRaises(PackagingError, remove, 'Foo', - paths=[self.root_dir]) + paths=[site_packages]) def test_uninstall(self): - dist, install_lib = self.install_dist() - self.assertIsFile(install_lib, 'foo', '__init__.py') - self.assertIsFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') - self.assertTrue(remove('Foo', paths=[install_lib])) - self.assertIsNotFile(install_lib, 'foo', 'sub', '__init__.py') - self.assertIsNotFile(install_lib, 'Foo-0.1.dist-info', 'RECORD') + dist, site_packages = self.install_dist() + self.assertIsFile(site_packages, 'foo', '__init__.py') + self.assertIsFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') + self.assertTrue(remove('Foo', paths=[site_packages])) + self.assertIsNotFile(site_packages, 'foo', 'sub', '__init__.py') + self.assertIsNotFile(site_packages, 'Foo-0.1.dist-info', 'RECORD') - def test_remove_issue(self): + def test_uninstall_error_handling(self): # makes sure if there are OSErrors (like permission denied) - # remove() stops and display a clean error - dist, install_lib = self.install_dist('Meh') + # remove() stops and displays a clean error + dist, site_packages = self.install_dist('Meh') # breaking os.rename old = os.rename def _rename(source, target): - raise OSError + raise OSError(42, 'impossible operation') os.rename = _rename try: - self.assertFalse(remove('Meh', paths=[install_lib])) + self.assertFalse(remove('Meh', paths=[site_packages])) finally: os.rename = old - self.assertTrue(remove('Meh', paths=[install_lib])) + logs = [log for log in self.get_logs(logging.INFO) + if log.startswith('Error:')] + self.assertEqual(logs, ['Error: [Errno 42] impossible operation']) + + self.assertTrue(remove('Meh', paths=[site_packages])) def test_suite(): diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -101,7 +101,17 @@ True >>> V('1.2.0') >= V('1.2.3') False - >>> (V('1.0') > V('1.0b2')) + >>> V('1.2.0rc1') >= V('1.2.0') + False + >>> V('1.0') > V('1.0b2') + True + >>> V('1.0') > V('1.0c2') + True + >>> V('1.0') > V('1.0rc2') + True + >>> V('1.0rc2') > V('1.0rc1') + True + >>> V('1.0c4') > V('1.0c1') True >>> (V('1.0') > V('1.0c2') > V('1.0c1') > V('1.0b2') > V('1.0b1') ... > V('1.0a2') > V('1.0a1')) @@ -129,6 +139,8 @@ ... < V('1.0.dev18') ... < V('1.0.dev456') ... < V('1.0.dev1234') + ... < V('1.0rc1') + ... < V('1.0rc2') ... < V('1.0') ... < V('1.0.post456.dev623') # development version of a post release ... < V('1.0.post456')) @@ -236,9 +248,9 @@ def test_parse_numdots(self): # For code coverage completeness, as pad_zeros_length can't be set or # influenced from the public interface - self.assertEqual(V('1.0')._parse_numdots('1.0', '1.0', - pad_zeros_length=3), - [1, 0, 0]) + self.assertEqual( + V('1.0')._parse_numdots('1.0', '1.0', pad_zeros_length=3), + [1, 0, 0]) def test_suite(): diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py --- a/Lib/packaging/version.py +++ b/Lib/packaging/version.py @@ -253,7 +253,7 @@ # if we have something like "b-2" or "a.2" at the end of the # version, that is pobably beta, alpha, etc # let's remove the dash or dot - rs = re.sub(r"([abc|rc])[\-\.](\d+)$", r"\1\2", rs) + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) # 1.0-dev-r371 -> 1.0.dev371 # 0.1-dev-r79 -> 0.1.dev79 diff --git a/Lib/sysconfig.cfg b/Lib/sysconfig.cfg --- a/Lib/sysconfig.cfg +++ b/Lib/sysconfig.cfg @@ -31,7 +31,7 @@ # be used directly in [resource_locations]. confdir = /etc datadir = /usr/share -libdir = /usr/lib ; or /usr/lib64 on a multilib system +libdir = /usr/lib statedir = /var # User resource directory local = ~/.local/{distribution.name} diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -173,6 +173,7 @@ import json import logging import os +import packaging.database import platform import random import re @@ -967,6 +968,7 @@ 'sys.warnoptions', 'threading._dangling', 'multiprocessing.process._dangling', 'sysconfig._CONFIG_VARS', 'sysconfig._SCHEMES', + 'packaging.database_caches', ) def get_sys_argv(self): @@ -1054,6 +1056,28 @@ # Can't easily revert the logging state pass + def get_packaging_database_caches(self): + # caching system used by the PEP 376 implementation + # we have one boolean and four dictionaries, initially empty + switch = packaging.database._cache_enabled + saved = [] + for name in ('_cache_name', '_cache_name_egg', + '_cache_path', '_cache_path_egg'): + cache = getattr(packaging.database, name) + saved.append((id(cache), cache, cache.copy())) + return switch, saved + def restore_packaging_database_caches(self, saved): + switch, saved_caches = saved + packaging.database._cache_enabled = switch + for offset, name in enumerate(('_cache_name', '_cache_name_egg', + '_cache_path', '_cache_path_egg')): + _, cache, items = saved_caches[offset] + # put back the same object in place + setattr(packaging.database, name, cache) + # now restore its items + cache.clear() + cache.update(items) + def get_sys_warnoptions(self): return id(sys.warnoptions), sys.warnoptions, sys.warnoptions[:] def restore_sys_warnoptions(self, saved_options): diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -187,8 +187,7 @@ try: attribute = getattr(obj, name) except AttributeError: - raise unittest.SkipTest("module %s has no attribute %s" % ( - repr(obj), name)) + raise unittest.SkipTest("object %r has no attribute %r" % (obj, name)) else: return attribute diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py --- a/Lib/test/test_minidom.py +++ b/Lib/test/test_minidom.py @@ -467,7 +467,7 @@ dom.unlink() self.confirm(domstr == str.replace("\n", "\r\n")) - def test_toPrettyXML_perserves_content_of_text_node(self): + def test_toprettyxml_preserves_content_of_text_node(self): str = 'B' dom = parseString(str) dom2 = parseString(dom.toprettyxml()) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1261,6 +1261,8 @@ Build ----- +- PEP 393: the configure option --with-wide-unicode is removed. + - Issue #12852: Set _XOPEN_SOURCE to 700, instead of 600, to get POSIX 2008 functions on OpenBSD (e.g. fdopendir). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:24:18 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:24:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/8bae9c603d04 changeset: 72746:8bae9c603d04 parent: 72745:4001211484e1 parent: 72744:7b277d5530bc user: ?ric Araujo date: Thu Oct 06 13:23:50 2011 +0200 summary: Merge 3.2 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 13:26:32 2011 From: python-checkins at python.org (eric.araujo) Date: Thu, 06 Oct 2011 13:26:32 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Use_Python_3_syntax?= Message-ID: http://hg.python.org/peps/rev/626378e168c5 changeset: 3954:626378e168c5 user: ?ric Araujo date: Thu Oct 06 13:26:09 2011 +0200 summary: Use Python 3 syntax files: pep-0335.txt | 33 +++++++++++++++++---------------- 1 files changed, 17 insertions(+), 16 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -366,29 +366,29 @@ return "barray(%s)" % ndarray.__str__(self) def __and2__(self, other): - return (self & other) + return self & other def __or2__(self, other): - return (self & other) + return self & other def __not__(self): - return (self == 0) + return self == 0 def barray(*args, **kwds): - return array(*args, **kwds).view(type = BArray) + return array(*args, **kwds).view(type=BArray) a0 = barray([0, 1, 2, 4]) a1 = barray([1, 2, 3, 4]) a2 = barray([5, 6, 3, 4]) a3 = barray([5, 1, 2, 4]) - print "a0:", a0 - print "a1:", a1 - print "a2:", a2 - print "a3:", a3 - print "not a0:", not a0 - print "a0 == a1 and a2 == a3:", a0 == a1 and a2 == a3 - print "a0 == a1 or a2 == a3:", a0 == a1 or a2 == a3 + print("a0:", a0) + print("a1:", a1) + print("a2:", a2) + print("a3:", a3) + print("not a0:", not a0) + print("a0 == a1 and a2 == a3:", a0 == a1 and a2 == a3) + print("a0 == a1 or a2 == a3:", a0 == a1 or a2 == a3) Example 1 Output ---------------- @@ -417,7 +417,7 @@ # #----------------------------------------------------------------- - class SQLNode(object): + class SQLNode: def __and2__(self, other): return SQLBinop("and", self, other) @@ -473,7 +473,7 @@ return self def __sql__(self): - result = "SELECT %s" % ", ".join([sql(target) for target in self.targets]) + result = "SELECT %s" % ", ".join(sql(target) for target in self.targets) if self.where_clause: result = "%s WHERE %s" % (result, sql(self.where_clause)) return result @@ -491,9 +491,10 @@ def select(*targets): return SQLSelect(targets) - + #-------------------------------------------------------------------------------- +:: dishes = Table("dishes") customers = Table("customers") orders = Table("orders") @@ -502,8 +503,8 @@ customers.cust_id == orders.cust_id and orders.dish_id == dishes.dish_id and dishes.name == "Spam, Eggs, Sausages and Spam") - print repr(query) - print sql(query) + print(repr(query)) + print(sql(query)) Example 2 Output ---------------- -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 6 13:30:11 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 13:30:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_assertion_in_unicode=5F?= =?utf8?q?adjust=5Fmaxchar=28=29?= Message-ID: http://hg.python.org/cpython/rev/bc2a43943507 changeset: 72747:bc2a43943507 user: Victor Stinner date: Thu Oct 06 13:27:56 2011 +0200 summary: Fix assertion in unicode_adjust_maxchar() files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1791,7 +1791,7 @@ } } } - assert(max_char > PyUnicode_MAX_CHAR_VALUE(unicode)); + assert(max_char < PyUnicode_MAX_CHAR_VALUE(unicode)); copy = PyUnicode_New(len, max_char); copy_characters(copy, 0, unicode, 0, len); Py_DECREF(unicode); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:29:09 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 15:29:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_under_Windo?= =?utf8?q?ws?= Message-ID: http://hg.python.org/cpython/rev/542c8da10de9 changeset: 72748:542c8da10de9 user: Antoine Pitrou date: Thu Oct 06 15:25:32 2011 +0200 summary: Fix compilation under Windows files: Objects/unicodeobject.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1780,8 +1780,9 @@ } } else { + const Py_UCS4 *u; assert(kind == PyUnicode_4BYTE_KIND); - const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode); + u = PyUnicode_4BYTE_DATA(unicode); max_char = 0; for (i = 0; i < len; i++) { if (u[i] > max_char) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:31:22 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 15:31:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=233163=3A_The_struct?= =?utf8?q?_module_gets_new_format_characters_=27n=27_and_=27N=27?= Message-ID: http://hg.python.org/cpython/rev/db3e15017172 changeset: 72749:db3e15017172 user: Antoine Pitrou date: Thu Oct 06 15:27:40 2011 +0200 summary: Issue #3163: The struct module gets new format characters 'n' and 'N' supporting C integer types `ssize_t` and `size_t`, respectively. files: Doc/library/struct.rst | 21 +++++- Lib/test/test_struct.py | 66 +++++++++++++-------- Misc/NEWS | 3 + Modules/_struct.c | 90 ++++++++++++++++++++++++++++- 4 files changed, 150 insertions(+), 30 deletions(-) diff --git a/Doc/library/struct.rst b/Doc/library/struct.rst --- a/Doc/library/struct.rst +++ b/Doc/library/struct.rst @@ -187,17 +187,24 @@ | ``Q`` | :c:type:`unsigned long | integer | 8 | \(2), \(3) | | | long` | | | | +--------+--------------------------+--------------------+----------------+------------+ -| ``f`` | :c:type:`float` | float | 4 | \(4) | +| ``n`` | :c:type:`ssize_t` | integer | | \(4) | +--------+--------------------------+--------------------+----------------+------------+ -| ``d`` | :c:type:`double` | float | 8 | \(4) | +| ``N`` | :c:type:`size_t` | integer | | \(4) | ++--------+--------------------------+--------------------+----------------+------------+ +| ``f`` | :c:type:`float` | float | 4 | \(5) | ++--------+--------------------------+--------------------+----------------+------------+ +| ``d`` | :c:type:`double` | float | 8 | \(5) | +--------+--------------------------+--------------------+----------------+------------+ | ``s`` | :c:type:`char[]` | bytes | | | +--------+--------------------------+--------------------+----------------+------------+ | ``p`` | :c:type:`char[]` | bytes | | | +--------+--------------------------+--------------------+----------------+------------+ -| ``P`` | :c:type:`void \*` | integer | | \(5) | +| ``P`` | :c:type:`void \*` | integer | | \(6) | +--------+--------------------------+--------------------+----------------+------------+ +.. versionchanged:: 3.3 + Added support for the ``'n'`` and ``'N'`` formats. + Notes: (1) @@ -219,11 +226,17 @@ Use of the :meth:`__index__` method for non-integers is new in 3.2. (4) + The ``'n'`` and ``'N'`` conversion codes are only available for the native + size (selected as the default or with the ``'@'`` byte order character). + For the standard size, you can use whichever of the other integer formats + fits your application. + +(5) For the ``'f'`` and ``'d'`` conversion codes, the packed representation uses the IEEE 754 binary32 (for ``'f'``) or binary64 (for ``'d'``) format, regardless of the floating-point format used by the platform. -(5) +(6) The ``'P'`` format character is only available for the native byte ordering (selected as the default or with the ``'@'`` byte order character). The byte order character ``'='`` chooses to use little- or big-endian ordering based diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py --- a/Lib/test/test_struct.py +++ b/Lib/test/test_struct.py @@ -8,9 +8,19 @@ ISBIGENDIAN = sys.byteorder == "big" IS32BIT = sys.maxsize == 0x7fffffff -integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q' +integer_codes = 'b', 'B', 'h', 'H', 'i', 'I', 'l', 'L', 'q', 'Q', 'n', 'N' byteorders = '', '@', '=', '<', '>', '!' +def iter_integer_formats(byteorders=byteorders): + for code in integer_codes: + for byteorder in byteorders: + if (byteorder in ('', '@') and code in ('q', 'Q') and + not HAVE_LONG_LONG): + continue + if (byteorder not in ('', '@') and code in ('n', 'N')): + continue + yield code, byteorder + # Native 'q' packing isn't available on systems that don't have the C # long long type. try: @@ -141,14 +151,13 @@ } # standard integer sizes - for code in integer_codes: - for byteorder in '=', '<', '>', '!': - format = byteorder+code - size = struct.calcsize(format) - self.assertEqual(size, expected_size[code]) + for code, byteorder in iter_integer_formats(('=', '<', '>', '!')): + format = byteorder+code + size = struct.calcsize(format) + self.assertEqual(size, expected_size[code]) # native integer sizes - native_pairs = 'bB', 'hH', 'iI', 'lL' + native_pairs = 'bB', 'hH', 'iI', 'lL', 'nN' if HAVE_LONG_LONG: native_pairs += 'qQ', for format_pair in native_pairs: @@ -166,9 +175,11 @@ if HAVE_LONG_LONG: self.assertLessEqual(8, struct.calcsize('q')) self.assertLessEqual(struct.calcsize('l'), struct.calcsize('q')) + self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('i')) + self.assertGreaterEqual(struct.calcsize('n'), struct.calcsize('P')) def test_integers(self): - # Integer tests (bBhHiIlLqQ). + # Integer tests (bBhHiIlLqQnN). import binascii class IntTester(unittest.TestCase): @@ -182,11 +193,11 @@ self.byteorder) self.bytesize = struct.calcsize(format) self.bitsize = self.bytesize * 8 - if self.code in tuple('bhilq'): + if self.code in tuple('bhilqn'): self.signed = True self.min_value = -(2**(self.bitsize-1)) self.max_value = 2**(self.bitsize-1) - 1 - elif self.code in tuple('BHILQ'): + elif self.code in tuple('BHILQN'): self.signed = False self.min_value = 0 self.max_value = 2**self.bitsize - 1 @@ -316,14 +327,23 @@ struct.pack, self.format, obj) - for code in integer_codes: - for byteorder in byteorders: - if (byteorder in ('', '@') and code in ('q', 'Q') and - not HAVE_LONG_LONG): - continue + for code, byteorder in iter_integer_formats(): + format = byteorder+code + t = IntTester(format) + t.run() + + def test_nN_code(self): + # n and N don't exist in standard sizes + def assertStructError(func, *args, **kwargs): + with self.assertRaises(struct.error) as cm: + func(*args, **kwargs) + self.assertIn("bad char in struct format", str(cm.exception)) + for code in 'nN': + for byteorder in ('=', '<', '>', '!'): format = byteorder+code - t = IntTester(format) - t.run() + assertStructError(struct.calcsize, format) + assertStructError(struct.pack, format, 0) + assertStructError(struct.unpack, format, b"") def test_p_code(self): # Test p ("Pascal string") code. @@ -377,14 +397,10 @@ self.assertRaises(OverflowError, struct.pack, ">f", big) def test_1530559(self): - for byteorder in '', '@', '=', '<', '>', '!': - for code in integer_codes: - if (byteorder in ('', '@') and code in ('q', 'Q') and - not HAVE_LONG_LONG): - continue - format = byteorder + code - self.assertRaises(struct.error, struct.pack, format, 1.0) - self.assertRaises(struct.error, struct.pack, format, 1.5) + for code, byteorder in iter_integer_formats(): + format = byteorder + code + self.assertRaises(struct.error, struct.pack, format, 1.0) + self.assertRaises(struct.error, struct.pack, format, 1.5) self.assertRaises(struct.error, struct.pack, 'P', 1.0) self.assertRaises(struct.error, struct.pack, 'P', 1.5) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -294,6 +294,9 @@ Library ------- +- Issue #3163: The struct module gets new format characters 'n' and 'N' + supporting C integer types ``ssize_t`` and ``size_t``, respectively. + - Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. diff --git a/Modules/_struct.c b/Modules/_struct.c --- a/Modules/_struct.c +++ b/Modules/_struct.c @@ -58,6 +58,7 @@ typedef struct { char c; float x; } st_float; typedef struct { char c; double x; } st_double; typedef struct { char c; void *x; } st_void_p; +typedef struct { char c; size_t x; } st_size_t; #define SHORT_ALIGN (sizeof(st_short) - sizeof(short)) #define INT_ALIGN (sizeof(st_int) - sizeof(int)) @@ -65,6 +66,7 @@ #define FLOAT_ALIGN (sizeof(st_float) - sizeof(float)) #define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double)) #define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *)) +#define SIZE_T_ALIGN (sizeof(st_size_t) - sizeof(size_t)) /* We can't support q and Q in native mode unless the compiler does; in std mode, they're 8 bytes on all platforms. */ @@ -213,6 +215,52 @@ #endif +/* Same, but handling Py_ssize_t */ + +static int +get_ssize_t(PyObject *v, Py_ssize_t *p) +{ + Py_ssize_t x; + + v = get_pylong(v); + if (v == NULL) + return -1; + assert(PyLong_Check(v)); + x = PyLong_AsSsize_t(v); + Py_DECREF(v); + if (x == (Py_ssize_t)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); + return -1; + } + *p = x; + return 0; +} + +/* Same, but handling size_t */ + +static int +get_size_t(PyObject *v, size_t *p) +{ + size_t x; + + v = get_pylong(v); + if (v == NULL) + return -1; + assert(PyLong_Check(v)); + x = PyLong_AsSize_t(v); + Py_DECREF(v); + if (x == (size_t)-1 && PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) + PyErr_SetString(StructError, + "argument out of range"); + return -1; + } + *p = x; + return 0; +} + #define RANGE_ERROR(x, f, flag, mask) return _range_error(f, flag) @@ -369,6 +417,23 @@ return PyLong_FromUnsignedLong(x); } +static PyObject * +nu_ssize_t(const char *p, const formatdef *f) +{ + Py_ssize_t x; + memcpy((char *)&x, p, sizeof x); + return PyLong_FromSsize_t(x); +} + +static PyObject * +nu_size_t(const char *p, const formatdef *f) +{ + size_t x; + memcpy((char *)&x, p, sizeof x); + return PyLong_FromSize_t(x); +} + + /* Native mode doesn't support q or Q unless the platform C supports long long (or, on Windows, __int64). */ @@ -558,6 +623,26 @@ return 0; } +static int +np_ssize_t(char *p, PyObject *v, const formatdef *f) +{ + Py_ssize_t x; + if (get_ssize_t(v, &x) < 0) + return -1; + memcpy(p, (char *)&x, sizeof x); + return 0; +} + +static int +np_size_t(char *p, PyObject *v, const formatdef *f) +{ + size_t x; + if (get_size_t(v, &x) < 0) + return -1; + memcpy(p, (char *)&x, sizeof x); + return 0; +} + #ifdef HAVE_LONG_LONG static int @@ -651,6 +736,8 @@ {'I', sizeof(int), INT_ALIGN, nu_uint, np_uint}, {'l', sizeof(long), LONG_ALIGN, nu_long, np_long}, {'L', sizeof(long), LONG_ALIGN, nu_ulong, np_ulong}, + {'n', sizeof(size_t), SIZE_T_ALIGN, nu_ssize_t, np_ssize_t}, + {'N', sizeof(size_t), SIZE_T_ALIGN, nu_size_t, np_size_t}, #ifdef HAVE_LONG_LONG {'q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_longlong, np_longlong}, {'Q', sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong}, @@ -1951,7 +2038,8 @@ l:long; L:unsigned long; f:float; d:double.\n\ Special cases (preceding decimal count indicates length):\n\ s:string (array of char); p: pascal string (with count byte).\n\ -Special case (only available in native format):\n\ +Special cases (only available in native format):\n\ + n:ssize_t; N:size_t;\n\ P:an integer type that is wide enough to hold a pointer.\n\ Special case (not in native mode unless 'long long' in platform C):\n\ q:long long; Q:unsigned long long\n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:38:19 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 15:38:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_warnings_un?= =?utf8?q?der_64-bit_Windows?= Message-ID: http://hg.python.org/cpython/rev/1a0715386d27 changeset: 72750:1a0715386d27 user: Antoine Pitrou date: Thu Oct 06 15:34:41 2011 +0200 summary: Fix compilation warnings under 64-bit Windows files: Include/unicodeobject.h | 5 +++-- Objects/stringlib/unicode_format.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -441,7 +441,7 @@ See also PyUnicode_KIND_SIZE(). */ #define PyUnicode_CHARACTER_SIZE(op) \ - (1 << (PyUnicode_KIND(op) - 1)) + ((Py_ssize_t) (1 << (PyUnicode_KIND(op) - 1))) /* Return pointers to the canonical representation cast to unsigned char, Py_UCS2, or Py_UCS4 for direct character access. @@ -477,7 +477,8 @@ The index is a character index, the result is a size in bytes. See also PyUnicode_CHARACTER_SIZE(). */ -#define PyUnicode_KIND_SIZE(kind, index) ((index) << ((kind) - 1)) +#define PyUnicode_KIND_SIZE(kind, index) \ + ((Py_ssize_t) ((index) << ((kind) - 1))) /* In the access macros below, "kind" may be evaluated more than once. All other macro parameters are evaluated exactly once, so it is safe diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -56,7 +56,7 @@ /* fill in a SubString from a pointer and length */ Py_LOCAL_INLINE(void) -SubString_init(SubString *str, PyObject *s, int start, int end) +SubString_init(SubString *str, PyObject *s, Py_ssize_t start, Py_ssize_t end) { str->str = s; str->start = start; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:47:52 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 15:47:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_warnings_un?= =?utf8?q?der_64-bit_Windows?= Message-ID: http://hg.python.org/cpython/rev/d760b345d7bd changeset: 72751:d760b345d7bd user: Antoine Pitrou date: Thu Oct 06 15:44:15 2011 +0200 summary: Fix compilation warnings under 64-bit Windows files: Modules/unicodedata.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -616,13 +616,13 @@ static int find_nfc_index(PyObject *self, struct reindex* nfc, Py_UCS4 code) { - int index; + unsigned int index; for (index = 0; nfc[index].start; index++) { - int start = nfc[index].start; + unsigned int start = nfc[index].start; if (code < start) return -1; if (code <= start + nfc[index].count) { - int delta = code - start; + unsigned int delta = code - start; return nfc[index].index + delta; } } @@ -1038,7 +1038,7 @@ *len = -1; for (i = 0; i < count; i++) { char *s = hangul_syllables[i][column]; - len1 = strlen(s); + len1 = Py_SAFE_DOWNCAST(strlen(s), size_t, int); if (len1 <= *len) continue; if (strncmp(str, s, len1) == 0) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:58:59 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 15:58:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_PyUnicode=5FCHARACTER?= =?utf8?q?=5FSIZE_and_PyUnicode=5FKIND=5FSIZE?= Message-ID: http://hg.python.org/cpython/rev/c512e9759059 changeset: 72752:c512e9759059 user: Victor Stinner date: Thu Oct 06 15:54:53 2011 +0200 summary: Fix PyUnicode_CHARACTER_SIZE and PyUnicode_KIND_SIZE files: Include/unicodeobject.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -441,7 +441,7 @@ See also PyUnicode_KIND_SIZE(). */ #define PyUnicode_CHARACTER_SIZE(op) \ - ((Py_ssize_t) (1 << (PyUnicode_KIND(op) - 1))) + (((Py_ssize_t)1 << (PyUnicode_KIND(op) - 1))) /* Return pointers to the canonical representation cast to unsigned char, Py_UCS2, or Py_UCS4 for direct character access. @@ -478,7 +478,7 @@ See also PyUnicode_CHARACTER_SIZE(). */ #define PyUnicode_KIND_SIZE(kind, index) \ - ((Py_ssize_t) ((index) << ((kind) - 1))) + (((Py_ssize_t)(index)) << ((kind) - 1)) /* In the access macros below, "kind" may be evaluated more than once. All other macro parameters are evaluated exactly once, so it is safe -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 15:59:00 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 15:59:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_PyUnicode=5FJoin=28=29_?= =?utf8?q?for_len=3D=3D1_and_non-exact_string?= Message-ID: http://hg.python.org/cpython/rev/9a91ab415109 changeset: 72753:9a91ab415109 user: Victor Stinner date: Thu Oct 06 15:58:54 2011 +0200 summary: Fix PyUnicode_Join() for len==1 and non-exact string files: Objects/unicodeobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9154,6 +9154,7 @@ return res; } sep = NULL; + maxchar = 0; } else { /* Set up sep and seplen */ @@ -9203,8 +9204,7 @@ goto onError; sz += PyUnicode_GET_LENGTH(item); item_maxchar = PyUnicode_MAX_CHAR_VALUE(item); - if (item_maxchar > maxchar) - maxchar = item_maxchar; + maxchar = Py_MAX(maxchar, item_maxchar); if (i != 0) sz += seplen; if (sz < old_sz || sz > PY_SSIZE_T_MAX) { -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Thu Oct 6 16:10:20 2011 From: martin at v.loewis.de (=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?=) Date: Thu, 06 Oct 2011 16:10:20 +0200 Subject: [Python-checkins] cpython: Fix find_module_path(): make the string ready In-Reply-To: References: Message-ID: <4E8DB6CC.7070104@v.loewis.de> > + if (PyUnicode_READY(path_unicode)) > + return -1; > + I think we need to discuss/reconsider the return value of PyUnicode_READY. It's defined to give -1 on error currently. If that sounds good, then the check for error should be a check that it is -1. Regards, Martin From python-checkins at python.org Thu Oct 6 16:39:06 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 06 Oct 2011 16:39:06 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_broken_links_in_pep-0001?= =?utf8?q?=2Etxt=2E_Update_the_information_with_pointers_to_hg?= Message-ID: http://hg.python.org/peps/rev/398596beeee3 changeset: 3955:398596beeee3 user: Senthil Kumaran date: Thu Oct 06 22:38:55 2011 +0800 summary: Fix broken links in pep-0001.txt. Update the information with pointers to hg and devguide. files: pep-0001.txt | 56 ++++++++++++++++----------------------- 1 files changed, 23 insertions(+), 33 deletions(-) diff --git a/pep-0001.txt b/pep-0001.txt --- a/pep-0001.txt +++ b/pep-0001.txt @@ -116,7 +116,7 @@ approval phase, and is the final arbiter of the draft's PEP-ability. As updates are necessary, the PEP author can check in new versions if -they have SVN commit permissions, or can email new PEP versions to +they have hg push privileges, or can email new PEP versions to the PEP editor for committing. Standards Track PEPs consist of two parts, a design document and a @@ -129,11 +129,10 @@ PEP authors are responsible for collecting community feedback on a PEP before submitting it for review. However, wherever possible, long open-ended discussions on public mailing lists should be avoided. -Strategies to keep the -discussions efficient include: setting up a separate SIG mailing list -for the topic, having the PEP author accept private comments in the -early design phases, setting up a wiki page, etc. PEP authors should -use their discretion here. +Strategies to keep the discussions efficient include: setting up a +separate SIG mailing list for the topic, having the PEP author accept +private comments in the early design phases, setting up a wiki page, etc. +PEP authors should use their discretion here. Once the authors have completed a PEP, they must inform the PEP editor that it is ready for review. PEPs are reviewed by the BDFL and his @@ -266,8 +265,8 @@ PEP: Title: - Version: - Last-Modified: + Version: + Last-Modified: Author: * Discussions-To: Status: `_. +* Add the PEP to Mercurial. For mercurial work flow instructions, follow + `The Python Developers Guide `_ - The command to check out a read-only copy of the repository is:: + The mercurial repo for the peps is:: - svn checkout http://svn.python.org/projects/peps/trunk peps + http://hg.python.org/peps/ - The command to check out a read-write copy of the repository is:: - - svn checkout svn+ssh://pythondev at svn.python.org/peps/trunk peps - - In particular, the ``svn:eol-style`` property should be set to ``native`` - and the ``svn:keywords`` property to ``Author Date Id Revision``. * Monitor python.org to make sure the PEP gets added to the site properly. @@ -442,7 +434,7 @@ python-list & -dev). Updates to existing PEPs also come in to peps at python.org. Many PEP -authors are not SVN committers yet, so we do the commits for them. +authors are not Python committers yet, so we do the commits for them. Many PEPs are written and maintained by developers with write access to the Python codebase. The PEP editors monitor the python-checkins @@ -455,25 +447,23 @@ Resources: -* `How Python is Developed `_ +* `Index of Python Enhancement Proposals `_ -* `Python's Development Process `_ +* `Following Python's Development + `_ -* `Why Develop Python? `_ - -* `Development Tools `_ +* `Python Developer's Guide `_ * `Frequently Asked Questions for Developers - `_ - + `_ References and Footnotes ======================== -.. [1] This historical record is available by the normal SVN commands +.. [1] This historical record is available by the normal hg commands for retrieving older revisions. For those without direct access to - the SVN tree, you can browse the current and past PEP revisions here: - http://svn.python.org/view/peps/trunk/ + the hg repo, you can browse the current and past PEP revisions here: + http://hg.python.org/peps/ .. [2] PEP 2, Procedure for Adding New Modules, Faassen (http://www.python.org/dev/peps/pep-0002) @@ -485,8 +475,8 @@ (http://www.python.org/dev/peps/pep-0012) .. [5] The script referred to here is pep2pyramid.py, the successor to - pep2html.py, both of which live in the same directory in the SVN - tree as the PEPs themselves. Try ``pep2html.py --help`` for + pep2html.py, both of which live in the same directory in the hg + repo as the PEPs themselves. Try ``pep2html.py --help`` for details. The URL for viewing PEPs on the web is http://www.python.org/dev/peps/. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 6 19:07:40 2011 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 06 Oct 2011 19:07:40 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDcw?= =?utf8?q?=3A_Fix_a_crash_when_a_TextIOWrapper_caught_in_a_reference_cycle?= Message-ID: http://hg.python.org/cpython/rev/89b9e4bf6f1f changeset: 72754:89b9e4bf6f1f branch: 2.7 parent: 72725:83c486c1112c user: Charles-Fran?ois Natali date: Thu Oct 06 19:09:45 2011 +0200 summary: Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. files: Lib/test/test_io.py | 15 +++++++++++++++ Misc/NEWS | 4 ++++ Modules/_io/bufferedio.c | 5 +++++ 3 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2338,6 +2338,21 @@ with self.open(support.TESTFN, "rb") as f: self.assertEqual(f.read(), b"456def") + def test_rwpair_cleared_before_textio(self): + # Issue 13070: TextIOWrapper's finalization would crash when called + # after the reference to the underlying BufferedRWPair's writer got + # cleared by the GC. + for i in range(1000): + b1 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t1 = self.TextIOWrapper(b1, encoding="ascii") + b2 = self.BufferedRWPair(self.MockRawIO(), self.MockRawIO()) + t2 = self.TextIOWrapper(b2, encoding="ascii") + # circular references + t1.buddy = t2 + t2.buddy = t1 + support.gc_collect() + + class PyTextIOWrapperTest(TextIOWrapperTest): pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -217,6 +217,10 @@ Extension Modules ----------------- +- Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle + would be finalized after the reference to its underlying BufferedRWPair's + writer got cleared by the GC. + - Issue #12881: ctypes: Fix segfault with large structure field names. - Issue #13013: ctypes: Fix a reference leak in PyCArrayType_from_ctype. diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -2179,6 +2179,11 @@ static PyObject * bufferedrwpair_closed_get(rwpair *self, void *context) { + if (self->writer == NULL) { + PyErr_SetString(PyExc_RuntimeError, + "the BufferedRWPair object is being garbage-collected"); + return NULL; + } return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 19:13:45 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 19:13:45 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEyOTEx?= =?utf8?q?=3A_Fix_memory_consumption_when_calculating_the_repr=28=29_of_hu?= =?utf8?q?ge_tuples?= Message-ID: http://hg.python.org/cpython/rev/f9f782f2369e changeset: 72755:f9f782f2369e branch: 3.2 parent: 72744:7b277d5530bc user: Antoine Pitrou date: Thu Oct 06 18:57:27 2011 +0200 summary: Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists. This introduces a small private API for this common pattern. The issue has been discovered thanks to Martin's huge-mem buildbot. files: Include/Python.h | 4 +- Include/accu.h | 35 +++++++ Lib/test/test_list.py | 11 ++ Lib/test/test_tuple.py | 10 ++ Makefile.pre.in | 2 + Misc/NEWS | 3 + Objects/accu.c | 114 +++++++++++++++++++++++++ Objects/listobject.c | 81 +++++++---------- Objects/tupleobject.c | 73 +++++++-------- PC/VC6/pythoncore.dsp | 4 + PC/VS7.1/pythoncore.vcproj | 3 + PC/VS8.0/pythoncore.vcproj | 8 + PCbuild/pythoncore.vcproj | 8 + 13 files changed, 270 insertions(+), 86 deletions(-) diff --git a/Include/Python.h b/Include/Python.h --- a/Include/Python.h +++ b/Include/Python.h @@ -100,7 +100,7 @@ #include "warnings.h" #include "weakrefobject.h" #include "structseq.h" - +#include "accu.h" #include "codecs.h" #include "pyerrors.h" @@ -141,7 +141,7 @@ #endif /* Argument must be a char or an int in [-128, 127] or [0, 255]. */ -#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) +#define Py_CHARMASK(c) ((unsigned char)((c) & 0xff)) #include "pyfpe.h" diff --git a/Include/accu.h b/Include/accu.h new file mode 100644 --- /dev/null +++ b/Include/accu.h @@ -0,0 +1,35 @@ +#ifndef Py_LIMITED_API +#ifndef Py_ACCU_H +#define Py_ACCU_H + +/*** This is a private API for use by the interpreter and the stdlib. + *** Its definition may be changed or removed at any moment. + ***/ + +/* + * A two-level accumulator of unicode objects that avoids both the overhead + * of keeping a huge number of small separate objects, and the quadratic + * behaviour of using a naive repeated concatenation scheme. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject *large; /* A list of previously accumulated large strings */ + PyObject *small; /* Pending small strings */ +} _PyAccu; + +PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc); +PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode); +PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); +PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); +PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_ACCU_H */ +#endif /* Py_LIMITED_API */ diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -59,6 +59,17 @@ self.assertRaises((MemoryError, OverflowError), mul, lst, n) self.assertRaises((MemoryError, OverflowError), imul, lst, n) + def test_repr_large(self): + # Check the repr of large list objects + def check(n): + l = [0] * n + s = repr(l) + self.assertEqual(s, + '[' + ', '.join(['0'] * n) + ']') + check(10) # check our checking code + check(1000000) + + def test_main(verbose=None): support.run_unittest(ListTest) diff --git a/Lib/test/test_tuple.py b/Lib/test/test_tuple.py --- a/Lib/test/test_tuple.py +++ b/Lib/test/test_tuple.py @@ -154,6 +154,16 @@ # Trying to untrack an unfinished tuple could crash Python self._not_tracked(tuple(gc.collect() for i in range(101))) + def test_repr_large(self): + # Check the repr of large list objects + def check(n): + l = (0,) * n + s = repr(l) + self.assertEqual(s, + '(' + ', '.join(['0'] * n) + ')') + check(10) # check our checking code + check(1000000) + def test_main(): support.run_unittest(TupleTest) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -342,6 +342,7 @@ # Objects OBJECT_OBJS= \ Objects/abstract.o \ + Objects/accu.o \ Objects/boolobject.o \ Objects/bytes_methods.o \ Objects/bytearrayobject.o \ @@ -664,6 +665,7 @@ Include/Python-ast.h \ Include/Python.h \ Include/abstract.h \ + Include/accu.h \ Include/asdl.h \ Include/ast.h \ Include/bltinmodule.h \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12911: Fix memory consumption when calculating the repr() of huge + tuples or lists. + - Issue #7732: Don't open a directory as a file anymore while importing a module. Ignore the direcotry if its name matchs the module name (e.g. "__init__.py") and raise a ImportError instead. diff --git a/Objects/accu.c b/Objects/accu.c new file mode 100644 --- /dev/null +++ b/Objects/accu.c @@ -0,0 +1,114 @@ +/* Accumulator struct implementation */ + +#include "Python.h" + +static PyObject * +join_list_unicode(PyObject *lst) +{ + /* return ''.join(lst) */ + PyObject *sep, *ret; + sep = PyUnicode_FromStringAndSize("", 0); + ret = PyUnicode_Join(sep, lst); + Py_DECREF(sep); + return ret; +} + +int +_PyAccu_Init(_PyAccu *acc) +{ + /* Lazily allocated */ + acc->large = NULL; + acc->small = PyList_New(0); + if (acc->small == NULL) + return -1; + return 0; +} + +static int +flush_accumulator(_PyAccu *acc) +{ + Py_ssize_t nsmall = PyList_GET_SIZE(acc->small); + if (nsmall) { + int ret; + PyObject *joined; + if (acc->large == NULL) { + acc->large = PyList_New(0); + if (acc->large == NULL) + return -1; + } + joined = join_list_unicode(acc->small); + if (joined == NULL) + return -1; + if (PyList_SetSlice(acc->small, 0, nsmall, NULL)) { + Py_DECREF(joined); + return -1; + } + ret = PyList_Append(acc->large, joined); + Py_DECREF(joined); + return ret; + } + return 0; +} + +int +_PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode) +{ + Py_ssize_t nsmall; + assert(PyUnicode_Check(unicode)); + + if (PyList_Append(acc->small, unicode)) + return -1; + nsmall = PyList_GET_SIZE(acc->small); + /* Each item in a list of unicode objects has an overhead (in 64-bit + * builds) of: + * - 8 bytes for the list slot + * - 56 bytes for the header of the unicode object + * that is, 64 bytes. 100000 such objects waste more than 6MB + * compared to a single concatenated string. + */ + if (nsmall < 100000) + return 0; + return flush_accumulator(acc); +} + +PyObject * +_PyAccu_FinishAsList(_PyAccu *acc) +{ + int ret; + PyObject *res; + + ret = flush_accumulator(acc); + Py_CLEAR(acc->small); + if (ret) { + Py_CLEAR(acc->large); + return NULL; + } + res = acc->large; + acc->large = NULL; + return res; +} + +PyObject * +_PyAccu_Finish(_PyAccu *acc) +{ + PyObject *list, *res; + if (acc->large == NULL) { + list = acc->small; + acc->small = NULL; + } + else { + list = _PyAccu_FinishAsList(acc); + if (!list) + return NULL; + } + res = join_list_unicode(list); + Py_DECREF(list); + return res; +} + +void +_PyAccu_Destroy(_PyAccu *acc) +{ + Py_CLEAR(acc->small); + Py_CLEAR(acc->large); +} diff --git a/Objects/listobject.c b/Objects/listobject.c --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -321,70 +321,59 @@ list_repr(PyListObject *v) { Py_ssize_t i; - PyObject *s, *temp; - PyObject *pieces = NULL, *result = NULL; + PyObject *s = NULL; + _PyAccu acc; + static PyObject *sep = NULL; + + if (Py_SIZE(v) == 0) { + return PyUnicode_FromString("[]"); + } + + if (sep == NULL) { + sep = PyUnicode_FromString(", "); + if (sep == NULL) + return NULL; + } i = Py_ReprEnter((PyObject*)v); if (i != 0) { return i > 0 ? PyUnicode_FromString("[...]") : NULL; } - if (Py_SIZE(v) == 0) { - result = PyUnicode_FromString("[]"); - goto Done; - } + if (_PyAccu_Init(&acc)) + goto error; - pieces = PyList_New(0); - if (pieces == NULL) - goto Done; + s = PyUnicode_FromString("["); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); /* Do repr() on each element. Note that this may mutate the list, so must refetch the list size on each iteration. */ for (i = 0; i < Py_SIZE(v); ++i) { - int status; if (Py_EnterRecursiveCall(" while getting the repr of a list")) - goto Done; + goto error; s = PyObject_Repr(v->ob_item[i]); Py_LeaveRecursiveCall(); - if (s == NULL) - goto Done; - status = PyList_Append(pieces, s); - Py_DECREF(s); /* append created a new ref */ - if (status < 0) - goto Done; + if (i > 0 && _PyAccu_Accumulate(&acc, sep)) + goto error; + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); } + s = PyUnicode_FromString("]"); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); - /* Add "[]" decorations to the first and last items. */ - assert(PyList_GET_SIZE(pieces) > 0); - s = PyUnicode_FromString("["); - if (s == NULL) - goto Done; - temp = PyList_GET_ITEM(pieces, 0); - PyUnicode_AppendAndDel(&s, temp); - PyList_SET_ITEM(pieces, 0, s); - if (s == NULL) - goto Done; + Py_ReprLeave((PyObject *)v); + return _PyAccu_Finish(&acc); - s = PyUnicode_FromString("]"); - if (s == NULL) - goto Done; - temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); - PyUnicode_AppendAndDel(&temp, s); - PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); - if (temp == NULL) - goto Done; - - /* Paste them all together with ", " between. */ - s = PyUnicode_FromString(", "); - if (s == NULL) - goto Done; - result = PyUnicode_Join(s, pieces); - Py_DECREF(s); - -Done: - Py_XDECREF(pieces); +error: + _PyAccu_Destroy(&acc); + Py_XDECREF(s); Py_ReprLeave((PyObject *)v); - return result; + return NULL; } static Py_ssize_t diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -240,13 +240,20 @@ tuplerepr(PyTupleObject *v) { Py_ssize_t i, n; - PyObject *s, *temp; - PyObject *pieces, *result = NULL; + PyObject *s = NULL; + _PyAccu acc; + static PyObject *sep = NULL; n = Py_SIZE(v); if (n == 0) return PyUnicode_FromString("()"); + if (sep == NULL) { + sep = PyUnicode_FromString(", "); + if (sep == NULL) + return NULL; + } + /* While not mutable, it is still possible to end up with a cycle in a tuple through an object that stores itself within a tuple (and thus infinitely asks for the repr of itself). This should only be @@ -256,52 +263,42 @@ return i > 0 ? PyUnicode_FromString("(...)") : NULL; } - pieces = PyTuple_New(n); - if (pieces == NULL) - return NULL; + if (_PyAccu_Init(&acc)) + goto error; + + s = PyUnicode_FromString("("); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); /* Do repr() on each element. */ for (i = 0; i < n; ++i) { if (Py_EnterRecursiveCall(" while getting the repr of a tuple")) - goto Done; + goto error; s = PyObject_Repr(v->ob_item[i]); Py_LeaveRecursiveCall(); - if (s == NULL) - goto Done; - PyTuple_SET_ITEM(pieces, i, s); + if (i > 0 && _PyAccu_Accumulate(&acc, sep)) + goto error; + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); } + if (n > 1) + s = PyUnicode_FromString(")"); + else + s = PyUnicode_FromString(",)"); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); - /* Add "()" decorations to the first and last items. */ - assert(n > 0); - s = PyUnicode_FromString("("); - if (s == NULL) - goto Done; - temp = PyTuple_GET_ITEM(pieces, 0); - PyUnicode_AppendAndDel(&s, temp); - PyTuple_SET_ITEM(pieces, 0, s); - if (s == NULL) - goto Done; + Py_ReprLeave((PyObject *)v); + return _PyAccu_Finish(&acc); - s = PyUnicode_FromString(n == 1 ? ",)" : ")"); - if (s == NULL) - goto Done; - temp = PyTuple_GET_ITEM(pieces, n-1); - PyUnicode_AppendAndDel(&temp, s); - PyTuple_SET_ITEM(pieces, n-1, temp); - if (temp == NULL) - goto Done; - - /* Paste them all together with ", " between. */ - s = PyUnicode_FromString(", "); - if (s == NULL) - goto Done; - result = PyUnicode_Join(s, pieces); - Py_DECREF(s); - -Done: - Py_DECREF(pieces); +error: + _PyAccu_Destroy(&acc); + Py_XDECREF(s); Py_ReprLeave((PyObject *)v); - return result; + return NULL; } /* The addend 82520, was selected from the range(0, 1000000) for diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp --- a/PC/VC6/pythoncore.dsp +++ b/PC/VC6/pythoncore.dsp @@ -205,6 +205,10 @@ # End Source File # Begin Source File +SOURCE=..\..\Objects\accu.c +# End Source File +# Begin Source File + SOURCE=..\..\Parser\acceler.c # End Source File # Begin Source File diff --git a/PC/VS7.1/pythoncore.vcproj b/PC/VS7.1/pythoncore.vcproj --- a/PC/VS7.1/pythoncore.vcproj +++ b/PC/VS7.1/pythoncore.vcproj @@ -445,6 +445,9 @@ RelativePath="..\..\Objects\abstract.c"> + + + + @@ -1447,6 +1451,10 @@ > + + diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -635,6 +635,10 @@ > + + @@ -1447,6 +1451,10 @@ > + + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 19:13:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 19:13:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2312911=3A_Fix_memory_consumption_when_calculating_th?= =?utf8?q?e_repr=28=29_of_huge_tuples?= Message-ID: http://hg.python.org/cpython/rev/656c13024ede changeset: 72756:656c13024ede parent: 72753:9a91ab415109 parent: 72755:f9f782f2369e user: Antoine Pitrou date: Thu Oct 06 19:04:12 2011 +0200 summary: Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists. This introduces a small private API for this common pattern. The issue has been discovered thanks to Martin's huge-mem buildbot. files: Include/Python.h | 2 +- Include/accu.h | 35 +++++++ Lib/test/test_list.py | 11 ++ Lib/test/test_tuple.py | 10 ++ Makefile.pre.in | 2 + Misc/NEWS | 3 + Objects/accu.c | 114 +++++++++++++++++++++++++ Objects/listobject.c | 81 +++++++---------- Objects/tupleobject.c | 73 +++++++-------- PC/VC6/pythoncore.dsp | 4 + PC/VS7.1/pythoncore.vcproj | 3 + PC/VS8.0/pythoncore.vcproj | 8 + PCbuild/pythoncore.vcproj | 8 + 13 files changed, 269 insertions(+), 85 deletions(-) diff --git a/Include/Python.h b/Include/Python.h --- a/Include/Python.h +++ b/Include/Python.h @@ -101,7 +101,7 @@ #include "warnings.h" #include "weakrefobject.h" #include "structseq.h" - +#include "accu.h" #include "codecs.h" #include "pyerrors.h" diff --git a/Include/accu.h b/Include/accu.h new file mode 100644 --- /dev/null +++ b/Include/accu.h @@ -0,0 +1,35 @@ +#ifndef Py_LIMITED_API +#ifndef Py_ACCU_H +#define Py_ACCU_H + +/*** This is a private API for use by the interpreter and the stdlib. + *** Its definition may be changed or removed at any moment. + ***/ + +/* + * A two-level accumulator of unicode objects that avoids both the overhead + * of keeping a huge number of small separate objects, and the quadratic + * behaviour of using a naive repeated concatenation scheme. + */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + PyObject *large; /* A list of previously accumulated large strings */ + PyObject *small; /* Pending small strings */ +} _PyAccu; + +PyAPI_FUNC(int) _PyAccu_Init(_PyAccu *acc); +PyAPI_FUNC(int) _PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode); +PyAPI_FUNC(PyObject *) _PyAccu_FinishAsList(_PyAccu *acc); +PyAPI_FUNC(PyObject *) _PyAccu_Finish(_PyAccu *acc); +PyAPI_FUNC(void) _PyAccu_Destroy(_PyAccu *acc); + +#ifdef __cplusplus +} +#endif + +#endif /* Py_ACCU_H */ +#endif /* Py_LIMITED_API */ diff --git a/Lib/test/test_list.py b/Lib/test/test_list.py --- a/Lib/test/test_list.py +++ b/Lib/test/test_list.py @@ -59,6 +59,17 @@ self.assertRaises((MemoryError, OverflowError), mul, lst, n) self.assertRaises((MemoryError, OverflowError), imul, lst, n) + def test_repr_large(self): + # Check the repr of large list objects + def check(n): + l = [0] * n + s = repr(l) + self.assertEqual(s, + '[' + ', '.join(['0'] * n) + ']') + check(10) # check our checking code + check(1000000) + + def test_main(verbose=None): support.run_unittest(ListTest) diff --git a/Lib/test/test_tuple.py b/Lib/test/test_tuple.py --- a/Lib/test/test_tuple.py +++ b/Lib/test/test_tuple.py @@ -154,6 +154,16 @@ # Trying to untrack an unfinished tuple could crash Python self._not_tracked(tuple(gc.collect() for i in range(101))) + def test_repr_large(self): + # Check the repr of large list objects + def check(n): + l = (0,) * n + s = repr(l) + self.assertEqual(s, + '(' + ', '.join(['0'] * n) + ')') + check(10) # check our checking code + check(1000000) + def test_main(): support.run_unittest(TupleTest) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -342,6 +342,7 @@ # Objects OBJECT_OBJS= \ Objects/abstract.o \ + Objects/accu.o \ Objects/boolobject.o \ Objects/bytes_methods.o \ Objects/bytearrayobject.o \ @@ -661,6 +662,7 @@ PYTHON_HEADERS= \ Include/Python.h \ Include/abstract.h \ + Include/accu.h \ Include/asdl.h \ Include/ast.h \ Include/bltinmodule.h \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12911: Fix memory consumption when calculating the repr() of huge + tuples or lists. + - PEP 393: flexible string representation. Thanks to Torsten Becker for the initial implementation, and Victor Stinner for various bug fixes. diff --git a/Objects/accu.c b/Objects/accu.c new file mode 100644 --- /dev/null +++ b/Objects/accu.c @@ -0,0 +1,114 @@ +/* Accumulator struct implementation */ + +#include "Python.h" + +static PyObject * +join_list_unicode(PyObject *lst) +{ + /* return ''.join(lst) */ + PyObject *sep, *ret; + sep = PyUnicode_FromStringAndSize("", 0); + ret = PyUnicode_Join(sep, lst); + Py_DECREF(sep); + return ret; +} + +int +_PyAccu_Init(_PyAccu *acc) +{ + /* Lazily allocated */ + acc->large = NULL; + acc->small = PyList_New(0); + if (acc->small == NULL) + return -1; + return 0; +} + +static int +flush_accumulator(_PyAccu *acc) +{ + Py_ssize_t nsmall = PyList_GET_SIZE(acc->small); + if (nsmall) { + int ret; + PyObject *joined; + if (acc->large == NULL) { + acc->large = PyList_New(0); + if (acc->large == NULL) + return -1; + } + joined = join_list_unicode(acc->small); + if (joined == NULL) + return -1; + if (PyList_SetSlice(acc->small, 0, nsmall, NULL)) { + Py_DECREF(joined); + return -1; + } + ret = PyList_Append(acc->large, joined); + Py_DECREF(joined); + return ret; + } + return 0; +} + +int +_PyAccu_Accumulate(_PyAccu *acc, PyObject *unicode) +{ + Py_ssize_t nsmall; + assert(PyUnicode_Check(unicode)); + + if (PyList_Append(acc->small, unicode)) + return -1; + nsmall = PyList_GET_SIZE(acc->small); + /* Each item in a list of unicode objects has an overhead (in 64-bit + * builds) of: + * - 8 bytes for the list slot + * - 56 bytes for the header of the unicode object + * that is, 64 bytes. 100000 such objects waste more than 6MB + * compared to a single concatenated string. + */ + if (nsmall < 100000) + return 0; + return flush_accumulator(acc); +} + +PyObject * +_PyAccu_FinishAsList(_PyAccu *acc) +{ + int ret; + PyObject *res; + + ret = flush_accumulator(acc); + Py_CLEAR(acc->small); + if (ret) { + Py_CLEAR(acc->large); + return NULL; + } + res = acc->large; + acc->large = NULL; + return res; +} + +PyObject * +_PyAccu_Finish(_PyAccu *acc) +{ + PyObject *list, *res; + if (acc->large == NULL) { + list = acc->small; + acc->small = NULL; + } + else { + list = _PyAccu_FinishAsList(acc); + if (!list) + return NULL; + } + res = join_list_unicode(list); + Py_DECREF(list); + return res; +} + +void +_PyAccu_Destroy(_PyAccu *acc) +{ + Py_CLEAR(acc->small); + Py_CLEAR(acc->large); +} diff --git a/Objects/listobject.c b/Objects/listobject.c --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -321,70 +321,59 @@ list_repr(PyListObject *v) { Py_ssize_t i; - PyObject *s, *temp; - PyObject *pieces = NULL, *result = NULL; + PyObject *s = NULL; + _PyAccu acc; + static PyObject *sep = NULL; + + if (Py_SIZE(v) == 0) { + return PyUnicode_FromString("[]"); + } + + if (sep == NULL) { + sep = PyUnicode_FromString(", "); + if (sep == NULL) + return NULL; + } i = Py_ReprEnter((PyObject*)v); if (i != 0) { return i > 0 ? PyUnicode_FromString("[...]") : NULL; } - if (Py_SIZE(v) == 0) { - result = PyUnicode_FromString("[]"); - goto Done; - } + if (_PyAccu_Init(&acc)) + goto error; - pieces = PyList_New(0); - if (pieces == NULL) - goto Done; + s = PyUnicode_FromString("["); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); /* Do repr() on each element. Note that this may mutate the list, so must refetch the list size on each iteration. */ for (i = 0; i < Py_SIZE(v); ++i) { - int status; if (Py_EnterRecursiveCall(" while getting the repr of a list")) - goto Done; + goto error; s = PyObject_Repr(v->ob_item[i]); Py_LeaveRecursiveCall(); - if (s == NULL) - goto Done; - status = PyList_Append(pieces, s); - Py_DECREF(s); /* append created a new ref */ - if (status < 0) - goto Done; + if (i > 0 && _PyAccu_Accumulate(&acc, sep)) + goto error; + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); } + s = PyUnicode_FromString("]"); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); - /* Add "[]" decorations to the first and last items. */ - assert(PyList_GET_SIZE(pieces) > 0); - s = PyUnicode_FromString("["); - if (s == NULL) - goto Done; - temp = PyList_GET_ITEM(pieces, 0); - PyUnicode_AppendAndDel(&s, temp); - PyList_SET_ITEM(pieces, 0, s); - if (s == NULL) - goto Done; + Py_ReprLeave((PyObject *)v); + return _PyAccu_Finish(&acc); - s = PyUnicode_FromString("]"); - if (s == NULL) - goto Done; - temp = PyList_GET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1); - PyUnicode_AppendAndDel(&temp, s); - PyList_SET_ITEM(pieces, PyList_GET_SIZE(pieces) - 1, temp); - if (temp == NULL) - goto Done; - - /* Paste them all together with ", " between. */ - s = PyUnicode_FromString(", "); - if (s == NULL) - goto Done; - result = PyUnicode_Join(s, pieces); - Py_DECREF(s); - -Done: - Py_XDECREF(pieces); +error: + _PyAccu_Destroy(&acc); + Py_XDECREF(s); Py_ReprLeave((PyObject *)v); - return result; + return NULL; } static Py_ssize_t diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -240,13 +240,20 @@ tuplerepr(PyTupleObject *v) { Py_ssize_t i, n; - PyObject *s, *temp; - PyObject *pieces, *result = NULL; + PyObject *s = NULL; + _PyAccu acc; + static PyObject *sep = NULL; n = Py_SIZE(v); if (n == 0) return PyUnicode_FromString("()"); + if (sep == NULL) { + sep = PyUnicode_FromString(", "); + if (sep == NULL) + return NULL; + } + /* While not mutable, it is still possible to end up with a cycle in a tuple through an object that stores itself within a tuple (and thus infinitely asks for the repr of itself). This should only be @@ -256,52 +263,42 @@ return i > 0 ? PyUnicode_FromString("(...)") : NULL; } - pieces = PyTuple_New(n); - if (pieces == NULL) - return NULL; + if (_PyAccu_Init(&acc)) + goto error; + + s = PyUnicode_FromString("("); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); /* Do repr() on each element. */ for (i = 0; i < n; ++i) { if (Py_EnterRecursiveCall(" while getting the repr of a tuple")) - goto Done; + goto error; s = PyObject_Repr(v->ob_item[i]); Py_LeaveRecursiveCall(); - if (s == NULL) - goto Done; - PyTuple_SET_ITEM(pieces, i, s); + if (i > 0 && _PyAccu_Accumulate(&acc, sep)) + goto error; + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); } + if (n > 1) + s = PyUnicode_FromString(")"); + else + s = PyUnicode_FromString(",)"); + if (s == NULL || _PyAccu_Accumulate(&acc, s)) + goto error; + Py_CLEAR(s); - /* Add "()" decorations to the first and last items. */ - assert(n > 0); - s = PyUnicode_FromString("("); - if (s == NULL) - goto Done; - temp = PyTuple_GET_ITEM(pieces, 0); - PyUnicode_AppendAndDel(&s, temp); - PyTuple_SET_ITEM(pieces, 0, s); - if (s == NULL) - goto Done; + Py_ReprLeave((PyObject *)v); + return _PyAccu_Finish(&acc); - s = PyUnicode_FromString(n == 1 ? ",)" : ")"); - if (s == NULL) - goto Done; - temp = PyTuple_GET_ITEM(pieces, n-1); - PyUnicode_AppendAndDel(&temp, s); - PyTuple_SET_ITEM(pieces, n-1, temp); - if (temp == NULL) - goto Done; - - /* Paste them all together with ", " between. */ - s = PyUnicode_FromString(", "); - if (s == NULL) - goto Done; - result = PyUnicode_Join(s, pieces); - Py_DECREF(s); - -Done: - Py_DECREF(pieces); +error: + _PyAccu_Destroy(&acc); + Py_XDECREF(s); Py_ReprLeave((PyObject *)v); - return result; + return NULL; } /* The addend 82520, was selected from the range(0, 1000000) for diff --git a/PC/VC6/pythoncore.dsp b/PC/VC6/pythoncore.dsp --- a/PC/VC6/pythoncore.dsp +++ b/PC/VC6/pythoncore.dsp @@ -205,6 +205,10 @@ # End Source File # Begin Source File +SOURCE=..\..\Objects\accu.c +# End Source File +# Begin Source File + SOURCE=..\..\Parser\acceler.c # End Source File # Begin Source File diff --git a/PC/VS7.1/pythoncore.vcproj b/PC/VS7.1/pythoncore.vcproj --- a/PC/VS7.1/pythoncore.vcproj +++ b/PC/VS7.1/pythoncore.vcproj @@ -445,6 +445,9 @@ RelativePath="..\..\Objects\abstract.c"> + + + + @@ -1447,6 +1451,10 @@ > + + diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -635,6 +635,10 @@ > + + @@ -1455,6 +1459,10 @@ > + + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 19:13:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 19:13:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_now_duplicate_code_i?= =?utf8?q?n_=5Fjson=2Ec=3B_instead=2C_reuse_the_new_private_lib?= Message-ID: http://hg.python.org/cpython/rev/e685b02ddcac changeset: 72757:e685b02ddcac user: Antoine Pitrou date: Thu Oct 06 19:09:51 2011 +0200 summary: Remove now duplicate code in _json.c; instead, reuse the new private lib files: Modules/_json.c | 145 +++++------------------------------ 1 files changed, 22 insertions(+), 123 deletions(-) diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -75,17 +75,6 @@ {NULL} }; -/* - * A two-level accumulator of unicode objects that avoids both the overhead - * of keeping a huge number of small separate objects, and the quadratic - * behaviour of using a naive repeated concatenation scheme. - */ - -typedef struct { - PyObject *large; /* A list of previously accumulated large strings */ - PyObject *small; /* Pending small strings */ -} accumulator; - static PyObject * join_list_unicode(PyObject *lst) { @@ -99,96 +88,6 @@ return PyUnicode_Join(sep, lst); } -static int -init_accumulator(accumulator *acc) -{ - acc->large = PyList_New(0); - if (acc->large == NULL) - return -1; - acc->small = PyList_New(0); - if (acc->small == NULL) { - Py_CLEAR(acc->large); - return -1; - } - return 0; -} - -static int -flush_accumulator(accumulator *acc) -{ - Py_ssize_t nsmall = PyList_GET_SIZE(acc->small); - if (nsmall) { - int ret; - PyObject *joined = join_list_unicode(acc->small); - if (joined == NULL) - return -1; - if (PyList_SetSlice(acc->small, 0, nsmall, NULL)) { - Py_DECREF(joined); - return -1; - } - ret = PyList_Append(acc->large, joined); - Py_DECREF(joined); - return ret; - } - return 0; -} - -static int -accumulate_unicode(accumulator *acc, PyObject *obj) -{ - int ret; - Py_ssize_t nsmall; - PyObject *joined; - assert(PyUnicode_Check(obj)); - - if (PyList_Append(acc->small, obj)) - return -1; - nsmall = PyList_GET_SIZE(acc->small); - /* Each item in a list of unicode objects has an overhead (in 64-bit - * builds) of: - * - 8 bytes for the list slot - * - 56 bytes for the header of the unicode object - * that is, 64 bytes. 100000 such objects waste more than 6MB - * compared to a single concatenated string. - */ - if (nsmall < 100000) - return 0; - joined = join_list_unicode(acc->small); - if (joined == NULL) - return -1; - if (PyList_SetSlice(acc->small, 0, nsmall, NULL)) { - Py_DECREF(joined); - return -1; - } - ret = PyList_Append(acc->large, joined); - Py_DECREF(joined); - return ret; -} - -static PyObject * -finish_accumulator(accumulator *acc) -{ - int ret; - PyObject *res; - - ret = flush_accumulator(acc); - Py_CLEAR(acc->small); - if (ret) { - Py_CLEAR(acc->large); - return NULL; - } - res = acc->large; - acc->large = NULL; - return res; -} - -static void -destroy_accumulator(accumulator *acc) -{ - Py_CLEAR(acc->small); - Py_CLEAR(acc->large); -} - /* Forward decls */ static PyObject * @@ -217,11 +116,11 @@ static int encoder_clear(PyObject *self); static int -encoder_listencode_list(PyEncoderObject *s, accumulator *acc, PyObject *seq, Py_ssize_t indent_level); +encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level); static int -encoder_listencode_obj(PyEncoderObject *s, accumulator *acc, PyObject *obj, Py_ssize_t indent_level); +encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, PyObject *obj, Py_ssize_t indent_level); static int -encoder_listencode_dict(PyEncoderObject *s, accumulator *acc, PyObject *dct, Py_ssize_t indent_level); +encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, PyObject *dct, Py_ssize_t indent_level); static PyObject * _encoded_const(PyObject *obj); static void @@ -1383,20 +1282,20 @@ PyObject *obj; Py_ssize_t indent_level; PyEncoderObject *s; - accumulator acc; + _PyAccu acc; assert(PyEncoder_Check(self)); s = (PyEncoderObject *)self; if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist, &obj, _convertPyInt_AsSsize_t, &indent_level)) return NULL; - if (init_accumulator(&acc)) + if (_PyAccu_Init(&acc)) return NULL; if (encoder_listencode_obj(s, &acc, obj, indent_level)) { - destroy_accumulator(&acc); + _PyAccu_Destroy(&acc); return NULL; } - return finish_accumulator(&acc); + return _PyAccu_FinishAsList(&acc); } static PyObject * @@ -1468,16 +1367,16 @@ } static int -_steal_accumulate(accumulator *acc, PyObject *stolen) +_steal_accumulate(_PyAccu *acc, PyObject *stolen) { /* Append stolen and then decrement its reference count */ - int rval = accumulate_unicode(acc, stolen); + int rval = _PyAccu_Accumulate(acc, stolen); Py_DECREF(stolen); return rval; } static int -encoder_listencode_obj(PyEncoderObject *s, accumulator *acc, +encoder_listencode_obj(PyEncoderObject *s, _PyAccu *acc, PyObject *obj, Py_ssize_t indent_level) { /* Encode Python object obj to a JSON term */ @@ -1570,7 +1469,7 @@ } static int -encoder_listencode_dict(PyEncoderObject *s, accumulator *acc, +encoder_listencode_dict(PyEncoderObject *s, _PyAccu *acc, PyObject *dct, Py_ssize_t indent_level) { /* Encode Python dict dct a JSON term */ @@ -1593,7 +1492,7 @@ return -1; } if (Py_SIZE(dct) == 0) - return accumulate_unicode(acc, empty_dict); + return _PyAccu_Accumulate(acc, empty_dict); if (s->markers != Py_None) { int has_key; @@ -1611,7 +1510,7 @@ } } - if (accumulate_unicode(acc, open_dict)) + if (_PyAccu_Accumulate(acc, open_dict)) goto bail; if (s->indent != Py_None) { @@ -1698,7 +1597,7 @@ } if (idx) { - if (accumulate_unicode(acc, s->item_separator)) + if (_PyAccu_Accumulate(acc, s->item_separator)) goto bail; } @@ -1706,12 +1605,12 @@ Py_CLEAR(kstr); if (encoded == NULL) goto bail; - if (accumulate_unicode(acc, encoded)) { + if (_PyAccu_Accumulate(acc, encoded)) { Py_DECREF(encoded); goto bail; } Py_DECREF(encoded); - if (accumulate_unicode(acc, s->key_separator)) + if (_PyAccu_Accumulate(acc, s->key_separator)) goto bail; value = PyTuple_GET_ITEM(item, 1); @@ -1735,7 +1634,7 @@ yield '\n' + (' ' * (_indent * _current_indent_level)) }*/ - if (accumulate_unicode(acc, close_dict)) + if (_PyAccu_Accumulate(acc, close_dict)) goto bail; return 0; @@ -1749,7 +1648,7 @@ static int -encoder_listencode_list(PyEncoderObject *s, accumulator *acc, +encoder_listencode_list(PyEncoderObject *s, _PyAccu *acc, PyObject *seq, Py_ssize_t indent_level) { /* Encode Python list seq to a JSON term */ @@ -1776,7 +1675,7 @@ num_items = PySequence_Fast_GET_SIZE(s_fast); if (num_items == 0) { Py_DECREF(s_fast); - return accumulate_unicode(acc, empty_array); + return _PyAccu_Accumulate(acc, empty_array); } if (s->markers != Py_None) { @@ -1796,7 +1695,7 @@ } seq_items = PySequence_Fast_ITEMS(s_fast); - if (accumulate_unicode(acc, open_array)) + if (_PyAccu_Accumulate(acc, open_array)) goto bail; if (s->indent != Py_None) { /* TODO: DOES NOT RUN */ @@ -1810,7 +1709,7 @@ for (i = 0; i < num_items; i++) { PyObject *obj = seq_items[i]; if (i) { - if (accumulate_unicode(acc, s->item_separator)) + if (_PyAccu_Accumulate(acc, s->item_separator)) goto bail; } if (encoder_listencode_obj(s, acc, obj, indent_level)) @@ -1828,7 +1727,7 @@ yield '\n' + (' ' * (_indent * _current_indent_level)) }*/ - if (accumulate_unicode(acc, close_array)) + if (_PyAccu_Accumulate(acc, close_array)) goto bail; Py_DECREF(s_fast); return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 19:45:31 2011 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 06 Oct 2011 19:45:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310141=3A_socket=3A?= =?utf8?q?_add_SocketCAN_=28PF=5FCAN=29_support=2E_Initial_patch_by_Matthi?= =?utf8?q?as?= Message-ID: http://hg.python.org/cpython/rev/e767318baccd changeset: 72758:e767318baccd user: Charles-Fran?ois Natali date: Thu Oct 06 19:47:44 2011 +0200 summary: Issue #10141: socket: add SocketCAN (PF_CAN) support. Initial patch by Matthias Fuchs, updated by Tiago Gon?alves. files: Doc/library/socket.rst | 71 +++- Doc/whatsnew/3.3.rst | 21 +- Lib/test/test_socket.py | 164 +++++++ Misc/ACKS | 2 + Misc/NEWS | 3 + Modules/socketmodule.c | 105 ++++ Modules/socketmodule.h | 11 + configure | 614 +++++++++++++-------------- configure.in | 7 + pyconfig.h.in | 6 + 10 files changed, 683 insertions(+), 321 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -80,6 +80,11 @@ If *addr_type* is TIPC_ADDR_ID, then *v1* is the node, *v2* is the reference, and *v3* should be set to 0. +- A tuple ``(interface, )`` is used for the :const:`AF_CAN` address family, + where *interface* is a string representing a network interface name like + ``'can0'``. The network interface name ``''`` can be used to receive packets + from all network interfaces of this family. + - Certain other address families (:const:`AF_BLUETOOTH`, :const:`AF_PACKET`) support specific representations. @@ -216,6 +221,19 @@ in the Unix header files are defined; for a few symbols, default values are provided. +.. data:: AF_CAN + PF_CAN + SOL_CAN_* + CAN_* + + Many constants of these forms, documented in the Linux documentation, are + also defined in the socket module. + + Availability: Linux >= 2.6.25. + + .. versionadded:: 3.3 + + .. data:: SIO_* RCVALL_* @@ -387,10 +405,14 @@ Create a new socket using the given address family, socket type and protocol number. The address family should be :const:`AF_INET` (the default), - :const:`AF_INET6` or :const:`AF_UNIX`. The socket type should be - :const:`SOCK_STREAM` (the default), :const:`SOCK_DGRAM` or perhaps one of the - other ``SOCK_`` constants. The protocol number is usually zero and may be - omitted in that case. + :const:`AF_INET6`, :const:`AF_UNIX` or :const:`AF_CAN`. The socket type + should be :const:`SOCK_STREAM` (the default), :const:`SOCK_DGRAM`, + :const:`SOCK_RAW` or perhaps one of the other ``SOCK_`` constants. The + protocol number is usually zero and may be omitted in that case or + :const:`CAN_RAW` in case the address family is :const:`AF_CAN`. + + .. versionchanged:: 3.3 + The AF_CAN family was added. .. function:: socketpair([family[, type[, proto]]]) @@ -1213,7 +1235,7 @@ print('Received', repr(data)) -The last example shows how to write a very simple network sniffer with raw +The next example shows how to write a very simple network sniffer with raw sockets on Windows. The example requires administrator privileges to modify the interface:: @@ -1238,6 +1260,45 @@ # disabled promiscuous mode s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) +The last example shows how to use the socket interface to communicate to a CAN +network. This example might require special priviledge:: + + import socket + import struct + + + # CAN frame packing/unpacking (see `struct can_frame` in ) + + can_frame_fmt = "=IB3x8s" + + def build_can_frame(can_id, data): + can_dlc = len(data) + data = data.ljust(8, b'\x00') + return struct.pack(can_frame_fmt, can_id, can_dlc, data) + + def dissect_can_frame(frame): + can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame) + return (can_id, can_dlc, data[:can_dlc]) + + + # create a raw socket and bind it to the `vcan0` interface + s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + s.bind(('vcan0',)) + + while True: + cf, addr = s.recvfrom(16) + + print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf)) + + try: + s.send(cf) + except socket.error: + print('Error sending CAN frame') + + try: + s.send(build_can_frame(0x01, b'\x01\x02\x03')) + except socket.error: + print('Error sending CAN frame') Running an example several times with too small delay between executions, could lead to this error:: diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -300,15 +300,22 @@ socket ------ -The :class:`~socket.socket` class now exposes addititonal methods to -process ancillary data when supported by the underlying platform: +* The :class:`~socket.socket` class now exposes additional methods to process + ancillary data when supported by the underlying platform: -* :func:`~socket.socket.sendmsg` -* :func:`~socket.socket.recvmsg` -* :func:`~socket.socket.recvmsg_into` + * :func:`~socket.socket.sendmsg` + * :func:`~socket.socket.recvmsg` + * :func:`~socket.socket.recvmsg_into` -(Contributed by David Watson in :issue:`6560`, based on an earlier patch -by Heiko Wundram) + (Contributed by David Watson in :issue:`6560`, based on an earlier patch by + Heiko Wundram) + +* The :class:`~socket.socket` class now supports the PF_CAN protocol family + (http://en.wikipedia.org/wiki/Socketcan), on Linux + (http://lwn.net/Articles/253425). + + (Contributed by Matthias Fuchs, updated by Tiago Gon?alves in :issue:`10141`) + ssl --- diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -21,6 +21,7 @@ import signal import math import pickle +import struct try: import fcntl except ImportError: @@ -36,6 +37,18 @@ thread = None threading = None +def _have_socket_can(): + """Check whether CAN sockets are supported on this host.""" + try: + s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + except (AttributeError, socket.error, OSError): + return False + else: + s.close() + return True + +HAVE_SOCKET_CAN = _have_socket_can() + # Size in bytes of the int type SIZEOF_INT = array.array("i").itemsize @@ -80,6 +93,30 @@ with self._cleanup_lock: return super().doCleanups(*args, **kwargs) +class SocketCANTest(unittest.TestCase): + + """To be able to run this test, a `vcan0` CAN interface can be created with + the following commands: + # modprobe vcan + # ip link add dev vcan0 type vcan + # ifconfig vcan0 up + """ + interface = 'vcan0' + bufsize = 128 + + def setUp(self): + self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + try: + self.s.bind((self.interface,)) + except socket.error: + self.skipTest('network interface `%s` does not exist' % + self.interface) + self.s.close() + + def tearDown(self): + self.s.close() + self.s = None + class ThreadableTest: """Threadable Test class @@ -210,6 +247,26 @@ self.cli = None ThreadableTest.clientTearDown(self) +class ThreadedCANSocketTest(SocketCANTest, ThreadableTest): + + def __init__(self, methodName='runTest'): + SocketCANTest.__init__(self, methodName=methodName) + ThreadableTest.__init__(self) + + def clientSetUp(self): + self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + try: + self.cli.bind((self.interface,)) + except socket.error: + self.skipTest('network interface `%s` does not exist' % + self.interface) + self.cli.close() + + def clientTearDown(self): + self.cli.close() + self.cli = None + ThreadableTest.clientTearDown(self) + class SocketConnectedTest(ThreadedTCPSocketTest): """Socket tests for client-server connection. @@ -1072,6 +1129,112 @@ srv.close() + at unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.') +class BasicCANTest(unittest.TestCase): + + def testCrucialConstants(self): + socket.AF_CAN + socket.PF_CAN + socket.CAN_RAW + + def testCreateSocket(self): + with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: + pass + + def testBindAny(self): + with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: + s.bind(('', )) + + def testTooLongInterfaceName(self): + # most systems limit IFNAMSIZ to 16, take 1024 to be sure + with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: + self.assertRaisesRegexp(socket.error, 'interface name too long', + s.bind, ('x' * 1024,)) + + @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"), + 'socket.CAN_RAW_LOOPBACK required for this test.') + def testLoopback(self): + with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: + for loopback in (0, 1): + s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK, + loopback) + self.assertEqual(loopback, + s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK)) + + @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"), + 'socket.CAN_RAW_FILTER required for this test.') + def testFilter(self): + can_id, can_mask = 0x200, 0x700 + can_filter = struct.pack("=II", can_id, can_mask) + with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: + s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter) + self.assertEqual(can_filter, + s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8)) + + + at unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.') + at unittest.skipUnless(thread, 'Threading required for this test.') +class CANTest(ThreadedCANSocketTest): + + """The CAN frame structure is defined in : + + struct can_frame { + canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ + __u8 can_dlc; /* data length code: 0 .. 8 */ + __u8 data[8] __attribute__((aligned(8))); + }; + """ + can_frame_fmt = "=IB3x8s" + + def __init__(self, methodName='runTest'): + ThreadedCANSocketTest.__init__(self, methodName=methodName) + + @classmethod + def build_can_frame(cls, can_id, data): + """Build a CAN frame.""" + can_dlc = len(data) + data = data.ljust(8, b'\x00') + return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data) + + @classmethod + def dissect_can_frame(cls, frame): + """Dissect a CAN frame.""" + can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame) + return (can_id, can_dlc, data[:can_dlc]) + + def testSendFrame(self): + cf, addr = self.s.recvfrom(self.bufsize) + self.assertEqual(self.cf, cf) + self.assertEqual(addr[0], self.interface) + self.assertEqual(addr[1], socket.AF_CAN) + + def _testSendFrame(self): + self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05') + self.cli.send(self.cf) + + def testSendMaxFrame(self): + cf, addr = self.s.recvfrom(self.bufsize) + self.assertEqual(self.cf, cf) + + def _testSendMaxFrame(self): + self.cf = self.build_can_frame(0x00, b'\x07' * 8) + self.cli.send(self.cf) + + def testSendMultiFrames(self): + cf, addr = self.s.recvfrom(self.bufsize) + self.assertEqual(self.cf1, cf) + + cf, addr = self.s.recvfrom(self.bufsize) + self.assertEqual(self.cf2, cf) + + def _testSendMultiFrames(self): + self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11') + self.cli.send(self.cf1) + + self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33') + self.cli.send(self.cf2) + + @unittest.skipUnless(thread, 'Threading required for this test.') class BasicTCPTest(SocketConnectedTest): @@ -4194,6 +4357,7 @@ if isTipcAvailable(): tests.append(TIPCTest) tests.append(TIPCThreadableTest) + tests.extend([BasicCANTest, CANTest]) tests.extend([ CmsgMacroTests, SendmsgUDPTest, diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -319,6 +319,7 @@ Martin Franklin Robin Friedrich Ivan Frohne +Matthias Fuchs Jim Fulton Tadayoshi Funaba Gyro Funch @@ -354,6 +355,7 @@ Yannick Gingras Christoph Gohlke Tim Golden +Tiago Gon?alves Chris Gonnerman David Goodger Hans de Graaff diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1322,6 +1322,9 @@ Extension Modules ----------------- +- Issue #10141: socket: Add SocketCAN (PF_CAN) support. Initial patch by + Matthias Fuchs, updated by Tiago Gon?alves. + - Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1220,6 +1220,25 @@ } #endif +#ifdef HAVE_LINUX_CAN_H + case AF_CAN: + { + struct sockaddr_can *a = (struct sockaddr_can *)addr; + char *ifname = ""; + struct ifreq ifr; + /* need to look up interface name given index */ + if (a->can_ifindex) { + ifr.ifr_ifindex = a->can_ifindex; + if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0) + ifname = ifr.ifr_name; + } + + return Py_BuildValue("O&h", PyUnicode_DecodeFSDefault, + ifname, + a->can_family); + } +#endif + /* More cases here... */ default: @@ -1587,6 +1606,53 @@ } #endif +#ifdef HAVE_LINUX_CAN_H + case AF_CAN: + switch (s->sock_proto) { + case CAN_RAW: + { + struct sockaddr_can *addr; + PyObject *interfaceName; + struct ifreq ifr; + addr = (struct sockaddr_can *)addr_ret; + Py_ssize_t len; + + if (!PyArg_ParseTuple(args, "O&", PyUnicode_FSConverter, + &interfaceName)) + return 0; + + len = PyBytes_GET_SIZE(interfaceName); + + if (len == 0) { + ifr.ifr_ifindex = 0; + } else if (len < sizeof(ifr.ifr_name)) { + strcpy(ifr.ifr_name, PyBytes_AS_STRING(interfaceName)); + if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { + s->errorhandler(); + Py_DECREF(interfaceName); + return 0; + } + } else { + PyErr_SetString(socket_error, + "AF_CAN interface name too long"); + Py_DECREF(interfaceName); + return 0; + } + + addr->can_family = AF_CAN; + addr->can_ifindex = ifr.ifr_ifindex; + + *len_ret = sizeof(*addr); + Py_DECREF(interfaceName); + return 1; + } + default: + PyErr_SetString(socket_error, + "getsockaddrarg: unsupported CAN protocol"); + return 0; + } +#endif + /* More cases here... */ default: @@ -1680,6 +1746,14 @@ } #endif +#ifdef HAVE_LINUX_CAN_H + case AF_CAN: + { + *len_ret = sizeof (struct sockaddr_can); + return 1; + } +#endif + /* More cases here... */ default: @@ -5533,6 +5607,15 @@ PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF"); #endif +#ifdef AF_CAN + /* Controller Area Network */ + PyModule_AddIntConstant(m, "AF_CAN", AF_CAN); +#endif +#ifdef PF_CAN + /* Controller Area Network */ + PyModule_AddIntConstant(m, "PF_CAN", PF_CAN); +#endif + #ifdef AF_PACKET PyModule_AddIntMacro(m, AF_PACKET); #endif @@ -5803,6 +5886,28 @@ #else PyModule_AddIntConstant(m, "SOL_UDP", 17); #endif +#ifdef SOL_CAN_BASE + PyModule_AddIntConstant(m, "SOL_CAN_BASE", SOL_CAN_BASE); +#endif +#ifdef SOL_CAN_RAW + PyModule_AddIntConstant(m, "SOL_CAN_RAW", SOL_CAN_RAW); + PyModule_AddIntConstant(m, "CAN_RAW", CAN_RAW); +#endif +#ifdef HAVE_LINUX_CAN_H + PyModule_AddIntConstant(m, "CAN_EFF_FLAG", CAN_EFF_FLAG); + PyModule_AddIntConstant(m, "CAN_RTR_FLAG", CAN_RTR_FLAG); + PyModule_AddIntConstant(m, "CAN_ERR_FLAG", CAN_ERR_FLAG); + + PyModule_AddIntConstant(m, "CAN_SFF_MASK", CAN_SFF_MASK); + PyModule_AddIntConstant(m, "CAN_EFF_MASK", CAN_EFF_MASK); + PyModule_AddIntConstant(m, "CAN_ERR_MASK", CAN_ERR_MASK); +#endif +#ifdef HAVE_LINUX_CAN_RAW_H + PyModule_AddIntConstant(m, "CAN_RAW_FILTER", CAN_RAW_FILTER); + PyModule_AddIntConstant(m, "CAN_RAW_ERR_FILTER", CAN_RAW_ERR_FILTER); + PyModule_AddIntConstant(m, "CAN_RAW_LOOPBACK", CAN_RAW_LOOPBACK); + PyModule_AddIntConstant(m, "CAN_RAW_RECV_OWN_MSGS", CAN_RAW_RECV_OWN_MSGS); +#endif #ifdef IPPROTO_IP PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP); #else diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -72,6 +72,14 @@ # include #endif +#ifdef HAVE_LINUX_CAN_H +#include +#endif + +#ifdef HAVE_LINUX_CAN_RAW_H +#include +#endif + #ifndef Py__SOCKET_H #define Py__SOCKET_H #ifdef __cplusplus @@ -126,6 +134,9 @@ #ifdef HAVE_NETPACKET_PACKET_H struct sockaddr_ll ll; #endif +#ifdef HAVE_LINUX_CAN_H + struct sockaddr_can can; +#endif } sock_addr_t; /* The object holding a socket. It holds some extra information, diff --git a/configure b/configure --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for python 3.3. +# Generated by GNU Autoconf 2.67 for python 3.3. # # Report bugs to . # @@ -91,7 +91,6 @@ IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -217,18 +216,11 @@ # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. - # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL - case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; - esac - exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : @@ -777,8 +769,7 @@ LDFLAGS LIBS CPPFLAGS -CPP -CPPFLAGS' +CPP' # Initialize some variables set by options. @@ -1183,7 +1174,7 @@ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac @@ -1519,7 +1510,7 @@ if $ac_init_version; then cat <<\_ACEOF python configure 3.3 -generated by GNU Autoconf 2.68 +generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation @@ -1565,7 +1556,7 @@ ac_retval=1 fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile @@ -1611,7 +1602,7 @@ # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1648,7 +1639,7 @@ ac_retval=1 fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp @@ -1661,10 +1652,10 @@ ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval \${$3+:} false; then : + if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1731,7 +1722,7 @@ esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -1740,7 +1731,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel @@ -1781,7 +1772,7 @@ ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run @@ -1795,7 +1786,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1813,7 +1804,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile @@ -1826,7 +1817,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1867,7 +1858,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type @@ -1880,7 +1871,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1920,7 +1911,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_find_uintX_t @@ -1933,7 +1924,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1994,7 +1985,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_find_intX_t @@ -2171,7 +2162,7 @@ rm -f conftest.val fi - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_compute_int @@ -2184,7 +2175,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2239,7 +2230,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func @@ -2252,7 +2243,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } -if eval \${$4+:} false; then : +if eval "test \"\${$4+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2296,7 +2287,7 @@ eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_member @@ -2311,7 +2302,7 @@ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval \${$3+:} false; then : +if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2342,7 +2333,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_decl cat >config.log <<_ACEOF @@ -2350,7 +2341,7 @@ running configure, to aid debugging if configure makes a mistake. It was created by python $as_me 3.3, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2608,7 +2599,7 @@ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi done @@ -2708,7 +2699,7 @@ set dummy hg; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAS_HG+:} false; then : +if test "${ac_cv_prog_HAS_HG+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_HG"; then @@ -3257,7 +3248,7 @@ set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3297,7 +3288,7 @@ set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3350,7 +3341,7 @@ set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3390,7 +3381,7 @@ set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3449,7 +3440,7 @@ set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CC+:} false; then : +if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3493,7 +3484,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_CC+:} false; then : +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3548,7 +3539,7 @@ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3663,7 +3654,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -3706,7 +3697,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -3765,7 +3756,7 @@ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi fi fi @@ -3776,7 +3767,7 @@ ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if ${ac_cv_objext+:} false; then : +if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -3817,7 +3808,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -3827,7 +3818,7 @@ ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if ${ac_cv_c_compiler_gnu+:} false; then : +if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -3864,7 +3855,7 @@ ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if ${ac_cv_prog_cc_g+:} false; then : +if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag @@ -3942,7 +3933,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if ${ac_cv_prog_cc_c89+:} false; then : +if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no @@ -4077,7 +4068,7 @@ set dummy g++; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CXX+:} false; then : +if test "${ac_cv_path_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else case $CXX in @@ -4118,7 +4109,7 @@ set dummy c++; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_CXX+:} false; then : +if test "${ac_cv_path_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else case $CXX in @@ -4169,7 +4160,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_CXX+:} false; then : +if test "${ac_cv_prog_CXX+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -4270,7 +4261,7 @@ CPP= fi if test -z "$CPP"; then - if ${ac_cv_prog_CPP+:} false; then : + if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4386,7 +4377,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } fi ac_ext=c @@ -4398,7 +4389,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : +if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4461,7 +4452,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if ${ac_cv_path_EGREP+:} false; then : +if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4528,7 +4519,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4657,7 +4648,7 @@ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = xyes; then : +if test "x$ac_cv_header_minix_config_h" = x""yes; then : MINIX=yes else MINIX= @@ -4679,7 +4670,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if ${ac_cv_safe_to_define___extensions__+:} false; then : +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4872,7 +4863,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } -if ${ac_cv_c_inline+:} false; then : +if test "${ac_cv_c_inline+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no @@ -5068,7 +5059,7 @@ set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_RANLIB+:} false; then : +if test "${ac_cv_prog_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -5108,7 +5099,7 @@ set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -5162,7 +5153,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AR+:} false; then : +if test "${ac_cv_prog_AR+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then @@ -5213,7 +5204,7 @@ set dummy python; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_HAS_PYTHON+:} false; then : +if test "${ac_cv_prog_HAS_PYTHON+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_PYTHON"; then @@ -5307,7 +5298,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : +if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5499,7 +5490,7 @@ ac_save_cc="$CC" CC="$CC -fno-strict-aliasing" save_CFLAGS="$CFLAGS" - if ${ac_cv_no_strict_aliasing+:} false; then : + if test "${ac_cv_no_strict_aliasing+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5565,7 +5556,7 @@ ac_save_cc="$CC" CC="$CC -Wunused-result -Werror" save_CFLAGS="$CFLAGS" - if ${ac_cv_disable_unused_result_warning+:} false; then : + if test "${ac_cv_disable_unused_result_warning+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5792,7 +5783,7 @@ # options before we can check whether -Kpthread improves anything. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads are available without options" >&5 $as_echo_n "checking whether pthreads are available without options... " >&6; } -if ${ac_cv_pthread_is_default+:} false; then : +if test "${ac_cv_pthread_is_default+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -5845,7 +5836,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kpthread" >&5 $as_echo_n "checking whether $CC accepts -Kpthread... " >&6; } -if ${ac_cv_kpthread+:} false; then : +if test "${ac_cv_kpthread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -5894,7 +5885,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kthread" >&5 $as_echo_n "checking whether $CC accepts -Kthread... " >&6; } -if ${ac_cv_kthread+:} false; then : +if test "${ac_cv_kthread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -5943,7 +5934,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -pthread" >&5 $as_echo_n "checking whether $CC accepts -pthread... " >&6; } -if ${ac_cv_thread+:} false; then : +if test "${ac_cv_thread+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -6028,7 +6019,7 @@ # checks for header files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if ${ac_cv_header_stdc+:} false; then : +if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6167,7 +6158,7 @@ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if eval \${$as_ac_Header+:} false; then : +if eval "test \"\${$as_ac_Header+set}\"" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6207,7 +6198,7 @@ if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : +if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -6241,11 +6232,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : + if test "${ac_cv_search_opendir+set}" = set; then : break fi done -if ${ac_cv_search_opendir+:} false; then : +if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no @@ -6264,7 +6255,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if ${ac_cv_search_opendir+:} false; then : +if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -6298,11 +6289,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if ${ac_cv_search_opendir+:} false; then : + if test "${ac_cv_search_opendir+set}" = set; then : break fi done -if ${ac_cv_search_opendir+:} false; then : +if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no @@ -6322,7 +6313,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5 $as_echo_n "checking whether sys/types.h defines makedev... " >&6; } -if ${ac_cv_header_sys_types_h_makedev+:} false; then : +if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6350,7 +6341,7 @@ if test $ac_cv_header_sys_types_h_makedev = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mkdev_h" = xyes; then : +if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then : $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h @@ -6360,7 +6351,7 @@ if test $ac_cv_header_sys_mkdev_h = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then : +if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then : $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h @@ -6388,7 +6379,7 @@ #endif " -if test "x$ac_cv_header_net_if_h" = xyes; then : +if test "x$ac_cv_header_net_if_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NET_IF_H 1 _ACEOF @@ -6408,7 +6399,7 @@ #endif " -if test "x$ac_cv_header_term_h" = xyes; then : +if test "x$ac_cv_header_term_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TERM_H 1 _ACEOF @@ -6430,7 +6421,7 @@ #endif " -if test "x$ac_cv_header_linux_netlink_h" = xyes; then : +if test "x$ac_cv_header_linux_netlink_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_NETLINK_H 1 _ACEOF @@ -6440,6 +6431,26 @@ done +# On Linux, can.h and can/raw.h require sys/socket.h +for ac_header in linux/can.h linux/can/raw.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + # checks for typedefs was_it_defined=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_t in time.h" >&5 @@ -6566,7 +6577,7 @@ # Type availability checks ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" -if test "x$ac_cv_type_mode_t" = xyes; then : +if test "x$ac_cv_type_mode_t" = x""yes; then : else @@ -6577,7 +6588,7 @@ fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = xyes; then : +if test "x$ac_cv_type_off_t" = x""yes; then : else @@ -6588,7 +6599,7 @@ fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" -if test "x$ac_cv_type_pid_t" = xyes; then : +if test "x$ac_cv_type_pid_t" = x""yes; then : else @@ -6604,7 +6615,7 @@ _ACEOF ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = xyes; then : +if test "x$ac_cv_type_size_t" = x""yes; then : else @@ -6616,7 +6627,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } -if ${ac_cv_type_uid_t+:} false; then : +if test "${ac_cv_type_uid_t+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6695,7 +6706,7 @@ esac ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" -if test "x$ac_cv_type_ssize_t" = xyes; then : +if test "x$ac_cv_type_ssize_t" = x""yes; then : $as_echo "#define HAVE_SSIZE_T 1" >>confdefs.h @@ -6710,7 +6721,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } -if ${ac_cv_sizeof_int+:} false; then : +if test "${ac_cv_sizeof_int+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : @@ -6720,7 +6731,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_int=0 fi @@ -6743,7 +6754,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } -if ${ac_cv_sizeof_long+:} false; then : +if test "${ac_cv_sizeof_long+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : @@ -6753,7 +6764,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_long=0 fi @@ -6776,7 +6787,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } -if ${ac_cv_sizeof_void_p+:} false; then : +if test "${ac_cv_sizeof_void_p+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : @@ -6786,7 +6797,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_void_p=0 fi @@ -6809,7 +6820,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } -if ${ac_cv_sizeof_short+:} false; then : +if test "${ac_cv_sizeof_short+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : @@ -6819,7 +6830,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_short=0 fi @@ -6842,7 +6853,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } -if ${ac_cv_sizeof_float+:} false; then : +if test "${ac_cv_sizeof_float+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : @@ -6852,7 +6863,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_float=0 fi @@ -6875,7 +6886,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } -if ${ac_cv_sizeof_double+:} false; then : +if test "${ac_cv_sizeof_double+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : @@ -6885,7 +6896,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_double=0 fi @@ -6908,7 +6919,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5 $as_echo_n "checking size of fpos_t... " >&6; } -if ${ac_cv_sizeof_fpos_t+:} false; then : +if test "${ac_cv_sizeof_fpos_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))" "ac_cv_sizeof_fpos_t" "$ac_includes_default"; then : @@ -6918,7 +6929,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (fpos_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_fpos_t=0 fi @@ -6941,7 +6952,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } -if ${ac_cv_sizeof_size_t+:} false; then : +if test "${ac_cv_sizeof_size_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : @@ -6951,7 +6962,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_size_t=0 fi @@ -6974,7 +6985,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5 $as_echo_n "checking size of pid_t... " >&6; } -if ${ac_cv_sizeof_pid_t+:} false; then : +if test "${ac_cv_sizeof_pid_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))" "ac_cv_sizeof_pid_t" "$ac_includes_default"; then : @@ -6984,7 +6995,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pid_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_pid_t=0 fi @@ -7034,7 +7045,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } -if ${ac_cv_sizeof_long_long+:} false; then : +if test "${ac_cv_sizeof_long_long+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : @@ -7044,7 +7055,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_long_long=0 fi @@ -7095,7 +7106,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } -if ${ac_cv_sizeof_long_double+:} false; then : +if test "${ac_cv_sizeof_long_double+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : @@ -7105,7 +7116,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long double) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_long_double=0 fi @@ -7157,7 +7168,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5 $as_echo_n "checking size of _Bool... " >&6; } -if ${ac_cv_sizeof__Bool+:} false; then : +if test "${ac_cv_sizeof__Bool+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))" "ac_cv_sizeof__Bool" "$ac_includes_default"; then : @@ -7167,7 +7178,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (_Bool) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof__Bool=0 fi @@ -7193,7 +7204,7 @@ #include #endif " -if test "x$ac_cv_type_uintptr_t" = xyes; then : +if test "x$ac_cv_type_uintptr_t" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -7205,7 +7216,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t" >&5 $as_echo_n "checking size of uintptr_t... " >&6; } -if ${ac_cv_sizeof_uintptr_t+:} false; then : +if test "${ac_cv_sizeof_uintptr_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))" "ac_cv_sizeof_uintptr_t" "$ac_includes_default"; then : @@ -7215,7 +7226,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (uintptr_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_uintptr_t=0 fi @@ -7241,7 +7252,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 $as_echo_n "checking size of off_t... " >&6; } -if ${ac_cv_sizeof_off_t+:} false; then : +if test "${ac_cv_sizeof_off_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" " @@ -7256,7 +7267,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_off_t=0 fi @@ -7300,7 +7311,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 $as_echo_n "checking size of time_t... " >&6; } -if ${ac_cv_sizeof_time_t+:} false; then : +if test "${ac_cv_sizeof_time_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" " @@ -7318,7 +7329,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (time_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_time_t=0 fi @@ -7375,7 +7386,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5 $as_echo_n "checking size of pthread_t... " >&6; } -if ${ac_cv_sizeof_pthread_t+:} false; then : +if test "${ac_cv_sizeof_pthread_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" " @@ -7390,7 +7401,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pthread_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_pthread_t=0 fi @@ -7821,7 +7832,7 @@ # checks for libraries { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in -lsendfile" >&5 $as_echo_n "checking for sendfile in -lsendfile... " >&6; } -if ${ac_cv_lib_sendfile_sendfile+:} false; then : +if test "${ac_cv_lib_sendfile_sendfile+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7855,7 +7866,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sendfile_sendfile" >&5 $as_echo "$ac_cv_lib_sendfile_sendfile" >&6; } -if test "x$ac_cv_lib_sendfile_sendfile" = xyes; then : +if test "x$ac_cv_lib_sendfile_sendfile" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSENDFILE 1 _ACEOF @@ -7866,7 +7877,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if ${ac_cv_lib_dl_dlopen+:} false; then : +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7900,7 +7911,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = xyes; then : +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF @@ -7911,7 +7922,7 @@ # Dynamic linking for SunOS/Solaris and SYSV { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } -if ${ac_cv_lib_dld_shl_load+:} false; then : +if test "${ac_cv_lib_dld_shl_load+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7945,7 +7956,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = xyes; then : +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF @@ -7959,7 +7970,7 @@ if test "$with_threads" = "yes" -o -z "$with_threads"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_init" >&5 $as_echo_n "checking for library containing sem_init... " >&6; } -if ${ac_cv_search_sem_init+:} false; then : +if test "${ac_cv_search_sem_init+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -7993,11 +8004,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if ${ac_cv_search_sem_init+:} false; then : + if test "${ac_cv_search_sem_init+set}" = set; then : break fi done -if ${ac_cv_search_sem_init+:} false; then : +if test "${ac_cv_search_sem_init+set}" = set; then : else ac_cv_search_sem_init=no @@ -8020,7 +8031,7 @@ # check if we need libintl for locale functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl" >&5 $as_echo_n "checking for textdomain in -lintl... " >&6; } -if ${ac_cv_lib_intl_textdomain+:} false; then : +if test "${ac_cv_lib_intl_textdomain+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8054,7 +8065,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain" >&5 $as_echo "$ac_cv_lib_intl_textdomain" >&6; } -if test "x$ac_cv_lib_intl_textdomain" = xyes; then : +if test "x$ac_cv_lib_intl_textdomain" = x""yes; then : $as_echo "#define WITH_LIBINTL 1" >>confdefs.h @@ -8101,7 +8112,7 @@ # Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl" >&5 $as_echo_n "checking for t_open in -lnsl... " >&6; } -if ${ac_cv_lib_nsl_t_open+:} false; then : +if test "${ac_cv_lib_nsl_t_open+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8135,13 +8146,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open" >&5 $as_echo "$ac_cv_lib_nsl_t_open" >&6; } -if test "x$ac_cv_lib_nsl_t_open" = xyes; then : +if test "x$ac_cv_lib_nsl_t_open" = x""yes; then : LIBS="-lnsl $LIBS" fi # SVR4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } -if ${ac_cv_lib_socket_socket+:} false; then : +if test "${ac_cv_lib_socket_socket+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8175,7 +8186,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } -if test "x$ac_cv_lib_socket_socket" = xyes; then : +if test "x$ac_cv_lib_socket_socket" = x""yes; then : LIBS="-lsocket $LIBS" fi # SVR4 sockets @@ -8201,7 +8212,7 @@ set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PKG_CONFIG+:} false; then : +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in @@ -8244,7 +8255,7 @@ set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in @@ -8540,7 +8551,7 @@ LIBS=$_libs ac_fn_c_check_func "$LINENO" "pthread_detach" "ac_cv_func_pthread_detach" -if test "x$ac_cv_func_pthread_detach" = xyes; then : +if test "x$ac_cv_func_pthread_detach" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8549,7 +8560,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthreads" >&5 $as_echo_n "checking for pthread_create in -lpthreads... " >&6; } -if ${ac_cv_lib_pthreads_pthread_create+:} false; then : +if test "${ac_cv_lib_pthreads_pthread_create+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8583,7 +8594,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_create" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_create" >&6; } -if test "x$ac_cv_lib_pthreads_pthread_create" = xyes; then : +if test "x$ac_cv_lib_pthreads_pthread_create" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8593,7 +8604,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 $as_echo_n "checking for pthread_create in -lc_r... " >&6; } -if ${ac_cv_lib_c_r_pthread_create+:} false; then : +if test "${ac_cv_lib_c_r_pthread_create+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8627,7 +8638,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } -if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : +if test "x$ac_cv_lib_c_r_pthread_create" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8637,7 +8648,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system in -lpthread" >&5 $as_echo_n "checking for __pthread_create_system in -lpthread... " >&6; } -if ${ac_cv_lib_pthread___pthread_create_system+:} false; then : +if test "${ac_cv_lib_pthread___pthread_create_system+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8671,7 +8682,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_create_system" >&5 $as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; } -if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes; then : +if test "x$ac_cv_lib_pthread___pthread_create_system" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8681,7 +8692,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lcma" >&5 $as_echo_n "checking for pthread_create in -lcma... " >&6; } -if ${ac_cv_lib_cma_pthread_create+:} false; then : +if test "${ac_cv_lib_cma_pthread_create+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8715,7 +8726,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cma_pthread_create" >&5 $as_echo "$ac_cv_lib_cma_pthread_create" >&6; } -if test "x$ac_cv_lib_cma_pthread_create" = xyes; then : +if test "x$ac_cv_lib_cma_pthread_create" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8741,7 +8752,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc" >&5 $as_echo_n "checking for usconfig in -lmpc... " >&6; } -if ${ac_cv_lib_mpc_usconfig+:} false; then : +if test "${ac_cv_lib_mpc_usconfig+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8775,7 +8786,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig" >&5 $as_echo "$ac_cv_lib_mpc_usconfig" >&6; } -if test "x$ac_cv_lib_mpc_usconfig" = xyes; then : +if test "x$ac_cv_lib_mpc_usconfig" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h LIBS="$LIBS -lmpc" @@ -8787,7 +8798,7 @@ if test "$posix_threads" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thr_create in -lthread" >&5 $as_echo_n "checking for thr_create in -lthread... " >&6; } -if ${ac_cv_lib_thread_thr_create+:} false; then : +if test "${ac_cv_lib_thread_thr_create+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8821,7 +8832,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thread_thr_create" >&5 $as_echo "$ac_cv_lib_thread_thr_create" >&6; } -if test "x$ac_cv_lib_thread_thr_create" = xyes; then : +if test "x$ac_cv_lib_thread_thr_create" = x""yes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h LIBS="$LIBS -lthread" @@ -8857,7 +8868,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is supported" >&5 $as_echo_n "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; } - if ${ac_cv_pthread_system_supported+:} false; then : + if test "${ac_cv_pthread_system_supported+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -8900,7 +8911,7 @@ for ac_func in pthread_sigmask do : ac_fn_c_check_func "$LINENO" "pthread_sigmask" "ac_cv_func_pthread_sigmask" -if test "x$ac_cv_func_pthread_sigmask" = xyes; then : +if test "x$ac_cv_func_pthread_sigmask" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_SIGMASK 1 _ACEOF @@ -9292,7 +9303,7 @@ $as_echo "$with_valgrind" >&6; } if test "$with_valgrind" != no; then ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default" -if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then : +if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then : $as_echo "#define WITH_VALGRIND 1" >>confdefs.h @@ -9314,7 +9325,7 @@ for ac_func in dlopen do : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = xyes; then : +if test "x$ac_cv_func_dlopen" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLOPEN 1 _ACEOF @@ -9648,7 +9659,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock declaration" >&5 $as_echo_n "checking for flock declaration... " >&6; } -if ${ac_cv_flock_decl+:} false; then : +if test "${ac_cv_flock_decl+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -9678,7 +9689,7 @@ for ac_func in flock do : ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" -if test "x$ac_cv_func_flock" = xyes; then : +if test "x$ac_cv_func_flock" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FLOCK 1 _ACEOF @@ -9686,7 +9697,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd" >&5 $as_echo_n "checking for flock in -lbsd... " >&6; } -if ${ac_cv_lib_bsd_flock+:} false; then : +if test "${ac_cv_lib_bsd_flock+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9720,7 +9731,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock" >&5 $as_echo "$ac_cv_lib_bsd_flock" >&6; } -if test "x$ac_cv_lib_bsd_flock" = xyes; then : +if test "x$ac_cv_lib_bsd_flock" = x""yes; then : $as_echo "#define HAVE_FLOCK 1" >>confdefs.h @@ -9797,7 +9808,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_TRUE+:} false; then : +if test "${ac_cv_prog_TRUE+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$TRUE"; then @@ -9837,7 +9848,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc" >&5 $as_echo_n "checking for inet_aton in -lc... " >&6; } -if ${ac_cv_lib_c_inet_aton+:} false; then : +if test "${ac_cv_lib_c_inet_aton+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9871,12 +9882,12 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton" >&5 $as_echo "$ac_cv_lib_c_inet_aton" >&6; } -if test "x$ac_cv_lib_c_inet_aton" = xyes; then : +if test "x$ac_cv_lib_c_inet_aton" = x""yes; then : $ac_cv_prog_TRUE else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5 $as_echo_n "checking for inet_aton in -lresolv... " >&6; } -if ${ac_cv_lib_resolv_inet_aton+:} false; then : +if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9910,7 +9921,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5 $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; } -if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then : +if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRESOLV 1 _ACEOF @@ -9927,7 +9938,7 @@ # exit Python { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5 $as_echo_n "checking for chflags... " >&6; } -if ${ac_cv_have_chflags+:} false; then : +if test "${ac_cv_have_chflags+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -9961,7 +9972,7 @@ $as_echo "$ac_cv_have_chflags" >&6; } if test "$ac_cv_have_chflags" = cross ; then ac_fn_c_check_func "$LINENO" "chflags" "ac_cv_func_chflags" -if test "x$ac_cv_func_chflags" = xyes; then : +if test "x$ac_cv_func_chflags" = x""yes; then : ac_cv_have_chflags="yes" else ac_cv_have_chflags="no" @@ -9976,7 +9987,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5 $as_echo_n "checking for lchflags... " >&6; } -if ${ac_cv_have_lchflags+:} false; then : +if test "${ac_cv_have_lchflags+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -10010,7 +10021,7 @@ $as_echo "$ac_cv_have_lchflags" >&6; } if test "$ac_cv_have_lchflags" = cross ; then ac_fn_c_check_func "$LINENO" "lchflags" "ac_cv_func_lchflags" -if test "x$ac_cv_func_lchflags" = xyes; then : +if test "x$ac_cv_func_lchflags" = x""yes; then : ac_cv_have_lchflags="yes" else ac_cv_have_lchflags="no" @@ -10034,7 +10045,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz" >&5 $as_echo_n "checking for inflateCopy in -lz... " >&6; } -if ${ac_cv_lib_z_inflateCopy+:} false; then : +if test "${ac_cv_lib_z_inflateCopy+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10068,7 +10079,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy" >&5 $as_echo "$ac_cv_lib_z_inflateCopy" >&6; } -if test "x$ac_cv_lib_z_inflateCopy" = xyes; then : +if test "x$ac_cv_lib_z_inflateCopy" = x""yes; then : $as_echo "#define HAVE_ZLIB_COPY 1" >>confdefs.h @@ -10211,7 +10222,7 @@ for ac_func in openpty do : ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" -if test "x$ac_cv_func_openpty" = xyes; then : +if test "x$ac_cv_func_openpty" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENPTY 1 _ACEOF @@ -10219,7 +10230,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 $as_echo_n "checking for openpty in -lutil... " >&6; } -if ${ac_cv_lib_util_openpty+:} false; then : +if test "${ac_cv_lib_util_openpty+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10253,13 +10264,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 $as_echo "$ac_cv_lib_util_openpty" >&6; } -if test "x$ac_cv_lib_util_openpty" = xyes; then : +if test "x$ac_cv_lib_util_openpty" = x""yes; then : $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h LIBS="$LIBS -lutil" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lbsd" >&5 $as_echo_n "checking for openpty in -lbsd... " >&6; } -if ${ac_cv_lib_bsd_openpty+:} false; then : +if test "${ac_cv_lib_bsd_openpty+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10293,7 +10304,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty" >&5 $as_echo "$ac_cv_lib_bsd_openpty" >&6; } -if test "x$ac_cv_lib_bsd_openpty" = xyes; then : +if test "x$ac_cv_lib_bsd_openpty" = x""yes; then : $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h LIBS="$LIBS -lbsd" fi @@ -10308,7 +10319,7 @@ for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" -if test "x$ac_cv_func_forkpty" = xyes; then : +if test "x$ac_cv_func_forkpty" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF @@ -10316,7 +10327,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5 $as_echo_n "checking for forkpty in -lutil... " >&6; } -if ${ac_cv_lib_util_forkpty+:} false; then : +if test "${ac_cv_lib_util_forkpty+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10350,13 +10361,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5 $as_echo "$ac_cv_lib_util_forkpty" >&6; } -if test "x$ac_cv_lib_util_forkpty" = xyes; then : +if test "x$ac_cv_lib_util_forkpty" = x""yes; then : $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h LIBS="$LIBS -lutil" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lbsd" >&5 $as_echo_n "checking for forkpty in -lbsd... " >&6; } -if ${ac_cv_lib_bsd_forkpty+:} false; then : +if test "${ac_cv_lib_bsd_forkpty+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10390,7 +10401,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty" >&5 $as_echo "$ac_cv_lib_bsd_forkpty" >&6; } -if test "x$ac_cv_lib_bsd_forkpty" = xyes; then : +if test "x$ac_cv_lib_bsd_forkpty" = x""yes; then : $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h LIBS="$LIBS -lbsd" fi @@ -10407,7 +10418,7 @@ for ac_func in memmove do : ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" -if test "x$ac_cv_func_memmove" = xyes; then : +if test "x$ac_cv_func_memmove" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMMOVE 1 _ACEOF @@ -10431,7 +10442,7 @@ ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2" -if test "x$ac_cv_func_dup2" = xyes; then : +if test "x$ac_cv_func_dup2" = x""yes; then : $as_echo "#define HAVE_DUP2 1" >>confdefs.h else @@ -10444,7 +10455,7 @@ fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = xyes; then : +if test "x$ac_cv_func_getcwd" = x""yes; then : $as_echo "#define HAVE_GETCWD 1" >>confdefs.h else @@ -10457,7 +10468,7 @@ fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" -if test "x$ac_cv_func_strdup" = xyes; then : +if test "x$ac_cv_func_strdup" = x""yes; then : $as_echo "#define HAVE_STRDUP 1" >>confdefs.h else @@ -10473,7 +10484,7 @@ for ac_func in getpgrp do : ac_fn_c_check_func "$LINENO" "getpgrp" "ac_cv_func_getpgrp" -if test "x$ac_cv_func_getpgrp" = xyes; then : +if test "x$ac_cv_func_getpgrp" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPGRP 1 _ACEOF @@ -10501,7 +10512,7 @@ for ac_func in setpgrp do : ac_fn_c_check_func "$LINENO" "setpgrp" "ac_cv_func_setpgrp" -if test "x$ac_cv_func_setpgrp" = xyes; then : +if test "x$ac_cv_func_setpgrp" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETPGRP 1 _ACEOF @@ -10529,7 +10540,7 @@ for ac_func in gettimeofday do : ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = xyes; then : +if test "x$ac_cv_func_gettimeofday" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETTIMEOFDAY 1 _ACEOF @@ -10631,7 +10642,7 @@ then { $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug" >&5 $as_echo_n "checking getaddrinfo bug... " >&6; } - if ${ac_cv_buggy_getaddrinfo+:} false; then : + if test "${ac_cv_buggy_getaddrinfo+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -10760,7 +10771,7 @@ for ac_func in getnameinfo do : ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" -if test "x$ac_cv_func_getnameinfo" = xyes; then : +if test "x$ac_cv_func_getnameinfo" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETNAMEINFO 1 _ACEOF @@ -10772,7 +10783,7 @@ # checks for structures { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if ${ac_cv_header_time+:} false; then : +if test "${ac_cv_header_time+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10807,7 +10818,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if ${ac_cv_struct_tm+:} false; then : +if test "${ac_cv_struct_tm+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10844,7 +10855,7 @@ #include <$ac_cv_struct_tm> " -if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : +if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 @@ -10860,7 +10871,7 @@ else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " -if test "x$ac_cv_have_decl_tzname" = xyes; then : +if test "x$ac_cv_have_decl_tzname" = x""yes; then : ac_have_decl=1 else ac_have_decl=0 @@ -10872,7 +10883,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } -if ${ac_cv_var_tzname+:} false; then : +if test "${ac_cv_var_tzname+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10908,7 +10919,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_struct_stat_st_rdev" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_rdev" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_RDEV 1 @@ -10918,7 +10929,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 @@ -10928,7 +10939,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_flags" "ac_cv_member_struct_stat_st_flags" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_flags" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_flags" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_FLAGS 1 @@ -10938,7 +10949,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_gen" "ac_cv_member_struct_stat_st_gen" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_gen" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_gen" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_GEN 1 @@ -10948,7 +10959,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_birthtime" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 @@ -10958,7 +10969,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then : +if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLOCKS 1 @@ -10980,7 +10991,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5 $as_echo_n "checking for time.h that defines altzone... " >&6; } -if ${ac_cv_header_time_altzone+:} false; then : +if test "${ac_cv_header_time_altzone+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -11044,7 +11055,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5 $as_echo_n "checking for addrinfo... " >&6; } -if ${ac_cv_struct_addrinfo+:} false; then : +if test "${ac_cv_struct_addrinfo+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11076,7 +11087,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage" >&5 $as_echo_n "checking for sockaddr_storage... " >&6; } -if ${ac_cv_struct_sockaddr_storage+:} false; then : +if test "${ac_cv_struct_sockaddr_storage+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11112,7 +11123,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 $as_echo_n "checking whether char is unsigned... " >&6; } -if ${ac_cv_c_char_unsigned+:} false; then : +if test "${ac_cv_c_char_unsigned+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11144,7 +11155,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if ${ac_cv_c_const+:} false; then : +if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11432,7 +11443,7 @@ ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" -if test "x$ac_cv_func_gethostbyname_r" = xyes; then : +if test "x$ac_cv_func_gethostbyname_r" = x""yes; then : $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h @@ -11563,7 +11574,7 @@ for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = xyes; then : +if test "x$ac_cv_func_gethostbyname" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF @@ -11585,12 +11596,12 @@ # Linux requires this for correct f.p. operations ac_fn_c_check_func "$LINENO" "__fpu_control" "ac_cv_func___fpu_control" -if test "x$ac_cv_func___fpu_control" = xyes; then : +if test "x$ac_cv_func___fpu_control" = x""yes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpu_control in -lieee" >&5 $as_echo_n "checking for __fpu_control in -lieee... " >&6; } -if ${ac_cv_lib_ieee___fpu_control+:} false; then : +if test "${ac_cv_lib_ieee___fpu_control+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -11624,7 +11635,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee___fpu_control" >&5 $as_echo "$ac_cv_lib_ieee___fpu_control" >&6; } -if test "x$ac_cv_lib_ieee___fpu_control" = xyes; then : +if test "x$ac_cv_lib_ieee___fpu_control" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBIEEE 1 _ACEOF @@ -11718,7 +11729,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are little-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are little-endian IEEE 754 binary64... " >&6; } -if ${ac_cv_little_endian_double+:} false; then : +if test "${ac_cv_little_endian_double+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -11760,7 +11771,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are big-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are big-endian IEEE 754 binary64... " >&6; } -if ${ac_cv_big_endian_double+:} false; then : +if test "${ac_cv_big_endian_double+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -11806,7 +11817,7 @@ # conversions work. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are ARM mixed-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are ARM mixed-endian IEEE 754 binary64... " >&6; } -if ${ac_cv_mixed_endian_double+:} false; then : +if test "${ac_cv_mixed_endian_double+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -11976,7 +11987,7 @@ ac_fn_c_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include " -if test "x$ac_cv_have_decl_isinf" = xyes; then : +if test "x$ac_cv_have_decl_isinf" = x""yes; then : ac_have_decl=1 else ac_have_decl=0 @@ -11987,7 +11998,7 @@ _ACEOF ac_fn_c_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "#include " -if test "x$ac_cv_have_decl_isnan" = xyes; then : +if test "x$ac_cv_have_decl_isnan" = x""yes; then : ac_have_decl=1 else ac_have_decl=0 @@ -11998,7 +12009,7 @@ _ACEOF ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " -if test "x$ac_cv_have_decl_isfinite" = xyes; then : +if test "x$ac_cv_have_decl_isfinite" = x""yes; then : ac_have_decl=1 else ac_have_decl=0 @@ -12013,7 +12024,7 @@ # -0. on some architectures. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tanh preserves the sign of zero" >&5 $as_echo_n "checking whether tanh preserves the sign of zero... " >&6; } -if ${ac_cv_tanh_preserves_zero_sign+:} false; then : +if test "${ac_cv_tanh_preserves_zero_sign+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -12061,7 +12072,7 @@ # -0. See issue #9920. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether log1p drops the sign of negative zero" >&5 $as_echo_n "checking whether log1p drops the sign of negative zero... " >&6; } - if ${ac_cv_log1p_drops_zero_sign+:} false; then : + if test "${ac_cv_log1p_drops_zero_sign+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -12113,7 +12124,7 @@ # sem_open results in a 'Signal 12' error. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are enabled" >&5 $as_echo_n "checking whether POSIX semaphores are enabled... " >&6; } -if ${ac_cv_posix_semaphores_enabled+:} false; then : +if test "${ac_cv_posix_semaphores_enabled+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -12164,7 +12175,7 @@ # Multiprocessing check for broken sem_getvalue { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue" >&5 $as_echo_n "checking for broken sem_getvalue... " >&6; } -if ${ac_cv_broken_sem_getvalue+:} false; then : +if test "${ac_cv_broken_sem_getvalue+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -12229,7 +12240,7 @@ 15|30) ;; *) - as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value should be 15 or 30" "$LINENO" 5 ;; + as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value should be 15 or 30" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits" >&5 $as_echo "$enable_big_digits" >&6; } @@ -12247,7 +12258,7 @@ # check for wchar.h ac_fn_c_check_header_mongrel "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" -if test "x$ac_cv_header_wchar_h" = xyes; then : +if test "x$ac_cv_header_wchar_h" = x""yes; then : $as_echo "#define HAVE_WCHAR_H 1" >>confdefs.h @@ -12270,7 +12281,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 $as_echo_n "checking size of wchar_t... " >&6; } -if ${ac_cv_sizeof_wchar_t+:} false; then : +if test "${ac_cv_sizeof_wchar_t+set}" = set; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "#include @@ -12281,7 +12292,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (wchar_t) -See \`config.log' for more details" "$LINENO" 5; } +See \`config.log' for more details" "$LINENO" 5 ; } else ac_cv_sizeof_wchar_t=0 fi @@ -12336,7 +12347,7 @@ # check whether wchar_t is signed or not { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed" >&5 $as_echo_n "checking whether wchar_t is signed... " >&6; } - if ${ac_cv_wchar_t_signed+:} false; then : + if test "${ac_cv_wchar_t_signed+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -12386,7 +12397,7 @@ # check for endianness { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if ${ac_cv_c_bigendian+:} false; then : +if test "${ac_cv_c_bigendian+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown @@ -12605,7 +12616,7 @@ ;; #( *) as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac @@ -12677,7 +12688,7 @@ # or fills with zeros (like the Cray J90, according to Tim Peters). { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the sign bit" >&5 $as_echo_n "checking whether right shift extends the sign bit... " >&6; } -if ${ac_cv_rshift_extends_sign+:} false; then : +if test "${ac_cv_rshift_extends_sign+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -12716,7 +12727,7 @@ # check for getc_unlocked and related locking functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and friends" >&5 $as_echo_n "checking for getc_unlocked() and friends... " >&6; } -if ${ac_cv_have_getc_unlocked+:} false; then : +if test "${ac_cv_have_getc_unlocked+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -12814,7 +12825,7 @@ # check for readline 2.1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_callback_handler_install in -lreadline" >&5 $as_echo_n "checking for rl_callback_handler_install in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_callback_handler_install+:} false; then : +if test "${ac_cv_lib_readline_rl_callback_handler_install+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12848,7 +12859,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_callback_handler_install" >&5 $as_echo "$ac_cv_lib_readline_rl_callback_handler_install" >&6; } -if test "x$ac_cv_lib_readline_rl_callback_handler_install" = xyes; then : +if test "x$ac_cv_lib_readline_rl_callback_handler_install" = x""yes; then : $as_echo "#define HAVE_RL_CALLBACK 1" >>confdefs.h @@ -12900,7 +12911,7 @@ # check for readline 4.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -lreadline" >&5 $as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then : +if test "${ac_cv_lib_readline_rl_pre_input_hook+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12934,7 +12945,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_pre_input_hook" >&5 $as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then : +if test "x$ac_cv_lib_readline_rl_pre_input_hook" = x""yes; then : $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h @@ -12944,7 +12955,7 @@ # also in 4.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -lreadline" >&5 $as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then : +if test "${ac_cv_lib_readline_rl_completion_display_matches_hook+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12978,7 +12989,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_display_matches_hook" >&5 $as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then : +if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = x""yes; then : $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h @@ -12988,7 +12999,7 @@ # check for readline 4.2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } -if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : +if test "${ac_cv_lib_readline_rl_completion_matches+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13022,7 +13033,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 $as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then : +if test "x$ac_cv_lib_readline_rl_completion_matches" = x""yes; then : $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h @@ -13063,7 +13074,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken nice()" >&5 $as_echo_n "checking for broken nice()... " >&6; } -if ${ac_cv_broken_nice+:} false; then : +if test "${ac_cv_broken_nice+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -13104,7 +13115,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll()" >&5 $as_echo_n "checking for broken poll()... " >&6; } -if ${ac_cv_broken_poll+:} false; then : +if test "${ac_cv_broken_poll+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13159,7 +13170,7 @@ #include <$ac_cv_struct_tm> " -if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : +if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 @@ -13175,7 +13186,7 @@ else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " -if test "x$ac_cv_have_decl_tzname" = xyes; then : +if test "x$ac_cv_have_decl_tzname" = x""yes; then : ac_have_decl=1 else ac_have_decl=0 @@ -13187,7 +13198,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } -if ${ac_cv_var_tzname+:} false; then : +if test "${ac_cv_var_tzname+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13226,7 +13237,7 @@ # check tzset(3) exists and works like we expect it to { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working tzset()" >&5 $as_echo_n "checking for working tzset()... " >&6; } -if ${ac_cv_working_tzset+:} false; then : +if test "${ac_cv_working_tzset+set}" = set; then : $as_echo_n "(cached) " >&6 else @@ -13323,7 +13334,7 @@ # Look for subsecond timestamps in struct stat { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat" >&5 $as_echo_n "checking for tv_nsec in struct stat... " >&6; } -if ${ac_cv_stat_tv_nsec+:} false; then : +if test "${ac_cv_stat_tv_nsec+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13360,7 +13371,7 @@ # Look for BSD style subsecond timestamps in struct stat { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat" >&5 $as_echo_n "checking for tv_nsec2 in struct stat... " >&6; } -if ${ac_cv_stat_tv_nsec2+:} false; then : +if test "${ac_cv_stat_tv_nsec2+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13397,7 +13408,7 @@ # On HP/UX 11.0, mvwdelch is a block with a return statement { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an expression" >&5 $as_echo_n "checking whether mvwdelch is an expression... " >&6; } -if ${ac_cv_mvwdelch_is_expression+:} false; then : +if test "${ac_cv_mvwdelch_is_expression+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13434,7 +13445,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags" >&5 $as_echo_n "checking whether WINDOW has _flags... " >&6; } -if ${ac_cv_window_has_flags+:} false; then : +if test "${ac_cv_window_has_flags+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13582,7 +13593,7 @@ then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %lld and %llu printf() format support" >&5 $as_echo_n "checking for %lld and %llu printf() format support... " >&6; } - if ${ac_cv_have_long_long_format+:} false; then : + if test "${ac_cv_have_long_long_format+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13652,7 +13663,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format support" >&5 $as_echo_n "checking for %zd printf() format support... " >&6; } -if ${ac_cv_have_size_t_format+:} false; then : +if test "${ac_cv_have_size_t_format+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13725,7 +13736,7 @@ #endif " -if test "x$ac_cv_type_socklen_t" = xyes; then : +if test "x$ac_cv_type_socklen_t" = x""yes; then : else @@ -13736,7 +13747,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs" >&5 $as_echo_n "checking for broken mbstowcs... " >&6; } -if ${ac_cv_broken_mbstowcs+:} false; then : +if test "${ac_cv_broken_mbstowcs+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13776,7 +13787,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed gotos" >&5 $as_echo_n "checking whether $CC supports computed gotos... " >&6; } -if ${ac_cv_computed_gotos+:} false; then : +if test "${ac_cv_computed_gotos+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13943,21 +13954,10 @@ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then + test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi + cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} @@ -13990,7 +13990,7 @@ -: "${CONFIG_STATUS=./config.status}" +: ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" @@ -14091,7 +14091,6 @@ IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. -as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14399,7 +14398,7 @@ # values after options handling. ac_log=" This file was extended by python $as_me 3.3, which was -generated by GNU Autoconf 2.68. Invocation command line was +generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -14461,7 +14460,7 @@ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ python config.status 3.3 -configured by $0, generated by GNU Autoconf 2.68, +configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. @@ -14592,7 +14591,7 @@ "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;; "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES Modules/ld_so_aix" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; esac done @@ -14614,10 +14613,9 @@ # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= ac_tmp= + tmp= trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } @@ -14625,13 +14623,12 @@ { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" + test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -14653,7 +14650,7 @@ ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF @@ -14681,7 +14678,7 @@ rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -14729,7 +14726,7 @@ rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && +cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -14761,7 +14758,7 @@ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF @@ -14795,7 +14792,7 @@ # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$ac_tmp/defines.awk" <<\_ACAWK || +cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -14807,8 +14804,8 @@ # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_tt=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_tt"; then + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 @@ -14909,7 +14906,7 @@ esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -14928,7 +14925,7 @@ for ac_f do case $ac_f in - -) ac_f="$ac_tmp/stdin";; + -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -14937,7 +14934,7 @@ [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -14963,8 +14960,8 @@ esac case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -15094,22 +15091,21 @@ s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$ac_tmp/stdin" + rm -f "$tmp/stdin" case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; @@ -15120,20 +15116,20 @@ if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" - } >"$ac_tmp/config.h" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$ac_tmp/config.h" "$ac_file" \ + mv "$tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -1376,6 +1376,13 @@ #endif ]) +# On Linux, can.h and can/raw.h require sys/socket.h +AC_CHECK_HEADERS(linux/can.h linux/can/raw.h,,,[ +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +]) + # checks for typedefs was_it_defined=no AC_MSG_CHECKING(for clock_t in time.h) diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -467,6 +467,12 @@ /* Define to 1 if you have the `linkat' function. */ #undef HAVE_LINKAT +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_CAN_RAW_H + /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_NETLINK_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 20:28:01 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 06 Oct 2011 20:28:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310141=3A_Don=27t_u?= =?utf8?q?se_hardcoded_frame_size_in_example=2C_use_struct=2Ecalcsize=28?= =?utf8?q?=29?= Message-ID: http://hg.python.org/cpython/rev/a4af684bb54e changeset: 72759:a4af684bb54e user: Victor Stinner date: Thu Oct 06 20:27:20 2011 +0200 summary: Issue #10141: Don't use hardcoded frame size in example, use struct.calcsize() files: Doc/library/socket.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1270,6 +1270,7 @@ # CAN frame packing/unpacking (see `struct can_frame` in ) can_frame_fmt = "=IB3x8s" + can_frame_size = struct.calcsize(can_frame_fmt) def build_can_frame(can_id, data): can_dlc = len(data) @@ -1286,7 +1287,7 @@ s.bind(('vcan0',)) while True: - cf, addr = s.recvfrom(16) + cf, addr = s.recvfrom(can_frame_size) print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 21:50:02 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 21:50:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_the_expected_memory_con?= =?utf8?q?sumption_for_some_tests?= Message-ID: http://hg.python.org/cpython/rev/55c313924d63 changeset: 72760:55c313924d63 user: Antoine Pitrou date: Thu Oct 06 21:46:23 2011 +0200 summary: Fix the expected memory consumption for some tests files: Lib/test/test_bigmem.py | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -615,26 +615,28 @@ for name, memuse in self._adjusted.items(): getattr(type(self), name).memuse = memuse - # the utf8 encoder preallocates big time (4x the number of characters) - @bigmemtest(size=_2G + 2, memuse=ascii_char_size + 4) + # Many codecs convert to the legacy representation first, explaining + # why we add 'ucs4_char_size' to the 'memuse' below. + + @bigmemtest(size=_2G + 2, memuse=ascii_char_size + 1) def test_encode(self, size): return self.basic_encode_test(size, 'utf-8') - @bigmemtest(size=_4G // 6 + 2, memuse=ascii_char_size + 1) + @bigmemtest(size=_4G // 6 + 2, memuse=ascii_char_size + ucs4_char_size + 1) def test_encode_raw_unicode_escape(self, size): try: return self.basic_encode_test(size, 'raw_unicode_escape') except MemoryError: pass # acceptable on 32-bit - @bigmemtest(size=_4G // 5 + 70, memuse=ascii_char_size + 1) + @bigmemtest(size=_4G // 5 + 70, memuse=ascii_char_size + ucs4_char_size + 1) def test_encode_utf7(self, size): try: return self.basic_encode_test(size, 'utf7') except MemoryError: pass # acceptable on 32-bit - @bigmemtest(size=_4G // 4 + 5, memuse=ascii_char_size + 4) + @bigmemtest(size=_4G // 4 + 5, memuse=ascii_char_size + ucs4_char_size + 4) def test_encode_utf32(self, size): try: return self.basic_encode_test(size, 'utf32', expectedsize=4 * size + 4) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 21:59:28 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 21:59:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_size_estimation_for_tes?= =?utf8?q?t=5Fbigmem=2EStrTest=2Etest=5Fformat?= Message-ID: http://hg.python.org/cpython/rev/4e0b570ac8a3 changeset: 72761:4e0b570ac8a3 user: Antoine Pitrou date: Thu Oct 06 21:55:51 2011 +0200 summary: Fix size estimation for test_bigmem.StrTest.test_format files: Lib/test/test_bigmem.py | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -647,7 +647,9 @@ def test_encode_ascii(self, size): return self.basic_encode_test(size, 'ascii', c='A') - @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2) + # str % (...) uses a Py_UCS4 intermediate representation + + @bigmemtest(size=_2G + 10, memuse=ascii_char_size * 2 + ucs4_char_size) def test_format(self, size): s = '-' * size sf = '%s' % (s,) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 22:13:02 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 22:13:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Ensure_that_1-char_singleto?= =?utf8?q?ns_get_used?= Message-ID: http://hg.python.org/cpython/rev/d3d7ec004af0 changeset: 72762:d3d7ec004af0 user: Antoine Pitrou date: Thu Oct 06 22:07:51 2011 +0200 summary: Ensure that 1-char singletons get used files: Objects/unicodeobject.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1622,6 +1622,8 @@ assert(*p < 128); } #endif + if (size == 1) + return get_latin1_char(s[0]); res = PyUnicode_New(size, 127); if (!res) return NULL; @@ -1653,6 +1655,8 @@ Py_ssize_t i; assert(size >= 0); + if (size == 1) + return get_latin1_char(u[0]); for (i = 0; i < size; i++) { if (u[i] & 0x80) { max_char = 255; @@ -1675,6 +1679,8 @@ Py_ssize_t i; assert(size >= 0); + if (size == 1 && u[0] < 256) + return get_latin1_char(u[0]); for (i = 0; i < size; i++) { if (u[i] > max_char) { max_char = u[i]; @@ -1702,6 +1708,8 @@ Py_ssize_t i; assert(size >= 0); + if (size == 1 && u[0] < 256) + return get_latin1_char(u[0]); for (i = 0; i < size; i++) { if (u[i] > max_char) { max_char = u[i]; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 22:13:03 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 22:13:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_the_formula_for_this_e?= =?utf8?q?stimate_more_explicit?= Message-ID: http://hg.python.org/cpython/rev/e795ab617914 changeset: 72763:e795ab617914 user: Antoine Pitrou date: Thu Oct 06 22:09:18 2011 +0200 summary: Make the formula for this estimate more explicit files: Lib/test/test_bigmem.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -374,7 +374,7 @@ # suffer for the list size. (Otherwise, it'd cost another 48 times # size in bytes!) Nevertheless, a list of size takes # 8*size bytes. - @bigmemtest(size=_2G + 5, memuse=10) + @bigmemtest(size=_2G + 5, memuse=2 * ascii_char_size + 8) def test_split_large(self, size): _ = self.from_latin1 s = _(' a') * size + _(' ') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 22:35:43 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 22:35:43 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Replace_tabs_with_spaces_i?= =?utf8?q?n_compiler=2Erst_to_satisfy_the_checkwhitespace_hook=2E?= Message-ID: http://hg.python.org/devguide/rev/ddcf4a0ece4e changeset: 454:ddcf4a0ece4e user: Ned Deily date: Thu Oct 06 13:32:42 2011 -0700 summary: Replace tabs with spaces in compiler.rst to satisfy the checkwhitespace hook. files: compiler.rst | 60 ++++++++++++++++++++-------------------- 1 files changed, 30 insertions(+), 30 deletions(-) diff --git a/compiler.rst b/compiler.rst --- a/compiler.rst +++ b/compiler.rst @@ -48,22 +48,22 @@ macros (which are all defined in Include/token.h): ``CHILD(node *, int)`` - Returns the nth child of the node using zero-offset indexing + Returns the nth child of the node using zero-offset indexing ``RCHILD(node *, int)`` - Returns the nth child of the node from the right side; use - negative numbers! + Returns the nth child of the node from the right side; use + negative numbers! ``NCH(node *)`` - Number of children the node has + Number of children the node has ``STR(node *)`` - String representation of the node; e.g., will return ``:`` for a - COLON token + String representation of the node; e.g., will return ``:`` for a + COLON token ``TYPE(node *)`` - The type of node as specified in ``Include/graminit.h`` + The type of node as specified in ``Include/graminit.h`` ``REQ(node *, TYPE)`` - Assert that the node is the type that is expected + Assert that the node is the type that is expected ``LINENO(node *)`` - retrieve the line number of the source code that led to the - creation of the parse rule; defined in Python/ast.c + retrieve the line number of the source code that led to the + creation of the parse rule; defined in Python/ast.c To tie all of this example, consider the rule for 'while':: @@ -99,10 +99,10 @@ module Python { - stmt = FunctionDef(identifier name, arguments args, stmt* body, - expr* decorators) - | Return(expr? value) | Yield(expr value) - attributes (int lineno) + stmt = FunctionDef(identifier name, arguments args, stmt* body, + expr* decorators) + | Return(expr? value) | Yield(expr value) + attributes (int lineno) } The preceding example describes three different kinds of statements; @@ -221,13 +221,13 @@ in Python/asdl.c and Include/asdl.h: ``asdl_seq_new()`` - Allocate memory for an asdl_seq for the specified length + Allocate memory for an asdl_seq for the specified length ``asdl_seq_GET()`` - Get item held at a specific position in an asdl_seq + Get item held at a specific position in an asdl_seq ``asdl_seq_SET()`` - Set a specific index in an asdl_seq to the specified value + Set a specific index in an asdl_seq to the specified value ``asdl_seq_LEN(asdl_seq *)`` - Return the length of an asdl_seq + Return the length of an asdl_seq If you are working with statements, you must also worry about keeping track of what line number generated the statement. Currently the line @@ -426,7 +426,7 @@ asdl_c.py "Generate C code from an ASDL description." Generates - Python/Python-ast.c and Include/Python-ast.h . + Python/Python-ast.c and Include/Python-ast.h . spark.py SPARK_ parser generator @@ -435,9 +435,9 @@ Python-ast.c Creates C structs corresponding to the ASDL types. Also - contains code for marshaling AST nodes (core ASDL types have - marshaling code in asdl.c). "File automatically generated by - Parser/asdl_c.py". This file must be committed separately + contains code for marshaling AST nodes (core ASDL types have + marshaling code in asdl.c). "File automatically generated by + Parser/asdl_c.py". This file must be committed separately after every grammar change is committed since the __version__ value is set to the latest grammar change revision number. @@ -456,14 +456,14 @@ Emits bytecode based on the AST. symtable.c - Generates a symbol table from AST. + Generates a symbol table from AST. pyarena.c Implementation of the arena memory manager. import.c Home of the magic number (named ``MAGIC``) for bytecode versioning - + + Include/ @@ -479,12 +479,12 @@ Declares PyAST_FromNode() external (from Python/ast.c). code.h - Header file for Objects/codeobject.c; contains definition of - PyCodeObject. + Header file for Objects/codeobject.c; contains definition of + PyCodeObject. symtable.h - Header for Python/symtable.c . struct symtable and - PySTEntryObject are defined here. + Header for Python/symtable.c . struct symtable and + PySTEntryObject are defined here. pyarena.h Header file for the corresponding Python/pyarena.c . @@ -496,8 +496,8 @@ + Objects/ codeobject.c - Contains PyCodeObject-related code (originally in - Python/compile.c). + Contains PyCodeObject-related code (originally in + Python/compile.c). + Lib/ -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Thu Oct 6 22:35:46 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 22:35:46 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Issue_=2313117=3A_Fix_brok?= =?utf8?q?en_links_in_the_compiler_page_of_the_Developer=27s_Guide=2E?= Message-ID: http://hg.python.org/devguide/rev/76159c6d265a changeset: 455:76159c6d265a user: Ned Deily date: Thu Oct 06 13:35:08 2011 -0700 summary: Issue #13117: Fix broken links in the compiler page of the Developer's Guide. (Patch by Francisco Mart?n Brugu?) files: compiler.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compiler.rst b/compiler.rst --- a/compiler.rst +++ b/compiler.rst @@ -548,12 +548,12 @@ 213--227, 1997. .. _The Zephyr Abstract Syntax Description Language.: - http://www.cs.princeton.edu/~danwang/Papers/dsl97/dsl97.html + http://www.cs.princeton.edu/research/techreps/TR-554-97 .. _SPARK: http://pages.cpsc.ucalgary.ca/~aycock/spark/ .. [#skip-peephole] Skip Montanaro's Peephole Optimizer Paper - (http://www.foretec.com/python/workshops/1998-11/proceedings/papers/montanaro/montanaro.html) + (http://www.python.org/workshops/1998-11/proceedings/papers/montanaro/montanaro.html) .. [#Bytecodehacks] Bytecodehacks Project (http://bytecodehacks.sourceforge.net/bch-docs/bch/index.html) -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Thu Oct 6 22:35:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 22:35:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_test=5Fsplitlines_to_re?= =?utf8?q?ach_its_size_estimate?= Message-ID: http://hg.python.org/cpython/rev/6131a2fc0a0f changeset: 72764:6131a2fc0a0f user: Antoine Pitrou date: Thu Oct 06 22:19:07 2011 +0200 summary: Fix test_splitlines to reach its size estimate files: Lib/test/test_bigmem.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -393,9 +393,9 @@ # take up an inordinate amount of memory chunksize = int(size ** 0.5 + 2) // 2 SUBSTR = _(' ') * chunksize + _('\n') + _(' ') * chunksize + _('\r\n') - s = SUBSTR * chunksize + s = SUBSTR * (chunksize * 2) l = s.splitlines() - self.assertEqual(len(l), chunksize * 2) + self.assertEqual(len(l), chunksize * 4) expected = _(' ') * chunksize for item in l: self.assertEqual(item, expected) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 22:35:48 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 22:35:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_size_estimate_for_test?= =?utf8?q?=5Funicode=5Frepr?= Message-ID: http://hg.python.org/cpython/rev/6b5a8d7b1336 changeset: 72765:6b5a8d7b1336 user: Antoine Pitrou date: Thu Oct 06 22:32:10 2011 +0200 summary: Fix size estimate for test_unicode_repr files: Lib/test/test_bigmem.py | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -701,7 +701,13 @@ self.assertEqual(s.count('\\'), size) self.assertEqual(s.count('0'), size * 2) - @bigmemtest(size=_2G // 5 + 1, memuse=ucs2_char_size + ascii_char_size * 6) + # ascii() calls encode('ascii', 'backslashreplace'), which itself + # creates a temporary Py_UNICODE representation in addition to the + # original (Py_UCS2) one + # There's also some overallocation when resizing the ascii() result + # that isn't taken into account here. + @bigmemtest(size=_2G // 5 + 1, memuse=ucs2_char_size + + ucs4_char_size + ascii_char_size * 6) def test_unicode_repr(self, size): # Use an assigned, but not printable code point. # It is in the range of the low surrogates \uDC00-\uDFFF. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 22:44:45 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 06 Oct 2011 22:44:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_expected_memory_consump?= =?utf8?q?tion_for_test=5Ftranslate?= Message-ID: http://hg.python.org/cpython/rev/849f35a575a5 changeset: 72766:849f35a575a5 user: Antoine Pitrou date: Thu Oct 06 22:41:08 2011 +0200 summary: Fix expected memory consumption for test_translate files: Lib/test/test_bigmem.py | 33 +++++++++++++++++++++------- 1 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -446,14 +446,7 @@ def test_translate(self, size): _ = self.from_latin1 SUBSTR = _('aZz.z.Aaz.') - if isinstance(SUBSTR, str): - trans = { - ord(_('.')): _('-'), - ord(_('a')): _('!'), - ord(_('Z')): _('$'), - } - else: - trans = bytes.maketrans(b'.aZ', b'-!$') + trans = bytes.maketrans(b'.aZ', b'-!$') sublen = len(SUBSTR) repeats = size // sublen + 2 s = SUBSTR * repeats @@ -735,6 +728,30 @@ finally: r = s = None + # The original test_translate is overriden here, so as to get the + # correct size estimate: str.translate() uses an intermediate Py_UCS4 + # representation. + + @bigmemtest(size=_2G, memuse=ascii_char_size * 2 + ucs4_char_size) + def test_translate(self, size): + _ = self.from_latin1 + SUBSTR = _('aZz.z.Aaz.') + trans = { + ord(_('.')): _('-'), + ord(_('a')): _('!'), + ord(_('Z')): _('$'), + } + sublen = len(SUBSTR) + repeats = size // sublen + 2 + s = SUBSTR * repeats + s = s.translate(trans) + self.assertEqual(len(s), repeats * sublen) + self.assertEqual(s[:sublen], SUBSTR.translate(trans)) + self.assertEqual(s[-sublen:], SUBSTR.translate(trans)) + self.assertEqual(s.count(_('.')), 0) + self.assertEqual(s.count(_('!')), repeats * 2) + self.assertEqual(s.count(_('z')), repeats * 3) + class BytesTest(unittest.TestCase, BaseStrTest): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:06:29 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 06 Oct 2011 23:06:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_compiler_warnings?= Message-ID: http://hg.python.org/cpython/rev/11fed1ed1757 changeset: 72767:11fed1ed1757 user: Benjamin Peterson date: Thu Oct 06 17:06:25 2011 -0400 summary: fix compiler warnings files: Modules/_csv.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -529,13 +529,13 @@ self->field = PyMem_New(Py_UNICODE, self->field_size); } else { + Py_UNICODE *field = self->field; if (self->field_size > PY_SSIZE_T_MAX / 2) { PyErr_NoMemory(); return 0; } self->field_size *= 2; - self->field = PyMem_Resize(self->field, Py_UNICODE, - self->field_size); + self->field = PyMem_Resize(field, Py_UNICODE, self->field_size); } if (self->field == NULL) { PyErr_NoMemory(); @@ -1055,8 +1055,7 @@ Py_UNICODE* old_rec = self->rec; self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; - self->rec = PyMem_Resize(self->rec, Py_UNICODE, - self->rec_size); + self->rec = PyMem_Resize(old_rec, Py_UNICODE, self->rec_size); if (self->rec == NULL) PyMem_Free(old_rec); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:07 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:07 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzc0MjU6?= =?utf8?q?_Refactor_test=5Fpydoc_test_case_for_=27-k=27_behavior_and_add?= Message-ID: http://hg.python.org/cpython/rev/45862f4ab1c5 changeset: 72768:45862f4ab1c5 branch: 2.7 parent: 72754:89b9e4bf6f1f user: Ned Deily date: Thu Oct 06 14:17:34 2011 -0700 summary: Issue #7425: Refactor test_pydoc test case for '-k' behavior and add new test cases for importing bad packages and unreadable packages dirs. files: Lib/test/test_pydoc.py | 112 ++++++++++++++++------------ 1 files changed, 63 insertions(+), 49 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -1,7 +1,6 @@ import os import sys import difflib -import subprocess import __builtin__ import re import pydoc @@ -10,10 +9,10 @@ import unittest import xml.etree import test.test_support -from contextlib import contextmanager from collections import namedtuple +from test.script_helper import assert_python_ok from test.test_support import ( - TESTFN, forget, rmtree, EnvironmentVarGuard, reap_children, captured_stdout) + TESTFN, rmtree, reap_children, captured_stdout) from test import pydoc_mod @@ -176,17 +175,15 @@ # output pattern for module with bad imports badimport_pattern = "problem in %s - : No module named %s" -def run_pydoc(module_name, *args): +def run_pydoc(module_name, *args, **env): """ Runs pydoc on the specified module. Returns the stripped output of pydoc. """ - cmd = [sys.executable, pydoc.__file__, " ".join(args), module_name] - try: - output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] - return output.strip() - finally: - reap_children() + args = args + (module_name,) + # do not write bytecode files to avoid caching errors + rc, out, err = assert_python_ok('-B', pydoc.__file__, *args, **env) + return out.strip() def get_pydoc_html(module): "Returns pydoc generated output as html" @@ -259,42 +256,6 @@ self.assertEqual(expected, result, "documentation for missing module found") - def test_badimport(self): - # This tests the fix for issue 5230, where if pydoc found the module - # but the module had an internal import error pydoc would report no doc - # found. - modname = 'testmod_xyzzy' - testpairs = ( - ('i_am_not_here', 'i_am_not_here'), - ('test.i_am_not_here_either', 'i_am_not_here_either'), - ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), - ('i_am_not_here.{}'.format(modname), 'i_am_not_here.{}'.format(modname)), - ('test.{}'.format(modname), modname), - ) - - @contextmanager - def newdirinpath(dir): - os.mkdir(dir) - sys.path.insert(0, dir) - yield - sys.path.pop(0) - rmtree(dir) - - with newdirinpath(TESTFN), EnvironmentVarGuard() as env: - env['PYTHONPATH'] = TESTFN - fullmodname = os.path.join(TESTFN, modname) - sourcefn = fullmodname + os.extsep + "py" - for importstring, expectedinmsg in testpairs: - f = open(sourcefn, 'w') - f.write("import {}\n".format(importstring)) - f.close() - try: - result = run_pydoc(modname) - finally: - forget(modname) - expected = badimport_pattern % (modname, expectedinmsg) - self.assertEqual(expected, result) - def test_input_strip(self): missing_module = " test.i_am_not_here " result = run_pydoc(missing_module) @@ -317,6 +278,55 @@ "") +class PydocImportTest(unittest.TestCase): + + def setUp(self): + self.test_dir = os.mkdir(TESTFN) + self.addCleanup(rmtree, TESTFN) + + def test_badimport(self): + # This tests the fix for issue 5230, where if pydoc found the module + # but the module had an internal import error pydoc would report no doc + # found. + modname = 'testmod_xyzzy' + testpairs = ( + ('i_am_not_here', 'i_am_not_here'), + ('test.i_am_not_here_either', 'i_am_not_here_either'), + ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), + ('i_am_not_here.{}'.format(modname), + 'i_am_not_here.{}'.format(modname)), + ('test.{}'.format(modname), modname), + ) + + sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py" + for importstring, expectedinmsg in testpairs: + with open(sourcefn, 'w') as f: + f.write("import {}\n".format(importstring)) + result = run_pydoc(modname, PYTHONPATH=TESTFN) + expected = badimport_pattern % (modname, expectedinmsg) + self.assertEqual(expected, result) + + def test_apropos_with_bad_package(self): + # Issue 7425 - pydoc -k failed when bad package on path + pkgdir = os.path.join(TESTFN, "syntaxerr") + os.mkdir(pkgdir) + badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" + with open(badsyntax, 'w') as f: + f.write("invalid python syntax = $1\n") + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual('', result) + + def test_apropos_with_unreadable_dir(self): + # Issue 7367 - pydoc -k failed when unreadable dir on path + self.unreadable_dir = os.path.join(TESTFN, "unreadable") + os.mkdir(self.unreadable_dir, 0) + self.addCleanup(os.rmdir, self.unreadable_dir) + # Note, on Windows the directory appears to be still + # readable so this is not really testing the issue there + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual('', result) + + class TestDescriptions(unittest.TestCase): def test_module(self): @@ -376,9 +386,13 @@ def test_main(): - test.test_support.run_unittest(PyDocDocTest, - TestDescriptions, - TestHelper) + try: + test.test_support.run_unittest(PyDocDocTest, + PydocImportTest, + TestDescriptions, + TestHelper) + finally: + reap_children() if __name__ == "__main__": test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:07 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:07 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzczNjc6?= =?utf8?q?_Add_test_case_to_test=5Fpkgutil_for_walking_path_with?= Message-ID: http://hg.python.org/cpython/rev/096b010ae90b changeset: 72769:096b010ae90b branch: 2.7 user: Ned Deily date: Thu Oct 06 14:17:41 2011 -0700 summary: Issue #7367: Add test case to test_pkgutil for walking path with an unreadable directory. files: Lib/test/test_pkgutil.py | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -78,6 +78,17 @@ del sys.modules[pkg] + def test_unreadable_dir_on_syspath(self): + # issue7367 - walk_packages failed if unreadable dir on sys.path + package_name = "unreadable_package" + d = os.path.join(self.dirname, package_name) + # this does not appear to create an unreadable dir on Windows + # but the test should not fail anyway + os.mkdir(d, 0) + for t in pkgutil.walk_packages(path=[self.dirname]): + self.fail("unexpected package found") + os.rmdir(d) + class PkgutilPEP302Tests(unittest.TestCase): class MyTestLoader(object): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:08 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:08 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzc0MjU6?= =?utf8?q?_Prevent_pydoc_-k_failures_due_to_module_import_errors=2E?= Message-ID: http://hg.python.org/cpython/rev/3acf90f71178 changeset: 72770:3acf90f71178 branch: 2.7 user: Ned Deily date: Thu Oct 06 14:17:44 2011 -0700 summary: Issue #7425: Prevent pydoc -k failures due to module import errors. (Backport to 2.7 of existing 3.x fix) files: Lib/pydoc.py | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -52,7 +52,7 @@ # the current directory is changed with os.chdir(), an incorrect # path will be displayed. -import sys, imp, os, re, types, inspect, __builtin__, pkgutil +import sys, imp, os, re, types, inspect, __builtin__, pkgutil, warnings from repr import Repr from string import expandtabs, find, join, lower, split, strip, rfind, rstrip from traceback import extract_tb @@ -1968,10 +1968,11 @@ if modname[-9:] == '.__init__': modname = modname[:-9] + ' (package)' print modname, desc and '- ' + desc - try: import warnings - except ImportError: pass - else: warnings.filterwarnings('ignore') # ignore problems during import - ModuleScanner().run(callback, key) + def onerror(modname): + pass + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') # ignore problems during import + ModuleScanner().run(callback, key, onerror=onerror) # --------------------------------------------------- web browser interface -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:09 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:09 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzczNjc6?= =?utf8?q?_Fix_pkgutil=2Ewalk=5Fpaths_to_skip_directories_whose?= Message-ID: http://hg.python.org/cpython/rev/1449095397ae changeset: 72771:1449095397ae branch: 2.7 user: Ned Deily date: Thu Oct 06 14:17:47 2011 -0700 summary: Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. files: Lib/pkgutil.py | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -194,8 +194,11 @@ yielded = {} import inspect - - filenames = os.listdir(self.path) + try: + filenames = os.listdir(self.path) + except OSError: + # ignore unreadable directories like import does + filenames = [] filenames.sort() # handle packages before same-named modules for fn in filenames: @@ -208,7 +211,12 @@ if not modname and os.path.isdir(path) and '.' not in fn: modname = fn - for fn in os.listdir(path): + try: + dircontents = os.listdir(path) + except OSError: + # ignore unreadable directories like import does + dircontents = [] + for fn in dircontents: subname = inspect.getmodulename(fn) if subname=='__init__': ispkg = True -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:10 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:10 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzc0MjU6?= =?utf8?q?_Refactor_test=5Fpydoc_test_case_for_=27-k=27_behavior_and_add?= Message-ID: http://hg.python.org/cpython/rev/6a45f917f167 changeset: 72772:6a45f917f167 branch: 3.2 parent: 72755:f9f782f2369e user: Ned Deily date: Thu Oct 06 14:19:03 2011 -0700 summary: Issue #7425: Refactor test_pydoc test case for '-k' behavior and add new test cases for importing bad packages and unreadable packages dirs. files: Lib/test/test_pydoc.py | 95 ++++++++++++++++------------- 1 files changed, 53 insertions(+), 42 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -7,7 +7,6 @@ import keyword import re import string -import subprocess import test.support import time import unittest @@ -15,11 +14,9 @@ import textwrap from io import StringIO from collections import namedtuple -from contextlib import contextmanager - from test.script_helper import assert_python_ok from test.support import ( - TESTFN, forget, rmtree, EnvironmentVarGuard, + TESTFN, rmtree, reap_children, reap_threads, captured_output, captured_stdout, unlink ) from test import pydoc_mod @@ -209,7 +206,8 @@ output of pydoc. """ args = args + (module_name,) - rc, out, err = assert_python_ok(pydoc.__file__, *args, **env) + # do not write bytecode files to avoid caching errors + rc, out, err = assert_python_ok('-B', pydoc.__file__, *args, **env) return out.strip() def get_pydoc_html(module): @@ -291,43 +289,6 @@ self.assertEqual(expected, result, "documentation for missing module found") - def test_badimport(self): - # This tests the fix for issue 5230, where if pydoc found the module - # but the module had an internal import error pydoc would report no doc - # found. - modname = 'testmod_xyzzy' - testpairs = ( - ('i_am_not_here', 'i_am_not_here'), - ('test.i_am_not_here_either', 'i_am_not_here_either'), - ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), - ('i_am_not_here.{}'.format(modname), - 'i_am_not_here.{}'.format(modname)), - ('test.{}'.format(modname), modname), - ) - - @contextmanager - def newdirinpath(dir): - os.mkdir(dir) - sys.path.insert(0, dir) - try: - yield - finally: - sys.path.pop(0) - rmtree(dir) - - with newdirinpath(TESTFN): - fullmodname = os.path.join(TESTFN, modname) - sourcefn = fullmodname + os.extsep + "py" - for importstring, expectedinmsg in testpairs: - with open(sourcefn, 'w') as f: - f.write("import {}\n".format(importstring)) - try: - result = run_pydoc(modname, PYTHONPATH=TESTFN).decode("ascii") - finally: - forget(modname) - expected = badimport_pattern % (modname, expectedinmsg) - self.assertEqual(expected, result) - def test_input_strip(self): missing_module = " test.i_am_not_here " result = str(run_pydoc(missing_module), 'ascii') @@ -403,6 +364,55 @@ self.assertEqual(synopsis, 'line 1: h\xe9') +class PydocImportTest(unittest.TestCase): + + def setUp(self): + self.test_dir = os.mkdir(TESTFN) + self.addCleanup(rmtree, TESTFN) + + def test_badimport(self): + # This tests the fix for issue 5230, where if pydoc found the module + # but the module had an internal import error pydoc would report no doc + # found. + modname = 'testmod_xyzzy' + testpairs = ( + ('i_am_not_here', 'i_am_not_here'), + ('test.i_am_not_here_either', 'i_am_not_here_either'), + ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), + ('i_am_not_here.{}'.format(modname), + 'i_am_not_here.{}'.format(modname)), + ('test.{}'.format(modname), modname), + ) + + sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py" + for importstring, expectedinmsg in testpairs: + with open(sourcefn, 'w') as f: + f.write("import {}\n".format(importstring)) + result = run_pydoc(modname, PYTHONPATH=TESTFN).decode("ascii") + expected = badimport_pattern % (modname, expectedinmsg) + self.assertEqual(expected, result) + + def test_apropos_with_bad_package(self): + # Issue 7425 - pydoc -k failed when bad package on path + pkgdir = os.path.join(TESTFN, "syntaxerr") + os.mkdir(pkgdir) + badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" + with open(badsyntax, 'w') as f: + f.write("invalid python syntax = $1\n") + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual(b'', result) + + def test_apropos_with_unreadable_dir(self): + # Issue 7367 - pydoc -k failed when unreadable dir on path + self.unreadable_dir = os.path.join(TESTFN, "unreadable") + os.mkdir(self.unreadable_dir, 0) + self.addCleanup(os.rmdir, self.unreadable_dir) + # Note, on Windows the directory appears to be still + # readable so this is not really testing the issue there + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual(b'', result) + + class TestDescriptions(unittest.TestCase): def test_module(self): @@ -511,6 +521,7 @@ def test_main(): try: test.support.run_unittest(PydocDocTest, + PydocImportTest, TestDescriptions, PydocServerTest, PydocUrlHandlerTest, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:11 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:11 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzczNjc6?= =?utf8?q?_Add_test_case_to_test=5Fpkgutil_for_walking_path_with?= Message-ID: http://hg.python.org/cpython/rev/a1e6633ef3f1 changeset: 72773:a1e6633ef3f1 branch: 3.2 user: Ned Deily date: Thu Oct 06 14:19:06 2011 -0700 summary: Issue #7367: Add test case to test_pkgutil for walking path with an unreadable directory. files: Lib/test/test_pkgutil.py | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -84,6 +84,17 @@ del sys.modules[pkg] + def test_unreadable_dir_on_syspath(self): + # issue7367 - walk_packages failed if unreadable dir on sys.path + package_name = "unreadable_package" + d = os.path.join(self.dirname, package_name) + # this does not appear to create an unreadable dir on Windows + # but the test should not fail anyway + os.mkdir(d, 0) + for t in pkgutil.walk_packages(path=[self.dirname]): + self.fail("unexpected package found") + os.rmdir(d) + class PkgutilPEP302Tests(unittest.TestCase): class MyTestLoader(object): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:12 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:12 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzczNjc6?= =?utf8?q?_Fix_pkgutil=2Ewalk=5Fpaths_to_skip_directories_whose?= Message-ID: http://hg.python.org/cpython/rev/77bac85f610a changeset: 72774:77bac85f610a branch: 3.2 user: Ned Deily date: Thu Oct 06 14:19:08 2011 -0700 summary: Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. files: Lib/pkgutil.py | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -191,8 +191,11 @@ yielded = {} import inspect - - filenames = os.listdir(self.path) + try: + filenames = os.listdir(self.path) + except OSError: + # ignore unreadable directories like import does + filenames = [] filenames.sort() # handle packages before same-named modules for fn in filenames: @@ -205,7 +208,12 @@ if not modname and os.path.isdir(path) and '.' not in fn: modname = fn - for fn in os.listdir(path): + try: + dircontents = os.listdir(path) + except OSError: + # ignore unreadable directories like import does + dircontents = [] + for fn in dircontents: subname = inspect.getmodulename(fn) if subname=='__init__': ispkg = True -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:12 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/8bb0000e81e5 changeset: 72775:8bb0000e81e5 parent: 72767:11fed1ed1757 parent: 72774:77bac85f610a user: Ned Deily date: Thu Oct 06 14:24:31 2011 -0700 summary: merge from 3.2 files: Lib/pkgutil.py | 14 +++- Lib/test/test_pkgutil.py | 11 +++ Lib/test/test_pydoc.py | 95 +++++++++++++++------------ 3 files changed, 75 insertions(+), 45 deletions(-) diff --git a/Lib/pkgutil.py b/Lib/pkgutil.py --- a/Lib/pkgutil.py +++ b/Lib/pkgutil.py @@ -191,8 +191,11 @@ yielded = {} import inspect - - filenames = os.listdir(self.path) + try: + filenames = os.listdir(self.path) + except OSError: + # ignore unreadable directories like import does + filenames = [] filenames.sort() # handle packages before same-named modules for fn in filenames: @@ -205,7 +208,12 @@ if not modname and os.path.isdir(path) and '.' not in fn: modname = fn - for fn in os.listdir(path): + try: + dircontents = os.listdir(path) + except OSError: + # ignore unreadable directories like import does + dircontents = [] + for fn in dircontents: subname = inspect.getmodulename(fn) if subname=='__init__': ispkg = True diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -84,6 +84,17 @@ del sys.modules[pkg] + def test_unreadable_dir_on_syspath(self): + # issue7367 - walk_packages failed if unreadable dir on sys.path + package_name = "unreadable_package" + d = os.path.join(self.dirname, package_name) + # this does not appear to create an unreadable dir on Windows + # but the test should not fail anyway + os.mkdir(d, 0) + for t in pkgutil.walk_packages(path=[self.dirname]): + self.fail("unexpected package found") + os.rmdir(d) + class PkgutilPEP302Tests(unittest.TestCase): class MyTestLoader(object): diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -7,7 +7,6 @@ import keyword import re import string -import subprocess import test.support import time import unittest @@ -15,11 +14,9 @@ import textwrap from io import StringIO from collections import namedtuple -from contextlib import contextmanager - from test.script_helper import assert_python_ok from test.support import ( - TESTFN, forget, rmtree, EnvironmentVarGuard, + TESTFN, rmtree, reap_children, reap_threads, captured_output, captured_stdout, unlink ) from test import pydoc_mod @@ -209,7 +206,8 @@ output of pydoc. """ args = args + (module_name,) - rc, out, err = assert_python_ok(pydoc.__file__, *args, **env) + # do not write bytecode files to avoid caching errors + rc, out, err = assert_python_ok('-B', pydoc.__file__, *args, **env) return out.strip() def get_pydoc_html(module): @@ -295,43 +293,6 @@ self.assertEqual(expected, result, "documentation for missing module found") - def test_badimport(self): - # This tests the fix for issue 5230, where if pydoc found the module - # but the module had an internal import error pydoc would report no doc - # found. - modname = 'testmod_xyzzy' - testpairs = ( - ('i_am_not_here', 'i_am_not_here'), - ('test.i_am_not_here_either', 'i_am_not_here_either'), - ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), - ('i_am_not_here.{}'.format(modname), - 'i_am_not_here.{}'.format(modname)), - ('test.{}'.format(modname), modname), - ) - - @contextmanager - def newdirinpath(dir): - os.mkdir(dir) - sys.path.insert(0, dir) - try: - yield - finally: - sys.path.pop(0) - rmtree(dir) - - with newdirinpath(TESTFN): - fullmodname = os.path.join(TESTFN, modname) - sourcefn = fullmodname + os.extsep + "py" - for importstring, expectedinmsg in testpairs: - with open(sourcefn, 'w') as f: - f.write("import {}\n".format(importstring)) - try: - result = run_pydoc(modname, PYTHONPATH=TESTFN).decode("ascii") - finally: - forget(modname) - expected = badimport_pattern % (modname, expectedinmsg) - self.assertEqual(expected, result) - def test_input_strip(self): missing_module = " test.i_am_not_here " result = str(run_pydoc(missing_module), 'ascii') @@ -409,6 +370,55 @@ self.assertEqual(synopsis, 'line 1: h\xe9') +class PydocImportTest(unittest.TestCase): + + def setUp(self): + self.test_dir = os.mkdir(TESTFN) + self.addCleanup(rmtree, TESTFN) + + def test_badimport(self): + # This tests the fix for issue 5230, where if pydoc found the module + # but the module had an internal import error pydoc would report no doc + # found. + modname = 'testmod_xyzzy' + testpairs = ( + ('i_am_not_here', 'i_am_not_here'), + ('test.i_am_not_here_either', 'i_am_not_here_either'), + ('test.i_am_not_here.neither_am_i', 'i_am_not_here.neither_am_i'), + ('i_am_not_here.{}'.format(modname), + 'i_am_not_here.{}'.format(modname)), + ('test.{}'.format(modname), modname), + ) + + sourcefn = os.path.join(TESTFN, modname) + os.extsep + "py" + for importstring, expectedinmsg in testpairs: + with open(sourcefn, 'w') as f: + f.write("import {}\n".format(importstring)) + result = run_pydoc(modname, PYTHONPATH=TESTFN).decode("ascii") + expected = badimport_pattern % (modname, expectedinmsg) + self.assertEqual(expected, result) + + def test_apropos_with_bad_package(self): + # Issue 7425 - pydoc -k failed when bad package on path + pkgdir = os.path.join(TESTFN, "syntaxerr") + os.mkdir(pkgdir) + badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" + with open(badsyntax, 'w') as f: + f.write("invalid python syntax = $1\n") + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual(b'', result) + + def test_apropos_with_unreadable_dir(self): + # Issue 7367 - pydoc -k failed when unreadable dir on path + self.unreadable_dir = os.path.join(TESTFN, "unreadable") + os.mkdir(self.unreadable_dir, 0) + self.addCleanup(os.rmdir, self.unreadable_dir) + # Note, on Windows the directory appears to be still + # readable so this is not really testing the issue there + result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + self.assertEqual(b'', result) + + class TestDescriptions(unittest.TestCase): def test_module(self): @@ -517,6 +527,7 @@ def test_main(): try: test.support.run_unittest(PydocDocTest, + PydocImportTest, TestDescriptions, PydocServerTest, PydocUrlHandlerTest, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:13 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue_=237425_a?= =?utf8?q?nd_Issue_=237367=3A_add_NEWS_items=2E?= Message-ID: http://hg.python.org/cpython/rev/add444274c3d changeset: 72776:add444274c3d branch: 2.7 parent: 72771:1449095397ae user: Ned Deily date: Thu Oct 06 14:29:49 2011 -0700 summary: Issue #7425 and Issue #7367: add NEWS items. files: Misc/NEWS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,12 @@ Library ------- +- Issue #7367: Fix pkgutil.walk_paths to skip directories whose + contents cannot be read. + +- Issue #7425: Prevent pydoc -k failures due to module import errors. + (Backport to 2.7 of existing 3.x fix) + - Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:14 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:14 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzczNjc6?= =?utf8?q?_add_NEWS_item=2E?= Message-ID: http://hg.python.org/cpython/rev/5a4018570a59 changeset: 72777:5a4018570a59 branch: 3.2 parent: 72774:77bac85f610a user: Ned Deily date: Thu Oct 06 14:31:14 2011 -0700 summary: Issue #7367: add NEWS item. files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,9 @@ Library ------- +- Issue #7367: Fix pkgutil.walk_paths to skip directories whose + contents cannot be read. + - Issue #13099: Fix sqlite3.Cursor.lastrowid under a Turkish locale. Reported and diagnosed by Thomas Kluyver. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 6 23:43:15 2011 From: python-checkins at python.org (ned.deily) Date: Thu, 06 Oct 2011 23:43:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=237367=3A_merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/0408001e4765 changeset: 72778:0408001e4765 parent: 72775:8bb0000e81e5 parent: 72777:5a4018570a59 user: Ned Deily date: Thu Oct 06 14:41:30 2011 -0700 summary: Issue #7367: merge from 3.2 files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -297,6 +297,9 @@ Library ------- +- Issue #7367: Fix pkgutil.walk_paths to skip directories whose + contents cannot be read. + - Issue #3163: The struct module gets new format characters 'n' and 'N' supporting C integer types ``ssize_t`` and ``size_t``, respectively. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 01:57:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 01:57:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_massive_slowdown_in_str?= =?utf8?q?ing_formatting_with_the_=25_operator?= Message-ID: http://hg.python.org/cpython/rev/e0df7db13d55 changeset: 72779:e0df7db13d55 user: Antoine Pitrou date: Fri Oct 07 01:54:09 2011 +0200 summary: Fix massive slowdown in string formatting with the % operator files: Objects/unicodeobject.c | 251 ++++++++++++++------------- 1 files changed, 132 insertions(+), 119 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12693,17 +12693,13 @@ return result; } -static int -formatchar(Py_UCS4 *buf, - size_t buflen, - PyObject *v) +static Py_UCS4 +formatchar(PyObject *v) { /* presume that the buffer is at least 3 characters long */ if (PyUnicode_Check(v)) { if (PyUnicode_GET_LENGTH(v) == 1) { - buf[0] = PyUnicode_READ_CHAR(v, 0); - buf[1] = '\0'; - return 1; + return PyUnicode_READ_CHAR(v, 0); } goto onError; } @@ -12717,24 +12713,17 @@ if (x < 0 || x > 0x10ffff) { PyErr_SetString(PyExc_OverflowError, "%c arg not in range(0x110000)"); - return -1; - } - - buf[0] = (Py_UCS4) x; - buf[1] = '\0'; - return 1; + return (Py_UCS4) -1; + } + + return (Py_UCS4) x; } onError: PyErr_SetString(PyExc_TypeError, "%c requires int or char"); - return -1; -} - -/* fmt%(v1,v2,...) is roughly equivalent to sprintf(fmt, v1, v2, ...) - FORMATBUFLEN is the length of the buffer in which chars are formatted. -*/ -#define FORMATBUFLEN (size_t)10 + return (Py_UCS4) -1; +} PyObject * PyUnicode_Format(PyObject *format, PyObject *args) @@ -12742,13 +12731,27 @@ void *fmt; int fmtkind; PyObject *result; - Py_UCS4 *res, *res0; - Py_UCS4 max; int kind; - Py_ssize_t fmtcnt, fmtpos, rescnt, reslen, arglen, argidx; + int r; + Py_ssize_t fmtcnt, fmtpos, arglen, argidx; int args_owned = 0; PyObject *dict = NULL; + PyObject *temp = NULL; + PyObject *second = NULL; PyUnicodeObject *uformat; + _PyAccu acc; + static PyObject *plus, *minus, *blank, *zero, *percent; + + if (!plus && !(plus = get_latin1_char('+'))) + return NULL; + if (!minus && !(minus = get_latin1_char('-'))) + return NULL; + if (!blank && !(blank = get_latin1_char(' '))) + return NULL; + if (!zero && !(zero = get_latin1_char('0'))) + return NULL; + if (!percent && !(percent = get_latin1_char('%'))) + return NULL; if (format == NULL || args == NULL) { PyErr_BadInternalCall(); @@ -12757,18 +12760,13 @@ uformat = (PyUnicodeObject*)PyUnicode_FromObject(format); if (uformat == NULL || PyUnicode_READY(uformat) == -1) return NULL; + if (_PyAccu_Init(&acc)) + goto onError; fmt = PyUnicode_DATA(uformat); fmtkind = PyUnicode_KIND(uformat); fmtcnt = PyUnicode_GET_LENGTH(uformat); fmtpos = 0; - reslen = rescnt = fmtcnt + 100; - res = res0 = PyMem_Malloc(reslen * sizeof(Py_UCS4)); - if (res0 == NULL) { - PyErr_NoMemory(); - goto onError; - } - if (PyTuple_Check(args)) { arglen = PyTuple_Size(args); argidx = 0; @@ -12783,18 +12781,21 @@ while (--fmtcnt >= 0) { if (PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') { - if (--rescnt < 0) { - rescnt = fmtcnt + 100; - reslen += rescnt; - res0 = PyMem_Realloc(res0, reslen*sizeof(Py_UCS4)); - if (res0 == NULL){ - PyErr_NoMemory(); - goto onError; - } - res = res0 + reslen - rescnt; - --rescnt; - } - *res++ = PyUnicode_READ(fmtkind, fmt, fmtpos++); + PyObject *nonfmt; + Py_ssize_t nonfmtpos; + nonfmtpos = fmtpos++; + while (fmtcnt >= 0 && + PyUnicode_READ(fmtkind, fmt, fmtpos) != '%') { + fmtpos++; + fmtcnt--; + } + nonfmt = PyUnicode_Substring((PyObject *) uformat, nonfmtpos, fmtpos); + if (nonfmt == NULL) + goto onError; + r = _PyAccu_Accumulate(&acc, nonfmt); + Py_DECREF(nonfmt); + if (r) + goto onError; } else { /* Got a format specifier */ @@ -12802,15 +12803,12 @@ Py_ssize_t width = -1; int prec = -1; Py_UCS4 c = '\0'; - Py_UCS4 fill; + Py_UCS4 fill, sign; int isnumok; PyObject *v = NULL; - PyObject *temp = NULL; - void *pbuf; - Py_ssize_t pindex; - Py_UNICODE sign; - Py_ssize_t len, len1; - Py_UCS4 formatbuf[FORMATBUFLEN]; /* For formatchar() */ + void *pbuf = NULL; + Py_ssize_t pindex, len; + PyObject *signobj = NULL, *fillobj = NULL; fmtpos++; if (PyUnicode_READ(fmtkind, fmt, fmtpos) == '(') { @@ -12955,15 +12953,12 @@ } sign = 0; fill = ' '; + fillobj = blank; switch (c) { case '%': - pbuf = formatbuf; - kind = PyUnicode_4BYTE_KIND; - /* presume that buffer length is at least 1 */ - PyUnicode_WRITE(kind, pbuf, 0, '%'); - len = 1; - break; + _PyAccu_Accumulate(&acc, percent); + continue; case 's': case 'r': @@ -13045,8 +13040,10 @@ "not %.200s", (char)c, Py_TYPE(v)->tp_name); goto onError; } - if (flags & F_ZERO) + if (flags & F_ZERO) { fill = '0'; + fillobj = zero; + } break; case 'e': @@ -13066,17 +13063,25 @@ kind = PyUnicode_KIND(temp); len = PyUnicode_GET_LENGTH(temp); sign = 1; - if (flags & F_ZERO) + if (flags & F_ZERO) { fill = '0'; + fillobj = zero; + } break; case 'c': - pbuf = formatbuf; - kind = PyUnicode_4BYTE_KIND; - len = formatchar(pbuf, Py_ARRAY_LENGTH(formatbuf), v); - if (len < 0) + { + Py_UCS4 ch = formatchar(v); + if (ch == (Py_UCS4) -1) goto onError; + temp = _PyUnicode_FromUCS4(&ch, 1); + if (temp == NULL) + goto onError; + pbuf = PyUnicode_DATA(temp); + kind = PyUnicode_KIND(temp); + len = PyUnicode_GET_LENGTH(temp); break; + } default: PyErr_Format(PyExc_ValueError, @@ -13090,90 +13095,105 @@ /* pbuf is initialized here. */ pindex = 0; if (sign) { - if (PyUnicode_READ(kind, pbuf, pindex) == '-' || - PyUnicode_READ(kind, pbuf, pindex) == '+') { - sign = PyUnicode_READ(kind, pbuf, pindex++); + if (PyUnicode_READ(kind, pbuf, pindex) == '-') { + signobj = minus; len--; + pindex++; + } + else if (PyUnicode_READ(kind, pbuf, pindex) == '+') { + signobj = plus; + len--; + pindex++; } else if (flags & F_SIGN) - sign = '+'; + signobj = plus; else if (flags & F_BLANK) - sign = ' '; + signobj = blank; else sign = 0; } if (width < len) width = len; - if (rescnt - (sign != 0) < width) { - reslen -= rescnt; - rescnt = width + fmtcnt + 100; - reslen += rescnt; - if (reslen < 0) { - Py_XDECREF(temp); - PyErr_NoMemory(); - goto onError; - } - res0 = PyMem_Realloc(res0, reslen*sizeof(Py_UCS4)); - if (res0 == 0) { - PyErr_NoMemory(); - Py_XDECREF(temp); - goto onError; - } - res = res0 + reslen - rescnt; - } if (sign) { - if (fill != ' ') - *res++ = sign; - rescnt--; + if (fill != ' ') { + assert(signobj != NULL); + if (_PyAccu_Accumulate(&acc, signobj)) + goto onError; + } if (width > len) width--; } if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) { assert(PyUnicode_READ(kind, pbuf, pindex) == '0'); - assert(PyUnicode_READ(kind, pbuf, pindex+1) == c); + assert(PyUnicode_READ(kind, pbuf, pindex + 1) == c); if (fill != ' ') { - *res++ = PyUnicode_READ(kind, pbuf, pindex++); - *res++ = PyUnicode_READ(kind, pbuf, pindex++); - } - rescnt -= 2; + second = get_latin1_char( + PyUnicode_READ(kind, pbuf, pindex + 1)); + pindex += 2; + if (second == NULL || + _PyAccu_Accumulate(&acc, zero) || + _PyAccu_Accumulate(&acc, second)) + goto onError; + Py_CLEAR(second); + } width -= 2; if (width < 0) width = 0; len -= 2; } if (width > len && !(flags & F_LJUST)) { + assert(fillobj != NULL); do { - --rescnt; - *res++ = fill; + if (_PyAccu_Accumulate(&acc, fillobj)) + goto onError; } while (--width > len); } if (fill == ' ') { - if (sign) - *res++ = sign; + if (sign) { + assert(signobj != NULL); + if (_PyAccu_Accumulate(&acc, signobj)) + goto onError; + } if ((flags & F_ALT) && (c == 'x' || c == 'X' || c == 'o')) { assert(PyUnicode_READ(kind, pbuf, pindex) == '0'); assert(PyUnicode_READ(kind, pbuf, pindex+1) == c); - *res++ = PyUnicode_READ(kind, pbuf, pindex++); - *res++ = PyUnicode_READ(kind, pbuf, pindex++); + second = get_latin1_char( + PyUnicode_READ(kind, pbuf, pindex + 1)); + pindex += 2; + if (second == NULL || + _PyAccu_Accumulate(&acc, zero) || + _PyAccu_Accumulate(&acc, second)) + goto onError; + Py_CLEAR(second); } } /* Copy all characters, preserving len */ - len1 = len; - while (len1--) { - *res++ = PyUnicode_READ(kind, pbuf, pindex++); - rescnt--; - } + if (temp != NULL) { + assert(pbuf == PyUnicode_DATA(temp)); + v = PyUnicode_Substring(temp, pindex, pindex + len); + } + else { + const char *p = (const char *) pbuf; + assert(pbuf != NULL); + p = p + PyUnicode_KIND_SIZE(kind, pindex); + v = PyUnicode_FromKindAndData(kind, p, len); + } + if (v == NULL) + goto onError; + r = _PyAccu_Accumulate(&acc, v); + Py_DECREF(v); + if (r) + goto onError; while (--width >= len) { - --rescnt; - *res++ = ' '; + if (_PyAccu_Accumulate(&acc, blank)) + goto onError; } if (dict && (argidx < arglen) && c != '%') { PyErr_SetString(PyExc_TypeError, "not all arguments converted during string formatting"); - Py_XDECREF(temp); goto onError; } - Py_XDECREF(temp); + Py_CLEAR(temp); } /* '%' */ } /* until end */ if (argidx < arglen && !dict) { @@ -13182,27 +13202,20 @@ goto onError; } - - for (max=0, res = res0; res < res0+reslen-rescnt; res++) - if (*res > max) - max = *res; - result = PyUnicode_New(reslen - rescnt, max); - if (!result) - goto onError; - kind = PyUnicode_KIND(result); - for (res = res0; res < res0+reslen-rescnt; res++) - PyUnicode_WRITE(kind, PyUnicode_DATA(result), res-res0, *res); - PyMem_Free(res0); + result = _PyAccu_Finish(&acc); if (args_owned) { Py_DECREF(args); } Py_DECREF(uformat); - assert(_PyUnicode_CheckConsistency(result, 1)); + Py_XDECREF(temp); + Py_XDECREF(second); return (PyObject *)result; onError: - PyMem_Free(res0); Py_DECREF(uformat); + Py_XDECREF(temp); + Py_XDECREF(second); + _PyAccu_Destroy(&acc); if (args_owned) { Py_DECREF(args); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 02:30:26 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 02:30:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_massive_slowdown_in_str?= =?utf8?q?ing_formatting_with_str=2Eformat=2E?= Message-ID: http://hg.python.org/cpython/rev/d49be9b017a2 changeset: 72780:d49be9b017a2 user: Antoine Pitrou date: Fri Oct 07 02:26:47 2011 +0200 summary: Fix massive slowdown in string formatting with str.format. Example: ./python -m timeit -s "f='{}' + '-' * 1024 + '{}'; s='abcd' * 16384" "f.format(s, s)" -> before: 547 usec per loop -> after: 13 usec per loop -> 3.2: 22.5 usec per loop -> 2.7: 12.6 usec per loop files: Objects/stringlib/unicode_format.h | 152 ++-------------- 1 files changed, 24 insertions(+), 128 deletions(-) diff --git a/Objects/stringlib/unicode_format.h b/Objects/stringlib/unicode_format.h --- a/Objects/stringlib/unicode_format.h +++ b/Objects/stringlib/unicode_format.h @@ -114,87 +114,6 @@ /*********** Output string management functions ****************/ /************************************************************************/ -typedef struct { - char *data; - Py_UCS4 maxchar; - unsigned int kind; - Py_ssize_t pos, size; - Py_ssize_t size_increment; -} OutputString; - -/* initialize an OutputString object, reserving size characters */ -static int -output_initialize(OutputString *output, Py_ssize_t size) -{ - output->data = PyMem_Malloc(size); - if (output->data == NULL) { - PyErr_NoMemory(); - return 0; - } - - output->maxchar = 127; - output->kind = PyUnicode_1BYTE_KIND; - output->pos = 0; - output->size = size; - output->size_increment = INITIAL_SIZE_INCREMENT; - - return 1; -} - -/* - output_extend reallocates the output string buffer. - It returns a status: 0 for a failed reallocation, - 1 for success. -*/ - -static int -output_extend(OutputString *output, Py_ssize_t count) -{ - Py_ssize_t maxlen = output->size + count + output->size_increment; - - output->data = PyMem_Realloc(output->data, maxlen << (output->kind-1)); - output->size = maxlen; - if (output->data == 0) { - PyErr_NoMemory(); - return 0; - } - if (output->size_increment < MAX_SIZE_INCREMENT) - output->size_increment *= SIZE_MULTIPLIER; - return 1; -} - -static int -output_widen(OutputString *output, Py_UCS4 maxchar) -{ - int kind; - void *data; - Py_ssize_t i; - if (maxchar <= output->maxchar) - return 1; - if (maxchar < 256) { - output->maxchar = 255; - return 1; - } - if (maxchar < 65536) { - output->maxchar = 65535; - kind = 2; - } - else { - output->maxchar = 1<<21; - kind = 3; - } - data = PyMem_Malloc(output->size << (kind-1)); - if (data == 0) - return 0; - for (i = 0; i < output->size; i++) - PyUnicode_WRITE(kind, data, i, - PyUnicode_READ(output->kind, output->data, i)); - PyMem_Free(output->data); - output->data = data; - output->kind = kind; - return 1; -} - /* output_data dumps characters into our output string buffer. @@ -205,26 +124,17 @@ 1 for success. */ static int -output_data(OutputString *output, PyObject *s, Py_ssize_t start, Py_ssize_t end) +output_data(_PyAccu *acc, PyObject *s, Py_ssize_t start, Py_ssize_t end) { - Py_ssize_t i; - int kind; - if ((output->pos + end - start > output->size) && - !output_extend(output, end - start)) + PyObject *substring; + int r; + + substring = PyUnicode_Substring(s, start, end); + if (substring == NULL) return 0; - kind = PyUnicode_KIND(s); - if (PyUnicode_MAX_CHAR_VALUE(s) > output->maxchar) { - Py_UCS4 maxchar = output->maxchar; - for (i = start; i < end; i++) - if (PyUnicode_READ(kind, PyUnicode_DATA(s), i) > maxchar) - maxchar = PyUnicode_READ(kind, PyUnicode_DATA(s), i); - if (!output_widen(output, maxchar)) - return 0; - } - for (i = start; i < end; i++) - PyUnicode_WRITE(output->kind, output->data, output->pos++, - PyUnicode_READ(kind, PyUnicode_DATA(s), i)); - return 1; + r = _PyAccu_Accumulate(acc, substring); + Py_DECREF(substring); + return r == 0; } /************************************************************************/ @@ -612,7 +522,7 @@ appends to the output. */ static int -render_field(PyObject *fieldobj, SubString *format_spec, OutputString *output) +render_field(PyObject *fieldobj, SubString *format_spec, _PyAccu *acc) { int ok = 0; PyObject *result = NULL; @@ -655,7 +565,7 @@ goto done; assert(PyUnicode_Check(result)); - ok = output_data(output, result, 0, PyUnicode_GET_LENGTH(result)); + ok = output_data(acc, result, 0, PyUnicode_GET_LENGTH(result)); done: Py_XDECREF(format_spec_object); Py_XDECREF(result); @@ -920,7 +830,7 @@ static int output_markup(SubString *field_name, SubString *format_spec, int format_spec_needs_expanding, Py_UCS4 conversion, - OutputString *output, PyObject *args, PyObject *kwargs, + _PyAccu *acc, PyObject *args, PyObject *kwargs, int recursion_depth, AutoNumber *auto_number) { PyObject *tmp = NULL; @@ -961,7 +871,7 @@ else actual_format_spec = format_spec; - if (render_field(fieldobj, actual_format_spec, output) == 0) + if (render_field(fieldobj, actual_format_spec, acc) == 0) goto done; result = 1; @@ -981,7 +891,7 @@ */ static int do_markup(SubString *input, PyObject *args, PyObject *kwargs, - OutputString *output, int recursion_depth, AutoNumber *auto_number) + _PyAccu *acc, int recursion_depth, AutoNumber *auto_number) { MarkupIterator iter; int format_spec_needs_expanding; @@ -997,11 +907,11 @@ &field_name, &format_spec, &conversion, &format_spec_needs_expanding)) == 2) { - if (!output_data(output, literal.str, literal.start, literal.end)) + if (!output_data(acc, literal.str, literal.start, literal.end)) return 0; if (field_present) if (!output_markup(&field_name, &format_spec, - format_spec_needs_expanding, conversion, output, + format_spec_needs_expanding, conversion, acc, args, kwargs, recursion_depth, auto_number)) return 0; } @@ -1017,39 +927,25 @@ build_string(SubString *input, PyObject *args, PyObject *kwargs, int recursion_depth, AutoNumber *auto_number) { - OutputString output; - PyObject *result = NULL; - - output.data = NULL; /* needed so cleanup code always works */ + _PyAccu acc; /* check the recursion level */ if (recursion_depth <= 0) { PyErr_SetString(PyExc_ValueError, "Max string recursion exceeded"); - goto done; + return NULL; } - /* initial size is the length of the format string, plus the size - increment. seems like a reasonable default */ - if (!output_initialize(&output, - input->end - input->start + - INITIAL_SIZE_INCREMENT)) - goto done; + if (_PyAccu_Init(&acc)) + return NULL; - if (!do_markup(input, args, kwargs, &output, recursion_depth, + if (!do_markup(input, args, kwargs, &acc, recursion_depth, auto_number)) { - goto done; + _PyAccu_Destroy(&acc); + return NULL; } - result = PyUnicode_New(output.pos, output.maxchar); - if (!result) - goto done; - memcpy(PyUnicode_DATA(result), output.data, output.pos << (output.kind-1)); - -done: - if (output.data) - PyMem_Free(output.data); - return result; + return _PyAccu_Finish(&acc); } /************************************************************************/ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 02:38:37 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 02:38:37 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_memory_consumption_esti?= =?utf8?q?mate_in_test=5Funicode=5Frepr=5Fwide?= Message-ID: http://hg.python.org/cpython/rev/e5ab233f1122 changeset: 72781:e5ab233f1122 user: Antoine Pitrou date: Fri Oct 07 02:35:00 2011 +0200 summary: Fix memory consumption estimate in test_unicode_repr_wide (on Martin's buildbot it still seems a bit inaccurate) files: Lib/test/test_bigmem.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -715,7 +715,7 @@ finally: r = s = None - @bigmemtest(size=_2G // 5 + 1, memuse=ucs4_char_size + ascii_char_size * 10) + @bigmemtest(size=_2G // 5 + 1, memuse=ucs4_char_size * 2 + ascii_char_size * 10) def test_unicode_repr_wide(self, size): char = "\U0001DCBA" s = char * size -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 7 04:06:23 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 07 Oct 2011 04:06:23 +0200 Subject: [Python-checkins] Daily reference leaks (e5ab233f1122): sum=0 Message-ID: results for e5ab233f1122 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogG7oAtO', '-x'] From python-checkins at python.org Fri Oct 7 04:30:33 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 04:30:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Migrate_the_=5Fcsv_module_t?= =?utf8?q?o_the_new_unicode_APIs?= Message-ID: http://hg.python.org/cpython/rev/f2adbb1065eb changeset: 72782:f2adbb1065eb user: Antoine Pitrou date: Fri Oct 07 04:26:55 2011 +0200 summary: Migrate the _csv module to the new unicode APIs (except for a Py_UNICODE_strchr() call) files: Modules/_csv.c | 121 ++++++++++++++++++------------------ 1 files changed, 61 insertions(+), 60 deletions(-) diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -47,9 +47,9 @@ PyObject_HEAD int doublequote; /* is " represented by ""? */ - Py_UNICODE delimiter; /* field separator */ - Py_UNICODE quotechar; /* quote character */ - Py_UNICODE escapechar; /* escape character */ + Py_UCS4 delimiter; /* field separator */ + Py_UCS4 quotechar; /* quote character */ + Py_UCS4 escapechar; /* escape character */ int skipinitialspace; /* ignore spaces following delimiter? */ PyObject *lineterminator; /* string to write between records */ int quoting; /* style of quoting to write */ @@ -68,7 +68,7 @@ PyObject *fields; /* field list for current record */ ParserState state; /* current CSV parse state */ - Py_UNICODE *field; /* build current field in here */ + Py_UCS4 *field; /* temporary buffer */ Py_ssize_t field_size; /* size of allocated buffer */ Py_ssize_t field_len; /* length of current field */ int numeric_field; /* treat field as numeric */ @@ -86,7 +86,7 @@ DialectObj *dialect; /* parsing dialect */ - Py_UNICODE *rec; /* buffer for parser.join */ + Py_UCS4 *rec; /* buffer for parser.join */ Py_ssize_t rec_size; /* size of allocated record */ Py_ssize_t rec_len; /* length of record */ int num_fields; /* number of fields in record */ @@ -121,7 +121,7 @@ } static PyObject * -get_nullchar_as_None(Py_UNICODE c) +get_nullchar_as_None(Py_UCS4 c) { if (c == '\0') { Py_INCREF(Py_None); @@ -199,25 +199,23 @@ } static int -_set_char(const char *name, Py_UNICODE *target, PyObject *src, Py_UNICODE dflt) +_set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt) { if (src == NULL) *target = dflt; else { *target = '\0'; if (src != Py_None) { - Py_UNICODE *buf; Py_ssize_t len; - buf = PyUnicode_AsUnicode(src); len = PyUnicode_GetSize(src); - if (buf == NULL || len > 1) { + if (len > 1) { PyErr_Format(PyExc_TypeError, "\"%s\" must be an 1-character string", name); return -1; } if (len > 0) - *target = buf[0]; + *target = PyUnicode_READ_CHAR(src, 0); } } return 0; @@ -498,7 +496,8 @@ { PyObject *field; - field = PyUnicode_FromUnicode(self->field, self->field_len); + field = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, + (void *) self->field, self->field_len); if (field == NULL) return -1; self->field_len = 0; @@ -507,11 +506,9 @@ self->numeric_field = 0; tmp = PyNumber_Float(field); - if (tmp == NULL) { - Py_DECREF(field); + Py_DECREF(field); + if (tmp == NULL) return -1; - } - Py_DECREF(field); field = tmp; } PyList_Append(self->fields, field); @@ -526,16 +523,16 @@ self->field_size = 4096; if (self->field != NULL) PyMem_Free(self->field); - self->field = PyMem_New(Py_UNICODE, self->field_size); + self->field = PyMem_New(Py_UCS4, self->field_size); } else { - Py_UNICODE *field = self->field; + Py_UCS4 *field = self->field; if (self->field_size > PY_SSIZE_T_MAX / 2) { PyErr_NoMemory(); return 0; } self->field_size *= 2; - self->field = PyMem_Resize(field, Py_UNICODE, self->field_size); + self->field = PyMem_Resize(field, Py_UCS4, self->field_size); } if (self->field == NULL) { PyErr_NoMemory(); @@ -545,7 +542,7 @@ } static int -parse_add_char(ReaderObj *self, Py_UNICODE c) +parse_add_char(ReaderObj *self, Py_UCS4 c) { if (self->field_len >= field_limit) { PyErr_Format(error_obj, "field larger than field limit (%ld)", @@ -559,7 +556,7 @@ } static int -parse_process_char(ReaderObj *self, Py_UNICODE c) +parse_process_char(ReaderObj *self, Py_UCS4 c) { DialectObj *dialect = self->dialect; @@ -744,10 +741,12 @@ static PyObject * Reader_iternext(ReaderObj *self) { + PyObject *fields = NULL; + Py_UCS4 c; + Py_ssize_t pos, linelen; + unsigned int kind; + void *data; PyObject *lineobj; - PyObject *fields = NULL; - Py_UNICODE *line, c; - Py_ssize_t linelen; if (parse_reset(self) < 0) return NULL; @@ -771,14 +770,12 @@ return NULL; } ++self->line_num; - line = PyUnicode_AsUnicode(lineobj); - linelen = PyUnicode_GetSize(lineobj); - if (line == NULL || linelen < 0) { - Py_DECREF(lineobj); - return NULL; - } + kind = PyUnicode_KIND(lineobj); + data = PyUnicode_DATA(lineobj); + pos = 0; + linelen = PyUnicode_GET_LENGTH(lineobj); while (linelen--) { - c = *line++; + c = PyUnicode_READ(kind, data, pos); if (c == '\0') { Py_DECREF(lineobj); PyErr_Format(error_obj, @@ -789,6 +786,7 @@ Py_DECREF(lineobj); goto err; } + pos++; } Py_DECREF(lineobj); if (parse_process_char(self, 0) < 0) @@ -945,8 +943,9 @@ * record length. */ static Py_ssize_t -join_append_data(WriterObj *self, Py_UNICODE *field, int quote_empty, - int *quoted, int copy_phase) +join_append_data(WriterObj *self, unsigned int field_kind, void *field_data, + Py_ssize_t field_len, int quote_empty, int *quoted, + int copy_phase) { DialectObj *dialect = self->dialect; int i; @@ -976,13 +975,10 @@ /* Copy/count field data */ /* If field is null just pass over */ - for (i = 0; field; i++) { - Py_UNICODE c = field[i]; + for (i = 0; field_data && (i < field_len); i++) { + Py_UCS4 c = PyUnicode_READ(field_kind, field_data, i); int want_escape = 0; - if (c == '\0') - break; - if (c == dialect->delimiter || c == dialect->escapechar || c == dialect->quotechar || @@ -1049,13 +1045,13 @@ self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; if (self->rec != NULL) PyMem_Free(self->rec); - self->rec = PyMem_New(Py_UNICODE, self->rec_size); + self->rec = PyMem_New(Py_UCS4, self->rec_size); } else { - Py_UNICODE* old_rec = self->rec; + Py_UCS4* old_rec = self->rec; self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; - self->rec = PyMem_Resize(old_rec, Py_UNICODE, self->rec_size); + self->rec = PyMem_Resize(old_rec, Py_UCS4, self->rec_size); if (self->rec == NULL) PyMem_Free(old_rec); } @@ -1068,11 +1064,20 @@ } static int -join_append(WriterObj *self, Py_UNICODE *field, int *quoted, int quote_empty) +join_append(WriterObj *self, PyObject *field, int *quoted, int quote_empty) { + unsigned int field_kind = -1; + void *field_data = NULL; + Py_ssize_t field_len = 0; Py_ssize_t rec_len; - rec_len = join_append_data(self, field, quote_empty, quoted, 0); + if (field != NULL) { + field_kind = PyUnicode_KIND(field); + field_data = PyUnicode_DATA(field); + field_len = PyUnicode_GET_LENGTH(field); + } + rec_len = join_append_data(self, field_kind, field_data, field_len, + quote_empty, quoted, 0); if (rec_len < 0) return 0; @@ -1080,7 +1085,8 @@ if (!join_check_rec_size(self, rec_len)) return 0; - self->rec_len = join_append_data(self, field, quote_empty, quoted, 1); + self->rec_len = join_append_data(self, field_kind, field_data, field_len, + quote_empty, quoted, 1); self->num_fields++; return 1; @@ -1089,10 +1095,11 @@ static int join_append_lineterminator(WriterObj *self) { - Py_ssize_t terminator_len; - Py_UNICODE *terminator; + Py_ssize_t terminator_len, i; + unsigned int term_kind; + void *term_data; - terminator_len = PyUnicode_GetSize(self->dialect->lineterminator); + terminator_len = PyUnicode_GET_LENGTH(self->dialect->lineterminator); if (terminator_len == -1) return 0; @@ -1100,11 +1107,10 @@ if (!join_check_rec_size(self, self->rec_len + terminator_len)) return 0; - terminator = PyUnicode_AsUnicode(self->dialect->lineterminator); - if (terminator == NULL) - return 0; - memmove(self->rec + self->rec_len, terminator, - sizeof(Py_UNICODE)*terminator_len); + term_kind = PyUnicode_KIND(self->dialect->lineterminator); + term_data = PyUnicode_DATA(self->dialect->lineterminator); + for (i = 0; i < terminator_len; i++) + self->rec[self->rec_len + i] = PyUnicode_READ(term_kind, term_data, i); self->rec_len += terminator_len; return 1; @@ -1154,14 +1160,11 @@ } if (PyUnicode_Check(field)) { - append_ok = join_append(self, - PyUnicode_AS_UNICODE(field), - "ed, len == 1); + append_ok = join_append(self, field, "ed, len == 1); Py_DECREF(field); } else if (field == Py_None) { - append_ok = join_append(self, NULL, - "ed, len == 1); + append_ok = join_append(self, NULL, "ed, len == 1); Py_DECREF(field); } else { @@ -1171,9 +1174,7 @@ Py_DECREF(field); if (str == NULL) return NULL; - append_ok = join_append(self, - PyUnicode_AS_UNICODE(str), - "ed, len == 1); + append_ok = join_append(self, str, "ed, len == 1); Py_DECREF(str); } if (!append_ok) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 04:39:07 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 04:39:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_Py=5FUCS4_/_Py=5FUNIC?= =?utf8?q?ODE_mixup=2E?= Message-ID: http://hg.python.org/cpython/rev/27f6fd87375f changeset: 72783:27f6fd87375f user: Antoine Pitrou date: Fri Oct 07 04:35:30 2011 +0200 summary: Fix a Py_UCS4 / Py_UNICODE mixup. This worked under Unix because wchar_t is 4 bytes wide. files: Modules/_csv.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1127,6 +1127,7 @@ { DialectObj *dialect = self->dialect; Py_ssize_t len, i; + PyObject *line, *result; if (!PySequence_Check(seq)) return PyErr_Format(error_obj, "sequence expected"); @@ -1186,9 +1187,13 @@ if (!join_append_lineterminator(self)) return 0; - return PyObject_CallFunction(self->writeline, - "(u#)", self->rec, - self->rec_len); + line = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, + (void *) self->rec, self->rec_len); + if (line == NULL) + return NULL; + result = PyObject_CallFunctionObjArgs(self->writeline, line, NULL); + Py_DECREF(line); + return result; } PyDoc_STRVAR(csv_writerows_doc, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 09:02:08 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 7 Oct 2011 09:02:08 +0200 (CEST) Subject: [Python-checkins] r88904 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3SFMGm1PxJzPLm@mail.python.org> Author: ezio.melotti Date: Fri Oct 7 09:02:07 2011 New Revision: 88904 Log: #422: add keyword shortcuts to navigate through the messages and to reply. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Fri Oct 7 09:02:07 2011 @@ -45,20 +45,88 @@ $(document).ready(function() { - /* When the user hits the 'end' key the first time, jump to the last - message rather than to the end of the page. After that restore the - normal 'end' behavior. */ - // get the offset to the last message - var offset = $('table.messages tr th a:last').offset() + /* Keyboard shortcuts */ + function is_editing(node) { + // return true if the focus is on a form element + var element = node.nodeName; + return ((element == 'TEXTAREA') || (element == 'SELECT') || + (element == 'INPUT' && node.type != 'file')); + } + function scroll_to(node) { + // scroll the page to the given node + window.scrollTo(0, node.offset().top) + } + function add_help() { + // add some help to the sidebar + $(['
  • Keyboard shortcuts', + ''].join('\n')).appendTo('div#menu ul.level-two'); + // the empty are just an hack to get the style right, + // this help will anyway be moved to the devguide soon + } + add_help() + var textarea = $('textarea').first(); + var messages = $('table.messages tr th a:first-child'); + var last_index = messages.length - 1; + // start from -1 so 'n' sends to the first message at the beginning + var current = -1; $(document).keydown(function (event) { - var node = event.target.nodeName; - // 35 == end key. Don't do anything if the focus is on form elements - if ((event.keyCode == 35) && (node != 'TEXTAREA') - && (node != 'INPUT') && (node != 'SELECT')) { - // jump at the last message and restore the usual behavior - window.scrollTo(0, offset.top); - $(document).unbind('keydown') - return false; + // disable the shortcuts while editing form elements (except ESC) + if (is_editing(event.target)) { + // ESC - unfocus the form + if (event.keyCode == 27) { + $(event.target).blur(); + return false; + } + return true; + } + + // support two groups of shortcuts for first/prev/next/last/reply: + // mnemonics: f/p/n/l/r + // vim-style: h/k/j/l/i + switch (event.which) { + // f/h - first + case 70: + case 72: + scroll_to(messages.first()); + current = 0; + return false; + // p/k - previous + case 80: + case 75: + if (current <= 0) + return false; + scroll_to(messages.eq(--current)); + return false; + // n/j - next + case 78: + case 74: + if (current >= last_index) + return false; + scroll_to(messages.eq(++current)); + return false; + // l - last + case 76: + scroll_to(messages.last()); + current = last_index; + return false; + // r/i - reply + case 82: + case 73: + // do nothing if the textarea is not available + if (textarea.length == 0) + return false; + scroll_to(textarea); + textarea.focus(); + return false; + default: + return true; } }); }) From python-checkins at python.org Fri Oct 7 10:02:04 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 07 Oct 2011 10:02:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_str=2Ereplace=28a=2C_a=29_i?= =?utf8?q?s_now_returning_str_unchanged_if_a_is_a?= Message-ID: http://hg.python.org/cpython/rev/9c1b76936b79 changeset: 72784:9c1b76936b79 user: Victor Stinner date: Fri Oct 07 10:01:28 2011 +0200 summary: str.replace(a, a) is now returning str unchanged if a is a files: Lib/test/test_unicode.py | 6 ++++++ Objects/unicodeobject.c | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -275,6 +275,12 @@ self.checkequalnofix('one at two!three!', 'one!two!three!', 'replace', '!', '@', 1) self.assertRaises(TypeError, 'replace'.replace, "r", 42) + @support.cpython_only + def test_replace_id(self): + a = 'a' # single ascii letters are singletons + text = 'abc' + self.assertIs(text.replace('a', 'a'), text) + def test_bytes_comparison(self): with support.check_warnings(): warnings.simplefilter('ignore', BytesWarning) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9604,6 +9604,8 @@ else if (maxcount == 0 || slen == 0) goto nothing; + if (str1 == str2) + goto nothing; if (skind < kind1) /* substring too wide to be present */ goto nothing; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 11:19:16 2011 From: python-checkins at python.org (georg.brandl) Date: Fri, 07 Oct 2011 11:19:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_C_API_docs_for_PEP_3?= =?utf8?b?OTMu?= Message-ID: http://hg.python.org/cpython/rev/fe65c75c9f9d changeset: 72785:fe65c75c9f9d user: Georg Brandl date: Fri Oct 07 11:19:11 2011 +0200 summary: Update C API docs for PEP 393. files: Doc/c-api/long.rst | 14 + Doc/c-api/module.rst | 2 +- Doc/c-api/unicode.rst | 610 +++++++++++++++++++++++---- Include/unicodeobject.h | 2 +- 4 files changed, 521 insertions(+), 107 deletions(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -100,6 +100,20 @@ string is first encoded to a byte string using :c:func:`PyUnicode_EncodeDecimal` and then converted using :c:func:`PyLong_FromString`. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyLong_FromUnicodeObject`. + + +.. c:function:: PyObject* PyLong_FromUnicodeObject(PyObject *u, int base) + + Convert a sequence of Unicode digits in the string *u* to a Python integer + value. The Unicode string is first encoded to a byte string using + :c:func:`PyUnicode_EncodeDecimal` and then converted using + :c:func:`PyLong_FromString`. + + .. versionadded:: 3.3 + .. c:function:: PyObject* PyLong_FromVoidPtr(void *p) diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst --- a/Doc/c-api/module.rst +++ b/Doc/c-api/module.rst @@ -87,7 +87,7 @@ Return the name of the file from which *module* was loaded using *module*'s :attr:`__file__` attribute. If this is not defined, or if it is not a unicode string, raise :exc:`SystemError` and return *NULL*; otherwise return - a reference to a :c:type:`PyUnicodeObject`. + a reference to a Unicode object. .. versionadded:: 3.2 diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -6,38 +6,58 @@ -------------------------- .. sectionauthor:: Marc-Andre Lemburg +.. sectionauthor:: Georg Brandl Unicode Objects ^^^^^^^^^^^^^^^ +Since the implementation of :pep:`393` in Python 3.3, Unicode objects internally +use a variety of representations, in order to allow handling the complete range +of Unicode characters while staying memory efficient. There are special cases +for strings where all code points are below 128, 256, or 65536; otherwise, code +points must be below 1114112 (which is the full Unicode range). + +:c:type:`Py_UNICODE*` and UTF-8 representations are created on demand and cached +in the Unicode object. + + Unicode Type """""""""""" These are the basic Unicode object types used for the Unicode implementation in Python: +.. c:type:: Py_UCS4 + Py_UCS2 + Py_UCS1 + + These types are typedefs for unsigned integer types wide enough to contain + characters of 32 bits, 16 bits and 8 bits, respectively. When dealing with + single Unicode characters, use :c:type:`Py_UCS4`. + + .. versionadded:: 3.3 + .. c:type:: Py_UNICODE - This type represents the storage type which is used by Python internally as - basis for holding Unicode ordinals. Python's default builds use a 16-bit type - for :c:type:`Py_UNICODE` and store Unicode values internally as UCS2. It is also - possible to build a UCS4 version of Python (most recent Linux distributions come - with UCS4 builds of Python). These builds then use a 32-bit type for - :c:type:`Py_UNICODE` and store Unicode data internally as UCS4. On platforms - where :c:type:`wchar_t` is available and compatible with the chosen Python - Unicode build variant, :c:type:`Py_UNICODE` is a typedef alias for - :c:type:`wchar_t` to enhance native platform compatibility. On all other - platforms, :c:type:`Py_UNICODE` is a typedef alias for either :c:type:`unsigned - short` (UCS2) or :c:type:`unsigned long` (UCS4). + This is a typedef of :c:type:`wchar_t`, which is a 16-bit type or 32-bit type + depending on the platform. -Note that UCS2 and UCS4 Python builds are not binary compatible. Please keep -this in mind when writing extensions or interfaces. + .. versionchanged:: 3.3 + In previous versions, this was a 16-bit type or a 32-bit type depending on + whether you selected a "narrow" or "wide" Unicode version of Python at + build time. -.. c:type:: PyUnicodeObject +.. c:type:: PyASCIIObject + PyCompactUnicodeObject + PyUnicodeObject - This subtype of :c:type:`PyObject` represents a Python Unicode object. + These subtypes of :c:type:`PyObject` represent a Python Unicode object. In + almost all cases, they shouldn't be used directly, since all API functions + that deal with Unicode objects take and return :c:type:`PyObject` pointers. + + .. versionadded:: 3.3 .. c:var:: PyTypeObject PyUnicode_Type @@ -45,10 +65,10 @@ This instance of :c:type:`PyTypeObject` represents the Python Unicode type. It is exposed to Python code as ``str``. + The following APIs are really C macros and can be used to do fast checks and to access internal read-only data of Unicode objects: - .. c:function:: int PyUnicode_Check(PyObject *o) Return true if the object *o* is a Unicode object or an instance of a Unicode @@ -63,26 +83,161 @@ .. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) - Return the size of the object. *o* has to be a :c:type:`PyUnicodeObject` (not - checked). + Return the size of the deprecated :c:type:`Py_UNICODE` representation, in + code units (this includes surrogate pairs as 2 units). *o* has to be a + Unicode object (not checked). + + .. deprecated-removed:: 3.3 4.0 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_GET_LENGTH`. .. c:function:: Py_ssize_t PyUnicode_GET_DATA_SIZE(PyObject *o) - Return the size of the object's internal buffer in bytes. *o* has to be a - :c:type:`PyUnicodeObject` (not checked). + Return the size of the deprecated :c:type:`Py_UNICODE` representation in + bytes. *o* has to be a Unicode object (not checked). + + .. deprecated-removed:: 3.3 4.0 + Part of the old-style Unicode API, please migrate to using + :c:func:`PyUnicode_GET_LENGTH` or :c:func:`PyUnicode_KIND_SIZE`. .. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o) + const char* PyUnicode_AS_DATA(PyObject *o) - Return a pointer to the internal :c:type:`Py_UNICODE` buffer of the object. *o* - has to be a :c:type:`PyUnicodeObject` (not checked). + Return a pointer to a :c:type:`Py_UNICODE` representation of the object. The + ``AS_DATA`` form casts the pointer to :c:type:`const char *`. *o* has to be + a Unicode object (not checked). + .. versionchanged:: 3.3 + This macro is now inefficient -- because in many cases the + :c:type:`Py_UNICODE` representation does not exist and needs to be created + -- and can fail (return *NULL* with an exception set). Try to port the + code to use the new :c:func:`PyUnicode_nBYTE_DATA` macros or use + :c:func:`PyUnicode_WRITE` or :c:func:`PyUnicode_READ`. -.. c:function:: const char* PyUnicode_AS_DATA(PyObject *o) + .. deprecated-removed:: 3.3 4.0 + Part of the old-style Unicode API, please migrate to using the + :c:func:`PyUnicode_nBYTE_DATA` family of macros. - Return a pointer to the internal buffer of the object. *o* has to be a - :c:type:`PyUnicodeObject` (not checked). + +.. c:function:: int PyUnicode_READY(PyObject *o) + + Ensure the string object *o* is in the "canonical" representation. This is + required before using any of the access macros described below. + + .. XXX expand on when it is not required + + Returns 0 on success and -1 with an exception set on failure, which in + particular happens if memory allocation fails. + + .. versionadded:: 3.3 + + +.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) + + Return the length of the Unicode string, in code points. *o* has to be a + Unicode object in the "canonical" representation (not checked). + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o) + Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o) + Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o) + + Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 + integer types for direct character access. No checks are performed if the + canonical representation has the correct character size; use + :c:func:`PyUnicode_CHARACTER_SIZE` or :c:func:`PyUnicode_KIND` to select the + right macro. Make sure :c:func:`PyUnicode_READY` has been called before + accessing this. + + .. versionadded:: 3.3 + + +.. c:macro:: PyUnicode_1BYTE_KIND + PyUnicode_2BYTE_KIND + PyUnicode_4BYTE_KIND + + Return values of the :c:func:`PyUnicode_KIND` macro. + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_KIND(PyObject *o) + + Return one of the PyUnicode kind constants (see above) that indicate how many + bytes per character this Unicode object uses to store its data. *o* has to + be a Unicode object in the "canonical" representation (not checked). + + .. XXX document "0" return value? + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_CHARACTER_SIZE(PyObject *o) + + Return the number of bytes the string uses to represent single characters; + this can be 1, 2 or 4. *o* has to be a Unicode object in the "canonical" + representation (not checked). + + .. versionadded:: 3.3 + + +.. c:function:: void* PyUnicode_DATA(PyObject *o) + + Return a void pointer to the raw unicode buffer. *o* has to be a Unicode + object in the "canonical" representation (not checked). + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_KIND_SIZE(int kind, Py_ssize_t index) + + Compute ``index * char_size`` where ``char_size`` is ``2**(kind - 1)``. The + index is a character index, the result is a size in bytes. + + .. versionadded:: 3.3 + + +.. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \ + Py_UCS4 value) + + Write into a canonical representation *data* (as obtained with + :c:func:`PyUnicode_DATA`). This macro does not do any sanity checks and is + intended for usage in loops. The caller should cache the *kind* value and + *data* pointer as obtained from other macro calls. *index* is the index in + the string (starts at 0) and *value* is the new code point value which should + be written to that location. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index) + + Read a code point from a canonical representation *data* (as obtained with + :c:func:`PyUnicode_DATA`). No checks or ready calls are performed. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index) + + Read a character from a Unicode object *o*, which must be in the "canonical" + representation. This is less efficient than :c:func:`PyUnicode_READ` if you + do multiple consecutive reads. + + .. versionadded:: 3.3 + + +.. c:function:: PyUnicode_MAX_CHAR_VALUE(PyObject *o) + + Return the maximum code point that is suitable for creating another string + based on *o*, which must be in the "canonical" representation. This is + always an approximation but more efficient than iterating over the string. + + .. versionadded:: 3.3 .. c:function:: int PyUnicode_ClearFreeList() @@ -216,31 +371,45 @@ surrogate pair. -Plain Py_UNICODE -"""""""""""""""" +Creating and accessing Unicode strings +"""""""""""""""""""""""""""""""""""""" To create Unicode objects and access their basic sequence properties, use these APIs: +.. c:function:: PyObject* PyUnicode_New(Py_ssize_t size, Py_UCS4 maxchar) -.. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) + Create a new Unicode object. *maxchar* should be the true maximum code point + to be placed in the string. As an approximation, it can be rounded up to the + nearest value in the sequence 127, 255, 65535, 1114111. - Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u* - may be *NULL* which causes the contents to be undefined. It is the user's - responsibility to fill in the needed data. The buffer is copied into the new - object. If the buffer is not *NULL*, the return value might be a shared object. - Therefore, modification of the resulting Unicode object is only allowed when *u* - is *NULL*. + This is the recommended way to allocate a new Unicode object. Objects + created using this function are not resizable. + + .. versionadded:: 3.3 + + +.. c:function:: PyObject* PyUnicode_FromKindAndData(int kind, const void *buffer, \ + Py_ssize_t size) + + Create a new Unicode object with the given *kind* (possible values are + :c:macro:`PyUnicode_1BYTE_KIND` etc., as returned by + :c:func:`PyUnicode_KIND`). The *buffer* must point to an array of *size* + units of 1, 2 or 4 bytes per character, as given by the kind. + + .. versionadded:: 3.3 .. c:function:: PyObject* PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) - Create a Unicode object from the char buffer *u*. The bytes will be interpreted - as being UTF-8 encoded. *u* may also be *NULL* which - causes the contents to be undefined. It is the user's responsibility to fill in - the needed data. The buffer is copied into the new object. If the buffer is not - *NULL*, the return value might be a shared object. Therefore, modification of - the resulting Unicode object is only allowed when *u* is *NULL*. + Create a Unicode object from the char buffer *u*. The bytes will be + interpreted as being UTF-8 encoded. The buffer is copied into the new + object. If the buffer is not *NULL*, the return value might be a shared + object, i.e. modification of the data is not allowed. + + If *u* is *NULL*, this function behaves like :c:func:`PyUnicode_FromUnicode` + with the buffer set to *NULL*. This usage is deprecated in favor of + :c:func:`PyUnicode_New`. .. c:function:: PyObject *PyUnicode_FromString(const char *u) @@ -361,36 +530,9 @@ Identical to :c:func:`PyUnicode_FromFormat` except that it takes exactly two arguments. -.. c:function:: PyObject* PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size) - Create a Unicode object by replacing all decimal digits in - :c:type:`Py_UNICODE` buffer of the given *size* by ASCII digits 0--9 - according to their decimal value. Return *NULL* if an exception - occurs. - - -.. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode) - - Return a read-only pointer to the Unicode object's internal :c:type:`Py_UNICODE` - buffer, *NULL* if *unicode* is not a Unicode object. - - -.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) - - Create a copy of a Unicode string ending with a nul character. Return *NULL* - and raise a :exc:`MemoryError` exception on memory allocation failure, - otherwise return a new allocated buffer (use :c:func:`PyMem_Free` to free the - buffer). - - .. versionadded:: 3.2 - - -.. c:function:: Py_ssize_t PyUnicode_GetSize(PyObject *unicode) - - Return the length of the Unicode object. - - -.. c:function:: PyObject* PyUnicode_FromEncodedObject(PyObject *obj, const char *encoding, const char *errors) +.. c:function:: PyObject* PyUnicode_FromEncodedObject(PyObject *obj, \ + const char *encoding, const char *errors) Coerce an encoded object *obj* to an Unicode object and return a reference with incremented refcount. @@ -407,16 +549,158 @@ decref'ing the returned objects. +.. c:function:: Py_ssize_t PyUnicode_GetLength(PyObject *unicode) + + Return the length of the Unicode object, in code points. + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_CopyCharacters(PyObject *to, Py_ssize_t to_start, \ + PyObject *to, Py_ssize_t from_start, Py_ssize_t how_many) + + Copy characters from one Unicode object into another. This function performs + character conversion when necessary and falls back to :c:func:`memcpy` if + possible. Returns ``-1`` and sets an exception on error, otherwise returns + ``0``. + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_WriteChar(PyObject *unicode, Py_ssize_t index, \ + Py_UCS4 character) + + Write a character to a string. The string must have been created through + :c:func:`PyUnicode_New`. Since Unicode strings are supposed to be immutable, + the string must not be shared, or have been hashed yet. + + This function checks that *unicode* is a Unicode object, that the index is + not out of bounds, and that the object can be modified safely (i.e. that it + its reference count is one), in contrast to the macro version + :c:func:`PyUnicode_WRITE_CHAR`. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4 PyUnicode_ReadChar(PyObject *unicode, Py_ssize_t index) + + Read a character from a string. This function checks that *unicode* is a + Unicode object and the index is not out of bounds, in contrast to the macro + version :c:func:`PyUnicode_READ_CHAR`. + + .. versionadded:: 3.3 + + +.. c:function:: PyObject* PyUnicode_Substring(PyObject *str, Py_ssize_t start, \ + Py_ssize_t end) + + Return a substring of *str*, from character index *start* (included) to + character index *end* (excluded). Negative indices are not supported. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4* PyUnicode_AsUCS4(PyObject *u, Py_UCS4 *buffer, \ + Py_ssize_t buflen, int copy_null) + + Copy the string *u* into a UCS4 buffer, including a null character, if + *copy_null* is set. Returns *NULL* and sets an exception on error (in + particular, a :exc:`ValueError` if *buflen* is smaller than the length of + *u*). *buffer* is returned on success. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4* PyUnicode_AsUCS4Copy(PyObject *u) + + Copy the string *u* into a new UCS4 buffer that is allocated using + :c:func:`PyMem_Malloc`. If this fails, *NULL* is returned with a + :exc:`MemoryError` set. + + .. versionadded:: 3.3 + + +Deprecated Py_UNICODE APIs +"""""""""""""""""""""""""" + +.. deprecated-removed:: 3.3 4.0 + +These API functions are deprecated with the implementation of :pep:`393`. +Extension modules can continue using them, as they will not be removed in Python +3.x, but need to be aware that their use can now cause performance and memory hits. + + +.. c:function:: PyObject* PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) + + Create a Unicode object from the Py_UNICODE buffer *u* of the given size. *u* + may be *NULL* which causes the contents to be undefined. It is the user's + responsibility to fill in the needed data. The buffer is copied into the new + object. + + If the buffer is not *NULL*, the return value might be a shared object. + Therefore, modification of the resulting Unicode object is only allowed when + *u* is *NULL*. + + If the buffer is *NULL*, :c:func:`PyUnicode_READY` must be called once the + string content has been filled before using any of the access macros such as + :c:func:`PyUnicode_KIND`. + + Please migrate to using :c:func:`PyUnicode_FromKindAndData` or + :c:func:`PyUnicode_New`. + + +.. c:function:: Py_UNICODE* PyUnicode_AsUnicode(PyObject *unicode) + + Return a read-only pointer to the Unicode object's internal + :c:type:`Py_UNICODE` buffer, *NULL* if *unicode* is not a Unicode object. + This will create the :c:type:`Py_UNICODE` representation of the object if it + is not yet available. + + Please migrate to using :c:func:`PyUnicode_AsUCS4`, + :c:func:`PyUnicode_Substring`, :c:func:`PyUnicode_ReadChar` or similar new + APIs. + + +.. c:function:: PyObject* PyUnicode_TransformDecimalToASCII(Py_UNICODE *s, Py_ssize_t size) + + Create a Unicode object by replacing all decimal digits in + :c:type:`Py_UNICODE` buffer of the given *size* by ASCII digits 0--9 + according to their decimal value. Return *NULL* if an exception occurs. + + +.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) + + Like :c:func:`PyUnicode_AsUnicode`, but also saves the :c:func:`Py_UNICODE` + array length in *size*. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) + + Create a copy of a Unicode string ending with a nul character. Return *NULL* + and raise a :exc:`MemoryError` exception on memory allocation failure, + otherwise return a new allocated buffer (use :c:func:`PyMem_Free` to free the + buffer). + + .. versionadded:: 3.2 + + Please migrate to using :c:func:`PyUnicode_AsUCS4Copy` or similar new APIs. + + +.. c:function:: Py_ssize_t PyUnicode_GetSize(PyObject *unicode) + + Return the size of the deprecated :c:type:`Py_UNICODE` representation, in + code units (this includes surrogate pairs as 2 units). + + Please migrate to using :c:func:`PyUnicode_GetLength`. + + .. c:function:: PyObject* PyUnicode_FromObject(PyObject *obj) Shortcut for ``PyUnicode_FromEncodedObject(obj, NULL, "strict")`` which is used throughout the interpreter whenever coercion to Unicode is needed. -If the platform supports :c:type:`wchar_t` and provides a header file wchar.h, -Python can interface directly to this type using the following functions. -Support is optimized if Python's own :c:type:`Py_UNICODE` type is identical to -the system's :c:type:`wchar_t`. - File System Encoding """""""""""""""""""" @@ -526,6 +810,26 @@ .. versionadded:: 3.2 +UCS4 Support +"""""""""""" + +.. versionadded:: 3.3 + +.. XXX are these meant to be public? + +.. c:function:: size_t Py_UCS4_strlen(const Py_UCS4 *u) + Py_UCS4* Py_UCS4_strcpy(Py_UCS4 *s1, const Py_UCS4 *s2) + Py_UCS4* Py_UCS4_strncpy(Py_UCS4 *s1, const Py_UCS4 *s2, size_t n) + Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2) + int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2) + int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n) + Py_UCS4* strchr(const Py_UCS4 *s, Py_UCS4 c) + Py_UCS4* strrchr(const Py_UCS4 *s, Py_UCS4 c) + + These utility functions work on strings of :c:type:`Py_UCS4` characters and + otherwise behave like the C standard library functions with the same name. + + .. _builtincodecs: Built-in Codecs @@ -560,7 +864,8 @@ These are the generic codec APIs: -.. c:function:: PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, const char *encoding, const char *errors) +.. c:function:: PyObject* PyUnicode_Decode(const char *s, Py_ssize_t size, \ + const char *encoding, const char *errors) Create a Unicode object by decoding *size* bytes of the encoded string *s*. *encoding* and *errors* have the same meaning as the parameters of the same name @@ -569,7 +874,8 @@ the codec. -.. c:function:: PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, const char *encoding, const char *errors) +.. c:function:: PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, \ + const char *encoding, const char *errors) Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* and return a Python bytes object. *encoding* and *errors* have the same meaning as the @@ -577,8 +883,13 @@ to be used is looked up using the Python codec registry. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsEncodedString`. -.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, const char *encoding, const char *errors) + +.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, \ + const char *encoding, const char *errors) Encode a Unicode object and return the result as Python bytes object. *encoding* and *errors* have the same meaning as the parameters of the same @@ -599,7 +910,8 @@ *s*. Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) +.. c:function:: PyObject* PyUnicode_DecodeUTF8Stateful(const char *s, Py_ssize_t size, \ + const char *errors, Py_ssize_t *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF8`. If *consumed* is not *NULL*, trailing incomplete UTF-8 byte sequences will not be @@ -613,6 +925,10 @@ return a Python bytes object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsUTF8String` or :c:func:`PyUnicode_AsUTF8AndSize`. + .. c:function:: PyObject* PyUnicode_AsUTF8String(PyObject *unicode) @@ -621,13 +937,37 @@ raised by the codec. +.. c:function:: char* PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size) + + Return a pointer to the default encoding (UTF-8) of the Unicode object, and + store the size of the encoded representation (in bytes) in *size*. *size* + can be *NULL*, in this case no size will be stored. + + In the case of an error, *NULL* is returned with an exception set and no + *size* is stored. + + This caches the UTF-8 representation of the string in the Unicode object, and + subsequent calls will return a pointer to the same buffer. The caller is not + responsible for deallocating the buffer. + + .. versionadded:: 3.3 + + +.. c:function:: char* PyUnicode_AsUTF8(PyObject *unicode) + + As :c:func:`PyUnicode_AsUTF8AndSize`, but does not store the size. + + .. versionadded:: 3.3 + + UTF-32 Codecs """"""""""""" These are the UTF-32 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, const char *errors, int *byteorder) +.. c:function:: PyObject* PyUnicode_DecodeUTF32(const char *s, Py_ssize_t size, \ + const char *errors, int *byteorder) Decode *size* bytes from a UTF-32 encoded buffer string and return the corresponding Unicode object. *errors* (if non-*NULL*) defines the error @@ -655,7 +995,8 @@ Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) +.. c:function:: PyObject* PyUnicode_DecodeUTF32Stateful(const char *s, Py_ssize_t size, \ + const char *errors, int *byteorder, Py_ssize_t *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF32`. If *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF32Stateful` will not treat @@ -664,7 +1005,8 @@ that have been decoded will be stored in *consumed*. -.. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder) +.. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, \ + const char *errors, int byteorder) Return a Python bytes object holding the UTF-32 encoded value of the Unicode data in *s*. Output is written according to the following byte order:: @@ -681,6 +1023,10 @@ Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsUTF32String`. + .. c:function:: PyObject* PyUnicode_AsUTF32String(PyObject *unicode) @@ -695,7 +1041,8 @@ These are the UTF-16 codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors, int *byteorder) +.. c:function:: PyObject* PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, \ + const char *errors, int *byteorder) Decode *size* bytes from a UTF-16 encoded buffer string and return the corresponding Unicode object. *errors* (if non-*NULL*) defines the error @@ -722,7 +1069,8 @@ Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, const char *errors, int *byteorder, Py_ssize_t *consumed) +.. c:function:: PyObject* PyUnicode_DecodeUTF16Stateful(const char *s, Py_ssize_t size, \ + const char *errors, int *byteorder, Py_ssize_t *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF16`. If *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeUTF16Stateful` will not treat @@ -731,7 +1079,8 @@ number of bytes that have been decoded will be stored in *consumed*. -.. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, const char *errors, int byteorder) +.. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, \ + const char *errors, int byteorder) Return a Python bytes object holding the UTF-16 encoded value of the Unicode data in *s*. Output is written according to the following byte order:: @@ -749,6 +1098,10 @@ Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsUTF16String`. + .. c:function:: PyObject* PyUnicode_AsUTF16String(PyObject *unicode) @@ -769,7 +1122,8 @@ *s*. Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, const char *errors, Py_ssize_t *consumed) +.. c:function:: PyObject* PyUnicode_DecodeUTF7Stateful(const char *s, Py_ssize_t size, \ + const char *errors, Py_ssize_t *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeUTF7`. If *consumed* is not *NULL*, trailing incomplete UTF-7 base-64 sections will not @@ -777,7 +1131,8 @@ bytes that have been decoded will be stored in *consumed*. -.. c:function:: PyObject* PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, int base64SetO, int base64WhiteSpace, const char *errors) +.. c:function:: PyObject* PyUnicode_EncodeUTF7(const Py_UNICODE *s, Py_ssize_t size, \ + int base64SetO, int base64WhiteSpace, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given size using UTF-7 and return a Python bytes object. Return *NULL* if an exception was raised by @@ -788,6 +1143,11 @@ nonzero, whitespace will be encoded in base-64. Both are set to zero for the Python "utf-7" codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API. + + .. XXX replace with what? + Unicode-Escape Codecs """"""""""""""""""""" @@ -795,7 +1155,8 @@ These are the "Unicode Escape" codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeUnicodeEscape(const char *s, \ + Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the Unicode-Escape encoded string *s*. Return *NULL* if an exception was raised by the codec. @@ -807,6 +1168,10 @@ return a Python string object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsUnicodeEscapeString`. + .. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode) @@ -821,18 +1186,24 @@ These are the "Raw Unicode Escape" codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeRawUnicodeEscape(const char *s, \ + Py_ssize_t size, const char *errors) Create a Unicode object by decoding *size* bytes of the Raw-Unicode-Escape encoded string *s*. Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size, const char *errors) +.. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, \ + Py_ssize_t size, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Raw-Unicode-Escape and return a Python string object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsRawUnicodeEscapeString`. + .. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) @@ -860,6 +1231,10 @@ return a Python bytes object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsLatin1String`. + .. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode) @@ -887,6 +1262,10 @@ return a Python bytes object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsASCIIString`. + .. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode) @@ -921,7 +1300,8 @@ These are the mapping codec APIs: -.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, PyObject *mapping, const char *errors) +.. c:function:: PyObject* PyUnicode_DecodeCharmap(const char *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) Create a Unicode object by decoding *size* bytes of the encoded string *s* using the given *mapping* object. Return *NULL* if an exception was raised by the @@ -931,12 +1311,17 @@ treated as "undefined mapping". -.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *mapping, const char *errors) +.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given *mapping* object and return a Python string object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsCharmapString`. + .. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) @@ -947,7 +1332,8 @@ The following codec API is special in that maps Unicode to Unicode. -.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, PyObject *table, const char *errors) +.. c:function:: PyObject* PyUnicode_TranslateCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *table, const char *errors) Translate a :c:type:`Py_UNICODE` buffer of the given *size* by applying a character mapping *table* to it and return the resulting Unicode object. Return @@ -960,6 +1346,10 @@ and sequences work well. Unmapped character ordinals (ones which cause a :exc:`LookupError`) are left untouched and are copied as-is. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API. + + .. XXX replace with what? MBCS codecs for Windows @@ -976,7 +1366,8 @@ Return *NULL* if an exception was raised by the codec. -.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, int size, const char *errors, int *consumed) +.. c:function:: PyObject* PyUnicode_DecodeMBCSStateful(const char *s, int size, \ + const char *errors, int *consumed) If *consumed* is *NULL*, behave like :c:func:`PyUnicode_DecodeMBCS`. If *consumed* is not *NULL*, :c:func:`PyUnicode_DecodeMBCSStateful` will not decode @@ -990,6 +1381,10 @@ a Python bytes object. Return *NULL* if an exception was raised by the codec. + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsMBCSString`. + .. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode) @@ -1034,7 +1429,8 @@ characters are not included in the resulting strings. -.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, const char *errors) +.. c:function:: PyObject* PyUnicode_Translate(PyObject *str, PyObject *table, \ + const char *errors) Translate a string by applying a character mapping table to it and return the resulting Unicode object. @@ -1056,14 +1452,16 @@ Unicode string. -.. c:function:: int PyUnicode_Tailmatch(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) +.. c:function:: int PyUnicode_Tailmatch(PyObject *str, PyObject *substr, \ + Py_ssize_t start, Py_ssize_t end, int direction) Return 1 if *substr* matches ``str[start:end]`` at the given tail end (*direction* == -1 means to do a prefix match, *direction* == 1 a suffix match), 0 otherwise. Return ``-1`` if an error occurred. -.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end, int direction) +.. c:function:: Py_ssize_t PyUnicode_Find(PyObject *str, PyObject *substr, \ + Py_ssize_t start, Py_ssize_t end, int direction) Return the first position of *substr* in ``str[start:end]`` using the given *direction* (*direction* == 1 means to do a forward search, *direction* == -1 a @@ -1072,7 +1470,8 @@ occurred and an exception has been set. -.. c:function:: Py_ssize_t PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, Py_ssize_t start, Py_ssize_t end, int direction) +.. c:function:: Py_ssize_t PyUnicode_FindChar(PyObject *str, Py_UCS4 ch, \ + Py_ssize_t start, Py_ssize_t end, int direction) Return the first position of the character *ch* in ``str[start:end]`` using the given *direction* (*direction* == 1 means to do a forward search, @@ -1083,13 +1482,15 @@ .. versionadded:: 3.3 -.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, Py_ssize_t start, Py_ssize_t end) +.. c:function:: Py_ssize_t PyUnicode_Count(PyObject *str, PyObject *substr, \ + Py_ssize_t start, Py_ssize_t end) Return the number of non-overlapping occurrences of *substr* in ``str[start:end]``. Return ``-1`` if an error occurred. -.. c:function:: PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, PyObject *replstr, Py_ssize_t maxcount) +.. c:function:: PyObject* PyUnicode_Replace(PyObject *str, PyObject *substr, \ + PyObject *replstr, Py_ssize_t maxcount) Replace at most *maxcount* occurrences of *substr* in *str* with *replstr* and return the resulting Unicode object. *maxcount* == -1 means replace all @@ -1137,8 +1538,8 @@ Check whether *element* is contained in *container* and return true or false accordingly. - *element* has to coerce to a one element Unicode string. ``-1`` is returned if - there was an error. + *element* has to coerce to a one element Unicode string. ``-1`` is returned + if there was an error. .. c:function:: void PyUnicode_InternInPlace(PyObject **string) @@ -1157,7 +1558,6 @@ .. c:function:: PyObject* PyUnicode_InternFromString(const char *v) A combination of :c:func:`PyUnicode_FromString` and - :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string object - that has been interned, or a new ("owned") reference to an earlier interned - string object with the same value. - + :c:func:`PyUnicode_InternInPlace`, returning either a new unicode string + object that has been interned, or a new ("owned") reference to an earlier + interned string object with the same value. diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -686,7 +686,7 @@ Py_ssize_t start, Py_ssize_t end); -/* Copy the string into a UCS4 buffer including the null character is copy_null +/* Copy the string into a UCS4 buffer including the null character if copy_null is set. Return NULL and raise an exception on error. Raise a ValueError if the buffer is smaller than the string. Return buffer on success. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 12:39:28 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 12:39:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_formatting_memory_consu?= =?utf8?q?mption_with_very_large_padding_specifications?= Message-ID: http://hg.python.org/cpython/rev/023ca78c67a0 changeset: 72786:023ca78c67a0 user: Antoine Pitrou date: Fri Oct 07 12:35:48 2011 +0200 summary: Fix formatting memory consumption with very large padding specifications files: Objects/unicodeobject.c | 36 ++++++++++++++++++++++------ 1 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12727,6 +12727,29 @@ return (Py_UCS4) -1; } +static int +repeat_accumulate(_PyAccu *acc, PyObject *obj, Py_ssize_t count) +{ + int r; + assert(count > 0); + assert(PyUnicode_Check(obj)); + if (count > 5) { + PyObject *repeated = unicode_repeat((PyUnicodeObject *) obj, count); + if (repeated == NULL) + return -1; + r = _PyAccu_Accumulate(acc, repeated); + Py_DECREF(repeated); + return r; + } + else { + do { + if (_PyAccu_Accumulate(acc, obj)) + return -1; + } while (--count); + return 0; + } +} + PyObject * PyUnicode_Format(PyObject *format, PyObject *args) { @@ -13145,10 +13168,9 @@ } if (width > len && !(flags & F_LJUST)) { assert(fillobj != NULL); - do { - if (_PyAccu_Accumulate(&acc, fillobj)) - goto onError; - } while (--width > len); + if (repeat_accumulate(&acc, fillobj, width - len)) + goto onError; + width = len; } if (fill == ' ') { if (sign) { @@ -13186,10 +13208,8 @@ Py_DECREF(v); if (r) goto onError; - while (--width >= len) { - if (_PyAccu_Accumulate(&acc, blank)) - goto onError; - } + if (width > len && repeat_accumulate(&acc, blank, width - len)) + goto onError; if (dict && (argidx < arglen) && c != '%') { PyErr_SetString(PyExc_TypeError, "not all arguments converted during string formatting"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 13:31:35 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 13:31:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_platform=2Elibc=5Fver?= =?utf8?q?=28=29_less_slow?= Message-ID: http://hg.python.org/cpython/rev/e55219affc7d changeset: 72787:e55219affc7d user: Antoine Pitrou date: Fri Oct 07 13:26:59 2011 +0200 summary: Make platform.libc_ver() less slow files: Lib/platform.py | 25 +++++++++++++++---------- 1 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -130,15 +130,15 @@ ### Platform specific APIs -_libc_search = re.compile(r'(__libc_init)' - '|' - '(GLIBC_([0-9.]+))' - '|' - '(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII) +_libc_search = re.compile(b'(__libc_init)' + b'|' + b'(GLIBC_([0-9.]+))' + b'|' + br'(libc(_\w+)?\.so(?:\.(\d[0-9.]*))?)', re.ASCII) def libc_ver(executable=sys.executable,lib='',version='', - chunksize=2048): + chunksize=16384): """ Tries to determine the libc version that the file executable (which defaults to the Python interpreter) is linked against. @@ -159,17 +159,22 @@ # able to open symlinks for reading executable = os.path.realpath(executable) f = open(executable,'rb') - binary = f.read(chunksize).decode('latin-1') + binary = f.read(chunksize) pos = 0 while 1: - m = _libc_search.search(binary,pos) + if b'libc' in binary or b'GLIBC' in binary: + m = _libc_search.search(binary,pos) + else: + m = None if not m: - binary = f.read(chunksize).decode('latin-1') + binary = f.read(chunksize) if not binary: break pos = 0 continue - libcinit,glibc,glibcversion,so,threads,soversion = m.groups() + libcinit,glibc,glibcversion,so,threads,soversion = [ + s.decode('latin1') if s is not None else s + for s in m.groups()] if libcinit and not lib: lib = 'libc' elif glibc: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 13:32:43 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 07 Oct 2011 13:32:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Mark_=27abc=27=2Eexpandtab?= =?utf8?q?=28=29_optimization_as_specific_to_CPython?= Message-ID: http://hg.python.org/cpython/rev/e3d5b718f2e6 changeset: 72788:e3d5b718f2e6 user: Victor Stinner date: Fri Oct 07 13:31:46 2011 +0200 summary: Mark 'abc'.expandtab() optimization as specific to CPython Improve also str.replace(a, a) test files: Lib/test/test_unicode.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -277,9 +277,9 @@ @support.cpython_only def test_replace_id(self): - a = 'a' # single ascii letters are singletons - text = 'abc' - self.assertIs(text.replace('a', 'a'), text) + pattern = 'abc' + text = 'abc def' + self.assertIs(text.replace(pattern, pattern), text) def test_bytes_comparison(self): with support.check_warnings(): @@ -1579,6 +1579,7 @@ return self.assertRaises(OverflowError, 't\tt\t'.expandtabs, sys.maxsize) + @support.cpython_only def test_expandtabs_optimization(self): s = 'abc' self.assertIs(s.expandtabs(), s) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 13:45:13 2011 From: python-checkins at python.org (georg.brandl) Date: Fri, 07 Oct 2011 13:45:13 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_typo=2E?= Message-ID: http://hg.python.org/peps/rev/13a807801221 changeset: 3956:13a807801221 user: Georg Brandl date: Fri Oct 07 13:45:01 2011 +0200 summary: Fix typo. files: pep-0393.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0393.txt b/pep-0393.txt --- a/pep-0393.txt +++ b/pep-0393.txt @@ -94,7 +94,7 @@ immediately follow the base structure. If the maximum character is less than 128, they use the PyASCIIObject structure, and the UTF-8 data, the UTF-8 length and the wstr length are the same as the length -and the ASCII data. For non-ASCII strings, the PyCompactObject +of the ASCII data. For non-ASCII strings, the PyCompactObject structure is used. Resizing compact objects is not supported. Objects for which the maximum character is not given at creation time -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 7 15:55:03 2011 From: python-checkins at python.org (meador.inge) Date: Fri, 07 Oct 2011 15:55:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312943=3A_python_-m?= =?utf8?q?_tokenize_support_has_been_added_to_tokenize=2E?= Message-ID: http://hg.python.org/cpython/rev/85254bb6c1c6 changeset: 72789:85254bb6c1c6 user: Meador Inge date: Fri Oct 07 08:53:38 2011 -0500 summary: Issue #12943: python -m tokenize support has been added to tokenize. files: Doc/library/tokenize.rst | 57 ++++++++++++++++++++ Lib/tokenize.py | 79 +++++++++++++++++++-------- Misc/NEWS | 2 + 3 files changed, 115 insertions(+), 23 deletions(-) diff --git a/Doc/library/tokenize.rst b/Doc/library/tokenize.rst --- a/Doc/library/tokenize.rst +++ b/Doc/library/tokenize.rst @@ -15,6 +15,9 @@ as well, making it useful for implementing "pretty-printers," including colorizers for on-screen displays. +Tokenizing Input +---------------- + The primary entry point is a :term:`generator`: .. function:: tokenize(readline) @@ -116,6 +119,26 @@ .. versionadded:: 3.2 +.. _tokenize-cli: + +Command-Line Usage +------------------ + +.. versionadded:: 3.3 + +The :mod:`tokenize` module can be executed as a script from the command line. +It is as simple as: + +.. code-block:: sh + + python -m tokenize [filename.py] + +If :file:`filename.py` is specified its contents are tokenized to stdout. +Otherwise, tokenization is performed on stdin. + +Examples +------------------ + Example of a script rewriter that transforms float literals into Decimal objects:: @@ -158,3 +181,37 @@ result.append((toknum, tokval)) return untokenize(result).decode('utf-8') +Example of tokenizing from the command line. The script:: + + def say_hello(): + print("Hello, World!") + + say_hello() + +will be tokenized to the following output where the first column is the range +of the line/column coordinates where the token is found, the second column is +the name of the token, and the final column is the value of the token (if any) + +.. code-block:: sh + + $ python -m tokenize hello.py + 0,0-0,0: ENCODING 'utf-8' + 1,0-1,3: NAME 'def' + 1,4-1,13: NAME 'say_hello' + 1,13-1,14: OP '(' + 1,14-1,15: OP ')' + 1,15-1,16: OP ':' + 1,16-1,17: NEWLINE '\n' + 2,0-2,4: INDENT ' ' + 2,4-2,9: NAME 'print' + 2,9-2,10: OP '(' + 2,10-2,25: STRING '"Hello, World!"' + 2,25-2,26: OP ')' + 2,26-2,27: NEWLINE '\n' + 3,0-3,1: NL '\n' + 4,0-4,0: DEDENT '' + 4,0-4,9: NAME 'say_hello' + 4,9-4,10: OP '(' + 4,10-4,11: OP ')' + 4,11-4,12: NEWLINE '\n' + 5,0-5,0: ENDMARKER '' diff --git a/Lib/tokenize.py b/Lib/tokenize.py --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -530,27 +530,60 @@ def generate_tokens(readline): return _tokenize(readline, None) +def main(): + import argparse + + # Helper error handling routines + def perror(message): + print(message, file=sys.stderr) + + def error(message, filename=None, location=None): + if location: + args = (filename,) + location + (message,) + perror("%s:%d:%d: error: %s" % args) + elif filename: + perror("%s: error: %s" % (filename, message)) + else: + perror("error: %s" % message) + sys.exit(1) + + # Parse the arguments and options + parser = argparse.ArgumentParser(prog='python -m tokenize') + parser.add_argument(dest='filename', nargs='?', + metavar='filename.py', + help='the file to tokenize; defaults to stdin') + args = parser.parse_args() + + try: + # Tokenize the input + if args.filename: + filename = args.filename + with builtins.open(filename, 'rb') as f: + tokens = list(tokenize(f.readline)) + else: + filename = "" + tokens = _tokenize(sys.stdin.readline, None) + + # Output the tokenization + for token in tokens: + token_range = "%d,%d-%d,%d:" % (token.start + token.end) + print("%-20s%-15s%-15r" % + (token_range, tok_name[token.type], token.string)) + except IndentationError as err: + line, column = err.args[1][1:3] + error(err.args[0], filename, (line, column)) + except TokenError as err: + line, column = err.args[1] + error(err.args[0], filename, (line, column)) + except SyntaxError as err: + error(err, filename) + except IOError as err: + error(err) + except KeyboardInterrupt: + print("interrupted\n") + except Exception as err: + perror("unexpected error: %s" % err) + raise + if __name__ == "__main__": - # Quick sanity check - s = b'''def parseline(self, line): - """Parse the line into a command name and a string containing - the arguments. Returns a tuple containing (command, args, line). - 'command' and 'args' may be None if the line couldn't be parsed. - """ - line = line.strip() - if not line: - return None, None, line - elif line[0] == '?': - line = 'help ' + line[1:] - elif line[0] == '!': - if hasattr(self, 'do_shell'): - line = 'shell ' + line[1:] - else: - return None, None, line - i, n = 0, len(line) - while i < n and line[i] in self.identchars: i = i+1 - cmd, arg = line[:i], line[i:].strip() - return cmd, arg, line - ''' - for tok in tokenize(iter(s.splitlines()).__next__): - print(tok) + main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2520,6 +2520,8 @@ Library ------- +- Issue #12943: python -m tokenize support has been added to tokenize. + - Issue #10465: fix broken delegating of attributes by gzip._PaddedFile. - Issue #10356: Decimal.__hash__(-1) should return -2. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 16:22:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 16:22:06 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDYz?= =?utf8?q?=3A_the_Windows_error_ERROR=5FNO=5FDATA_=28numbered_232_and_desc?= =?utf8?q?ribed?= Message-ID: http://hg.python.org/cpython/rev/d8d8374ddbcc changeset: 72790:d8d8374ddbcc branch: 3.2 parent: 72777:5a4018570a59 user: Antoine Pitrou date: Fri Oct 07 16:16:31 2011 +0200 summary: Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described as "The pipe is being closed") is now mapped to POSIX errno EPIPE (previously EINVAL). files: Misc/NEWS | 4 ++++ PC/errmap.h | 1 + PC/generrmap.c | 3 +++ 3 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described + as "The pipe is being closed") is now mapped to POSIX errno EPIPE + (previously EINVAL). + - Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists. diff --git a/PC/errmap.h b/PC/errmap.h --- a/PC/errmap.h +++ b/PC/errmap.h @@ -72,6 +72,7 @@ case 202: return 8; case 206: return 2; case 215: return 11; + case 232: return 32; case 267: return 20; case 1816: return 12; default: return EINVAL; diff --git a/PC/generrmap.c b/PC/generrmap.c --- a/PC/generrmap.c +++ b/PC/generrmap.c @@ -19,6 +19,9 @@ /* Issue #12802 */ if (i == ERROR_DIRECTORY) errno = ENOTDIR; + /* Issue #13063 */ + else if (i == ERROR_NO_DATA) + errno = EPIPE; else continue; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 16:22:07 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 16:22:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313063=3A_the_Windows_error_ERROR=5FNO=5FDATA_=28num?= =?utf8?q?bered_232_and_described?= Message-ID: http://hg.python.org/cpython/rev/3784b6000640 changeset: 72791:3784b6000640 parent: 72789:85254bb6c1c6 parent: 72790:d8d8374ddbcc user: Antoine Pitrou date: Fri Oct 07 16:17:50 2011 +0200 summary: Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described as "The pipe is being closed") is now mapped to POSIX errno EPIPE (previously EINVAL). files: Misc/NEWS | 4 ++++ PC/errmap.h | 1 + PC/generrmap.c | 3 +++ 3 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described + as "The pipe is being closed") is now mapped to POSIX errno EPIPE + (previously EINVAL). + - Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists. diff --git a/PC/errmap.h b/PC/errmap.h --- a/PC/errmap.h +++ b/PC/errmap.h @@ -72,6 +72,7 @@ case 202: return 8; case 206: return 2; case 215: return 11; + case 232: return 32; case 267: return 20; case 1816: return 12; default: return EINVAL; diff --git a/PC/generrmap.c b/PC/generrmap.c --- a/PC/generrmap.c +++ b/PC/generrmap.c @@ -19,6 +19,9 @@ /* Issue #12802 */ if (i == ERROR_DIRECTORY) errno = ENOTDIR; + /* Issue #13063 */ + else if (i == ERROR_NO_DATA) + errno = EPIPE; else continue; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 17:02:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 17:02:18 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEyODIz?= =?utf8?q?=3A_remove_broken_link_and_replace_it_with_another_resource=2E?= Message-ID: http://hg.python.org/cpython/rev/459f5e10cd4f changeset: 72792:459f5e10cd4f branch: 3.2 parent: 72790:d8d8374ddbcc user: Antoine Pitrou date: Fri Oct 07 16:58:07 2011 +0200 summary: Issue #12823: remove broken link and replace it with another resource. files: Doc/library/ssl.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -990,8 +990,8 @@ Class :class:`socket.socket` Documentation of underlying :mod:`socket` class - `Introducing SSL and Certificates using OpenSSL `_ - Frederick J. Hirsch + `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ + Debby Koren `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 17:02:24 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 17:02:24 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2312823=3A_remove_broken_link_and_replace_it_with_ano?= =?utf8?q?ther_resource=2E?= Message-ID: http://hg.python.org/cpython/rev/e80121fd12ba changeset: 72793:e80121fd12ba parent: 72791:3784b6000640 parent: 72792:459f5e10cd4f user: Antoine Pitrou date: Fri Oct 07 16:58:35 2011 +0200 summary: Issue #12823: remove broken link and replace it with another resource. files: Doc/library/ssl.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1057,8 +1057,8 @@ Class :class:`socket.socket` Documentation of underlying :mod:`socket` class - `Introducing SSL and Certificates using OpenSSL `_ - Frederick J. Hirsch + `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ + Debby Koren `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 17:08:25 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 07 Oct 2011 17:08:25 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEyODIz?= =?utf8?q?=3A_remove_broken_link_and_replace_it_with_another_resource=2E?= Message-ID: http://hg.python.org/cpython/rev/666e7e325795 changeset: 72794:666e7e325795 branch: 2.7 parent: 72776:add444274c3d user: Antoine Pitrou date: Fri Oct 07 17:03:01 2011 +0200 summary: Issue #12823: remove broken link and replace it with another resource. files: Doc/library/ssl.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -622,8 +622,8 @@ Class :class:`socket.socket` Documentation of underlying :mod:`socket` class - `Introducing SSL and Certificates using OpenSSL `_ - Frederick J. Hirsch + `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ + Debby Koren `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 17:17:36 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 07 Oct 2011 17:17:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FJoin=28=29_call?= =?utf8?q?s_directly_memcpy=28=29_if_all_strings_are_of_the_same_kind?= Message-ID: http://hg.python.org/cpython/rev/16118ea2192b changeset: 72795:16118ea2192b parent: 72793:e80121fd12ba user: Victor Stinner date: Fri Oct 07 17:02:31 2011 +0200 summary: PyUnicode_Join() calls directly memcpy() if all strings are of the same kind files: Objects/unicodeobject.c | 65 ++++++++++++++++++++++++---- 1 files changed, 56 insertions(+), 9 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9124,7 +9124,7 @@ PyUnicode_Join(PyObject *separator, PyObject *seq) { PyObject *sep = NULL; - Py_ssize_t seplen = 1; + Py_ssize_t seplen; PyObject *res = NULL; /* the result */ PyObject *fseq; /* PySequence_Fast(seq) */ Py_ssize_t seqlen; /* len(fseq) -- number of items in sequence */ @@ -9133,6 +9133,10 @@ Py_ssize_t sz, i, res_offset; Py_UCS4 maxchar; Py_UCS4 item_maxchar; + int use_memcpy; + unsigned char *res_data = NULL, *sep_data = NULL; + PyObject *last_obj; + unsigned int kind = 0; fseq = PySequence_Fast(seq, ""); if (fseq == NULL) { @@ -9153,6 +9157,7 @@ } /* If singleton sequence with an exact Unicode, return that. */ + last_obj = NULL; items = PySequence_Fast_ITEMS(fseq); if (seqlen == 1) { if (PyUnicode_CheckExact(items[0])) { @@ -9161,7 +9166,7 @@ Py_DECREF(fseq); return res; } - sep = NULL; + seplen = 0; maxchar = 0; } else { @@ -9171,6 +9176,7 @@ sep = PyUnicode_FromOrdinal(' '); if (!sep) goto onError; + seplen = 1; maxchar = 32; } else { @@ -9190,6 +9196,7 @@ above case of a blank separator */ Py_INCREF(sep); } + last_obj = sep; } /* There are at least two things to join, or else we have a subclass @@ -9198,6 +9205,11 @@ * need (sz), and see whether all argument are strings. */ sz = 0; +#ifdef Py_DEBUG + use_memcpy = 0; +#else + use_memcpy = 1; +#endif for (i = 0; i < seqlen; i++) { const Py_ssize_t old_sz = sz; item = items[i]; @@ -9220,6 +9232,11 @@ "join() result is too long for a Python string"); goto onError; } + if (use_memcpy && last_obj != NULL) { + if (PyUnicode_KIND(last_obj) != PyUnicode_KIND(item)) + use_memcpy = 0; + } + last_obj = item; } res = PyUnicode_New(sz, maxchar); @@ -9227,21 +9244,51 @@ goto onError; /* Catenate everything. */ +#ifdef Py_DEBUG + use_memcpy = 0; +#else + if (use_memcpy) { + res_data = PyUnicode_1BYTE_DATA(res); + kind = PyUnicode_KIND(res); + if (seplen != 0) + sep_data = PyUnicode_1BYTE_DATA(sep); + } +#endif for (i = 0, res_offset = 0; i < seqlen; ++i) { Py_ssize_t itemlen; item = items[i]; /* Copy item, and maybe the separator. */ if (i && seplen != 0) { - copy_characters(res, res_offset, sep, 0, seplen); - res_offset += seplen; + if (use_memcpy) { + Py_MEMCPY(res_data, + sep_data, + PyUnicode_KIND_SIZE(kind, seplen)); + res_data += PyUnicode_KIND_SIZE(kind, seplen); + } + else { + copy_characters(res, res_offset, sep, 0, seplen); + res_offset += seplen; + } } itemlen = PyUnicode_GET_LENGTH(item); if (itemlen != 0) { - copy_characters(res, res_offset, item, 0, itemlen); - res_offset += itemlen; - } - } - assert(res_offset == PyUnicode_GET_LENGTH(res)); + if (use_memcpy) { + Py_MEMCPY(res_data, + PyUnicode_DATA(item), + PyUnicode_KIND_SIZE(kind, itemlen)); + res_data += PyUnicode_KIND_SIZE(kind, itemlen); + } + else { + copy_characters(res, res_offset, item, 0, itemlen); + res_offset += itemlen; + } + } + } + if (use_memcpy) + assert(res_data == PyUnicode_1BYTE_DATA(res) + + PyUnicode_KIND_SIZE(kind, PyUnicode_GET_LENGTH(res))); + else + assert(res_offset == PyUnicode_GET_LENGTH(res)); Py_DECREF(fseq); Py_XDECREF(sep); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 18:45:07 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 7 Oct 2011 18:45:07 +0200 (CEST) Subject: [Python-checkins] r88905 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3SFcCR53F9zPFc@mail.python.org> Author: ezio.melotti Date: Fri Oct 7 18:45:07 2011 New Revision: 88905 Log: #422: do nothing if ctrl/alt/shift are pressed. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Fri Oct 7 18:45:07 2011 @@ -77,6 +77,10 @@ // start from -1 so 'n' sends to the first message at the beginning var current = -1; $(document).keydown(function (event) { + // do nothing if ctrl/alt/shift are pressed + if (event.ctrlKey || event.altKey || event.shiftKey) + return true; + // disable the shortcuts while editing form elements (except ESC) if (is_editing(event.target)) { // ESC - unfocus the form From python-checkins at python.org Fri Oct 7 20:58:08 2011 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 07 Oct 2011 20:58:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Change_PyUnicode=5FKIND_to_?= =?utf8?q?1=2C2=2C4=2E_Drop_=5FKIND=5FSIZE_and_=5FCHARACTER=5FSIZE=2E?= Message-ID: http://hg.python.org/cpython/rev/c25262e97304 changeset: 72796:c25262e97304 user: Martin v. L?wis date: Fri Oct 07 20:55:35 2011 +0200 summary: Change PyUnicode_KIND to 1,2,4. Drop _KIND_SIZE and _CHARACTER_SIZE. files: Doc/c-api/unicode.rst | 24 +----- Include/unicodeobject.h | 35 ++------- Modules/_io/textio.c | 44 +++++------ Modules/_json.c | 4 +- Modules/_sre.c | 2 +- Objects/stringlib/eq.h | 2 +- Objects/unicodeobject.c | 92 ++++++++++++------------- Python/formatter_unicode.c | 4 +- 8 files changed, 84 insertions(+), 123 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -99,7 +99,7 @@ .. deprecated-removed:: 3.3 4.0 Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_GET_LENGTH` or :c:func:`PyUnicode_KIND_SIZE`. + :c:func:`PyUnicode_GET_LENGTH`. .. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o) @@ -149,9 +149,8 @@ Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the canonical representation has the correct character size; use - :c:func:`PyUnicode_CHARACTER_SIZE` or :c:func:`PyUnicode_KIND` to select the - right macro. Make sure :c:func:`PyUnicode_READY` has been called before - accessing this. + :c:func:`PyUnicode_KIND` to select the right macro. Make sure + :c:func:`PyUnicode_READY` has been called before accessing this. .. versionadded:: 3.3 @@ -176,15 +175,6 @@ .. versionadded:: 3.3 -.. c:function:: int PyUnicode_CHARACTER_SIZE(PyObject *o) - - Return the number of bytes the string uses to represent single characters; - this can be 1, 2 or 4. *o* has to be a Unicode object in the "canonical" - representation (not checked). - - .. versionadded:: 3.3 - - .. c:function:: void* PyUnicode_DATA(PyObject *o) Return a void pointer to the raw unicode buffer. *o* has to be a Unicode @@ -193,14 +183,6 @@ .. versionadded:: 3.3 -.. c:function:: int PyUnicode_KIND_SIZE(int kind, Py_ssize_t index) - - Compute ``index * char_size`` where ``char_size`` is ``2**(kind - 1)``. The - index is a character index, the result is a size in bytes. - - .. versionadded:: 3.3 - - .. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \ Py_UCS4 value) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -305,12 +305,12 @@ * character type = Py_UCS2 (16 bits, unsigned) * at least one character must be in range U+0100-U+FFFF - - PyUnicode_4BYTE_KIND (3): + - PyUnicode_4BYTE_KIND (4): * character type = Py_UCS4 (32 bits, unsigned) * at least one character must be in range U+10000-U+10FFFF */ - unsigned int kind:2; + unsigned int kind:3; /* Compact is with respect to the allocation scheme. Compact unicode objects only require one memory block while non-compact objects use one block for the PyUnicodeObject struct and another for its data @@ -424,29 +424,21 @@ #define PyUnicode_IS_COMPACT_ASCII(op) \ (PyUnicode_IS_ASCII(op) && PyUnicode_IS_COMPACT(op)) +enum PyUnicode_Kind { /* String contains only wstr byte characters. This is only possible when the string was created with a legacy API and _PyUnicode_Ready() has not been called yet. */ -#define PyUnicode_WCHAR_KIND 0 - + PyUnicode_WCHAR_KIND = 0, /* Return values of the PyUnicode_KIND() macro: */ - -#define PyUnicode_1BYTE_KIND 1 -#define PyUnicode_2BYTE_KIND 2 -#define PyUnicode_4BYTE_KIND 3 - - -/* Return the number of bytes the string uses to represent single characters, - this can be 1, 2 or 4. - - See also PyUnicode_KIND_SIZE(). */ -#define PyUnicode_CHARACTER_SIZE(op) \ - (((Py_ssize_t)1 << (PyUnicode_KIND(op) - 1))) + PyUnicode_1BYTE_KIND = 1, + PyUnicode_2BYTE_KIND = 2, + PyUnicode_4BYTE_KIND = 4 +}; /* Return pointers to the canonical representation cast to unsigned char, Py_UCS2, or Py_UCS4 for direct character access. - No checks are performed, use PyUnicode_CHARACTER_SIZE or - PyUnicode_KIND() before to ensure these will work correctly. */ + No checks are performed, use PyUnicode_KIND() before to ensure + these will work correctly. */ #define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) #define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) @@ -473,13 +465,6 @@ PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \ _PyUnicode_NONCOMPACT_DATA(op)) -/* Compute (index * char_size) where char_size is 2 ** (kind - 1). - The index is a character index, the result is a size in bytes. - - See also PyUnicode_CHARACTER_SIZE(). */ -#define PyUnicode_KIND_SIZE(kind, index) \ - (((Py_ssize_t)(index)) << ((kind) - 1)) - /* In the access macros below, "kind" may be evaluated more than once. All other macro parameters are evaluated exactly once, so it is safe to put side effects into them (such as increasing the index). */ diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -291,9 +291,7 @@ kind = PyUnicode_KIND(modified); out = PyUnicode_DATA(modified); PyUnicode_WRITE(kind, PyUnicode_DATA(modified), 0, '\r'); - memcpy(out + PyUnicode_KIND_SIZE(kind, 1), - PyUnicode_DATA(output), - PyUnicode_KIND_SIZE(kind, output_len)); + memcpy(out + kind, PyUnicode_DATA(output), kind * output_len); Py_DECREF(output); output = modified; /* output remains ready */ self->pendingcr = 0; @@ -336,7 +334,7 @@ for the \r *byte* with the libc's optimized memchr. */ if (seennl == SEEN_LF || seennl == 0) { - only_lf = (memchr(in_str, '\r', PyUnicode_KIND_SIZE(kind, len)) == NULL); + only_lf = (memchr(in_str, '\r', kind * len) == NULL); } if (only_lf) { @@ -344,7 +342,7 @@ (there's nothing else to be done, even when in translation mode) */ if (seennl == 0 && - memchr(in_str, '\n', PyUnicode_KIND_SIZE(kind, len)) != NULL) { + memchr(in_str, '\n', kind * len) != NULL) { Py_ssize_t i = 0; for (;;) { Py_UCS4 c; @@ -403,7 +401,7 @@ when there is something to translate. On the other hand, we already know there is a \r byte, so chances are high that something needs to be done. */ - translated = PyMem_Malloc(PyUnicode_KIND_SIZE(kind, len)); + translated = PyMem_Malloc(kind * len); if (translated == NULL) { PyErr_NoMemory(); goto error; @@ -1576,15 +1574,14 @@ static char * find_control_char(int kind, char *s, char *end, Py_UCS4 ch) { - int size = PyUnicode_KIND_SIZE(kind, 1); for (;;) { while (PyUnicode_READ(kind, s, 0) > ch) - s += size; + s += kind; if (PyUnicode_READ(kind, s, 0) == ch) return s; if (s == end) return NULL; - s += size; + s += kind; } } @@ -1593,14 +1590,13 @@ int translated, int universal, PyObject *readnl, int kind, char *start, char *end, Py_ssize_t *consumed) { - int size = PyUnicode_KIND_SIZE(kind, 1); - Py_ssize_t len = ((char*)end - (char*)start)/size; + Py_ssize_t len = ((char*)end - (char*)start)/kind; if (translated) { /* Newlines are already translated, only search for \n */ char *pos = find_control_char(kind, start, end, '\n'); if (pos != NULL) - return (pos - start)/size + 1; + return (pos - start)/kind + 1; else { *consumed = len; return -1; @@ -1616,20 +1612,20 @@ /* Fast path for non-control chars. The loop always ends since the Unicode string is NUL-terminated. */ while (PyUnicode_READ(kind, s, 0) > '\r') - s += size; + s += kind; if (s >= end) { *consumed = len; return -1; } ch = PyUnicode_READ(kind, s, 0); - s += size; + s += kind; if (ch == '\n') - return (s - start)/size; + return (s - start)/kind; if (ch == '\r') { if (PyUnicode_READ(kind, s, 0) == '\n') - return (s - start)/size + 1; + return (s - start)/kind + 1; else - return (s - start)/size; + return (s - start)/kind; } } } @@ -1642,13 +1638,13 @@ if (readnl_len == 1) { char *pos = find_control_char(kind, start, end, nl[0]); if (pos != NULL) - return (pos - start)/size + 1; + return (pos - start)/kind + 1; *consumed = len; return -1; } else { char *s = start; - char *e = end - (readnl_len - 1)*size; + char *e = end - (readnl_len - 1)*kind; char *pos; if (e < s) e = s; @@ -1662,14 +1658,14 @@ break; } if (i == readnl_len) - return (pos - start)/size + readnl_len; - s = pos + size; + return (pos - start)/kind + readnl_len; + s = pos + kind; } pos = find_control_char(kind, e, end, nl[0]); if (pos == NULL) *consumed = len; else - *consumed = (pos - start)/size; + *consumed = (pos - start)/kind; return -1; } } @@ -1738,8 +1734,8 @@ endpos = _PyIO_find_line_ending( self->readtranslate, self->readuniversal, self->readnl, kind, - ptr + PyUnicode_KIND_SIZE(kind, start), - ptr + PyUnicode_KIND_SIZE(kind, line_len), + ptr + kind * start, + ptr + kind * line_len, &consumed); if (endpos >= 0) { endpos += start; diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -365,7 +365,7 @@ APPEND_OLD_CHUNK chunk = PyUnicode_FromKindAndData( kind, - (char*)buf + PyUnicode_KIND_SIZE(kind, end), + (char*)buf + kind * end, next - end); if (chunk == NULL) { goto bail; @@ -931,7 +931,7 @@ if (custom_func) { /* copy the section we determined to be a number */ numstr = PyUnicode_FromKindAndData(kind, - (char*)str + PyUnicode_KIND_SIZE(kind, start), + (char*)str + kind * start, idx - start); if (numstr == NULL) return NULL; diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1669,7 +1669,7 @@ return NULL; ptr = PyUnicode_DATA(string); *p_length = PyUnicode_GET_LENGTH(string); - *p_charsize = PyUnicode_CHARACTER_SIZE(string); + *p_charsize = PyUnicode_KIND(string); *p_logical_charsize = 4; return ptr; } diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -30,5 +30,5 @@ PyUnicode_GET_LENGTH(a) == 1) return 1; return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b), - PyUnicode_GET_LENGTH(a) * PyUnicode_CHARACTER_SIZE(a)) == 0; + PyUnicode_GET_LENGTH(a) * PyUnicode_KIND(a)) == 0; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -470,12 +470,12 @@ if (direction == 1) { for(i = 0; i < size; i++) if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + PyUnicode_KIND_SIZE(kind, i); + return (char*)s + kind * i; } else { for(i = size-1; i >= 0; i--) if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + PyUnicode_KIND_SIZE(kind, i); + return (char*)s + kind * i; } return NULL; } @@ -489,7 +489,7 @@ int share_wstr; assert(PyUnicode_IS_READY(unicode)); - char_size = PyUnicode_CHARACTER_SIZE(unicode); + char_size = PyUnicode_KIND(unicode); if (PyUnicode_IS_COMPACT_ASCII(unicode)) struct_size = sizeof(PyASCIIObject); else @@ -540,7 +540,7 @@ data = _PyUnicode_DATA_ANY(unicode); assert(data != NULL); - char_size = PyUnicode_CHARACTER_SIZE(unicode); + char_size = PyUnicode_KIND(unicode); share_wstr = _PyUnicode_SHARE_WSTR(unicode); share_utf8 = _PyUnicode_SHARE_UTF8(unicode); if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) @@ -1005,11 +1005,9 @@ } if (fast) { - Py_MEMCPY((char*)to_data - + PyUnicode_KIND_SIZE(to_kind, to_start), - (char*)from_data - + PyUnicode_KIND_SIZE(from_kind, from_start), - PyUnicode_KIND_SIZE(to_kind, how_many)); + Py_MEMCPY((char*)to_data + to_kind * to_start, + (char*)from_data + from_kind * from_start, + to_kind * how_many); } else if (from_kind == PyUnicode_1BYTE_KIND && to_kind == PyUnicode_2BYTE_KIND) @@ -8760,7 +8758,7 @@ end = PyUnicode_GET_LENGTH(str); kind = PyUnicode_KIND(str); result = findchar(PyUnicode_1BYTE_DATA(str) - + PyUnicode_KIND_SIZE(kind, start), + + kind*start, kind, end-start, ch, direction); if (!result) @@ -8813,10 +8811,10 @@ /* If both are of the same kind, memcmp is sufficient */ if (kind_self == kind_sub) { return ! memcmp((char *)data_self + - (offset * PyUnicode_CHARACTER_SIZE(substring)), + (offset * PyUnicode_KIND(substring)), data_sub, PyUnicode_GET_LENGTH(substring) * - PyUnicode_CHARACTER_SIZE(substring)); + PyUnicode_KIND(substring)); } /* otherwise we have to compare each character by first accesing it */ else { @@ -8881,7 +8879,7 @@ return NULL; Py_MEMCPY(PyUnicode_1BYTE_DATA(u), PyUnicode_1BYTE_DATA(self), - PyUnicode_GET_LENGTH(u) * PyUnicode_CHARACTER_SIZE(u)); + PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); /* fix functions return the new maximum character in a string, if the kind of the resulting unicode object does not change, @@ -9262,8 +9260,8 @@ if (use_memcpy) { Py_MEMCPY(res_data, sep_data, - PyUnicode_KIND_SIZE(kind, seplen)); - res_data += PyUnicode_KIND_SIZE(kind, seplen); + kind * seplen); + res_data += kind * seplen; } else { copy_characters(res, res_offset, sep, 0, seplen); @@ -9275,8 +9273,8 @@ if (use_memcpy) { Py_MEMCPY(res_data, PyUnicode_DATA(item), - PyUnicode_KIND_SIZE(kind, itemlen)); - res_data += PyUnicode_KIND_SIZE(kind, itemlen); + kind * itemlen); + res_data += kind * itemlen; } else { copy_characters(res, res_offset, item, 0, itemlen); @@ -9286,7 +9284,7 @@ } if (use_memcpy) assert(res_data == PyUnicode_1BYTE_DATA(res) - + PyUnicode_KIND_SIZE(kind, PyUnicode_GET_LENGTH(res))); + + kind * PyUnicode_GET_LENGTH(res)); else assert(res_offset == PyUnicode_GET_LENGTH(res)); @@ -9735,22 +9733,22 @@ goto error; res = PyUnicode_DATA(rstr); - memcpy(res, sbuf, PyUnicode_KIND_SIZE(rkind, slen)); + memcpy(res, sbuf, rkind * slen); /* change everything in-place, starting with this one */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, i), + memcpy(res + rkind * i, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); i += len1; while ( --maxcount > 0) { i = anylib_find(rkind, self, - sbuf+PyUnicode_KIND_SIZE(rkind, i), slen-i, + sbuf+rkind*i, slen-i, str1, buf1, len1, i); if (i == -1) break; - memcpy(res + PyUnicode_KIND_SIZE(rkind, i), + memcpy(res + rkind * i, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); i += len1; } @@ -9816,49 +9814,49 @@ while (n-- > 0) { /* look for next match */ j = anylib_find(rkind, self, - sbuf + PyUnicode_KIND_SIZE(rkind, i), slen-i, + sbuf + rkind * i, slen-i, str1, buf1, len1, i); if (j == -1) break; else if (j > i) { /* copy unchanged part [i:j] */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, j-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (j-i)); ires += j - i; } /* copy substitution string */ if (len2 > 0) { - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), + memcpy(res + rkind * ires, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); ires += len2; } i = j + len1; } if (i < slen) /* copy tail [i:] */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, slen-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (slen-i)); } else { /* interleave */ while (n > 0) { - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), + memcpy(res + rkind * ires, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); ires += len2; if (--n <= 0) break; - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, 1)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind); ires++; i++; } - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, slen-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (slen-i)); } u = rstr; unicode_adjust_maxchar(&u); @@ -11341,7 +11339,7 @@ kind = PyUnicode_KIND(self); data = PyUnicode_1BYTE_DATA(self); return PyUnicode_FromKindAndData(kind, - data + PyUnicode_KIND_SIZE(kind, start), + data + kind * start, length); } } @@ -11497,7 +11495,7 @@ else { /* number of characters copied this far */ Py_ssize_t done = PyUnicode_GET_LENGTH(str); - const Py_ssize_t char_size = PyUnicode_CHARACTER_SIZE(str); + const Py_ssize_t char_size = PyUnicode_KIND(str); char *to = (char *) PyUnicode_DATA(u); Py_MEMCPY(to, PyUnicode_DATA(str), PyUnicode_GET_LENGTH(str) * char_size); @@ -12488,14 +12486,14 @@ size = sizeof(PyASCIIObject) + PyUnicode_GET_LENGTH(v) + 1; else if (PyUnicode_IS_COMPACT(v)) size = sizeof(PyCompactUnicodeObject) + - (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_CHARACTER_SIZE(v); + (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_KIND(v); else { /* If it is a two-block object, account for base object, and for character block if present. */ size = sizeof(PyUnicodeObject); if (_PyUnicode_DATA_ANY(v)) size += (PyUnicode_GET_LENGTH(v) + 1) * - PyUnicode_CHARACTER_SIZE(v); + PyUnicode_KIND(v); } /* If the wstr pointer is present, account for it unless it is shared with the data pointer. Check if the data is not shared. */ @@ -13246,7 +13244,7 @@ else { const char *p = (const char *) pbuf; assert(pbuf != NULL); - p = p + PyUnicode_KIND_SIZE(kind, pindex); + p += kind * pindex; v = PyUnicode_FromKindAndData(kind, p, len); } if (v == NULL) @@ -13399,7 +13397,7 @@ } Py_MEMCPY(data, PyUnicode_DATA(unicode), - PyUnicode_KIND_SIZE(kind, length + 1)); + kind * (length + 1)); Py_DECREF(unicode); assert(_PyUnicode_CheckConsistency(self, 1)); #ifdef Py_DEBUG diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -604,9 +604,9 @@ #endif _PyUnicode_InsertThousandsGrouping( out, kind, - (char*)data + PyUnicode_KIND_SIZE(kind, pos), + (char*)data + kind * pos, spec->n_grouped_digits, - pdigits + PyUnicode_KIND_SIZE(kind, d_pos), + pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, locale->grouping, locale->thousands_sep); #ifndef NDEBUG -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 20:58:09 2011 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 07 Oct 2011 20:58:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_indentation=2E?= Message-ID: http://hg.python.org/cpython/rev/896b9587a2a6 changeset: 72797:896b9587a2a6 user: Martin v. L?wis date: Fri Oct 07 20:58:00 2011 +0200 summary: Fix indentation. files: Doc/c-api/unicode.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -149,7 +149,7 @@ Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the canonical representation has the correct character size; use - :c:func:`PyUnicode_KIND` to select the right macro. Make sure + :c:func:`PyUnicode_KIND` to select the right macro. Make sure :c:func:`PyUnicode_READY` has been called before accessing this. .. versionadded:: 3.3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:03:16 2011 From: python-checkins at python.org (ned.deily) Date: Fri, 07 Oct 2011 21:03:16 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzczNjc6?= =?utf8?q?_Ensure_test_directory_always_gets_removed=2E?= Message-ID: http://hg.python.org/cpython/rev/17b5afd321a8 changeset: 72798:17b5afd321a8 branch: 2.7 parent: 72794:666e7e325795 user: Ned Deily date: Fri Oct 07 12:01:18 2011 -0700 summary: Issue #7367: Ensure test directory always gets removed. files: Lib/test/test_pkgutil.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -15,11 +15,11 @@ def setUp(self): self.dirname = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.dirname) sys.path.insert(0, self.dirname) def tearDown(self): del sys.path[0] - shutil.rmtree(self.dirname) def test_getdata_filesys(self): pkg = 'test_getdata_filesys' @@ -85,9 +85,9 @@ # this does not appear to create an unreadable dir on Windows # but the test should not fail anyway os.mkdir(d, 0) + self.addCleanup(os.rmdir, d) for t in pkgutil.walk_packages(path=[self.dirname]): self.fail("unexpected package found") - os.rmdir(d) class PkgutilPEP302Tests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:03:17 2011 From: python-checkins at python.org (ned.deily) Date: Fri, 07 Oct 2011 21:03:17 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzczNjc6?= =?utf8?q?_Ensure_test_directory_always_gets_removed=2E?= Message-ID: http://hg.python.org/cpython/rev/ff72f76dcf43 changeset: 72799:ff72f76dcf43 branch: 3.2 parent: 72792:459f5e10cd4f user: Ned Deily date: Fri Oct 07 12:01:40 2011 -0700 summary: Issue #7367: Ensure test directory always gets removed. files: Lib/test/test_pkgutil.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -15,11 +15,11 @@ def setUp(self): self.dirname = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.dirname) sys.path.insert(0, self.dirname) def tearDown(self): del sys.path[0] - shutil.rmtree(self.dirname) def test_getdata_filesys(self): pkg = 'test_getdata_filesys' @@ -91,9 +91,9 @@ # this does not appear to create an unreadable dir on Windows # but the test should not fail anyway os.mkdir(d, 0) + self.addCleanup(os.rmdir, d) for t in pkgutil.walk_packages(path=[self.dirname]): self.fail("unexpected package found") - os.rmdir(d) class PkgutilPEP302Tests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:03:17 2011 From: python-checkins at python.org (ned.deily) Date: Fri, 07 Oct 2011 21:03:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/c7e9ce8b0613 changeset: 72800:c7e9ce8b0613 parent: 72797:896b9587a2a6 parent: 72799:ff72f76dcf43 user: Ned Deily date: Fri Oct 07 12:02:29 2011 -0700 summary: Merge with 3.2 files: Lib/test/test_pkgutil.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -15,11 +15,11 @@ def setUp(self): self.dirname = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.dirname) sys.path.insert(0, self.dirname) def tearDown(self): del sys.path[0] - shutil.rmtree(self.dirname) def test_getdata_filesys(self): pkg = 'test_getdata_filesys' @@ -91,9 +91,9 @@ # this does not appear to create an unreadable dir on Windows # but the test should not fail anyway os.mkdir(d, 0) + self.addCleanup(os.rmdir, d) for t in pkgutil.walk_packages(path=[self.dirname]): self.fail("unexpected package found") - os.rmdir(d) class PkgutilPEP302Tests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:04 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_-_Issue_=231125?= =?utf8?q?0=3A_Back_port_fix_from_3=2E3_branch=2C_so_that_2to3_can_handle_?= =?utf8?q?files?= Message-ID: http://hg.python.org/cpython/rev/6e0e9237d8e8 changeset: 72801:6e0e9237d8e8 branch: 3.2 parent: 72777:5a4018570a59 user: Barry Warsaw date: Fri Oct 07 14:44:49 2011 -0400 summary: - Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files with line feeds. This was ported from the sandbox to the 3.3 branch, but didn't make it into 3.2. - Re-enable lib2to3's test_parser.py tests, though with an expected failure (see issue 13125). files: Lib/lib2to3/patcomp.py | 3 +- Lib/lib2to3/pgen2/driver.py | 11 +---- Lib/lib2to3/tests/test_parser.py | 38 +++++++++++++------ Lib/test/test_lib2to3.py | 3 +- Misc/NEWS | 7 +++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/Lib/lib2to3/patcomp.py b/Lib/lib2to3/patcomp.py --- a/Lib/lib2to3/patcomp.py +++ b/Lib/lib2to3/patcomp.py @@ -11,6 +11,7 @@ __author__ = "Guido van Rossum " # Python imports +import io import os # Fairly local imports @@ -32,7 +33,7 @@ def tokenize_wrapper(input): """Tokenizes a string suppressing significant whitespace.""" skip = set((token.NEWLINE, token.INDENT, token.DEDENT)) - tokens = tokenize.generate_tokens(driver.generate_lines(input).__next__) + tokens = tokenize.generate_tokens(io.StringIO(input).readline) for quintuple in tokens: type, value, start, end, line_text = quintuple if type not in skip: diff --git a/Lib/lib2to3/pgen2/driver.py b/Lib/lib2to3/pgen2/driver.py --- a/Lib/lib2to3/pgen2/driver.py +++ b/Lib/lib2to3/pgen2/driver.py @@ -17,6 +17,7 @@ # Python imports import codecs +import io import os import logging import sys @@ -101,18 +102,10 @@ def parse_string(self, text, debug=False): """Parse a string and return the syntax tree.""" - tokens = tokenize.generate_tokens(generate_lines(text).__next__) + tokens = tokenize.generate_tokens(io.StringIO(text).readline) return self.parse_tokens(tokens, debug) -def generate_lines(text): - """Generator that behaves like readline without using StringIO.""" - for line in text.splitlines(True): - yield line - while True: - yield "" - - def load_grammar(gt="Grammar.txt", gp=None, save=True, force=False, logger=None): """Load the grammar (maybe from a pickle).""" diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -14,10 +14,21 @@ # Python imports import os +import unittest # Local imports from lib2to3.pgen2 import tokenize from ..pgen2.parse import ParseError +from lib2to3.pygram import python_symbols as syms + + +class TestDriver(support.TestCase): + + def test_formfeed(self): + s = """print 1\n\x0Cprint 2\n""" + t = driver.parse_string(s) + self.assertEqual(t.children[0].children[0].type, syms.print_stmt) + self.assertEqual(t.children[1].children[0].type, syms.print_stmt) class GrammarTest(support.TestCase): @@ -147,19 +158,22 @@ """A cut-down version of pytree_idempotency.py.""" + # Issue 13125 + @unittest.expectedFailure def test_all_project_files(self): for filepath in support.all_project_files(): with open(filepath, "rb") as fp: encoding = tokenize.detect_encoding(fp.readline)[0] self.assertTrue(encoding is not None, "can't detect encoding for %s" % filepath) - with open(filepath, "r") as fp: + with open(filepath, "r", encoding=encoding) as fp: source = fp.read() - source = source.decode(encoding) - tree = driver.parse_string(source) + try: + tree = driver.parse_string(source) + except ParseError as err: + print('ParseError on file', filepath, err) + continue new = str(tree) - if encoding: - new = new.encode(encoding) if diff(filepath, new): self.fail("Idempotency failed: %s" % filepath) @@ -202,14 +216,14 @@ self.validate(s) -def diff(fn, result, encoding): - f = open("@", "w") +def diff(fn, result): try: - f.write(result.encode(encoding)) - finally: - f.close() - try: + with open('@', 'w') as f: + f.write(str(result)) fn = fn.replace('"', '\\"') return os.system('diff -u "%s" @' % fn) finally: - os.remove("@") + try: + os.remove("@") + except OSError: + pass diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,6 +1,7 @@ # Skipping test_parser and test_all_fixers # because of running from lib2to3.tests import (test_fixers, test_pytree, test_util, test_refactor, + test_parser, test_main as test_main_) import unittest from test.support import run_unittest @@ -9,7 +10,7 @@ tests = unittest.TestSuite() loader = unittest.TestLoader() for m in (test_fixers, test_pytree,test_util, test_refactor, - test_main_): + test_parser, test_main_): tests.addTests(loader.loadTestsFromModule(m)) return tests diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -39,6 +39,10 @@ Library ------- +- Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files + with line feeds. This was ported from the sandbox to the 3.3 branch, but + didn't make it into 3.2. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. @@ -101,6 +105,9 @@ - Issue #12821: Fix test_fcntl failures on OpenBSD 5. +- Re-enable lib2to3's test_parser.py tests, though with an expected failure + (see issue 13125). + Extension Modules ----------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:05 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:05 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Branch_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/f94485bf3e3a changeset: 72802:f94485bf3e3a branch: 3.2 parent: 72801:6e0e9237d8e8 parent: 72792:459f5e10cd4f user: Barry Warsaw date: Fri Oct 07 14:45:25 2011 -0400 summary: Branch merge. files: Doc/library/ssl.rst | 4 ++-- Misc/NEWS | 4 ++++ PC/errmap.h | 1 + PC/generrmap.c | 3 +++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -990,8 +990,8 @@ Class :class:`socket.socket` Documentation of underlying :mod:`socket` class - `Introducing SSL and Certificates using OpenSSL `_ - Frederick J. Hirsch + `TLS (Transport Layer Security) and SSL (Secure Socket Layer) `_ + Debby Koren `RFC 1422: Privacy Enhancement for Internet Electronic Mail: Part II: Certificate-Based Key Management `_ Steve Kent diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described + as "The pipe is being closed") is now mapped to POSIX errno EPIPE + (previously EINVAL). + - Issue #12911: Fix memory consumption when calculating the repr() of huge tuples or lists. diff --git a/PC/errmap.h b/PC/errmap.h --- a/PC/errmap.h +++ b/PC/errmap.h @@ -72,6 +72,7 @@ case 202: return 8; case 206: return 2; case 215: return 11; + case 232: return 32; case 267: return 20; case 1816: return 12; default: return EINVAL; diff --git a/PC/generrmap.c b/PC/generrmap.c --- a/PC/generrmap.c +++ b/PC/generrmap.c @@ -19,6 +19,9 @@ /* Issue #12802 */ if (i == ERROR_DIRECTORY) errno = ENOTDIR; + /* Issue #13063 */ + else if (i == ERROR_NO_DATA) + errno = EPIPE; else continue; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:06 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_-_Re-enable_lib2to3=27s_tes?= =?utf8?q?t=5Fparser=2Epy_tests=2C_though_with_an_expected_failure?= Message-ID: http://hg.python.org/cpython/rev/914d3f035887 changeset: 72803:914d3f035887 parent: 72795:16118ea2192b user: Barry Warsaw date: Fri Oct 07 15:14:53 2011 -0400 summary: - Re-enable lib2to3's test_parser.py tests, though with an expected failure (see issue 13125). files: Lib/lib2to3/tests/test_parser.py | 24 ++++++++++++------- Lib/test/test_lib2to3.py | 3 +- Misc/NEWS | 3 ++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -14,6 +14,7 @@ # Python imports import os +import unittest # Local imports from lib2to3.pgen2 import tokenize @@ -157,6 +158,8 @@ """A cut-down version of pytree_idempotency.py.""" + # Issue 13125 + @unittest.expectedFailure def test_all_project_files(self): for filepath in support.all_project_files(): with open(filepath, "rb") as fp: @@ -165,8 +168,11 @@ "can't detect encoding for %s" % filepath) with open(filepath, "r") as fp: source = fp.read() - source = source.decode(encoding) - tree = driver.parse_string(source) + try: + tree = driver.parse_string(source) + except ParseError as err: + print('ParseError on file', filepath, err) + continue new = str(tree) if encoding: new = new.encode(encoding) @@ -212,14 +218,14 @@ self.validate(s) -def diff(fn, result, encoding): - f = open("@", "w") +def diff(fn, result): try: - f.write(result.encode(encoding)) - finally: - f.close() - try: + with open('@', 'w') as f: + f.write(str(result)) fn = fn.replace('"', '\\"') return os.system('diff -u "%s" @' % fn) finally: - os.remove("@") + try: + os.remove("@") + except OSError: + pass diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,6 +1,7 @@ # Skipping test_parser and test_all_fixers # because of running from lib2to3.tests import (test_fixers, test_pytree, test_util, test_refactor, + test_parser, test_main as test_main_) import unittest from test.support import run_unittest @@ -8,7 +9,7 @@ def suite(): tests = unittest.TestSuite() loader = unittest.TestLoader() - for m in (test_fixers, test_pytree,test_util, test_refactor, + for m in (test_fixers, test_pytree,test_util, test_refactor, test_parser, test_main_): tests.addTests(loader.loadTestsFromModule(m)) return tests diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1382,6 +1382,9 @@ Tests ----- +- Re-enable lib2to3's test_parser.py tests, though with an expected failure + (see issue 13125). + - Issue #12656: Add tests for IPv6 and Unix sockets to test_asyncore. - Issue #6484: Add unit tests for mailcap module (patch by Gregory Nofi) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:06 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Trunk_merge?= Message-ID: http://hg.python.org/cpython/rev/075d7ed8d840 changeset: 72804:075d7ed8d840 parent: 72803:914d3f035887 parent: 72800:c7e9ce8b0613 user: Barry Warsaw date: Fri Oct 07 15:15:38 2011 -0400 summary: Trunk merge files: Doc/c-api/unicode.rst | 24 +----- Include/unicodeobject.h | 35 ++------- Lib/test/test_pkgutil.py | 4 +- Modules/_io/textio.c | 44 +++++------ Modules/_json.c | 4 +- Modules/_sre.c | 2 +- Objects/stringlib/eq.h | 2 +- Objects/unicodeobject.c | 92 ++++++++++++------------- Python/formatter_unicode.c | 4 +- 9 files changed, 86 insertions(+), 125 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -99,7 +99,7 @@ .. deprecated-removed:: 3.3 4.0 Part of the old-style Unicode API, please migrate to using - :c:func:`PyUnicode_GET_LENGTH` or :c:func:`PyUnicode_KIND_SIZE`. + :c:func:`PyUnicode_GET_LENGTH`. .. c:function:: Py_UNICODE* PyUnicode_AS_UNICODE(PyObject *o) @@ -149,9 +149,8 @@ Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 integer types for direct character access. No checks are performed if the canonical representation has the correct character size; use - :c:func:`PyUnicode_CHARACTER_SIZE` or :c:func:`PyUnicode_KIND` to select the - right macro. Make sure :c:func:`PyUnicode_READY` has been called before - accessing this. + :c:func:`PyUnicode_KIND` to select the right macro. Make sure + :c:func:`PyUnicode_READY` has been called before accessing this. .. versionadded:: 3.3 @@ -176,15 +175,6 @@ .. versionadded:: 3.3 -.. c:function:: int PyUnicode_CHARACTER_SIZE(PyObject *o) - - Return the number of bytes the string uses to represent single characters; - this can be 1, 2 or 4. *o* has to be a Unicode object in the "canonical" - representation (not checked). - - .. versionadded:: 3.3 - - .. c:function:: void* PyUnicode_DATA(PyObject *o) Return a void pointer to the raw unicode buffer. *o* has to be a Unicode @@ -193,14 +183,6 @@ .. versionadded:: 3.3 -.. c:function:: int PyUnicode_KIND_SIZE(int kind, Py_ssize_t index) - - Compute ``index * char_size`` where ``char_size`` is ``2**(kind - 1)``. The - index is a character index, the result is a size in bytes. - - .. versionadded:: 3.3 - - .. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \ Py_UCS4 value) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -305,12 +305,12 @@ * character type = Py_UCS2 (16 bits, unsigned) * at least one character must be in range U+0100-U+FFFF - - PyUnicode_4BYTE_KIND (3): + - PyUnicode_4BYTE_KIND (4): * character type = Py_UCS4 (32 bits, unsigned) * at least one character must be in range U+10000-U+10FFFF */ - unsigned int kind:2; + unsigned int kind:3; /* Compact is with respect to the allocation scheme. Compact unicode objects only require one memory block while non-compact objects use one block for the PyUnicodeObject struct and another for its data @@ -424,29 +424,21 @@ #define PyUnicode_IS_COMPACT_ASCII(op) \ (PyUnicode_IS_ASCII(op) && PyUnicode_IS_COMPACT(op)) +enum PyUnicode_Kind { /* String contains only wstr byte characters. This is only possible when the string was created with a legacy API and _PyUnicode_Ready() has not been called yet. */ -#define PyUnicode_WCHAR_KIND 0 - + PyUnicode_WCHAR_KIND = 0, /* Return values of the PyUnicode_KIND() macro: */ - -#define PyUnicode_1BYTE_KIND 1 -#define PyUnicode_2BYTE_KIND 2 -#define PyUnicode_4BYTE_KIND 3 - - -/* Return the number of bytes the string uses to represent single characters, - this can be 1, 2 or 4. - - See also PyUnicode_KIND_SIZE(). */ -#define PyUnicode_CHARACTER_SIZE(op) \ - (((Py_ssize_t)1 << (PyUnicode_KIND(op) - 1))) + PyUnicode_1BYTE_KIND = 1, + PyUnicode_2BYTE_KIND = 2, + PyUnicode_4BYTE_KIND = 4 +}; /* Return pointers to the canonical representation cast to unsigned char, Py_UCS2, or Py_UCS4 for direct character access. - No checks are performed, use PyUnicode_CHARACTER_SIZE or - PyUnicode_KIND() before to ensure these will work correctly. */ + No checks are performed, use PyUnicode_KIND() before to ensure + these will work correctly. */ #define PyUnicode_1BYTE_DATA(op) ((Py_UCS1*)PyUnicode_DATA(op)) #define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op)) @@ -473,13 +465,6 @@ PyUnicode_IS_COMPACT(op) ? _PyUnicode_COMPACT_DATA(op) : \ _PyUnicode_NONCOMPACT_DATA(op)) -/* Compute (index * char_size) where char_size is 2 ** (kind - 1). - The index is a character index, the result is a size in bytes. - - See also PyUnicode_CHARACTER_SIZE(). */ -#define PyUnicode_KIND_SIZE(kind, index) \ - (((Py_ssize_t)(index)) << ((kind) - 1)) - /* In the access macros below, "kind" may be evaluated more than once. All other macro parameters are evaluated exactly once, so it is safe to put side effects into them (such as increasing the index). */ diff --git a/Lib/test/test_pkgutil.py b/Lib/test/test_pkgutil.py --- a/Lib/test/test_pkgutil.py +++ b/Lib/test/test_pkgutil.py @@ -15,11 +15,11 @@ def setUp(self): self.dirname = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.dirname) sys.path.insert(0, self.dirname) def tearDown(self): del sys.path[0] - shutil.rmtree(self.dirname) def test_getdata_filesys(self): pkg = 'test_getdata_filesys' @@ -91,9 +91,9 @@ # this does not appear to create an unreadable dir on Windows # but the test should not fail anyway os.mkdir(d, 0) + self.addCleanup(os.rmdir, d) for t in pkgutil.walk_packages(path=[self.dirname]): self.fail("unexpected package found") - os.rmdir(d) class PkgutilPEP302Tests(unittest.TestCase): diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -291,9 +291,7 @@ kind = PyUnicode_KIND(modified); out = PyUnicode_DATA(modified); PyUnicode_WRITE(kind, PyUnicode_DATA(modified), 0, '\r'); - memcpy(out + PyUnicode_KIND_SIZE(kind, 1), - PyUnicode_DATA(output), - PyUnicode_KIND_SIZE(kind, output_len)); + memcpy(out + kind, PyUnicode_DATA(output), kind * output_len); Py_DECREF(output); output = modified; /* output remains ready */ self->pendingcr = 0; @@ -336,7 +334,7 @@ for the \r *byte* with the libc's optimized memchr. */ if (seennl == SEEN_LF || seennl == 0) { - only_lf = (memchr(in_str, '\r', PyUnicode_KIND_SIZE(kind, len)) == NULL); + only_lf = (memchr(in_str, '\r', kind * len) == NULL); } if (only_lf) { @@ -344,7 +342,7 @@ (there's nothing else to be done, even when in translation mode) */ if (seennl == 0 && - memchr(in_str, '\n', PyUnicode_KIND_SIZE(kind, len)) != NULL) { + memchr(in_str, '\n', kind * len) != NULL) { Py_ssize_t i = 0; for (;;) { Py_UCS4 c; @@ -403,7 +401,7 @@ when there is something to translate. On the other hand, we already know there is a \r byte, so chances are high that something needs to be done. */ - translated = PyMem_Malloc(PyUnicode_KIND_SIZE(kind, len)); + translated = PyMem_Malloc(kind * len); if (translated == NULL) { PyErr_NoMemory(); goto error; @@ -1576,15 +1574,14 @@ static char * find_control_char(int kind, char *s, char *end, Py_UCS4 ch) { - int size = PyUnicode_KIND_SIZE(kind, 1); for (;;) { while (PyUnicode_READ(kind, s, 0) > ch) - s += size; + s += kind; if (PyUnicode_READ(kind, s, 0) == ch) return s; if (s == end) return NULL; - s += size; + s += kind; } } @@ -1593,14 +1590,13 @@ int translated, int universal, PyObject *readnl, int kind, char *start, char *end, Py_ssize_t *consumed) { - int size = PyUnicode_KIND_SIZE(kind, 1); - Py_ssize_t len = ((char*)end - (char*)start)/size; + Py_ssize_t len = ((char*)end - (char*)start)/kind; if (translated) { /* Newlines are already translated, only search for \n */ char *pos = find_control_char(kind, start, end, '\n'); if (pos != NULL) - return (pos - start)/size + 1; + return (pos - start)/kind + 1; else { *consumed = len; return -1; @@ -1616,20 +1612,20 @@ /* Fast path for non-control chars. The loop always ends since the Unicode string is NUL-terminated. */ while (PyUnicode_READ(kind, s, 0) > '\r') - s += size; + s += kind; if (s >= end) { *consumed = len; return -1; } ch = PyUnicode_READ(kind, s, 0); - s += size; + s += kind; if (ch == '\n') - return (s - start)/size; + return (s - start)/kind; if (ch == '\r') { if (PyUnicode_READ(kind, s, 0) == '\n') - return (s - start)/size + 1; + return (s - start)/kind + 1; else - return (s - start)/size; + return (s - start)/kind; } } } @@ -1642,13 +1638,13 @@ if (readnl_len == 1) { char *pos = find_control_char(kind, start, end, nl[0]); if (pos != NULL) - return (pos - start)/size + 1; + return (pos - start)/kind + 1; *consumed = len; return -1; } else { char *s = start; - char *e = end - (readnl_len - 1)*size; + char *e = end - (readnl_len - 1)*kind; char *pos; if (e < s) e = s; @@ -1662,14 +1658,14 @@ break; } if (i == readnl_len) - return (pos - start)/size + readnl_len; - s = pos + size; + return (pos - start)/kind + readnl_len; + s = pos + kind; } pos = find_control_char(kind, e, end, nl[0]); if (pos == NULL) *consumed = len; else - *consumed = (pos - start)/size; + *consumed = (pos - start)/kind; return -1; } } @@ -1738,8 +1734,8 @@ endpos = _PyIO_find_line_ending( self->readtranslate, self->readuniversal, self->readnl, kind, - ptr + PyUnicode_KIND_SIZE(kind, start), - ptr + PyUnicode_KIND_SIZE(kind, line_len), + ptr + kind * start, + ptr + kind * line_len, &consumed); if (endpos >= 0) { endpos += start; diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -365,7 +365,7 @@ APPEND_OLD_CHUNK chunk = PyUnicode_FromKindAndData( kind, - (char*)buf + PyUnicode_KIND_SIZE(kind, end), + (char*)buf + kind * end, next - end); if (chunk == NULL) { goto bail; @@ -931,7 +931,7 @@ if (custom_func) { /* copy the section we determined to be a number */ numstr = PyUnicode_FromKindAndData(kind, - (char*)str + PyUnicode_KIND_SIZE(kind, start), + (char*)str + kind * start, idx - start); if (numstr == NULL) return NULL; diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1669,7 +1669,7 @@ return NULL; ptr = PyUnicode_DATA(string); *p_length = PyUnicode_GET_LENGTH(string); - *p_charsize = PyUnicode_CHARACTER_SIZE(string); + *p_charsize = PyUnicode_KIND(string); *p_logical_charsize = 4; return ptr; } diff --git a/Objects/stringlib/eq.h b/Objects/stringlib/eq.h --- a/Objects/stringlib/eq.h +++ b/Objects/stringlib/eq.h @@ -30,5 +30,5 @@ PyUnicode_GET_LENGTH(a) == 1) return 1; return memcmp(PyUnicode_1BYTE_DATA(a), PyUnicode_1BYTE_DATA(b), - PyUnicode_GET_LENGTH(a) * PyUnicode_CHARACTER_SIZE(a)) == 0; + PyUnicode_GET_LENGTH(a) * PyUnicode_KIND(a)) == 0; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -470,12 +470,12 @@ if (direction == 1) { for(i = 0; i < size; i++) if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + PyUnicode_KIND_SIZE(kind, i); + return (char*)s + kind * i; } else { for(i = size-1; i >= 0; i--) if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + PyUnicode_KIND_SIZE(kind, i); + return (char*)s + kind * i; } return NULL; } @@ -489,7 +489,7 @@ int share_wstr; assert(PyUnicode_IS_READY(unicode)); - char_size = PyUnicode_CHARACTER_SIZE(unicode); + char_size = PyUnicode_KIND(unicode); if (PyUnicode_IS_COMPACT_ASCII(unicode)) struct_size = sizeof(PyASCIIObject); else @@ -540,7 +540,7 @@ data = _PyUnicode_DATA_ANY(unicode); assert(data != NULL); - char_size = PyUnicode_CHARACTER_SIZE(unicode); + char_size = PyUnicode_KIND(unicode); share_wstr = _PyUnicode_SHARE_WSTR(unicode); share_utf8 = _PyUnicode_SHARE_UTF8(unicode); if (!share_utf8 && _PyUnicode_HAS_UTF8_MEMORY(unicode)) @@ -1005,11 +1005,9 @@ } if (fast) { - Py_MEMCPY((char*)to_data - + PyUnicode_KIND_SIZE(to_kind, to_start), - (char*)from_data - + PyUnicode_KIND_SIZE(from_kind, from_start), - PyUnicode_KIND_SIZE(to_kind, how_many)); + Py_MEMCPY((char*)to_data + to_kind * to_start, + (char*)from_data + from_kind * from_start, + to_kind * how_many); } else if (from_kind == PyUnicode_1BYTE_KIND && to_kind == PyUnicode_2BYTE_KIND) @@ -8760,7 +8758,7 @@ end = PyUnicode_GET_LENGTH(str); kind = PyUnicode_KIND(str); result = findchar(PyUnicode_1BYTE_DATA(str) - + PyUnicode_KIND_SIZE(kind, start), + + kind*start, kind, end-start, ch, direction); if (!result) @@ -8813,10 +8811,10 @@ /* If both are of the same kind, memcmp is sufficient */ if (kind_self == kind_sub) { return ! memcmp((char *)data_self + - (offset * PyUnicode_CHARACTER_SIZE(substring)), + (offset * PyUnicode_KIND(substring)), data_sub, PyUnicode_GET_LENGTH(substring) * - PyUnicode_CHARACTER_SIZE(substring)); + PyUnicode_KIND(substring)); } /* otherwise we have to compare each character by first accesing it */ else { @@ -8881,7 +8879,7 @@ return NULL; Py_MEMCPY(PyUnicode_1BYTE_DATA(u), PyUnicode_1BYTE_DATA(self), - PyUnicode_GET_LENGTH(u) * PyUnicode_CHARACTER_SIZE(u)); + PyUnicode_GET_LENGTH(u) * PyUnicode_KIND(u)); /* fix functions return the new maximum character in a string, if the kind of the resulting unicode object does not change, @@ -9262,8 +9260,8 @@ if (use_memcpy) { Py_MEMCPY(res_data, sep_data, - PyUnicode_KIND_SIZE(kind, seplen)); - res_data += PyUnicode_KIND_SIZE(kind, seplen); + kind * seplen); + res_data += kind * seplen; } else { copy_characters(res, res_offset, sep, 0, seplen); @@ -9275,8 +9273,8 @@ if (use_memcpy) { Py_MEMCPY(res_data, PyUnicode_DATA(item), - PyUnicode_KIND_SIZE(kind, itemlen)); - res_data += PyUnicode_KIND_SIZE(kind, itemlen); + kind * itemlen); + res_data += kind * itemlen; } else { copy_characters(res, res_offset, item, 0, itemlen); @@ -9286,7 +9284,7 @@ } if (use_memcpy) assert(res_data == PyUnicode_1BYTE_DATA(res) - + PyUnicode_KIND_SIZE(kind, PyUnicode_GET_LENGTH(res))); + + kind * PyUnicode_GET_LENGTH(res)); else assert(res_offset == PyUnicode_GET_LENGTH(res)); @@ -9735,22 +9733,22 @@ goto error; res = PyUnicode_DATA(rstr); - memcpy(res, sbuf, PyUnicode_KIND_SIZE(rkind, slen)); + memcpy(res, sbuf, rkind * slen); /* change everything in-place, starting with this one */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, i), + memcpy(res + rkind * i, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); i += len1; while ( --maxcount > 0) { i = anylib_find(rkind, self, - sbuf+PyUnicode_KIND_SIZE(rkind, i), slen-i, + sbuf+rkind*i, slen-i, str1, buf1, len1, i); if (i == -1) break; - memcpy(res + PyUnicode_KIND_SIZE(rkind, i), + memcpy(res + rkind * i, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); i += len1; } @@ -9816,49 +9814,49 @@ while (n-- > 0) { /* look for next match */ j = anylib_find(rkind, self, - sbuf + PyUnicode_KIND_SIZE(rkind, i), slen-i, + sbuf + rkind * i, slen-i, str1, buf1, len1, i); if (j == -1) break; else if (j > i) { /* copy unchanged part [i:j] */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, j-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (j-i)); ires += j - i; } /* copy substitution string */ if (len2 > 0) { - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), + memcpy(res + rkind * ires, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); ires += len2; } i = j + len1; } if (i < slen) /* copy tail [i:] */ - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, slen-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (slen-i)); } else { /* interleave */ while (n > 0) { - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), + memcpy(res + rkind * ires, buf2, - PyUnicode_KIND_SIZE(rkind, len2)); + rkind * len2); ires += len2; if (--n <= 0) break; - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, 1)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind); ires++; i++; } - memcpy(res + PyUnicode_KIND_SIZE(rkind, ires), - sbuf + PyUnicode_KIND_SIZE(rkind, i), - PyUnicode_KIND_SIZE(rkind, slen-i)); + memcpy(res + rkind * ires, + sbuf + rkind * i, + rkind * (slen-i)); } u = rstr; unicode_adjust_maxchar(&u); @@ -11341,7 +11339,7 @@ kind = PyUnicode_KIND(self); data = PyUnicode_1BYTE_DATA(self); return PyUnicode_FromKindAndData(kind, - data + PyUnicode_KIND_SIZE(kind, start), + data + kind * start, length); } } @@ -11497,7 +11495,7 @@ else { /* number of characters copied this far */ Py_ssize_t done = PyUnicode_GET_LENGTH(str); - const Py_ssize_t char_size = PyUnicode_CHARACTER_SIZE(str); + const Py_ssize_t char_size = PyUnicode_KIND(str); char *to = (char *) PyUnicode_DATA(u); Py_MEMCPY(to, PyUnicode_DATA(str), PyUnicode_GET_LENGTH(str) * char_size); @@ -12488,14 +12486,14 @@ size = sizeof(PyASCIIObject) + PyUnicode_GET_LENGTH(v) + 1; else if (PyUnicode_IS_COMPACT(v)) size = sizeof(PyCompactUnicodeObject) + - (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_CHARACTER_SIZE(v); + (PyUnicode_GET_LENGTH(v) + 1) * PyUnicode_KIND(v); else { /* If it is a two-block object, account for base object, and for character block if present. */ size = sizeof(PyUnicodeObject); if (_PyUnicode_DATA_ANY(v)) size += (PyUnicode_GET_LENGTH(v) + 1) * - PyUnicode_CHARACTER_SIZE(v); + PyUnicode_KIND(v); } /* If the wstr pointer is present, account for it unless it is shared with the data pointer. Check if the data is not shared. */ @@ -13246,7 +13244,7 @@ else { const char *p = (const char *) pbuf; assert(pbuf != NULL); - p = p + PyUnicode_KIND_SIZE(kind, pindex); + p += kind * pindex; v = PyUnicode_FromKindAndData(kind, p, len); } if (v == NULL) @@ -13399,7 +13397,7 @@ } Py_MEMCPY(data, PyUnicode_DATA(unicode), - PyUnicode_KIND_SIZE(kind, length + 1)); + kind * (length + 1)); Py_DECREF(unicode); assert(_PyUnicode_CheckConsistency(self, 1)); #ifdef Py_DEBUG diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -604,9 +604,9 @@ #endif _PyUnicode_InsertThousandsGrouping( out, kind, - (char*)data + PyUnicode_KIND_SIZE(kind, pos), + (char*)data + kind * pos, spec->n_grouped_digits, - pdigits + PyUnicode_KIND_SIZE(kind, d_pos), + pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, locale->grouping, locale->thousands_sep); #ifndef NDEBUG -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:07 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:07 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merged?= Message-ID: http://hg.python.org/cpython/rev/1d71bc14113f changeset: 72805:1d71bc14113f branch: 3.2 parent: 72799:ff72f76dcf43 parent: 72802:f94485bf3e3a user: Barry Warsaw date: Fri Oct 07 15:16:20 2011 -0400 summary: Merged files: Lib/lib2to3/patcomp.py | 3 +- Lib/lib2to3/pgen2/driver.py | 11 +---- Lib/lib2to3/tests/test_parser.py | 38 +++++++++++++------ Lib/test/test_lib2to3.py | 3 +- Misc/NEWS | 7 +++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/Lib/lib2to3/patcomp.py b/Lib/lib2to3/patcomp.py --- a/Lib/lib2to3/patcomp.py +++ b/Lib/lib2to3/patcomp.py @@ -11,6 +11,7 @@ __author__ = "Guido van Rossum " # Python imports +import io import os # Fairly local imports @@ -32,7 +33,7 @@ def tokenize_wrapper(input): """Tokenizes a string suppressing significant whitespace.""" skip = set((token.NEWLINE, token.INDENT, token.DEDENT)) - tokens = tokenize.generate_tokens(driver.generate_lines(input).__next__) + tokens = tokenize.generate_tokens(io.StringIO(input).readline) for quintuple in tokens: type, value, start, end, line_text = quintuple if type not in skip: diff --git a/Lib/lib2to3/pgen2/driver.py b/Lib/lib2to3/pgen2/driver.py --- a/Lib/lib2to3/pgen2/driver.py +++ b/Lib/lib2to3/pgen2/driver.py @@ -17,6 +17,7 @@ # Python imports import codecs +import io import os import logging import sys @@ -101,18 +102,10 @@ def parse_string(self, text, debug=False): """Parse a string and return the syntax tree.""" - tokens = tokenize.generate_tokens(generate_lines(text).__next__) + tokens = tokenize.generate_tokens(io.StringIO(text).readline) return self.parse_tokens(tokens, debug) -def generate_lines(text): - """Generator that behaves like readline without using StringIO.""" - for line in text.splitlines(True): - yield line - while True: - yield "" - - def load_grammar(gt="Grammar.txt", gp=None, save=True, force=False, logger=None): """Load the grammar (maybe from a pickle).""" diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -14,10 +14,21 @@ # Python imports import os +import unittest # Local imports from lib2to3.pgen2 import tokenize from ..pgen2.parse import ParseError +from lib2to3.pygram import python_symbols as syms + + +class TestDriver(support.TestCase): + + def test_formfeed(self): + s = """print 1\n\x0Cprint 2\n""" + t = driver.parse_string(s) + self.assertEqual(t.children[0].children[0].type, syms.print_stmt) + self.assertEqual(t.children[1].children[0].type, syms.print_stmt) class GrammarTest(support.TestCase): @@ -147,19 +158,22 @@ """A cut-down version of pytree_idempotency.py.""" + # Issue 13125 + @unittest.expectedFailure def test_all_project_files(self): for filepath in support.all_project_files(): with open(filepath, "rb") as fp: encoding = tokenize.detect_encoding(fp.readline)[0] self.assertTrue(encoding is not None, "can't detect encoding for %s" % filepath) - with open(filepath, "r") as fp: + with open(filepath, "r", encoding=encoding) as fp: source = fp.read() - source = source.decode(encoding) - tree = driver.parse_string(source) + try: + tree = driver.parse_string(source) + except ParseError as err: + print('ParseError on file', filepath, err) + continue new = str(tree) - if encoding: - new = new.encode(encoding) if diff(filepath, new): self.fail("Idempotency failed: %s" % filepath) @@ -202,14 +216,14 @@ self.validate(s) -def diff(fn, result, encoding): - f = open("@", "w") +def diff(fn, result): try: - f.write(result.encode(encoding)) - finally: - f.close() - try: + with open('@', 'w') as f: + f.write(str(result)) fn = fn.replace('"', '\\"') return os.system('diff -u "%s" @' % fn) finally: - os.remove("@") + try: + os.remove("@") + except OSError: + pass diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -1,6 +1,7 @@ # Skipping test_parser and test_all_fixers # because of running from lib2to3.tests import (test_fixers, test_pytree, test_util, test_refactor, + test_parser, test_main as test_main_) import unittest from test.support import run_unittest @@ -9,7 +10,7 @@ tests = unittest.TestSuite() loader = unittest.TestLoader() for m in (test_fixers, test_pytree,test_util, test_refactor, - test_main_): + test_parser, test_main_): tests.addTests(loader.loadTestsFromModule(m)) return tests diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,10 @@ Library ------- +- Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files + with line feeds. This was ported from the sandbox to the 3.3 branch, but + didn't make it into 3.2. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. @@ -105,6 +109,9 @@ - Issue #12821: Fix test_fcntl failures on OpenBSD 5. +- Re-enable lib2to3's test_parser.py tests, though with an expected failure + (see issue 13125). + Extension Modules ----------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 21:27:08 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 07 Oct 2011 21:27:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_-_Re-enable_lib2to3=27s_test=5Fparser=2Epy_tests=2C_though_w?= =?utf8?q?ith_an_expected_failure?= Message-ID: http://hg.python.org/cpython/rev/ed0315b9da72 changeset: 72806:ed0315b9da72 parent: 72804:075d7ed8d840 parent: 72805:1d71bc14113f user: Barry Warsaw date: Fri Oct 07 15:26:54 2011 -0400 summary: - Re-enable lib2to3's test_parser.py tests, though with an expected failure (see issue 13125). files: Lib/lib2to3/tests/test_parser.py | 4 +--- Lib/test/test_lib2to3.py | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -166,7 +166,7 @@ encoding = tokenize.detect_encoding(fp.readline)[0] self.assertTrue(encoding is not None, "can't detect encoding for %s" % filepath) - with open(filepath, "r") as fp: + with open(filepath, "r", encoding=encoding) as fp: source = fp.read() try: tree = driver.parse_string(source) @@ -174,8 +174,6 @@ print('ParseError on file', filepath, err) continue new = str(tree) - if encoding: - new = new.encode(encoding) if diff(filepath, new): self.fail("Idempotency failed: %s" % filepath) diff --git a/Lib/test/test_lib2to3.py b/Lib/test/test_lib2to3.py --- a/Lib/test/test_lib2to3.py +++ b/Lib/test/test_lib2to3.py @@ -9,7 +9,7 @@ def suite(): tests = unittest.TestSuite() loader = unittest.TestLoader() - for m in (test_fixers, test_pytree,test_util, test_refactor, test_parser, + for m in (test_fixers, test_pytree, test_util, test_refactor, test_parser, test_main_): tests.addTests(loader.loadTestsFromModule(m)) return tests -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 7 22:44:49 2011 From: python-checkins at python.org (charles-francois.natali) Date: Fri, 07 Oct 2011 22:44:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310141=3A_fix_socke?= =?utf8?q?tmodule_compilation_on_Linux_systems_with_=3Clinux/can=2Eh=3E?= Message-ID: http://hg.python.org/cpython/rev/d4ce850b06b7 changeset: 72807:d4ce850b06b7 user: Charles-Fran?ois Natali date: Fri Oct 07 22:47:08 2011 +0200 summary: Issue #10141: fix socketmodule compilation on Linux systems with but without AF_CAN definition. files: Modules/socketmodule.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -1220,7 +1220,7 @@ } #endif -#ifdef HAVE_LINUX_CAN_H +#ifdef AF_CAN case AF_CAN: { struct sockaddr_can *a = (struct sockaddr_can *)addr; @@ -1606,7 +1606,7 @@ } #endif -#ifdef HAVE_LINUX_CAN_H +#ifdef AF_CAN case AF_CAN: switch (s->sock_proto) { case CAN_RAW: @@ -1746,7 +1746,7 @@ } #endif -#ifdef HAVE_LINUX_CAN_H +#ifdef AF_CAN case AF_CAN: { *len_ret = sizeof (struct sockaddr_can); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 8 05:24:33 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 08 Oct 2011 05:24:33 +0200 Subject: [Python-checkins] Daily reference leaks (d4ce850b06b7): sum=2115 Message-ID: results for d4ce850b06b7 on branch "default" -------------------------------------------- test_socket leaked [705, 705, 705] references, sum=2115 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogWccIOh', '-x'] From python-checkins at python.org Sat Oct 8 11:21:58 2011 From: python-checkins at python.org (ezio.melotti) Date: Sat, 8 Oct 2011 11:21:58 +0200 (CEST) Subject: [Python-checkins] r88906 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3SG2Kf4bZDzNsc@mail.python.org> Author: ezio.melotti Date: Sat Oct 8 11:21:58 2011 New Revision: 88906 Log: #422: do nothing if the meta key is pressed. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Sat Oct 8 11:21:58 2011 @@ -77,8 +77,8 @@ // start from -1 so 'n' sends to the first message at the beginning var current = -1; $(document).keydown(function (event) { - // do nothing if ctrl/alt/shift are pressed - if (event.ctrlKey || event.altKey || event.shiftKey) + // do nothing if ctrl/alt/shift/meta are pressed + if (event.ctrlKey || event.altKey || event.shiftKey || event.metaKey) return true; // disable the shortcuts while editing form elements (except ESC) From python-checkins at python.org Sat Oct 8 18:31:03 2011 From: python-checkins at python.org (georg.brandl) Date: Sat, 08 Oct 2011 18:31:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Closes_=2312192=3A_Document?= =?utf8?q?_that_mutating_list_methods_do_not_return_the_instance?= Message-ID: http://hg.python.org/cpython/rev/352d075839f7 changeset: 72808:352d075839f7 user: Georg Brandl date: Sat Oct 08 18:32:40 2011 +0200 summary: Closes #12192: Document that mutating list methods do not return the instance (original patch by Mike Hoy). files: Doc/library/stdtypes.rst | 4 +++ Doc/tutorial/datastructures.rst | 24 ++++++++++++++------- Objects/listobject.c | 8 +++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -15,6 +15,10 @@ The principal built-in types are numerics, sequences, mappings, classes, instances and exceptions. +Some collection classes are mutable. The methods that add, subtract, or +rearrange their members in place, and don't return a specific item, never return +the collection instance itself but ``None``. + Some operations are supported by several object types; in particular, practically all objects can be compared, tested for truth value, and converted to a string (with the :func:`repr` function or the slightly different diff --git a/Doc/tutorial/datastructures.rst b/Doc/tutorial/datastructures.rst --- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -19,13 +19,13 @@ .. method:: list.append(x) :noindex: - Add an item to the end of the list; equivalent to ``a[len(a):] = [x]``. + Add an item to the end of the list. Equivalent to ``a[len(a):] = [x]``. .. method:: list.extend(L) :noindex: - Extend the list by appending all the items in the given list; equivalent to + Extend the list by appending all the items in the given list. Equivalent to ``a[len(a):] = L``. @@ -40,8 +40,8 @@ .. method:: list.remove(x) :noindex: - Remove the first item from the list whose value is *x*. It is an error if there - is no such item. + Remove the first item from the list whose value is *x*. It is an error if + there is no such item. .. method:: list.pop([i]) @@ -70,13 +70,14 @@ .. method:: list.sort() :noindex: - Sort the items of the list, in place. + Sort the items of the list in place. .. method:: list.reverse() :noindex: - Reverse the elements of the list, in place. + Reverse the elements of the list in place. + An example that uses most of the list methods:: @@ -99,6 +100,10 @@ >>> a [-1, 1, 66.25, 333, 333, 1234.5] +You might have noticed that methods like ``insert``, ``remove`` or ``sort`` that +modify the list have no return value printed -- they return ``None``. [1]_ This +is a design principle for all mutable data structures in Python. + .. _tut-lists-as-stacks: @@ -438,7 +443,7 @@ Performing ``list(d.keys())`` on a dictionary returns a list of all the keys used in the dictionary, in arbitrary order (if you want it sorted, just use -``sorted(d.keys())`` instead). [1]_ To check whether a single key is in the +``sorted(d.keys())`` instead). [2]_ To check whether a single key is in the dictionary, use the :keyword:`in` keyword. Here is a small example using a dictionary:: @@ -622,6 +627,9 @@ .. rubric:: Footnotes -.. [1] Calling ``d.keys()`` will return a :dfn:`dictionary view` object. It +.. [1] Other languages may return the mutated object, which allows method + chaining, such as ``d->insert("a")->remove("b")->sort();``. + +.. [2] Calling ``d.keys()`` will return a :dfn:`dictionary view` object. It supports operations like membership test and iteration, but its contents are not independent of the original dictionary -- it is only a *view*. diff --git a/Objects/listobject.c b/Objects/listobject.c --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2329,16 +2329,16 @@ PyDoc_STRVAR(copy_doc, "L.copy() -> list -- a shallow copy of L"); PyDoc_STRVAR(append_doc, -"L.append(object) -- append object to end"); +"L.append(object) -> None -- append object to end"); PyDoc_STRVAR(extend_doc, -"L.extend(iterable) -- extend list by appending elements from the iterable"); +"L.extend(iterable) -> None -- extend list by appending elements from the iterable"); PyDoc_STRVAR(insert_doc, "L.insert(index, object) -- insert object before index"); PyDoc_STRVAR(pop_doc, "L.pop([index]) -> item -- remove and return item at index (default last).\n" "Raises IndexError if list is empty or index is out of range."); PyDoc_STRVAR(remove_doc, -"L.remove(value) -- remove first occurrence of value.\n" +"L.remove(value) -> None -- remove first occurrence of value.\n" "Raises ValueError if the value is not present."); PyDoc_STRVAR(index_doc, "L.index(value, [start, [stop]]) -> integer -- return first index of value.\n" @@ -2348,7 +2348,7 @@ PyDoc_STRVAR(reverse_doc, "L.reverse() -- reverse *IN PLACE*"); PyDoc_STRVAR(sort_doc, -"L.sort(key=None, reverse=False) -- stable sort *IN PLACE*"); +"L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*"); static PyObject *list_subscript(PyListObject*, PyObject*); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 19:37:04 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 19:37:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_test=5Fgdb_following_th?= =?utf8?q?e_small_unicode_struct_change_in_c25262e97304_=28issue?= Message-ID: http://hg.python.org/cpython/rev/ef1f0434c79c changeset: 72809:ef1f0434c79c user: Antoine Pitrou date: Sat Oct 08 19:33:24 2011 +0200 summary: Fix test_gdb following the small unicode struct change in c25262e97304 (issue #13130) files: Tools/gdb/libpython.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Tools/gdb/libpython.py b/Tools/gdb/libpython.py --- a/Tools/gdb/libpython.py +++ b/Tools/gdb/libpython.py @@ -1152,7 +1152,7 @@ field_str = field_str.cast(_type_unsigned_char_ptr) elif repr_kind == 2: field_str = field_str.cast(_type_unsigned_short_ptr) - elif repr_kind == 3: + elif repr_kind == 4: field_str = field_str.cast(_type_unsigned_int_ptr) else: # Python 3.2 and earlier -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 19:44:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 19:44:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_a_missing_e?= =?utf8?q?ncoding_argument_when_opening_a_text_file_in_some_of_iobench=27s?= Message-ID: http://hg.python.org/cpython/rev/dbf5cbf0870b changeset: 72810:dbf5cbf0870b branch: 3.2 parent: 72805:1d71bc14113f user: Antoine Pitrou date: Sat Oct 08 19:40:04 2011 +0200 summary: Fix a missing encoding argument when opening a text file in some of iobench's subtests. (found by Georg) files: Tools/iobench/iobench.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Tools/iobench/iobench.py b/Tools/iobench/iobench.py --- a/Tools/iobench/iobench.py +++ b/Tools/iobench/iobench.py @@ -358,7 +358,7 @@ with text_open(name, "r") as f: return f.read() run_test_family(modify_tests, "b", text_files, - lambda fn: open(fn, "r+"), make_test_source) + lambda fn: text_open(fn, "r+"), make_test_source) def prepare_files(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 19:44:07 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 19:44:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Fix_a_missing_encoding_argument_when_opening_a_text_file_in_?= =?utf8?q?some_of_iobench=27s?= Message-ID: http://hg.python.org/cpython/rev/7822035e32ed changeset: 72811:7822035e32ed parent: 72809:ef1f0434c79c parent: 72810:dbf5cbf0870b user: Antoine Pitrou date: Sat Oct 08 19:40:22 2011 +0200 summary: Fix a missing encoding argument when opening a text file in some of iobench's subtests. (found by Georg) files: Tools/iobench/iobench.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Tools/iobench/iobench.py b/Tools/iobench/iobench.py --- a/Tools/iobench/iobench.py +++ b/Tools/iobench/iobench.py @@ -358,7 +358,7 @@ with text_open(name, "r") as f: return f.read() run_test_family(modify_tests, "b", text_files, - lambda fn: open(fn, "r+"), make_test_source) + lambda fn: text_open(fn, "r+"), make_test_source) def prepare_files(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 19:45:13 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 19:45:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_a_missing_e?= =?utf8?q?ncoding_argument_when_opening_a_text_file_in_some_of_iobench=27s?= Message-ID: http://hg.python.org/cpython/rev/8d4e5ee96ff8 changeset: 72812:8d4e5ee96ff8 branch: 2.7 parent: 72798:17b5afd321a8 user: Antoine Pitrou date: Sat Oct 08 19:41:34 2011 +0200 summary: Fix a missing encoding argument when opening a text file in some of iobench's subtests. (found by Georg) files: Tools/iobench/iobench.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Tools/iobench/iobench.py b/Tools/iobench/iobench.py --- a/Tools/iobench/iobench.py +++ b/Tools/iobench/iobench.py @@ -358,7 +358,7 @@ with text_open(name, "r") as f: return f.read() run_test_family(modify_tests, "b", text_files, - lambda fn: open(fn, "r+"), make_test_source) + lambda fn: text_open(fn, "r+"), make_test_source) def prepare_files(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 22:47:21 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 22:47:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_test=5Funicode_?= =?utf8?q?was_forgetting_to_run_the_common_string_tests_for_str=2Efind=28?= =?utf8?q?=29?= Message-ID: http://hg.python.org/cpython/rev/5ae50a57dd91 changeset: 72813:5ae50a57dd91 branch: 3.2 parent: 72810:dbf5cbf0870b user: Antoine Pitrou date: Sat Oct 08 22:41:35 2011 +0200 summary: test_unicode was forgetting to run the common string tests for str.find() files: Lib/test/test_unicode.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -174,6 +174,7 @@ self.checkequalnofix(0, 'aaa', 'count', 'a', 0, -10) def test_find(self): + string_tests.CommonTest.test_find(self) self.checkequalnofix(0, 'abcdefghiabc', 'find', 'abc') self.checkequalnofix(9, 'abcdefghiabc', 'find', 'abc', 1) self.checkequalnofix(-1, 'abcdefghiabc', 'find', 'def', 4) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 8 22:47:21 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 08 Oct 2011 22:47:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_test=5Funicode_was_forgetting_to_run_the_common_string_tests?= =?utf8?b?IGZvciBzdHIuZmluZCgp?= Message-ID: http://hg.python.org/cpython/rev/8cf814d5995d changeset: 72814:8cf814d5995d parent: 72811:7822035e32ed parent: 72813:5ae50a57dd91 user: Antoine Pitrou date: Sat Oct 08 22:42:00 2011 +0200 summary: test_unicode was forgetting to run the common string tests for str.find() files: Lib/test/test_unicode.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -170,6 +170,7 @@ self.checkequalnofix(0, 'aaa', 'count', 'a', 0, -10) def test_find(self): + string_tests.CommonTest.test_find(self) self.checkequalnofix(0, 'abcdefghiabc', 'find', 'abc') self.checkequalnofix(9, 'abcdefghiabc', 'find', 'abc', 1) self.checkequalnofix(-1, 'abcdefghiabc', 'find', 'def', 4) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 00:36:55 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 09 Oct 2011 00:36:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo_in_the_PyUnicode?= =?utf8?q?=5FFind=28=29_implementation?= Message-ID: http://hg.python.org/cpython/rev/da0dd6a96768 changeset: 72815:da0dd6a96768 user: Antoine Pitrou date: Sun Oct 09 00:33:09 2011 +0200 summary: Fix typo in the PyUnicode_Find() implementation files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8730,7 +8730,7 @@ ); else result = any_find_slice( - asciilib_find_slice, ucs1lib_rfind_slice, + asciilib_rfind_slice, ucs1lib_rfind_slice, ucs2lib_rfind_slice, ucs4lib_rfind_slice, str, sub, start, end ); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Oct 9 05:24:44 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 09 Oct 2011 05:24:44 +0200 Subject: [Python-checkins] Daily reference leaks (da0dd6a96768): sum=2115 Message-ID: results for da0dd6a96768 on branch "default" -------------------------------------------- test_socket leaked [705, 705, 705] references, sum=2115 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog5OmmIJ', '-x'] From python-checkins at python.org Sun Oct 9 08:59:46 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_a_typo_and_?= =?utf8?q?a_broken_link_=28part_of_=2310536=29=2E?= Message-ID: http://hg.python.org/cpython/rev/e48e6e9bdef6 changeset: 72816:e48e6e9bdef6 branch: 3.2 parent: 72792:459f5e10cd4f user: ?ric Araujo date: Fri Oct 07 22:02:58 2011 +0200 summary: Fix a typo and a broken link (part of #10536). Found by Franz Glasner in #2504. files: Doc/library/gettext.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -263,7 +263,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -644,8 +644,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:46 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Make_C_code_in_?= =?utf8?q?one_distutils_test_comply_with_ISO_C_=28=2310359=29=2E?= Message-ID: http://hg.python.org/cpython/rev/fe0972e102cd changeset: 72817:fe0972e102cd branch: 3.2 user: ?ric Araujo date: Fri Oct 07 23:13:45 2011 +0200 summary: Make C code in one distutils test comply with ISO C (#10359). Patch by Hallvard B Furuseth. files: Lib/distutils/tests/test_config_cmd.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:47 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_distutils_b?= =?utf8?q?yte-compilation_to_comply_with_PEP_3147_=28=2311254=29=2E?= Message-ID: http://hg.python.org/cpython/rev/27a36b05caed changeset: 72818:27a36b05caed branch: 3.2 user: ?ric Araujo date: Sat Oct 08 00:34:13 2011 +0200 summary: Fix distutils byte-compilation to comply with PEP 3147 (#11254). Patch by Jeff Ramnani. Tested with -B, -O and -OO. files: Doc/distutils/apiref.rst | 11 ++++++++--- Lib/distutils/tests/test_build_py.py | 9 ++++++--- Lib/distutils/tests/test_install_lib.py | 11 +++++++---- Lib/distutils/util.py | 11 +++++++++-- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1204,9 +1204,9 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`). + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) @@ -1231,6 +1231,11 @@ is used by the script generated in indirect mode; unless you know what you're doing, leave it set to ``None``. + .. versionchanged:: 3.2.3 + Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag + ` in their name, in a :file:`__pycache__` subdirectory + instead of files without tag in the current directory. + .. function:: rfc822_escape(header) diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py --- a/Lib/distutils/tests/test_build_py.py +++ b/Lib/distutils/tests/test_build_py.py @@ -3,6 +3,7 @@ import os import sys import io +import imp import unittest from distutils.command.build_py import build_py @@ -57,13 +58,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py --- a/Lib/distutils/tests/test_install_lib.py +++ b/Lib/distutils/tests/test_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils.command.install_data.""" import sys import os +import imp import unittest from distutils.command.install_lib import install_lib @@ -32,18 +33,20 @@ cmd.finalize_options() self.assertEqual(cmd.optimize, 2) - @unittest.skipUnless(not sys.dont_write_bytecode, - 'byte-compile not supported') + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = cmd.optimize = 1 f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -4,7 +4,11 @@ one of the other *util.py modules. """ -import sys, os, string, re +import os +import re +import imp +import sys +import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -529,7 +533,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -722,6 +722,7 @@ Brian Quinlan Anders Qvist Burton Radons +Jeff Ramnani Brodie Rao Antti Rasinen Sridhar Ratnakumar diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Library ------- +- Issue #11254: Teach distutils to compile .pyc and .pyo files in + PEP 3147-compliant __pycache__ directories. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:48 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_test=5Fsysc?= =?utf8?q?onfig_when_prefix_!=3D_exec-prefix_=28=239100=29=2E?= Message-ID: http://hg.python.org/cpython/rev/1f8aef75558c changeset: 72819:1f8aef75558c branch: 3.2 user: ?ric Araujo date: Sat Oct 08 01:55:07 2011 +0200 summary: Fix test_sysconfig when prefix != exec-prefix (#9100). I tested this manually; it would be great to have buildbots using installed Pythons, including Pythons configured with different prefix and exec-prefix. Reported by Zsolt Cserna. files: Lib/test/test_sysconfig.py | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -1,9 +1,5 @@ -"""Tests for 'site'. +"""Tests for sysconfig.""" -Tests assume the initial paths in sys.path once the interpreter has begun -executing have not been removed. - -""" import unittest import sys import os @@ -11,7 +7,7 @@ import shutil from copy import copy, deepcopy -from test.support import (run_unittest, TESTFN, unlink, get_attribute, +from test.support import (run_unittest, TESTFN, unlink, captured_stdout, skip_unless_symlink) import sysconfig @@ -265,8 +261,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:49 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_distutils?= =?utf8?q?=2Esysconfig=2Eget=5Fmakefile=5Ffilename_when_prefix_!=3D_exec-p?= =?utf8?q?refix?= Message-ID: http://hg.python.org/cpython/rev/9afd3d54c3cb changeset: 72820:9afd3d54c3cb branch: 3.2 user: ?ric Araujo date: Sat Oct 08 01:56:52 2011 +0200 summary: Fix distutils.sysconfig.get_makefile_filename when prefix != exec-prefix files: Lib/distutils/sysconfig.py | 2 +- Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -218,7 +218,7 @@ """Return full pathname of installed Makefile from the Python build.""" if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") - lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Library ------- +- Fix distutils.sysconfig.get_makefile_filename when Python was configured with + different prefix and exec-prefix. + - Issue #11254: Teach distutils to compile .pyc and .pyo files in PEP 3147-compliant __pycache__ directories. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:50 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_fixes_for_=2310526=2C_=2310359=2C_=2311254=2C_=239100_?= =?utf8?q?and_the_bug_without_number?= Message-ID: http://hg.python.org/cpython/rev/c52bac35b498 changeset: 72821:c52bac35b498 parent: 72795:16118ea2192b parent: 72820:9afd3d54c3cb user: ?ric Araujo date: Sat Oct 08 02:57:45 2011 +0200 summary: Merge fixes for #10526, #10359, #11254, #9100 and the bug without number files: Doc/distutils/apiref.rst | 11 ++++++++--- Doc/library/gettext.rst | 6 +++--- Lib/distutils/sysconfig.py | 2 +- Lib/distutils/tests/test_build_py.py | 9 ++++++--- Lib/distutils/tests/test_config_cmd.py | 4 ++-- Lib/distutils/tests/test_install_lib.py | 11 +++++++---- Lib/distutils/util.py | 11 +++++++++-- Lib/test/test_sysconfig.py | 11 +++++++++-- Misc/ACKS | 1 + Misc/NEWS | 6 ++++++ 10 files changed, 52 insertions(+), 20 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1204,9 +1204,9 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`). + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) @@ -1231,6 +1231,11 @@ is used by the script generated in indirect mode; unless you know what you're doing, leave it set to ``None``. + .. versionchanged:: 3.2.3 + Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag + ` in their name, in a :file:`__pycache__` subdirectory + instead of files without tag in the current directory. + .. function:: rfc822_escape(header) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -263,7 +263,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -644,8 +644,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -218,7 +218,7 @@ """Return full pathname of installed Makefile from the Python build.""" if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") - lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py --- a/Lib/distutils/tests/test_build_py.py +++ b/Lib/distutils/tests/test_build_py.py @@ -3,6 +3,7 @@ import os import sys import io +import imp import unittest from distutils.command.build_py import build_py @@ -57,13 +58,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py --- a/Lib/distutils/tests/test_install_lib.py +++ b/Lib/distutils/tests/test_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils.command.install_data.""" import sys import os +import imp import unittest from distutils.command.install_lib import install_lib @@ -32,18 +33,20 @@ cmd.finalize_options() self.assertEqual(cmd.optimize, 2) - @unittest.skipUnless(not sys.dont_write_bytecode, - 'byte-compile not supported') + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = cmd.optimize = 1 f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -4,7 +4,11 @@ one of the other *util.py modules. """ -import sys, os, string, re +import os +import re +import imp +import sys +import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -529,7 +533,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -3,9 +3,9 @@ import os import subprocess import shutil -from copy import copy, deepcopy +from copy import copy -from test.support import (run_unittest, TESTFN, unlink, get_attribute, +from test.support import (run_unittest, TESTFN, unlink, captured_stdout, skip_unless_symlink) import sysconfig @@ -256,8 +256,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -772,6 +772,7 @@ Anders Qvist J?r?me Radix Burton Radons +Jeff Ramnani Brodie Rao Antti Rasinen Sridhar Ratnakumar diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -301,6 +301,12 @@ Library ------- +- Fix distutils.sysconfig.get_makefile_filename when Python was configured with + different prefix and exec-prefix. + +- Issue #11254: Teach distutils to compile .pyc and .pyo files in + PEP 3147-compliant __pycache__ directories. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:50 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_C_code_in_one_packagin?= =?utf8?q?g_test_comply_with_ISO_C_=28=2310359=29=2E?= Message-ID: http://hg.python.org/cpython/rev/9ded1f21f0fd changeset: 72822:9ded1f21f0fd user: ?ric Araujo date: Sat Oct 08 02:58:50 2011 +0200 summary: Make C code in one packaging test comply with ISO C (#10359). Patch by Hallvard B Furuseth. files: Lib/packaging/tests/test_command_config.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/packaging/tests/test_command_config.py b/Lib/packaging/tests/test_command_config.py --- a/Lib/packaging/tests/test_command_config.py +++ b/Lib/packaging/tests/test_command_config.py @@ -29,10 +29,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:51 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_docstring_o?= =?utf8?q?f_distutils=2Eutil=2Ebyte=5Fcompile_=28followup_for_=2311254=29?= Message-ID: http://hg.python.org/cpython/rev/651e84363001 changeset: 72823:651e84363001 branch: 3.2 parent: 72820:9afd3d54c3cb user: ?ric Araujo date: Sat Oct 08 03:02:37 2011 +0200 summary: Fix docstring of distutils.util.byte_compile (followup for #11254) files: Lib/distutils/util.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -419,9 +419,9 @@ verbose=1, dry_run=0, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. 'py_files' is a list of files - to compile; any files that don't end in ".py" are silently skipped. - 'optimize' must be one of the following: + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list + of files to compile; any files that don't end in ".py" are silently + skipped. 'optimize' must be one of the following: 0 - don't optimize (generate .pyc) 1 - normal optimization (like "python -O") 2 - extra optimization (like "python -OO") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:52 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_packaging_byte-compilat?= =?utf8?q?ion_to_comply_with_PEP_3147_=28=2311254=29=2E?= Message-ID: http://hg.python.org/cpython/rev/439f47fadffa changeset: 72824:439f47fadffa parent: 72822:9ded1f21f0fd user: ?ric Araujo date: Sat Oct 08 04:09:15 2011 +0200 summary: Fix packaging byte-compilation to comply with PEP 3147 (#11254). I want to replace custom byte-compiling function with calls to compileall before 3.3b1, but in the short term it?s good to have this fixed. Adapted from the distutils patch by Jeff Ramnani. I tested with -B, -O and -OO; test_util and test_mixin2to3 fail in -O mode because lib2to3 doesn?t support it. files: Doc/library/packaging.util.rst | 9 ++++++--- Lib/packaging/tests/test_command_build_py.py | 9 ++++++--- Lib/packaging/tests/test_command_install_lib.py | 10 +++++++--- Lib/packaging/util.py | 8 ++++++-- Misc/NEWS | 2 +- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Doc/library/packaging.util.rst b/Doc/library/packaging.util.rst --- a/Doc/library/packaging.util.rst +++ b/Doc/library/packaging.util.rst @@ -121,9 +121,12 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`), + or to the same directory when using the distutils2 backport on Python + versions older than 3.2. + + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -2,6 +2,7 @@ import os import sys +import imp from packaging.command.build_py import build_py from packaging.dist import Distribution @@ -58,13 +59,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, packaging writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/packaging/tests/test_command_install_lib.py b/Lib/packaging/tests/test_command_install_lib.py --- a/Lib/packaging/tests/test_command_install_lib.py +++ b/Lib/packaging/tests/test_command_install_lib.py @@ -1,6 +1,7 @@ """Tests for packaging.command.install_data.""" +import os import sys -import os +import imp from packaging.tests import unittest, support from packaging.command.install_lib import install_lib @@ -36,6 +37,7 @@ @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = True cmd.optimize = 1 @@ -43,8 +45,10 @@ f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -3,6 +3,7 @@ import os import re import csv +import imp import sys import errno import shutil @@ -296,7 +297,7 @@ def byte_compile(py_files, optimize=0, force=False, prefix=None, base_dir=None, verbose=0, dry_run=False, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list of files to compile; any files that don't end in ".py" are silently skipped. 'optimize' must be one of the following: @@ -415,7 +416,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -304,7 +304,7 @@ - Fix distutils.sysconfig.get_makefile_filename when Python was configured with different prefix and exec-prefix. -- Issue #11254: Teach distutils to compile .pyc and .pyo files in +- Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in PEP 3147-compliant __pycache__ directories. - Issue #7367: Fix pkgutil.walk_paths to skip directories whose -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:53 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/598213b176ef changeset: 72825:598213b176ef parent: 72815:da0dd6a96768 parent: 72824:439f47fadffa user: ?ric Araujo date: Sun Oct 09 08:55:04 2011 +0200 summary: Branch merge files: Doc/distutils/apiref.rst | 11 +++++++-- Doc/library/gettext.rst | 6 ++-- Doc/library/packaging.util.rst | 9 +++++-- Lib/distutils/sysconfig.py | 2 +- Lib/distutils/tests/test_build_py.py | 9 +++++-- Lib/distutils/tests/test_config_cmd.py | 4 +- Lib/distutils/tests/test_install_lib.py | 11 ++++++--- Lib/distutils/util.py | 11 ++++++++- Lib/packaging/tests/test_command_build_py.py | 9 +++++-- Lib/packaging/tests/test_command_config.py | 4 +- Lib/packaging/tests/test_command_install_lib.py | 10 ++++++-- Lib/packaging/util.py | 8 +++++- Lib/test/test_sysconfig.py | 11 ++++++++- Misc/ACKS | 1 + Misc/NEWS | 6 +++++ 15 files changed, 79 insertions(+), 33 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1204,9 +1204,9 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`). + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) @@ -1231,6 +1231,11 @@ is used by the script generated in indirect mode; unless you know what you're doing, leave it set to ``None``. + .. versionchanged:: 3.2.3 + Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag + ` in their name, in a :file:`__pycache__` subdirectory + instead of files without tag in the current directory. + .. function:: rfc822_escape(header) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -263,7 +263,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -644,8 +644,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and diff --git a/Doc/library/packaging.util.rst b/Doc/library/packaging.util.rst --- a/Doc/library/packaging.util.rst +++ b/Doc/library/packaging.util.rst @@ -121,9 +121,12 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`), + or to the same directory when using the distutils2 backport on Python + versions older than 3.2. + + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -218,7 +218,7 @@ """Return full pathname of installed Makefile from the Python build.""" if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") - lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py --- a/Lib/distutils/tests/test_build_py.py +++ b/Lib/distutils/tests/test_build_py.py @@ -3,6 +3,7 @@ import os import sys import io +import imp import unittest from distutils.command.build_py import build_py @@ -57,13 +58,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py --- a/Lib/distutils/tests/test_install_lib.py +++ b/Lib/distutils/tests/test_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils.command.install_data.""" import sys import os +import imp import unittest from distutils.command.install_lib import install_lib @@ -32,18 +33,20 @@ cmd.finalize_options() self.assertEqual(cmd.optimize, 2) - @unittest.skipUnless(not sys.dont_write_bytecode, - 'byte-compile not supported') + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = cmd.optimize = 1 f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -4,7 +4,11 @@ one of the other *util.py modules. """ -import sys, os, string, re +import os +import re +import imp +import sys +import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -529,7 +533,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -2,6 +2,7 @@ import os import sys +import imp from packaging.command.build_py import build_py from packaging.dist import Distribution @@ -58,13 +59,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, packaging writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/packaging/tests/test_command_config.py b/Lib/packaging/tests/test_command_config.py --- a/Lib/packaging/tests/test_command_config.py +++ b/Lib/packaging/tests/test_command_config.py @@ -29,10 +29,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/packaging/tests/test_command_install_lib.py b/Lib/packaging/tests/test_command_install_lib.py --- a/Lib/packaging/tests/test_command_install_lib.py +++ b/Lib/packaging/tests/test_command_install_lib.py @@ -1,6 +1,7 @@ """Tests for packaging.command.install_data.""" +import os import sys -import os +import imp from packaging.tests import unittest, support from packaging.command.install_lib import install_lib @@ -36,6 +37,7 @@ @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = True cmd.optimize = 1 @@ -43,8 +45,10 @@ f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -3,6 +3,7 @@ import os import re import csv +import imp import sys import errno import shutil @@ -296,7 +297,7 @@ def byte_compile(py_files, optimize=0, force=False, prefix=None, base_dir=None, verbose=0, dry_run=False, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list of files to compile; any files that don't end in ".py" are silently skipped. 'optimize' must be one of the following: @@ -415,7 +416,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -3,9 +3,9 @@ import os import subprocess import shutil -from copy import copy, deepcopy +from copy import copy -from test.support import (run_unittest, TESTFN, unlink, get_attribute, +from test.support import (run_unittest, TESTFN, unlink, captured_stdout, skip_unless_symlink) import sysconfig @@ -256,8 +256,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -772,6 +772,7 @@ Anders Qvist J?r?me Radix Burton Radons +Jeff Ramnani Brodie Rao Antti Rasinen Sridhar Ratnakumar diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -301,6 +301,12 @@ Library ------- +- Fix distutils.sysconfig.get_makefile_filename when Python was configured with + different prefix and exec-prefix. + +- Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in + PEP 3147-compliant __pycache__ directories. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:53 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_As_it_turns_out?= =?utf8?q?=2C_this_bug_was_already_in_the_tracker=3A_=2311171?= Message-ID: http://hg.python.org/cpython/rev/6542e4028ed2 changeset: 72826:6542e4028ed2 branch: 3.2 parent: 72823:651e84363001 user: ?ric Araujo date: Sun Oct 09 06:32:38 2011 +0200 summary: As it turns out, this bug was already in the tracker: #11171 files: Misc/NEWS | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,8 +43,8 @@ Library ------- -- Fix distutils.sysconfig.get_makefile_filename when Python was configured with - different prefix and exec-prefix. +- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was + configured with different prefix and exec-prefix. - Issue #11254: Teach distutils to compile .pyc and .pyo files in PEP 3147-compliant __pycache__ directories. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:54 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_tests_for_U?= =?utf8?q?nicode_handling_in_distutils=E2=80=99_check_and_register_=28=231?= =?utf8?q?3114=29?= Message-ID: http://hg.python.org/cpython/rev/e16792003597 changeset: 72827:e16792003597 branch: 3.2 user: ?ric Araujo date: Sun Oct 09 07:25:33 2011 +0200 summary: Add tests for Unicode handling in distutils? check and register (#13114) files: Lib/distutils/tests/test_check.py | 13 ++++++++- Lib/distutils/tests/test_register.py | 20 +++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -46,6 +46,15 @@ cmd = self._run(metadata, strict=1) self.assertEqual(cmd._warnings, 0) + # now a test with non-ASCII characters + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual(cmd._warnings, 0) + def test_check_document(self): if not HAS_DOCUTILS: # won't test without docutils return @@ -80,8 +89,8 @@ self.assertRaises(DistutilsSetupError, self._run, metadata, **{'strict': 1, 'restructuredtext': 1}) - # and non-broken rest - metadata['long_description'] = 'title\n=====\n\ntest' + # and non-broken rest, including a non-ASCII character to test #12114 + metadata['long_description'] = 'title\n=====\n\ntest \u00df' cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py --- a/Lib/distutils/tests/test_register.py +++ b/Lib/distutils/tests/test_register.py @@ -214,7 +214,7 @@ # metadata are OK but long_description is broken metadata = {'url': 'xxx', 'author': 'xxx', - 'author_email': 'xxx', + 'author_email': '?x?x?', 'name': 'xxx', 'version': 'xxx', 'long_description': 'title\n==\n\ntext'} @@ -247,6 +247,24 @@ finally: del register_module.input + # and finally a Unicode test (bug #12114) + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = 1 + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs.__call__ + # let's run the command + try: + cmd.run() + finally: + del register_module.input + def test_check_metadata_deprecated(self): # makes sure make_metadata is deprecated cmd = self._get_cmd() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:55 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:55 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/edc04ee314a9 changeset: 72828:edc04ee314a9 branch: 3.2 parent: 72813:5ae50a57dd91 parent: 72827:e16792003597 user: ?ric Araujo date: Sun Oct 09 07:32:35 2011 +0200 summary: Branch merge files: Doc/distutils/apiref.rst | 11 +++++- Doc/library/gettext.rst | 6 +- Lib/distutils/sysconfig.py | 2 +- Lib/distutils/tests/test_build_py.py | 9 +++- Lib/distutils/tests/test_check.py | 13 +++++++- Lib/distutils/tests/test_config_cmd.py | 4 +- Lib/distutils/tests/test_install_lib.py | 11 ++++-- Lib/distutils/tests/test_register.py | 20 ++++++++++++- Lib/distutils/util.py | 17 +++++++--- Lib/test/test_sysconfig.py | 15 +++++--- Misc/ACKS | 1 + Misc/NEWS | 6 +++ 12 files changed, 85 insertions(+), 30 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1204,9 +1204,9 @@ .. function:: byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None]) Byte-compile a collection of Python source files to either :file:`.pyc` or - :file:`.pyo` files in the same directory. *py_files* is a list of files to - compile; any files that don't end in :file:`.py` are silently skipped. - *optimize* must be one of the following: + :file:`.pyo` files in a :file:`__pycache__` subdirectory (see :pep:`3147`). + *py_files* is a list of files to compile; any files that don't end in + :file:`.py` are silently skipped. *optimize* must be one of the following: * ``0`` - don't optimize (generate :file:`.pyc`) * ``1`` - normal optimization (like ``python -O``) @@ -1231,6 +1231,11 @@ is used by the script generated in indirect mode; unless you know what you're doing, leave it set to ``None``. + .. versionchanged:: 3.2.3 + Create ``.pyc`` or ``.pyo`` files with an :func:`import magic tag + ` in their name, in a :file:`__pycache__` subdirectory + instead of files without tag in the current directory. + .. function:: rfc822_escape(header) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -263,7 +263,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the fallback. + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -644,8 +644,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -218,7 +218,7 @@ """Return full pathname of installed Makefile from the Python build.""" if python_build: return os.path.join(os.path.dirname(sys.executable), "Makefile") - lib_dir = get_python_lib(plat_specific=1, standard_lib=1) + lib_dir = get_python_lib(plat_specific=0, standard_lib=1) config_file = 'config-{}{}'.format(get_python_version(), build_flags) return os.path.join(lib_dir, config_file, 'Makefile') diff --git a/Lib/distutils/tests/test_build_py.py b/Lib/distutils/tests/test_build_py.py --- a/Lib/distutils/tests/test_build_py.py +++ b/Lib/distutils/tests/test_build_py.py @@ -3,6 +3,7 @@ import os import sys import io +import imp import unittest from distutils.command.build_py import build_py @@ -57,13 +58,15 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils writes pyc, not pyo; bug? + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -46,6 +46,15 @@ cmd = self._run(metadata, strict=1) self.assertEqual(cmd._warnings, 0) + # now a test with non-ASCII characters + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual(cmd._warnings, 0) + def test_check_document(self): if not HAS_DOCUTILS: # won't test without docutils return @@ -80,8 +89,8 @@ self.assertRaises(DistutilsSetupError, self._run, metadata, **{'strict': 1, 'restructuredtext': 1}) - # and non-broken rest - metadata['long_description'] = 'title\n=====\n\ntest' + # and non-broken rest, including a non-ASCII character to test #12114 + metadata['long_description'] = 'title\n=====\n\ntest \u00df' cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/distutils/tests/test_install_lib.py b/Lib/distutils/tests/test_install_lib.py --- a/Lib/distutils/tests/test_install_lib.py +++ b/Lib/distutils/tests/test_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils.command.install_data.""" import sys import os +import imp import unittest from distutils.command.install_lib import install_lib @@ -32,18 +33,20 @@ cmd.finalize_options() self.assertEqual(cmd.optimize, 2) - @unittest.skipUnless(not sys.dont_write_bytecode, - 'byte-compile not supported') + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = cmd.optimize = 1 f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py --- a/Lib/distutils/tests/test_register.py +++ b/Lib/distutils/tests/test_register.py @@ -214,7 +214,7 @@ # metadata are OK but long_description is broken metadata = {'url': 'xxx', 'author': 'xxx', - 'author_email': 'xxx', + 'author_email': '?x?x?', 'name': 'xxx', 'version': 'xxx', 'long_description': 'title\n==\n\ntext'} @@ -247,6 +247,24 @@ finally: del register_module.input + # and finally a Unicode test (bug #12114) + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = 1 + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs.__call__ + # let's run the command + try: + cmd.run() + finally: + del register_module.input + def test_check_metadata_deprecated(self): # makes sure make_metadata is deprecated cmd = self._get_cmd() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -4,7 +4,11 @@ one of the other *util.py modules. """ -import sys, os, string, re +import os +import re +import imp +import sys +import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -415,9 +419,9 @@ verbose=1, dry_run=0, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. 'py_files' is a list of files - to compile; any files that don't end in ".py" are silently skipped. - 'optimize' must be one of the following: + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list + of files to compile; any files that don't end in ".py" are silently + skipped. 'optimize' must be one of the following: 0 - don't optimize (generate .pyc) 1 - normal optimization (like "python -O") 2 - extra optimization (like "python -OO") @@ -529,7 +533,10 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if optimize >= 0: + cfile = imp.cache_from_source(file, debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) dfile = file if prefix: if file[:len(prefix)] != prefix: diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -1,9 +1,5 @@ -"""Tests for 'site'. +"""Tests for sysconfig.""" -Tests assume the initial paths in sys.path once the interpreter has begun -executing have not been removed. - -""" import unittest import sys import os @@ -11,7 +7,7 @@ import shutil from copy import copy, deepcopy -from test.support import (run_unittest, TESTFN, unlink, get_attribute, +from test.support import (run_unittest, TESTFN, unlink, captured_stdout, skip_unless_symlink) import sysconfig @@ -265,8 +261,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -722,6 +722,7 @@ Brian Quinlan Anders Qvist Burton Radons +Jeff Ramnani Brodie Rao Antti Rasinen Sridhar Ratnakumar diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,12 @@ Library ------- +- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was + configured with different prefix and exec-prefix. + +- Issue #11254: Teach distutils to compile .pyc and .pyo files in + PEP 3147-compliant __pycache__ directories. + - Issue #11250: Back port fix from 3.3 branch, so that 2to3 can handle files with line feeds. This was ported from the sandbox to the 3.3 branch, but didn't make it into 3.2. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 08:59:56 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 08:59:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/a52b5be3676a changeset: 72829:a52b5be3676a parent: 72825:598213b176ef parent: 72828:edc04ee314a9 user: ?ric Araujo date: Sun Oct 09 08:58:16 2011 +0200 summary: Merge 3.2 files: Lib/distutils/tests/test_check.py | 13 ++++++++- Lib/distutils/tests/test_register.py | 20 +++++++++++++++- Lib/distutils/util.py | 6 ++-- Misc/NEWS | 4 +- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -46,6 +46,15 @@ cmd = self._run(metadata, strict=1) self.assertEqual(cmd._warnings, 0) + # now a test with non-ASCII characters + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual(cmd._warnings, 0) + def test_check_document(self): if not HAS_DOCUTILS: # won't test without docutils return @@ -80,8 +89,8 @@ self.assertRaises(DistutilsSetupError, self._run, metadata, **{'strict': 1, 'restructuredtext': 1}) - # and non-broken rest - metadata['long_description'] = 'title\n=====\n\ntest' + # and non-broken rest, including a non-ASCII character to test #12114 + metadata['long_description'] = 'title\n=====\n\ntest \u00df' cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py --- a/Lib/distutils/tests/test_register.py +++ b/Lib/distutils/tests/test_register.py @@ -214,7 +214,7 @@ # metadata are OK but long_description is broken metadata = {'url': 'xxx', 'author': 'xxx', - 'author_email': 'xxx', + 'author_email': '?x?x?', 'name': 'xxx', 'version': 'xxx', 'long_description': 'title\n==\n\ntext'} @@ -247,6 +247,24 @@ finally: del register_module.input + # and finally a Unicode test (bug #12114) + metadata = {'url': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'description': 'Something about esszet \u00df', + 'long_description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = 1 + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs.__call__ + # let's run the command + try: + cmd.run() + finally: + del register_module.input + def test_check_metadata_deprecated(self): # makes sure make_metadata is deprecated cmd = self._get_cmd() diff --git a/Lib/distutils/util.py b/Lib/distutils/util.py --- a/Lib/distutils/util.py +++ b/Lib/distutils/util.py @@ -419,9 +419,9 @@ verbose=1, dry_run=0, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. 'py_files' is a list of files - to compile; any files that don't end in ".py" are silently skipped. - 'optimize' must be one of the following: + or .pyo files in a __pycache__ subdirectory. 'py_files' is a list + of files to compile; any files that don't end in ".py" are silently + skipped. 'optimize' must be one of the following: 0 - don't optimize (generate .pyc) 1 - normal optimization (like "python -O") 2 - extra optimization (like "python -OO") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -301,8 +301,8 @@ Library ------- -- Fix distutils.sysconfig.get_makefile_filename when Python was configured with - different prefix and exec-prefix. +- Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was + configured with different prefix and exec-prefix. - Issue #11254: Teach distutils and packaging to compile .pyc and .pyo files in PEP 3147-compliant __pycache__ directories. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 09:00:10 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 09:00:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_a_typo_and_?= =?utf8?q?a_broken_link_=28part_of_=2310536=29=2E?= Message-ID: http://hg.python.org/cpython/rev/1e48a2b484a3 changeset: 72830:1e48a2b484a3 branch: 2.7 parent: 72794:666e7e325795 user: ?ric Araujo date: Sat Oct 08 02:15:04 2011 +0200 summary: Fix a typo and a broken link (part of #10536). Found by Franz Glasner in #2504. files: Doc/library/gettext.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -300,7 +300,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -756,8 +756,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 09:00:13 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 09:00:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Make_C_code_in_?= =?utf8?q?one_distutils_test_comply_with_ISO_C_=28=2310359=29=2E?= Message-ID: http://hg.python.org/cpython/rev/134b68cae802 changeset: 72831:134b68cae802 branch: 2.7 user: ?ric Araujo date: Sat Oct 08 02:15:55 2011 +0200 summary: Make C code in one distutils test comply with ISO C (#10359). Patch by Hallvard B Furuseth. files: Lib/distutils/tests/test_config_cmd.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 09:00:17 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 09:00:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_test=5Fsysc?= =?utf8?q?onfig_when_prefix_!=3D_exec-prefix_=28=239100=29=2E?= Message-ID: http://hg.python.org/cpython/rev/27045f93e4cb changeset: 72832:27045f93e4cb branch: 2.7 user: ?ric Araujo date: Sat Oct 08 02:49:12 2011 +0200 summary: Fix test_sysconfig when prefix != exec-prefix (#9100). Reported by Zsolt Cserna. files: Lib/test/test_sysconfig.py | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -1,9 +1,5 @@ -"""Tests for 'site'. +"""Tests for sysconfig.""" -Tests assume the initial paths in sys.path once the interpreter has begun -executing have not been removed. - -""" import unittest import sys import os @@ -259,8 +255,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 09:00:17 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 09:00:17 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/86ffa3d59c36 changeset: 72833:86ffa3d59c36 branch: 2.7 parent: 72812:8d4e5ee96ff8 parent: 72832:27045f93e4cb user: ?ric Araujo date: Sun Oct 09 06:33:54 2011 +0200 summary: Branch merge files: Doc/library/gettext.rst | 6 +++--- Lib/distutils/tests/test_config_cmd.py | 4 ++-- Lib/test/test_sysconfig.py | 13 ++++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -300,7 +300,7 @@ .. method:: lngettext(singular, plural, n) - If a fallback has been set, forward :meth:`ngettext` to the + If a fallback has been set, forward :meth:`lngettext` to the fallback. Otherwise, return the translated message. Overridden in derived classes. @@ -756,8 +756,8 @@ .. [#] See the footnote for :func:`bindtextdomain` above. .. [#] Fran?ois Pinard has written a program called :program:`xpot` which does a - similar job. It is available as part of his :program:`po-utils` package at http - ://po-utils.progiciels-bpi.ca/. + similar job. It is available as part of his `po-utils package + `_. .. [#] :program:`msgfmt.py` is binary compatible with GNU :program:`msgfmt` except that it provides a simpler, all-Python implementation. With this and diff --git a/Lib/distutils/tests/test_config_cmd.py b/Lib/distutils/tests/test_config_cmd.py --- a/Lib/distutils/tests/test_config_cmd.py +++ b/Lib/distutils/tests/test_config_cmd.py @@ -44,10 +44,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py --- a/Lib/test/test_sysconfig.py +++ b/Lib/test/test_sysconfig.py @@ -1,9 +1,5 @@ -"""Tests for 'site'. +"""Tests for sysconfig.""" -Tests assume the initial paths in sys.path once the interpreter has begun -executing have not been removed. - -""" import unittest import sys import os @@ -259,8 +255,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 09:00:18 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 09 Oct 2011 09:00:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_distutils?= =?utf8?q?=E2=80=99_check_and_register_Unicode_handling_=28=2313114=29=2E?= Message-ID: http://hg.python.org/cpython/rev/8d837bd8148a changeset: 72834:8d837bd8148a branch: 2.7 user: ?ric Araujo date: Sun Oct 09 07:11:19 2011 +0200 summary: Fix distutils? check and register Unicode handling (#13114). The check command was fixed by Kirill Kuzminykh. The register command was using StringIO.getvalue, which uses ?''.join? and thus coerces to str using the default encoding (ASCII), so I changed the code to use one extra intermediary list and correctly encode to UTF-8. files: Lib/distutils/command/check.py | 3 + Lib/distutils/command/register.py | 28 ++++++++++----- Lib/distutils/tests/test_check.py | 14 ++++++- Lib/distutils/tests/test_register.py | 20 ++++++++++- Misc/ACKS | 1 + Misc/NEWS | 3 + 6 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Lib/distutils/command/check.py b/Lib/distutils/command/check.py --- a/Lib/distutils/command/check.py +++ b/Lib/distutils/command/check.py @@ -5,6 +5,7 @@ __revision__ = "$Id$" from distutils.core import Command +from distutils.dist import PKG_INFO_ENCODING from distutils.errors import DistutilsSetupError try: @@ -108,6 +109,8 @@ def check_restructuredtext(self): """Checks if the long string fields are reST-compliant.""" data = self.distribution.get_long_description() + if not isinstance(data, unicode): + data = data.decode(PKG_INFO_ENCODING) for warning in self._check_rst_data(data): line = warning[-1].get('line') if line is None: diff --git a/Lib/distutils/command/register.py b/Lib/distutils/command/register.py --- a/Lib/distutils/command/register.py +++ b/Lib/distutils/command/register.py @@ -10,7 +10,6 @@ import urllib2 import getpass import urlparse -import StringIO from warnings import warn from distutils.core import PyPIRCCommand @@ -260,21 +259,30 @@ boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' sep_boundary = '\n--' + boundary end_boundary = sep_boundary + '--' - body = StringIO.StringIO() + chunks = [] for key, value in data.items(): # handle multiple entries for the same name if type(value) not in (type([]), type( () )): value = [value] for value in value: - body.write(sep_boundary) - body.write('\nContent-Disposition: form-data; name="%s"'%key) - body.write("\n\n") - body.write(value) + chunks.append(sep_boundary) + chunks.append('\nContent-Disposition: form-data; name="%s"'%key) + chunks.append("\n\n") + chunks.append(value) if value and value[-1] == '\r': - body.write('\n') # write an extra newline (lurve Macs) - body.write(end_boundary) - body.write("\n") - body = body.getvalue() + chunks.append('\n') # write an extra newline (lurve Macs) + chunks.append(end_boundary) + chunks.append("\n") + + # chunks may be bytes (str) or unicode objects that we need to encode + body = [] + for chunk in chunks: + if isinstance(chunk, unicode): + body.append(chunk.encode('utf-8')) + else: + body.append(chunk) + + body = ''.join(body) # build the Request headers = { diff --git a/Lib/distutils/tests/test_check.py b/Lib/distutils/tests/test_check.py --- a/Lib/distutils/tests/test_check.py +++ b/Lib/distutils/tests/test_check.py @@ -1,3 +1,4 @@ +# -*- encoding: utf8 -*- """Tests for distutils.command.check.""" import unittest from test.test_support import run_unittest @@ -46,6 +47,15 @@ cmd = self._run(metadata, strict=1) self.assertEqual(cmd._warnings, 0) + # now a test with Unicode entries + metadata = {'url': u'xxx', 'author': u'\u00c9ric', + 'author_email': u'xxx', u'name': 'xxx', + 'version': u'xxx', + 'description': u'Something about esszet \u00df', + 'long_description': u'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual(cmd._warnings, 0) + def test_check_document(self): if not HAS_DOCUTILS: # won't test without docutils return @@ -80,8 +90,8 @@ self.assertRaises(DistutilsSetupError, self._run, metadata, **{'strict': 1, 'restructuredtext': 1}) - # and non-broken rest - metadata['long_description'] = 'title\n=====\n\ntest' + # and non-broken rest, including a non-ASCII character to test #12114 + metadata['long_description'] = u'title\n=====\n\ntest \u00df' cmd = self._run(metadata, strict=1, restructuredtext=1) self.assertEqual(cmd._warnings, 0) diff --git a/Lib/distutils/tests/test_register.py b/Lib/distutils/tests/test_register.py --- a/Lib/distutils/tests/test_register.py +++ b/Lib/distutils/tests/test_register.py @@ -1,5 +1,5 @@ +# -*- encoding: utf8 -*- """Tests for distutils.command.register.""" -# -*- encoding: utf8 -*- import sys import os import unittest @@ -246,6 +246,24 @@ finally: del register_module.raw_input + # and finally a Unicode test (bug #12114) + metadata = {'url': u'xxx', 'author': u'\u00c9ric', + 'author_email': u'xxx', u'name': 'xxx', + 'version': u'xxx', + 'description': u'Something about esszet \u00df', + 'long_description': u'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = 1 + inputs = RawInputs('1', 'tarek', 'y') + register_module.raw_input = inputs.__call__ + # let's run the command + try: + cmd.run() + finally: + del register_module.raw_input + def test_check_metadata_deprecated(self): # makes sure make_metadata is deprecated cmd = self._get_cmd() diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -469,6 +469,7 @@ Andrew Kuchling Ralf W. Grosse-Kunstleve Vladimir Kushnir +Kirill Kuzminykh (?????? ?????????) Ross Lagerwall Cameron Laird ?ukasz Langa diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,9 @@ Library ------- +- Issue #13114: Fix the distutils commands check and register when the + long description is a Unicode string with non-ASCII characters. + - Issue #7367: Fix pkgutil.walk_paths to skip directories whose contents cannot be read. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 10:38:47 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 09 Oct 2011 10:38:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_API_for_static_strings?= =?utf8?q?=2C_primarily_good_for_identifiers=2E?= Message-ID: http://hg.python.org/cpython/rev/5e33219492bc changeset: 72835:5e33219492bc parent: 72829:a52b5be3676a user: Martin v. L?wis date: Sun Oct 09 10:38:36 2011 +0200 summary: Add API for static strings, primarily good for identifiers. Thanks to Konrad Sch?bel and Jasper Schulz for helping with the mass-editing. files: Include/abstract.h | 12 + Include/object.h | 4 + Include/unicodeobject.h | 34 ++++ Misc/NEWS | 2 + Modules/_bisectmodule.c | 8 +- Modules/_collectionsmodule.c | 4 +- Modules/_ctypes/_ctypes.c | 4 +- Modules/_ctypes/callproc.c | 6 +- Modules/_cursesmodule.c | 7 +- Modules/_datetimemodule.c | 77 +++++++--- Modules/_elementtree.c | 33 ++- Modules/_io/_iomodule.c | 7 +- Modules/_io/bufferedio.c | 47 ++++-- Modules/_io/fileio.c | 5 +- Modules/_io/iobase.c | 27 ++- Modules/_io/textio.c | 103 ++++++++----- Modules/_pickle.c | 14 +- Modules/_posixsubprocess.c | 11 +- Modules/_sqlite/connection.c | 15 +- Modules/_sqlite/cursor.c | 3 +- Modules/_sqlite/microprotocols.c | 8 +- Modules/_sqlite/module.c | 3 +- Modules/arraymodule.c | 7 +- Modules/cjkcodecs/multibytecodec.c | 7 +- Modules/faulthandler.c | 9 +- Modules/gcmodule.c | 4 +- Modules/itertoolsmodule.c | 4 +- Modules/mmapmodule.c | 4 +- Modules/ossaudiodev.c | 4 +- Modules/socketmodule.c | 4 +- Modules/timemodule.c | 5 +- Objects/abstract.c | 125 +++++++++++----- Objects/descrobject.c | 15 +- Objects/dictobject.c | 12 +- Objects/fileobject.c | 3 +- Objects/object.c | 36 ++++ Objects/typeobject.c | 9 +- Objects/unicodeobject.c | 31 ++++ Objects/weakrefobject.c | 5 +- PC/_msi.c | 8 +- Parser/tokenizer.c | 3 +- Python/_warnings.c | 3 +- Python/ast.c | 3 +- Python/bltinmodule.c | 13 +- Python/ceval.c | 3 +- Python/import.c | 11 +- Python/marshal.c | 11 +- Python/pythonrun.c | 30 ++- Python/sysmodule.c | 3 +- Python/traceback.c | 12 +- 50 files changed, 578 insertions(+), 240 deletions(-) diff --git a/Include/abstract.h b/Include/abstract.h --- a/Include/abstract.h +++ b/Include/abstract.h @@ -7,6 +7,7 @@ #ifdef PY_SSIZE_T_CLEAN #define PyObject_CallFunction _PyObject_CallFunction_SizeT #define PyObject_CallMethod _PyObject_CallMethod_SizeT +#define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT #endif /* Abstract Object Interface (many thanks to Jim Fulton) */ @@ -307,11 +308,22 @@ Python expression: o.method(args). */ + PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *o, _Py_Identifier *method, + char *format, ...); + + /* + Like PyObject_CallMethod, but expect a _Py_Identifier* as the + method name. + */ + PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, char *format, ...); PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...); + PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *o, + _Py_Identifier *name, + char *format, ...); PyAPI_FUNC(PyObject *) PyObject_CallFunctionObjArgs(PyObject *callable, ...); diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -454,6 +454,7 @@ PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); /* Generic operations on objects */ +struct _Py_Identifier; #ifndef Py_LIMITED_API PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int); PyAPI_FUNC(void) _Py_BreakPoint(void); @@ -471,6 +472,9 @@ PyAPI_FUNC(PyObject *) PyObject_GetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_SetAttr(PyObject *, PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_HasAttr(PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) _PyObject_GetAttrId(PyObject *, struct _Py_Identifier *); +PyAPI_FUNC(int) _PyObject_SetAttrId(PyObject *, struct _Py_Identifier *, PyObject *); +PyAPI_FUNC(int) _PyObject_HasAttrId(PyObject *, struct _Py_Identifier *); #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject **) _PyObject_GetDictPtr(PyObject *); #endif diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2024,6 +2024,40 @@ int check_content); #endif +/********************* String Literals ****************************************/ +/* This structure helps managing static strings. The basic usage goes like this: + Instead of doing + + r = PyObject_CallMethod(o, "foo", "args", ...); + + do + + _Py_identifier(foo); + ... + r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...); + + PyId_foo is a static variable, either on block level or file level. On first + usage, the string "foo" is interned, and the structures are linked. On interpreter + shutdown, all strings are released (through _PyUnicode_ClearStaticStrings). + + Alternatively, _Py_static_string allows to choose the variable name. + _PyUnicode_FromId returns a new reference to the interned string. + _PyObject_{Get,Set,Has}AttrId are __getattr__ versions using _Py_Identifier*. +*/ +typedef struct _Py_Identifier { + struct _Py_Identifier *next; + const char* string; + PyObject *object; +} _Py_Identifier; + +#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 }; +#define _Py_identifier(varname) _Py_static_string(PyId_##varname, #varname) + +/* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ +PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); +/* Clear all static strings. */ +PyAPI_FUNC(void) _PyUnicode_ClearStaticStrings(void); + #ifdef __cplusplus } #endif diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Add internal API for static strings (_Py_identifier et.al.). + - Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described as "The pipe is being closed") is now mapped to POSIX errno EPIPE (previously EINVAL). diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -86,7 +86,9 @@ if (PyList_Insert(list, index, item) < 0) return NULL; } else { - result = PyObject_CallMethod(list, "insert", "nO", index, item); + _Py_identifier(insert); + + result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); if (result == NULL) return NULL; Py_DECREF(result); @@ -186,7 +188,9 @@ if (PyList_Insert(list, index, item) < 0) return NULL; } else { - result = PyObject_CallMethod(list, "insert", "iO", index, item); + _Py_identifier(insert); + + result = _PyObject_CallMethodId(list, &PyId_insert, "iO", index, item); if (result == NULL) return NULL; Py_DECREF(result); diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1334,13 +1334,15 @@ PyObject *items; PyObject *iter; PyObject *result; + _Py_identifier(items); + if (dd->default_factory == NULL || dd->default_factory == Py_None) args = PyTuple_New(0); else args = PyTuple_Pack(1, dd->default_factory); if (args == NULL) return NULL; - items = PyObject_CallMethod((PyObject *)dd, "items", "()"); + items = _PyObject_CallMethodId((PyObject *)dd, &PyId_items, "()"); if (items == NULL) { Py_DECREF(args); return NULL; diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3679,8 +3679,10 @@ PyTuple_SET_ITEM(tup, index, v); index++; } else if (bit & outmask) { + _Py_identifier(__ctypes_from_outparam__); + v = PyTuple_GET_ITEM(callargs, i); - v = PyObject_CallMethod(v, "__ctypes_from_outparam__", NULL); + v = _PyObject_CallMethodId(v, &PyId___ctypes_from_outparam__, NULL); if (v == NULL || numretvals == 1) { Py_DECREF(callargs); return v; diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1687,13 +1687,15 @@ PyObject *state; PyObject *result; PyObject *tmp; + _Py_identifier(__new__); + _Py_identifier(__setstate__); if (!PyArg_ParseTuple(args, "OO", &typ, &state)) return NULL; - result = PyObject_CallMethod(typ, "__new__", "O", typ); + result = _PyObject_CallMethodId(typ, &PyId___new__, "O", typ); if (result == NULL) return NULL; - tmp = PyObject_CallMethod(result, "__setstate__", "O", state); + tmp = _PyObject_CallMethodId(result, &PyId___setstate__, "O", state); if (tmp == NULL) { Py_DECREF(result); return NULL; diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1418,10 +1418,12 @@ while (1) { char buf[BUFSIZ]; Py_ssize_t n = fread(buf, 1, BUFSIZ, fp); + _Py_identifier(write); + if (n <= 0) break; Py_DECREF(res); - res = PyObject_CallMethod(stream, "write", "y#", buf, n); + res = _PyObject_CallMethodId(stream, &PyId_write, "y#", buf, n); if (res == NULL) break; } @@ -1911,6 +1913,7 @@ WINDOW *win; PyCursesInitialised; + _Py_identifier(read); strcpy(fn, "/tmp/py.curses.getwin.XXXXXX"); fd = mkstemp(fn); @@ -1922,7 +1925,7 @@ remove(fn); return PyErr_SetFromErrnoWithFilename(PyExc_IOError, fn); } - data = PyObject_CallMethod(stream, "read", ""); + data = _PyObject_CallMethodId(stream, &PyId_read, ""); if (data == NULL) { fclose(fp); remove(fn); diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -946,6 +946,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) { PyObject *result; + _Py_identifier(tzname); assert(tzinfo != NULL); assert(check_tzinfo_subclass(tzinfo) >= 0); @@ -954,7 +955,7 @@ if (tzinfo == Py_None) Py_RETURN_NONE; - result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg); + result = _PyObject_CallMethodId(tzinfo, &PyId_tzname, "O", tzinfoarg); if (result == NULL || result == Py_None) return result; @@ -1078,6 +1079,8 @@ PyObject *temp; PyObject *tzinfo = get_tzinfo_member(object); PyObject *Zreplacement = PyUnicode_FromStringAndSize(NULL, 0); + _Py_identifier(replace); + if (Zreplacement == NULL) return NULL; if (tzinfo == Py_None || tzinfo == NULL) @@ -1098,7 +1101,7 @@ * strftime doesn't treat them as format codes. */ Py_DECREF(Zreplacement); - Zreplacement = PyObject_CallMethod(temp, "replace", "ss", "%", "%%"); + Zreplacement = _PyObject_CallMethodId(temp, &PyId_replace, "ss", "%", "%%"); Py_DECREF(temp); if (Zreplacement == NULL) return NULL; @@ -1281,12 +1284,15 @@ { PyObject *format; PyObject *time = PyImport_ImportModuleNoBlock("time"); + if (time == NULL) goto Done; format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt)); if (format != NULL) { - result = PyObject_CallMethod(time, "strftime", "OO", - format, timetuple, NULL); + _Py_identifier(strftime); + + result = _PyObject_CallMethodId(time, &PyId_strftime, "OO", + format, timetuple, NULL); Py_DECREF(format); } Py_DECREF(time); @@ -1312,7 +1318,9 @@ PyObject *time = PyImport_ImportModuleNoBlock("time"); if (time != NULL) { - result = PyObject_CallMethod(time, "time", "()"); + _Py_identifier(time); + + result = _PyObject_CallMethodId(time, &PyId_time, "()"); Py_DECREF(time); } return result; @@ -1329,13 +1337,15 @@ time = PyImport_ImportModuleNoBlock("time"); if (time != NULL) { - result = PyObject_CallMethod(time, "struct_time", - "((iiiiiiiii))", - y, m, d, - hh, mm, ss, - weekday(y, m, d), - days_before_month(y, m) + d, - dstflag); + _Py_identifier(struct_time); + + result = _PyObject_CallMethodId(time, &PyId_struct_time, + "((iiiiiiiii))", + y, m, d, + hh, mm, ss, + weekday(y, m, d), + days_before_month(y, m) + d, + dstflag); Py_DECREF(time); } return result; @@ -1568,11 +1578,12 @@ PyObject *result = NULL; PyObject *pyus_in = NULL, *temp, *pyus_out; PyObject *ratio = NULL; + _Py_identifier(as_integer_ratio); pyus_in = delta_to_microseconds(delta); if (pyus_in == NULL) return NULL; - ratio = PyObject_CallMethod(floatobj, "as_integer_ratio", NULL); + ratio = _PyObject_CallMethodId(floatobj, &PyId_as_integer_ratio, NULL); if (ratio == NULL) goto error; temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 0)); @@ -1666,11 +1677,12 @@ PyObject *result = NULL; PyObject *pyus_in = NULL, *temp, *pyus_out; PyObject *ratio = NULL; + _Py_identifier(as_integer_ratio); pyus_in = delta_to_microseconds(delta); if (pyus_in == NULL) return NULL; - ratio = PyObject_CallMethod(f, "as_integer_ratio", NULL); + ratio = _PyObject_CallMethodId(f, &PyId_as_integer_ratio, NULL); if (ratio == NULL) goto error; temp = PyNumber_Multiply(pyus_in, PyTuple_GET_ITEM(ratio, 1)); @@ -2461,6 +2473,7 @@ { PyObject *time; PyObject *result; + _Py_identifier(fromtimestamp); time = time_time(); if (time == NULL) @@ -2472,7 +2485,7 @@ * time.time() delivers; if someone were gonzo about optimization, * date.today() could get away with plain C time(). */ - result = PyObject_CallMethod(cls, "fromtimestamp", "O", time); + result = _PyObject_CallMethodId(cls, &PyId_fromtimestamp, "O", time); Py_DECREF(time); return result; } @@ -2613,7 +2626,9 @@ static PyObject * date_str(PyDateTime_Date *self) { - return PyObject_CallMethod((PyObject *)self, "isoformat", "()"); + _Py_identifier(isoformat); + + return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()"); } @@ -2632,13 +2647,14 @@ PyObject *result; PyObject *tuple; PyObject *format; + _Py_identifier(timetuple); static char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, &format)) return NULL; - tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()"); + tuple = _PyObject_CallMethodId((PyObject *)self, &PyId_timetuple, "()"); if (tuple == NULL) return NULL; result = wrap_strftime((PyObject *)self, format, tuple, @@ -2651,6 +2667,7 @@ date_format(PyDateTime_Date *self, PyObject *args) { PyObject *format; + _Py_identifier(strftime); if (!PyArg_ParseTuple(args, "U:__format__", &format)) return NULL; @@ -2659,7 +2676,7 @@ if (PyUnicode_GetSize(format) == 0) return PyObject_Str((PyObject *)self); - return PyObject_CallMethod((PyObject *)self, "strftime", "O", format); + return _PyObject_CallMethodId((PyObject *)self, &PyId_strftime, "O", format); } /* ISO methods. */ @@ -3573,7 +3590,9 @@ static PyObject * time_str(PyDateTime_Time *self) { - return PyObject_CallMethod((PyObject *)self, "isoformat", "()"); + _Py_identifier(isoformat); + + return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()"); } static PyObject * @@ -4152,7 +4171,9 @@ if (self != NULL && tzinfo != Py_None) { /* Convert UTC to tzinfo's zone. */ PyObject *temp = self; - self = PyObject_CallMethod(tzinfo, "fromutc", "O", self); + _Py_identifier(fromutc); + + self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self); Py_DECREF(temp); } return self; @@ -4189,7 +4210,9 @@ if (self != NULL && tzinfo != Py_None) { /* Convert UTC to tzinfo's zone. */ PyObject *temp = self; - self = PyObject_CallMethod(tzinfo, "fromutc", "O", self); + _Py_identifier(fromutc); + + self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self); Py_DECREF(temp); } return self; @@ -4214,6 +4237,7 @@ { static PyObject *module = NULL; PyObject *string, *format; + _Py_identifier(_strptime_datetime); if (!PyArg_ParseTuple(args, "UU:strptime", &string, &format)) return NULL; @@ -4223,8 +4247,8 @@ if (module == NULL) return NULL; } - return PyObject_CallMethod(module, "_strptime_datetime", "OOO", - cls, string, format); + return _PyObject_CallMethodId(module, &PyId__strptime_datetime, "OOO", + cls, string, format); } /* Return new datetime from date/datetime and time arguments. */ @@ -4469,7 +4493,9 @@ static PyObject * datetime_str(PyDateTime_DateTime *self) { - return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " "); + _Py_identifier(isoformat); + + return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "(s)", " "); } static PyObject * @@ -4676,6 +4702,7 @@ PyObject *offset; PyObject *temp; PyObject *tzinfo; + _Py_identifier(fromutc); static char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords, @@ -4717,7 +4744,7 @@ Py_DECREF(temp); temp = result; - result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp); + result = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", temp); Py_DECREF(temp); return result; diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -790,16 +790,18 @@ element_find(ElementObject* self, PyObject* args) { int i; - PyObject* tag; PyObject* namespaces = Py_None; + if (!PyArg_ParseTuple(args, "O|O:find", &tag, &namespaces)) return NULL; - if (checkpath(tag) || namespaces != Py_None) - return PyObject_CallMethod( - elementpath_obj, "find", "OOO", self, tag, namespaces + if (checkpath(tag) || namespaces != Py_None) { + _Py_identifier(find); + return _PyObject_CallMethodId( + elementpath_obj, &PyId_find, "OOO", self, tag, namespaces ); + } if (!self->extra) Py_RETURN_NONE; @@ -820,16 +822,17 @@ element_findtext(ElementObject* self, PyObject* args) { int i; - PyObject* tag; PyObject* default_value = Py_None; PyObject* namespaces = Py_None; + _Py_identifier(findtext); + if (!PyArg_ParseTuple(args, "O|OO:findtext", &tag, &default_value, &namespaces)) return NULL; if (checkpath(tag) || namespaces != Py_None) - return PyObject_CallMethod( - elementpath_obj, "findtext", "OOOO", self, tag, default_value, namespaces + return _PyObject_CallMethodId( + elementpath_obj, &PyId_findtext, "OOOO", self, tag, default_value, namespaces ); if (!self->extra) { @@ -858,16 +861,18 @@ { int i; PyObject* out; - PyObject* tag; PyObject* namespaces = Py_None; + if (!PyArg_ParseTuple(args, "O|O:findall", &tag, &namespaces)) return NULL; - if (checkpath(tag) || namespaces != Py_None) - return PyObject_CallMethod( - elementpath_obj, "findall", "OOO", self, tag, namespaces + if (checkpath(tag) || namespaces != Py_None) { + _Py_identifier(findall); + return _PyObject_CallMethodId( + elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces ); + } out = PyList_New(0); if (!out) @@ -895,11 +900,13 @@ { PyObject* tag; PyObject* namespaces = Py_None; + _Py_identifier(iterfind); + if (!PyArg_ParseTuple(args, "O|O:iterfind", &tag, &namespaces)) return NULL; - return PyObject_CallMethod( - elementpath_obj, "iterfind", "OOO", self, tag, namespaces + return _PyObject_CallMethodId( + elementpath_obj, &PyId_iterfind, "OOO", self, tag, namespaces ); } diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -308,6 +308,9 @@ PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL; + _Py_identifier(isatty); + _Py_identifier(fileno); + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist, &file, &mode, &buffering, &encoding, &errors, &newline, @@ -421,7 +424,7 @@ /* buffering */ { - PyObject *res = PyObject_CallMethod(raw, "isatty", NULL); + PyObject *res = _PyObject_CallMethodId(raw, &PyId_isatty, NULL); if (res == NULL) goto error; isatty = PyLong_AsLong(res); @@ -443,7 +446,7 @@ { struct stat st; long fileno; - PyObject *res = PyObject_CallMethod(raw, "fileno", NULL); + PyObject *res = _PyObject_CallMethodId(raw, &PyId_fileno, NULL); if (res == NULL) goto error; diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -13,6 +13,18 @@ #include "pythread.h" #include "_iomodule.h" +_Py_identifier(close); +_Py_identifier(_dealloc_warn); +_Py_identifier(flush); +_Py_identifier(isatty); +_Py_identifier(peek); +_Py_identifier(read); +_Py_identifier(read1); +_Py_identifier(readable); +_Py_identifier(readinto); +_Py_identifier(writable); +_Py_identifier(write); + /* * BufferedIOBase class, inherits from IOBase. */ @@ -38,12 +50,13 @@ Py_buffer buf; Py_ssize_t len; PyObject *data; + _Py_identifier(read); if (!PyArg_ParseTuple(args, "w*:readinto", &buf)) { return NULL; } - data = PyObject_CallMethod(self, "read", "n", buf.len); + data = _PyObject_CallMethodId(self, &PyId_read, "n", buf.len); if (data == NULL) goto error; @@ -410,7 +423,7 @@ { if (self->ok && self->raw) { PyObject *r; - r = PyObject_CallMethod(self->raw, "_dealloc_warn", "O", source); + r = _PyObject_CallMethodId(self->raw, &PyId__dealloc_warn, "O", source); if (r) Py_DECREF(r); else @@ -2216,13 +2229,13 @@ } static PyObject * -_forward_call(buffered *self, const char *name, PyObject *args) +_forward_call(buffered *self, _Py_Identifier *name, PyObject *args) { - PyObject *func = PyObject_GetAttrString((PyObject *)self, name); + PyObject *func = _PyObject_GetAttrId((PyObject *)self, name); PyObject *ret; if (func == NULL) { - PyErr_SetString(PyExc_AttributeError, name); + PyErr_SetString(PyExc_AttributeError, name->string); return NULL; } @@ -2234,66 +2247,66 @@ static PyObject * bufferedrwpair_read(rwpair *self, PyObject *args) { - return _forward_call(self->reader, "read", args); + return _forward_call(self->reader, &PyId_read, args); } static PyObject * bufferedrwpair_peek(rwpair *self, PyObject *args) { - return _forward_call(self->reader, "peek", args); + return _forward_call(self->reader, &PyId_peek, args); } static PyObject * bufferedrwpair_read1(rwpair *self, PyObject *args) { - return _forward_call(self->reader, "read1", args); + return _forward_call(self->reader, &PyId_read1, args); } static PyObject * bufferedrwpair_readinto(rwpair *self, PyObject *args) { - return _forward_call(self->reader, "readinto", args); + return _forward_call(self->reader, &PyId_readinto, args); } static PyObject * bufferedrwpair_write(rwpair *self, PyObject *args) { - return _forward_call(self->writer, "write", args); + return _forward_call(self->writer, &PyId_write, args); } static PyObject * bufferedrwpair_flush(rwpair *self, PyObject *args) { - return _forward_call(self->writer, "flush", args); + return _forward_call(self->writer, &PyId_flush, args); } static PyObject * bufferedrwpair_readable(rwpair *self, PyObject *args) { - return _forward_call(self->reader, "readable", args); + return _forward_call(self->reader, &PyId_readable, args); } static PyObject * bufferedrwpair_writable(rwpair *self, PyObject *args) { - return _forward_call(self->writer, "writable", args); + return _forward_call(self->writer, &PyId_writable, args); } static PyObject * bufferedrwpair_close(rwpair *self, PyObject *args) { - PyObject *ret = _forward_call(self->writer, "close", args); + PyObject *ret = _forward_call(self->writer, &PyId_close, args); if (ret == NULL) return NULL; Py_DECREF(ret); - return _forward_call(self->reader, "close", args); + return _forward_call(self->reader, &PyId_close, args); } static PyObject * bufferedrwpair_isatty(rwpair *self, PyObject *args) { - PyObject *ret = _forward_call(self->writer, "isatty", args); + PyObject *ret = _forward_call(self->writer, &PyId_isatty, args); if (ret != Py_False) { /* either True or exception */ @@ -2301,7 +2314,7 @@ } Py_DECREF(ret); - return _forward_call(self->reader, "isatty", args); + return _forward_call(self->reader, &PyId_isatty, args); } static PyObject * diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -128,6 +128,7 @@ static PyObject * fileio_close(fileio *self) { + _Py_identifier(close); if (!self->closefd) { self->fd = -1; Py_RETURN_NONE; @@ -143,8 +144,8 @@ if (errno < 0) return NULL; - return PyObject_CallMethod((PyObject*)&PyRawIOBase_Type, - "close", "O", self); + return _PyObject_CallMethodId((PyObject*)&PyRawIOBase_Type, + &PyId_close, "O", self); } static PyObject * diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -97,7 +97,9 @@ static PyObject * iobase_tell(PyObject *self, PyObject *args) { - return PyObject_CallMethod(self, "seek", "ii", 0, 1); + _Py_identifier(seek); + + return _PyObject_CallMethodId(self, &PyId_seek, "ii", 0, 1); } PyDoc_STRVAR(iobase_truncate_doc, @@ -464,6 +466,7 @@ int has_peek = 0; PyObject *buffer, *result; Py_ssize_t old_size = -1; + _Py_identifier(read); if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) { return NULL; @@ -481,7 +484,9 @@ PyObject *b; if (has_peek) { - PyObject *readahead = PyObject_CallMethod(self, "peek", "i", 1); + _Py_identifier(peek); + PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1); + if (readahead == NULL) goto fail; if (!PyBytes_Check(readahead)) { @@ -515,7 +520,7 @@ Py_DECREF(readahead); } - b = PyObject_CallMethod(self, "read", "n", nreadahead); + b = _PyObject_CallMethodId(self, &PyId_read, "n", nreadahead); if (b == NULL) goto fail; if (!PyBytes_Check(b)) { @@ -601,7 +606,9 @@ /* XXX special-casing this made sense in the Python version in order to remove the bytecode interpretation overhead, but it could probably be removed here. */ - PyObject *ret = PyObject_CallMethod(result, "extend", "O", self); + _Py_identifier(extend); + PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self); + if (ret == NULL) { Py_DECREF(result); return NULL; @@ -781,8 +788,11 @@ return NULL; } - if (n < 0) - return PyObject_CallMethod(self, "readall", NULL); + if (n < 0) { + _Py_identifier(readall); + + return _PyObject_CallMethodId(self, &PyId_readall, NULL); + } /* TODO: allocate a bytes object directly instead and manually construct a writable memoryview pointing to it. */ @@ -823,8 +833,9 @@ return NULL; while (1) { - PyObject *data = PyObject_CallMethod(self, "read", - "i", DEFAULT_BUFFER_SIZE); + _Py_identifier(read); + PyObject *data = _PyObject_CallMethodId(self, &PyId_read, + "i", DEFAULT_BUFFER_SIZE); if (!data) { Py_DECREF(chunks); return NULL; diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -11,6 +11,24 @@ #include "structmember.h" #include "_iomodule.h" +_Py_identifier(close); +_Py_identifier(_dealloc_warn); +_Py_identifier(decode); +_Py_identifier(device_encoding); +_Py_identifier(fileno); +_Py_identifier(flush); +_Py_identifier(getpreferredencoding); +_Py_identifier(isatty); +_Py_identifier(read); +_Py_identifier(readable); +_Py_identifier(replace); +_Py_identifier(reset); +_Py_identifier(seek); +_Py_identifier(seekable); +_Py_identifier(setstate); +_Py_identifier(tell); +_Py_identifier(writable); + /* TextIOBase */ PyDoc_STRVAR(textiobase_doc, @@ -501,8 +519,8 @@ flag >>= 1; if (self->decoder != Py_None) - return PyObject_CallMethod(self->decoder, - "setstate", "((OK))", buffer, flag); + return _PyObject_CallMethodId(self->decoder, + &PyId_setstate, "((OK))", buffer, flag); else Py_RETURN_NONE; } @@ -842,7 +860,7 @@ if (encoding == NULL) { /* Try os.device_encoding(fileno) */ PyObject *fileno; - fileno = PyObject_CallMethod(buffer, "fileno", NULL); + fileno = _PyObject_CallMethodId(buffer, &PyId_fileno, NULL); /* Ignore only AttributeError and UnsupportedOperation */ if (fileno == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError) || @@ -854,9 +872,9 @@ } } else { - self->encoding = PyObject_CallMethod(state->os_module, - "device_encoding", - "N", fileno); + self->encoding = _PyObject_CallMethodId(state->os_module, + &PyId_device_encoding, + "N", fileno); if (self->encoding == NULL) goto error; else if (!PyUnicode_Check(self->encoding)) @@ -873,8 +891,8 @@ } else { use_locale: - self->encoding = PyObject_CallMethod( - state->locale_module, "getpreferredencoding", NULL); + self->encoding = _PyObject_CallMethodId( + state->locale_module, &PyId_getpreferredencoding, NULL); if (self->encoding == NULL) { catch_ImportError: /* @@ -939,7 +957,7 @@ #endif /* Build the decoder object */ - res = PyObject_CallMethod(buffer, "readable", NULL); + res = _PyObject_CallMethodId(buffer, &PyId_readable, NULL); if (res == NULL) goto error; r = PyObject_IsTrue(res); @@ -964,7 +982,7 @@ } /* Build the encoder object */ - res = PyObject_CallMethod(buffer, "writable", NULL); + res = _PyObject_CallMethodId(buffer, &PyId_writable, NULL); if (res == NULL) goto error; r = PyObject_IsTrue(res); @@ -1022,7 +1040,7 @@ Py_DECREF(raw); } - res = PyObject_CallMethod(buffer, "seekable", NULL); + res = _PyObject_CallMethodId(buffer, &PyId_seekable, NULL); if (res == NULL) goto error; self->seekable = self->telling = PyObject_IsTrue(res); @@ -1255,8 +1273,8 @@ haslf = 1; if (haslf && self->writetranslate && self->writenl != NULL) { - PyObject *newtext = PyObject_CallMethod( - text, "replace", "ss", "\n", self->writenl); + PyObject *newtext = _PyObject_CallMethodId( + text, &PyId_replace, "ss", "\n", self->writenl); Py_DECREF(text); if (newtext == NULL) return NULL; @@ -1311,7 +1329,7 @@ Py_CLEAR(self->snapshot); if (self->decoder) { - ret = PyObject_CallMethod(self->decoder, "reset", NULL); + ret = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); if (ret == NULL) return NULL; Py_DECREF(ret); @@ -1490,7 +1508,7 @@ if (n < 0) { /* Read everything */ - PyObject *bytes = PyObject_CallMethod(self->buffer, "read", NULL); + PyObject *bytes = _PyObject_CallMethodId(self->buffer, &PyId_read, NULL); PyObject *decoded; if (bytes == NULL) goto fail; @@ -1940,8 +1958,8 @@ if (cookie->start_pos == 0 && cookie->dec_flags == 0) res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL); else - res = PyObject_CallMethod(self->decoder, "setstate", - "((yi))", "", cookie->dec_flags); + res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, + "((yi))", "", cookie->dec_flags); if (res == NULL) return -1; Py_DECREF(res); @@ -2005,13 +2023,12 @@ * sync the underlying buffer with the current position. */ Py_DECREF(cookieObj); - cookieObj = PyObject_CallMethod((PyObject *)self, "tell", NULL); + cookieObj = _PyObject_CallMethodId((PyObject *)self, &PyId_tell, NULL); if (cookieObj == NULL) goto fail; } else if (whence == 2) { /* seek relative to end of file */ - cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_EQ); if (cmp < 0) goto fail; @@ -2021,7 +2038,7 @@ goto fail; } - res = PyObject_CallMethod((PyObject *)self, "flush", NULL); + res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); if (res == NULL) goto fail; Py_DECREF(res); @@ -2029,13 +2046,13 @@ textiowrapper_set_decoded_chars(self, NULL); Py_CLEAR(self->snapshot); if (self->decoder) { - res = PyObject_CallMethod(self->decoder, "reset", NULL); + res = _PyObject_CallMethodId(self->decoder, &PyId_reset, NULL); if (res == NULL) goto fail; Py_DECREF(res); } - res = PyObject_CallMethod(self->buffer, "seek", "ii", 0, 2); + res = _PyObject_CallMethodId(self->buffer, &PyId_seek, "ii", 0, 2); Py_XDECREF(cookieObj); return res; } @@ -2088,8 +2105,8 @@ if (cookie.chars_to_skip) { /* Just like _read_chunk, feed the decoder and save a snapshot. */ - PyObject *input_chunk = PyObject_CallMethod( - self->buffer, "read", "i", cookie.bytes_to_feed); + PyObject *input_chunk = _PyObject_CallMethodId( + self->buffer, &PyId_read, "i", cookie.bytes_to_feed); PyObject *decoded; if (input_chunk == NULL) @@ -2103,8 +2120,8 @@ goto fail; } - decoded = PyObject_CallMethod(self->decoder, "decode", - "Oi", input_chunk, (int)cookie.need_eof); + decoded = _PyObject_CallMethodId(self->decoder, &PyId_decode, + "Oi", input_chunk, (int)cookie.need_eof); if (decoded == NULL) goto fail; @@ -2170,12 +2187,12 @@ if (_textiowrapper_writeflush(self) < 0) return NULL; - res = PyObject_CallMethod((PyObject *)self, "flush", NULL); + res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); if (res == NULL) goto fail; Py_DECREF(res); - posobj = PyObject_CallMethod(self->buffer, "tell", NULL); + posobj = _PyObject_CallMethodId(self->buffer, &PyId_tell, NULL); if (posobj == NULL) goto fail; @@ -2229,8 +2246,8 @@ /* TODO: replace assert with exception */ #define DECODER_DECODE(start, len, res) do { \ - PyObject *_decoded = PyObject_CallMethod( \ - self->decoder, "decode", "y#", start, len); \ + PyObject *_decoded = _PyObject_CallMethodId( \ + self->decoder, &PyId_decode, "y#", start, len); \ if (_decoded == NULL) \ goto fail; \ assert (PyUnicode_Check(_decoded)); \ @@ -2312,8 +2329,8 @@ } if (input == input_end) { /* We didn't get enough decoded data; signal EOF to get more. */ - PyObject *decoded = PyObject_CallMethod( - self->decoder, "decode", "yi", "", /* final = */ 1); + PyObject *decoded = _PyObject_CallMethodId( + self->decoder, &PyId_decode, "yi", "", /* final = */ 1); if (decoded == NULL) goto fail; assert (PyUnicode_Check(decoded)); @@ -2329,7 +2346,7 @@ } finally: - res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state); + res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "(O)", saved_state); Py_DECREF(saved_state); if (res == NULL) return NULL; @@ -2344,7 +2361,7 @@ PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); - res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state); + res = _PyObject_CallMethodId(self->decoder, &PyId_setstate, "(O)", saved_state); Py_DECREF(saved_state); if (res == NULL) return NULL; @@ -2432,35 +2449,35 @@ textiowrapper_fileno(textio *self, PyObject *args) { CHECK_INITIALIZED(self); - return PyObject_CallMethod(self->buffer, "fileno", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_fileno, NULL); } static PyObject * textiowrapper_seekable(textio *self, PyObject *args) { CHECK_INITIALIZED(self); - return PyObject_CallMethod(self->buffer, "seekable", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_seekable, NULL); } static PyObject * textiowrapper_readable(textio *self, PyObject *args) { CHECK_INITIALIZED(self); - return PyObject_CallMethod(self->buffer, "readable", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_readable, NULL); } static PyObject * textiowrapper_writable(textio *self, PyObject *args) { CHECK_INITIALIZED(self); - return PyObject_CallMethod(self->buffer, "writable", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_writable, NULL); } static PyObject * textiowrapper_isatty(textio *self, PyObject *args) { CHECK_INITIALIZED(self); - return PyObject_CallMethod(self->buffer, "isatty", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_isatty, NULL); } static PyObject * @@ -2479,7 +2496,7 @@ self->telling = self->seekable; if (_textiowrapper_writeflush(self) < 0) return NULL; - return PyObject_CallMethod(self->buffer, "flush", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_flush, NULL); } static PyObject * @@ -2502,20 +2519,20 @@ } else { if (self->deallocating) { - res = PyObject_CallMethod(self->buffer, "_dealloc_warn", "O", self); + res = _PyObject_CallMethodId(self->buffer, &PyId__dealloc_warn, "O", self); if (res) Py_DECREF(res); else PyErr_Clear(); } - res = PyObject_CallMethod((PyObject *)self, "flush", NULL); + res = _PyObject_CallMethodId((PyObject *)self, &PyId_flush, NULL); if (res == NULL) { return NULL; } else Py_DECREF(res); - return PyObject_CallMethod(self->buffer, "close", NULL); + return _PyObject_CallMethodId(self->buffer, &PyId_close, NULL); } } diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -2488,7 +2488,9 @@ status = batch_dict_exact(self, obj); Py_LeaveRecursiveCall(); } else { - items = PyObject_CallMethod(obj, "items", "()"); + _Py_identifier(items); + + items = _PyObject_CallMethodId(obj, &PyId_items, "()"); if (items == NULL) goto error; iter = PyObject_GetIter(items); @@ -3774,8 +3776,10 @@ static PyObject * find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name) { - return PyObject_CallMethod((PyObject *)self, "find_class", "OO", - module_name, global_name); + _Py_identifier(find_class); + + return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO", + module_name, global_name); } static Py_ssize_t @@ -4388,7 +4392,9 @@ result = PyObject_CallObject(cls, args); } else { - result = PyObject_CallMethod(cls, "__new__", "O", cls); + _Py_identifier(__new__); + + result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls); } return result; } diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -18,7 +18,9 @@ static int _enable_gc(PyObject *gc_module) { PyObject *result; - result = PyObject_CallMethod(gc_module, "enable", NULL); + _Py_identifier(enable); + + result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL); if (result == NULL) return 1; Py_DECREF(result); @@ -249,10 +251,13 @@ /* We need to call gc.disable() when we'll be calling preexec_fn */ if (preexec_fn != Py_None) { PyObject *result; + _Py_identifier(isenabled); + _Py_identifier(disable); + gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) return NULL; - result = PyObject_CallMethod(gc_module, "isenabled", NULL); + result = _PyObject_CallMethodId(gc_module, &PyId_isenabled, NULL); if (result == NULL) { Py_DECREF(gc_module); return NULL; @@ -263,7 +268,7 @@ Py_DECREF(gc_module); return NULL; } - result = PyObject_CallMethod(gc_module, "disable", NULL); + result = _PyObject_CallMethodId(gc_module, &PyId_disable, NULL); if (result == NULL) { Py_DECREF(gc_module); return NULL; diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -675,6 +675,7 @@ { PyObject* function_result = NULL; PyObject** aggregate_instance; + _Py_identifier(finalize); #ifdef WITH_THREAD PyGILState_STATE threadstate; @@ -690,7 +691,7 @@ goto error; } - function_result = PyObject_CallMethod(*aggregate_instance, "finalize", ""); + function_result = _PyObject_CallMethodId(*aggregate_instance, &PyId_finalize, ""); if (!function_result) { if (_enable_callback_tracebacks) { PyErr_Print(); @@ -1230,8 +1231,9 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; + _Py_identifier(cursor); - cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); + cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { goto error; } @@ -1259,8 +1261,9 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; + _Py_identifier(cursor); - cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); + cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { goto error; } @@ -1288,8 +1291,9 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; + _Py_identifier(cursor); - cursor = PyObject_CallMethod((PyObject*)self, "cursor", ""); + cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { goto error; } @@ -1437,6 +1441,7 @@ PyObject* name; PyObject* retval; Py_ssize_t i, len; + _Py_identifier(upper); char *uppercase_name_str; int rc; unsigned int kind; @@ -1450,7 +1455,7 @@ goto finally; } - uppercase_name = PyObject_CallMethod(name, "upper", ""); + uppercase_name = _PyObject_CallMethodId(name, &PyId_upper, ""); if (!uppercase_name) { goto finally; } diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -150,8 +150,9 @@ { PyObject* upcase_key; PyObject* retval; + _Py_identifier(upper); - upcase_key = PyObject_CallMethod(key, "upper", ""); + upcase_key = _PyObject_CallMethodId(key, &PyId_upper, ""); if (!upcase_key) { return NULL; } diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -95,7 +95,9 @@ /* try to have the protocol adapt this object*/ if (PyObject_HasAttrString(proto, "__adapt__")) { - PyObject *adapted = PyObject_CallMethod(proto, "__adapt__", "O", obj); + _Py_identifier(__adapt__); + PyObject *adapted = _PyObject_CallMethodId(proto, &PyId___adapt__, "O", obj); + if (adapted) { if (adapted != Py_None) { return adapted; @@ -110,7 +112,9 @@ /* and finally try to have the object adapt itself */ if (PyObject_HasAttrString(obj, "__conform__")) { - PyObject *adapted = PyObject_CallMethod(obj, "__conform__","O", proto); + _Py_identifier(__conform__); + PyObject *adapted = _PyObject_CallMethodId(obj, &PyId___conform__,"O", proto); + if (adapted) { if (adapted != Py_None) { return adapted; diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -179,13 +179,14 @@ PyObject* name = NULL; PyObject* callable; PyObject* retval = NULL; + _Py_identifier(upper); if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) { return NULL; } /* convert the name to upper case */ - name = PyObject_CallMethod(orig_name, "upper", ""); + name = _PyObject_CallMethodId(orig_name, &PyId_upper, ""); if (!name) { goto error; } diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1253,6 +1253,7 @@ PyObject *f, *b, *res; Py_ssize_t itemsize = self->ob_descr->itemsize; Py_ssize_t n, nbytes; + _Py_identifier(read); int not_enough_bytes; if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n)) @@ -1264,7 +1265,7 @@ return NULL; } - b = PyObject_CallMethod(f, "read", "n", nbytes); + b = _PyObject_CallMethodId(f, &PyId_read, "n", nbytes); if (b == NULL) return NULL; @@ -1321,12 +1322,14 @@ char* ptr = self->ob_item + i*BLOCKSIZE; Py_ssize_t size = BLOCKSIZE; PyObject *bytes, *res; + _Py_identifier(write); + if (i*BLOCKSIZE + size > nbytes) size = nbytes - i*BLOCKSIZE; bytes = PyBytes_FromStringAndSize(ptr, size); if (bytes == NULL) return NULL; - res = PyObject_CallMethod(f, "write", "O", bytes); + res = _PyObject_CallMethodId(f, &PyId_write, "O", bytes); Py_DECREF(bytes); if (res == NULL) return NULL; diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1579,12 +1579,13 @@ PyObject *unistr) { PyObject *str, *wr; + _Py_identifier(write); str = encoder_encode_stateful(STATEFUL_ECTX(self), unistr, 0); if (str == NULL) return -1; - wr = PyObject_CallMethod(self->stream, "write", "O", str); + wr = _PyObject_CallMethodId(self->stream, &PyId_write, "O", str); Py_DECREF(str); if (wr == NULL) return -1; @@ -1650,7 +1651,9 @@ assert(PyBytes_Check(pwrt)); if (PyBytes_Size(pwrt) > 0) { PyObject *wr; - wr = PyObject_CallMethod(self->stream, "write", "O", pwrt); + _Py_identifier(write); + + wr = _PyObject_CallMethodId(self->stream, &PyId_write, "O", pwrt); if (wr == NULL) { Py_DECREF(pwrt); return NULL; diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -146,6 +146,8 @@ faulthandler_get_fileno(PyObject *file, int *p_fd) { PyObject *result; + _Py_identifier(fileno); + _Py_identifier(flush); long fd_long; int fd; @@ -157,7 +159,7 @@ } } - result = PyObject_CallMethod(file, "fileno", ""); + result = _PyObject_CallMethodId(file, &PyId_fileno, ""); if (result == NULL) return NULL; @@ -175,7 +177,7 @@ return NULL; } - result = PyObject_CallMethod(file, "flush", ""); + result = _PyObject_CallMethodId(file, &PyId_flush, ""); if (result != NULL) Py_DECREF(result); else { @@ -1197,6 +1199,7 @@ faulthandler_env_options(void) { PyObject *xoptions, *key, *module, *res; + _Py_identifier(enable); if (!Py_GETENV("PYTHONFAULTHANDLER")) { int has_key; @@ -1219,7 +1222,7 @@ if (module == NULL) { return -1; } - res = PyObject_CallMethod(module, "enable", ""); + res = _PyObject_CallMethodId(module, &PyId_enable, ""); Py_DECREF(module); if (res == NULL) return -1; diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -769,7 +769,9 @@ { double result = 0; if (tmod != NULL) { - PyObject *f = PyObject_CallMethod(tmod, "time", NULL); + _Py_identifier(time); + + PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL); if (f == NULL) { PyErr_Clear(); } diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -654,7 +654,9 @@ copyable = it; PyTuple_SET_ITEM(result, 0, copyable); for (i=1 ; istring); + return 0; } - if (format && *format) { - va_start(va, format); - args = Py_VaBuildValue(format, va); - va_end(va); - } - else - args = PyTuple_New(0); - - retval = call_function_tail(func, args); - - exit: - /* args gets consumed in call_function_tail */ - Py_XDECREF(func); - + va_start(va, format); + retval = callmethod(func, format, va, 0); + va_end(va); return retval; } @@ -2266,9 +2303,8 @@ _PyObject_CallMethod_SizeT(PyObject *o, char *name, char *format, ...) { va_list va; - PyObject *args; PyObject *func = NULL; - PyObject *retval = NULL; + PyObject *retval; if (o == NULL || name == NULL) return null_error(); @@ -2278,29 +2314,32 @@ PyErr_SetString(PyExc_AttributeError, name); return 0; } - - if (!PyCallable_Check(func)) { - type_error("attribute of type '%.200s' is not callable", func); - goto exit; - } - - if (format && *format) { - va_start(va, format); - args = _Py_VaBuildValue_SizeT(format, va); - va_end(va); - } - else - args = PyTuple_New(0); - - retval = call_function_tail(func, args); - - exit: - /* args gets consumed in call_function_tail */ - Py_XDECREF(func); - + va_start(va, format); + retval = callmethod(func, format, va, 1); + va_end(va); return retval; } +PyObject * +_PyObject_CallMethodId_SizeT(PyObject *o, _Py_Identifier *name, char *format, ...) +{ + va_list va; + PyObject *func = NULL; + PyObject *retval; + + if (o == NULL || name == NULL) + return null_error(); + + func = _PyObject_GetAttrId(o, name); + if (func == NULL) { + PyErr_SetString(PyExc_AttributeError, name->string); + return NULL; + } + va_start(va, format); + retval = callmethod(func, format, va, 1); + va_end(va); + return retval; +} static PyObject * objargs_mktuple(va_list va) diff --git a/Objects/descrobject.c b/Objects/descrobject.c --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -703,34 +703,39 @@ proxy_get(proxyobject *pp, PyObject *args) { PyObject *key, *def = Py_None; + _Py_identifier(get); if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def)) return NULL; - return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def); + return _PyObject_CallMethodId(pp->dict, &PyId_get, "(OO)", key, def); } static PyObject * proxy_keys(proxyobject *pp) { - return PyObject_CallMethod(pp->dict, "keys", NULL); + _Py_identifier(keys); + return _PyObject_CallMethodId(pp->dict, &PyId_keys, NULL); } static PyObject * proxy_values(proxyobject *pp) { - return PyObject_CallMethod(pp->dict, "values", NULL); + _Py_identifier(values); + return _PyObject_CallMethodId(pp->dict, &PyId_values, NULL); } static PyObject * proxy_items(proxyobject *pp) { - return PyObject_CallMethod(pp->dict, "items", NULL); + _Py_identifier(items); + return _PyObject_CallMethodId(pp->dict, &PyId_items, NULL); } static PyObject * proxy_copy(proxyobject *pp) { - return PyObject_CallMethod(pp->dict, "copy", NULL); + _Py_identifier(copy); + return _PyObject_CallMethodId(pp->dict, &PyId_copy, NULL); } static PyMethodDef proxy_methods[] = { diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2707,10 +2707,12 @@ { PyObject *result = PySet_New(self); PyObject *tmp; + _Py_identifier(difference_update); + if (result == NULL) return NULL; - tmp = PyObject_CallMethod(result, "difference_update", "O", other); + tmp = _PyObject_CallMethodId(result, &PyId_difference_update, "O", other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -2725,10 +2727,12 @@ { PyObject *result = PySet_New(self); PyObject *tmp; + _Py_identifier(intersection_update); + if (result == NULL) return NULL; - tmp = PyObject_CallMethod(result, "intersection_update", "O", other); + tmp = _PyObject_CallMethodId(result, &PyId_intersection_update, "O", other); if (tmp == NULL) { Py_DECREF(result); return NULL; @@ -2761,10 +2765,12 @@ { PyObject *result = PySet_New(self); PyObject *tmp; + _Py_identifier(symmetric_difference_update); + if (result == NULL) return NULL; - tmp = PyObject_CallMethod(result, "symmetric_difference_update", "O", + tmp = _PyObject_CallMethodId(result, &PyId_symmetric_difference_update, "O", other); if (tmp == NULL) { Py_DECREF(result); diff --git a/Objects/fileobject.c b/Objects/fileobject.c --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -30,11 +30,12 @@ char *errors, char *newline, int closefd) { PyObject *io, *stream; + _Py_identifier(open); io = PyImport_ImportModule("io"); if (io == NULL) return NULL; - stream = PyObject_CallMethod(io, "open", "isisssi", fd, mode, + stream = _PyObject_CallMethodId(io, &PyId_open, "isisssi", fd, mode, buffering, encoding, errors, newline, closefd); Py_DECREF(io); diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -811,6 +811,42 @@ } PyObject * +_PyObject_GetAttrId(PyObject *v, _Py_Identifier *name) +{ + PyObject *result; + PyObject *oname = _PyUnicode_FromId(name); + if (!oname) + return NULL; + result = PyObject_GetAttr(v, oname); + Py_DECREF(oname); + return result; +} + +int +_PyObject_HasAttrId(PyObject *v, _Py_Identifier *name) +{ + int result; + PyObject *oname = _PyUnicode_FromId(name); + if (!oname) + return -1; + result = PyObject_HasAttr(v, oname); + Py_DECREF(oname); + return result; +} + +int +_PyObject_SetAttrId(PyObject *v, _Py_Identifier *name, PyObject *w) +{ + int result; + PyObject *oname = _PyUnicode_FromId(name); + if (!oname) + return -1; + result = PyObject_SetAttr(v, oname, w); + Py_DECREF(oname); + return result; +} + +PyObject * PyObject_GetAttr(PyObject *v, PyObject *name) { PyTypeObject *tp = Py_TYPE(v); diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -2897,6 +2897,7 @@ PyObject *sorted; PyObject *sorted_methods = NULL; PyObject *joined = NULL; + _Py_identifier(join); /* Compute ", ".join(sorted(type.__abstractmethods__)) into joined. */ @@ -2919,7 +2920,7 @@ if (comma == NULL) goto error; } - joined = PyObject_CallMethod(comma, "join", + joined = _PyObject_CallMethodId(comma, &PyId_join, "O", sorted_methods); if (joined == NULL) goto error; @@ -3184,6 +3185,7 @@ PyObject *copyreg; PyObject *slotnames; static PyObject *str_slotnames; + _Py_identifier(_slotnames); if (str_slotnames == NULL) { str_slotnames = PyUnicode_InternFromString("__slotnames__"); @@ -3202,7 +3204,7 @@ if (copyreg == NULL) return NULL; - slotnames = PyObject_CallMethod(copyreg, "_slotnames", "O", cls); + slotnames = _PyObject_CallMethodId(copyreg, &PyId__slotnames, "O", cls); Py_DECREF(copyreg); if (slotnames != NULL && slotnames != Py_None && @@ -3323,7 +3325,8 @@ Py_INCREF(dictitems); } else { - PyObject *items = PyObject_CallMethod(obj, "items", ""); + _Py_identifier(items); + PyObject *items = _PyObject_CallMethodId(obj, &PyId_items, ""); if (items == NULL) goto end; dictitems = PyObject_GetIter(items); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -201,6 +201,9 @@ /* The empty Unicode object is shared to improve performance. */ static PyObject *unicode_empty; +/* List of static strings. */ +static _Py_Identifier *static_strings; + /* Single character Unicode strings in the Latin-1 range are being shared as well. */ static PyObject *unicode_latin1[256]; @@ -1609,6 +1612,33 @@ return PyUnicode_FromStringAndSize(u, size); } +PyObject * +_PyUnicode_FromId(_Py_Identifier *id) +{ + if (!id->object) { + id->object = PyUnicode_FromString(id->string); + if (!id->object) + return NULL; + PyUnicode_InternInPlace(&id->object); + assert(!id->next); + id->next = static_strings; + static_strings = id; + } + Py_INCREF(id->object); + return id->object; +} + +void +_PyUnicode_ClearStaticStrings() +{ + _Py_Identifier *i; + for (i = static_strings; i; i = i->next) { + Py_DECREF(i->object); + i->object = NULL; + i->next = NULL; + } +} + static PyObject* unicode_fromascii(const unsigned char* s, Py_ssize_t size) { @@ -13523,6 +13553,7 @@ unicode_latin1[i] = NULL; } } + _PyUnicode_ClearStaticStrings(); (void)PyUnicode_ClearFreeList(); } diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -440,8 +440,9 @@ #define WRAP_METHOD(method, special) \ static PyObject * \ method(PyObject *proxy) { \ + _Py_identifier(special); \ UNWRAP(proxy); \ - return PyObject_CallMethod(proxy, special, ""); \ + return _PyObject_CallMethodId(proxy, &PyId_##special, ""); \ } @@ -584,7 +585,7 @@ } -WRAP_METHOD(proxy_bytes, "__bytes__") +WRAP_METHOD(proxy_bytes, __bytes__) static PyMethodDef proxy_methods[] = { diff --git a/PC/_msi.c b/PC/_msi.c --- a/PC/_msi.c +++ b/PC/_msi.c @@ -122,7 +122,9 @@ static FNFCISTATUS(cb_status) { if (pv) { - PyObject *result = PyObject_CallMethod(pv, "status", "iii", typeStatus, cb1, cb2); + _Py_identifier(status); + + PyObject *result = _PyObject_CallMethodId(pv, &PyId_status, "iii", typeStatus, cb1, cb2); if (result == NULL) return -1; Py_DECREF(result); @@ -133,7 +135,9 @@ static FNFCIGETNEXTCABINET(cb_getnextcabinet) { if (pv) { - PyObject *result = PyObject_CallMethod(pv, "getnextcabinet", "i", pccab->iCab); + _Py_identifier(getnextcabinet); + + PyObject *result = _PyObject_CallMethodId(pv, &PyId_getnextcabinet, "i", pccab->iCab); if (result == NULL) return -1; if (!PyBytes_Check(result)) { diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -462,6 +462,7 @@ fp_setreadl(struct tok_state *tok, const char* enc) { PyObject *readline = NULL, *stream = NULL, *io = NULL; + _Py_identifier(open); int fd; io = PyImport_ImportModuleNoBlock("io"); @@ -474,7 +475,7 @@ goto cleanup; } - stream = PyObject_CallMethod(io, "open", "isisOOO", + stream = _PyObject_CallMethodId(io, &PyId_open, "isisOOO", fd, "r", -1, enc, Py_None, Py_None, Py_False); if (stream == NULL) goto cleanup; diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -18,11 +18,12 @@ check_matched(PyObject *obj, PyObject *arg) { PyObject *result; + _Py_identifier(match); int rc; if (obj == Py_None) return 1; - result = PyObject_CallMethod(obj, "match", "O", arg); + result = _PyObject_CallMethodId(obj, &PyId_match, "O", arg); if (result == NULL) return -1; diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -527,6 +527,7 @@ static identifier new_identifier(const char* n, PyArena *arena) { + _Py_identifier(normalize); PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); if (!id || PyUnicode_READY(id) == -1) return NULL; @@ -537,7 +538,7 @@ PyObject *id2; if (!m) return NULL; - id2 = PyObject_CallMethod(m, "normalize", "sO", "NFKC", id); + id2 = _PyObject_CallMethodId(m, &PyId_normalize, "sO", "NFKC", id); Py_DECREF(m); if (!id2) return NULL; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -32,6 +32,9 @@ int Py_HasFileSystemDefaultEncoding = 0; #endif +_Py_identifier(fileno); +_Py_identifier(flush); + static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) { @@ -1567,7 +1570,7 @@ } /* First of all, flush stderr */ - tmp = PyObject_CallMethod(ferr, "flush", ""); + tmp = _PyObject_CallMethodId(ferr, &PyId_flush, ""); if (tmp == NULL) PyErr_Clear(); else @@ -1576,7 +1579,7 @@ /* We should only use (GNU) readline if Python's sys.stdin and sys.stdout are the same as C's stdin and stdout, because we need to pass it those. */ - tmp = PyObject_CallMethod(fin, "fileno", ""); + tmp = _PyObject_CallMethodId(fin, &PyId_fileno, ""); if (tmp == NULL) { PyErr_Clear(); tty = 0; @@ -1589,7 +1592,7 @@ tty = fd == fileno(stdin) && isatty(fd); } if (tty) { - tmp = PyObject_CallMethod(fout, "fileno", ""); + tmp = _PyObject_CallMethodId(fout, &PyId_fileno, ""); if (tmp == NULL) PyErr_Clear(); else { @@ -1621,7 +1624,7 @@ Py_DECREF(stdin_encoding); return NULL; } - tmp = PyObject_CallMethod(fout, "flush", ""); + tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); if (tmp == NULL) PyErr_Clear(); else @@ -1703,7 +1706,7 @@ if (PyFile_WriteObject(promptarg, fout, Py_PRINT_RAW) != 0) return NULL; } - tmp = PyObject_CallMethod(fout, "flush", ""); + tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); if (tmp == NULL) PyErr_Clear(); else diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -372,6 +372,7 @@ void PyEval_ReInitThreads(void) { + _Py_identifier(_after_fork); PyObject *threading, *result; PyThreadState *tstate = PyThreadState_GET(); @@ -392,7 +393,7 @@ PyErr_Clear(); return; } - result = PyObject_CallMethod(threading, "_after_fork", NULL); + result = _PyObject_CallMethodId(threading, &PyId__after_fork, NULL); if (result == NULL) PyErr_WriteUnraisable(threading); else diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1801,6 +1801,7 @@ /* sys.path_hooks import hook */ if (p_loader != NULL) { + _Py_identifier(find_module); PyObject *importer; importer = get_path_importer(path_importer_cache, @@ -1811,8 +1812,8 @@ /* Note: importer is a borrowed reference */ if (importer != Py_None) { PyObject *loader; - loader = PyObject_CallMethod(importer, - "find_module", "O", fullname); + loader = _PyObject_CallMethodId(importer, + &PyId_find_module, "O", fullname); if (loader == NULL) return -1; /* error */ if (loader != Py_None) { @@ -2030,6 +2031,7 @@ /* sys.meta_path import hook */ if (p_loader != NULL) { + _Py_identifier(find_module); PyObject *meta_path; meta_path = PySys_GetObject("meta_path"); @@ -2044,7 +2046,7 @@ for (i = 0; i < npath; i++) { PyObject *loader; PyObject *hook = PyList_GetItem(meta_path, i); - loader = PyObject_CallMethod(hook, "find_module", + loader = _PyObject_CallMethodId(hook, &PyId_find_module, "OO", fullname, search_path_list != NULL ? search_path_list : Py_None); @@ -2454,12 +2456,13 @@ break; case IMP_HOOK: { + _Py_identifier(load_module); if (loader == NULL) { PyErr_SetString(PyExc_ImportError, "import hook without loader"); return NULL; } - m = PyObject_CallMethod(loader, "load_module", "O", name); + m = _PyObject_CallMethodId(loader, &PyId_load_module, "O", name); break; } diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -480,7 +480,9 @@ } } else { - PyObject *data = PyObject_CallMethod(p->readable, "read", "i", n); + _Py_identifier(read); + + PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n); read = 0; if (data != NULL) { if (!PyBytes_Check(data)) { @@ -1290,12 +1292,14 @@ int version = Py_MARSHAL_VERSION; PyObject *s; PyObject *res; + _Py_identifier(write); + if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version)) return NULL; s = PyMarshal_WriteObjectToString(x, version); if (s == NULL) return NULL; - res = PyObject_CallMethod(f, "write", "O", s); + res = _PyObject_CallMethodId(f, &PyId_write, "O", s); Py_DECREF(s); return res; } @@ -1317,6 +1321,7 @@ marshal_load(PyObject *self, PyObject *f) { PyObject *data, *result; + _Py_identifier(read); RFILE rf; /* @@ -1324,7 +1329,7 @@ * This is to ensure that the object passed in at least * has a read method which returns bytes. */ - data = PyObject_CallMethod(f, "read", "i", 0); + data = _PyObject_CallMethodId(f, &PyId_read, "i", 0); if (data == NULL) return NULL; if (!PyBytes_Check(data)) { diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -352,9 +352,10 @@ PyObject *fout = PySys_GetObject("stdout"); PyObject *ferr = PySys_GetObject("stderr"); PyObject *tmp; + _Py_identifier(flush); if (fout != NULL && fout != Py_None) { - tmp = PyObject_CallMethod(fout, "flush", ""); + tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); if (tmp == NULL) PyErr_WriteUnraisable(fout); else @@ -362,7 +363,7 @@ } if (ferr != NULL && ferr != Py_None) { - tmp = PyObject_CallMethod(ferr, "flush", ""); + tmp = _PyObject_CallMethodId(ferr, &PyId_flush, ""); if (tmp == NULL) PyErr_Clear(); else @@ -805,6 +806,9 @@ const char* newline; PyObject *line_buffering; int buffering, isatty; + _Py_identifier(open); + _Py_identifier(isatty); + _Py_identifier(TextIOWrapper); /* stdin is always opened in buffered mode, first because it shouldn't make a difference in common use cases, second because TextIOWrapper @@ -819,9 +823,9 @@ mode = "wb"; else mode = "rb"; - buf = PyObject_CallMethod(io, "open", "isiOOOi", - fd, mode, buffering, - Py_None, Py_None, Py_None, 0); + buf = _PyObject_CallMethodId(io, &PyId_open, "isiOOOi", + fd, mode, buffering, + Py_None, Py_None, Py_None, 0); if (buf == NULL) goto error; @@ -838,7 +842,7 @@ text = PyUnicode_FromString(name); if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0) goto error; - res = PyObject_CallMethod(raw, "isatty", ""); + res = _PyObject_CallMethodId(raw, &PyId_isatty, ""); if (res == NULL) goto error; isatty = PyObject_IsTrue(res); @@ -861,9 +865,9 @@ } #endif - stream = PyObject_CallMethod(io, "TextIOWrapper", "OsssO", - buf, encoding, errors, - newline, line_buffering); + stream = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "OsssO", + buf, encoding, errors, + newline, line_buffering); Py_CLEAR(buf); if (stream == NULL) goto error; @@ -1759,13 +1763,14 @@ { PyObject *f, *r; PyObject *type, *value, *traceback; + _Py_identifier(flush); /* Save the current exception */ PyErr_Fetch(&type, &value, &traceback); f = PySys_GetObject("stderr"); if (f != NULL) { - r = PyObject_CallMethod(f, "flush", ""); + r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) Py_DECREF(r); else @@ -1773,7 +1778,7 @@ } f = PySys_GetObject("stdout"); if (f != NULL) { - r = PyObject_CallMethod(f, "flush", ""); + r = _PyObject_CallMethodId(f, &PyId_flush, ""); if (r) Py_DECREF(r); else @@ -2205,6 +2210,7 @@ wait_for_thread_shutdown(void) { #ifdef WITH_THREAD + _Py_identifier(_shutdown); PyObject *result; PyThreadState *tstate = PyThreadState_GET(); PyObject *threading = PyMapping_GetItemString(tstate->interp->modules, @@ -2214,7 +2220,7 @@ PyErr_Clear(); return; } - result = PyObject_CallMethod(threading, "_shutdown", ""); + result = _PyObject_CallMethodId(threading, &PyId__shutdown, ""); if (result == NULL) { PyErr_WriteUnraisable(threading); } diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -99,7 +99,8 @@ buffer = PyObject_GetAttrString(outf, "buffer"); if (buffer) { - result = PyObject_CallMethod(buffer, "write", "(O)", encoded); + _Py_identifier(write); + result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded); Py_DECREF(buffer); Py_DECREF(encoded); if (result == NULL) diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -152,6 +152,7 @@ const char* filepath; Py_ssize_t len; PyObject* result; + _Py_identifier(open); filebytes = PyUnicode_EncodeFSDefault(filename); if (filebytes == NULL) { @@ -199,7 +200,7 @@ namebuf[len++] = SEP; strcpy(namebuf+len, tail); - binary = PyObject_CallMethod(io, "open", "ss", namebuf, "rb"); + binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb"); if (binary != NULL) { result = binary; goto finally; @@ -231,6 +232,9 @@ char buf[MAXPATHLEN+1]; int kind; void *data; + _Py_identifier(close); + _Py_identifier(open); + _Py_identifier(TextIOWrapper); /* open the file */ if (filename == NULL) @@ -239,7 +243,7 @@ io = PyImport_ImportModuleNoBlock("io"); if (io == NULL) return -1; - binary = PyObject_CallMethod(io, "open", "Os", filename, "rb"); + binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb"); if (binary == NULL) { binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io); @@ -254,7 +258,7 @@ found_encoding = PyTokenizer_FindEncodingFilename(fd, filename); encoding = (found_encoding != NULL) ? found_encoding : "utf-8"; lseek(fd, 0, 0); /* Reset position */ - fob = PyObject_CallMethod(io, "TextIOWrapper", "Os", binary, encoding); + fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding); Py_DECREF(io); Py_DECREF(binary); PyMem_FREE(found_encoding); @@ -273,7 +277,7 @@ break; } } - res = PyObject_CallMethod(fob, "close", ""); + res = _PyObject_CallMethodId(fob, &PyId_close, ""); if (res) Py_DECREF(res); else -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 11:54:48 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 09 Oct 2011 11:54:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Drop_extra_semicolon=2E?= Message-ID: http://hg.python.org/cpython/rev/57ed1e24f8f3 changeset: 72836:57ed1e24f8f3 user: Martin v. L?wis date: Sun Oct 09 11:54:42 2011 +0200 summary: Drop extra semicolon. files: Include/unicodeobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2050,7 +2050,7 @@ PyObject *object; } _Py_Identifier; -#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 }; +#define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 } #define _Py_identifier(varname) _Py_static_string(PyId_##varname, #varname) /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 14:07:45 2011 From: python-checkins at python.org (larry.hastings) Date: Sun, 09 Oct 2011 14:07:45 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDUz?= =?utf8?q?=3A_Added_section_on_migrating_from_CObject_to_Capsule?= Message-ID: http://hg.python.org/cpython/rev/d0af22b65889 changeset: 72837:d0af22b65889 branch: 2.7 parent: 72834:8d837bd8148a user: Larry Hastings date: Sun Oct 09 13:03:44 2011 +0100 summary: Issue #13053: Added section on migrating from CObject to Capsule to howto/cporting.rst. files: Doc/howto/cporting.rst | 52 +++++++++ Doc/includes/capsulethunk.h | 134 ++++++++++++++++++++++++ 2 files changed, 186 insertions(+), 0 deletions(-) diff --git a/Doc/howto/cporting.rst b/Doc/howto/cporting.rst --- a/Doc/howto/cporting.rst +++ b/Doc/howto/cporting.rst @@ -209,6 +209,58 @@ } +CObject replaced with Capsule +============================= + +The :ctype:`Capsule` object was introduced in Python 3.1 and 2.7 to replace +:ctype:`CObject`. CObjects were useful, +but the :ctype:`CObject` API was problematic: it didn't permit distinguishing +between valid CObjects, which allowed mismatched CObjects to crash the +interpreter, and some of its APIs relied on undefined behavior in C. +(For further reading on the rationale behind Capsules, please see :issue:`5630`.) + +If you're currently using CObjects, and you want to migrate to 3.1 or newer, +you'll need to switch to Capsules. +:ctype:`CObject` was deprecated in 3.1 and 2.7 and completely removed in +Python 3.2. If you only support 2.7, or 3.1 and above, you +can simply switch to :ctype:`Capsule`. If you need to support 3.0 or +versions of Python earlier than 2.7 you'll have to support both CObjects +and Capsules. + +The following example header file :file:`capsulethunk.h` may +solve the problem for you; +simply write your code against the :ctype:`Capsule` API, include +this header file after ``"Python.h"``, and you'll automatically use CObjects +in Python 3.0 or versions earlier than 2.7. + +:file:`capsulethunk.h` simulates Capsules using CObjects. However, +:ctype:`CObject` provides no place to store the capsule's "name". As a +result the simulated :ctype:`Capsule` objects created by :file:`capsulethunk.h` +behave slightly differently from real Capsules. Specifically: + + * The name parameter passed in to :cfunc:`PyCapsule_New` is ignored. + + * The name parameter passed in to :cfunc:`PyCapsule_IsValid` and + :cfunc:`PyCapsule_GetPointer` is ignored, and no error checking + of the name is performed. + + * :cfunc:`PyCapsule_GetName` always returns NULL. + + * :cfunc:`PyCapsule_SetName` always throws an exception and + returns failure. (Since there's no way to store a name + in a CObject, noisy failure of :cfunc:`PyCapsule_SetName` + was deemed preferable to silent failure here. If this is + inconveient, feel free to modify your local + copy as you see fit.) + +You can find :file:`capsulethunk.h` in the Python source distribution +in the :file:`Doc/includes` directory. We also include it here for +your reference; here is :file:`capsulethunk.h`: + +.. literalinclude:: ../includes/capsulethunk.h + + + Other options ============= diff --git a/Doc/includes/capsulethunk.h b/Doc/includes/capsulethunk.h new file mode 100644 --- /dev/null +++ b/Doc/includes/capsulethunk.h @@ -0,0 +1,134 @@ +#ifndef __CAPSULETHUNK_H +#define __CAPSULETHUNK_H + +#if ( (PY_VERSION_HEX < 0x02070000) \ + || ((PY_VERSION_HEX >= 0x03000000) \ + && (PY_VERSION_HEX < 0x03010000)) ) + +#define __PyCapsule_GetField(capsule, field, default_value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field) \ + : (default_value) \ + ) \ + +#define __PyCapsule_SetField(capsule, field, value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field = value), 1 \ + : 0 \ + ) \ + + +#define PyCapsule_Type PyCObject_Type + +#define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +#define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule)) + + +#define PyCapsule_New(pointer, name, destructor) \ + (PyCObject_FromVoidPtr(pointer, destructor)) + + +#define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) + +/* Don't call PyCObject_SetPointer here, it fails if there's a destructor */ +#define PyCapsule_SetPointer(capsule, pointer) \ + __PyCapsule_SetField(capsule, cobject, pointer) + + +#define PyCapsule_GetDestructor(capsule) \ + __PyCapsule_GetField(capsule, destructor) + +#define PyCapsule_SetDestructor(capsule, dtor) \ + __PyCapsule_SetField(capsule, destructor, dtor) + + +/* + * Sorry, there's simply no place + * to store a Capsule "name" in a CObject. + */ +#define PyCapsule_GetName(capsule) NULL + +static int +PyCapsule_SetName(PyObject *capsule, const char *unused) +{ + unused = unused; + PyErr_SetString(PyExc_NotImplementedError, + "can't use PyCapsule_SetName with CObjects"); + return 1; +} + + + +#define PyCapsule_GetContext(capsule) \ + __PyCapsule_GetField(capsule, descr) + +#define PyCapsule_SetContext(capsule, context) \ + __PyCapsule_SetField(capsule, descr, context) + + +static void * +PyCapsule_Import(const char *name, int no_block) +{ + PyObject *object = NULL; + void *return_value = NULL; + char *trace; + size_t name_length = (strlen(name) + 1) * sizeof(char); + char *name_dup = (char *)PyMem_MALLOC(name_length); + + if (!name_dup) { + return NULL; + } + + memcpy(name_dup, name, name_length); + + trace = name_dup; + while (trace) { + char *dot = strchr(trace, '.'); + if (dot) { + *dot++ = '\0'; + } + + if (object == NULL) { + if (no_block) { + object = PyImport_ImportModuleNoBlock(trace); + } else { + object = PyImport_ImportModule(trace); + if (!object) { + PyErr_Format(PyExc_ImportError, + "PyCapsule_Import could not " + "import module \"%s\"", trace); + } + } + } else { + PyObject *object2 = PyObject_GetAttrString(object, trace); + Py_DECREF(object); + object = object2; + } + if (!object) { + goto EXIT; + } + + trace = dot; + } + + if (PyCObject_Check(object)) { + PyCObject *cobject = (PyCObject *)object; + return_value = cobject->cobject; + } else { + PyErr_Format(PyExc_AttributeError, + "PyCapsule_Import \"%s\" is not valid", + name); + } + +EXIT: + Py_XDECREF(object); + if (name_dup) { + PyMem_FREE(name_dup); + } + return return_value; +} + +#endif /* #if PY_VERSION_HEX < 0x02070000 */ + +#endif /* __CAPSULETHUNK_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 18:30:04 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 09 Oct 2011 18:30:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Clean-up_and_im?= =?utf8?q?prove_the_priority_queue_example_in_the_heapq_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/525528c03256 changeset: 72838:525528c03256 branch: 3.2 parent: 72828:edc04ee314a9 user: Raymond Hettinger date: Sun Oct 09 17:28:14 2011 +0100 summary: Clean-up and improve the priority queue example in the heapq docs. files: Doc/library/heapq.rst | 46 +++++++++++++++--------------- 1 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Doc/library/heapq.rst b/Doc/library/heapq.rst --- a/Doc/library/heapq.rst +++ b/Doc/library/heapq.rst @@ -173,36 +173,36 @@ with a dictionary pointing to an entry in the queue. Removing the entry or changing its priority is more difficult because it would -break the heap structure invariants. So, a possible solution is to mark an -entry as invalid and optionally add a new entry with the revised priority:: +break the heap structure invariants. So, a possible solution is to mark the +entry as removed and add a new entry with the revised priority:: - pq = [] # the priority queue list - counter = itertools.count(1) # unique sequence count - task_finder = {} # mapping of tasks to entries - INVALID = 0 # mark an entry as deleted + pq = [] # list of entries arranged in a heap + entry_finder = {} # mapping of tasks to entries + REMOVED = '' # placeholder for a removed task + counter = itertools.count() # unique sequence count - def add_task(priority, task, count=None): - if count is None: - count = next(counter) + def add_task(task, priority=0): + 'Add a new task or update the priority of an existing task' + if task in entry_finder: + remove_task(task) + count = next(counter) entry = [priority, count, task] - task_finder[task] = entry + entry_finder[task] = entry heappush(pq, entry) - def get_top_priority(): - while True: + def remove_task(task): + 'Mark an existing task as REMOVED. Raise KeyError if not found.' + entry = entry_finder.pop(task) + entry[-1] = REMOVED + + def pop_task(): + 'Remove and return the lowest priority task. Raise KeyError if empty.' + while pq: priority, count, task = heappop(pq) - if count is not INVALID: - del task_finder[task] + if task is not REMOVED: + del entry_finder[task] return task - - def delete_task(task): - entry = task_finder[task] - entry[1] = INVALID - - def reprioritize(priority, task): - entry = task_finder[task] - add_task(priority, task, entry[1]) - entry[1] = INVALID + raise KeyError('pop from an empty priority queue') Theory -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 18:30:05 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 09 Oct 2011 18:30:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Clean-up_and_improve_the_priority_queue_example_in_the_heapq?= =?utf8?q?_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/a366d3684bc0 changeset: 72839:a366d3684bc0 parent: 72836:57ed1e24f8f3 parent: 72838:525528c03256 user: Raymond Hettinger date: Sun Oct 09 17:29:14 2011 +0100 summary: Clean-up and improve the priority queue example in the heapq docs. files: Doc/library/heapq.rst | 46 +++++++++++++++--------------- 1 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Doc/library/heapq.rst b/Doc/library/heapq.rst --- a/Doc/library/heapq.rst +++ b/Doc/library/heapq.rst @@ -173,36 +173,36 @@ with a dictionary pointing to an entry in the queue. Removing the entry or changing its priority is more difficult because it would -break the heap structure invariants. So, a possible solution is to mark an -entry as invalid and optionally add a new entry with the revised priority:: +break the heap structure invariants. So, a possible solution is to mark the +entry as removed and add a new entry with the revised priority:: - pq = [] # the priority queue list - counter = itertools.count(1) # unique sequence count - task_finder = {} # mapping of tasks to entries - INVALID = 0 # mark an entry as deleted + pq = [] # list of entries arranged in a heap + entry_finder = {} # mapping of tasks to entries + REMOVED = '' # placeholder for a removed task + counter = itertools.count() # unique sequence count - def add_task(priority, task, count=None): - if count is None: - count = next(counter) + def add_task(task, priority=0): + 'Add a new task or update the priority of an existing task' + if task in entry_finder: + remove_task(task) + count = next(counter) entry = [priority, count, task] - task_finder[task] = entry + entry_finder[task] = entry heappush(pq, entry) - def get_top_priority(): - while True: + def remove_task(task): + 'Mark an existing task as REMOVED. Raise KeyError if not found.' + entry = entry_finder.pop(task) + entry[-1] = REMOVED + + def pop_task(): + 'Remove and return the lowest priority task. Raise KeyError if empty.' + while pq: priority, count, task = heappop(pq) - if count is not INVALID: - del task_finder[task] + if task is not REMOVED: + del entry_finder[task] return task - - def delete_task(task): - entry = task_finder[task] - entry[1] = INVALID - - def reprioritize(priority, task): - entry = task_finder[task] - add_task(priority, task, entry[1]) - entry[1] = INVALID + raise KeyError('pop from an empty priority queue') Theory -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 18:32:51 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 09 Oct 2011 18:32:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Clean-up_and_im?= =?utf8?q?prove_the_priority_queue_example_in_the_heapq_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/89b896f032e7 changeset: 72840:89b896f032e7 branch: 2.7 parent: 72837:d0af22b65889 user: Raymond Hettinger date: Sun Oct 09 17:32:43 2011 +0100 summary: Clean-up and improve the priority queue example in the heapq docs. files: Doc/library/heapq.rst | 46 +++++++++++++++--------------- 1 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Doc/library/heapq.rst b/Doc/library/heapq.rst --- a/Doc/library/heapq.rst +++ b/Doc/library/heapq.rst @@ -187,36 +187,36 @@ with a dictionary pointing to an entry in the queue. Removing the entry or changing its priority is more difficult because it would -break the heap structure invariants. So, a possible solution is to mark an -entry as invalid and optionally add a new entry with the revised priority:: +break the heap structure invariants. So, a possible solution is to mark the +existing entry as removed and add a new entry with the revised priority:: - pq = [] # the priority queue list - counter = itertools.count(1) # unique sequence count - task_finder = {} # mapping of tasks to entries - INVALID = 0 # mark an entry as deleted + pq = [] # list of entries arranged in a heap + entry_finder = {} # mapping of tasks to entries + REMOVED = '' # placeholder for a removed task + counter = itertools.count() # unique sequence count - def add_task(priority, task, count=None): - if count is None: - count = next(counter) + def add_task(task, priority=0): + 'Add a new task or update the priority of an existing task' + if task in entry_finder: + remove_task(task) + count = next(counter) entry = [priority, count, task] - task_finder[task] = entry + entry_finder[task] = entry heappush(pq, entry) - def get_top_priority(): - while True: + def remove_task(task): + 'Mark an existing task as REMOVED. Raise KeyError if not found.' + entry = entry_finder.pop(task) + entry[-1] = REMOVED + + def pop_task(): + 'Remove and return the lowest priority task. Raise KeyError if empty.' + while pq: priority, count, task = heappop(pq) - if count is not INVALID: - del task_finder[task] + if task is not REMOVED: + del entry_finder[task] return task - - def delete_task(task): - entry = task_finder[task] - entry[1] = INVALID - - def reprioritize(priority, task): - entry = task_finder[task] - add_task(priority, task, entry[1]) - entry[1] = INVALID + raise KeyError('pop from an empty priority queue') Theory -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 22:57:16 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 22:57:16 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMTM4OiBhZGQg?= =?utf8?q?missing_versionadded=2E__Patch_by_Andreas_St=C3=BChrk=2E?= Message-ID: http://hg.python.org/cpython/rev/0f0a5d1c7a93 changeset: 72841:0f0a5d1c7a93 branch: 2.7 user: Ezio Melotti date: Sun Oct 09 23:56:51 2011 +0300 summary: #13138: add missing versionadded. Patch by Andreas St?hrk. files: Doc/library/xml.etree.elementtree.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -336,6 +336,8 @@ elements whose tag equals *tag* are returned from the iterator. If the tree structure is modified during iteration, the result is undefined. + .. versionadded:: 2.7 + .. method:: iterfind(match) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 23:03:39 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 23:03:39 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMTM4OiBhZGQg?= =?utf8?q?missing_versionadded=2E?= Message-ID: http://hg.python.org/cpython/rev/66d01b252b9a changeset: 72842:66d01b252b9a branch: 3.2 parent: 72838:525528c03256 user: Ezio Melotti date: Mon Oct 10 00:02:03 2011 +0300 summary: #13138: add missing versionadded. files: Doc/library/xml.etree.elementtree.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -335,6 +335,8 @@ elements whose tag equals *tag* are returned from the iterator. If the tree structure is modified during iteration, the result is undefined. + .. versionadded:: 3.2 + .. method:: iterfind(match) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 23:03:40 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 23:03:40 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313138=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/2580e642e2ee changeset: 72843:2580e642e2ee parent: 72839:a366d3684bc0 parent: 72842:66d01b252b9a user: Ezio Melotti date: Mon Oct 10 00:03:15 2011 +0300 summary: #13138: merge with 3.2. files: Doc/library/xml.etree.elementtree.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -335,6 +335,8 @@ elements whose tag equals *tag* are returned from the iterator. If the tree structure is modified during iteration, the result is undefined. + .. versionadded:: 3.2 + .. method:: iterfind(match) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 23:31:13 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 23:31:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix/improve_mar?= =?utf8?q?kup_in_whatsnew/2=2E7=2E?= Message-ID: http://hg.python.org/cpython/rev/70178bad66b0 changeset: 72844:70178bad66b0 branch: 2.7 parent: 72841:0f0a5d1c7a93 user: Ezio Melotti date: Mon Oct 10 00:25:47 2011 +0300 summary: Fix/improve markup in whatsnew/2.7. files: Doc/whatsnew/2.7.rst | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -1946,7 +1946,7 @@ version 1.3. Some of the new features are: * The various parsing functions now take a *parser* keyword argument - giving an :class:`XMLParser` instance that will + giving an :class:`~xml.etree.ElementTree.XMLParser` instance that will be used. This makes it possible to override the file's internal encoding:: p = ET.XMLParser(encoding='utf-8') @@ -1958,8 +1958,8 @@ * ElementTree's code for converting trees to a string has been significantly reworked, making it roughly twice as fast in many - cases. The :class:`ElementTree` :meth:`write` and :class:`Element` - :meth:`write` methods now have a *method* parameter that can be + cases. The :meth:`ElementTree.write() ` + and :meth:`Element.write` methods now have a *method* parameter that can be "xml" (the default), "html", or "text". HTML mode will output empty elements as ```` instead of ````, and text mode will skip over elements and only output the text chunks. If @@ -1972,11 +1972,12 @@ declarations are now output on the root element, not scattered throughout the resulting XML. You can set the default namespace for a tree by setting the :attr:`default_namespace` attribute and can - register new prefixes with :meth:`register_namespace`. In XML mode, + register new prefixes with :meth:`~xml.etree.ElementTree.register_namespace`. In XML mode, you can use the true/false *xml_declaration* parameter to suppress the XML declaration. -* New :class:`Element` method: :meth:`extend` appends the items from a +* New :class:`~xml.etree.ElementTree.Element` method: + :meth:`~xml.etree.ElementTree.Element.extend` appends the items from a sequence to the element's children. Elements themselves behave like sequences, so it's easy to move children from one element to another:: @@ -1992,13 +1993,15 @@ # Outputs 1... print ET.tostring(new) -* New :class:`Element` method: :meth:`iter` yields the children of the +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.iter` yields the children of the element as a generator. It's also possible to write ``for child in elem:`` to loop over an element's children. The existing method :meth:`getiterator` is now deprecated, as is :meth:`getchildren` which constructs and returns a list of children. -* New :class:`Element` method: :meth:`itertext` yields all chunks of +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.itertext` yields all chunks of text that are descendants of the element. For example:: t = ET.XML(""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 23:31:14 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 23:31:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix/improve_mar?= =?utf8?q?kup_in_whatsnew/2=2E7=2E?= Message-ID: http://hg.python.org/cpython/rev/ea233722a4b6 changeset: 72845:ea233722a4b6 branch: 3.2 parent: 72842:66d01b252b9a user: Ezio Melotti date: Mon Oct 10 00:30:14 2011 +0300 summary: Fix/improve markup in whatsnew/2.7. files: Doc/whatsnew/2.7.rst | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -1952,7 +1952,7 @@ version 1.3. Some of the new features are: * The various parsing functions now take a *parser* keyword argument - giving an :class:`XMLParser` instance that will + giving an :class:`~xml.etree.ElementTree.XMLParser` instance that will be used. This makes it possible to override the file's internal encoding:: p = ET.XMLParser(encoding='utf-8') @@ -1964,8 +1964,8 @@ * ElementTree's code for converting trees to a string has been significantly reworked, making it roughly twice as fast in many - cases. The :class:`ElementTree` :meth:`write` and :class:`Element` - :meth:`write` methods now have a *method* parameter that can be + cases. The :meth:`ElementTree.write() ` + and :meth:`Element.write` methods now have a *method* parameter that can be "xml" (the default), "html", or "text". HTML mode will output empty elements as ```` instead of ````, and text mode will skip over elements and only output the text chunks. If @@ -1978,11 +1978,12 @@ declarations are now output on the root element, not scattered throughout the resulting XML. You can set the default namespace for a tree by setting the :attr:`default_namespace` attribute and can - register new prefixes with :meth:`register_namespace`. In XML mode, + register new prefixes with :meth:`~xml.etree.ElementTree.register_namespace`. In XML mode, you can use the true/false *xml_declaration* parameter to suppress the XML declaration. -* New :class:`Element` method: :meth:`extend` appends the items from a +* New :class:`~xml.etree.ElementTree.Element` method: + :meth:`~xml.etree.ElementTree.Element.extend` appends the items from a sequence to the element's children. Elements themselves behave like sequences, so it's easy to move children from one element to another:: @@ -1998,13 +1999,15 @@ # Outputs 1... print ET.tostring(new) -* New :class:`Element` method: :meth:`iter` yields the children of the +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.iter` yields the children of the element as a generator. It's also possible to write ``for child in elem:`` to loop over an element's children. The existing method :meth:`getiterator` is now deprecated, as is :meth:`getchildren` which constructs and returns a list of children. -* New :class:`Element` method: :meth:`itertext` yields all chunks of +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.itertext` yields all chunks of text that are descendants of the element. For example:: t = ET.XML(""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 9 23:31:15 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 09 Oct 2011 23:31:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_whatsnew_fixes_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/ad4ebe5ce61d changeset: 72846:ad4ebe5ce61d parent: 72843:2580e642e2ee parent: 72845:ea233722a4b6 user: Ezio Melotti date: Mon Oct 10 00:31:00 2011 +0300 summary: Merge whatsnew fixes with 3.2. files: Doc/whatsnew/2.7.rst | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst --- a/Doc/whatsnew/2.7.rst +++ b/Doc/whatsnew/2.7.rst @@ -1952,7 +1952,7 @@ version 1.3. Some of the new features are: * The various parsing functions now take a *parser* keyword argument - giving an :class:`XMLParser` instance that will + giving an :class:`~xml.etree.ElementTree.XMLParser` instance that will be used. This makes it possible to override the file's internal encoding:: p = ET.XMLParser(encoding='utf-8') @@ -1964,8 +1964,8 @@ * ElementTree's code for converting trees to a string has been significantly reworked, making it roughly twice as fast in many - cases. The :class:`ElementTree` :meth:`write` and :class:`Element` - :meth:`write` methods now have a *method* parameter that can be + cases. The :meth:`ElementTree.write() ` + and :meth:`Element.write` methods now have a *method* parameter that can be "xml" (the default), "html", or "text". HTML mode will output empty elements as ```` instead of ````, and text mode will skip over elements and only output the text chunks. If @@ -1978,11 +1978,12 @@ declarations are now output on the root element, not scattered throughout the resulting XML. You can set the default namespace for a tree by setting the :attr:`default_namespace` attribute and can - register new prefixes with :meth:`register_namespace`. In XML mode, + register new prefixes with :meth:`~xml.etree.ElementTree.register_namespace`. In XML mode, you can use the true/false *xml_declaration* parameter to suppress the XML declaration. -* New :class:`Element` method: :meth:`extend` appends the items from a +* New :class:`~xml.etree.ElementTree.Element` method: + :meth:`~xml.etree.ElementTree.Element.extend` appends the items from a sequence to the element's children. Elements themselves behave like sequences, so it's easy to move children from one element to another:: @@ -1998,13 +1999,15 @@ # Outputs 1... print ET.tostring(new) -* New :class:`Element` method: :meth:`iter` yields the children of the +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.iter` yields the children of the element as a generator. It's also possible to write ``for child in elem:`` to loop over an element's children. The existing method :meth:`getiterator` is now deprecated, as is :meth:`getchildren` which constructs and returns a list of children. -* New :class:`Element` method: :meth:`itertext` yields all chunks of +* New :class:`Element` method: + :meth:`~xml.etree.ElementTree.Element.itertext` yields all chunks of text that are descendants of the element. For example:: t = ET.XML(""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 10 03:24:18 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 10 Oct 2011 03:24:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_any=5Ffind=5Fslice=28=29_do?= =?utf8?q?esn=27t_use_callbacks_anymore?= Message-ID: http://hg.python.org/cpython/rev/f924e0f62bcb changeset: 72847:f924e0f62bcb user: Victor Stinner date: Mon Oct 10 03:21:36 2011 +0200 summary: any_find_slice() doesn't use callbacks anymore * Call directly the right find/rfind method: allow inlining functions * Remove Py_LOCAL_CALLBACK (added for any_find_slice) files: Include/pyport.h | 3 - Objects/unicodeobject.c | 95 +++++++++++++--------------- 2 files changed, 43 insertions(+), 55 deletions(-) diff --git a/Include/pyport.h b/Include/pyport.h --- a/Include/pyport.h +++ b/Include/pyport.h @@ -286,15 +286,12 @@ /* fastest possible local call under MSVC */ #define Py_LOCAL(type) static type __fastcall #define Py_LOCAL_INLINE(type) static __inline type __fastcall -#define Py_LOCAL_CALLBACK(name) (__fastcall *name) #elif defined(USE_INLINE) #define Py_LOCAL(type) static type #define Py_LOCAL_INLINE(type) static inline type -#define Py_LOCAL_CALLBACK(name) (*name) #else #define Py_LOCAL(type) static type #define Py_LOCAL_INLINE(type) static type -#define Py_LOCAL_CALLBACK(name) (*name) #endif /* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8531,19 +8531,7 @@ #include "stringlib/undef.h" static Py_ssize_t -any_find_slice(Py_ssize_t Py_LOCAL_CALLBACK(ascii)(const Py_UCS1*, Py_ssize_t, - const Py_UCS1*, Py_ssize_t, - Py_ssize_t, Py_ssize_t), - Py_ssize_t Py_LOCAL_CALLBACK(ucs1)(const Py_UCS1*, Py_ssize_t, - const Py_UCS1*, Py_ssize_t, - Py_ssize_t, Py_ssize_t), - Py_ssize_t Py_LOCAL_CALLBACK(ucs2)(const Py_UCS2*, Py_ssize_t, - const Py_UCS2*, Py_ssize_t, - Py_ssize_t, Py_ssize_t), - Py_ssize_t Py_LOCAL_CALLBACK(ucs4)(const Py_UCS4*, Py_ssize_t, - const Py_UCS4*, Py_ssize_t, - Py_ssize_t, Py_ssize_t), - PyObject* s1, PyObject* s2, +any_find_slice(int direction, PyObject* s1, PyObject* s2, Py_ssize_t start, Py_ssize_t end) { @@ -8569,21 +8557,41 @@ len1 = PyUnicode_GET_LENGTH(s1); len2 = PyUnicode_GET_LENGTH(s2); - switch(kind) { - case PyUnicode_1BYTE_KIND: - if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2)) - result = ascii(buf1, len1, buf2, len2, start, end); - else - result = ucs1(buf1, len1, buf2, len2, start, end); - break; - case PyUnicode_2BYTE_KIND: - result = ucs2(buf1, len1, buf2, len2, start, end); - break; - case PyUnicode_4BYTE_KIND: - result = ucs4(buf1, len1, buf2, len2, start, end); - break; - default: - assert(0); result = -2; + if (direction > 0) { + switch(kind) { + case PyUnicode_1BYTE_KIND: + if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2)) + result = asciilib_find_slice(buf1, len1, buf2, len2, start, end); + else + result = ucs1lib_find_slice(buf1, len1, buf2, len2, start, end); + break; + case PyUnicode_2BYTE_KIND: + result = ucs2lib_find_slice(buf1, len1, buf2, len2, start, end); + break; + case PyUnicode_4BYTE_KIND: + result = ucs4lib_find_slice(buf1, len1, buf2, len2, start, end); + break; + default: + assert(0); result = -2; + } + } + else { + switch(kind) { + case PyUnicode_1BYTE_KIND: + if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2)) + result = asciilib_rfind_slice(buf1, len1, buf2, len2, start, end); + else + result = ucs1lib_rfind_slice(buf1, len1, buf2, len2, start, end); + break; + case PyUnicode_2BYTE_KIND: + result = ucs2lib_rfind_slice(buf1, len1, buf2, len2, start, end); + break; + case PyUnicode_4BYTE_KIND: + result = ucs4lib_rfind_slice(buf1, len1, buf2, len2, start, end); + break; + default: + assert(0); result = -2; + } } if (kind1 != kind) @@ -8752,18 +8760,9 @@ return -2; } - if (direction > 0) - result = any_find_slice( - asciilib_find_slice, ucs1lib_find_slice, - ucs2lib_find_slice, ucs4lib_find_slice, - str, sub, start, end - ); - else - result = any_find_slice( - asciilib_rfind_slice, ucs1lib_rfind_slice, - ucs2lib_rfind_slice, ucs4lib_rfind_slice, - str, sub, start, end - ); + result = any_find_slice(direction, + str, sub, start, end + ); Py_DECREF(str); Py_DECREF(sub); @@ -10677,9 +10676,7 @@ if (PyUnicode_READY(substring) == -1) return NULL; - result = any_find_slice( - asciilib_find_slice, ucs1lib_find_slice, - ucs2lib_find_slice, ucs4lib_find_slice, + result = any_find_slice(1, self, (PyObject*)substring, start, end ); @@ -10771,9 +10768,7 @@ if (PyUnicode_READY(substring) == -1) return NULL; - result = any_find_slice( - asciilib_find_slice, ucs1lib_find_slice, - ucs2lib_find_slice, ucs4lib_find_slice, + result = any_find_slice(1, self, (PyObject*)substring, start, end ); @@ -11784,9 +11779,7 @@ if (PyUnicode_READY(substring) == -1) return NULL; - result = any_find_slice( - asciilib_rfind_slice, ucs1lib_rfind_slice, - ucs2lib_rfind_slice, ucs4lib_rfind_slice, + result = any_find_slice(-1, self, (PyObject*)substring, start, end ); @@ -11820,9 +11813,7 @@ if (PyUnicode_READY(substring) == -1) return NULL; - result = any_find_slice( - asciilib_rfind_slice, ucs1lib_rfind_slice, - ucs2lib_rfind_slice, ucs4lib_rfind_slice, + result = any_find_slice(-1, self, (PyObject*)substring, start, end ); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 10 05:25:18 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 10 Oct 2011 05:25:18 +0200 Subject: [Python-checkins] Daily reference leaks (f924e0f62bcb): sum=2115 Message-ID: results for f924e0f62bcb on branch "default" -------------------------------------------- test_socket leaked [705, 705, 705] references, sum=2115 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogYtFkaL', '-x'] From python-checkins at python.org Mon Oct 10 18:11:39 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 10 Oct 2011 18:11:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_identifier_API_for_PyOb?= =?utf8?q?ject=5FGetAttrString=2E?= Message-ID: http://hg.python.org/cpython/rev/81380082d216 changeset: 72848:81380082d216 user: Martin v. L?wis date: Mon Oct 10 18:11:30 2011 +0200 summary: Use identifier API for PyObject_GetAttrString. files: Modules/_collectionsmodule.c | 3 +- Modules/_csv.c | 3 +- Modules/_datetimemodule.c | 6 +- Modules/_json.c | 1 + Modules/_pickle.c | 36 +- Modules/arraymodule.c | 8 +- Modules/parsermodule.c | 11 +- Modules/posixmodule.c | 3 +- Modules/pyexpat.c | 4 +- Modules/zipimport.c | 5 +- Objects/bytearrayobject.c | 4 +- Objects/classobject.c | 8 +- Objects/descrobject.c | 3 +- Objects/fileobject.c | 10 +- Objects/moduleobject.c | 3 +- Objects/setobject.c | 3 +- Objects/typeobject.c | 37 +- Objects/weakrefobject.c | 3 +- Parser/asdl_c.py | 24 +- Parser/tokenizer.c | 3 +- Python/Python-ast.c | 601 ++++++++++++---------- Python/_warnings.c | 3 +- Python/bltinmodule.c | 14 +- Python/codecs.c | 6 +- Python/errors.c | 3 +- Python/import.c | 16 +- Python/pythonrun.c | 30 +- Python/sysmodule.c | 9 +- 28 files changed, 501 insertions(+), 359 deletions(-) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -767,8 +767,9 @@ deque_reduce(dequeobject *deque) { PyObject *dict, *result, *aslist; + _Py_identifier(__dict__); - dict = PyObject_GetAttrString((PyObject *)deque, "__dict__"); + dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__); if (dict == NULL) PyErr_Clear(); aslist = PySequence_List((PyObject *)deque); diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1317,6 +1317,7 @@ { PyObject * output_file, * dialect = NULL; WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type); + _Py_identifier(write); if (!self) return NULL; @@ -1333,7 +1334,7 @@ Py_DECREF(self); return NULL; } - self->writeline = PyObject_GetAttrString(output_file, "write"); + self->writeline = _PyObject_GetAttrId(output_file, &PyId_write); if (self->writeline == NULL || !PyCallable_Check(self->writeline)) { PyErr_SetString(PyExc_TypeError, "argument 1 must have a \"write\" method"); diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -3077,12 +3077,14 @@ { PyObject *args, *state, *tmp; PyObject *getinitargs, *getstate; + _Py_identifier(__getinitargs__); + _Py_identifier(__getstate__); tmp = PyTuple_New(0); if (tmp == NULL) return NULL; - getinitargs = PyObject_GetAttrString(self, "__getinitargs__"); + getinitargs = _PyObject_GetAttrId(self, &PyId___getinitargs__); if (getinitargs != NULL) { args = PyObject_CallObject(getinitargs, tmp); Py_DECREF(getinitargs); @@ -3097,7 +3099,7 @@ Py_INCREF(args); } - getstate = PyObject_GetAttrString(self, "__getstate__"); + getstate = _PyObject_GetAttrId(self, &PyId___getstate__); if (getstate != NULL) { state = PyObject_CallObject(getstate, tmp); Py_DECREF(getstate); diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1126,6 +1126,7 @@ PyObject *ctx; static char *kwlist[] = {"context", NULL}; PyScannerObject *s; + _Py_identifier(strict); assert(PyScanner_Check(self)); s = (PyScannerObject *)self; diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -826,8 +826,9 @@ static int _Pickler_SetOutputStream(PicklerObject *self, PyObject *file) { + _Py_identifier(write); assert(file != NULL); - self->write = PyObject_GetAttrString(file, "write"); + self->write = _PyObject_GetAttrId(file, &PyId_write); if (self->write == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_SetString(PyExc_TypeError, @@ -1173,15 +1174,19 @@ static int _Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file) { - self->peek = PyObject_GetAttrString(file, "peek"); + _Py_identifier(peek); + _Py_identifier(read); + _Py_identifier(readline); + + self->peek = _PyObject_GetAttrId(file, &PyId_peek); if (self->peek == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); else return -1; } - self->read = PyObject_GetAttrString(file, "read"); - self->readline = PyObject_GetAttrString(file, "readline"); + self->read = _PyObject_GetAttrId(file, &PyId_read); + self->readline = _PyObject_GetAttrId(file, &PyId_readline); if (self->readline == NULL || self->read == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_SetString(PyExc_TypeError, @@ -3390,6 +3395,7 @@ PyObject *file; PyObject *proto_obj = NULL; PyObject *fix_imports = Py_True; + _Py_identifier(persistent_id); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:Pickler", kwlist, &file, &proto_obj, &fix_imports)) @@ -3425,9 +3431,9 @@ self->fast_nesting = 0; self->fast_memo = NULL; self->pers_func = NULL; - if (PyObject_HasAttrString((PyObject *)self, "persistent_id")) { - self->pers_func = PyObject_GetAttrString((PyObject *)self, - "persistent_id"); + if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_id)) { + self->pers_func = _PyObject_GetAttrId((PyObject *)self, + &PyId_persistent_id); if (self->pers_func == NULL) return -1; } @@ -4935,8 +4941,9 @@ } else { PyObject *append_func; - - append_func = PyObject_GetAttrString(list, "append"); + _Py_identifier(append); + + append_func = _PyObject_GetAttrId(list, &PyId_append); if (append_func == NULL) return -1; for (i = x; i < len; i++) { @@ -5023,6 +5030,7 @@ PyObject *state, *inst, *slotstate; PyObject *setstate; int status = 0; + _Py_identifier(__setstate__); /* Stack is ... instance, state. We want to leave instance at * the stack top, possibly mutated via instance.__setstate__(state). @@ -5036,7 +5044,7 @@ inst = self->stack->data[Py_SIZE(self->stack) - 1]; - setstate = PyObject_GetAttrString(inst, "__setstate__"); + setstate = _PyObject_GetAttrId(inst, &PyId___setstate__); if (setstate == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); @@ -5079,12 +5087,13 @@ PyObject *dict; PyObject *d_key, *d_value; Py_ssize_t i; + _Py_identifier(__dict__); if (!PyDict_Check(state)) { PyErr_SetString(UnpicklingError, "state is not a dictionary"); goto error; } - dict = PyObject_GetAttrString(inst, "__dict__"); + dict = _PyObject_GetAttrId(inst, &PyId___dict__); if (dict == NULL) goto error; @@ -5584,8 +5593,9 @@ return -1; if (PyObject_HasAttrString((PyObject *)self, "persistent_load")) { - self->pers_func = PyObject_GetAttrString((PyObject *)self, - "persistent_load"); + _Py_identifier(persistent_load); + self->pers_func = _PyObject_GetAttrId((PyObject *)self, + &PyId_persistent_load); if (self->pers_func == NULL) return -1; } diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2003,14 +2003,16 @@ int mformat_code; static PyObject *array_reconstructor = NULL; long protocol; + _Py_identifier(_array_reconstructor); + _Py_identifier(__dict__); if (array_reconstructor == NULL) { PyObject *array_module = PyImport_ImportModule("array"); if (array_module == NULL) return NULL; - array_reconstructor = PyObject_GetAttrString( + array_reconstructor = _PyObject_GetAttrId( array_module, - "_array_reconstructor"); + &PyId__array_reconstructor); Py_DECREF(array_module); if (array_reconstructor == NULL) return NULL; @@ -2025,7 +2027,7 @@ if (protocol == -1 && PyErr_Occurred()) return NULL; - dict = PyObject_GetAttrString((PyObject *)array, "__dict__"); + dict = _PyObject_GetAttrId((PyObject *)array, &PyId___dict__); if (dict == NULL) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return NULL; diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -3241,10 +3241,13 @@ copyreg = PyImport_ImportModuleNoBlock("copyreg"); if (copyreg != NULL) { PyObject *func, *pickler; - - func = PyObject_GetAttrString(copyreg, "pickle"); - pickle_constructor = PyObject_GetAttrString(module, "sequence2st"); - pickler = PyObject_GetAttrString(module, "_pickler"); + _Py_identifier(pickle); + _Py_identifier(sequence2st); + _Py_identifier(_pickler); + + func = _PyObject_GetAttrId(copyreg, &PyId_pickle); + pickle_constructor = _PyObject_GetAttrId(module, &PyId_sequence2st); + pickler = _PyObject_GetAttrId(module, &PyId__pickler); Py_XINCREF(pickle_constructor); if ((func != NULL) && (pickle_constructor != NULL) && (pickler != NULL)) { diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -6103,6 +6103,7 @@ { PyObject *result; static PyObject *struct_rusage; + _Py_identifier(struct_rusage); if (pid == -1) return posix_error(); @@ -6111,7 +6112,7 @@ PyObject *m = PyImport_ImportModuleNoBlock("resource"); if (m == NULL) return NULL; - struct_rusage = PyObject_GetAttrString(m, "struct_rusage"); + struct_rusage = _PyObject_GetAttrId(m, &PyId_struct_rusage); Py_DECREF(m); if (struct_rusage == NULL) return NULL; diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -843,9 +843,9 @@ { int rv = 1; PyObject *readmethod = NULL; + _Py_identifier(read); - - readmethod = PyObject_GetAttrString(f, "read"); + readmethod = _PyObject_GetAttrId(f, &PyId_read); if (readmethod == NULL) { PyErr_SetString(PyExc_TypeError, "argument must have 'read' attribute"); diff --git a/Modules/zipimport.c b/Modules/zipimport.c --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -908,6 +908,7 @@ static int importing_zlib = 0; PyObject *zlib; PyObject *decompress; + _Py_identifier(decompress); if (importing_zlib != 0) /* Someone has a zlib.py[co] in their Zip file; @@ -917,8 +918,8 @@ zlib = PyImport_ImportModuleNoBlock("zlib"); importing_zlib = 0; if (zlib != NULL) { - decompress = PyObject_GetAttrString(zlib, - "decompress"); + decompress = _PyObject_GetAttrId(zlib, + &PyId_decompress); Py_DECREF(zlib); } else { diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2699,13 +2699,15 @@ bytearray_reduce(PyByteArrayObject *self) { PyObject *latin1, *dict; + _Py_identifier(__dict__); + if (self->ob_bytes) latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, Py_SIZE(self), NULL); else latin1 = PyUnicode_FromString(""); - dict = PyObject_GetAttrString((PyObject *)self, "__dict__"); + dict = _PyObject_GetAttrId((PyObject *)self, &PyId___dict__); if (dict == NULL) { PyErr_Clear(); dict = Py_None; diff --git a/Objects/classobject.c b/Objects/classobject.c --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -14,6 +14,8 @@ #define PyMethod_MAXFREELIST 256 #endif +_Py_identifier(__name__); + PyObject * PyMethod_Function(PyObject *im) { @@ -226,7 +228,7 @@ return NULL; } - funcname = PyObject_GetAttrString(func, "__name__"); + funcname = _PyObject_GetAttrId(func, &PyId___name__); if (funcname == NULL) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return NULL; @@ -240,7 +242,7 @@ if (klass == NULL) klassname = NULL; else { - klassname = PyObject_GetAttrString(klass, "__name__"); + klassname = _PyObject_GetAttrId(klass, &PyId___name__); if (klassname == NULL) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return NULL; @@ -542,7 +544,7 @@ return NULL; } - funcname = PyObject_GetAttrString(func, "__name__"); + funcname = _PyObject_GetAttrId(func, &PyId___name__); if (funcname == NULL) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return NULL; diff --git a/Objects/descrobject.c b/Objects/descrobject.c --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -1299,7 +1299,8 @@ /* if no docstring given and the getter has one, use that one */ if ((doc == NULL || doc == Py_None) && get != NULL) { - PyObject *get_doc = PyObject_GetAttrString(get, "__doc__"); + _Py_identifier(__doc__); + PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__); if (get_doc) { if (Py_TYPE(self) == &PyProperty_Type) { Py_XDECREF(prop->prop_doc); diff --git a/Objects/fileobject.c b/Objects/fileobject.c --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -59,8 +59,9 @@ { PyObject *reader; PyObject *args; + _Py_identifier(readline); - reader = PyObject_GetAttrString(f, "readline"); + reader = _PyObject_GetAttrId(f, &PyId_readline); if (reader == NULL) return NULL; if (n <= 0) @@ -127,11 +128,13 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) { PyObject *writer, *value, *args, *result; + _Py_identifier(write); + if (f == NULL) { PyErr_SetString(PyExc_TypeError, "writeobject with NULL file"); return -1; } - writer = PyObject_GetAttrString(f, "write"); + writer = _PyObject_GetAttrId(f, &PyId_write); if (writer == NULL) return -1; if (flags & Py_PRINT_RAW) { @@ -194,11 +197,12 @@ { int fd; PyObject *meth; + _Py_identifier(fileno); if (PyLong_Check(o)) { fd = PyLong_AsLong(o); } - else if ((meth = PyObject_GetAttrString(o, "fileno")) != NULL) + else if ((meth = _PyObject_GetAttrId(o, &PyId_fileno)) != NULL) { PyObject *fno = PyEval_CallObject(meth, NULL); Py_DECREF(meth); diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -415,8 +415,9 @@ static PyObject * module_dir(PyObject *self, PyObject *args) { + _Py_identifier(__dict__); PyObject *result = NULL; - PyObject *dict = PyObject_GetAttrString(self, "__dict__"); + PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict != NULL) { if (PyDict_Check(dict)) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1933,6 +1933,7 @@ set_reduce(PySetObject *so) { PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL; + _Py_identifier(__dict__); keys = PySequence_List((PyObject *)so); if (keys == NULL) @@ -1940,7 +1941,7 @@ args = PyTuple_Pack(1, keys); if (args == NULL) goto done; - dict = PyObject_GetAttrString((PyObject *)so, "__dict__"); + dict = _PyObject_GetAttrId((PyObject *)so, &PyId___dict__); if (dict == NULL) { PyErr_Clear(); dict = Py_None; diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -35,6 +35,9 @@ static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; +_Py_identifier(__dict__); +_Py_identifier(__class__); + unsigned int PyType_ClearCache(void) { @@ -1281,7 +1284,8 @@ static PyObject * class_name(PyObject *cls) { - PyObject *name = PyObject_GetAttrString(cls, "__name__"); + _Py_identifier(__name__); + PyObject *name = _PyObject_GetAttrId(cls, &PyId___name__); if (name == NULL) { PyErr_Clear(); Py_XDECREF(name); @@ -1709,15 +1713,14 @@ static PyObject * get_dict_descriptor(PyTypeObject *type) { - static PyObject *dict_str; + PyObject *dict_str; PyObject *descr; - if (dict_str == NULL) { - dict_str = PyUnicode_InternFromString("__dict__"); - if (dict_str == NULL) - return NULL; - } + dict_str = _PyUnicode_FromId(&PyId___dict__); + if (dict_str == NULL) + return NULL; descr = _PyType_Lookup(type, dict_str); + Py_DECREF(dict_str); if (descr == NULL || !PyDescr_IsData(descr)) return NULL; @@ -2596,12 +2599,13 @@ { PyObject *classdict; PyObject *bases; + _Py_identifier(__bases__); assert(PyDict_Check(dict)); assert(aclass); /* Merge in the type's dict (if any). */ - classdict = PyObject_GetAttrString(aclass, "__dict__"); + classdict = _PyObject_GetAttrId(aclass, &PyId___dict__); if (classdict == NULL) PyErr_Clear(); else { @@ -2612,7 +2616,7 @@ } /* Recursively merge in the base types' (if any) dicts. */ - bases = PyObject_GetAttrString(aclass, "__bases__"); + bases = _PyObject_GetAttrId(aclass, &PyId___bases__); if (bases == NULL) PyErr_Clear(); else { @@ -3540,7 +3544,7 @@ PyObject *itsclass = NULL; /* Get __dict__ (which may or may not be a real dict...) */ - dict = PyObject_GetAttrString(self, "__dict__"); + dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict == NULL) { PyErr_Clear(); dict = PyDict_New(); @@ -3560,7 +3564,7 @@ goto error; /* Merge in attrs reachable from its class. */ - itsclass = PyObject_GetAttrString(self, "__class__"); + itsclass = _PyObject_GetAttrId(self, &PyId___class__); if (itsclass == NULL) /* XXX(tomer): Perhaps fall back to obj->ob_type if no __class__ exists? */ @@ -6304,16 +6308,15 @@ } else { /* Try the slow way */ - static PyObject *class_str = NULL; + PyObject *class_str = NULL; PyObject *class_attr; - if (class_str == NULL) { - class_str = PyUnicode_FromString("__class__"); - if (class_str == NULL) - return NULL; - } + class_str = _PyUnicode_FromId(&PyId___class__); + if (class_str == NULL) + return NULL; class_attr = PyObject_GetAttr(obj, class_str); + Py_DECREF(class_str); if (class_attr != NULL && PyType_Check(class_attr) && diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -157,11 +157,12 @@ weakref_repr(PyWeakReference *self) { PyObject *name, *repr; + _Py_identifier(__name__); if (PyWeakref_GET_OBJECT(self) == Py_None) return PyUnicode_FromFormat("", self); - name = PyObject_GetAttrString(PyWeakref_GET_OBJECT(self), "__name__"); + name = _PyObject_GetAttrId(PyWeakref_GET_OBJECT(self), &PyId___name__); if (name == NULL || !PyUnicode_Check(name)) { if (name == NULL) PyErr_Clear(); diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -85,8 +85,16 @@ def __init__(self, file): self.file = file + self.identifiers = set() super(EmitVisitor, self).__init__() + def emit_identifier(self, name): + name = str(name) + if name in self.identifiers: + return + self.emit("_Py_identifier(%s);" % name, 0) + self.identifiers.add(name) + def emit(self, s, depth, reflow=True): # XXX reflow long lines? if reflow: @@ -486,12 +494,12 @@ def visitField(self, field, name, sum=None, prod=None, depth=0): ctype = get_c_type(field.type) - self.emit("if (PyObject_HasAttrString(obj, \"%s\")) {" % field.name, depth) + self.emit("if (_PyObject_HasAttrId(obj, &PyId_%s)) {" % field.name, depth) self.emit("int res;", depth+1) if field.seq: self.emit("Py_ssize_t len;", depth+1) self.emit("Py_ssize_t i;", depth+1) - self.emit("tmp = PyObject_GetAttrString(obj, \"%s\");" % field.name, depth+1) + self.emit("tmp = _PyObject_GetAttrId(obj, &PyId_%s);" % field.name, depth+1) self.emit("if (tmp == NULL) goto failed;", depth+1) if field.seq: self.emit("if (!PyList_Check(tmp)) {", depth+1) @@ -553,6 +561,8 @@ self.emit("static PyTypeObject *%s_type;" % name, 0) self.emit("static PyObject* ast2obj_%s(void*);" % name, 0) if prod.fields: + for f in prod.fields: + self.emit_identifier(f.name) self.emit("static char *%s_fields[]={" % name,0) for f in prod.fields: self.emit('"%s",' % f.name, 1) @@ -561,6 +571,8 @@ def visitSum(self, sum, name): self.emit("static PyTypeObject *%s_type;" % name, 0) if sum.attributes: + for a in sum.attributes: + self.emit_identifier(a.name) self.emit("static char *%s_attributes[] = {" % name, 0) for a in sum.attributes: self.emit('"%s",' % a.name, 1) @@ -580,6 +592,8 @@ def visitConstructor(self, cons, name): self.emit("static PyTypeObject *%s_type;" % cons.name, 0) if cons.fields: + for t in cons.fields: + self.emit_identifier(t.name) self.emit("static char *%s_fields[]={" % cons.name, 0) for t in cons.fields: self.emit('"%s",' % t.name, 1) @@ -592,10 +606,11 @@ static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + _Py_identifier(_fields); Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields"); + fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields); if (!fields) PyErr_Clear(); if (fields) { @@ -645,7 +660,8 @@ ast_type_reduce(PyObject *self, PyObject *unused) { PyObject *res; - PyObject *dict = PyObject_GetAttrString(self, "__dict__"); + _Py_identifier(__dict__); + PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -463,6 +463,7 @@ { PyObject *readline = NULL, *stream = NULL, *io = NULL; _Py_identifier(open); + _Py_identifier(readline); int fd; io = PyImport_ImportModuleNoBlock("io"); @@ -481,7 +482,7 @@ goto cleanup; Py_XDECREF(tok->decoding_readline); - readline = PyObject_GetAttrString(stream, "readline"); + readline = _PyObject_GetAttrId(stream, &PyId_readline); tok->decoding_readline = readline; /* The file has been reopened; parsing will restart from diff --git a/Python/Python-ast.c b/Python/Python-ast.c --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -7,6 +7,7 @@ static PyTypeObject *mod_type; static PyObject* ast2obj_mod(void*); static PyTypeObject *Module_type; +_Py_identifier(body); static char *Module_fields[]={ "body", }; @@ -23,12 +24,18 @@ "body", }; static PyTypeObject *stmt_type; +_Py_identifier(lineno); +_Py_identifier(col_offset); static char *stmt_attributes[] = { "lineno", "col_offset", }; static PyObject* ast2obj_stmt(void*); static PyTypeObject *FunctionDef_type; +_Py_identifier(name); +_Py_identifier(args); +_Py_identifier(decorator_list); +_Py_identifier(returns); static char *FunctionDef_fields[]={ "name", "args", @@ -37,6 +44,10 @@ "returns", }; static PyTypeObject *ClassDef_type; +_Py_identifier(bases); +_Py_identifier(keywords); +_Py_identifier(starargs); +_Py_identifier(kwargs); static char *ClassDef_fields[]={ "name", "bases", @@ -47,10 +58,12 @@ "decorator_list", }; static PyTypeObject *Return_type; +_Py_identifier(value); static char *Return_fields[]={ "value", }; static PyTypeObject *Delete_type; +_Py_identifier(targets); static char *Delete_fields[]={ "targets", }; @@ -60,12 +73,16 @@ "value", }; static PyTypeObject *AugAssign_type; +_Py_identifier(target); +_Py_identifier(op); static char *AugAssign_fields[]={ "target", "op", "value", }; static PyTypeObject *For_type; +_Py_identifier(iter); +_Py_identifier(orelse); static char *For_fields[]={ "target", "iter", @@ -73,6 +90,7 @@ "orelse", }; static PyTypeObject *While_type; +_Py_identifier(test); static char *While_fields[]={ "test", "body", @@ -85,16 +103,21 @@ "orelse", }; static PyTypeObject *With_type; +_Py_identifier(items); static char *With_fields[]={ "items", "body", }; static PyTypeObject *Raise_type; +_Py_identifier(exc); +_Py_identifier(cause); static char *Raise_fields[]={ "exc", "cause", }; static PyTypeObject *Try_type; +_Py_identifier(handlers); +_Py_identifier(finalbody); static char *Try_fields[]={ "body", "handlers", @@ -102,15 +125,19 @@ "finalbody", }; static PyTypeObject *Assert_type; +_Py_identifier(msg); static char *Assert_fields[]={ "test", "msg", }; static PyTypeObject *Import_type; +_Py_identifier(names); static char *Import_fields[]={ "names", }; static PyTypeObject *ImportFrom_type; +_Py_identifier(module); +_Py_identifier(level); static char *ImportFrom_fields[]={ "module", "names", @@ -138,17 +165,21 @@ }; static PyObject* ast2obj_expr(void*); static PyTypeObject *BoolOp_type; +_Py_identifier(values); static char *BoolOp_fields[]={ "op", "values", }; static PyTypeObject *BinOp_type; +_Py_identifier(left); +_Py_identifier(right); static char *BinOp_fields[]={ "left", "op", "right", }; static PyTypeObject *UnaryOp_type; +_Py_identifier(operand); static char *UnaryOp_fields[]={ "op", "operand", @@ -165,15 +196,19 @@ "orelse", }; static PyTypeObject *Dict_type; +_Py_identifier(keys); static char *Dict_fields[]={ "keys", "values", }; static PyTypeObject *Set_type; +_Py_identifier(elts); static char *Set_fields[]={ "elts", }; static PyTypeObject *ListComp_type; +_Py_identifier(elt); +_Py_identifier(generators); static char *ListComp_fields[]={ "elt", "generators", @@ -184,6 +219,7 @@ "generators", }; static PyTypeObject *DictComp_type; +_Py_identifier(key); static char *DictComp_fields[]={ "key", "value", @@ -199,12 +235,15 @@ "value", }; static PyTypeObject *Compare_type; +_Py_identifier(ops); +_Py_identifier(comparators); static char *Compare_fields[]={ "left", "ops", "comparators", }; static PyTypeObject *Call_type; +_Py_identifier(func); static char *Call_fields[]={ "func", "args", @@ -213,10 +252,12 @@ "kwargs", }; static PyTypeObject *Num_type; +_Py_identifier(n); static char *Num_fields[]={ "n", }; static PyTypeObject *Str_type; +_Py_identifier(s); static char *Str_fields[]={ "s", }; @@ -226,12 +267,15 @@ }; static PyTypeObject *Ellipsis_type; static PyTypeObject *Attribute_type; +_Py_identifier(attr); +_Py_identifier(ctx); static char *Attribute_fields[]={ "value", "attr", "ctx", }; static PyTypeObject *Subscript_type; +_Py_identifier(slice); static char *Subscript_fields[]={ "value", "slice", @@ -243,6 +287,7 @@ "ctx", }; static PyTypeObject *Name_type; +_Py_identifier(id); static char *Name_fields[]={ "id", "ctx", @@ -270,12 +315,16 @@ static PyTypeObject *slice_type; static PyObject* ast2obj_slice(void*); static PyTypeObject *Slice_type; +_Py_identifier(lower); +_Py_identifier(upper); +_Py_identifier(step); static char *Slice_fields[]={ "lower", "upper", "step", }; static PyTypeObject *ExtSlice_type; +_Py_identifier(dims); static char *ExtSlice_fields[]={ "dims", }; @@ -331,6 +380,7 @@ static PyTypeObject *NotIn_type; static PyTypeObject *comprehension_type; static PyObject* ast2obj_comprehension(void*); +_Py_identifier(ifs); static char *comprehension_fields[]={ "target", "iter", @@ -343,6 +393,7 @@ }; static PyObject* ast2obj_excepthandler(void*); static PyTypeObject *ExceptHandler_type; +_Py_identifier(type); static char *ExceptHandler_fields[]={ "type", "name", @@ -350,6 +401,13 @@ }; static PyTypeObject *arguments_type; static PyObject* ast2obj_arguments(void*); +_Py_identifier(vararg); +_Py_identifier(varargannotation); +_Py_identifier(kwonlyargs); +_Py_identifier(kwarg); +_Py_identifier(kwargannotation); +_Py_identifier(defaults); +_Py_identifier(kw_defaults); static char *arguments_fields[]={ "args", "vararg", @@ -362,6 +420,8 @@ }; static PyTypeObject *arg_type; static PyObject* ast2obj_arg(void*); +_Py_identifier(arg); +_Py_identifier(annotation); static char *arg_fields[]={ "arg", "annotation", @@ -374,12 +434,15 @@ }; static PyTypeObject *alias_type; static PyObject* ast2obj_alias(void*); +_Py_identifier(asname); static char *alias_fields[]={ "name", "asname", }; static PyTypeObject *withitem_type; static PyObject* ast2obj_withitem(void*); +_Py_identifier(context_expr); +_Py_identifier(optional_vars); static char *withitem_fields[]={ "context_expr", "optional_vars", @@ -389,10 +452,11 @@ static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { + _Py_identifier(_fields); Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; - fields = PyObject_GetAttrString((PyObject*)Py_TYPE(self), "_fields"); + fields = _PyObject_GetAttrId((PyObject*)Py_TYPE(self), &PyId__fields); if (!fields) PyErr_Clear(); if (fields) { @@ -442,7 +506,8 @@ ast_type_reduce(PyObject *self, PyObject *unused) { PyObject *res; - PyObject *dict = PyObject_GetAttrString(self, "__dict__"); + _Py_identifier(__dict__); + PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) PyErr_Clear(); @@ -3415,11 +3480,11 @@ if (isinstance) { asdl_seq* body; - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Module field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3451,11 +3516,11 @@ if (isinstance) { asdl_seq* body; - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Interactive field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3487,9 +3552,9 @@ if (isinstance) { expr_ty body; - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &body, arena); if (res != 0) goto failed; @@ -3510,11 +3575,11 @@ if (isinstance) { asdl_seq* body; - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Suite field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3559,9 +3624,9 @@ *out = NULL; return 0; } - if (PyObject_HasAttrString(obj, "lineno")) { + if (_PyObject_HasAttrId(obj, &PyId_lineno)) { int res; - tmp = PyObject_GetAttrString(obj, "lineno"); + tmp = _PyObject_GetAttrId(obj, &PyId_lineno); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &lineno, arena); if (res != 0) goto failed; @@ -3571,9 +3636,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from stmt"); return 1; } - if (PyObject_HasAttrString(obj, "col_offset")) { + if (_PyObject_HasAttrId(obj, &PyId_col_offset)) { int res; - tmp = PyObject_GetAttrString(obj, "col_offset"); + tmp = _PyObject_GetAttrId(obj, &PyId_col_offset); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &col_offset, arena); if (res != 0) goto failed; @@ -3594,9 +3659,9 @@ asdl_seq* decorator_list; expr_ty returns; - if (PyObject_HasAttrString(obj, "name")) { + if (_PyObject_HasAttrId(obj, &PyId_name)) { int res; - tmp = PyObject_GetAttrString(obj, "name"); + tmp = _PyObject_GetAttrId(obj, &PyId_name); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &name, arena); if (res != 0) goto failed; @@ -3606,9 +3671,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from FunctionDef"); return 1; } - if (PyObject_HasAttrString(obj, "args")) { + if (_PyObject_HasAttrId(obj, &PyId_args)) { int res; - tmp = PyObject_GetAttrString(obj, "args"); + tmp = _PyObject_GetAttrId(obj, &PyId_args); if (tmp == NULL) goto failed; res = obj2ast_arguments(tmp, &args, arena); if (res != 0) goto failed; @@ -3618,11 +3683,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from FunctionDef"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "FunctionDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3643,11 +3708,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from FunctionDef"); return 1; } - if (PyObject_HasAttrString(obj, "decorator_list")) { + if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "decorator_list"); + tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "FunctionDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3668,9 +3733,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"decorator_list\" missing from FunctionDef"); return 1; } - if (PyObject_HasAttrString(obj, "returns")) { + if (_PyObject_HasAttrId(obj, &PyId_returns)) { int res; - tmp = PyObject_GetAttrString(obj, "returns"); + tmp = _PyObject_GetAttrId(obj, &PyId_returns); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &returns, arena); if (res != 0) goto failed; @@ -3697,9 +3762,9 @@ asdl_seq* body; asdl_seq* decorator_list; - if (PyObject_HasAttrString(obj, "name")) { + if (_PyObject_HasAttrId(obj, &PyId_name)) { int res; - tmp = PyObject_GetAttrString(obj, "name"); + tmp = _PyObject_GetAttrId(obj, &PyId_name); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &name, arena); if (res != 0) goto failed; @@ -3709,11 +3774,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from ClassDef"); return 1; } - if (PyObject_HasAttrString(obj, "bases")) { + if (_PyObject_HasAttrId(obj, &PyId_bases)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "bases"); + tmp = _PyObject_GetAttrId(obj, &PyId_bases); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ClassDef field \"bases\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3734,11 +3799,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"bases\" missing from ClassDef"); return 1; } - if (PyObject_HasAttrString(obj, "keywords")) { + if (_PyObject_HasAttrId(obj, &PyId_keywords)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "keywords"); + tmp = _PyObject_GetAttrId(obj, &PyId_keywords); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ClassDef field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3759,9 +3824,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from ClassDef"); return 1; } - if (PyObject_HasAttrString(obj, "starargs")) { + if (_PyObject_HasAttrId(obj, &PyId_starargs)) { int res; - tmp = PyObject_GetAttrString(obj, "starargs"); + tmp = _PyObject_GetAttrId(obj, &PyId_starargs); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &starargs, arena); if (res != 0) goto failed; @@ -3770,9 +3835,9 @@ } else { starargs = NULL; } - if (PyObject_HasAttrString(obj, "kwargs")) { + if (_PyObject_HasAttrId(obj, &PyId_kwargs)) { int res; - tmp = PyObject_GetAttrString(obj, "kwargs"); + tmp = _PyObject_GetAttrId(obj, &PyId_kwargs); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &kwargs, arena); if (res != 0) goto failed; @@ -3781,11 +3846,11 @@ } else { kwargs = NULL; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ClassDef field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3806,11 +3871,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from ClassDef"); return 1; } - if (PyObject_HasAttrString(obj, "decorator_list")) { + if (_PyObject_HasAttrId(obj, &PyId_decorator_list)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "decorator_list"); + tmp = _PyObject_GetAttrId(obj, &PyId_decorator_list); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ClassDef field \"decorator_list\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3843,9 +3908,9 @@ if (isinstance) { expr_ty value; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -3865,11 +3930,11 @@ if (isinstance) { asdl_seq* targets; - if (PyObject_HasAttrString(obj, "targets")) { + if (_PyObject_HasAttrId(obj, &PyId_targets)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "targets"); + tmp = _PyObject_GetAttrId(obj, &PyId_targets); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Delete field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3902,11 +3967,11 @@ asdl_seq* targets; expr_ty value; - if (PyObject_HasAttrString(obj, "targets")) { + if (_PyObject_HasAttrId(obj, &PyId_targets)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "targets"); + tmp = _PyObject_GetAttrId(obj, &PyId_targets); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Assign field \"targets\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -3927,9 +3992,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"targets\" missing from Assign"); return 1; } - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -3952,9 +4017,9 @@ operator_ty op; expr_ty value; - if (PyObject_HasAttrString(obj, "target")) { + if (_PyObject_HasAttrId(obj, &PyId_target)) { int res; - tmp = PyObject_GetAttrString(obj, "target"); + tmp = _PyObject_GetAttrId(obj, &PyId_target); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &target, arena); if (res != 0) goto failed; @@ -3964,9 +4029,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from AugAssign"); return 1; } - if (PyObject_HasAttrString(obj, "op")) { + if (_PyObject_HasAttrId(obj, &PyId_op)) { int res; - tmp = PyObject_GetAttrString(obj, "op"); + tmp = _PyObject_GetAttrId(obj, &PyId_op); if (tmp == NULL) goto failed; res = obj2ast_operator(tmp, &op, arena); if (res != 0) goto failed; @@ -3976,9 +4041,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from AugAssign"); return 1; } - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -4002,9 +4067,9 @@ asdl_seq* body; asdl_seq* orelse; - if (PyObject_HasAttrString(obj, "target")) { + if (_PyObject_HasAttrId(obj, &PyId_target)) { int res; - tmp = PyObject_GetAttrString(obj, "target"); + tmp = _PyObject_GetAttrId(obj, &PyId_target); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &target, arena); if (res != 0) goto failed; @@ -4014,9 +4079,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from For"); return 1; } - if (PyObject_HasAttrString(obj, "iter")) { + if (_PyObject_HasAttrId(obj, &PyId_iter)) { int res; - tmp = PyObject_GetAttrString(obj, "iter"); + tmp = _PyObject_GetAttrId(obj, &PyId_iter); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &iter, arena); if (res != 0) goto failed; @@ -4026,11 +4091,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from For"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "For field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4051,11 +4116,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from For"); return 1; } - if (PyObject_HasAttrString(obj, "orelse")) { + if (_PyObject_HasAttrId(obj, &PyId_orelse)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "orelse"); + tmp = _PyObject_GetAttrId(obj, &PyId_orelse); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "For field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4090,9 +4155,9 @@ asdl_seq* body; asdl_seq* orelse; - if (PyObject_HasAttrString(obj, "test")) { + if (_PyObject_HasAttrId(obj, &PyId_test)) { int res; - tmp = PyObject_GetAttrString(obj, "test"); + tmp = _PyObject_GetAttrId(obj, &PyId_test); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &test, arena); if (res != 0) goto failed; @@ -4102,11 +4167,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from While"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "While field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4127,11 +4192,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from While"); return 1; } - if (PyObject_HasAttrString(obj, "orelse")) { + if (_PyObject_HasAttrId(obj, &PyId_orelse)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "orelse"); + tmp = _PyObject_GetAttrId(obj, &PyId_orelse); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "While field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4165,9 +4230,9 @@ asdl_seq* body; asdl_seq* orelse; - if (PyObject_HasAttrString(obj, "test")) { + if (_PyObject_HasAttrId(obj, &PyId_test)) { int res; - tmp = PyObject_GetAttrString(obj, "test"); + tmp = _PyObject_GetAttrId(obj, &PyId_test); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &test, arena); if (res != 0) goto failed; @@ -4177,11 +4242,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from If"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "If field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4202,11 +4267,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from If"); return 1; } - if (PyObject_HasAttrString(obj, "orelse")) { + if (_PyObject_HasAttrId(obj, &PyId_orelse)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "orelse"); + tmp = _PyObject_GetAttrId(obj, &PyId_orelse); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "If field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4239,11 +4304,11 @@ asdl_seq* items; asdl_seq* body; - if (PyObject_HasAttrString(obj, "items")) { + if (_PyObject_HasAttrId(obj, &PyId_items)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "items"); + tmp = _PyObject_GetAttrId(obj, &PyId_items); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "With field \"items\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4264,11 +4329,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"items\" missing from With"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "With field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4301,9 +4366,9 @@ expr_ty exc; expr_ty cause; - if (PyObject_HasAttrString(obj, "exc")) { + if (_PyObject_HasAttrId(obj, &PyId_exc)) { int res; - tmp = PyObject_GetAttrString(obj, "exc"); + tmp = _PyObject_GetAttrId(obj, &PyId_exc); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &exc, arena); if (res != 0) goto failed; @@ -4312,9 +4377,9 @@ } else { exc = NULL; } - if (PyObject_HasAttrString(obj, "cause")) { + if (_PyObject_HasAttrId(obj, &PyId_cause)) { int res; - tmp = PyObject_GetAttrString(obj, "cause"); + tmp = _PyObject_GetAttrId(obj, &PyId_cause); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &cause, arena); if (res != 0) goto failed; @@ -4337,11 +4402,11 @@ asdl_seq* orelse; asdl_seq* finalbody; - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Try field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4362,11 +4427,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from Try"); return 1; } - if (PyObject_HasAttrString(obj, "handlers")) { + if (_PyObject_HasAttrId(obj, &PyId_handlers)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "handlers"); + tmp = _PyObject_GetAttrId(obj, &PyId_handlers); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Try field \"handlers\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4387,11 +4452,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"handlers\" missing from Try"); return 1; } - if (PyObject_HasAttrString(obj, "orelse")) { + if (_PyObject_HasAttrId(obj, &PyId_orelse)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "orelse"); + tmp = _PyObject_GetAttrId(obj, &PyId_orelse); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Try field \"orelse\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4412,11 +4477,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"orelse\" missing from Try"); return 1; } - if (PyObject_HasAttrString(obj, "finalbody")) { + if (_PyObject_HasAttrId(obj, &PyId_finalbody)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "finalbody"); + tmp = _PyObject_GetAttrId(obj, &PyId_finalbody); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Try field \"finalbody\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4450,9 +4515,9 @@ expr_ty test; expr_ty msg; - if (PyObject_HasAttrString(obj, "test")) { + if (_PyObject_HasAttrId(obj, &PyId_test)) { int res; - tmp = PyObject_GetAttrString(obj, "test"); + tmp = _PyObject_GetAttrId(obj, &PyId_test); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &test, arena); if (res != 0) goto failed; @@ -4462,9 +4527,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from Assert"); return 1; } - if (PyObject_HasAttrString(obj, "msg")) { + if (_PyObject_HasAttrId(obj, &PyId_msg)) { int res; - tmp = PyObject_GetAttrString(obj, "msg"); + tmp = _PyObject_GetAttrId(obj, &PyId_msg); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &msg, arena); if (res != 0) goto failed; @@ -4484,11 +4549,11 @@ if (isinstance) { asdl_seq* names; - if (PyObject_HasAttrString(obj, "names")) { + if (_PyObject_HasAttrId(obj, &PyId_names)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "names"); + tmp = _PyObject_GetAttrId(obj, &PyId_names); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Import field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4522,9 +4587,9 @@ asdl_seq* names; int level; - if (PyObject_HasAttrString(obj, "module")) { + if (_PyObject_HasAttrId(obj, &PyId_module)) { int res; - tmp = PyObject_GetAttrString(obj, "module"); + tmp = _PyObject_GetAttrId(obj, &PyId_module); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &module, arena); if (res != 0) goto failed; @@ -4533,11 +4598,11 @@ } else { module = NULL; } - if (PyObject_HasAttrString(obj, "names")) { + if (_PyObject_HasAttrId(obj, &PyId_names)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "names"); + tmp = _PyObject_GetAttrId(obj, &PyId_names); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ImportFrom field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4558,9 +4623,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"names\" missing from ImportFrom"); return 1; } - if (PyObject_HasAttrString(obj, "level")) { + if (_PyObject_HasAttrId(obj, &PyId_level)) { int res; - tmp = PyObject_GetAttrString(obj, "level"); + tmp = _PyObject_GetAttrId(obj, &PyId_level); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &level, arena); if (res != 0) goto failed; @@ -4581,11 +4646,11 @@ if (isinstance) { asdl_seq* names; - if (PyObject_HasAttrString(obj, "names")) { + if (_PyObject_HasAttrId(obj, &PyId_names)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "names"); + tmp = _PyObject_GetAttrId(obj, &PyId_names); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Global field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4617,11 +4682,11 @@ if (isinstance) { asdl_seq* names; - if (PyObject_HasAttrString(obj, "names")) { + if (_PyObject_HasAttrId(obj, &PyId_names)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "names"); + tmp = _PyObject_GetAttrId(obj, &PyId_names); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Nonlocal field \"names\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4653,9 +4718,9 @@ if (isinstance) { expr_ty value; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -4719,9 +4784,9 @@ *out = NULL; return 0; } - if (PyObject_HasAttrString(obj, "lineno")) { + if (_PyObject_HasAttrId(obj, &PyId_lineno)) { int res; - tmp = PyObject_GetAttrString(obj, "lineno"); + tmp = _PyObject_GetAttrId(obj, &PyId_lineno); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &lineno, arena); if (res != 0) goto failed; @@ -4731,9 +4796,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from expr"); return 1; } - if (PyObject_HasAttrString(obj, "col_offset")) { + if (_PyObject_HasAttrId(obj, &PyId_col_offset)) { int res; - tmp = PyObject_GetAttrString(obj, "col_offset"); + tmp = _PyObject_GetAttrId(obj, &PyId_col_offset); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &col_offset, arena); if (res != 0) goto failed; @@ -4751,9 +4816,9 @@ boolop_ty op; asdl_seq* values; - if (PyObject_HasAttrString(obj, "op")) { + if (_PyObject_HasAttrId(obj, &PyId_op)) { int res; - tmp = PyObject_GetAttrString(obj, "op"); + tmp = _PyObject_GetAttrId(obj, &PyId_op); if (tmp == NULL) goto failed; res = obj2ast_boolop(tmp, &op, arena); if (res != 0) goto failed; @@ -4763,11 +4828,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BoolOp"); return 1; } - if (PyObject_HasAttrString(obj, "values")) { + if (_PyObject_HasAttrId(obj, &PyId_values)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "values"); + tmp = _PyObject_GetAttrId(obj, &PyId_values); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "BoolOp field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4801,9 +4866,9 @@ operator_ty op; expr_ty right; - if (PyObject_HasAttrString(obj, "left")) { + if (_PyObject_HasAttrId(obj, &PyId_left)) { int res; - tmp = PyObject_GetAttrString(obj, "left"); + tmp = _PyObject_GetAttrId(obj, &PyId_left); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &left, arena); if (res != 0) goto failed; @@ -4813,9 +4878,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from BinOp"); return 1; } - if (PyObject_HasAttrString(obj, "op")) { + if (_PyObject_HasAttrId(obj, &PyId_op)) { int res; - tmp = PyObject_GetAttrString(obj, "op"); + tmp = _PyObject_GetAttrId(obj, &PyId_op); if (tmp == NULL) goto failed; res = obj2ast_operator(tmp, &op, arena); if (res != 0) goto failed; @@ -4825,9 +4890,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from BinOp"); return 1; } - if (PyObject_HasAttrString(obj, "right")) { + if (_PyObject_HasAttrId(obj, &PyId_right)) { int res; - tmp = PyObject_GetAttrString(obj, "right"); + tmp = _PyObject_GetAttrId(obj, &PyId_right); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &right, arena); if (res != 0) goto failed; @@ -4849,9 +4914,9 @@ unaryop_ty op; expr_ty operand; - if (PyObject_HasAttrString(obj, "op")) { + if (_PyObject_HasAttrId(obj, &PyId_op)) { int res; - tmp = PyObject_GetAttrString(obj, "op"); + tmp = _PyObject_GetAttrId(obj, &PyId_op); if (tmp == NULL) goto failed; res = obj2ast_unaryop(tmp, &op, arena); if (res != 0) goto failed; @@ -4861,9 +4926,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"op\" missing from UnaryOp"); return 1; } - if (PyObject_HasAttrString(obj, "operand")) { + if (_PyObject_HasAttrId(obj, &PyId_operand)) { int res; - tmp = PyObject_GetAttrString(obj, "operand"); + tmp = _PyObject_GetAttrId(obj, &PyId_operand); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &operand, arena); if (res != 0) goto failed; @@ -4885,9 +4950,9 @@ arguments_ty args; expr_ty body; - if (PyObject_HasAttrString(obj, "args")) { + if (_PyObject_HasAttrId(obj, &PyId_args)) { int res; - tmp = PyObject_GetAttrString(obj, "args"); + tmp = _PyObject_GetAttrId(obj, &PyId_args); if (tmp == NULL) goto failed; res = obj2ast_arguments(tmp, &args, arena); if (res != 0) goto failed; @@ -4897,9 +4962,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Lambda"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &body, arena); if (res != 0) goto failed; @@ -4922,9 +4987,9 @@ expr_ty body; expr_ty orelse; - if (PyObject_HasAttrString(obj, "test")) { + if (_PyObject_HasAttrId(obj, &PyId_test)) { int res; - tmp = PyObject_GetAttrString(obj, "test"); + tmp = _PyObject_GetAttrId(obj, &PyId_test); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &test, arena); if (res != 0) goto failed; @@ -4934,9 +4999,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"test\" missing from IfExp"); return 1; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &body, arena); if (res != 0) goto failed; @@ -4946,9 +5011,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"body\" missing from IfExp"); return 1; } - if (PyObject_HasAttrString(obj, "orelse")) { + if (_PyObject_HasAttrId(obj, &PyId_orelse)) { int res; - tmp = PyObject_GetAttrString(obj, "orelse"); + tmp = _PyObject_GetAttrId(obj, &PyId_orelse); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &orelse, arena); if (res != 0) goto failed; @@ -4970,11 +5035,11 @@ asdl_seq* keys; asdl_seq* values; - if (PyObject_HasAttrString(obj, "keys")) { + if (_PyObject_HasAttrId(obj, &PyId_keys)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "keys"); + tmp = _PyObject_GetAttrId(obj, &PyId_keys); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Dict field \"keys\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -4995,11 +5060,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"keys\" missing from Dict"); return 1; } - if (PyObject_HasAttrString(obj, "values")) { + if (_PyObject_HasAttrId(obj, &PyId_values)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "values"); + tmp = _PyObject_GetAttrId(obj, &PyId_values); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Dict field \"values\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5031,11 +5096,11 @@ if (isinstance) { asdl_seq* elts; - if (PyObject_HasAttrString(obj, "elts")) { + if (_PyObject_HasAttrId(obj, &PyId_elts)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "elts"); + tmp = _PyObject_GetAttrId(obj, &PyId_elts); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Set field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5068,9 +5133,9 @@ expr_ty elt; asdl_seq* generators; - if (PyObject_HasAttrString(obj, "elt")) { + if (_PyObject_HasAttrId(obj, &PyId_elt)) { int res; - tmp = PyObject_GetAttrString(obj, "elt"); + tmp = _PyObject_GetAttrId(obj, &PyId_elt); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &elt, arena); if (res != 0) goto failed; @@ -5080,11 +5145,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from ListComp"); return 1; } - if (PyObject_HasAttrString(obj, "generators")) { + if (_PyObject_HasAttrId(obj, &PyId_generators)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "generators"); + tmp = _PyObject_GetAttrId(obj, &PyId_generators); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ListComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5117,9 +5182,9 @@ expr_ty elt; asdl_seq* generators; - if (PyObject_HasAttrString(obj, "elt")) { + if (_PyObject_HasAttrId(obj, &PyId_elt)) { int res; - tmp = PyObject_GetAttrString(obj, "elt"); + tmp = _PyObject_GetAttrId(obj, &PyId_elt); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &elt, arena); if (res != 0) goto failed; @@ -5129,11 +5194,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from SetComp"); return 1; } - if (PyObject_HasAttrString(obj, "generators")) { + if (_PyObject_HasAttrId(obj, &PyId_generators)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "generators"); + tmp = _PyObject_GetAttrId(obj, &PyId_generators); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "SetComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5167,9 +5232,9 @@ expr_ty value; asdl_seq* generators; - if (PyObject_HasAttrString(obj, "key")) { + if (_PyObject_HasAttrId(obj, &PyId_key)) { int res; - tmp = PyObject_GetAttrString(obj, "key"); + tmp = _PyObject_GetAttrId(obj, &PyId_key); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &key, arena); if (res != 0) goto failed; @@ -5179,9 +5244,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"key\" missing from DictComp"); return 1; } - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -5191,11 +5256,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from DictComp"); return 1; } - if (PyObject_HasAttrString(obj, "generators")) { + if (_PyObject_HasAttrId(obj, &PyId_generators)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "generators"); + tmp = _PyObject_GetAttrId(obj, &PyId_generators); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "DictComp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5229,9 +5294,9 @@ expr_ty elt; asdl_seq* generators; - if (PyObject_HasAttrString(obj, "elt")) { + if (_PyObject_HasAttrId(obj, &PyId_elt)) { int res; - tmp = PyObject_GetAttrString(obj, "elt"); + tmp = _PyObject_GetAttrId(obj, &PyId_elt); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &elt, arena); if (res != 0) goto failed; @@ -5241,11 +5306,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"elt\" missing from GeneratorExp"); return 1; } - if (PyObject_HasAttrString(obj, "generators")) { + if (_PyObject_HasAttrId(obj, &PyId_generators)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "generators"); + tmp = _PyObject_GetAttrId(obj, &PyId_generators); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "GeneratorExp field \"generators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5277,9 +5342,9 @@ if (isinstance) { expr_ty value; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -5301,9 +5366,9 @@ asdl_int_seq* ops; asdl_seq* comparators; - if (PyObject_HasAttrString(obj, "left")) { + if (_PyObject_HasAttrId(obj, &PyId_left)) { int res; - tmp = PyObject_GetAttrString(obj, "left"); + tmp = _PyObject_GetAttrId(obj, &PyId_left); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &left, arena); if (res != 0) goto failed; @@ -5313,11 +5378,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"left\" missing from Compare"); return 1; } - if (PyObject_HasAttrString(obj, "ops")) { + if (_PyObject_HasAttrId(obj, &PyId_ops)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "ops"); + tmp = _PyObject_GetAttrId(obj, &PyId_ops); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Compare field \"ops\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5338,11 +5403,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"ops\" missing from Compare"); return 1; } - if (PyObject_HasAttrString(obj, "comparators")) { + if (_PyObject_HasAttrId(obj, &PyId_comparators)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "comparators"); + tmp = _PyObject_GetAttrId(obj, &PyId_comparators); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Compare field \"comparators\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5379,9 +5444,9 @@ expr_ty starargs; expr_ty kwargs; - if (PyObject_HasAttrString(obj, "func")) { + if (_PyObject_HasAttrId(obj, &PyId_func)) { int res; - tmp = PyObject_GetAttrString(obj, "func"); + tmp = _PyObject_GetAttrId(obj, &PyId_func); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &func, arena); if (res != 0) goto failed; @@ -5391,11 +5456,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"func\" missing from Call"); return 1; } - if (PyObject_HasAttrString(obj, "args")) { + if (_PyObject_HasAttrId(obj, &PyId_args)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "args"); + tmp = _PyObject_GetAttrId(obj, &PyId_args); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Call field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5416,11 +5481,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from Call"); return 1; } - if (PyObject_HasAttrString(obj, "keywords")) { + if (_PyObject_HasAttrId(obj, &PyId_keywords)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "keywords"); + tmp = _PyObject_GetAttrId(obj, &PyId_keywords); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Call field \"keywords\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5441,9 +5506,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"keywords\" missing from Call"); return 1; } - if (PyObject_HasAttrString(obj, "starargs")) { + if (_PyObject_HasAttrId(obj, &PyId_starargs)) { int res; - tmp = PyObject_GetAttrString(obj, "starargs"); + tmp = _PyObject_GetAttrId(obj, &PyId_starargs); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &starargs, arena); if (res != 0) goto failed; @@ -5452,9 +5517,9 @@ } else { starargs = NULL; } - if (PyObject_HasAttrString(obj, "kwargs")) { + if (_PyObject_HasAttrId(obj, &PyId_kwargs)) { int res; - tmp = PyObject_GetAttrString(obj, "kwargs"); + tmp = _PyObject_GetAttrId(obj, &PyId_kwargs); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &kwargs, arena); if (res != 0) goto failed; @@ -5475,9 +5540,9 @@ if (isinstance) { object n; - if (PyObject_HasAttrString(obj, "n")) { + if (_PyObject_HasAttrId(obj, &PyId_n)) { int res; - tmp = PyObject_GetAttrString(obj, "n"); + tmp = _PyObject_GetAttrId(obj, &PyId_n); if (tmp == NULL) goto failed; res = obj2ast_object(tmp, &n, arena); if (res != 0) goto failed; @@ -5498,9 +5563,9 @@ if (isinstance) { string s; - if (PyObject_HasAttrString(obj, "s")) { + if (_PyObject_HasAttrId(obj, &PyId_s)) { int res; - tmp = PyObject_GetAttrString(obj, "s"); + tmp = _PyObject_GetAttrId(obj, &PyId_s); if (tmp == NULL) goto failed; res = obj2ast_string(tmp, &s, arena); if (res != 0) goto failed; @@ -5521,9 +5586,9 @@ if (isinstance) { bytes s; - if (PyObject_HasAttrString(obj, "s")) { + if (_PyObject_HasAttrId(obj, &PyId_s)) { int res; - tmp = PyObject_GetAttrString(obj, "s"); + tmp = _PyObject_GetAttrId(obj, &PyId_s); if (tmp == NULL) goto failed; res = obj2ast_bytes(tmp, &s, arena); if (res != 0) goto failed; @@ -5556,9 +5621,9 @@ identifier attr; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -5568,9 +5633,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Attribute"); return 1; } - if (PyObject_HasAttrString(obj, "attr")) { + if (_PyObject_HasAttrId(obj, &PyId_attr)) { int res; - tmp = PyObject_GetAttrString(obj, "attr"); + tmp = _PyObject_GetAttrId(obj, &PyId_attr); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &attr, arena); if (res != 0) goto failed; @@ -5580,9 +5645,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"attr\" missing from Attribute"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5605,9 +5670,9 @@ slice_ty slice; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -5617,9 +5682,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Subscript"); return 1; } - if (PyObject_HasAttrString(obj, "slice")) { + if (_PyObject_HasAttrId(obj, &PyId_slice)) { int res; - tmp = PyObject_GetAttrString(obj, "slice"); + tmp = _PyObject_GetAttrId(obj, &PyId_slice); if (tmp == NULL) goto failed; res = obj2ast_slice(tmp, &slice, arena); if (res != 0) goto failed; @@ -5629,9 +5694,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"slice\" missing from Subscript"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5653,9 +5718,9 @@ expr_ty value; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -5665,9 +5730,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from Starred"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5689,9 +5754,9 @@ identifier id; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "id")) { + if (_PyObject_HasAttrId(obj, &PyId_id)) { int res; - tmp = PyObject_GetAttrString(obj, "id"); + tmp = _PyObject_GetAttrId(obj, &PyId_id); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &id, arena); if (res != 0) goto failed; @@ -5701,9 +5766,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"id\" missing from Name"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5725,11 +5790,11 @@ asdl_seq* elts; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "elts")) { + if (_PyObject_HasAttrId(obj, &PyId_elts)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "elts"); + tmp = _PyObject_GetAttrId(obj, &PyId_elts); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "List field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5750,9 +5815,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from List"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5774,11 +5839,11 @@ asdl_seq* elts; expr_context_ty ctx; - if (PyObject_HasAttrString(obj, "elts")) { + if (_PyObject_HasAttrId(obj, &PyId_elts)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "elts"); + tmp = _PyObject_GetAttrId(obj, &PyId_elts); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "Tuple field \"elts\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5799,9 +5864,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"elts\" missing from Tuple"); return 1; } - if (PyObject_HasAttrString(obj, "ctx")) { + if (_PyObject_HasAttrId(obj, &PyId_ctx)) { int res; - tmp = PyObject_GetAttrString(obj, "ctx"); + tmp = _PyObject_GetAttrId(obj, &PyId_ctx); if (tmp == NULL) goto failed; res = obj2ast_expr_context(tmp, &ctx, arena); if (res != 0) goto failed; @@ -5900,9 +5965,9 @@ expr_ty upper; expr_ty step; - if (PyObject_HasAttrString(obj, "lower")) { + if (_PyObject_HasAttrId(obj, &PyId_lower)) { int res; - tmp = PyObject_GetAttrString(obj, "lower"); + tmp = _PyObject_GetAttrId(obj, &PyId_lower); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &lower, arena); if (res != 0) goto failed; @@ -5911,9 +5976,9 @@ } else { lower = NULL; } - if (PyObject_HasAttrString(obj, "upper")) { + if (_PyObject_HasAttrId(obj, &PyId_upper)) { int res; - tmp = PyObject_GetAttrString(obj, "upper"); + tmp = _PyObject_GetAttrId(obj, &PyId_upper); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &upper, arena); if (res != 0) goto failed; @@ -5922,9 +5987,9 @@ } else { upper = NULL; } - if (PyObject_HasAttrString(obj, "step")) { + if (_PyObject_HasAttrId(obj, &PyId_step)) { int res; - tmp = PyObject_GetAttrString(obj, "step"); + tmp = _PyObject_GetAttrId(obj, &PyId_step); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &step, arena); if (res != 0) goto failed; @@ -5944,11 +6009,11 @@ if (isinstance) { asdl_seq* dims; - if (PyObject_HasAttrString(obj, "dims")) { + if (_PyObject_HasAttrId(obj, &PyId_dims)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "dims"); + tmp = _PyObject_GetAttrId(obj, &PyId_dims); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ExtSlice field \"dims\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -5980,9 +6045,9 @@ if (isinstance) { expr_ty value; - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -6275,9 +6340,9 @@ expr_ty iter; asdl_seq* ifs; - if (PyObject_HasAttrString(obj, "target")) { + if (_PyObject_HasAttrId(obj, &PyId_target)) { int res; - tmp = PyObject_GetAttrString(obj, "target"); + tmp = _PyObject_GetAttrId(obj, &PyId_target); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &target, arena); if (res != 0) goto failed; @@ -6287,9 +6352,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"target\" missing from comprehension"); return 1; } - if (PyObject_HasAttrString(obj, "iter")) { + if (_PyObject_HasAttrId(obj, &PyId_iter)) { int res; - tmp = PyObject_GetAttrString(obj, "iter"); + tmp = _PyObject_GetAttrId(obj, &PyId_iter); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &iter, arena); if (res != 0) goto failed; @@ -6299,11 +6364,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"iter\" missing from comprehension"); return 1; } - if (PyObject_HasAttrString(obj, "ifs")) { + if (_PyObject_HasAttrId(obj, &PyId_ifs)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "ifs"); + tmp = _PyObject_GetAttrId(obj, &PyId_ifs); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "comprehension field \"ifs\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6344,9 +6409,9 @@ *out = NULL; return 0; } - if (PyObject_HasAttrString(obj, "lineno")) { + if (_PyObject_HasAttrId(obj, &PyId_lineno)) { int res; - tmp = PyObject_GetAttrString(obj, "lineno"); + tmp = _PyObject_GetAttrId(obj, &PyId_lineno); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &lineno, arena); if (res != 0) goto failed; @@ -6356,9 +6421,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from excepthandler"); return 1; } - if (PyObject_HasAttrString(obj, "col_offset")) { + if (_PyObject_HasAttrId(obj, &PyId_col_offset)) { int res; - tmp = PyObject_GetAttrString(obj, "col_offset"); + tmp = _PyObject_GetAttrId(obj, &PyId_col_offset); if (tmp == NULL) goto failed; res = obj2ast_int(tmp, &col_offset, arena); if (res != 0) goto failed; @@ -6377,9 +6442,9 @@ identifier name; asdl_seq* body; - if (PyObject_HasAttrString(obj, "type")) { + if (_PyObject_HasAttrId(obj, &PyId_type)) { int res; - tmp = PyObject_GetAttrString(obj, "type"); + tmp = _PyObject_GetAttrId(obj, &PyId_type); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &type, arena); if (res != 0) goto failed; @@ -6388,9 +6453,9 @@ } else { type = NULL; } - if (PyObject_HasAttrString(obj, "name")) { + if (_PyObject_HasAttrId(obj, &PyId_name)) { int res; - tmp = PyObject_GetAttrString(obj, "name"); + tmp = _PyObject_GetAttrId(obj, &PyId_name); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &name, arena); if (res != 0) goto failed; @@ -6399,11 +6464,11 @@ } else { name = NULL; } - if (PyObject_HasAttrString(obj, "body")) { + if (_PyObject_HasAttrId(obj, &PyId_body)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "body"); + tmp = _PyObject_GetAttrId(obj, &PyId_body); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "ExceptHandler field \"body\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6449,11 +6514,11 @@ asdl_seq* defaults; asdl_seq* kw_defaults; - if (PyObject_HasAttrString(obj, "args")) { + if (_PyObject_HasAttrId(obj, &PyId_args)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "args"); + tmp = _PyObject_GetAttrId(obj, &PyId_args); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "arguments field \"args\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6474,9 +6539,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"args\" missing from arguments"); return 1; } - if (PyObject_HasAttrString(obj, "vararg")) { + if (_PyObject_HasAttrId(obj, &PyId_vararg)) { int res; - tmp = PyObject_GetAttrString(obj, "vararg"); + tmp = _PyObject_GetAttrId(obj, &PyId_vararg); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &vararg, arena); if (res != 0) goto failed; @@ -6485,9 +6550,9 @@ } else { vararg = NULL; } - if (PyObject_HasAttrString(obj, "varargannotation")) { + if (_PyObject_HasAttrId(obj, &PyId_varargannotation)) { int res; - tmp = PyObject_GetAttrString(obj, "varargannotation"); + tmp = _PyObject_GetAttrId(obj, &PyId_varargannotation); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &varargannotation, arena); if (res != 0) goto failed; @@ -6496,11 +6561,11 @@ } else { varargannotation = NULL; } - if (PyObject_HasAttrString(obj, "kwonlyargs")) { + if (_PyObject_HasAttrId(obj, &PyId_kwonlyargs)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "kwonlyargs"); + tmp = _PyObject_GetAttrId(obj, &PyId_kwonlyargs); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "arguments field \"kwonlyargs\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6521,9 +6586,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"kwonlyargs\" missing from arguments"); return 1; } - if (PyObject_HasAttrString(obj, "kwarg")) { + if (_PyObject_HasAttrId(obj, &PyId_kwarg)) { int res; - tmp = PyObject_GetAttrString(obj, "kwarg"); + tmp = _PyObject_GetAttrId(obj, &PyId_kwarg); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &kwarg, arena); if (res != 0) goto failed; @@ -6532,9 +6597,9 @@ } else { kwarg = NULL; } - if (PyObject_HasAttrString(obj, "kwargannotation")) { + if (_PyObject_HasAttrId(obj, &PyId_kwargannotation)) { int res; - tmp = PyObject_GetAttrString(obj, "kwargannotation"); + tmp = _PyObject_GetAttrId(obj, &PyId_kwargannotation); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &kwargannotation, arena); if (res != 0) goto failed; @@ -6543,11 +6608,11 @@ } else { kwargannotation = NULL; } - if (PyObject_HasAttrString(obj, "defaults")) { + if (_PyObject_HasAttrId(obj, &PyId_defaults)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "defaults"); + tmp = _PyObject_GetAttrId(obj, &PyId_defaults); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "arguments field \"defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6568,11 +6633,11 @@ PyErr_SetString(PyExc_TypeError, "required field \"defaults\" missing from arguments"); return 1; } - if (PyObject_HasAttrString(obj, "kw_defaults")) { + if (_PyObject_HasAttrId(obj, &PyId_kw_defaults)) { int res; Py_ssize_t len; Py_ssize_t i; - tmp = PyObject_GetAttrString(obj, "kw_defaults"); + tmp = _PyObject_GetAttrId(obj, &PyId_kw_defaults); if (tmp == NULL) goto failed; if (!PyList_Check(tmp)) { PyErr_Format(PyExc_TypeError, "arguments field \"kw_defaults\" must be a list, not a %.200s", tmp->ob_type->tp_name); @@ -6608,9 +6673,9 @@ identifier arg; expr_ty annotation; - if (PyObject_HasAttrString(obj, "arg")) { + if (_PyObject_HasAttrId(obj, &PyId_arg)) { int res; - tmp = PyObject_GetAttrString(obj, "arg"); + tmp = _PyObject_GetAttrId(obj, &PyId_arg); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &arg, arena); if (res != 0) goto failed; @@ -6620,9 +6685,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from arg"); return 1; } - if (PyObject_HasAttrString(obj, "annotation")) { + if (_PyObject_HasAttrId(obj, &PyId_annotation)) { int res; - tmp = PyObject_GetAttrString(obj, "annotation"); + tmp = _PyObject_GetAttrId(obj, &PyId_annotation); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &annotation, arena); if (res != 0) goto failed; @@ -6645,9 +6710,9 @@ identifier arg; expr_ty value; - if (PyObject_HasAttrString(obj, "arg")) { + if (_PyObject_HasAttrId(obj, &PyId_arg)) { int res; - tmp = PyObject_GetAttrString(obj, "arg"); + tmp = _PyObject_GetAttrId(obj, &PyId_arg); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &arg, arena); if (res != 0) goto failed; @@ -6657,9 +6722,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"arg\" missing from keyword"); return 1; } - if (PyObject_HasAttrString(obj, "value")) { + if (_PyObject_HasAttrId(obj, &PyId_value)) { int res; - tmp = PyObject_GetAttrString(obj, "value"); + tmp = _PyObject_GetAttrId(obj, &PyId_value); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &value, arena); if (res != 0) goto failed; @@ -6683,9 +6748,9 @@ identifier name; identifier asname; - if (PyObject_HasAttrString(obj, "name")) { + if (_PyObject_HasAttrId(obj, &PyId_name)) { int res; - tmp = PyObject_GetAttrString(obj, "name"); + tmp = _PyObject_GetAttrId(obj, &PyId_name); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &name, arena); if (res != 0) goto failed; @@ -6695,9 +6760,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"name\" missing from alias"); return 1; } - if (PyObject_HasAttrString(obj, "asname")) { + if (_PyObject_HasAttrId(obj, &PyId_asname)) { int res; - tmp = PyObject_GetAttrString(obj, "asname"); + tmp = _PyObject_GetAttrId(obj, &PyId_asname); if (tmp == NULL) goto failed; res = obj2ast_identifier(tmp, &asname, arena); if (res != 0) goto failed; @@ -6720,9 +6785,9 @@ expr_ty context_expr; expr_ty optional_vars; - if (PyObject_HasAttrString(obj, "context_expr")) { + if (_PyObject_HasAttrId(obj, &PyId_context_expr)) { int res; - tmp = PyObject_GetAttrString(obj, "context_expr"); + tmp = _PyObject_GetAttrId(obj, &PyId_context_expr); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &context_expr, arena); if (res != 0) goto failed; @@ -6732,9 +6797,9 @@ PyErr_SetString(PyExc_TypeError, "required field \"context_expr\" missing from withitem"); return 1; } - if (PyObject_HasAttrString(obj, "optional_vars")) { + if (_PyObject_HasAttrId(obj, &PyId_optional_vars)) { int res; - tmp = PyObject_GetAttrString(obj, "optional_vars"); + tmp = _PyObject_GetAttrId(obj, &PyId_optional_vars); if (tmp == NULL) goto failed; res = obj2ast_expr(tmp, &optional_vars, arena); if (res != 0) goto failed; diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -247,10 +247,11 @@ PyObject *f_stderr; PyObject *name; char lineno_str[128]; + _Py_identifier(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); - name = PyObject_GetAttrString(category, "__name__"); + name = _PyObject_GetAttrId(category, &PyId___name__); if (name == NULL) /* XXX Can an object lack a '__name__' attribute? */ return; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -41,6 +41,7 @@ PyObject *func, *name, *bases, *mkw, *meta, *prep, *ns, *cell; PyObject *cls = NULL; Py_ssize_t nargs; + _Py_identifier(__prepare__); assert(args != NULL); if (!PyTuple_Check(args)) { @@ -95,7 +96,7 @@ } Py_INCREF(meta); } - prep = PyObject_GetAttrString(meta, "__prepare__"); + prep = _PyObject_GetAttrId(meta, &PyId___prepare__); if (prep == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); @@ -1613,8 +1614,9 @@ char *stdin_encoding_str; PyObject *result; size_t len; + _Py_identifier(encoding); - stdin_encoding = PyObject_GetAttrString(fin, "encoding"); + stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); if (!stdin_encoding) /* stdin is a text stream, so it must have an encoding. */ @@ -1633,7 +1635,7 @@ PyObject *stringpo; PyObject *stdout_encoding; char *stdout_encoding_str; - stdout_encoding = PyObject_GetAttrString(fout, "encoding"); + stdout_encoding = _PyObject_GetAttrId(fout, &PyId_encoding); if (stdout_encoding == NULL) { Py_DECREF(stdin_encoding); return NULL; @@ -1788,6 +1790,7 @@ PyObject *callable; static char *kwlist[] = {"iterable", "key", "reverse", 0}; int reverse; + _Py_identifier(sort); /* args 1-3 should match listsort in Objects/listobject.c */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", @@ -1798,7 +1801,7 @@ if (newlist == NULL) return NULL; - callable = PyObject_GetAttrString(newlist, "sort"); + callable = _PyObject_GetAttrId(newlist, &PyId_sort); if (callable == NULL) { Py_DECREF(newlist); return NULL; @@ -1844,7 +1847,8 @@ Py_INCREF(d); } else { - d = PyObject_GetAttrString(v, "__dict__"); + _Py_identifier(__dict__); + d = _PyObject_GetAttrId(v, &PyId___dict__); if (d == NULL) { PyErr_SetString(PyExc_TypeError, "vars() argument must have __dict__ attribute"); diff --git a/Python/codecs.c b/Python/codecs.c --- a/Python/codecs.c +++ b/Python/codecs.c @@ -465,9 +465,11 @@ static void wrong_exception_type(PyObject *exc) { - PyObject *type = PyObject_GetAttrString(exc, "__class__"); + _Py_identifier(__class__); + _Py_identifier(__name__); + PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__); if (type != NULL) { - PyObject *name = PyObject_GetAttrString(type, "__name__"); + PyObject *name = _PyObject_GetAttrId(type, &PyId___name__); Py_DECREF(type); if (name != NULL) { PyErr_Format(PyExc_TypeError, diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -707,6 +707,7 @@ void PyErr_WriteUnraisable(PyObject *obj) { + _Py_identifier(__module__); PyObject *f, *t, *v, *tb; PyErr_Fetch(&t, &v, &tb); f = PySys_GetObject("stderr"); @@ -723,7 +724,7 @@ className = dot+1; } - moduleName = PyObject_GetAttrString(t, "__module__"); + moduleName = _PyObject_GetAttrId(t, &PyId___module__); if (moduleName == NULL) PyFile_WriteString("", f); else { diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -154,7 +154,7 @@ }; static PyObject *initstr = NULL; - +_Py_identifier(__path__); /* Initialize things */ @@ -248,8 +248,9 @@ PySys_WriteStderr("# can't import zipimport\n"); } else { - PyObject *zipimporter = PyObject_GetAttrString(zimpimport, - "zipimporter"); + _Py_identifier(zipimporter); + PyObject *zipimporter = _PyObject_GetAttrId(zimpimport, + &PyId_zipimporter); Py_DECREF(zimpimport); if (zipimporter == NULL) { PyErr_Clear(); /* No zipimporter object -- okay */ @@ -3203,7 +3204,7 @@ PyObject *fullname; Py_ssize_t fromlist_len; - if (!PyObject_HasAttrString(mod, "__path__")) + if (!_PyObject_HasAttrId(mod, &PyId___path__)) return 1; fromlist_len = PySequence_Size(fromlist); @@ -3221,11 +3222,12 @@ } if (PyUnicode_READ_CHAR(item, 0) == '*') { PyObject *all; + _Py_identifier(__all__); Py_DECREF(item); /* See if the package defines __all__ */ if (recursive) continue; /* Avoid endless recursion */ - all = PyObject_GetAttrString(mod, "__all__"); + all = _PyObject_GetAttrId(mod, &PyId___all__); if (all == NULL) PyErr_Clear(); else { @@ -3313,7 +3315,7 @@ if (mod == Py_None) path_list = NULL; else { - path_list = PyObject_GetAttrString(mod, "__path__"); + path_list = _PyObject_GetAttrId(mod, &PyId___path__); if (path_list == NULL) { PyErr_Clear(); Py_INCREF(Py_None); @@ -3424,7 +3426,7 @@ goto error; } Py_DECREF(parentname); - path_list = PyObject_GetAttrString(parent, "__path__"); + path_list = _PyObject_GetAttrId(parent, &PyId___path__); if (path_list == NULL) PyErr_Clear(); subname++; diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -141,12 +141,13 @@ { char *name_utf8, *name_str; PyObject *codec, *name = NULL; + _Py_identifier(name); codec = _PyCodec_Lookup(encoding); if (!codec) goto error; - name = PyObject_GetAttrString(codec, "name"); + name = _PyObject_GetAttrId(codec, &PyId_name); Py_CLEAR(codec); if (!name) goto error; @@ -830,7 +831,8 @@ goto error; if (buffering) { - raw = PyObject_GetAttrString(buf, "raw"); + _Py_identifier(raw); + raw = _PyObject_GetAttrId(buf, &PyId_raw); if (raw == NULL) goto error; } @@ -1115,13 +1117,14 @@ PyArena *arena; char *ps1 = "", *ps2 = "", *enc = NULL; int errcode = 0; + _Py_identifier(encoding); if (fp == stdin) { /* Fetch encoding from sys.stdin */ v = PySys_GetObject("stdin"); if (v == NULL || v == Py_None) return -1; - oenc = PyObject_GetAttrString(v, "encoding"); + oenc = _PyObject_GetAttrId(v, &PyId_encoding); if (!oenc) return -1; enc = _PyUnicode_AsString(oenc); @@ -1318,6 +1321,11 @@ { long hold; PyObject *v; + _Py_identifier(msg); + _Py_identifier(filename); + _Py_identifier(lineno); + _Py_identifier(offset); + _Py_identifier(text); /* old style errors */ if (PyTuple_Check(err)) @@ -1326,11 +1334,11 @@ /* new style errors. `err' is an instance */ - if (! (v = PyObject_GetAttrString(err, "msg"))) + if (! (v = _PyObject_GetAttrId(err, &PyId_msg))) goto finally; *message = v; - if (!(v = PyObject_GetAttrString(err, "filename"))) + if (!(v = _PyObject_GetAttrId(err, &PyId_filename))) goto finally; if (v == Py_None) *filename = NULL; @@ -1338,7 +1346,7 @@ goto finally; Py_DECREF(v); - if (!(v = PyObject_GetAttrString(err, "lineno"))) + if (!(v = _PyObject_GetAttrId(err, &PyId_lineno))) goto finally; hold = PyLong_AsLong(v); Py_DECREF(v); @@ -1347,7 +1355,7 @@ goto finally; *lineno = (int)hold; - if (!(v = PyObject_GetAttrString(err, "offset"))) + if (!(v = _PyObject_GetAttrId(err, &PyId_offset))) goto finally; if (v == Py_None) { *offset = -1; @@ -1362,7 +1370,7 @@ *offset = (int)hold; } - if (!(v = PyObject_GetAttrString(err, "text"))) + if (!(v = _PyObject_GetAttrId(err, &PyId_text))) goto finally; if (v == Py_None) *text = NULL; @@ -1431,7 +1439,8 @@ goto done; if (PyExceptionInstance_Check(value)) { /* The error code should be in the `code' attribute. */ - PyObject *code = PyObject_GetAttrString(value, "code"); + _Py_identifier(code); + PyObject *code = _PyObject_GetAttrId(value, &PyId_code); if (code) { Py_DECREF(value); value = code; @@ -1588,6 +1597,7 @@ else { PyObject* moduleName; char* className; + _Py_identifier(__module__); assert(PyExceptionClass_Check(type)); className = PyExceptionClass_Name(type); if (className != NULL) { @@ -1596,7 +1606,7 @@ className = dot+1; } - moduleName = PyObject_GetAttrString(type, "__module__"); + moduleName = _PyObject_GetAttrId(type, &PyId___module__); if (moduleName == NULL || !PyUnicode_Check(moduleName)) { Py_XDECREF(moduleName); diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -79,8 +79,10 @@ PyObject *encoded, *escaped_str, *repr_str, *buffer, *result; char *stdout_encoding_str; int ret; + _Py_identifier(encoding); + _Py_identifier(buffer); - stdout_encoding = PyObject_GetAttrString(outf, "encoding"); + stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding); if (stdout_encoding == NULL) goto error; stdout_encoding_str = _PyUnicode_AsString(stdout_encoding); @@ -97,7 +99,7 @@ if (encoded == NULL) goto error; - buffer = PyObject_GetAttrString(outf, "buffer"); + buffer = _PyObject_GetAttrId(outf, &PyId_buffer); if (buffer) { _Py_identifier(write); result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded); @@ -1841,11 +1843,12 @@ { PyObject *writer = NULL, *args = NULL, *result = NULL; int err; + _Py_identifier(write); if (file == NULL) return -1; - writer = PyObject_GetAttrString(file, "write"); + writer = _PyObject_GetAttrId(file, &PyId_write); if (writer == NULL) goto error; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 10 20:19:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 10 Oct 2011 20:19:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_the_threading_infrastru?= =?utf8?q?cture_in_test=5Fsocket_to_support_skipping?= Message-ID: http://hg.python.org/cpython/rev/f7f9d5ac6d60 changeset: 72849:f7f9d5ac6d60 user: Antoine Pitrou date: Mon Oct 10 20:15:59 2011 +0200 summary: Fix the threading infrastructure in test_socket to support skipping tests from the setUp() routine. This fixes a refleak in test_socket on some machines. files: Lib/test/test_socket.py | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -106,16 +106,12 @@ def setUp(self): self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) + self.addCleanup(self.s.close) try: self.s.bind((self.interface,)) except socket.error: self.skipTest('network interface `%s` does not exist' % self.interface) - self.s.close() - - def tearDown(self): - self.s.close() - self.s = None class ThreadableTest: """Threadable Test class @@ -174,6 +170,7 @@ self.client_ready = threading.Event() self.done = threading.Event() self.queue = queue.Queue(1) + self.server_crashed = False # Do some munging to start the client test. methodname = self.id() @@ -183,8 +180,12 @@ self.client_thread = thread.start_new_thread( self.clientRun, (test_method,)) - self.__setUp() - if not self.server_ready.is_set(): + try: + self.__setUp() + except: + self.server_crashed = True + raise + finally: self.server_ready.set() self.client_ready.wait() @@ -200,6 +201,9 @@ self.server_ready.wait() self.clientSetUp() self.client_ready.set() + if self.server_crashed: + self.clientTearDown() + return if not hasattr(test_func, '__call__'): raise TypeError("test_func must be a callable function") try: @@ -258,9 +262,9 @@ try: self.cli.bind((self.interface,)) except socket.error: - self.skipTest('network interface `%s` does not exist' % - self.interface) - self.cli.close() + # skipTest should not be called here, and will be called in the + # server instead + pass def clientTearDown(self): self.cli.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 10 23:53:08 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 10 Oct 2011 23:53:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Avoid_exporting_private_hel?= =?utf8?q?pers?= Message-ID: http://hg.python.org/cpython/rev/95b50c9c7a7d changeset: 72850:95b50c9c7a7d user: Antoine Pitrou date: Mon Oct 10 23:49:24 2011 +0200 summary: Avoid exporting private helpers (thanks "make smelly") files: Objects/unicodeobject.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -641,7 +641,7 @@ */ #ifdef Py_DEBUG -int unicode_old_new_calls = 0; +static int unicode_old_new_calls = 0; #endif static PyUnicodeObject * @@ -752,7 +752,7 @@ } #ifdef Py_DEBUG -int unicode_new_new_calls = 0; +static int unicode_new_new_calls = 0; /* Functions wrapping macros for use in debugger */ char *_PyUnicode_utf8(void *unicode){ @@ -1181,7 +1181,7 @@ } #ifdef Py_DEBUG -int unicode_ready_calls = 0; +static int unicode_ready_calls = 0; #endif static int @@ -1780,7 +1780,7 @@ /* Ensure that a string uses the most efficient storage, if it is not the case: create a new string with of the right kind. Write NULL into *p_unicode on error. */ -void +static void unicode_adjust_maxchar(PyObject **p_unicode) { PyObject *unicode, *copy; @@ -3321,7 +3321,7 @@ } #ifdef Py_DEBUG -int unicode_as_unicode_calls = 0; +static int unicode_as_unicode_calls = 0; #endif @@ -5517,7 +5517,7 @@ pop out of ASCII range. Otherwise returns the length of the required buffer to hold the string. */ -Py_ssize_t +static Py_ssize_t length_of_escaped_ascii_string(const char *s, Py_ssize_t size) { const unsigned char *p = (const unsigned char *)s; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 03:21:31 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 03:21:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_/*_Remove_unused_code=2E_It?= =?utf8?q?_has_been_committed_out_since_2000_=28!=29=2E_*/?= Message-ID: http://hg.python.org/cpython/rev/de17b0cf1a20 changeset: 72851:de17b0cf1a20 user: Antoine Pitrou date: Tue Oct 11 03:17:47 2011 +0200 summary: /* Remove unused code. It has been committed out since 2000 (!). */ files: Objects/unicodeobject.c | 54 ----------------------------- 1 files changed, 0 insertions(+), 54 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10043,58 +10043,6 @@ return pad(self, left, marg - left, fillchar); } -#if 0 - -/* This code should go into some future Unicode collation support - module. The basic comparison should compare ordinals on a naive - basis (this is what Java does and thus Jython too). */ - -/* speedy UTF-16 code point order comparison */ -/* gleaned from: */ -/* http://www-4.ibm.com/software/developer/library/utf16.html?dwzone=unicode */ - -static short utf16Fixup[32] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0x2000, -0x800, -0x800, -0x800, -0x800 -}; - -static int -unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2) -{ - Py_ssize_t len1, len2; - - Py_UNICODE *s1 = str1->str; - Py_UNICODE *s2 = str2->str; - - len1 = str1->_base._base.length; - len2 = str2->_base._base.length; - - while (len1 > 0 && len2 > 0) { - Py_UNICODE c1, c2; - - c1 = *s1++; - c2 = *s2++; - - if (c1 > (1<<11) * 26) - c1 += utf16Fixup[c1>>11]; - if (c2 > (1<<11) * 26) - c2 += utf16Fixup[c2>>11]; - /* now c1 and c2 are in UTF-32-compatible order */ - - if (c1 != c2) - return (c1 < c2) ? -1 : 1; - - len1--; len2--; - } - - return (len1 < len2) ? -1 : (len1 != len2); -} - -#else - /* This function assumes that str1 and str2 are readied by the caller. */ static int @@ -10123,8 +10071,6 @@ return (len1 < len2) ? -1 : (len1 != len2); } -#endif - int PyUnicode_Compare(PyObject *left, PyObject *right) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 04:10:31 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 04:10:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_unused_variable?= Message-ID: http://hg.python.org/cpython/rev/8ed6a627a834 changeset: 72852:8ed6a627a834 user: Antoine Pitrou date: Tue Oct 11 04:06:47 2011 +0200 summary: Remove unused variable files: Modules/_json.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1126,7 +1126,6 @@ PyObject *ctx; static char *kwlist[] = {"context", NULL}; PyScannerObject *s; - _Py_identifier(strict); assert(PyScanner_Check(self)); s = (PyScannerObject *)self; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 04:33:38 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 11 Oct 2011 04:33:38 +0200 (CEST) Subject: [Python-checkins] r88907 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3SHj764rjBzPBL@mail.python.org> Author: ezio.melotti Date: Tue Oct 11 04:33:38 2011 New Revision: 88907 Log: Improve the "clear this message" link. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Tue Oct 11 04:33:38 2011 @@ -304,3 +304,12 @@ get_json('experts', data.add); get_json('devs', data.add); }); + + +$(document).ready(function() { + /* Make the "clear this message" link in the ok_message point + * to issue page without including any extra arg */ + var link = $('p.ok-message a.form-small').first(); + if (link.length != 0) + link.attr('href', link.attr('href').split('?')[0]); +}); From solipsis at pitrou.net Tue Oct 11 05:26:21 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 11 Oct 2011 05:26:21 +0200 Subject: [Python-checkins] Daily reference leaks (de17b0cf1a20): sum=0 Message-ID: results for de17b0cf1a20 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogZnGazm', '-x'] From python-checkins at python.org Tue Oct 11 15:49:41 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 15:49:41 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313150=3A_The_token?= =?utf8?q?ize_module_doesn=27t_compile_large_regular_expressions_at?= Message-ID: http://hg.python.org/cpython/rev/df950158dc33 changeset: 72853:df950158dc33 user: Antoine Pitrou date: Tue Oct 11 15:45:56 2011 +0200 summary: Issue #13150: The tokenize module doesn't compile large regular expressions at startup anymore. Instead, the re module's standard caching does its work. files: Lib/tokenize.py | 35 ++++++++++++++++------------------- Misc/NEWS | 3 +++ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Lib/tokenize.py b/Lib/tokenize.py --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -114,19 +114,17 @@ def _compile(expr): return re.compile(expr, re.UNICODE) -tokenprog, pseudoprog, single3prog, double3prog = map( - _compile, (Token, PseudoToken, Single3, Double3)) -endprogs = {"'": _compile(Single), '"': _compile(Double), - "'''": single3prog, '"""': double3prog, - "r'''": single3prog, 'r"""': double3prog, - "b'''": single3prog, 'b"""': double3prog, - "br'''": single3prog, 'br"""': double3prog, - "R'''": single3prog, 'R"""': double3prog, - "B'''": single3prog, 'B"""': double3prog, - "bR'''": single3prog, 'bR"""': double3prog, - "Br'''": single3prog, 'Br"""': double3prog, - "BR'''": single3prog, 'BR"""': double3prog, - 'r': None, 'R': None, 'b': None, 'B': None} +endpats = {"'": Single, '"': Double, + "'''": Single3, '"""': Double3, + "r'''": Single3, 'r"""': Double3, + "b'''": Single3, 'b"""': Double3, + "br'''": Single3, 'br"""': Double3, + "R'''": Single3, 'R"""': Double3, + "B'''": Single3, 'B"""': Double3, + "bR'''": Single3, 'bR"""': Double3, + "Br'''": Single3, 'Br"""': Double3, + "BR'''": Single3, 'BR"""': Double3, + 'r': None, 'R': None, 'b': None, 'B': None} triple_quoted = {} for t in ("'''", '"""', @@ -143,8 +141,6 @@ "bR'", 'bR"', "BR'", 'BR"' ): single_quoted[t] = t -del _compile - tabsize = 8 class TokenError(Exception): pass @@ -466,7 +462,7 @@ continued = 0 while pos < max: - pseudomatch = pseudoprog.match(line, pos) + pseudomatch = _compile(PseudoToken).match(line, pos) if pseudomatch: # scan for tokens start, end = pseudomatch.span(1) spos, epos, pos = (lnum, start), (lnum, end), end @@ -482,7 +478,7 @@ assert not token.endswith("\n") yield TokenInfo(COMMENT, token, spos, epos, line) elif token in triple_quoted: - endprog = endprogs[token] + endprog = _compile(endpats[token]) endmatch = endprog.match(line, pos) if endmatch: # all on one line pos = endmatch.end(0) @@ -498,8 +494,9 @@ token[:3] in single_quoted: if token[-1] == '\n': # continued string strstart = (lnum, start) - endprog = (endprogs[initial] or endprogs[token[1]] or - endprogs[token[2]]) + endprog = _compile(endpats[initial] or + endpats[token[1]] or + endpats[token[2]]) contstr, needcont = line[start:], 1 contline = line break diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -303,6 +303,9 @@ Library ------- +- Issue #13150: The tokenize module doesn't compile large regular expressions + at startup anymore. + - Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was configured with different prefix and exec-prefix. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 16:11:15 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 16:11:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_a_dict_for_faster_sysco?= =?utf8?q?nfig_startup_=28issue_=2313150=29?= Message-ID: http://hg.python.org/cpython/rev/ed0bc92fed68 changeset: 72854:ed0bc92fed68 user: Antoine Pitrou date: Tue Oct 11 16:07:30 2011 +0200 summary: Use a dict for faster sysconfig startup (issue #13150) files: Lib/sysconfig.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -24,7 +24,7 @@ # XXX _CONFIG_DIR will be set by the Makefile later _CONFIG_DIR = os.path.normpath(os.path.dirname(__file__)) _CONFIG_FILE = os.path.join(_CONFIG_DIR, 'sysconfig.cfg') -_SCHEMES = RawConfigParser() +_SCHEMES = RawConfigParser(dict_type=dict) # Faster than OrderedDict _SCHEMES.read(_CONFIG_FILE) _VAR_REPL = re.compile(r'\{([^{]*?)\}') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 19:06:48 2011 From: python-checkins at python.org (mark.dickinson) Date: Tue, 11 Oct 2011 19:06:48 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTQ1?= =?utf8?q?=2E_Fix_incorrect_documentation_for_PyNumber=5FToBase=2E__Thanks?= =?utf8?q?_Sven?= Message-ID: http://hg.python.org/cpython/rev/61eb59516b55 changeset: 72855:61eb59516b55 branch: 3.2 parent: 72845:ea233722a4b6 user: Mark Dickinson date: Tue Oct 11 18:06:36 2011 +0100 summary: Issue #13145. Fix incorrect documentation for PyNumber_ToBase. Thanks Sven Marnach. files: Doc/c-api/number.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -239,10 +239,10 @@ .. c:function:: PyObject* PyNumber_ToBase(PyObject *n, int base) - Returns the integer *n* converted to *base* as a string with a base - marker of ``'0b'``, ``'0o'``, or ``'0x'`` if applicable. When - *base* is not 2, 8, 10, or 16, the format is ``'x#num'`` where x is the - base. If *n* is not an int object, it is converted with + Returns the integer *n* converted to base *base* as a string. The *base* + argument must be one of 2, 8, 10, or 16. For base 2, 8, or 16, the + returned string is prefixed with a base marker of ``'0b'``, ``'0o'``, or + ``'0x'``, respectively. If *n* is not a Python int, it is converted with :c:func:`PyNumber_Index` first. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 19:07:28 2011 From: python-checkins at python.org (mark.dickinson) Date: Tue, 11 Oct 2011 19:07:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_issue_=2313145_fix=2E?= Message-ID: http://hg.python.org/cpython/rev/a644e2c43c4b changeset: 72856:a644e2c43c4b parent: 72854:ed0bc92fed68 parent: 72855:61eb59516b55 user: Mark Dickinson date: Tue Oct 11 18:07:19 2011 +0100 summary: Merge issue #13145 fix. files: Doc/c-api/number.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -239,10 +239,10 @@ .. c:function:: PyObject* PyNumber_ToBase(PyObject *n, int base) - Returns the integer *n* converted to *base* as a string with a base - marker of ``'0b'``, ``'0o'``, or ``'0x'`` if applicable. When - *base* is not 2, 8, 10, or 16, the format is ``'x#num'`` where x is the - base. If *n* is not an int object, it is converted with + Returns the integer *n* converted to base *base* as a string. The *base* + argument must be one of 2, 8, 10, or 16. For base 2, 8, or 16, the + returned string is prefixed with a base marker of ``'0b'``, ``'0o'``, or + ``'0x'``, respectively. If *n* is not a Python int, it is converted with :c:func:`PyNumber_Index` first. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 20:00:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 20:00:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Avoid_pulling_threading_whe?= =?utf8?q?n_=5Fthread_is_sufficient?= Message-ID: http://hg.python.org/cpython/rev/3b81c1eae514 changeset: 72857:3b81c1eae514 parent: 72854:ed0bc92fed68 user: Antoine Pitrou date: Tue Oct 11 18:51:53 2011 +0200 summary: Avoid pulling threading when _thread is sufficient files: Lib/reprlib.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/reprlib.py b/Lib/reprlib.py --- a/Lib/reprlib.py +++ b/Lib/reprlib.py @@ -5,7 +5,7 @@ import builtins from itertools import islice try: - from threading import get_ident + from _thread import get_ident except ImportError: from _dummy_thread import get_ident -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 20:00:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 20:00:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/8f9a9a1832f7 changeset: 72858:8f9a9a1832f7 parent: 72857:3b81c1eae514 parent: 72856:a644e2c43c4b user: Antoine Pitrou date: Tue Oct 11 19:54:03 2011 +0200 summary: Merge files: Doc/c-api/number.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -239,10 +239,10 @@ .. c:function:: PyObject* PyNumber_ToBase(PyObject *n, int base) - Returns the integer *n* converted to *base* as a string with a base - marker of ``'0b'``, ``'0o'``, or ``'0x'`` if applicable. When - *base* is not 2, 8, 10, or 16, the format is ``'x#num'`` where x is the - base. If *n* is not an int object, it is converted with + Returns the integer *n* converted to base *base* as a string. The *base* + argument must be one of 2, 8, 10, or 16. For base 2, 8, or 16, the + returned string is prefixed with a base marker of ``'0b'``, ``'0o'``, or + ``'0x'``, respectively. If *n* is not a Python int, it is converted with :c:func:`PyNumber_Index` first. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 20:44:27 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 20:44:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313134=3A_optimize_?= =?utf8?q?finding_single-character_strings_using_memchr?= Message-ID: http://hg.python.org/cpython/rev/af4a89f4f466 changeset: 72859:af4a89f4f466 user: Antoine Pitrou date: Tue Oct 11 20:29:21 2011 +0200 summary: Issue #13134: optimize finding single-character strings using memchr files: Lib/test/test_unicode.py | 17 +++++ Objects/stringlib/fastsearch.h | 73 ++++++++++++++++++++++ configure.in | 3 +- pyconfig.h.in | 3 + 4 files changed, 95 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py --- a/Lib/test/test_unicode.py +++ b/Lib/test/test_unicode.py @@ -171,6 +171,15 @@ def test_find(self): string_tests.CommonTest.test_find(self) + # test implementation details of the memchr fast path + self.checkequal(100, 'a' * 100 + '\u0102', 'find', '\u0102') + self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0201') + self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0120') + self.checkequal(-1, 'a' * 100 + '\u0102', 'find', '\u0220') + self.checkequal(100, 'a' * 100 + '\U00100304', 'find', '\U00100304') + self.checkequal(-1, 'a' * 100 + '\U00100304', 'find', '\U00100204') + self.checkequal(-1, 'a' * 100 + '\U00100304', 'find', '\U00102004') + # check mixed argument types self.checkequalnofix(0, 'abcdefghiabc', 'find', 'abc') self.checkequalnofix(9, 'abcdefghiabc', 'find', 'abc', 1) self.checkequalnofix(-1, 'abcdefghiabc', 'find', 'def', 4) @@ -180,6 +189,14 @@ def test_rfind(self): string_tests.CommonTest.test_rfind(self) + # test implementation details of the memrchr fast path + self.checkequal(0, '\u0102' + 'a' * 100 , 'rfind', '\u0102') + self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0201') + self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0120') + self.checkequal(-1, '\u0102' + 'a' * 100 , 'rfind', '\u0220') + self.checkequal(0, '\U00100304' + 'a' * 100, 'rfind', '\U00100304') + self.checkequal(-1, '\U00100304' + 'a' * 100, 'rfind', '\U00100204') + self.checkequal(-1, '\U00100304' + 'a' * 100, 'rfind', '\U00102004') # check mixed argument types self.checkequalnofix(9, 'abcdefghiabc', 'rfind', 'abc') self.checkequalnofix(12, 'abcdefghiabc', 'rfind', '') diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -32,6 +32,60 @@ #define STRINGLIB_BLOOM(mask, ch) \ ((mask & (1UL << ((ch) & (STRINGLIB_BLOOM_WIDTH -1))))) + +Py_LOCAL_INLINE(Py_ssize_t) +STRINGLIB(fastsearch_memchr_1char)(const STRINGLIB_CHAR* s, Py_ssize_t n, + STRINGLIB_CHAR ch, unsigned char needle, + Py_ssize_t maxcount, int mode) +{ + void *candidate; + const STRINGLIB_CHAR *found; + +#define DO_MEMCHR(memchr, s, needle, nchars) do { \ + candidate = memchr((const void *) (s), (needle), (nchars) * sizeof(STRINGLIB_CHAR)); \ + found = (const STRINGLIB_CHAR *) \ + ((Py_ssize_t) candidate & (~ ((Py_ssize_t) sizeof(STRINGLIB_CHAR) - 1))); \ + } while (0) + + if (mode == FAST_SEARCH) { + const STRINGLIB_CHAR *_s = s; + const STRINGLIB_CHAR *e = s + n; + while (_s < e) { + DO_MEMCHR(memchr, _s, needle, e - _s); + if (found == NULL) + return -1; + if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch) + return (found - _s); + /* False positive */ + _s = found + 1; + } + return -1; + } +#ifdef HAVE_MEMRCHR + /* memrchr() is a GNU extension, available since glibc 2.1.91. + it doesn't seem as optimized as memchr(), but is still quite + faster than our hand-written loop in FASTSEARCH below */ + else if (mode == FAST_RSEARCH) { + while (n > 0) { + DO_MEMCHR(memrchr, s, needle, n); + if (found == NULL) + return -1; + n = found - s; + if (sizeof(STRINGLIB_CHAR) == 1 || *found == ch) + return n; + /* False positive */ + } + return -1; + } +#endif + else { + assert(0); /* Should never get here */ + return 0; + } + +#undef DO_MEMCHR +} + Py_LOCAL_INLINE(Py_ssize_t) FASTSEARCH(const STRINGLIB_CHAR* s, Py_ssize_t n, const STRINGLIB_CHAR* p, Py_ssize_t m, @@ -51,6 +105,25 @@ if (m <= 0) return -1; /* use special case for 1-character strings */ + if (n > 10 && (mode == FAST_SEARCH +#ifdef HAVE_MEMRCHR + || mode == FAST_RSEARCH +#endif + )) { + /* use memchr if we can choose a needle without two many likely + false positives */ + unsigned char needle; + int use_needle = 1; + needle = p[0] & 0xff; + if (needle == 0 && sizeof(STRINGLIB_CHAR) > 1) { + needle = (p[0] >> 8) & 0xff; + if (needle >= 32) + use_needle = 0; + } + if (use_needle) + return STRINGLIB(fastsearch_memchr_1char) + (s, n, p[0], needle, maxcount, mode); + } if (mode == FAST_COUNT) { for (i = 0; i < n; i++) if (s[i] == p[0]) { diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -2566,7 +2566,8 @@ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mbrtowc mkdirat mkfifo \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes memrchr \ + mbrtowc mkdirat mkfifo \ mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise pread \ pthread_init pthread_kill putenv pwrite readlink readlinkat readv realpath renameat \ diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -515,6 +515,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H +/* Define to 1 if you have the `memrchr' function. */ +#undef HAVE_MEMRCHR + /* Define to 1 if you have the `mkdirat' function. */ #undef HAVE_MKDIRAT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 21:07:12 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 21:07:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313136=3A_speed_up_?= =?utf8?q?conversion_between_different_character_widths=2E?= Message-ID: http://hg.python.org/cpython/rev/5b077c962a16 changeset: 72860:5b077c962a16 user: Antoine Pitrou date: Tue Oct 11 20:58:41 2011 +0200 summary: Issue #13136: speed up conversion between different character widths. files: Objects/unicodeobject.c | 19 ++++++++++++++----- 1 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -177,12 +177,21 @@ buffer where the result characters are written to. */ #define _PyUnicode_CONVERT_BYTES(from_type, to_type, begin, end, to) \ do { \ - const from_type *iter_; to_type *to_; \ - for (iter_ = (begin), to_ = (to_type *)(to); \ - iter_ < (end); \ - ++iter_, ++to_) { \ - *to_ = (to_type)*iter_; \ + to_type *_to = (to_type *) to; \ + const from_type *_iter = (begin); \ + const from_type *_end = (end); \ + Py_ssize_t n = (_end) - (_iter); \ + const from_type *_unrolled_end = \ + _iter + (n & ~ (Py_ssize_t) 3); \ + while (_iter < (_unrolled_end)) { \ + _to[0] = (to_type) _iter[0]; \ + _to[1] = (to_type) _iter[1]; \ + _to[2] = (to_type) _iter[2]; \ + _to[3] = (to_type) _iter[3]; \ + _iter += 4; _to += 4; \ } \ + while (_iter < (_end)) \ + *_to++ = (to_type) *_iter++; \ } while (0) /* The Unicode string has been modified: reset the hash */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:13:01 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:13:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_PyUnicode=5FAsUnicodeAn?= =?utf8?q?dSize=28=29_instead_of_PyUnicode=5FGET=5FSIZE=28=29?= Message-ID: http://hg.python.org/cpython/rev/6358e5d29dea changeset: 72861:6358e5d29dea user: Victor Stinner date: Tue Oct 11 21:55:01 2011 +0200 summary: Use PyUnicode_AsUnicodeAndSize() instead of PyUnicode_GET_SIZE() files: Modules/posixmodule.c | 3 +-- Python/getargs.c | 10 ++++++---- Python/import.c | 11 ++++++++--- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2529,10 +2529,9 @@ po_wchars = L"."; len = 1; } else { - po_wchars = PyUnicode_AsUnicode(po); + po_wchars = PyUnicode_AsUnicodeAndSize(po, &len); if (po_wchars == NULL) return NULL; - len = PyUnicode_GET_SIZE(po); } /* Overallocate for \\*.*\0 */ wnamebuf = malloc((len + 5) * sizeof(wchar_t)); diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -982,10 +982,11 @@ STORE_SIZE(0); } else if (PyUnicode_Check(arg)) { - *p = PyUnicode_AS_UNICODE(arg); + Py_ssize_t len; + *p = PyUnicode_AsUnicodeAndSize(arg, &len); if (*p == NULL) RETURN_ERR_OCCURRED; - STORE_SIZE(PyUnicode_GET_SIZE(arg)); + STORE_SIZE(len); } else return converterr("str or None", arg, msgbuf, bufsize); @@ -995,10 +996,11 @@ if (c == 'Z' && arg == Py_None) *p = NULL; else if (PyUnicode_Check(arg)) { - *p = PyUnicode_AS_UNICODE(arg); + Py_ssize_t len; + *p = PyUnicode_AsUnicodeAndSize(arg, &len); if (*p == NULL) RETURN_ERR_OCCURRED; - if (Py_UNICODE_strlen(*p) != PyUnicode_GET_SIZE(arg)) + if (Py_UNICODE_strlen(*p) != len) return converterr( "str without null character or None", arg, msgbuf, bufsize); diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -2282,6 +2282,8 @@ WIN32_FIND_DATAW data; HANDLE h; int cmp; + wchar_t *wname; + Py_ssizet wname_len; if (Py_GETENV("PYTHONCASEOK") != NULL) return 1; @@ -2294,9 +2296,12 @@ return 0; } FindClose(h); - cmp = wcsncmp(data.cFileName, - PyUnicode_AS_UNICODE(name), - PyUnicode_GET_SIZE(name)); + + wname = PyUnicode_AsUnicodeAndSize(name, &wname_len); + if (wname == NULL) + return -1; + + cmp = wcsncmp(data.cFileName, wname, wname_len); return cmp == 0; #elif defined(USE_CASE_OK_BYTES) int match; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:13:03 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:13:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_misuse_of_PyUnicode=5FG?= =?utf8?q?ET=5FSIZE=2C_use_PyUnicode=5FGET=5FLENGTH_instead?= Message-ID: http://hg.python.org/cpython/rev/afa42c04f0a3 changeset: 72863:afa42c04f0a3 user: Victor Stinner date: Tue Oct 11 22:11:42 2011 +0200 summary: Fix misuse of PyUnicode_GET_SIZE, use PyUnicode_GET_LENGTH instead files: Modules/_cursesmodule.c | 2 +- Modules/_io/stringio.c | 2 +- Modules/_json.c | 2 +- Modules/syslogmodule.c | 8 +++----- Objects/unicodeobject.c | 6 +++--- Python/formatter_unicode.c | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -2719,7 +2719,7 @@ PyErr_Format(PyExc_TypeError, "expect bytes or str of length 1, or int, " "got a str of length %zi", - PyUnicode_GET_SIZE(obj)); + PyUnicode_GET_LENGTH(obj)); return 0; } *wch = buffer[0]; diff --git a/Modules/_io/stringio.c b/Modules/_io/stringio.c --- a/Modules/_io/stringio.c +++ b/Modules/_io/stringio.c @@ -343,7 +343,7 @@ if (line == NULL) return NULL; - if (PyUnicode_GET_SIZE(line) == 0) { + if (PyUnicode_GET_LENGTH(line) == 0) { /* Reached EOF */ Py_DECREF(line); return NULL; diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -837,7 +837,7 @@ /* rval = parse_constant(constant) */ rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL); - idx += PyUnicode_GET_SIZE(cstr); + idx += PyUnicode_GET_LENGTH(cstr); Py_DECREF(cstr); *next_idx_ptr = idx; return rval; diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -90,18 +90,16 @@ if (!PyUnicode_Check(scriptobj)) { return(NULL); } - scriptlen = PyUnicode_GET_SIZE(scriptobj); + scriptlen = PyUnicode_GET_LENGTH(scriptobj); if (scriptlen == 0) { return(NULL); } - slash = PyUnicode_FindChar(scriptobj, SEP, - 0, PyUnicode_GET_LENGTH(scriptobj), -1); + slash = PyUnicode_FindChar(scriptobj, SEP, 0, scriptlen, -1); if (slash == -2) return NULL; if (slash != -1) { - return PyUnicode_Substring(scriptobj, slash, - PyUnicode_GET_LENGTH(scriptobj)); + return PyUnicode_Substring(scriptobj, slash, scriptlen); } else { Py_INCREF(scriptobj); return(scriptobj); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12181,7 +12181,7 @@ if (z != NULL) { z_kind = PyUnicode_KIND(z); z_data = PyUnicode_DATA(z); - for (i = 0; i < PyUnicode_GET_SIZE(z); i++) { + for (i = 0; i < PyUnicode_GET_LENGTH(z); i++) { key = PyLong_FromLong(PyUnicode_READ(z_kind, z_data, i)); if (!key) goto err; @@ -12206,7 +12206,7 @@ if (PyUnicode_Check(key)) { /* convert string keys to integer keys */ PyObject *newkey; - if (PyUnicode_GET_SIZE(key) != 1) { + if (PyUnicode_GET_LENGTH(key) != 1) { PyErr_SetString(PyExc_ValueError, "string keys in translate " "table must be of length 1"); goto err; @@ -13694,7 +13694,7 @@ { Py_ssize_t len = 0; if (it->it_seq) - len = PyUnicode_GET_SIZE(it->it_seq) - it->it_index; + len = PyUnicode_GET_LENGTH(it->it_seq) - it->it_index; return PyLong_FromSsize_t(len); } diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -693,7 +693,7 @@ Py_ssize_t rpad; Py_ssize_t total; Py_ssize_t pos; - Py_ssize_t len = PyUnicode_GET_SIZE(value); + Py_ssize_t len = PyUnicode_GET_LENGTH(value); PyObject *result = NULL; int maxchar = 127; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:13:02 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:13:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Reuse_PyUnicode=5FCopy=28?= =?utf8?b?KSBpbiB2YWxpZGF0ZV9hbmRfY29weV90dXBsZSgp?= Message-ID: http://hg.python.org/cpython/rev/5aaf83414ae7 changeset: 72862:5aaf83414ae7 user: Victor Stinner date: Tue Oct 11 21:53:24 2011 +0200 summary: Reuse PyUnicode_Copy() in validate_and_copy_tuple() files: Objects/codeobject.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Objects/codeobject.c b/Objects/codeobject.c --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -249,9 +249,7 @@ return NULL; } else { - item = PyUnicode_FromUnicode( - PyUnicode_AS_UNICODE(item), - PyUnicode_GET_SIZE(item)); + item = PyUnicode_Copy(item); if (item == NULL) { Py_DECREF(newtuple); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:13:04 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:13:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FAsUnicodeCopy?= =?utf8?q?=28=29_now_checks_if_PyUnicode=5FAsUnicode=28=29_failed?= Message-ID: http://hg.python.org/cpython/rev/fafb6e4ef7be changeset: 72865:fafb6e4ef7be user: Victor Stinner date: Tue Oct 11 22:12:48 2011 +0200 summary: PyUnicode_AsUnicodeCopy() now checks if PyUnicode_AsUnicode() failed files: Objects/unicodeobject.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13775,13 +13775,16 @@ PyUnicode_AsUnicodeCopy(PyObject *object) { PyUnicodeObject *unicode = (PyUnicodeObject *)object; - Py_UNICODE *copy; + Py_UNICODE *u, *copy; Py_ssize_t size; if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; } + u = PyUnicode_AsUnicode(object); + if (u == NULL) + return NULL; /* Ensure we won't overflow the size. */ if (PyUnicode_GET_SIZE(unicode) > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) { PyErr_NoMemory(); @@ -13794,7 +13797,7 @@ PyErr_NoMemory(); return NULL; } - memcpy(copy, PyUnicode_AS_UNICODE(unicode), size); + memcpy(copy, u, size); return copy; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:13:03 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:13:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Strip_trailing_spaces_in_?= =?utf8?q?=5Fjson=2Ec?= Message-ID: http://hg.python.org/cpython/rev/dbfd77c15051 changeset: 72864:dbfd77c15051 user: Victor Stinner date: Tue Oct 11 21:56:19 2011 +0200 summary: Strip trailing spaces in _json.c files: Modules/_json.c | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -218,7 +218,7 @@ output_size++; else { switch(c) { - case '\\': case '"': case '\b': case '\f': + case '\\': case '"': case '\b': case '\f': case '\n': case '\r': case '\t': output_size += 2; break; default: @@ -434,7 +434,7 @@ raise_errmsg("Unpaired high surrogate", pystr, end - 5); goto bail; } - if (PyUnicode_READ(kind, buf, next++) != '\\' || + if (PyUnicode_READ(kind, buf, next++) != '\\' || PyUnicode_READ(kind, buf, next++) != 'u') { raise_errmsg("Unpaired high surrogate", pystr, end - 5); goto bail; @@ -1027,9 +1027,9 @@ break; case 'f': /* false */ - if ((idx + 4 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' && - PyUnicode_READ(kind, str, idx + 2) == 'l' && - PyUnicode_READ(kind, str, idx + 3) == 's' && + if ((idx + 4 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' && + PyUnicode_READ(kind, str, idx + 2) == 'l' && + PyUnicode_READ(kind, str, idx + 3) == 's' && PyUnicode_READ(kind, str, idx + 4) == 'e') { Py_INCREF(Py_False); *next_idx_ptr = idx + 5; @@ -1038,32 +1038,32 @@ break; case 'N': /* NaN */ - if ((idx + 2 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' && + if ((idx + 2 < length) && PyUnicode_READ(kind, str, idx + 1) == 'a' && PyUnicode_READ(kind, str, idx + 2) == 'N') { return _parse_constant(s, "NaN", idx, next_idx_ptr); } break; case 'I': /* Infinity */ - if ((idx + 7 < length) && PyUnicode_READ(kind, str, idx + 1) == 'n' && - PyUnicode_READ(kind, str, idx + 2) == 'f' && - PyUnicode_READ(kind, str, idx + 3) == 'i' && + if ((idx + 7 < length) && PyUnicode_READ(kind, str, idx + 1) == 'n' && + PyUnicode_READ(kind, str, idx + 2) == 'f' && + PyUnicode_READ(kind, str, idx + 3) == 'i' && PyUnicode_READ(kind, str, idx + 4) == 'n' && - PyUnicode_READ(kind, str, idx + 5) == 'i' && - PyUnicode_READ(kind, str, idx + 6) == 't' && + PyUnicode_READ(kind, str, idx + 5) == 'i' && + PyUnicode_READ(kind, str, idx + 6) == 't' && PyUnicode_READ(kind, str, idx + 7) == 'y') { return _parse_constant(s, "Infinity", idx, next_idx_ptr); } break; case '-': /* -Infinity */ - if ((idx + 8 < length) && PyUnicode_READ(kind, str, idx + 1) == 'I' && + if ((idx + 8 < length) && PyUnicode_READ(kind, str, idx + 1) == 'I' && PyUnicode_READ(kind, str, idx + 2) == 'n' && PyUnicode_READ(kind, str, idx + 3) == 'f' && - PyUnicode_READ(kind, str, idx + 4) == 'i' && + PyUnicode_READ(kind, str, idx + 4) == 'i' && PyUnicode_READ(kind, str, idx + 5) == 'n' && - PyUnicode_READ(kind, str, idx + 6) == 'i' && - PyUnicode_READ(kind, str, idx + 7) == 't' && + PyUnicode_READ(kind, str, idx + 6) == 'i' && + PyUnicode_READ(kind, str, idx + 7) == 't' && PyUnicode_READ(kind, str, idx + 8) == 'y') { return _parse_constant(s, "-Infinity", idx, next_idx_ptr); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:26:30 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:26:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo_in_import=2Ec?= Message-ID: http://hg.python.org/cpython/rev/4be55c2c2356 changeset: 72866:4be55c2c2356 user: Victor Stinner date: Tue Oct 11 22:27:13 2011 +0200 summary: Fix typo in import.c files: Python/import.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -2283,7 +2283,7 @@ HANDLE h; int cmp; wchar_t *wname; - Py_ssizet wname_len; + Py_ssize_t wname_len; if (Py_GETENV("PYTHONCASEOK") != NULL) return 1; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:28:14 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:28:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_compiler_warning_in_z?= =?utf8?q?ipimport?= Message-ID: http://hg.python.org/cpython/rev/574c15fddcfb changeset: 72867:574c15fddcfb user: Victor Stinner date: Tue Oct 11 22:28:56 2011 +0200 summary: Fix a compiler warning in zipimport files: Modules/zipimport.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/zipimport.c b/Modules/zipimport.c --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -868,7 +868,7 @@ PY_MAJOR_VERSION, PY_MINOR_VERSION); goto error; } - for (i = 0; (i < MAXPATHLEN - length - 1) && + for (i = 0; (i < (MAXPATHLEN - (Py_ssize_t)length - 1)) && (i < PyUnicode_GET_LENGTH(nameobj)); i++) path[length + 1 + i] = PyUnicode_READ_CHAR(nameobj, i); path[length + 1 + i] = 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:35:09 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:35:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_compiler_warning_in_?= =?utf8?q?=5Flocale?= Message-ID: http://hg.python.org/cpython/rev/22ce0c81360e changeset: 72868:22ce0c81360e user: Victor Stinner date: Tue Oct 11 22:35:52 2011 +0200 summary: Fix a compiler warning in _locale files: Modules/_localemodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -292,7 +292,7 @@ goto exit; } n2 = wcsxfrm(buf, s, n1); - if (n2 >= n1) { + if (n2 >= (size_t)n1) { /* more space needed */ buf = PyMem_Realloc(buf, (n2+1)*sizeof(wchar_t)); if (!buf) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:44:19 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 22:44:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_io=2EFileIO=2Ereadall?= =?utf8?q?=28=29_on_Windows_64_bits?= Message-ID: http://hg.python.org/cpython/rev/32b1999410de changeset: 72869:32b1999410de user: Victor Stinner date: Tue Oct 11 22:45:02 2011 +0200 summary: Fix io.FileIO.readall() on Windows 64 bits Use Py_off_t type (64 bits) instead of off_t (32 bits). files: Modules/_io/fileio.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -552,12 +552,12 @@ static size_t new_buffersize(fileio *self, size_t currentsize #ifdef HAVE_FSTAT - , off_t pos, off_t end + , Py_off_t pos, Py_off_t end #endif ) { #ifdef HAVE_FSTAT - if (end != (off_t)-1) { + if (end != (Py_off_t)-1) { /* Files claiming a size smaller than SMALLCHUNK may actually be streaming pseudo-files. In this case, we apply the more aggressive algorithm below. @@ -584,7 +584,7 @@ { #ifdef HAVE_FSTAT struct stat st; - off_t pos, end; + Py_off_t pos, end; #endif PyObject *result; Py_ssize_t total = 0; @@ -609,7 +609,7 @@ if (fstat(self->fd, &st) == 0) end = st.st_size; else - end = (off_t)-1; + end = (Py_off_t)-1; #endif while (1) { #ifdef HAVE_FSTAT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:48:12 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 22:48:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_deprecation_warning?= Message-ID: http://hg.python.org/cpython/rev/e2cb12decd9f changeset: 72870:e2cb12decd9f parent: 72868:22ce0c81360e user: Antoine Pitrou date: Tue Oct 11 22:43:37 2011 +0200 summary: Fix deprecation warning files: Lib/test/test_socket.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -1152,8 +1152,8 @@ def testTooLongInterfaceName(self): # most systems limit IFNAMSIZ to 16, take 1024 to be sure with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s: - self.assertRaisesRegexp(socket.error, 'interface name too long', - s.bind, ('x' * 1024,)) + self.assertRaisesRegex(socket.error, 'interface name too long', + s.bind, ('x' * 1024,)) @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"), 'socket.CAN_RAW_LOOPBACK required for this test.') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:48:13 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 22:48:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/dcce928271c3 changeset: 72871:dcce928271c3 parent: 72870:e2cb12decd9f parent: 72869:32b1999410de user: Antoine Pitrou date: Tue Oct 11 22:43:51 2011 +0200 summary: Merge files: Modules/_io/fileio.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -552,12 +552,12 @@ static size_t new_buffersize(fileio *self, size_t currentsize #ifdef HAVE_FSTAT - , off_t pos, off_t end + , Py_off_t pos, Py_off_t end #endif ) { #ifdef HAVE_FSTAT - if (end != (off_t)-1) { + if (end != (Py_off_t)-1) { /* Files claiming a size smaller than SMALLCHUNK may actually be streaming pseudo-files. In this case, we apply the more aggressive algorithm below. @@ -584,7 +584,7 @@ { #ifdef HAVE_FSTAT struct stat st; - off_t pos, end; + Py_off_t pos, end; #endif PyObject *result; Py_ssize_t total = 0; @@ -609,7 +609,7 @@ if (fstat(self->fd, &st) == 0) end = st.st_size; else - end = (off_t)-1; + end = (Py_off_t)-1; #endif while (1) { #ifdef HAVE_FSTAT -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 22:49:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 22:49:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_=5FPyUnicode=5FCONVERT?= =?utf8?q?=5FBYTES=28=29_where_applicable=2E?= Message-ID: http://hg.python.org/cpython/rev/1c99ba37c694 changeset: 72872:1c99ba37c694 user: Antoine Pitrou date: Tue Oct 11 22:45:48 2011 +0200 summary: Use _PyUnicode_CONVERT_BYTES() where applicable. files: Objects/unicodeobject.c | 31 ++++++++++++++++------------ 1 files changed, 18 insertions(+), 13 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1757,14 +1757,14 @@ res = PyUnicode_New(size, max_char); if (!res) return NULL; - if (max_char >= 0x10000) + if (max_char < 256) + _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS1, u, u + size, + PyUnicode_1BYTE_DATA(res)); + else if (max_char < 0x10000) + _PyUnicode_CONVERT_BYTES(Py_UCS4, Py_UCS2, u, u + size, + PyUnicode_2BYTE_DATA(res)); + else memcpy(PyUnicode_4BYTE_DATA(res), u, sizeof(Py_UCS4)*size); - else { - int kind = PyUnicode_KIND(res); - void *data = PyUnicode_DATA(res); - for (i = 0; i < size; i++) - PyUnicode_WRITE(kind, data, i, u[i]); - } assert(_PyUnicode_CheckConsistency(res, 1)); return res; } @@ -1978,13 +1978,18 @@ return NULL; } } - if (kind != PyUnicode_4BYTE_KIND) { - Py_ssize_t i; - for (i = 0; i < len; i++) - target[i] = PyUnicode_READ(kind, data, i); - } - else + if (kind == PyUnicode_1BYTE_KIND) { + Py_UCS1 *start = (Py_UCS1 *) data; + _PyUnicode_CONVERT_BYTES(Py_UCS1, Py_UCS4, start, start + len, target); + } + else if (kind == PyUnicode_2BYTE_KIND) { + Py_UCS2 *start = (Py_UCS2 *) data; + _PyUnicode_CONVERT_BYTES(Py_UCS2, Py_UCS4, start, start + len, target); + } + else { + assert(kind == PyUnicode_4BYTE_KIND); Py_MEMCPY(target, data, len * sizeof(Py_UCS4)); + } if (copy_null) target[len] = 0; return target; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 23:01:14 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 23:01:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_FileIO=2Ereadall=28=29_?= =?utf8?q?=28new=5Fbuffersize=28=29=29_for_large_files?= Message-ID: http://hg.python.org/cpython/rev/370e3472958f changeset: 72873:370e3472958f user: Victor Stinner date: Tue Oct 11 23:00:31 2011 +0200 summary: Fix FileIO.readall() (new_buffersize()) for large files Truncate the buffer size to PY_SSIZE_T_MAX. files: Modules/_io/fileio.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -564,7 +564,11 @@ */ if (end >= SMALLCHUNK && end >= pos && pos >= 0) { /* Add 1 so if the file were to grow we'd notice. */ - return currentsize + end - pos + 1; + Py_off_t bufsize = currentsize + end - pos + 1; + if (bufsize < PY_SSIZE_T_MAX) + return (size_t)bufsize; + else + return PY_SSIZE_T_MAX; } } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 23:22:33 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 23:22:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_fastsearch_for_UCS2_and?= =?utf8?q?_UCS4?= Message-ID: http://hg.python.org/cpython/rev/bfd3fcfb02f3 changeset: 72874:bfd3fcfb02f3 user: Victor Stinner date: Tue Oct 11 23:22:22 2011 +0200 summary: Fix fastsearch for UCS2 and UCS4 * If needle is 0, try (p[0] >> 16) & 0xff for UCS4 * Disable fastsearch_memchr_1char() if needle is zero for UCS2 and UCS4 files: Objects/stringlib/asciilib.h | 1 + Objects/stringlib/fastsearch.h | 10 ++++++++-- Objects/stringlib/stringdefs.h | 1 + Objects/stringlib/ucs1lib.h | 1 + Objects/stringlib/ucs2lib.h | 1 + Objects/stringlib/ucs4lib.h | 1 + Objects/stringlib/undef.h | 1 + Objects/stringlib/unicodedefs.h | 1 + 8 files changed, 15 insertions(+), 2 deletions(-) diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -6,6 +6,7 @@ #define FASTSEARCH asciilib_fastsearch #define STRINGLIB(F) asciilib_##F #define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_SIZEOF_CHAR 1 #define STRINGLIB_CHAR Py_UCS1 #define STRINGLIB_TYPE_NAME "unicode" #define STRINGLIB_PARSE_CODE "U" diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -115,11 +115,17 @@ unsigned char needle; int use_needle = 1; needle = p[0] & 0xff; - if (needle == 0 && sizeof(STRINGLIB_CHAR) > 1) { +#if STRINGLIB_SIZEOF_CHAR > 1 + if (needle == 0) { needle = (p[0] >> 8) & 0xff; - if (needle >= 32) +#if STRINGLIB_SIZEOF_CHAR > 2 + if (needle == 0) + needle = (p[0] >> 16) & 0xff; +#endif + if (needle >= 32 || needle == 0) use_needle = 0; } +#endif if (use_needle) return STRINGLIB(fastsearch_memchr_1char) (s, n, p[0], needle, maxcount, mode); diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -9,6 +9,7 @@ #define FASTSEARCH fastsearch #define STRINGLIB(F) stringlib_##F #define STRINGLIB_OBJECT PyBytesObject +#define STRINGLIB_SIZEOF_CHAR 1 #define STRINGLIB_CHAR char #define STRINGLIB_TYPE_NAME "string" #define STRINGLIB_PARSE_CODE "S" diff --git a/Objects/stringlib/ucs1lib.h b/Objects/stringlib/ucs1lib.h --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -6,6 +6,7 @@ #define FASTSEARCH ucs1lib_fastsearch #define STRINGLIB(F) ucs1lib_##F #define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_SIZEOF_CHAR 1 #define STRINGLIB_CHAR Py_UCS1 #define STRINGLIB_TYPE_NAME "unicode" #define STRINGLIB_PARSE_CODE "U" diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -6,6 +6,7 @@ #define FASTSEARCH ucs2lib_fastsearch #define STRINGLIB(F) ucs2lib_##F #define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_SIZEOF_CHAR 2 #define STRINGLIB_CHAR Py_UCS2 #define STRINGLIB_TYPE_NAME "unicode" #define STRINGLIB_PARSE_CODE "U" diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -6,6 +6,7 @@ #define FASTSEARCH ucs4lib_fastsearch #define STRINGLIB(F) ucs4lib_##F #define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_SIZEOF_CHAR 4 #define STRINGLIB_CHAR Py_UCS4 #define STRINGLIB_TYPE_NAME "unicode" #define STRINGLIB_PARSE_CODE "U" diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -1,5 +1,6 @@ #undef FASTSEARCH #undef STRINGLIB +#undef STRINGLIB_SIZEOF_CHAR #undef STRINGLIB_CHAR #undef STRINGLIB_STR #undef STRINGLIB_LEN diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h --- a/Objects/stringlib/unicodedefs.h +++ b/Objects/stringlib/unicodedefs.h @@ -9,6 +9,7 @@ #define FASTSEARCH fastsearch #define STRINGLIB(F) stringlib_##F #define STRINGLIB_OBJECT PyUnicodeObject +#define STRINGLIB_SIZEOF_CHAR Py_UNICODE_SIZE #define STRINGLIB_CHAR Py_UNICODE #define STRINGLIB_TYPE_NAME "unicode" #define STRINGLIB_PARSE_CODE "U" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 23:27:11 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 11 Oct 2011 23:27:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compiler_warning_in_=5F?= =?utf8?q?PyUnicode=5FFromUCS2=28=29?= Message-ID: http://hg.python.org/cpython/rev/d888b78aca99 changeset: 72875:d888b78aca99 user: Victor Stinner date: Tue Oct 11 23:27:52 2011 +0200 summary: Fix compiler warning in _PyUnicode_FromUCS2() files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1717,7 +1717,7 @@ assert(size >= 0); if (size == 1 && u[0] < 256) - return get_latin1_char(u[0]); + return get_latin1_char((unsigned char)u[0]); for (i = 0; i < size; i++) { if (u[i] > max_char) { max_char = u[i]; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 11 23:54:33 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 11 Oct 2011 23:54:33 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Clarify_statement_at_Barry=27s?= =?utf8?q?_request?= Message-ID: http://hg.python.org/peps/rev/8967a7ce3183 changeset: 3957:8967a7ce3183 user: Antoine Pitrou date: Tue Oct 11 23:50:49 2011 +0200 summary: Clarify statement at Barry's request files: pep-3151.txt | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/pep-3151.txt b/pep-3151.txt --- a/pep-3151.txt +++ b/pep-3151.txt @@ -193,10 +193,14 @@ * useful compatibility doesn't make exception catching any narrower, but it can be broader for *careless* exception-catching code. Given the following kind of snippet, all exceptions caught before this PEP will also be - caught after this PEP, but the reverse may be false:: + caught after this PEP, but the reverse may be false (because the coalescing + of ``OSError``, ``IOError`` and others means the ``except`` clause throws + a slightly broader net):: try: + ... os.remove(filename) + ... except OSError: pass -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 12 00:13:57 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 00:13:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_stringlib=3A_Fix_STRINGLIB?= =?utf8?q?=5FSTR_for_UCS2/UCS4?= Message-ID: http://hg.python.org/cpython/rev/62fd915c4e0b changeset: 72876:62fd915c4e0b user: Victor Stinner date: Wed Oct 12 00:14:32 2011 +0200 summary: stringlib: Fix STRINGLIB_STR for UCS2/UCS4 files: Objects/stringlib/ucs2lib.h | 2 +- Objects/stringlib/ucs4lib.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -18,7 +18,7 @@ #define STRINGLIB_TOUPPER Py_UNICODE_TOUPPER #define STRINGLIB_TOLOWER Py_UNICODE_TOLOWER #define STRINGLIB_FILL Py_UNICODE_FILL -#define STRINGLIB_STR PyUnicode_1BYTE_DATA +#define STRINGLIB_STR PyUnicode_2BYTE_DATA #define STRINGLIB_LEN PyUnicode_GET_LENGTH #define STRINGLIB_NEW _PyUnicode_FromUCS2 #define STRINGLIB_RESIZE not_supported diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -18,7 +18,7 @@ #define STRINGLIB_TOUPPER Py_UNICODE_TOUPPER #define STRINGLIB_TOLOWER Py_UNICODE_TOLOWER #define STRINGLIB_FILL Py_UNICODE_FILL -#define STRINGLIB_STR PyUnicode_1BYTE_DATA +#define STRINGLIB_STR PyUnicode_4BYTE_DATA #define STRINGLIB_LEN PyUnicode_GET_LENGTH #define STRINGLIB_NEW _PyUnicode_FromUCS4 #define STRINGLIB_RESIZE not_supported -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 00:40:36 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 00:40:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Relax_condition?= Message-ID: http://hg.python.org/cpython/rev/952d91a7d376 changeset: 72877:952d91a7d376 user: Antoine Pitrou date: Wed Oct 12 00:36:51 2011 +0200 summary: Relax condition files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1837,7 +1837,7 @@ } } } - assert(max_char < PyUnicode_MAX_CHAR_VALUE(unicode)); + assert(max_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); copy = PyUnicode_New(len, max_char); copy_characters(copy, 0, unicode, 0, len); Py_DECREF(unicode); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 00:53:52 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 00:53:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Backed_out_changeset_952d91?= =?utf8?q?a7d376?= Message-ID: http://hg.python.org/cpython/rev/2abd48a47f3b changeset: 72878:2abd48a47f3b user: Victor Stinner date: Wed Oct 12 00:54:35 2011 +0200 summary: Backed out changeset 952d91a7d376 If maxchar == PyUnicode_MAX_CHAR_VALUE(unicode), we do an useless copy. files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1837,7 +1837,7 @@ } } } - assert(max_char <= PyUnicode_MAX_CHAR_VALUE(unicode)); + assert(max_char < PyUnicode_MAX_CHAR_VALUE(unicode)); copy = PyUnicode_New(len, max_char); copy_characters(copy, 0, unicode, 0, len); Py_DECREF(unicode); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 03:00:49 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 03:00:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PEP_3151_/_issue_=2312555?= =?utf8?q?=3A_reworking_the_OS_and_IO_exception_hierarchy=2E?= Message-ID: http://hg.python.org/cpython/rev/41a1de81ef2b changeset: 72879:41a1de81ef2b user: Antoine Pitrou date: Wed Oct 12 02:54:14 2011 +0200 summary: PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy. files: Include/pyerrors.h | 44 +- Lib/_pyio.py | 12 +- Lib/multiprocessing/connection.py | 8 +- Lib/test/exception_hierarchy.txt | 21 +- Lib/test/test_concurrent_futures.py | 14 +- Lib/test/test_exceptions.py | 43 +- Lib/test/test_http_cookiejar.py | 11 +- Lib/test/test_io.py | 6 - Lib/test/test_mmap.py | 3 +- Lib/test/test_pep3151.py | 128 +++ Lib/test/test_xml_etree.py | 8 +- Lib/urllib/request.py | 2 + Misc/NEWS | 2 + Modules/_io/_iomodule.c | 91 +-- Modules/_io/_iomodule.h | 9 - Modules/_io/bufferedio.c | 4 +- Modules/mmapmodule.c | 26 +- Modules/selectmodule.c | 29 +- Modules/socketmodule.c | 116 +- Objects/exceptions.c | 559 ++++++++++----- Python/errors.c | 9 +- 21 files changed, 690 insertions(+), 455 deletions(-) diff --git a/Include/pyerrors.h b/Include/pyerrors.h --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -45,18 +45,18 @@ PyObject *myerrno; PyObject *strerror; PyObject *filename; -} PyEnvironmentErrorObject; +#ifdef MS_WINDOWS + PyObject *winerror; +#endif + Py_ssize_t written; /* only for BlockingIOError, -1 otherwise */ +} PyOSErrorObject; +/* Compatibility typedefs */ +typedef PyOSErrorObject PyEnvironmentErrorObject; #ifdef MS_WINDOWS -typedef struct { - PyException_HEAD - PyObject *myerrno; - PyObject *strerror; - PyObject *filename; - PyObject *winerror; -} PyWindowsErrorObject; +typedef PyOSErrorObject PyWindowsErrorObject; #endif -#endif +#endif /* !Py_LIMITED_API */ /* Error handling definitions */ @@ -132,10 +132,9 @@ PyAPI_DATA(PyObject *) PyExc_AssertionError; PyAPI_DATA(PyObject *) PyExc_AttributeError; +PyAPI_DATA(PyObject *) PyExc_BufferError; PyAPI_DATA(PyObject *) PyExc_EOFError; PyAPI_DATA(PyObject *) PyExc_FloatingPointError; -PyAPI_DATA(PyObject *) PyExc_EnvironmentError; -PyAPI_DATA(PyObject *) PyExc_IOError; PyAPI_DATA(PyObject *) PyExc_OSError; PyAPI_DATA(PyObject *) PyExc_ImportError; PyAPI_DATA(PyObject *) PyExc_IndexError; @@ -160,6 +159,27 @@ PyAPI_DATA(PyObject *) PyExc_UnicodeTranslateError; PyAPI_DATA(PyObject *) PyExc_ValueError; PyAPI_DATA(PyObject *) PyExc_ZeroDivisionError; + +PyAPI_DATA(PyObject *) PyExc_BlockingIOError; +PyAPI_DATA(PyObject *) PyExc_BrokenPipeError; +PyAPI_DATA(PyObject *) PyExc_ChildProcessError; +PyAPI_DATA(PyObject *) PyExc_ConnectionError; +PyAPI_DATA(PyObject *) PyExc_ConnectionAbortedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionRefusedError; +PyAPI_DATA(PyObject *) PyExc_ConnectionResetError; +PyAPI_DATA(PyObject *) PyExc_FileExistsError; +PyAPI_DATA(PyObject *) PyExc_FileNotFoundError; +PyAPI_DATA(PyObject *) PyExc_InterruptedError; +PyAPI_DATA(PyObject *) PyExc_IsADirectoryError; +PyAPI_DATA(PyObject *) PyExc_NotADirectoryError; +PyAPI_DATA(PyObject *) PyExc_PermissionError; +PyAPI_DATA(PyObject *) PyExc_ProcessLookupError; +PyAPI_DATA(PyObject *) PyExc_TimeoutError; + + +/* Compatibility aliases */ +PyAPI_DATA(PyObject *) PyExc_EnvironmentError; +PyAPI_DATA(PyObject *) PyExc_IOError; #ifdef MS_WINDOWS PyAPI_DATA(PyObject *) PyExc_WindowsError; #endif @@ -167,8 +187,6 @@ PyAPI_DATA(PyObject *) PyExc_VMSError; #endif -PyAPI_DATA(PyObject *) PyExc_BufferError; - PyAPI_DATA(PyObject *) PyExc_RecursionErrorInst; /* Predefined warning categories */ diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -23,16 +23,8 @@ # defined in io.py. We don't use real inheritance though, because we don't # want to inherit the C implementations. - -class BlockingIOError(IOError): - - """Exception raised when I/O would block on a non-blocking I/O stream.""" - - def __init__(self, errno, strerror, characters_written=0): - super().__init__(errno, strerror) - if not isinstance(characters_written, int): - raise TypeError("characters_written must be a integer") - self.characters_written = characters_written +# Rebind for compatibility +BlockingIOError = BlockingIOError def open(file, mode="r", buffering=-1, encoding=None, errors=None, diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -321,7 +321,7 @@ firstchunk = overlapped.getbuffer() assert lenfirstchunk == len(firstchunk) except IOError as e: - if e.errno == win32.ERROR_BROKEN_PIPE: + if e.winerror == win32.ERROR_BROKEN_PIPE: raise EOFError raise buf.write(firstchunk) @@ -669,7 +669,7 @@ try: win32.ConnectNamedPipe(handle, win32.NULL) except WindowsError as e: - if e.args[0] != win32.ERROR_PIPE_CONNECTED: + if e.winerror != win32.ERROR_PIPE_CONNECTED: raise return PipeConnection(handle) @@ -692,8 +692,8 @@ 0, win32.NULL, win32.OPEN_EXISTING, 0, win32.NULL ) except WindowsError as e: - if e.args[0] not in (win32.ERROR_SEM_TIMEOUT, - win32.ERROR_PIPE_BUSY) or _check_timeout(t): + if e.winerror not in (win32.ERROR_SEM_TIMEOUT, + win32.ERROR_PIPE_BUSY) or _check_timeout(t): raise else: break diff --git a/Lib/test/exception_hierarchy.txt b/Lib/test/exception_hierarchy.txt --- a/Lib/test/exception_hierarchy.txt +++ b/Lib/test/exception_hierarchy.txt @@ -11,11 +11,6 @@ +-- AssertionError +-- AttributeError +-- BufferError - +-- EnvironmentError - | +-- IOError - | +-- OSError - | +-- WindowsError (Windows) - | +-- VMSError (VMS) +-- EOFError +-- ImportError +-- LookupError @@ -24,6 +19,22 @@ +-- MemoryError +-- NameError | +-- UnboundLocalError + +-- OSError + | +-- BlockingIOError + | +-- ChildProcessError + | +-- ConnectionError + | | +-- BrokenPipeError + | | +-- ConnectionAbortedError + | | +-- ConnectionRefusedError + | | +-- ConnectionResetError + | +-- FileExistsError + | +-- FileNotFoundError + | +-- InterruptedError + | +-- IsADirectoryError + | +-- NotADirectoryError + | +-- PermissionError + | +-- ProcessLookupError + | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError diff --git a/Lib/test/test_concurrent_futures.py b/Lib/test/test_concurrent_futures.py --- a/Lib/test/test_concurrent_futures.py +++ b/Lib/test/test_concurrent_futures.py @@ -34,7 +34,7 @@ RUNNING_FUTURE = create_future(state=RUNNING) CANCELLED_FUTURE = create_future(state=CANCELLED) CANCELLED_AND_NOTIFIED_FUTURE = create_future(state=CANCELLED_AND_NOTIFIED) -EXCEPTION_FUTURE = create_future(state=FINISHED, exception=IOError()) +EXCEPTION_FUTURE = create_future(state=FINISHED, exception=OSError()) SUCCESSFUL_FUTURE = create_future(state=FINISHED, result=42) @@ -501,7 +501,7 @@ '') self.assertRegex( repr(EXCEPTION_FUTURE), - '') + '') self.assertRegex( repr(SUCCESSFUL_FUTURE), '') @@ -512,7 +512,7 @@ f2 = create_future(state=RUNNING) f3 = create_future(state=CANCELLED) f4 = create_future(state=CANCELLED_AND_NOTIFIED) - f5 = create_future(state=FINISHED, exception=IOError()) + f5 = create_future(state=FINISHED, exception=OSError()) f6 = create_future(state=FINISHED, result=5) self.assertTrue(f1.cancel()) @@ -566,7 +566,7 @@ CANCELLED_FUTURE.result, timeout=0) self.assertRaises(futures.CancelledError, CANCELLED_AND_NOTIFIED_FUTURE.result, timeout=0) - self.assertRaises(IOError, EXCEPTION_FUTURE.result, timeout=0) + self.assertRaises(OSError, EXCEPTION_FUTURE.result, timeout=0) self.assertEqual(SUCCESSFUL_FUTURE.result(timeout=0), 42) def test_result_with_success(self): @@ -605,7 +605,7 @@ self.assertRaises(futures.CancelledError, CANCELLED_AND_NOTIFIED_FUTURE.exception, timeout=0) self.assertTrue(isinstance(EXCEPTION_FUTURE.exception(timeout=0), - IOError)) + OSError)) self.assertEqual(SUCCESSFUL_FUTURE.exception(timeout=0), None) def test_exception_with_success(self): @@ -614,14 +614,14 @@ time.sleep(1) with f1._condition: f1._state = FINISHED - f1._exception = IOError() + f1._exception = OSError() f1._condition.notify_all() f1 = create_future(state=PENDING) t = threading.Thread(target=notification) t.start() - self.assertTrue(isinstance(f1.exception(timeout=5), IOError)) + self.assertTrue(isinstance(f1.exception(timeout=5), OSError)) @test.support.reap_threads def test_main(): diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -46,8 +46,8 @@ fp.close() unlink(TESTFN) - self.raise_catch(IOError, "IOError") - self.assertRaises(IOError, open, 'this file does not exist', 'r') + self.raise_catch(OSError, "OSError") + self.assertRaises(OSError, open, 'this file does not exist', 'r') self.raise_catch(ImportError, "ImportError") self.assertRaises(ImportError, __import__, "undefined_module") @@ -192,11 +192,35 @@ except NameError: pass else: - self.assertEqual(str(WindowsError(1001)), "1001") - self.assertEqual(str(WindowsError(1001, "message")), - "[Error 1001] message") - self.assertEqual(WindowsError(1001, "message").errno, 22) - self.assertEqual(WindowsError(1001, "message").winerror, 1001) + self.assertIs(WindowsError, OSError) + self.assertEqual(str(OSError(1001)), "1001") + self.assertEqual(str(OSError(1001, "message")), + "[Errno 1001] message") + # POSIX errno (9 aka EBADF) is untranslated + w = OSError(9, 'foo', 'bar') + self.assertEqual(w.errno, 9) + self.assertEqual(w.winerror, None) + self.assertEqual(str(w), "[Errno 9] foo: 'bar'") + # ERROR_PATH_NOT_FOUND (win error 3) becomes ENOENT (2) + w = OSError(0, 'foo', 'bar', 3) + self.assertEqual(w.errno, 2) + self.assertEqual(w.winerror, 3) + self.assertEqual(w.strerror, 'foo') + self.assertEqual(w.filename, 'bar') + self.assertEqual(str(w), "[Error 3] foo: 'bar'") + # Unknown win error becomes EINVAL (22) + w = OSError(0, 'foo', None, 1001) + self.assertEqual(w.errno, 22) + self.assertEqual(w.winerror, 1001) + self.assertEqual(w.strerror, 'foo') + self.assertEqual(w.filename, None) + self.assertEqual(str(w), "[Error 1001] foo") + # Non-numeric "errno" + w = OSError('bar', 'foo') + self.assertEqual(w.errno, 'bar') + self.assertEqual(w.winerror, None) + self.assertEqual(w.strerror, 'foo') + self.assertEqual(w.filename, None) def testAttributes(self): # test that exception attributes are happy @@ -274,11 +298,12 @@ 'start' : 0, 'end' : 1}), ] try: + # More tests are in test_WindowsError exceptionList.append( (WindowsError, (1, 'strErrorStr', 'filenameStr'), {'args' : (1, 'strErrorStr'), - 'strerror' : 'strErrorStr', 'winerror' : 1, - 'errno' : 22, 'filename' : 'filenameStr'}) + 'strerror' : 'strErrorStr', 'winerror' : None, + 'errno' : 1, 'filename' : 'filenameStr'}) ) except NameError: pass diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -248,18 +248,19 @@ self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) def test_bad_magic(self): - # IOErrors (eg. file doesn't exist) are allowed to propagate + # OSErrors (eg. file doesn't exist) are allowed to propagate filename = test.support.TESTFN for cookiejar_class in LWPCookieJar, MozillaCookieJar: c = cookiejar_class() try: c.load(filename="for this test to work, a file with this " "filename should not exist") - except IOError as exc: - # exactly IOError, not LoadError - self.assertIs(exc.__class__, IOError) + except OSError as exc: + # an OSError subclass (likely FileNotFoundError), but not + # LoadError + self.assertIsNot(exc.__class__, LoadError) else: - self.fail("expected IOError for invalid filename") + self.fail("expected OSError for invalid filename") # Invalid contents of cookies file (eg. bad magic string) # causes a LoadError. try: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -2643,12 +2643,6 @@ def test_blockingioerror(self): # Various BlockingIOError issues - self.assertRaises(TypeError, self.BlockingIOError) - self.assertRaises(TypeError, self.BlockingIOError, 1) - self.assertRaises(TypeError, self.BlockingIOError, 1, 2, 3, 4) - self.assertRaises(TypeError, self.BlockingIOError, 1, "", None) - b = self.BlockingIOError(1, "") - self.assertEqual(b.characters_written, 0) class C(str): pass c = C("") diff --git a/Lib/test/test_mmap.py b/Lib/test/test_mmap.py --- a/Lib/test/test_mmap.py +++ b/Lib/test/test_mmap.py @@ -563,8 +563,7 @@ f.close() def test_error(self): - self.assertTrue(issubclass(mmap.error, EnvironmentError)) - self.assertIn("mmap.error", str(mmap.error)) + self.assertIs(mmap.error, OSError) def test_io_methods(self): data = b"0123456789" diff --git a/Lib/test/test_pep3151.py b/Lib/test/test_pep3151.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_pep3151.py @@ -0,0 +1,128 @@ +import builtins +import os +import select +import socket +import sys +import unittest +import errno +from errno import EEXIST + +from test import support + +class SubOSError(OSError): + pass + + +class HierarchyTest(unittest.TestCase): + + def test_builtin_errors(self): + self.assertEqual(OSError.__name__, 'OSError') + self.assertIs(IOError, OSError) + self.assertIs(EnvironmentError, OSError) + + def test_socket_errors(self): + self.assertIs(socket.error, IOError) + self.assertIs(socket.gaierror.__base__, OSError) + self.assertIs(socket.herror.__base__, OSError) + self.assertIs(socket.timeout.__base__, OSError) + + def test_select_error(self): + self.assertIs(select.error, OSError) + + # mmap.error is tested in test_mmap + + _pep_map = """ + +-- BlockingIOError EAGAIN, EALREADY, EWOULDBLOCK, EINPROGRESS + +-- ChildProcessError ECHILD + +-- ConnectionError + +-- BrokenPipeError EPIPE, ESHUTDOWN + +-- ConnectionAbortedError ECONNABORTED + +-- ConnectionRefusedError ECONNREFUSED + +-- ConnectionResetError ECONNRESET + +-- FileExistsError EEXIST + +-- FileNotFoundError ENOENT + +-- InterruptedError EINTR + +-- IsADirectoryError EISDIR + +-- NotADirectoryError ENOTDIR + +-- PermissionError EACCES, EPERM + +-- ProcessLookupError ESRCH + +-- TimeoutError ETIMEDOUT + """ + def _make_map(s): + _map = {} + for line in s.splitlines(): + line = line.strip('+- ') + if not line: + continue + excname, _, errnames = line.partition(' ') + for errname in filter(None, errnames.strip().split(', ')): + _map[getattr(errno, errname)] = getattr(builtins, excname) + return _map + _map = _make_map(_pep_map) + + def test_errno_mapping(self): + # The OSError constructor maps errnos to subclasses + # A sample test for the basic functionality + e = OSError(EEXIST, "Bad file descriptor") + self.assertIs(type(e), FileExistsError) + # Exhaustive testing + for errcode, exc in self._map.items(): + e = OSError(errcode, "Some message") + self.assertIs(type(e), exc) + othercodes = set(errno.errorcode) - set(self._map) + for errcode in othercodes: + e = OSError(errcode, "Some message") + self.assertIs(type(e), OSError) + + def test_OSError_subclass_mapping(self): + # When constructing an OSError subclass, errno mapping isn't done + e = SubOSError(EEXIST, "Bad file descriptor") + self.assertIs(type(e), SubOSError) + + +class AttributesTest(unittest.TestCase): + + def test_windows_error(self): + if os.name == "nt": + self.assertIn('winerror', dir(OSError)) + else: + self.assertNotIn('winerror', dir(OSError)) + + def test_posix_error(self): + e = OSError(EEXIST, "File already exists", "foo.txt") + self.assertEqual(e.errno, EEXIST) + self.assertEqual(e.args[0], EEXIST) + self.assertEqual(e.strerror, "File already exists") + self.assertEqual(e.filename, "foo.txt") + if os.name == "nt": + self.assertEqual(e.winerror, None) + + @unittest.skipUnless(os.name == "nt", "Windows-specific test") + def test_errno_translation(self): + # ERROR_ALREADY_EXISTS (183) -> EEXIST + e = OSError(0, "File already exists", "foo.txt", 183) + self.assertEqual(e.winerror, 183) + self.assertEqual(e.errno, EEXIST) + self.assertEqual(e.args[0], EEXIST) + self.assertEqual(e.strerror, "File already exists") + self.assertEqual(e.filename, "foo.txt") + + def test_blockingioerror(self): + args = ("a", "b", "c", "d", "e") + for n in range(6): + e = BlockingIOError(*args[:n]) + with self.assertRaises(AttributeError): + e.characters_written + e = BlockingIOError("a", "b", 3) + self.assertEqual(e.characters_written, 3) + e.characters_written = 5 + self.assertEqual(e.characters_written, 5) + + # XXX VMSError not tested + + +def test_main(): + support.run_unittest(__name__) + +if __name__=="__main__": + test_main() diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1339,7 +1339,7 @@ try: data = XINCLUDE[href] except KeyError: - raise IOError("resource not found") + raise OSError("resource not found") if parse == "xml": from xml.etree.ElementTree import XML return XML(data) @@ -1404,7 +1404,7 @@ >>> document = xinclude_loader("C5.xml") >>> ElementInclude.include(document, xinclude_loader) Traceback (most recent call last): - IOError: resource not found + OSError: resource not found >>> # print(serialize(document)) # C5 """ @@ -1611,7 +1611,7 @@ class ExceptionFile: def read(self, x): - raise IOError + raise OSError def xmltoolkit60(): """ @@ -1619,7 +1619,7 @@ Handle crash in stream source. >>> tree = ET.parse(ExceptionFile()) Traceback (most recent call last): - IOError + OSError """ diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1547,6 +1547,8 @@ return getattr(self, name)(url) else: return getattr(self, name)(url, data) + except HTTPError: + raise except socket.error as msg: raise IOError('socket error', msg).with_traceback(sys.exc_info()[2]) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy. + - Add internal API for static strings (_Py_identifier et.al.). - Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -91,89 +91,6 @@ /* - * BlockingIOError extends IOError - */ - -static int -blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args, - PyObject *kwds) -{ - PyObject *myerrno = NULL, *strerror = NULL; - PyObject *baseargs = NULL; - Py_ssize_t written = 0; - - assert(PyTuple_Check(args)); - - self->written = 0; - if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError", - &myerrno, &strerror, &written)) - return -1; - - baseargs = PyTuple_Pack(2, myerrno, strerror); - if (baseargs == NULL) - return -1; - /* This will take care of initializing of myerrno and strerror members */ - if (((PyTypeObject *)PyExc_IOError)->tp_init( - (PyObject *)self, baseargs, kwds) == -1) { - Py_DECREF(baseargs); - return -1; - } - Py_DECREF(baseargs); - - self->written = written; - return 0; -} - -static PyMemberDef blockingioerror_members[] = { - {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0}, - {NULL} /* Sentinel */ -}; - -static PyTypeObject _PyExc_BlockingIOError = { - PyVarObject_HEAD_INIT(NULL, 0) - "BlockingIOError", /*tp_name*/ - sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare */ - 0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - PyDoc_STR("Exception raised when I/O would block " - "on a non-blocking I/O stream"), /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - blockingioerror_members, /* tp_members */ - 0, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)blockingioerror_init, /* tp_init */ - 0, /* tp_alloc */ - 0, /* tp_new */ -}; -PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError; - - -/* * The main open() function */ PyDoc_STRVAR(open_doc, @@ -694,9 +611,11 @@ state->unsupported_operation) < 0) goto fail; - /* BlockingIOError */ - _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError; - ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError"); + /* BlockingIOError, for compatibility */ + Py_INCREF(PyExc_BlockingIOError); + if (PyModule_AddObject(m, "BlockingIOError", + (PyObject *) PyExc_BlockingIOError) < 0) + goto fail; /* Concrete base types of the IO ABCs. (the ABCs themselves are declared through inheritance in io.py) diff --git a/Modules/_io/_iomodule.h b/Modules/_io/_iomodule.h --- a/Modules/_io/_iomodule.h +++ b/Modules/_io/_iomodule.h @@ -60,15 +60,6 @@ #define DEFAULT_BUFFER_SIZE (8 * 1024) /* bytes */ -typedef struct { - PyException_HEAD - PyObject *myerrno; - PyObject *strerror; - PyObject *filename; /* Not used, but part of the IOError object */ - Py_ssize_t written; -} PyBlockingIOErrorObject; -PyAPI_DATA(PyObject *) PyExc_BlockingIOError; - /* * Offset type for positioning. */ diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -622,14 +622,14 @@ _buffered_check_blocking_error(void) { PyObject *t, *v, *tb; - PyBlockingIOErrorObject *err; + PyOSErrorObject *err; PyErr_Fetch(&t, &v, &tb); if (v == NULL || !PyErr_GivenExceptionMatches(v, PyExc_BlockingIOError)) { PyErr_Restore(t, v, tb); return NULL; } - err = (PyBlockingIOErrorObject *) v; + err = (PyOSErrorObject *) v; /* TODO: sanity check (err->written >= 0) */ PyErr_Restore(t, v, tb); return &err->written; diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -78,8 +78,6 @@ # define MAP_ANONYMOUS MAP_ANON #endif -static PyObject *mmap_module_error; - typedef enum { ACCESS_DEFAULT, @@ -459,7 +457,7 @@ { struct stat buf; if (-1 == fstat(self->fd, &buf)) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } #ifdef HAVE_LARGEFILE_SUPPORT @@ -549,7 +547,7 @@ void *newmap; if (ftruncate(self->fd, self->offset + new_size) == -1) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -564,7 +562,7 @@ #endif if (newmap == (void *)-1) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } self->data = newmap; @@ -605,7 +603,7 @@ /* XXX semantics of return value? */ /* XXX flags for msync? */ if (-1 == msync(self->data + offset, size, MS_SYNC)) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } return PyLong_FromLong(0); @@ -1205,7 +1203,7 @@ fd = devzero = open("/dev/zero", O_RDWR); if (devzero == -1) { Py_DECREF(m_obj); - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } #endif @@ -1213,7 +1211,7 @@ m_obj->fd = dup(fd); if (m_obj->fd == -1) { Py_DECREF(m_obj); - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } } @@ -1229,7 +1227,7 @@ if (m_obj->data == (char *)-1) { m_obj->data = NULL; Py_DECREF(m_obj); - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } m_obj->access = (access_mode)access; @@ -1310,12 +1308,12 @@ if (fileno != -1 && fileno != 0) { /* Ensure that fileno is within the CRT's valid range */ if (_PyVerify_fd(fileno) == 0) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } fh = (HANDLE)_get_osfhandle(fileno); if (fh==(HANDLE)-1) { - PyErr_SetFromErrno(mmap_module_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } /* Win9x appears to need us seeked to zero */ @@ -1469,11 +1467,7 @@ dict = PyModule_GetDict(module); if (!dict) return NULL; - mmap_module_error = PyErr_NewException("mmap.error", - PyExc_EnvironmentError , NULL); - if (mmap_module_error == NULL) - return NULL; - PyDict_SetItemString(dict, "error", mmap_module_error); + PyDict_SetItemString(dict, "error", PyExc_OSError); PyDict_SetItemString(dict, "mmap", (PyObject*) &mmap_object_type); #ifdef PROT_EXEC setint(dict, "PROT_EXEC", PROT_EXEC); diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -54,8 +54,6 @@ # endif #endif -static PyObject *SelectError; - /* list of Python objects and their file descriptor */ typedef struct { PyObject *obj; /* owned reference */ @@ -274,11 +272,11 @@ #ifdef MS_WINDOWS if (n == SOCKET_ERROR) { - PyErr_SetExcFromWindowsErr(SelectError, WSAGetLastError()); + PyErr_SetExcFromWindowsErr(PyExc_OSError, WSAGetLastError()); } #else if (n < 0) { - PyErr_SetFromErrno(SelectError); + PyErr_SetFromErrno(PyExc_OSError); } #endif else { @@ -425,7 +423,7 @@ return NULL; if (PyDict_GetItem(self->dict, key) == NULL) { errno = ENOENT; - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } value = PyLong_FromLong(events); @@ -524,7 +522,7 @@ Py_END_ALLOW_THREADS if (poll_result < 0) { - PyErr_SetFromErrno(SelectError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -764,7 +762,7 @@ } if (self->epfd < 0) { Py_DECREF(self); - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } return (PyObject *)self; @@ -797,7 +795,7 @@ { errno = pyepoll_internal_close(self); if (errno < 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -890,7 +888,7 @@ } if (result < 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -914,7 +912,7 @@ PyDoc_STRVAR(pyepoll_register_doc, "register(fd[, eventmask]) -> None\n\ \n\ -Registers a new fd or raises an IOError if the fd is already registered.\n\ +Registers a new fd or raises an OSError if the fd is already registered.\n\ fd is the target file descriptor of the operation.\n\ events is a bit set composed of the various EPOLL constants; the default\n\ is EPOLL_IN | EPOLL_OUT | EPOLL_PRI.\n\ @@ -1013,7 +1011,7 @@ nfds = epoll_wait(self->epfd, evs, maxevents, timeout); Py_END_ALLOW_THREADS if (nfds < 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); goto error; } @@ -1404,7 +1402,7 @@ } if (self->kqfd < 0) { Py_DECREF(self); - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } return (PyObject *)self; @@ -1436,7 +1434,7 @@ { errno = kqueue_queue_internal_close(self); if (errno < 0) { - PyErr_SetFromErrno(PyExc_IOError); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -1778,9 +1776,8 @@ if (m == NULL) return NULL; - SelectError = PyErr_NewException("select.error", NULL, NULL); - Py_INCREF(SelectError); - PyModule_AddObject(m, "error", SelectError); + Py_INCREF(PyExc_OSError); + PyModule_AddObject(m, "error", PyExc_OSError); #ifdef PIPE_BUF #ifdef HAVE_BROKEN_PIPE_BUF diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -457,7 +457,6 @@ /* Global variable holding the exception type for errors detected by this module (but not argument type or memory errors, etc.). */ -static PyObject *socket_error; static PyObject *socket_herror; static PyObject *socket_gaierror; static PyObject *socket_timeout; @@ -498,7 +497,7 @@ static PyObject* select_error(void) { - PyErr_SetString(socket_error, "unable to select on socket"); + PyErr_SetString(PyExc_OSError, "unable to select on socket"); return NULL; } @@ -525,7 +524,7 @@ recognizes the error codes used by both GetLastError() and WSAGetLastError */ if (err_no) - return PyErr_SetExcFromWindowsErr(socket_error, err_no); + return PyErr_SetExcFromWindowsErr(PyExc_OSError, err_no); #endif #if defined(PYOS_OS2) && !defined(PYCC_GCC) @@ -556,7 +555,7 @@ } v = Py_BuildValue("(is)", myerrorcode, outbuf); if (v != NULL) { - PyErr_SetObject(socket_error, v); + PyErr_SetObject(PyExc_OSError, v); Py_DECREF(v); } return NULL; @@ -564,7 +563,7 @@ } #endif - return PyErr_SetFromErrno(socket_error); + return PyErr_SetFromErrno(PyExc_OSError); } @@ -883,13 +882,13 @@ #endif default: freeaddrinfo(res); - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "unsupported address family"); return -1; } if (res->ai_next) { freeaddrinfo(res); - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "wildcard resolved to multiple address"); return -1; } @@ -902,7 +901,7 @@ if (name[0] == '<' && strcmp(name, "") == 0) { struct sockaddr_in *sin; if (af != AF_INET && af != AF_UNSPEC) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "address family mismatched"); return -1; } @@ -960,7 +959,7 @@ return 16; #endif default: - PyErr_SetString(socket_error, "unknown address family"); + PyErr_SetString(PyExc_OSError, "unknown address family"); return -1; } } @@ -1009,7 +1008,7 @@ bdaddr->b[5] = b5; return 6; } else { - PyErr_SetString(socket_error, "bad bluetooth address"); + PyErr_SetString(PyExc_OSError, "bad bluetooth address"); return -1; } } @@ -1278,7 +1277,7 @@ if (len > 0 && path[0] == 0) { /* Linux abstract namespace extension */ if (len > sizeof addr->sun_path) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "AF_UNIX path too long"); return 0; } @@ -1288,7 +1287,7 @@ { /* regular NULL-terminated string */ if (len >= sizeof addr->sun_path) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "AF_UNIX path too long"); return 0; } @@ -1418,7 +1417,7 @@ _BT_L2_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_L2_MEMB(addr, psm))) { - PyErr_SetString(socket_error, "getsockaddrarg: " + PyErr_SetString(PyExc_OSError, "getsockaddrarg: " "wrong format"); return 0; } @@ -1437,7 +1436,7 @@ _BT_RC_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "si", &straddr, &_BT_RC_MEMB(addr, channel))) { - PyErr_SetString(socket_error, "getsockaddrarg: " + PyErr_SetString(PyExc_OSError, "getsockaddrarg: " "wrong format"); return 0; } @@ -1455,7 +1454,7 @@ _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; if (straddr == NULL) { - PyErr_SetString(socket_error, "getsockaddrarg: " + PyErr_SetString(PyExc_OSError, "getsockaddrarg: " "wrong format"); return 0; } @@ -1464,7 +1463,7 @@ #else _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH; if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) { - PyErr_SetString(socket_error, "getsockaddrarg: " + PyErr_SetString(PyExc_OSError, "getsockaddrarg: " "wrong format"); return 0; } @@ -1481,7 +1480,7 @@ addr = (struct sockaddr_sco *)addr_ret; _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH; if (!PyBytes_Check(args)) { - PyErr_SetString(socket_error, "getsockaddrarg: " + PyErr_SetString(PyExc_OSError, "getsockaddrarg: " "wrong format"); return 0; } @@ -1494,7 +1493,7 @@ } #endif default: - PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol"); + PyErr_SetString(PyExc_OSError, "getsockaddrarg: unknown Bluetooth protocol"); return 0; } } @@ -1633,7 +1632,7 @@ return 0; } } else { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "AF_CAN interface name too long"); Py_DECREF(interfaceName); return 0; @@ -1647,7 +1646,7 @@ return 1; } default: - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "getsockaddrarg: unsupported CAN protocol"); return 0; } @@ -1656,7 +1655,7 @@ /* More cases here... */ default: - PyErr_SetString(socket_error, "getsockaddrarg: bad family"); + PyErr_SetString(PyExc_OSError, "getsockaddrarg: bad family"); return 0; } @@ -1722,7 +1721,7 @@ return 1; #endif default: - PyErr_SetString(socket_error, "getsockaddrlen: " + PyErr_SetString(PyExc_OSError, "getsockaddrlen: " "unknown BT protocol"); return 0; @@ -1757,7 +1756,7 @@ /* More cases here... */ default: - PyErr_SetString(socket_error, "getsockaddrlen: bad family"); + PyErr_SetString(PyExc_OSError, "getsockaddrlen: bad family"); return 0; } @@ -2098,7 +2097,7 @@ #else if (buflen <= 0 || buflen > 1024) { #endif - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "getsockopt buflen out of range"); return NULL; } @@ -2926,7 +2925,7 @@ if (cmsg_status < 0) break; if (cmsgdatalen > PY_SSIZE_T_MAX) { - PyErr_SetString(socket_error, "control message too long"); + PyErr_SetString(PyExc_OSError, "control message too long"); goto err_closefds; } @@ -3087,7 +3086,7 @@ return NULL; nitems = PySequence_Fast_GET_SIZE(fast); if (nitems > INT_MAX) { - PyErr_SetString(socket_error, "recvmsg_into() argument 1 is too long"); + PyErr_SetString(PyExc_OSError, "recvmsg_into() argument 1 is too long"); goto finally; } @@ -3394,7 +3393,7 @@ goto finally; ndataparts = PySequence_Fast_GET_SIZE(data_fast); if (ndataparts > INT_MAX) { - PyErr_SetString(socket_error, "sendmsg() argument 1 is too long"); + PyErr_SetString(PyExc_OSError, "sendmsg() argument 1 is too long"); goto finally; } msg.msg_iovlen = ndataparts; @@ -3426,7 +3425,7 @@ #ifndef CMSG_SPACE if (ncmsgs > 1) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "sending multiple control messages is not supported " "on this system"); goto finally; @@ -3455,12 +3454,12 @@ #else if (!get_CMSG_LEN(bufsize, &space)) { #endif - PyErr_SetString(socket_error, "ancillary data item too large"); + PyErr_SetString(PyExc_OSError, "ancillary data item too large"); goto finally; } controllen += space; if (controllen > SOCKLEN_T_LIMIT || controllen < controllen_last) { - PyErr_SetString(socket_error, "too much ancillary data"); + PyErr_SetString(PyExc_OSError, "too much ancillary data"); goto finally; } controllen_last = controllen; @@ -4000,7 +3999,7 @@ if (h->h_addrtype != af) { /* Let's get real error message to return */ - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, (char *)strerror(EAFNOSUPPORT)); return NULL; @@ -4085,7 +4084,7 @@ #endif default: /* can't happen */ - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "unsupported address family"); return NULL; } @@ -4239,7 +4238,7 @@ break; #endif default: - PyErr_SetString(socket_error, "unsupported address family"); + PyErr_SetString(PyExc_OSError, "unsupported address family"); goto finally; } Py_BEGIN_ALLOW_THREADS @@ -4295,7 +4294,7 @@ sp = getservbyname(name, proto); Py_END_ALLOW_THREADS if (sp == NULL) { - PyErr_SetString(socket_error, "service/proto not found"); + PyErr_SetString(PyExc_OSError, "service/proto not found"); return NULL; } return PyLong_FromLong((long) ntohs(sp->s_port)); @@ -4332,7 +4331,7 @@ sp = getservbyport(htons((short)port), proto); Py_END_ALLOW_THREADS if (sp == NULL) { - PyErr_SetString(socket_error, "port/proto not found"); + PyErr_SetString(PyExc_OSError, "port/proto not found"); return NULL; } return PyUnicode_FromString(sp->s_name); @@ -4361,7 +4360,7 @@ sp = getprotobyname(name); Py_END_ALLOW_THREADS if (sp == NULL) { - PyErr_SetString(socket_error, "protocol not found"); + PyErr_SetString(PyExc_OSError, "protocol not found"); return NULL; } return PyLong_FromLong((long) sp->p_proto); @@ -4616,7 +4615,7 @@ return PyBytes_FromStringAndSize((char *)(&buf), sizeof(buf)); - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "illegal IP address string passed to inet_aton"); return NULL; @@ -4637,7 +4636,7 @@ packed_addr = inet_addr(ip_addr); if (packed_addr == INADDR_NONE) { /* invalid address */ - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "illegal IP address string passed to inet_aton"); return NULL; } @@ -4669,7 +4668,7 @@ } if (addr_len != sizeof(packed_addr)) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "packed IP wrong length for inet_ntoa"); return NULL; } @@ -4704,7 +4703,7 @@ #if !defined(ENABLE_IPV6) && defined(AF_INET6) if(af == AF_INET6) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "can't use AF_INET6, IPv6 is disabled"); return NULL; } @@ -4712,10 +4711,10 @@ retval = inet_pton(af, ip, packed); if (retval < 0) { - PyErr_SetFromErrno(socket_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } else if (retval == 0) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "illegal IP address string passed to inet_pton"); return NULL; } else if (af == AF_INET) { @@ -4727,7 +4726,7 @@ sizeof(struct in6_addr)); #endif } else { - PyErr_SetString(socket_error, "unknown address family"); + PyErr_SetString(PyExc_OSError, "unknown address family"); return NULL; } } @@ -4779,7 +4778,7 @@ retval = inet_ntop(af, packed, ip, sizeof(ip)); if (!retval) { - PyErr_SetFromErrno(socket_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } else { return PyUnicode_FromString(retval); @@ -4850,7 +4849,7 @@ } else if (pobj == Py_None) { pptr = (char *)NULL; } else { - PyErr_SetString(socket_error, "Int or String expected"); + PyErr_SetString(PyExc_OSError, "Int or String expected"); goto err; } memset(&hints, 0, sizeof(hints)); @@ -4947,7 +4946,7 @@ goto fail; } if (res->ai_next) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "sockaddr resolved to multiple addresses"); goto fail; } @@ -4955,7 +4954,7 @@ case AF_INET: { if (PyTuple_GET_SIZE(sa) != 2) { - PyErr_SetString(socket_error, + PyErr_SetString(PyExc_OSError, "IPv4 sockaddr must be 2 tuple"); goto fail; } @@ -5054,7 +5053,7 @@ ni = if_nameindex(); if (ni == NULL) { - PyErr_SetFromErrno(socket_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -5100,7 +5099,7 @@ Py_DECREF(oname); if (index == 0) { /* if_nametoindex() doesn't set errno */ - PyErr_SetString(socket_error, "no interface with this name"); + PyErr_SetString(PyExc_OSError, "no interface with this name"); return NULL; } @@ -5123,7 +5122,7 @@ return NULL; if (if_indextoname(index, name) == NULL) { - PyErr_SetFromErrno(socket_error); + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -5403,27 +5402,24 @@ if (m == NULL) return NULL; - socket_error = PyErr_NewException("socket.error", - PyExc_IOError, NULL); - if (socket_error == NULL) - return NULL; - PySocketModuleAPI.error = socket_error; - Py_INCREF(socket_error); - PyModule_AddObject(m, "error", socket_error); + Py_INCREF(PyExc_OSError); + PySocketModuleAPI.error = PyExc_OSError; + Py_INCREF(PyExc_OSError); + PyModule_AddObject(m, "error", PyExc_OSError); socket_herror = PyErr_NewException("socket.herror", - socket_error, NULL); + PyExc_OSError, NULL); if (socket_herror == NULL) return NULL; Py_INCREF(socket_herror); PyModule_AddObject(m, "herror", socket_herror); - socket_gaierror = PyErr_NewException("socket.gaierror", socket_error, + socket_gaierror = PyErr_NewException("socket.gaierror", PyExc_OSError, NULL); if (socket_gaierror == NULL) return NULL; Py_INCREF(socket_gaierror); PyModule_AddObject(m, "gaierror", socket_gaierror); socket_timeout = PyErr_NewException("socket.timeout", - socket_error, NULL); + PyExc_OSError, NULL); if (socket_timeout == NULL) return NULL; PySocketModuleAPI.timeout_error = socket_timeout; diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -10,6 +10,20 @@ #include "osdefs.h" +/* Compatibility aliases */ +PyObject *PyExc_EnvironmentError = NULL; +PyObject *PyExc_IOError = NULL; +#ifdef MS_WINDOWS +PyObject *PyExc_WindowsError = NULL; +#endif +#ifdef __VMS +PyObject *PyExc_VMSError = NULL; +#endif + +/* The dict map from errno codes to OSError subclasses */ +static PyObject *errnomap = NULL; + + /* NOTE: If the exception class hierarchy changes, don't forget to update * Lib/test/exception_hierarchy.txt */ @@ -433,11 +447,13 @@ PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \ (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, 0, 0, 0, &_ ## EXCBASE, \ 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \ - (initproc)EXCSTORE ## _init, 0, BaseException_new,\ + (initproc)EXCSTORE ## _init, 0, 0, \ }; \ PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME -#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCDEALLOC, EXCMETHODS, EXCMEMBERS, EXCSTR, EXCDOC) \ +#define ComplexExtendsException(EXCBASE, EXCNAME, EXCSTORE, EXCNEW, \ + EXCMETHODS, EXCMEMBERS, EXCGETSET, \ + EXCSTR, EXCDOC) \ static PyTypeObject _PyExc_ ## EXCNAME = { \ PyVarObject_HEAD_INIT(NULL, 0) \ # EXCNAME, \ @@ -447,9 +463,9 @@ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, \ PyDoc_STR(EXCDOC), (traverseproc)EXCSTORE ## _traverse, \ (inquiry)EXCSTORE ## _clear, 0, 0, 0, 0, EXCMETHODS, \ - EXCMEMBERS, 0, &_ ## EXCBASE, \ + EXCMEMBERS, EXCGETSET, &_ ## EXCBASE, \ 0, 0, 0, offsetof(Py ## EXCSTORE ## Object, dict), \ - (initproc)EXCSTORE ## _init, 0, BaseException_new,\ + (initproc)EXCSTORE ## _init, 0, EXCNEW,\ }; \ PyObject *PyExc_ ## EXCNAME = (PyObject *)&_PyExc_ ## EXCNAME @@ -534,7 +550,7 @@ }; ComplexExtendsException(PyExc_BaseException, SystemExit, SystemExit, - SystemExit_dealloc, 0, SystemExit_members, 0, + 0, 0, SystemExit_members, 0, 0, "Request to exit from the interpreter."); /* @@ -552,124 +568,233 @@ /* - * EnvironmentError extends Exception + * OSError extends Exception */ +#ifdef MS_WINDOWS +#include "errmap.h" +#endif + /* Where a function has a single filename, such as open() or some * of the os module functions, PyErr_SetFromErrnoWithFilename() is * called, giving a third argument which is the filename. But, so * that old code using in-place unpacking doesn't break, e.g.: * - * except IOError, (errno, strerror): + * except OSError, (errno, strerror): * * we hack args so that it only contains two items. This also * means we need our own __str__() which prints out the filename * when it was supplied. */ -static int -EnvironmentError_init(PyEnvironmentErrorObject *self, PyObject *args, - PyObject *kwds) + +static PyObject * +OSError_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { + PyOSErrorObject *self = NULL; + Py_ssize_t nargs; + PyObject *myerrno = NULL, *strerror = NULL, *filename = NULL; PyObject *subslice = NULL; +#ifdef MS_WINDOWS + PyObject *winerror = NULL; + long winerrcode = 0; +#endif - if (BaseException_init((PyBaseExceptionObject *)self, args, kwds) == -1) - return -1; + if (!_PyArg_NoKeywords(type->tp_name, kwds)) + return NULL; + Py_INCREF(args); + nargs = PyTuple_GET_SIZE(args); - if (PyTuple_GET_SIZE(args) <= 1 || PyTuple_GET_SIZE(args) > 3) { - return 0; +#ifdef MS_WINDOWS + if (nargs >= 2 && nargs <= 4) { + if (!PyArg_UnpackTuple(args, "OSError", 2, 4, + &myerrno, &strerror, &filename, &winerror)) + goto error; + if (winerror && PyLong_Check(winerror)) { + long errcode; + PyObject *newargs; + Py_ssize_t i; + + winerrcode = PyLong_AsLong(winerror); + if (winerrcode == -1 && PyErr_Occurred()) + goto error; + /* Set errno to the corresponding POSIX errno (overriding + first argument). Windows Socket error codes (>= 10000) + have the same value as their POSIX counterparts. + */ + if (winerrcode < 10000) + errcode = winerror_to_errno(winerrcode); + else + errcode = winerrcode; + myerrno = PyLong_FromLong(errcode); + if (!myerrno) + goto error; + newargs = PyTuple_New(nargs); + if (!newargs) + goto error; + PyTuple_SET_ITEM(newargs, 0, myerrno); + for (i = 1; i < nargs; i++) { + PyObject *val = PyTuple_GET_ITEM(args, i); + Py_INCREF(val); + PyTuple_SET_ITEM(newargs, i, val); + } + Py_DECREF(args); + args = newargs; + } + } +#else + if (nargs >= 2 && nargs <= 3) { + if (!PyArg_UnpackTuple(args, "OSError", 2, 3, + &myerrno, &strerror, &filename)) + goto error; + } +#endif + if (myerrno && PyLong_Check(myerrno) && + errnomap && (PyObject *) type == PyExc_OSError) { + PyObject *newtype; + newtype = PyDict_GetItem(errnomap, myerrno); + if (newtype) { + assert(PyType_Check(newtype)); + type = (PyTypeObject *) newtype; + } + else if (PyErr_Occurred()) + goto error; } - if (!PyArg_UnpackTuple(args, "EnvironmentError", 2, 3, - &myerrno, &strerror, &filename)) { - return -1; - } - Py_CLEAR(self->myerrno); /* replacing */ - self->myerrno = myerrno; - Py_INCREF(self->myerrno); + self = (PyOSErrorObject *) type->tp_alloc(type, 0); + if (!self) + goto error; - Py_CLEAR(self->strerror); /* replacing */ - self->strerror = strerror; - Py_INCREF(self->strerror); + self->dict = NULL; + self->traceback = self->cause = self->context = NULL; + self->written = -1; /* self->filename will remain Py_None otherwise */ - if (filename != NULL) { - Py_CLEAR(self->filename); /* replacing */ - self->filename = filename; - Py_INCREF(self->filename); + if (filename && filename != Py_None) { + if ((PyObject *) type == PyExc_BlockingIOError && + PyNumber_Check(filename)) { + /* BlockingIOError's 3rd argument can be the number of + * characters written. + */ + self->written = PyNumber_AsSsize_t(filename, PyExc_ValueError); + if (self->written == -1 && PyErr_Occurred()) + goto error; + } + else { + Py_INCREF(filename); + self->filename = filename; - subslice = PyTuple_GetSlice(args, 0, 2); - if (!subslice) - return -1; + if (nargs >= 2 && nargs <= 3) { + /* filename is removed from the args tuple (for compatibility + purposes, see test_exceptions.py) */ + subslice = PyTuple_GetSlice(args, 0, 2); + if (!subslice) + goto error; - Py_DECREF(self->args); /* replacing args */ - self->args = subslice; + Py_DECREF(args); /* replacing args */ + args = subslice; + } + } } + + /* Steals the reference to args */ + self->args = args; + args = NULL; + + Py_XINCREF(myerrno); + self->myerrno = myerrno; + + Py_XINCREF(strerror); + self->strerror = strerror; + +#ifdef MS_WINDOWS + Py_XINCREF(winerror); + self->winerror = winerror; +#endif + + return (PyObject *) self; + +error: + Py_XDECREF(args); + Py_XDECREF(self); + return NULL; +} + +static int +OSError_init(PySyntaxErrorObject *self, PyObject *args, PyObject *kwds) +{ + /* Everything already done in OSError_new */ return 0; } static int -EnvironmentError_clear(PyEnvironmentErrorObject *self) +OSError_clear(PyOSErrorObject *self) { Py_CLEAR(self->myerrno); Py_CLEAR(self->strerror); Py_CLEAR(self->filename); +#ifdef MS_WINDOWS + Py_CLEAR(self->winerror); +#endif return BaseException_clear((PyBaseExceptionObject *)self); } static void -EnvironmentError_dealloc(PyEnvironmentErrorObject *self) +OSError_dealloc(PyOSErrorObject *self) { _PyObject_GC_UNTRACK(self); - EnvironmentError_clear(self); + OSError_clear(self); Py_TYPE(self)->tp_free((PyObject *)self); } static int -EnvironmentError_traverse(PyEnvironmentErrorObject *self, visitproc visit, +OSError_traverse(PyOSErrorObject *self, visitproc visit, void *arg) { Py_VISIT(self->myerrno); Py_VISIT(self->strerror); Py_VISIT(self->filename); +#ifdef MS_WINDOWS + Py_VISIT(self->winerror); +#endif return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); } static PyObject * -EnvironmentError_str(PyEnvironmentErrorObject *self) +OSError_str(PyOSErrorObject *self) { +#ifdef MS_WINDOWS + /* If available, winerror has the priority over myerrno */ + if (self->winerror && self->filename) + return PyUnicode_FromFormat("[Error %S] %S: %R", + self->winerror ? self->winerror: Py_None, + self->strerror ? self->strerror: Py_None, + self->filename); + if (self->winerror && self->strerror) + return PyUnicode_FromFormat("[Error %S] %S", + self->winerror ? self->winerror: Py_None, + self->strerror ? self->strerror: Py_None); +#endif if (self->filename) return PyUnicode_FromFormat("[Errno %S] %S: %R", self->myerrno ? self->myerrno: Py_None, self->strerror ? self->strerror: Py_None, self->filename); - else if (self->myerrno && self->strerror) + if (self->myerrno && self->strerror) return PyUnicode_FromFormat("[Errno %S] %S", self->myerrno ? self->myerrno: Py_None, self->strerror ? self->strerror: Py_None); - else - return BaseException_str((PyBaseExceptionObject *)self); + return BaseException_str((PyBaseExceptionObject *)self); } -static PyMemberDef EnvironmentError_members[] = { - {"errno", T_OBJECT, offsetof(PyEnvironmentErrorObject, myerrno), 0, - PyDoc_STR("exception errno")}, - {"strerror", T_OBJECT, offsetof(PyEnvironmentErrorObject, strerror), 0, - PyDoc_STR("exception strerror")}, - {"filename", T_OBJECT, offsetof(PyEnvironmentErrorObject, filename), 0, - PyDoc_STR("exception filename")}, - {NULL} /* Sentinel */ -}; - - static PyObject * -EnvironmentError_reduce(PyEnvironmentErrorObject *self) +OSError_reduce(PyOSErrorObject *self) { PyObject *args = self->args; PyObject *res = NULL, *tmp; /* self->args is only the first two real arguments if there was a - * file name given to EnvironmentError. */ + * file name given to OSError. */ if (PyTuple_GET_SIZE(args) == 2 && self->filename) { args = PyTuple_New(3); if (!args) return NULL; @@ -695,144 +820,93 @@ return res; } +static PyObject * +OSError_written_get(PyOSErrorObject *self, void *context) +{ + if (self->written == -1) { + PyErr_SetString(PyExc_AttributeError, "characters_written"); + return NULL; + } + return PyLong_FromSsize_t(self->written); +} -static PyMethodDef EnvironmentError_methods[] = { - {"__reduce__", (PyCFunction)EnvironmentError_reduce, METH_NOARGS}, +static int +OSError_written_set(PyOSErrorObject *self, PyObject *arg, void *context) +{ + Py_ssize_t n; + n = PyNumber_AsSsize_t(arg, PyExc_ValueError); + if (n == -1 && PyErr_Occurred()) + return -1; + self->written = n; + return 0; +} + +static PyMemberDef OSError_members[] = { + {"errno", T_OBJECT, offsetof(PyOSErrorObject, myerrno), 0, + PyDoc_STR("POSIX exception code")}, + {"strerror", T_OBJECT, offsetof(PyOSErrorObject, strerror), 0, + PyDoc_STR("exception strerror")}, + {"filename", T_OBJECT, offsetof(PyOSErrorObject, filename), 0, + PyDoc_STR("exception filename")}, +#ifdef MS_WINDOWS + {"winerror", T_OBJECT, offsetof(PyOSErrorObject, winerror), 0, + PyDoc_STR("Win32 exception code")}, +#endif + {NULL} /* Sentinel */ +}; + +static PyMethodDef OSError_methods[] = { + {"__reduce__", (PyCFunction)OSError_reduce, METH_NOARGS}, {NULL} }; -ComplexExtendsException(PyExc_Exception, EnvironmentError, - EnvironmentError, EnvironmentError_dealloc, - EnvironmentError_methods, EnvironmentError_members, - EnvironmentError_str, +static PyGetSetDef OSError_getset[] = { + {"characters_written", (getter) OSError_written_get, + (setter) OSError_written_set, NULL}, + {NULL} +}; + + +ComplexExtendsException(PyExc_Exception, OSError, + OSError, OSError_new, + OSError_methods, OSError_members, OSError_getset, + OSError_str, "Base class for I/O related errors."); /* - * IOError extends EnvironmentError + * Various OSError subclasses */ -MiddlingExtendsException(PyExc_EnvironmentError, IOError, - EnvironmentError, "I/O operation failed."); - - -/* - * OSError extends EnvironmentError - */ -MiddlingExtendsException(PyExc_EnvironmentError, OSError, - EnvironmentError, "OS system call failed."); - - -/* - * WindowsError extends OSError - */ -#ifdef MS_WINDOWS -#include "errmap.h" - -static int -WindowsError_clear(PyWindowsErrorObject *self) -{ - Py_CLEAR(self->myerrno); - Py_CLEAR(self->strerror); - Py_CLEAR(self->filename); - Py_CLEAR(self->winerror); - return BaseException_clear((PyBaseExceptionObject *)self); -} - -static void -WindowsError_dealloc(PyWindowsErrorObject *self) -{ - _PyObject_GC_UNTRACK(self); - WindowsError_clear(self); - Py_TYPE(self)->tp_free((PyObject *)self); -} - -static int -WindowsError_traverse(PyWindowsErrorObject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->myerrno); - Py_VISIT(self->strerror); - Py_VISIT(self->filename); - Py_VISIT(self->winerror); - return BaseException_traverse((PyBaseExceptionObject *)self, visit, arg); -} - -static int -WindowsError_init(PyWindowsErrorObject *self, PyObject *args, PyObject *kwds) -{ - PyObject *o_errcode = NULL; - long errcode; - long posix_errno; - - if (EnvironmentError_init((PyEnvironmentErrorObject *)self, args, kwds) - == -1) - return -1; - - if (self->myerrno == NULL) - return 0; - - /* Set errno to the POSIX errno, and winerror to the Win32 - error code. */ - errcode = PyLong_AsLong(self->myerrno); - if (errcode == -1 && PyErr_Occurred()) - return -1; - posix_errno = winerror_to_errno(errcode); - - Py_CLEAR(self->winerror); - self->winerror = self->myerrno; - - o_errcode = PyLong_FromLong(posix_errno); - if (!o_errcode) - return -1; - - self->myerrno = o_errcode; - - return 0; -} - - -static PyObject * -WindowsError_str(PyWindowsErrorObject *self) -{ - if (self->filename) - return PyUnicode_FromFormat("[Error %S] %S: %R", - self->winerror ? self->winerror: Py_None, - self->strerror ? self->strerror: Py_None, - self->filename); - else if (self->winerror && self->strerror) - return PyUnicode_FromFormat("[Error %S] %S", - self->winerror ? self->winerror: Py_None, - self->strerror ? self->strerror: Py_None); - else - return EnvironmentError_str((PyEnvironmentErrorObject *)self); -} - -static PyMemberDef WindowsError_members[] = { - {"errno", T_OBJECT, offsetof(PyWindowsErrorObject, myerrno), 0, - PyDoc_STR("POSIX exception code")}, - {"strerror", T_OBJECT, offsetof(PyWindowsErrorObject, strerror), 0, - PyDoc_STR("exception strerror")}, - {"filename", T_OBJECT, offsetof(PyWindowsErrorObject, filename), 0, - PyDoc_STR("exception filename")}, - {"winerror", T_OBJECT, offsetof(PyWindowsErrorObject, winerror), 0, - PyDoc_STR("Win32 exception code")}, - {NULL} /* Sentinel */ -}; - -ComplexExtendsException(PyExc_OSError, WindowsError, WindowsError, - WindowsError_dealloc, 0, WindowsError_members, - WindowsError_str, "MS-Windows OS system call failed."); - -#endif /* MS_WINDOWS */ - - -/* - * VMSError extends OSError (I think) - */ -#ifdef __VMS -MiddlingExtendsException(PyExc_OSError, VMSError, EnvironmentError, - "OpenVMS OS system call failed."); -#endif - +MiddlingExtendsException(PyExc_OSError, BlockingIOError, OSError, + "I/O operation would block."); +MiddlingExtendsException(PyExc_OSError, ConnectionError, OSError, + "Connection error."); +MiddlingExtendsException(PyExc_OSError, ChildProcessError, OSError, + "Child process error."); +MiddlingExtendsException(PyExc_ConnectionError, BrokenPipeError, OSError, + "Broken pipe."); +MiddlingExtendsException(PyExc_ConnectionError, ConnectionAbortedError, OSError, + "Connection aborted."); +MiddlingExtendsException(PyExc_ConnectionError, ConnectionRefusedError, OSError, + "Connection refused."); +MiddlingExtendsException(PyExc_ConnectionError, ConnectionResetError, OSError, + "Connection reset."); +MiddlingExtendsException(PyExc_OSError, FileExistsError, OSError, + "File already exists."); +MiddlingExtendsException(PyExc_OSError, FileNotFoundError, OSError, + "File not found."); +MiddlingExtendsException(PyExc_OSError, IsADirectoryError, OSError, + "Operation doesn't work on directories."); +MiddlingExtendsException(PyExc_OSError, NotADirectoryError, OSError, + "Operation only works on directories."); +MiddlingExtendsException(PyExc_OSError, InterruptedError, OSError, + "Interrupted by signal."); +MiddlingExtendsException(PyExc_OSError, PermissionError, OSError, + "Not enough permissions."); +MiddlingExtendsException(PyExc_OSError, ProcessLookupError, OSError, + "Process not found."); +MiddlingExtendsException(PyExc_OSError, TimeoutError, OSError, + "Timeout expired."); /* * EOFError extends Exception @@ -1046,7 +1120,7 @@ }; ComplexExtendsException(PyExc_Exception, SyntaxError, SyntaxError, - SyntaxError_dealloc, 0, SyntaxError_members, + 0, 0, SyntaxError_members, 0, SyntaxError_str, "Invalid syntax."); @@ -1100,7 +1174,7 @@ } ComplexExtendsException(PyExc_LookupError, KeyError, BaseException, - 0, 0, 0, KeyError_str, "Mapping key not found."); + 0, 0, 0, 0, KeyError_str, "Mapping key not found."); /* @@ -1977,6 +2051,45 @@ if (PyDict_SetItemString(bdict, # TYPE, PyExc_ ## TYPE)) \ Py_FatalError("Module dictionary insertion problem."); +#define INIT_ALIAS(NAME, TYPE) Py_INCREF(PyExc_ ## TYPE); \ + PyExc_ ## NAME = PyExc_ ## TYPE; \ + if (PyDict_SetItemString(bdict, # NAME, PyExc_ ## NAME)) \ + Py_FatalError("Module dictionary insertion problem."); + +#define ADD_ERRNO(TYPE, CODE) { \ + PyObject *_code = PyLong_FromLong(CODE); \ + assert(_PyObject_RealIsSubclass(PyExc_ ## TYPE, PyExc_OSError)); \ + if (!_code || PyDict_SetItem(errnomap, _code, PyExc_ ## TYPE)) \ + Py_FatalError("errmap insertion problem."); \ + } + +#ifdef MS_WINDOWS +#include +#if defined(WSAEALREADY) && !defined(EALREADY) +#define EALREADY WSAEALREADY +#endif +#if defined(WSAECONNABORTED) && !defined(ECONNABORTED) +#define ECONNABORTED WSAECONNABORTED +#endif +#if defined(WSAECONNREFUSED) && !defined(ECONNREFUSED) +#define ECONNREFUSED WSAECONNREFUSED +#endif +#if defined(WSAECONNRESET) && !defined(ECONNRESET) +#define ECONNRESET WSAECONNRESET +#endif +#if defined(WSAEINPROGRESS) && !defined(EINPROGRESS) +#define EINPROGRESS WSAEINPROGRESS +#endif +#if defined(WSAESHUTDOWN) && !defined(ESHUTDOWN) +#define ESHUTDOWN WSAESHUTDOWN +#endif +#if defined(WSAETIMEDOUT) && !defined(ETIMEDOUT) +#define ETIMEDOUT WSAETIMEDOUT +#endif +#if defined(WSAEWOULDBLOCK) && !defined(EWOULDBLOCK) +#define EWOULDBLOCK WSAEWOULDBLOCK +#endif +#endif /* MS_WINDOWS */ void _PyExc_Init(void) @@ -1991,15 +2104,7 @@ PRE_INIT(SystemExit) PRE_INIT(KeyboardInterrupt) PRE_INIT(ImportError) - PRE_INIT(EnvironmentError) - PRE_INIT(IOError) PRE_INIT(OSError) -#ifdef MS_WINDOWS - PRE_INIT(WindowsError) -#endif -#ifdef __VMS - PRE_INIT(VMSError) -#endif PRE_INIT(EOFError) PRE_INIT(RuntimeError) PRE_INIT(NotImplementedError) @@ -2039,6 +2144,24 @@ PRE_INIT(BytesWarning) PRE_INIT(ResourceWarning) + /* OSError subclasses */ + PRE_INIT(ConnectionError); + + PRE_INIT(BlockingIOError); + PRE_INIT(BrokenPipeError); + PRE_INIT(ChildProcessError); + PRE_INIT(ConnectionAbortedError); + PRE_INIT(ConnectionRefusedError); + PRE_INIT(ConnectionResetError); + PRE_INIT(FileExistsError); + PRE_INIT(FileNotFoundError); + PRE_INIT(IsADirectoryError); + PRE_INIT(NotADirectoryError); + PRE_INIT(InterruptedError); + PRE_INIT(PermissionError); + PRE_INIT(ProcessLookupError); + PRE_INIT(TimeoutError); + bltinmod = PyImport_ImportModule("builtins"); if (bltinmod == NULL) Py_FatalError("exceptions bootstrapping error."); @@ -2054,14 +2177,14 @@ POST_INIT(SystemExit) POST_INIT(KeyboardInterrupt) POST_INIT(ImportError) - POST_INIT(EnvironmentError) - POST_INIT(IOError) POST_INIT(OSError) + INIT_ALIAS(EnvironmentError, OSError) + INIT_ALIAS(IOError, OSError) #ifdef MS_WINDOWS - POST_INIT(WindowsError) + INIT_ALIAS(WindowsError, OSError) #endif #ifdef __VMS - POST_INIT(VMSError) + INIT_ALIAS(VMSError, OSError) #endif POST_INIT(EOFError) POST_INIT(RuntimeError) @@ -2102,6 +2225,47 @@ POST_INIT(BytesWarning) POST_INIT(ResourceWarning) + errnomap = PyDict_New(); + if (!errnomap) + Py_FatalError("Cannot allocate map from errnos to OSError subclasses"); + + /* OSError subclasses */ + POST_INIT(ConnectionError); + + POST_INIT(BlockingIOError); + ADD_ERRNO(BlockingIOError, EAGAIN); + ADD_ERRNO(BlockingIOError, EALREADY); + ADD_ERRNO(BlockingIOError, EINPROGRESS); + ADD_ERRNO(BlockingIOError, EWOULDBLOCK); + POST_INIT(BrokenPipeError); + ADD_ERRNO(BrokenPipeError, EPIPE); + ADD_ERRNO(BrokenPipeError, ESHUTDOWN); + POST_INIT(ChildProcessError); + ADD_ERRNO(ChildProcessError, ECHILD); + POST_INIT(ConnectionAbortedError); + ADD_ERRNO(ConnectionAbortedError, ECONNABORTED); + POST_INIT(ConnectionRefusedError); + ADD_ERRNO(ConnectionRefusedError, ECONNREFUSED); + POST_INIT(ConnectionResetError); + ADD_ERRNO(ConnectionResetError, ECONNRESET); + POST_INIT(FileExistsError); + ADD_ERRNO(FileExistsError, EEXIST); + POST_INIT(FileNotFoundError); + ADD_ERRNO(FileNotFoundError, ENOENT); + POST_INIT(IsADirectoryError); + ADD_ERRNO(IsADirectoryError, EISDIR); + POST_INIT(NotADirectoryError); + ADD_ERRNO(NotADirectoryError, ENOTDIR); + POST_INIT(InterruptedError); + ADD_ERRNO(InterruptedError, EINTR); + POST_INIT(PermissionError); + ADD_ERRNO(PermissionError, EACCES); + ADD_ERRNO(PermissionError, EPERM); + POST_INIT(ProcessLookupError); + ADD_ERRNO(ProcessLookupError, ESRCH); + POST_INIT(TimeoutError); + ADD_ERRNO(TimeoutError, ETIMEDOUT); + preallocate_memerrors(); PyExc_RecursionErrorInst = BaseException_new(&_PyExc_RuntimeError, NULL, NULL); @@ -2135,4 +2299,5 @@ { Py_CLEAR(PyExc_RecursionErrorInst); free_preallocated_memerrors(); + Py_CLEAR(errnomap); } diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -496,10 +496,11 @@ return NULL; } - if (filenameObject != NULL) - v = Py_BuildValue("(iOO)", err, message, filenameObject); - else - v = Py_BuildValue("(iO)", err, message); + if (filenameObject == NULL) + filenameObject = Py_None; + /* This is the constructor signature for passing a Windows error code. + The POSIX translation will be figured out by the constructor. */ + v = Py_BuildValue("(iOOi)", 0, message, filenameObject, err); Py_DECREF(message); if (v != NULL) { -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 12 05:27:33 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 12 Oct 2011 05:27:33 +0200 Subject: [Python-checkins] Daily reference leaks (41a1de81ef2b): sum=0 Message-ID: results for 41a1de81ef2b on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogctYAZO', '-x'] From python-checkins at python.org Wed Oct 12 16:05:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 16:05:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_exceptions_doc_for_P?= =?utf8?q?EP_3151?= Message-ID: http://hg.python.org/cpython/rev/097f4fda61a4 changeset: 72880:097f4fda61a4 user: Antoine Pitrou date: Wed Oct 12 16:02:00 2011 +0200 summary: Update exceptions doc for PEP 3151 files: Doc/library/exceptions.rst | 201 ++++++++++++++++++------ 1 files changed, 145 insertions(+), 56 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -34,6 +34,10 @@ defining exceptions is available in the Python Tutorial under :ref:`tut-userexceptions`. + +Base classes +------------ + The following exceptions are used mostly as base classes for other exceptions. .. exception:: BaseException @@ -90,27 +94,8 @@ can be raised directly by :func:`codecs.lookup`. -.. exception:: EnvironmentError - - The base class for exceptions that can occur outside the Python system: - :exc:`IOError`, :exc:`OSError`. When exceptions of this type are created with a - 2-tuple, the first item is available on the instance's :attr:`errno` attribute - (it is assumed to be an error number), and the second item is available on the - :attr:`strerror` attribute (it is usually the associated error message). The - tuple itself is also available on the :attr:`args` attribute. - - When an :exc:`EnvironmentError` exception is instantiated with a 3-tuple, the - first two items are available as above, while the third item is available on the - :attr:`filename` attribute. However, for backwards compatibility, the - :attr:`args` attribute contains only a 2-tuple of the first two constructor - arguments. - - The :attr:`filename` attribute is ``None`` when this exception is created with - other than 3 arguments. The :attr:`errno` and :attr:`strerror` attributes are - also ``None`` when the instance was created with other than 2 or 3 arguments. - In this last case, :attr:`args` contains the verbatim constructor arguments as a - tuple. - +Concrete exceptions +------------------- The following exceptions are the exceptions that are usually raised. @@ -151,16 +136,6 @@ it is technically not an error. -.. exception:: IOError - - Raised when an I/O operation (such as the built-in :func:`print` or - :func:`open` functions or a method of a :term:`file object`) fails for an - I/O-related reason, e.g., "file not found" or "disk full". - - This class is derived from :exc:`EnvironmentError`. See the discussion above - for more information on exception instance attributes. - - .. exception:: ImportError Raised when an :keyword:`import` statement fails to find the module definition @@ -221,17 +196,25 @@ .. index:: module: errno - This exception is derived from :exc:`EnvironmentError`. It is raised when a - function returns a system-related error (not for illegal argument types or - other incidental errors). The :attr:`errno` attribute is a numeric error - code from :c:data:`errno`, and the :attr:`strerror` attribute is the - corresponding string, as would be printed by the C function :c:func:`perror`. - See the module :mod:`errno`, which contains names for the error codes defined - by the underlying operating system. + This exception is raised when a system function returns a system-related + error, including I/O failures such as "file not found" or "disk full" + (not for illegal argument types or other incidental errors). Often a + subclass of :exc:`OSError` will actually be raised as described in + `OS exceptions`_ below. The :attr:`errno` attribute is a numeric error + code from the C variable :c:data:`errno`. - For exceptions that involve a file system path (such as :func:`chdir` or - :func:`unlink`), the exception instance will contain a third attribute, - :attr:`filename`, which is the file name passed to the function. + Under Windows, the :attr:`winerror` attribute gives you the native + Windows error code. The :attr:`errno` attribute is then an approximate + translation, in POSIX terms, of that native error code. + + Under all platforms, the :attr:`strerror` attribute is the corresponding + error message as provided by the operating system (as formatted by the C + functions :c:func:`perror` under POSIX, and :c:func:`FormatMessage` + Windows). + + For exceptions that involve a file system path (such as :func:`open` or + :func:`os.unlink`), the exception instance will contain an additional + attribute, :attr:`filename`, which is the file name passed to the function. .. exception:: OverflowError @@ -372,21 +355,6 @@ more precise exception such as :exc:`IndexError`. -.. exception:: VMSError - - Only available on VMS. Raised when a VMS-specific error occurs. - - -.. exception:: WindowsError - - Raised when a Windows-specific error occurs or when the error number does not - correspond to an :c:data:`errno` value. The :attr:`winerror` and - :attr:`strerror` values are created from the return values of the - :c:func:`GetLastError` and :c:func:`FormatMessage` functions from the Windows - Platform API. The :attr:`errno` value maps the :attr:`winerror` value to - corresponding ``errno.h`` values. This is a subclass of :exc:`OSError`. - - .. exception:: ZeroDivisionError Raised when the second argument of a division or modulo operation is zero. The @@ -394,6 +362,127 @@ operation. +The following exceptions are kept for compatibility with previous versions; +starting from Python 3.3, they are aliases of :exc:`OSError`. + +.. exception:: EnvironmentError + +.. exception:: IOError + +.. exception:: VMSError + + Only available on VMS. + +.. exception:: WindowsError + + Only available on Windows. + + +OS exceptions +^^^^^^^^^^^^^ + +The following exceptions are subclasses of :exc:`OSError`, they get raised +depending on the system error code. + +.. exception:: BlockingIOError + + Raised when an operation would block on an object (e.g. socket) set + for non-blocking operation. + Corresponds to :c:data:`errno` ``EAGAIN``, ``EALREADY``, + ``EWOULDBLOCK`` and ``EINPROGRESS``. + +.. exception:: ChildProcessError + + Raised when an operation on a child process failed. + Corresponds to :c:data:`errno` ``ECHILD``. + +.. exception:: ConnectionError + + A base class for connection-related issues. Subclasses are + :exc:`BrokenPipeError`, :exc:`ConnectionAbortedError`, + :exc:`ConnectionRefusedError` and :exc:`ConnectionResetError`. + + .. exception:: BrokenPipeError + + A subclass of :exc:`ConnectionError`, raised when trying to write on a + pipe while the other end has been closed, or trying to write on a socket + which has been shutdown for writing. + Corresponds to :c:data:`errno` ``EPIPE`` and ``ESHUTDOWN``. + + .. exception:: ConnectionAbortedError + + A subclass of :exc:`ConnectionError`, raised when a connection attempt + is aborted by the peer. + Corresponds to :c:data:`errno` ``ECONNABORTED``. + + .. exception:: ConnectionRefusedError + + A subclass of :exc:`ConnectionError`, raised when a connection attempt + is refused by the peer. + Corresponds to :c:data:`errno` ``ECONNREFUSED``. + + .. exception:: ConnectionResetError + + A subclass of :exc:`ConnectionError`, raised when a connection is + reset by the peer. + Corresponds to :c:data:`errno` ``ECONNRESET``. + +.. exception:: FileExistsError + + Raised when trying to create a file or directory which already exists. + Corresponds to :c:data:`errno` ``EEXIST``. + +.. exception:: FileNotFoundError + + Raised when a file or directory is requested but doesn't exist. + Corresponds to :c:data:`errno` ``ENOENT``. + +.. exception:: InterruptedError + + Raised when a system call is interrupted by an incoming signal. + Corresponds to :c:data:`errno` ``EEINTR``. + +.. exception:: IsADirectoryError + + Raised when a file operation (such as :func:`os.remove`) is requested + on a directory. + Corresponds to :c:data:`errno` ``EISDIR``. + +.. exception:: NotADirectoryError + + Raised when a directory operation (such as :func:`os.listdir`) is requested + on something which is not a directory. + Corresponds to :c:data:`errno` ``ENOTDIR``. + +.. exception:: PermissionError + + Raised when trying to run an operation without the adequate access + rights - for example filesystem permissions. + Corresponds to :c:data:`errno` ``EACCES`` and ``EPERM``. + +.. exception:: ProcessLookupError + + Raised when a given process doesn't exist. + Corresponds to :c:data:`errno` ``ESRCH``. + +.. exception:: TimeoutError + + Raised when a system function timed out at the system level. + Corresponds to :c:data:`errno` ``ETIMEDOUT``. + +.. versionadded:: 3.3 + All the above :exc:`OSError` subclasses were added. + + +.. seealso:: + + :pep:`3151` - Reworking the OS and IO exception hierarchy + PEP written and implemented by Antoine Pitrou. + + +Warnings +-------- + The following exceptions are used as warning categories; see the :mod:`warnings` module for more information. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 16:27:26 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 16:27:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Minimal_update_of_socket_do?= =?utf8?q?cs_for_PEP_3151=2E?= Message-ID: http://hg.python.org/cpython/rev/469c63c29b03 changeset: 72881:469c63c29b03 user: Antoine Pitrou date: Wed Oct 12 16:20:53 2011 +0200 summary: Minimal update of socket docs for PEP 3151. More editing is probably desirable. files: Doc/library/socket.rst | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -120,20 +120,15 @@ .. exception:: error - .. index:: module: errno + A deprecated alias of :exc:`OSError`. - A subclass of :exc:`IOError`, this exception is raised for socket-related - errors. It is recommended that you inspect its ``errno`` attribute to - discriminate between different kinds of errors. - - .. seealso:: - The :mod:`errno` module contains symbolic names for the error codes - defined by the underlying operating system. + .. versionchanged:: 3.3 + Following :pep:`3151`, this class was made an alias of :exc:`OSError`. .. exception:: herror - A subclass of :exc:`socket.error`, this exception is raised for + A subclass of :exc:`OSError`, this exception is raised for address-related errors, i.e. for functions that use *h_errno* in the POSIX C API, including :func:`gethostbyname_ex` and :func:`gethostbyaddr`. The accompanying value is a pair ``(h_errno, string)`` representing an @@ -141,10 +136,12 @@ *string* represents the description of *h_errno*, as returned by the :c:func:`hstrerror` C function. + .. versionchanged:: 3.3 + This class was made a subclass of :exc:`OSError`. .. exception:: gaierror - A subclass of :exc:`socket.error`, this exception is raised for + A subclass of :exc:`OSError`, this exception is raised for address-related errors by :func:`getaddrinfo` and :func:`getnameinfo`. The accompanying value is a pair ``(error, string)`` representing an error returned by a library call. *string* represents the description of @@ -152,15 +149,19 @@ numeric *error* value will match one of the :const:`EAI_\*` constants defined in this module. + .. versionchanged:: 3.3 + This class was made a subclass of :exc:`OSError`. .. exception:: timeout - A subclass of :exc:`socket.error`, this exception is raised when a timeout + A subclass of :exc:`OSError`, this exception is raised when a timeout occurs on a socket which has had timeouts enabled via a prior call to :meth:`~socket.settimeout` (or implicitly through :func:`~socket.setdefaulttimeout`). The accompanying value is a string whose value is currently always "timed out". + .. versionchanged:: 3.3 + This class was made a subclass of :exc:`OSError`. .. data:: AF_UNIX AF_INET -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 16:27:27 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 16:27:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Minimal_update_of_select_do?= =?utf8?q?cs_for_PEP_3151=2E?= Message-ID: http://hg.python.org/cpython/rev/4b107d9903a6 changeset: 72882:4b107d9903a6 user: Antoine Pitrou date: Wed Oct 12 16:23:02 2011 +0200 summary: Minimal update of select docs for PEP 3151. files: Doc/library/select.rst | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Doc/library/select.rst b/Doc/library/select.rst --- a/Doc/library/select.rst +++ b/Doc/library/select.rst @@ -18,9 +18,10 @@ .. exception:: error - The exception raised when an error occurs. The accompanying value is a pair - containing the numeric error code from :c:data:`errno` and the corresponding - string, as would be printed by the C function :c:func:`perror`. + A deprecated alias of :exc:`OSError`. + + .. versionchanged:: 3.3 + Following :pep:`3151`, this class was made an alias of :exc:`OSError`. .. function:: epoll(sizehint=-1) @@ -165,11 +166,6 @@ Register a fd descriptor with the epoll object. - .. note:: - - Registering a file descriptor that's already registered raises an - IOError -- contrary to :ref:`poll-objects`'s register. - .. method:: epoll.modify(fd, eventmask) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 16:50:32 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 16:50:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Mention_the_merging_of_othe?= =?utf8?q?r_exceptions_into_OSError=2E?= Message-ID: http://hg.python.org/cpython/rev/6f0af77d4efd changeset: 72883:6f0af77d4efd user: Antoine Pitrou date: Wed Oct 12 16:46:46 2011 +0200 summary: Mention the merging of other exceptions into OSError. files: Doc/library/exceptions.rst | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -216,6 +216,11 @@ :func:`os.unlink`), the exception instance will contain an additional attribute, :attr:`filename`, which is the file name passed to the function. + .. versionchanged:: 3.3 + :exc:`EnvironmentError`, :exc:`IOError`, :exc:`WindowsError`, + :exc:`VMSError`, :exc:`socket.error`, :exc:`select.error` and + :exc:`mmap.error` have been merged into :exc:`OSError`. + .. exception:: OverflowError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 17:57:30 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 17:57:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_mentions_of_socket?= =?utf8?q?=2Eerror=2E?= Message-ID: http://hg.python.org/cpython/rev/aeff792ea043 changeset: 72884:aeff792ea043 user: Antoine Pitrou date: Wed Oct 12 17:53:43 2011 +0200 summary: Replace mentions of socket.error. files: Doc/library/ftplib.rst | 3 +- Doc/library/socket.rst | 35 ++++++++++++----------- Doc/library/ssl.rst | 8 +++-- Doc/library/telnetlib.rst | 6 +++- Doc/library/urllib.error.rst | 3 +- 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -144,8 +144,7 @@ The set of all exceptions (as a tuple) that methods of :class:`FTP` instances may raise as a result of problems with the FTP connection (as opposed to programming errors made by the caller). This set includes the - four exceptions listed above as well as :exc:`socket.error` and - :exc:`IOError`. + four exceptions listed above as well as :exc:`OSError`. .. seealso:: diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -104,8 +104,9 @@ numeric address in *host* portion. All errors raise exceptions. The normal exceptions for invalid argument types -and out-of-memory conditions can be raised; errors related to socket or address -semantics raise :exc:`socket.error` or one of its subclasses. +and out-of-memory conditions can be raised; starting from Python 3.3, errors +related to socket or address semantics raise :exc:`OSError` or one of its +subclasses (they used to raise :exc:`socket.error`). Non-blocking mode is supported through :meth:`~socket.setblocking`. A generalization of this based on timeouts is supported through @@ -481,7 +482,7 @@ Unix manual page :manpage:`inet(3)` for details. If the IPv4 address string passed to this function is invalid, - :exc:`socket.error` will be raised. Note that exactly what is valid depends on + :exc:`OSError` will be raised. Note that exactly what is valid depends on the underlying C implementation of :c:func:`inet_aton`. :func:`inet_aton` does not support IPv6, and :func:`inet_pton` should be used @@ -498,7 +499,7 @@ argument. If the byte sequence passed to this function is not exactly 4 bytes in - length, :exc:`socket.error` will be raised. :func:`inet_ntoa` does not + length, :exc:`OSError` will be raised. :func:`inet_ntoa` does not support IPv6, and :func:`inet_ntop` should be used instead for IPv4/v6 dual stack support. @@ -512,7 +513,7 @@ Supported values for *address_family* are currently :const:`AF_INET` and :const:`AF_INET6`. If the IP address string *ip_string* is invalid, - :exc:`socket.error` will be raised. Note that exactly what is valid depends on + :exc:`OSError` will be raised. Note that exactly what is valid depends on both the value of *address_family* and the underlying implementation of :c:func:`inet_pton`. @@ -530,7 +531,7 @@ Supported values for *address_family* are currently :const:`AF_INET` and :const:`AF_INET6`. If the string *packed_ip* is not the correct length for the specified address family, :exc:`ValueError` will be raised. A - :exc:`socket.error` is raised for errors from the call to :func:`inet_ntop`. + :exc:`OSError` is raised for errors from the call to :func:`inet_ntop`. Availability: Unix (maybe not all platforms). @@ -596,7 +597,7 @@ .. function:: sethostname(name) Set the machine's hostname to *name*. This will raise a - :exc:`socket.error` if you don't have enough rights. + :exc:`OSError` if you don't have enough rights. Availability: Unix. @@ -607,7 +608,7 @@ Return a list of network interface information (index int, name string) tuples. - :exc:`socket.error` if the system call fails. + :exc:`OSError` if the system call fails. Availability: Unix. @@ -618,7 +619,7 @@ Return a network interface index number corresponding to an interface name. - :exc:`socket.error` if no interface with the given name exists. + :exc:`OSError` if no interface with the given name exists. Availability: Unix. @@ -629,7 +630,7 @@ Return a network interface name corresponding to a interface index number. - :exc:`socket.error` if no interface with the given index exists. + :exc:`OSError` if no interface with the given index exists. Availability: Unix. @@ -1182,13 +1183,13 @@ af, socktype, proto, canonname, sa = res try: s = socket.socket(af, socktype, proto) - except socket.error as msg: + except OSError as msg: s = None continue try: s.bind(sa) s.listen(1) - except socket.error as msg: + except OSError as msg: s.close() s = None continue @@ -1217,12 +1218,12 @@ af, socktype, proto, canonname, sa = res try: s = socket.socket(af, socktype, proto) - except socket.error as msg: + except OSError as msg: s = None continue try: s.connect(sa) - except socket.error as msg: + except OSError as msg: s.close() s = None continue @@ -1294,18 +1295,18 @@ try: s.send(cf) - except socket.error: + except OSError: print('Error sending CAN frame') try: s.send(build_can_frame(0x01, b'\x01\x02\x03')) - except socket.error: + except OSError: print('Error sending CAN frame') Running an example several times with too small delay between executions, could lead to this error:: - socket.error: [Errno 98] Address already in use + OSError: [Errno 98] Address already in use This is because the previous execution has left the socket in a ``TIME_WAIT`` state, and can't be immediately reused. diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -53,9 +53,11 @@ (currently provided by the OpenSSL library). This signifies some problem in the higher-level encryption and authentication layer that's superimposed on the underlying network connection. This error - is a subtype of :exc:`socket.error`, which in turn is a subtype of - :exc:`IOError`. The error code and message of :exc:`SSLError` instances - are provided by the OpenSSL library. + is a subtype of :exc:`OSError`. The error code and message of + :exc:`SSLError` instances are provided by the OpenSSL library. + + .. versionchanged:: 3.3 + :exc:`SSLError` used to be a subtype of :exc:`socket.error`. .. exception:: CertificateError diff --git a/Doc/library/telnetlib.rst b/Doc/library/telnetlib.rst --- a/Doc/library/telnetlib.rst +++ b/Doc/library/telnetlib.rst @@ -162,9 +162,13 @@ .. method:: Telnet.write(buffer) Write a byte string to the socket, doubling any IAC characters. This can - block if the connection is blocked. May raise :exc:`socket.error` if the + block if the connection is blocked. May raise :exc:`OSError` if the connection is closed. + .. versionchanged:: 3.3 + This method used to raise :exc:`socket.error`, which is now an alias + of :exc:`OSError`. + .. method:: Telnet.interact() diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst --- a/Doc/library/urllib.error.rst +++ b/Doc/library/urllib.error.rst @@ -21,8 +21,7 @@ .. attribute:: reason The reason for this error. It can be a message string or another - exception instance (:exc:`socket.error` for remote URLs, :exc:`OSError` - for local URLs). + exception instance such as :exc:`OSError`. .. exception:: HTTPError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Make_C_code_in_one_test_?= =?utf8?q?comply_with_ISO_C_=28=2310359=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/f71a4e230f20 changeset: 1206:f71a4e230f20 parent: 1204:3749fcae0dce user: ?ric Araujo date: Fri Oct 07 23:14:35 2011 +0200 summary: Make C code in one test comply with ISO C (#10359). Patch by Hallvard B Furuseth. files: distutils2/tests/test_command_config.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/distutils2/tests/test_command_config.py b/distutils2/tests/test_command_config.py --- a/distutils2/tests/test_command_config.py +++ b/distutils2/tests/test_command_config.py @@ -32,10 +32,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Synchronize_test=5Fconfi?= =?utf8?q?gure?= Message-ID: http://hg.python.org/distutils2/rev/0d838447c4ab changeset: 1207:0d838447c4ab user: ?ric Araujo date: Sat Oct 08 03:54:09 2011 +0200 summary: Synchronize test_configure files: distutils2/_backport/tests/test_sysconfig.py | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/distutils2/_backport/tests/test_sysconfig.py b/distutils2/_backport/tests/test_sysconfig.py --- a/distutils2/_backport/tests/test_sysconfig.py +++ b/distutils2/_backport/tests/test_sysconfig.py @@ -3,7 +3,6 @@ import subprocess import shutil from copy import copy -from ConfigParser import RawConfigParser from StringIO import StringIO from distutils2._backport import sysconfig @@ -261,8 +260,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28python3=29=3A_Fix_byte-c?= =?utf8?q?ompilation_to_comply_with_PEP_3147_on_Python_3=2E2+_=28=2311254?= =?utf8?b?KS4=?= Message-ID: http://hg.python.org/distutils2/rev/7a875901c205 changeset: 1208:7a875901c205 branch: python3 parent: 1205:b9f449eb1e36 user: ?ric Araujo date: Sat Oct 08 03:51:57 2011 +0200 summary: Fix byte-compilation to comply with PEP 3147 on Python 3.2+ (#11254). I want to replace custom byte-compiling function with calls to compileall before 1.0, but in the short term it?s good to have this fixed. Adapted from the distutils patch by Jeff Ramnani. Tested with -B, -O and -OO on 3.1, 3.2 and 3.3. files: distutils2/tests/test_command_build_py.py | 15 ++++++++-- distutils2/tests/test_command_install_lib.py | 14 +++++++-- distutils2/util.py | 15 ++++++++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/distutils2/tests/test_command_build_py.py b/distutils2/tests/test_command_build_py.py --- a/distutils2/tests/test_command_build_py.py +++ b/distutils2/tests/test_command_build_py.py @@ -2,6 +2,7 @@ import os import sys +import imp from distutils2.command.build_py import build_py from distutils2.dist import Distribution @@ -58,13 +59,21 @@ self.assertEqual(len(cmd.get_outputs()), 3) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) + pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) - # XXX even with -O, distutils writes pyc, not pyo; bug? if sys.dont_write_bytecode: - self.assertNotIn("__init__.pyc", files) + if sys.version_info[1] == 1: + self.assertNotIn("__init__.pyc", files) + else: + self.assertFalse(os.path.exists(pycache_dir)) else: - self.assertIn("__init__.pyc", files) + # XXX even with -O, distutils2 writes pyc, not pyo; bug? + if sys.version_info[1] == 1: + self.assertIn("__init__.pyc", files) + else: + pyc_files = os.listdir(pycache_dir) + self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/distutils2/tests/test_command_install_lib.py b/distutils2/tests/test_command_install_lib.py --- a/distutils2/tests/test_command_install_lib.py +++ b/distutils2/tests/test_command_install_lib.py @@ -1,6 +1,7 @@ """Tests for distutils2.command.install_data.""" +import os import sys -import os +import imp from distutils2.tests import unittest, support from distutils2.command.install_lib import install_lib @@ -36,6 +37,7 @@ @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') def test_byte_compile(self): pkg_dir, dist = self.create_dist() + os.chdir(pkg_dir) cmd = install_lib(dist) cmd.compile = True cmd.optimize = 1 @@ -43,8 +45,14 @@ f = os.path.join(pkg_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyc'))) - self.assertTrue(os.path.exists(os.path.join(pkg_dir, 'foo.pyo'))) + if sys.version_info[1] == 1: + pyc_file = 'foo.pyc' + pyo_file = 'foo.pyo' + else: + pyc_file = imp.cache_from_source('foo.py') + pyo_file = imp.cache_from_source('foo.py', debug_override=False) + self.assertTrue(os.path.exists(pyc_file)) + self.assertTrue(os.path.exists(pyo_file)) def test_get_outputs(self): pkg_dir, dist = self.create_dist() diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -3,6 +3,7 @@ import os import re import csv +import imp import sys import errno import shutil @@ -296,7 +297,8 @@ def byte_compile(py_files, optimize=0, force=False, prefix=None, base_dir=None, verbose=0, dry_run=False, direct=None): """Byte-compile a collection of Python source files to either .pyc - or .pyo files in the same directory. + or .pyo files in the same directory (Python 3.1) or in a __pycache__ + subdirectory (3.2 and newer). 'py_files' is a list of files to compile; any files that don't end in ".py" are silently skipped. 'optimize' must be one of the following: @@ -415,7 +417,16 @@ # Terminology from the py_compile module: # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) - cfile = file + (__debug__ and "c" or "o") + if sys.version_info[1] == 1: + cfile = file + (__debug__ and "c" or "o") + else: + # comply with PEP 3147 in 3.2+ + if optimize >= 0: + cfile = imp.cache_from_source(file, + debug_override=not optimize) + else: + cfile = imp.cache_from_source(file) + dfile = file if prefix: if file[:len(prefix)] != prefix: -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_default?= Message-ID: http://hg.python.org/distutils2/rev/c732ae1db3a8 changeset: 1209:c732ae1db3a8 branch: python3 parent: 1208:7a875901c205 parent: 1207:0d838447c4ab user: ?ric Araujo date: Sat Oct 08 03:54:58 2011 +0200 summary: Merge default files: distutils2/_backport/tests/test_sysconfig.py | 8 +++++++- distutils2/tests/test_command_config.py | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/distutils2/_backport/tests/test_sysconfig.py b/distutils2/_backport/tests/test_sysconfig.py --- a/distutils2/_backport/tests/test_sysconfig.py +++ b/distutils2/_backport/tests/test_sysconfig.py @@ -3,7 +3,6 @@ import subprocess import shutil from copy import copy -from configparser import RawConfigParser from io import StringIO from distutils2._backport import sysconfig @@ -260,8 +259,15 @@ # is similar to the global posix_prefix one base = get_config_var('base') user = get_config_var('userbase') + # the global scheme mirrors the distinction between prefix and + # exec-prefix but not the user scheme, so we have to adapt the paths + # before comparing (issue #9100) + adapt = sys.prefix != sys.exec_prefix for name in ('stdlib', 'platstdlib', 'purelib', 'platlib'): global_path = get_path(name, 'posix_prefix') + if adapt: + global_path = global_path.replace(sys.exec_prefix, sys.prefix) + base = base.replace(sys.exec_prefix, sys.prefix) user_path = get_path(name, 'posix_user') self.assertEqual(user_path, global_path.replace(base, user, 1)) diff --git a/distutils2/tests/test_command_config.py b/distutils2/tests/test_command_config.py --- a/distutils2/tests/test_command_config.py +++ b/distutils2/tests/test_command_config.py @@ -29,10 +29,10 @@ cmd = config(dist) # simple pattern searches - match = cmd.search_cpp(pattern='xxx', body='// xxx') + match = cmd.search_cpp(pattern='xxx', body='/* xxx */') self.assertEqual(match, 0) - match = cmd.search_cpp(pattern='_configtest', body='// xxx') + match = cmd.search_cpp(pattern='_configtest', body='/* xxx */') self.assertEqual(match, 1) def test_finalize_options(self): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Add_tests_for_Unicode_ha?= =?utf8?q?ndling_in_check_and_register_=28=2313114=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/c4392e526e85 changeset: 1210:c4392e526e85 parent: 1207:0d838447c4ab user: ?ric Araujo date: Tue Oct 11 02:30:39 2011 +0200 summary: Add tests for Unicode handling in check and register (#13114). Contrary to distutils in Python 2.7, distutils2 does not have the bugs. Developing with Python 3 and porting to 2.x just rocks like that. files: distutils2/tests/test_command_check.py | 25 ++++++++++- distutils2/tests/test_command_register.py | 15 ++++++ runtests.py | 1 + 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/distutils2/tests/test_command_check.py b/distutils2/tests/test_command_check.py --- a/distutils2/tests/test_command_check.py +++ b/distutils2/tests/test_command_check.py @@ -56,6 +56,15 @@ cmd = self._run(metadata, strict=True) self.assertEqual([], self.get_logs(logging.WARNING)) + # now a test with non-ASCII characters + metadata = {'home_page': u'xxx', 'author': u'\u00c9ric', + 'author_email': u'xxx', 'name': u'xxx', + 'version': u'1.2', + 'summary': u'Something about esszet \u00df', + 'description': u'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual([], self.get_logs(logging.WARNING)) + def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata @@ -95,14 +104,26 @@ @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): - # let's see if it detects broken rest in long_description + # let's see if it detects broken rest in description broken_rest = 'title\n===\n\ntest' pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + # clear warnings from the previous call + self.loghandler.flush() - pkg_info, dist = self.create_dist(description='title\n=====\n\ntest') + # let's see if we have an error with strict=1 + metadata = {'home_page': 'xxx', 'author': 'xxx', + 'author_email': 'xxx', + 'name': 'xxx', 'version': '1.2', + 'description': broken_rest} + self.assertRaises(PackagingSetupError, self._run, metadata, + strict=True, all=True) + self.loghandler.flush() + + # and non-broken rest, including a non-ASCII character to test #12114 + dist = self.create_dist(description=u'title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() self.assertEqual([], self.get_logs(logging.WARNING)) diff --git a/distutils2/tests/test_command_register.py b/distutils2/tests/test_command_register.py --- a/distutils2/tests/test_command_register.py +++ b/distutils2/tests/test_command_register.py @@ -244,6 +244,21 @@ cmd.ensure_finalized() cmd.run() + # and finally a Unicode test (bug #12114) + metadata = {'home_page': u'xxx', 'author': u'\u00c9ric', + 'author_email': u'xxx', 'name': u'xxx', + 'version': u'xxx', + 'summary': u'Something about esszet \u00df', + 'description': u'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = True + inputs = Inputs('1', 'tarek', 'y') + register_module.raw_input = inputs + cmd.ensure_finalized() + cmd.run() + def test_register_pep345(self): cmd = self._get_cmd({}) cmd.ensure_finalized() diff --git a/runtests.py b/runtests.py --- a/runtests.py +++ b/runtests.py @@ -95,6 +95,7 @@ def test_main(): opts, args = parse_opts() + # FIXME when we run with --quiet, we still want to see errors and failures verbose = not opts.quiet ret = 0 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:09:19 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 12 Oct 2011 18:09:19 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_tests_for_=2313114_from_default?= Message-ID: http://hg.python.org/distutils2/rev/98e0d3c53a2f changeset: 1211:98e0d3c53a2f branch: python3 parent: 1209:c732ae1db3a8 parent: 1210:c4392e526e85 user: ?ric Araujo date: Tue Oct 11 02:33:47 2011 +0200 summary: Merge tests for #13114 from default files: distutils2/tests/test_command_check.py | 25 ++++++++++- distutils2/tests/test_command_register.py | 15 ++++++ runtests.py | 1 + 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/distutils2/tests/test_command_check.py b/distutils2/tests/test_command_check.py --- a/distutils2/tests/test_command_check.py +++ b/distutils2/tests/test_command_check.py @@ -56,6 +56,15 @@ cmd = self._run(metadata, strict=True) self.assertEqual([], self.get_logs(logging.WARNING)) + # now a test with non-ASCII characters + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': '1.2', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual([], self.get_logs(logging.WARNING)) + def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata @@ -95,14 +104,26 @@ @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): - # let's see if it detects broken rest in long_description + # let's see if it detects broken rest in description broken_rest = 'title\n===\n\ntest' pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + # clear warnings from the previous call + self.loghandler.flush() - pkg_info, dist = self.create_dist(description='title\n=====\n\ntest') + # let's see if we have an error with strict=1 + metadata = {'home_page': 'xxx', 'author': 'xxx', + 'author_email': 'xxx', + 'name': 'xxx', 'version': '1.2', + 'description': broken_rest} + self.assertRaises(PackagingSetupError, self._run, metadata, + strict=True, all=True) + self.loghandler.flush() + + # and non-broken rest, including a non-ASCII character to test #12114 + dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() self.assertEqual([], self.get_logs(logging.WARNING)) diff --git a/distutils2/tests/test_command_register.py b/distutils2/tests/test_command_register.py --- a/distutils2/tests/test_command_register.py +++ b/distutils2/tests/test_command_register.py @@ -243,6 +243,21 @@ cmd.ensure_finalized() cmd.run() + # and finally a Unicode test (bug #12114) + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = True + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs + cmd.ensure_finalized() + cmd.run() + def test_register_pep345(self): cmd = self._get_cmd({}) cmd.ensure_finalized() diff --git a/runtests.py b/runtests.py --- a/runtests.py +++ b/runtests.py @@ -95,6 +95,7 @@ def test_main(): opts, args = parse_opts() + # FIXME when we run with --quiet, we still want to see errors and failures verbose = not opts.quiet ret = 0 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 12 18:31:50 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 18:31:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_the_C-API_docs_for_e?= =?utf8?q?xception_types?= Message-ID: http://hg.python.org/cpython/rev/e451c5659d64 changeset: 72885:e451c5659d64 user: Antoine Pitrou date: Wed Oct 12 18:28:01 2011 +0200 summary: Update the C-API docs for exception types files: Doc/c-api/exceptions.rst | 169 +++++++++++++++++--------- 1 files changed, 110 insertions(+), 59 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -582,65 +582,116 @@ :c:type:`PyObject\*`; they are all class objects. For completeness, here are all the variables: -+-------------------------------------+----------------------------+----------+ -| C Name | Python Name | Notes | -+=====================================+============================+==========+ -| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_EnvironmentError` | :exc:`EnvironmentError` | \(1) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_IOError` | :exc:`IOError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_ImportError` | :exc:`ImportError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_IndexError` | :exc:`IndexError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_KeyError` | :exc:`KeyError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_NameError` | :exc:`NameError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_OSError` | :exc:`OSError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_SystemError` | :exc:`SystemError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_TypeError` | :exc:`TypeError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_ValueError` | :exc:`ValueError` | | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_WindowsError` | :exc:`WindowsError` | \(3) | -+-------------------------------------+----------------------------+----------+ -| :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | -+-------------------------------------+----------------------------+----------+ ++-----------------------------------------+---------------------------------+----------+ +| C Name | Python Name | Notes | ++=========================================+=================================+==========+ +| :c:data:`PyExc_BaseException` | :exc:`BaseException` | \(1) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_Exception` | :exc:`Exception` | \(1) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ArithmeticError` | :exc:`ArithmeticError` | \(1) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_LookupError` | :exc:`LookupError` | \(1) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_AssertionError` | :exc:`AssertionError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_AttributeError` | :exc:`AttributeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_BlockingIOError` | :exc:`BlockingIOError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_BrokenPipeError` | :exc:`BrokenPipeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ChildProcessError` | :exc:`ChildProcessError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionError` | :exc:`ConnectionError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionAbortedError` | :exc:`ConnectionAbortedError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionRefusedError` | :exc:`ConnectionRefusedError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ConnectionResetError` | :exc:`ConnectionResetError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_FileExistsError` | :exc:`FileExistsError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_FileNotFoundError` | :exc:`FileNotFoundError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_EOFError` | :exc:`EOFError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_FloatingPointError` | :exc:`FloatingPointError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ImportError` | :exc:`ImportError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_IndexError` | :exc:`IndexError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_InterruptedError` | :exc:`InterruptedError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_IsADirectoryError` | :exc:`IsADirectoryError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_KeyError` | :exc:`KeyError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_KeyboardInterrupt` | :exc:`KeyboardInterrupt` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_MemoryError` | :exc:`MemoryError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_NameError` | :exc:`NameError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_NotADirectoryError` | :exc:`NotADirectoryError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_NotImplementedError` | :exc:`NotImplementedError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_OSError` | :exc:`OSError` | \(1) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_OverflowError` | :exc:`OverflowError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_PermissionError` | :exc:`PermissionError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ProcessLookupError` | :exc:`ProcessLookupError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ReferenceError` | :exc:`ReferenceError` | \(2) | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_RuntimeError` | :exc:`RuntimeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_SyntaxError` | :exc:`SyntaxError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_SystemError` | :exc:`SystemError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TimeoutError` | :exc:`TimeoutError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_SystemExit` | :exc:`SystemExit` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_TypeError` | :exc:`TypeError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ValueError` | :exc:`ValueError` | | ++-----------------------------------------+---------------------------------+----------+ +| :c:data:`PyExc_ZeroDivisionError` | :exc:`ZeroDivisionError` | | ++-----------------------------------------+---------------------------------+----------+ + +.. versionadded:: 3.3 + :c:data:`PyExc_BlockingIOError`, :c:data:`PyExc_BrokenPipeError`, + :c:data:`PyExc_ChildProcessError`, :c:data:`PyExc_ConnectionError`, + :c:data:`PyExc_ConnectionAbortedError`, :c:data:`PyExc_ConnectionRefusedError`, + :c:data:`PyExc_ConnectionResetError`, :c:data:`PyExc_FileExistsError`, + :c:data:`PyExc_FileNotFoundError`, :c:data:`PyExc_InterruptedError`, + :c:data:`PyExc_IsADirectoryError`, :c:data:`PyExc_NotADirectoryError`, + :c:data:`PyExc_PermissionError`, :c:data:`PyExc_ProcessLookupError` + and :c:data:`PyExc_TimeoutError` were introduced following :pep:`3151`. + + +These are compatibility aliases to :c:data:`PyExc_OSError`: + ++-------------------------------------+----------+ +| C Name | Notes | ++=====================================+==========+ +| :c:data:`PyExc_EnvironmentError` | | ++-------------------------------------+----------+ +| :c:data:`PyExc_IOError` | | ++-------------------------------------+----------+ +| :c:data:`PyExc_WindowsError` | \(3) | ++-------------------------------------+----------+ + +.. versionchanged:: 3.3 + These aliases used to be separate exception types. + .. index:: single: PyExc_BaseException -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 18:37:33 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 18:37:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_index_entries?= Message-ID: http://hg.python.org/cpython/rev/238d7f449da1 changeset: 72886:238d7f449da1 user: Antoine Pitrou date: Wed Oct 12 18:33:15 2011 +0200 summary: Update index entries files: Doc/c-api/exceptions.rst | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -700,28 +700,42 @@ single: PyExc_LookupError single: PyExc_AssertionError single: PyExc_AttributeError + single: PyExc_BlockingIOError + single: PyExc_BrokenPipeError + single: PyExc_ConnectionError + single: PyExc_ConnectionAbortedError + single: PyExc_ConnectionRefusedError + single: PyExc_ConnectionResetError single: PyExc_EOFError - single: PyExc_EnvironmentError + single: PyExc_FileExistsError + single: PyExc_FileNotFoundError single: PyExc_FloatingPointError - single: PyExc_IOError single: PyExc_ImportError single: PyExc_IndexError + single: PyExc_InterruptedError + single: PyExc_IsADirectoryError single: PyExc_KeyError single: PyExc_KeyboardInterrupt single: PyExc_MemoryError single: PyExc_NameError + single: PyExc_NotADirectoryError single: PyExc_NotImplementedError single: PyExc_OSError single: PyExc_OverflowError + single: PyExc_PermissionError + single: PyExc_ProcessLookupError single: PyExc_ReferenceError single: PyExc_RuntimeError single: PyExc_SyntaxError single: PyExc_SystemError single: PyExc_SystemExit + single: PyExc_TimeoutError single: PyExc_TypeError single: PyExc_ValueError + single: PyExc_ZeroDivisionError + single: PyExc_EnvironmentError + single: PyExc_IOError single: PyExc_WindowsError - single: PyExc_ZeroDivisionError Notes: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 18:39:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 18:39:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_a_mention_of_Enviro?= =?utf8?q?nmentError_in_the_distutils_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/70b94f69bbf8 changeset: 72887:70b94f69bbf8 user: Antoine Pitrou date: Wed Oct 12 18:35:18 2011 +0200 summary: Replace a mention of EnvironmentError in the distutils docs. files: Doc/distutils/apiref.rst | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1162,12 +1162,11 @@ .. function:: grok_environment_error(exc[, prefix='error: ']) - Generate a useful error message from an :exc:`EnvironmentError` (:exc:`IOError` - or :exc:`OSError`) exception object. Handles Python 1.5.1 and later styles, - and does what it can to deal with exception objects that don't have a filename - (which happens when the error is due to a two-file operation, such as - :func:`rename` or :func:`link`). Returns the error message as a string - prefixed with *prefix*. + Generate a useful error message from an :exc:`OSError` exception object. + Handles Python 1.5.1 and later styles, and does what it can to deal with + exception objects that don't have a filename (which happens when the error + is due to a two-file operation, such as :func:`rename` or :func:`link`). + Returns the error message as a string prefixed with *prefix*. .. function:: split_quoted(s) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 18:57:09 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 18:57:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_mentions_of_Windows?= =?utf8?q?Error?= Message-ID: http://hg.python.org/cpython/rev/20ca7832461e changeset: 72888:20ca7832461e user: Antoine Pitrou date: Wed Oct 12 18:53:23 2011 +0200 summary: Replace mentions of WindowsError files: Doc/library/ctypes.rst | 21 ++++++++++--- Doc/library/winreg.rst | 48 +++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -39,9 +39,14 @@ convention, while *windll* libraries call functions using the ``stdcall`` calling convention. *oledll* also uses the ``stdcall`` calling convention, and assumes the functions return a Windows :c:type:`HRESULT` error code. The error -code is used to automatically raise a :class:`WindowsError` exception when the +code is used to automatically raise a :class:`OSError` exception when the function call fails. +.. versionchanged:: 3.3 + Windows errors used to raise :exc:`WindowsError`, which is now an alias + of :exc:`OSError`. + + Here are some examples for Windows. Note that ``msvcrt`` is the MS standard C library containing most standard C functions, and uses the cdecl calling convention:: @@ -189,7 +194,7 @@ >>> windll.kernel32.GetModuleHandleA(32) # doctest: +WINDOWS Traceback (most recent call last): File "", line 1, in ? - WindowsError: exception: access violation reading 0x00000020 + OSError: exception: access violation reading 0x00000020 >>> There are, however, enough ways to crash Python with :mod:`ctypes`, so you @@ -491,7 +496,7 @@ Traceback (most recent call last): File "", line 1, in ? File "", line 3, in ValidHandle - WindowsError: [Errno 126] The specified module could not be found. + OSError: [Errno 126] The specified module could not be found. >>> ``WinError`` is a function which will call Windows ``FormatMessage()`` api to @@ -1345,7 +1350,10 @@ assumed to return the windows specific :class:`HRESULT` code. :class:`HRESULT` values contain information specifying whether the function call failed or succeeded, together with additional error code. If the return value signals a - failure, an :class:`WindowsError` is automatically raised. + failure, an :class:`OSError` is automatically raised. + + .. versionchanged:: 3.3 + :exc:`WindowsError` used to be raised. .. class:: WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False) @@ -1966,11 +1974,14 @@ .. function:: WinError(code=None, descr=None) Windows only: this function is probably the worst-named thing in ctypes. It - creates an instance of WindowsError. If *code* is not specified, + creates an instance of OSError. If *code* is not specified, ``GetLastError`` is called to determine the error code. If *descr* is not specified, :func:`FormatError` is called to get a textual description of the error. + .. versionchanged:: 3.3 + An instance of :exc:`WindowsError` used to be created. + .. function:: wstring_at(address, size=-1) diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -38,7 +38,11 @@ *key* is the predefined handle to connect to. The return value is the handle of the opened key. If the function fails, a - :exc:`WindowsError` exception is raised. + :exc:`OSError` exception is raised. + + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. .. function:: CreateKey(key, sub_key) @@ -57,7 +61,11 @@ If the key already exists, this function opens the existing key. The return value is the handle of the opened key. If the function fails, a - :exc:`WindowsError` exception is raised. + :exc:`OSError` exception is raised. + + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. .. function:: CreateKeyEx(key, sub_key, reserved=0, access=KEY_ALL_ACCESS) @@ -82,10 +90,14 @@ If the key already exists, this function opens the existing key. The return value is the handle of the opened key. If the function fails, a - :exc:`WindowsError` exception is raised. + :exc:`OSError` exception is raised. .. versionadded:: 3.2 + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. + .. function:: DeleteKey(key, sub_key) @@ -100,7 +112,11 @@ *This method can not delete keys with subkeys.* If the method succeeds, the entire key, including all of its values, is removed. - If the method fails, a :exc:`WindowsError` exception is raised. + If the method fails, a :exc:`OSError` exception is raised. + + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. .. function:: DeleteKeyEx(key, sub_key, access=KEY_ALL_ACCESS, reserved=0) @@ -129,12 +145,16 @@ *This method can not delete keys with subkeys.* If the method succeeds, the entire key, including all of its values, is - removed. If the method fails, a :exc:`WindowsError` exception is raised. + removed. If the method fails, a :exc:`OSError` exception is raised. On unsupported Windows versions, :exc:`NotImplementedError` is raised. .. versionadded:: 3.2 + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. + .. function:: DeleteValue(key, value) @@ -156,9 +176,13 @@ *index* is an integer that identifies the index of the key to retrieve. The function retrieves the name of one subkey each time it is called. It is - typically called repeatedly until a :exc:`WindowsError` exception is + typically called repeatedly until a :exc:`OSError` exception is raised, indicating, no more values are available. + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. + .. function:: EnumValue(key, index) @@ -170,7 +194,7 @@ *index* is an integer that identifies the index of the value to retrieve. The function retrieves the name of one subkey each time it is called. It is - typically called repeatedly, until a :exc:`WindowsError` exception is + typically called repeatedly, until a :exc:`OSError` exception is raised, indicating no more values. The result is a tuple of 3 items: @@ -189,6 +213,10 @@ | | :meth:`SetValueEx`) | +-------+--------------------------------------------+ + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. + .. function:: ExpandEnvironmentStrings(str) @@ -260,10 +288,14 @@ The result is a new handle to the specified key. - If the function fails, :exc:`WindowsError` is raised. + If the function fails, :exc:`OSError` is raised. .. versionchanged:: 3.2 Allow the use of named arguments. + .. versionchanged:: 3.3 + This function used to raise a :exc:`WindowsError`, which is now an + alias of :exc:`OSError`. + .. function:: OpenKeyEx() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 19:01:09 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 19:01:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_doc_for_BlockingIOEr?= =?utf8?q?ror_and_its_alias_in_the_io_module?= Message-ID: http://hg.python.org/cpython/rev/33c2100aea94 changeset: 72889:33c2100aea94 user: Antoine Pitrou date: Wed Oct 12 18:57:23 2011 +0200 summary: Update doc for BlockingIOError and its alias in the io module files: Doc/library/exceptions.rst | 9 +++++++++ Doc/library/io.rst | 12 ++---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -396,6 +396,15 @@ Corresponds to :c:data:`errno` ``EAGAIN``, ``EALREADY``, ``EWOULDBLOCK`` and ``EINPROGRESS``. + In addition to those of :exc:`OSError`, :exc:`BlockingIOError` can have + one more attribute: + + .. attribute:: characters_written + + An integer containing the number of characters written to the stream + before it blocked. This attribute is available when using the + buffered I/O classes from the :mod:`io` module. + .. exception:: ChildProcessError Raised when an operation on a child process failed. diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -109,16 +109,8 @@ .. exception:: BlockingIOError - Error raised when blocking would occur on a non-blocking stream. It inherits - :exc:`IOError`. - - In addition to those of :exc:`IOError`, :exc:`BlockingIOError` has one - attribute: - - .. attribute:: characters_written - - An integer containing the number of characters written to the stream - before it blocked. + This is a compatibility alias for the builtin :exc:`BlockingIOError` + exception. .. exception:: UnsupportedOperation -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 19:06:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 19:06:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_mentions_of_IOError_in_?= =?utf8?q?the_io_module_docs?= Message-ID: http://hg.python.org/cpython/rev/a22d94547570 changeset: 72890:a22d94547570 user: Antoine Pitrou date: Wed Oct 12 19:02:52 2011 +0200 summary: Fix mentions of IOError in the io module docs files: Doc/library/io.rst | 22 +++++++++++++--------- 1 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -33,6 +33,10 @@ will raise a ``TypeError``. So will giving a :class:`bytes` object to the ``write()`` method of a text stream. +.. versionchanged:: 3.3 + Operations defined in this module used to raise :exc:`IOError`, which is + now an alias of :exc:`OSError`. + Text I/O ^^^^^^^^ @@ -115,7 +119,7 @@ .. exception:: UnsupportedOperation - An exception inheriting :exc:`IOError` and :exc:`ValueError` that is raised + An exception inheriting :exc:`OSError` and :exc:`ValueError` that is raised when an unsupported operation is called on a stream. @@ -194,8 +198,8 @@ Even though :class:`IOBase` does not declare :meth:`read`, :meth:`readinto`, or :meth:`write` because their signatures will vary, implementations and clients should consider those methods part of the interface. Also, - implementations may raise a :exc:`IOError` when operations they do not - support are called. + implementations may raise a :exc:`ValueError` (or :exc:`UnsupportedOperation`) + when operations they do not support are called. The basic type used for binary data read from or written to a file is :class:`bytes`. :class:`bytearray`\s are accepted too, and in some cases @@ -203,7 +207,7 @@ :class:`str` data. Note that calling any method (even inquiries) on a closed stream is - undefined. Implementations may raise :exc:`IOError` in this case. + undefined. Implementations may raise :exc:`ValueError` in this case. IOBase (and its subclasses) support the iterator protocol, meaning that an :class:`IOBase` object can be iterated over yielding the lines in a stream. @@ -236,7 +240,7 @@ .. method:: fileno() Return the underlying file descriptor (an integer) of the stream if it - exists. An :exc:`IOError` is raised if the IO object does not use a file + exists. An :exc:`OSError` is raised if the IO object does not use a file descriptor. .. method:: flush() @@ -252,7 +256,7 @@ .. method:: readable() Return ``True`` if the stream can be read from. If False, :meth:`read` - will raise :exc:`IOError`. + will raise :exc:`OSError`. .. method:: readline(limit=-1) @@ -290,7 +294,7 @@ .. method:: seekable() Return ``True`` if the stream supports random access. If ``False``, - :meth:`seek`, :meth:`tell` and :meth:`truncate` will raise :exc:`IOError`. + :meth:`seek`, :meth:`tell` and :meth:`truncate` will raise :exc:`OSError`. .. method:: tell() @@ -308,7 +312,7 @@ .. method:: writable() Return ``True`` if the stream supports writing. If ``False``, - :meth:`write` and :meth:`truncate` will raise :exc:`IOError`. + :meth:`write` and :meth:`truncate` will raise :exc:`OSError`. .. method:: writelines(lines) @@ -442,7 +446,7 @@ Write the given bytes or bytearray object, *b* and return the number of bytes written (never less than ``len(b)``, since if the write fails - an :exc:`IOError` will be raised). Depending on the actual + an :exc:`OSError` will be raised). Depending on the actual implementation, these bytes may be readily written to the underlying stream, or held in a buffer for performance and latency reasons. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 19:14:03 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 19:14:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_some_mentions_of_IOErro?= =?utf8?q?r?= Message-ID: http://hg.python.org/cpython/rev/aa6bede69d64 changeset: 72891:aa6bede69d64 user: Antoine Pitrou date: Wed Oct 12 19:10:10 2011 +0200 summary: Fix some mentions of IOError files: Doc/library/chunk.rst | 5 +++-- Doc/library/fileinput.rst | 5 ++++- Doc/library/signal.rst | 8 ++++++-- Doc/library/urllib.request.rst | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Doc/library/chunk.rst b/Doc/library/chunk.rst --- a/Doc/library/chunk.rst +++ b/Doc/library/chunk.rst @@ -84,8 +84,9 @@ Close and skip to the end of the chunk. This does not close the underlying file. - The remaining methods will raise :exc:`IOError` if called after the - :meth:`close` method has been called. + The remaining methods will raise :exc:`OSError` if called after the + :meth:`close` method has been called. Before Python 3.3, they used to + raise :exc:`IOError`, now an alias of :exc:`OSError`. .. method:: isatty() diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -28,7 +28,10 @@ All files are opened in text mode by default, but you can override this by specifying the *mode* parameter in the call to :func:`.input` or :class:`FileInput`. If an I/O error occurs during opening or reading a file, -:exc:`IOError` is raised. +:exc:`OSError` is raised. + +.. versionchanged:: 3.3 + :exc:`IOError` used to be raised; it is now an alias of :exc:`OSError`. If ``sys.stdin`` is used more than once, the second and further use will return no lines, except perhaps for interactive use, or if it has been explicitly reset diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -145,7 +145,11 @@ Raised to signal an error from the underlying :func:`setitimer` or :func:`getitimer` implementation. Expect this error if an invalid interval timer or a negative time is passed to :func:`setitimer`. - This error is a subtype of :exc:`IOError`. + This error is a subtype of :exc:`OSError`. + + .. versionadded:: 3.3 + This error used to be a subtype of :exc:`IOError`, which is now an + alias of :exc:`OSError`. The :mod:`signal` module defines the following functions: @@ -396,7 +400,7 @@ def handler(signum, frame): print('Signal handler called with signal', signum) - raise IOError("Couldn't open device!") + raise OSError("Couldn't open device!") # Set the signal handler and a 5-second alarm signal.signal(signal.SIGALRM, handler) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1172,7 +1172,7 @@ *key_file* and *cert_file* are supported to provide an SSL key and certificate; both are needed to support client authentication. - :class:`URLopener` objects will raise an :exc:`IOError` exception if the server + :class:`URLopener` objects will raise an :exc:`OSError` exception if the server returns an error code. .. method:: open(fullurl, data=None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 19:15:00 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 19:15:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_This_shameful_limitation_of?= =?utf8?q?_the_fileinput_module_is_not_relevant_anymore=2E?= Message-ID: http://hg.python.org/cpython/rev/c589c6546071 changeset: 72892:c589c6546071 user: Antoine Pitrou date: Wed Oct 12 19:11:12 2011 +0200 summary: This shameful limitation of the fileinput module is not relevant anymore. files: Doc/library/fileinput.rst | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/Doc/library/fileinput.rst b/Doc/library/fileinput.rst --- a/Doc/library/fileinput.rst +++ b/Doc/library/fileinput.rst @@ -171,10 +171,6 @@ it is deleted when the output file is closed. In-place filtering is disabled when standard input is read. -.. note:: - - The current implementation does not work for MS-DOS 8+3 filesystems. - The two following opening hooks are provided by this module: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 19:45:14 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 19:45:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Instantiate_the_OS-related_?= =?utf8?q?exception_as_soon_as_we_raise_it=2C_so_that?= Message-ID: http://hg.python.org/cpython/rev/793c75177d28 changeset: 72893:793c75177d28 user: Antoine Pitrou date: Wed Oct 12 19:39:57 2011 +0200 summary: Instantiate the OS-related exception as soon as we raise it, so that "except" works properly. files: Lib/test/test_pep3151.py | 12 ++++++++++++ Python/errors.c | 16 ++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_pep3151.py b/Lib/test/test_pep3151.py --- a/Lib/test/test_pep3151.py +++ b/Lib/test/test_pep3151.py @@ -79,6 +79,18 @@ e = SubOSError(EEXIST, "Bad file descriptor") self.assertIs(type(e), SubOSError) + def test_try_except(self): + # This checks that try .. except checks the concrete exception + # (FileNotFoundError) and not the base type specified when + # PyErr_SetFromErrnoWithFilenameObject was called. + # (it is therefore deliberate that it doesn't use assertRaises) + try: + open("some_hopefully_non_existing_file") + except FileNotFoundError: + pass + else: + self.fail("should have raised a FileNotFoundError") + class AttributesTest(unittest.TestCase): diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -341,7 +341,7 @@ PyErr_SetFromErrnoWithFilenameObject(PyObject *exc, PyObject *filenameObject) { PyObject *message; - PyObject *v; + PyObject *v, *args; int i = errno; #ifndef MS_WINDOWS char *s; @@ -410,14 +410,18 @@ } if (filenameObject != NULL) - v = Py_BuildValue("(iOO)", i, message, filenameObject); + args = Py_BuildValue("(iOO)", i, message, filenameObject); else - v = Py_BuildValue("(iO)", i, message); + args = Py_BuildValue("(iO)", i, message); Py_DECREF(message); - if (v != NULL) { - PyErr_SetObject(exc, v); - Py_DECREF(v); + if (args != NULL) { + v = PyObject_Call(exc, args, NULL); + Py_DECREF(args); + if (v != NULL) { + PyErr_SetObject((PyObject *) Py_TYPE(v), v); + Py_DECREF(v); + } } #ifdef MS_WINDOWS LocalFree(s_buf); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 20:14:46 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 12 Oct 2011 20:14:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_mentions_of_IOError?= Message-ID: http://hg.python.org/cpython/rev/efcfd5ca1d5c changeset: 72894:efcfd5ca1d5c user: Antoine Pitrou date: Wed Oct 12 20:10:51 2011 +0200 summary: Replace mentions of IOError files: Doc/library/atexit.rst | 2 +- Doc/library/fcntl.rst | 9 +++++++-- Doc/library/functions.rst | 5 ++++- Doc/library/gettext.rst | 7 +++++-- Doc/library/http.cookiejar.rst | 11 +++++++++-- Doc/library/http.server.rst | 2 +- Doc/library/inspect.rst | 12 ++++++++++-- Doc/library/msvcrt.rst | 15 ++++++++++----- Doc/library/multiprocessing.rst | 7 ++++++- Doc/library/os.rst | 7 ++----- Doc/library/ossaudiodev.rst | 14 +++++++++----- Doc/library/packaging.database.rst | 2 +- Doc/library/readline.rst | 4 ++-- Doc/library/shutil.rst | 5 ++++- Doc/library/tarfile.rst | 6 +++--- Doc/library/urllib.error.rst | 11 +++++++---- Doc/library/zipimport.rst | 5 ++++- 17 files changed, 85 insertions(+), 39 deletions(-) diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst --- a/Doc/library/atexit.rst +++ b/Doc/library/atexit.rst @@ -69,7 +69,7 @@ try: with open("/tmp/counter") as infile: _count = int(infile.read()) - except IOError: + except FileNotFoundError: _count = 0 def incrcounter(n): diff --git a/Doc/library/fcntl.rst b/Doc/library/fcntl.rst --- a/Doc/library/fcntl.rst +++ b/Doc/library/fcntl.rst @@ -19,6 +19,11 @@ ``sys.stdin.fileno()``, or a :class:`io.IOBase` object, such as ``sys.stdin`` itself, which provides a :meth:`fileno` that returns a genuine file descriptor. +.. versionchanged:: 3.3 + Operations in this module used to raise a :exc:`IOError` where they now + raise a :exc:`OSError`. + + The module defines the following functions: @@ -40,7 +45,7 @@ larger than 1024 bytes, this is most likely to result in a segmentation violation or a more subtle data corruption. - If the :c:func:`fcntl` fails, an :exc:`IOError` is raised. + If the :c:func:`fcntl` fails, an :exc:`OSError` is raised. .. function:: ioctl(fd, op[, arg[, mutate_flag]]) @@ -107,7 +112,7 @@ When *operation* is :const:`LOCK_SH` or :const:`LOCK_EX`, it can also be bitwise ORed with :const:`LOCK_NB` to avoid blocking on lock acquisition. If :const:`LOCK_NB` is used and the lock cannot be acquired, an - :exc:`IOError` will be raised and the exception will have an *errno* + :exc:`OSError` will be raised and the exception will have an *errno* attribute set to :const:`EACCES` or :const:`EAGAIN` (depending on the operating system; for portability, check for both values). On at least some systems, :const:`LOCK_EX` can only be used if the file descriptor refers to a diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -783,7 +783,7 @@ .. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) Open *file* and return a corresponding stream. If the file cannot be opened, - an :exc:`IOError` is raised. + an :exc:`OSError` is raised. *file* is either a string or bytes object giving the pathname (absolute or relative to the current working directory) of the file to be opened or @@ -912,6 +912,9 @@ (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, and :mod:`shutil`. + .. versionchanged:: 3.3 + :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. + .. XXX works for bytes too, but should it? .. function:: ord(c) diff --git a/Doc/library/gettext.rst b/Doc/library/gettext.rst --- a/Doc/library/gettext.rst +++ b/Doc/library/gettext.rst @@ -185,10 +185,13 @@ translation object from the cache; the actual instance data is still shared with the cache. - If no :file:`.mo` file is found, this function raises :exc:`IOError` if + If no :file:`.mo` file is found, this function raises :exc:`OSError` if *fallback* is false (which is the default), and returns a :class:`NullTranslations` instance if *fallback* is true. + .. versionchanged:: 3.3 + :exc:`IOError` used to be raised instead of :exc:`OSError`. + .. function:: install(domain, localedir=None, codeset=None, names=None) @@ -342,7 +345,7 @@ If the :file:`.mo` file's magic number is invalid, or if other problems occur while reading the file, instantiating a :class:`GNUTranslations` class can raise -:exc:`IOError`. +:exc:`OSError`. The following methods are overridden from the base class implementation: diff --git a/Doc/library/http.cookiejar.rst b/Doc/library/http.cookiejar.rst --- a/Doc/library/http.cookiejar.rst +++ b/Doc/library/http.cookiejar.rst @@ -40,7 +40,11 @@ .. exception:: LoadError Instances of :class:`FileCookieJar` raise this exception on failure to load - cookies from a file. :exc:`LoadError` is a subclass of :exc:`IOError`. + cookies from a file. :exc:`LoadError` is a subclass of :exc:`OSError`. + + .. versionchanged:: 3.3 + LoadError was made a subclass of :exc:`OSError` instead of + :exc:`IOError`. The following classes are provided: @@ -257,9 +261,12 @@ Arguments are as for :meth:`save`. The named file must be in the format understood by the class, or - :exc:`LoadError` will be raised. Also, :exc:`IOError` may be raised, for + :exc:`LoadError` will be raised. Also, :exc:`OSError` may be raised, for example if the file does not exist. + .. versionchanged:: 3.3 + :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`. + .. method:: FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False) diff --git a/Doc/library/http.server.rst b/Doc/library/http.server.rst --- a/Doc/library/http.server.rst +++ b/Doc/library/http.server.rst @@ -318,7 +318,7 @@ response if the :func:`listdir` fails. If the request was mapped to a file, it is opened and the contents are - returned. Any :exc:`IOError` exception in opening the requested file is + returned. Any :exc:`OSError` exception in opening the requested file is mapped to a ``404``, ``'File not found'`` error. Otherwise, the content type is guessed by calling the :meth:`guess_type` method, which in turn uses the *extensions_map* variable. diff --git a/Doc/library/inspect.rst b/Doc/library/inspect.rst --- a/Doc/library/inspect.rst +++ b/Doc/library/inspect.rst @@ -355,17 +355,25 @@ argument may be a module, class, method, function, traceback, frame, or code object. The source code is returned as a list of the lines corresponding to the object and the line number indicates where in the original source file the first - line of code was found. An :exc:`IOError` is raised if the source code cannot + line of code was found. An :exc:`OSError` is raised if the source code cannot be retrieved. + .. versionchanged:: 3.3 + :exc:`OSError` is raised instead of :exc:`IOError`, now an alias of the + former. + .. function:: getsource(object) Return the text of the source code for an object. The argument may be a module, class, method, function, traceback, frame, or code object. The source code is - returned as a single string. An :exc:`IOError` is raised if the source code + returned as a single string. An :exc:`OSError` is raised if the source code cannot be retrieved. + .. versionchanged:: 3.3 + :exc:`OSError` is raised instead of :exc:`IOError`, now an alias of the + former. + .. function:: cleandoc(doc) diff --git a/Doc/library/msvcrt.rst b/Doc/library/msvcrt.rst --- a/Doc/library/msvcrt.rst +++ b/Doc/library/msvcrt.rst @@ -20,6 +20,11 @@ for internationalized applications. The wide char API should be used where ever possible +.. versionchanged:: 3.3 + Operations in this module now raise :exc:`OSError` where :exc:`IOError` + was raised. + + .. _msvcrt-files: File Operations @@ -29,7 +34,7 @@ .. function:: locking(fd, mode, nbytes) Lock part of a file based on file descriptor *fd* from the C runtime. Raises - :exc:`IOError` on failure. The locked region of the file extends from the + :exc:`OSError` on failure. The locked region of the file extends from the current file position for *nbytes* bytes, and may continue beyond the end of the file. *mode* must be one of the :const:`LK_\*` constants listed below. Multiple regions in a file may be locked at the same time, but may not overlap. Adjacent @@ -41,13 +46,13 @@ Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot - be locked, :exc:`IOError` is raised. + be locked, :exc:`OSError` is raised. .. data:: LK_NBLCK LK_NBRLCK - Locks the specified bytes. If the bytes cannot be locked, :exc:`IOError` is + Locks the specified bytes. If the bytes cannot be locked, :exc:`OSError` is raised. @@ -73,7 +78,7 @@ .. function:: get_osfhandle(fd) - Return the file handle for the file descriptor *fd*. Raises :exc:`IOError` if + Return the file handle for the file descriptor *fd*. Raises :exc:`OSError` if *fd* is not recognized. @@ -144,4 +149,4 @@ .. function:: heapmin() Force the :c:func:`malloc` heap to clean itself up and return unused blocks to - the operating system. On failure, this raises :exc:`IOError`. + the operating system. On failure, this raises :exc:`OSError`. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -784,9 +784,14 @@ to receive and the other end has closed. If *maxlength* is specified and the message is longer than *maxlength* - then :exc:`IOError` is raised and the connection will no longer be + then :exc:`OSError` is raised and the connection will no longer be readable. + .. versionchanged:: 3.3 + This function used to raise a :exc:`IOError`, which is now an + alias of :exc:`OSError`. + + .. method:: recv_bytes_into(buffer[, offset]) Read into *buffer* a complete message of byte data sent from the other end diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1426,11 +1426,8 @@ try: fp = open("myfile") - except IOError as e: - if e.errno == errno.EACCESS: - return "some default data" - # Not a permission error. - raise + except PermissionError: + return "some default data" else: with fp: return fp.read() diff --git a/Doc/library/ossaudiodev.rst b/Doc/library/ossaudiodev.rst --- a/Doc/library/ossaudiodev.rst +++ b/Doc/library/ossaudiodev.rst @@ -38,6 +38,10 @@ This probably all warrants a footnote or two, but I don't understand things well enough right now to write it! --GPW +.. versionchanged:: 3.3 + Operations in this module now raise :exc:`OSError` where :exc:`IOError` + was raised. + .. seealso:: @@ -56,7 +60,7 @@ what went wrong. (If :mod:`ossaudiodev` receives an error from a system call such as - :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`IOError`. + :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`OSError`. Errors detected directly by :mod:`ossaudiodev` result in :exc:`OSSAudioError`.) (For backwards compatibility, the exception class is also available as @@ -168,7 +172,7 @@ correspondence is obvious: for example, :meth:`setfmt` corresponds to the ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can be useful when consulting the OSS documentation). If the underlying -:func:`ioctl` fails, they all raise :exc:`IOError`. +:func:`ioctl` fails, they all raise :exc:`OSError`. .. method:: oss_audio_device.nonblock() @@ -344,7 +348,7 @@ .. method:: oss_mixer_device.close() This method closes the open mixer device file. Any further attempts to use the - mixer after this file is closed will raise an :exc:`IOError`. + mixer after this file is closed will raise an :exc:`OSError`. .. method:: oss_mixer_device.fileno() @@ -403,7 +407,7 @@ returned, but both volumes are the same. Raises :exc:`OSSAudioError` if an invalid control was is specified, or - :exc:`IOError` if an unsupported control is specified. + :exc:`OSError` if an unsupported control is specified. .. method:: oss_mixer_device.set(control, (left, right)) @@ -427,7 +431,7 @@ .. method:: oss_mixer_device.set_recsrc(bitmask) Call this function to specify a recording source. Returns a bitmask indicating - the new recording source (or sources) if successful; raises :exc:`IOError` if an + the new recording source (or sources) if successful; raises :exc:`OSError` if an invalid source was specified. To set the current recording source to the microphone input:: diff --git a/Doc/library/packaging.database.rst b/Doc/library/packaging.database.rst --- a/Doc/library/packaging.database.rst +++ b/Doc/library/packaging.database.rst @@ -213,7 +213,7 @@ # first create the Distribution instance try: dist = packaging.database.Distribution(path) - except IOError: + except FileNotFoundError: sys.exit('No such distribution') print('Information about %r' % dist.name) diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst --- a/Doc/library/readline.rst +++ b/Doc/library/readline.rst @@ -199,7 +199,7 @@ histfile = os.path.join(os.path.expanduser("~"), ".pyhist") try: readline.read_history_file(histfile) - except IOError: + except FileNotFoundError: pass import atexit atexit.register(readline.write_history_file, histfile) @@ -224,7 +224,7 @@ if hasattr(readline, "read_history_file"): try: readline.read_history_file(histfile) - except IOError: + except FileNotFoundError: pass atexit.register(self.save_history, histfile) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -51,11 +51,14 @@ *dst* must be the complete target file name; look at :func:`copy` for a copy that accepts a target directory path. If *src* and *dst* are the same files, :exc:`Error` is raised. - The destination location must be writable; otherwise, an :exc:`IOError` exception + The destination location must be writable; otherwise, an :exc:`OSError` exception will be raised. If *dst* already exists, it will be replaced. Special files such as character or block devices and pipes cannot be copied with this function. *src* and *dst* are path names given as strings. + .. versionchanged:: 3.3 + :exc:`IOError` used to be raised instead of :exc:`OSError`. + .. function:: copymode(src, dst) diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -262,9 +262,9 @@ If *errorlevel* is ``0``, all errors are ignored when using :meth:`TarFile.extract`. Nevertheless, they appear as error messages in the debug output, when debugging - is enabled. If ``1``, all *fatal* errors are raised as :exc:`OSError` or - :exc:`IOError` exceptions. If ``2``, all *non-fatal* errors are raised as - :exc:`TarError` exceptions as well. + is enabled. If ``1``, all *fatal* errors are raised as :exc:`OSError` + exceptions. If ``2``, all *non-fatal* errors are raised as :exc:`TarError` + exceptions as well. The *encoding* and *errors* arguments define the character encoding to be used for reading or writing the archive and how conversion errors are going diff --git a/Doc/library/urllib.error.rst b/Doc/library/urllib.error.rst --- a/Doc/library/urllib.error.rst +++ b/Doc/library/urllib.error.rst @@ -8,20 +8,23 @@ The :mod:`urllib.error` module defines the exception classes for exceptions -raised by :mod:`urllib.request`. The base exception class is :exc:`URLError`, -which inherits from :exc:`IOError`. +raised by :mod:`urllib.request`. The base exception class is :exc:`URLError`. The following exceptions are raised by :mod:`urllib.error` as appropriate: .. exception:: URLError The handlers raise this exception (or derived exceptions) when they run into - a problem. It is a subclass of :exc:`IOError`. + a problem. It is a subclass of :exc:`OSError`. .. attribute:: reason The reason for this error. It can be a message string or another - exception instance such as :exc:`OSError`. + exception instance. + + .. versionchanged:: 3.3 + :exc:`URLError` has been made a subclass of :exc:`OSError` instead + of :exc:`IOError`. .. exception:: HTTPError diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -85,9 +85,12 @@ .. method:: get_data(pathname) - Return the data associated with *pathname*. Raise :exc:`IOError` if the + Return the data associated with *pathname*. Raise :exc:`OSError` if the file wasn't found. + .. versionchanged:: 3.3 + :exc:`IOError` used to be raised instead of :exc:`OSError`. + .. method:: get_filename(fullname) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 20:34:18 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 20:34:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_What=27s_New_in_Python_3=2E?= =?utf8?q?3=3A_mention_the_PEP_3151?= Message-ID: http://hg.python.org/cpython/rev/bff65cb4aa7c changeset: 72895:bff65cb4aa7c user: Victor Stinner date: Wed Oct 12 20:35:02 2011 +0200 summary: What's New in Python 3.3: mention the PEP 3151 files: Doc/whatsnew/3.3.rst | 63 ++++++++++++++++++++++++++++++++ 1 files changed, 63 insertions(+), 0 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -109,6 +109,69 @@ XXX mention new and deprecated functions and macros +PEP 3151: Reworking the OS and IO exception hierarchy +===================================================== + +:pep:`3151` - Reworking the OS and IO exception hierarchy +PEP written and implemented by Antoine Pitrou. + +New subclasses of :exc:`OSError` exceptions: + + * :exc:`BlockingIOError` + * :exc:`ChildProcessError` + * :exc:`ConnectionError` + + * :exc:`BrokenPipeError` + * :exc:`ConnectionAbortedError` + * :exc:`ConnectionRefusedError` + * :exc:`ConnectionResetError` + + * :exc:`FileExistsError` + * :exc:`FileNotFoundError` + * :exc:`InterruptedError` + * :exc:`IsADirectoryError` + * :exc:`NotADirectoryError` + * :exc:`PermissionError` + * :exc:`ProcessLookupError` + * :exc:`TimeoutError` + +The following exceptions have been merged into :exc:`OSError`: + + * :exc:`EnvironmentError` + * :exc:`IOError` + * :exc:`WindowsError` + * :exc:`VMSError` + * :exc:`socket.error` + * :exc:`select.error` + * :exc:`mmap.error` + +Thanks to the new exceptions, common usages of the :mod:`errno` can now be +avoided. For example, the following code written for Python 3.2: :: + + from errno import ENOENT, EACCES, EPERM + + try: + with open("document.txt") as f: + content = f.read() + except IOError as err: + if err.errno == ENOENT: + print("document.txt file is missing") + elif err.errno in (EACCES, EPERM): + print("You are not allowed to read document.txt") + else: + raise + +can now be written without the :mod:`errno` import: :: + + try: + with open("document.txt") as f: + content = f.read() + except FileNotFoundError: + print("document.txt file is missing") + except PermissionError: + print("You are not allowed to read document.txt") + + Other Language Changes ====================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 21:01:02 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 21:01:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312367=3A_Add_a_tes?= =?utf8?q?t_on_error_attribute_of_select=2Eerror?= Message-ID: http://hg.python.org/cpython/rev/8bbfb24d4824 changeset: 72896:8bbfb24d4824 user: Victor Stinner date: Wed Oct 12 21:01:46 2011 +0200 summary: Issue #12367: Add a test on error attribute of select.error Thanks to the PEP 3151, select.error (which is just an alias to OSError) has now an error attribute. files: Lib/test/test_select.py | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -1,8 +1,9 @@ +import errno +import os +import select +import sys +import unittest from test import support -import unittest -import select -import os -import sys @unittest.skipIf(sys.platform[:3] in ('win', 'os2', 'riscos'), "can't easily test on this system") @@ -22,6 +23,17 @@ self.assertRaises(TypeError, select.select, [], [], [], "not a number") self.assertRaises(ValueError, select.select, [], [], [], -1) + def test_errno(self): + with open(__file__, 'rb') as fp: + fd = fp.fileno() + fp.close() + try: + select.select([fd], [], []) + except select.error as err: + self.assertEqual(err.errno, errno.EBADF) + else: + self.fail("exception not raised") + def test_returned_list_identity(self): # See issue #8329 r, w, x = select.select([], [], [], 1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 21:07:33 2011 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 12 Oct 2011 21:07:33 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTU2?= =?utf8?q?=3A_revert_changeset_f6feed6ec3f9=2C_which_was_only_relevant_for?= =?utf8?q?_native?= Message-ID: http://hg.python.org/cpython/rev/ee4fe16d9b48 changeset: 72897:ee4fe16d9b48 branch: 2.7 parent: 69635:f6feed6ec3f9 user: Charles-Fran?ois Natali date: Wed Oct 12 21:07:54 2011 +0200 summary: Issue #13156: revert changeset f6feed6ec3f9, which was only relevant for native TLS implementations, and fails with the ad-hoc TLS implementation when a thread doesn't have an auto thread state (e.g. a thread created outside of Python calling into a subinterpreter). files: Include/pystate.h | 1 - Misc/NEWS | 4 ---- Modules/signalmodule.c | 1 - Python/pystate.c | 17 ----------------- 4 files changed, 0 insertions(+), 23 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h --- a/Include/pystate.h +++ b/Include/pystate.h @@ -111,7 +111,6 @@ PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); #ifdef WITH_THREAD PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); -PyAPI_FUNC(void) _PyGILState_Reinit(void); #endif PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,10 +61,6 @@ Library ------- -- Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_* - APIs, to avoid a crash with the pthread implementation in RHEL 5. Patch - by Charles-Fran?ois Natali. - - Issue #11763: don't use difflib in TestCase.assertMultiLineEqual if the strings are too long. diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -976,7 +976,6 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD - _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); diff --git a/Python/pystate.c b/Python/pystate.c --- a/Python/pystate.c +++ b/Python/pystate.c @@ -537,23 +537,6 @@ autoInterpreterState = NULL; } -/* Reset the TLS key - called by PyOS_AfterFork. - * This should not be necessary, but some - buggy - pthread implementations - * don't flush TLS on fork, see issue #10517. - */ -void -_PyGILState_Reinit(void) -{ - PyThreadState *tstate = PyGILState_GetThisThreadState(); - PyThread_delete_key(autoTLSkey); - if ((autoTLSkey = PyThread_create_key()) == -1) - Py_FatalError("Could not allocate TLS entry"); - - /* re-associate the current thread state with the new key */ - if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) - Py_FatalError("Couldn't create autoTLSkey mapping"); -} - /* When a thread state is created for a thread by some mechanism other than PyGILState_Ensure, it's important that the GILState machinery knows about it so it doesn't try to create another thread state for the thread (this is -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 21:07:34 2011 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 12 Oct 2011 21:07:34 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Merge=2E?= Message-ID: http://hg.python.org/cpython/rev/6292312c5a29 changeset: 72898:6292312c5a29 branch: 2.7 parent: 72844:70178bad66b0 parent: 72897:ee4fe16d9b48 user: Charles-Fran?ois Natali date: Wed Oct 12 21:10:02 2011 +0200 summary: Merge. files: Include/pystate.h | 1 - Modules/signalmodule.c | 1 - Python/pystate.c | 17 ----------------- 3 files changed, 0 insertions(+), 19 deletions(-) diff --git a/Include/pystate.h b/Include/pystate.h --- a/Include/pystate.h +++ b/Include/pystate.h @@ -111,7 +111,6 @@ PyAPI_FUNC(void) PyThreadState_Delete(PyThreadState *); #ifdef WITH_THREAD PyAPI_FUNC(void) PyThreadState_DeleteCurrent(void); -PyAPI_FUNC(void) _PyGILState_Reinit(void); #endif PyAPI_FUNC(PyThreadState *) PyThreadState_Get(void); diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -976,7 +976,6 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD - _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); diff --git a/Python/pystate.c b/Python/pystate.c --- a/Python/pystate.c +++ b/Python/pystate.c @@ -537,23 +537,6 @@ autoInterpreterState = NULL; } -/* Reset the TLS key - called by PyOS_AfterFork. - * This should not be necessary, but some - buggy - pthread implementations - * don't flush TLS on fork, see issue #10517. - */ -void -_PyGILState_Reinit(void) -{ - PyThreadState *tstate = PyGILState_GetThisThreadState(); - PyThread_delete_key(autoTLSkey); - if ((autoTLSkey = PyThread_create_key()) == -1) - Py_FatalError("Could not allocate TLS entry"); - - /* re-associate the current thread state with the new key */ - if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) - Py_FatalError("Couldn't create autoTLSkey mapping"); -} - /* When a thread state is created for a thread by some mechanism other than PyGILState_Ensure, it's important that the GILState machinery knows about it so it doesn't try to create another thread state for the thread (this is -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 22:14:16 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 22:14:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313157=3A_Fix_build?= =?utf8?q?ing_Python_outside_its_source_tree?= Message-ID: http://hg.python.org/cpython/rev/1811c4e5527f changeset: 72899:1811c4e5527f parent: 72896:8bbfb24d4824 user: Victor Stinner date: Wed Oct 12 22:09:40 2011 +0200 summary: Issue #13157: Fix building Python outside its source tree files: Makefile.pre.in | 180 ++++++++++++++++++----------------- 1 files changed, 92 insertions(+), 88 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -258,9 +258,9 @@ Parser/pgenmain.o PARSER_HEADERS= \ - Parser/parser.h \ - Include/parsetok.h \ - Parser/tokenizer.h + $(srcdir)/Parser/parser.h \ + $(srcdir)/Include/parsetok.h \ + $(srcdir)/Parser/tokenizer.h PGENOBJS= $(PGENMAIN) $(POBJS) $(PGOBJS) @@ -370,7 +370,7 @@ Objects/obmalloc.o \ Objects/capsule.o \ Objects/rangeobject.o \ - Objects/setobject.o \ + Objects/setobject.o \ Objects/sliceobject.o \ Objects/structseq.o \ Objects/tupleobject.o \ @@ -571,6 +571,9 @@ Modules/python.o: $(srcdir)/Modules/python.c $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/python.c +Modules/_testembed.o: $(srcdir)/Modules/_testembed.c + $(MAINCC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Modules/_testembed.c + Python/dynload_shlib.o: $(srcdir)/Python/dynload_shlib.c Makefile $(CC) -c $(PY_CORE_CFLAGS) \ -DSOABI='"$(SOABI)"' \ @@ -600,6 +603,7 @@ Parser/tokenizer_pgen.o: $(srcdir)/Parser/tokenizer.c Parser/parsetok_pgen.o: $(srcdir)/Parser/parsetok.c +Parser/printgrammar.o: $(srcdir)/Parser/printgrammar.c Parser/pgenmain.o: $(srcdir)/Include/parsetok.h @@ -647,7 +651,7 @@ $(OPCODETARGETS_H): $(OPCODETARGETGEN_FILES) $(OPCODETARGETGEN) $(OPCODETARGETS_H) -Python/ceval.o: $(OPCODETARGETS_H) Python/ceval_gil.h +Python/ceval.o: $(OPCODETARGETS_H) $(srcdir)/Python/ceval_gil.h Python/formatter_unicode.o: $(srcdir)/Python/formatter_unicode.c \ $(BYTESTR_DEPS) @@ -660,88 +664,88 @@ # Header files PYTHON_HEADERS= \ - Include/Python.h \ - Include/abstract.h \ - Include/accu.h \ - Include/asdl.h \ - Include/ast.h \ - Include/bltinmodule.h \ - Include/bitset.h \ - Include/boolobject.h \ - Include/bytes_methods.h \ - Include/bytearrayobject.h \ - Include/bytesobject.h \ - Include/cellobject.h \ - Include/ceval.h \ - Include/classobject.h \ - Include/code.h \ - Include/codecs.h \ - Include/compile.h \ - Include/complexobject.h \ - Include/descrobject.h \ - Include/dictobject.h \ - Include/dtoa.h \ - Include/dynamic_annotations.h \ - Include/enumobject.h \ - Include/errcode.h \ - Include/eval.h \ - Include/fileobject.h \ - Include/fileutils.h \ - Include/floatobject.h \ - Include/frameobject.h \ - Include/funcobject.h \ - Include/genobject.h \ - Include/import.h \ - Include/intrcheck.h \ - Include/iterobject.h \ - Include/listobject.h \ - Include/longintrepr.h \ - Include/longobject.h \ - Include/marshal.h \ - Include/memoryobject.h \ - Include/metagrammar.h \ - Include/methodobject.h \ - Include/modsupport.h \ - Include/moduleobject.h \ - Include/node.h \ - Include/object.h \ - Include/objimpl.h \ - Include/opcode.h \ - Include/osdefs.h \ - Include/patchlevel.h \ - Include/pgen.h \ - Include/pgenheaders.h \ - Include/pyarena.h \ - Include/pyatomic.h \ - Include/pycapsule.h \ - Include/pyctype.h \ - Include/pydebug.h \ - Include/pyerrors.h \ - Include/pyfpe.h \ - Include/pymath.h \ - Include/pygetopt.h \ - Include/pymacro.h \ - Include/pymem.h \ - Include/pyport.h \ - Include/pystate.h \ - Include/pystrcmp.h \ - Include/pystrtod.h \ - Include/pythonrun.h \ - Include/pythread.h \ - Include/pytime.h \ - Include/rangeobject.h \ - Include/setobject.h \ - Include/sliceobject.h \ - Include/structmember.h \ - Include/structseq.h \ - Include/symtable.h \ - Include/sysmodule.h \ - Include/traceback.h \ - Include/tupleobject.h \ - Include/ucnhash.h \ - Include/unicodeobject.h \ - Include/warnings.h \ - Include/weakrefobject.h \ + $(srcdir)/Include/Python.h \ + $(srcdir)/Include/abstract.h \ + $(srcdir)/Include/accu.h \ + $(srcdir)/Include/asdl.h \ + $(srcdir)/Include/ast.h \ + $(srcdir)/Include/bltinmodule.h \ + $(srcdir)/Include/bitset.h \ + $(srcdir)/Include/boolobject.h \ + $(srcdir)/Include/bytes_methods.h \ + $(srcdir)/Include/bytearrayobject.h \ + $(srcdir)/Include/bytesobject.h \ + $(srcdir)/Include/cellobject.h \ + $(srcdir)/Include/ceval.h \ + $(srcdir)/Include/classobject.h \ + $(srcdir)/Include/code.h \ + $(srcdir)/Include/codecs.h \ + $(srcdir)/Include/compile.h \ + $(srcdir)/Include/complexobject.h \ + $(srcdir)/Include/descrobject.h \ + $(srcdir)/Include/dictobject.h \ + $(srcdir)/Include/dtoa.h \ + $(srcdir)/Include/dynamic_annotations.h \ + $(srcdir)/Include/enumobject.h \ + $(srcdir)/Include/errcode.h \ + $(srcdir)/Include/eval.h \ + $(srcdir)/Include/fileobject.h \ + $(srcdir)/Include/fileutils.h \ + $(srcdir)/Include/floatobject.h \ + $(srcdir)/Include/frameobject.h \ + $(srcdir)/Include/funcobject.h \ + $(srcdir)/Include/genobject.h \ + $(srcdir)/Include/import.h \ + $(srcdir)/Include/intrcheck.h \ + $(srcdir)/Include/iterobject.h \ + $(srcdir)/Include/listobject.h \ + $(srcdir)/Include/longintrepr.h \ + $(srcdir)/Include/longobject.h \ + $(srcdir)/Include/marshal.h \ + $(srcdir)/Include/memoryobject.h \ + $(srcdir)/Include/metagrammar.h \ + $(srcdir)/Include/methodobject.h \ + $(srcdir)/Include/modsupport.h \ + $(srcdir)/Include/moduleobject.h \ + $(srcdir)/Include/node.h \ + $(srcdir)/Include/object.h \ + $(srcdir)/Include/objimpl.h \ + $(srcdir)/Include/opcode.h \ + $(srcdir)/Include/osdefs.h \ + $(srcdir)/Include/patchlevel.h \ + $(srcdir)/Include/pgen.h \ + $(srcdir)/Include/pgenheaders.h \ + $(srcdir)/Include/pyarena.h \ + $(srcdir)/Include/pyatomic.h \ + $(srcdir)/Include/pycapsule.h \ + $(srcdir)/Include/pyctype.h \ + $(srcdir)/Include/pydebug.h \ + $(srcdir)/Include/pyerrors.h \ + $(srcdir)/Include/pyfpe.h \ + $(srcdir)/Include/pymath.h \ + $(srcdir)/Include/pygetopt.h \ + $(srcdir)/Include/pymacro.h \ + $(srcdir)/Include/pymem.h \ + $(srcdir)/Include/pyport.h \ + $(srcdir)/Include/pystate.h \ + $(srcdir)/Include/pystrcmp.h \ + $(srcdir)/Include/pystrtod.h \ + $(srcdir)/Include/pythonrun.h \ + $(srcdir)/Include/pythread.h \ + $(srcdir)/Include/pytime.h \ + $(srcdir)/Include/rangeobject.h \ + $(srcdir)/Include/setobject.h \ + $(srcdir)/Include/sliceobject.h \ + $(srcdir)/Include/structmember.h \ + $(srcdir)/Include/structseq.h \ + $(srcdir)/Include/symtable.h \ + $(srcdir)/Include/sysmodule.h \ + $(srcdir)/Include/traceback.h \ + $(srcdir)/Include/tupleobject.h \ + $(srcdir)/Include/ucnhash.h \ + $(srcdir)/Include/unicodeobject.h \ + $(srcdir)/Include/warnings.h \ + $(srcdir)/Include/weakrefobject.h \ pyconfig.h \ $(PARSER_HEADERS) @@ -1231,7 +1235,7 @@ --root=$(DESTDIR)/ # Build the toplevel Makefile -Makefile.pre: Makefile.pre.in config.status +Makefile.pre: $(srcdir)/Makefile.pre.in config.status CONFIG_FILES=Makefile.pre CONFIG_HEADERS= $(SHELL) config.status $(MAKE) -f Makefile.pre Makefile -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 22:26:27 2011 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 12 Oct 2011 22:26:27 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTU2?= =?utf8?q?=3A_Add_an_entry_in_Misc/NEWS=2E?= Message-ID: http://hg.python.org/cpython/rev/3313ce92cef7 changeset: 72900:3313ce92cef7 branch: 2.7 parent: 72898:6292312c5a29 user: Charles-Fran?ois Natali date: Wed Oct 12 22:29:09 2011 +0200 summary: Issue #13156: Add an entry in Misc/NEWS. files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #13156: Revert the patch for issue #10517 (reset TLS upon fork()), + which was only relevant for the native pthread TLS implementation. + - Issue #7732: Fix a crash on importing a module if a directory has the same name than a Python module (e.g. "__init__.py"): don't close the file twice. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 12 23:53:35 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 12 Oct 2011 23:53:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Unicode_replace=28=29_avoid?= =?utf8?q?s_calling_unicode=5Fadjust=5Fmaxchar=28=29_when_it=27s_useless?= Message-ID: http://hg.python.org/cpython/rev/5b0abbdf7f1a changeset: 72901:5b0abbdf7f1a parent: 72899:1811c4e5527f user: Victor Stinner date: Wed Oct 12 23:46:10 2011 +0200 summary: Unicode replace() avoids calling unicode_adjust_maxchar() when it's useless Add also a special case if the result is an empty string. files: Objects/unicodeobject.c | 80 ++++++++++++++-------------- 1 files changed, 39 insertions(+), 41 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9686,6 +9686,8 @@ Py_ssize_t slen = PyUnicode_GET_LENGTH(self); Py_ssize_t len1 = PyUnicode_GET_LENGTH(str1); Py_ssize_t len2 = PyUnicode_GET_LENGTH(str2); + int mayshrink; + Py_UCS4 maxchar, maxchar_str2; if (maxcount < 0) maxcount = PY_SSIZE_T_MAX; @@ -9698,6 +9700,13 @@ /* substring too wide to be present */ goto nothing; + maxchar = PyUnicode_MAX_CHAR_VALUE(self); + maxchar_str2 = PyUnicode_MAX_CHAR_VALUE(str2); + /* Replacing str1 with str2 may cause a maxchar reduction in the + result string. */ + mayshrink = (maxchar_str2 < maxchar); + maxchar = Py_MAX(maxchar, maxchar_str2); + if (len1 == len2) { Py_ssize_t i; /* same length */ @@ -9705,22 +9714,13 @@ goto nothing; if (len1 == 1) { /* replace characters */ - Py_UCS4 u1, u2, maxchar; - int mayshrink, rkind; + Py_UCS4 u1, u2; + int rkind; u1 = PyUnicode_READ_CHAR(str1, 0); if (!findchar(sbuf, PyUnicode_KIND(self), slen, u1, 1)) goto nothing; u2 = PyUnicode_READ_CHAR(str2, 0); - maxchar = PyUnicode_MAX_CHAR_VALUE(self); - /* Replacing u1 with u2 may cause a maxchar reduction in the - result string. */ - if (u2 > maxchar) { - maxchar = u2; - mayshrink = 0; - } - else - mayshrink = maxchar > 127; u = PyUnicode_New(slen, maxchar); if (!u) goto error; @@ -9732,16 +9732,10 @@ break; PyUnicode_WRITE(rkind, PyUnicode_DATA(u), i, u2); } - if (mayshrink) { - unicode_adjust_maxchar(&u); - if (u == NULL) - goto error; - } - } else { + } + else { int rkind = skind; char *res; - PyObject *rstr; - Py_UCS4 maxchar; if (kind1 < rkind) { /* widen substring */ @@ -9769,12 +9763,11 @@ if (!buf1) goto error; release1 = 1; } - maxchar = PyUnicode_MAX_CHAR_VALUE(self); - maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(str2)); - rstr = PyUnicode_New(slen, maxchar); - if (!rstr) + u = PyUnicode_New(slen, maxchar); + if (!u) goto error; - res = PyUnicode_DATA(rstr); + assert(PyUnicode_KIND(u) == rkind); + res = PyUnicode_DATA(u); memcpy(res, sbuf, rkind * slen); /* change everything in-place, starting with this one */ @@ -9794,22 +9787,16 @@ rkind * len2); i += len1; } - - u = rstr; - unicode_adjust_maxchar(&u); - if (!u) - goto error; - } - } else { - + } + } + else { Py_ssize_t n, i, j, ires; Py_ssize_t product, new_size; int rkind = skind; - PyObject *rstr; char *res; - Py_UCS4 maxchar; if (kind1 < rkind) { + /* widen substring */ buf1 = _PyUnicode_AsKind(str1, rkind); if (!buf1) goto error; release1 = 1; @@ -9818,11 +9805,13 @@ if (n == 0) goto nothing; if (kind2 < rkind) { + /* widen replacement */ buf2 = _PyUnicode_AsKind(str2, rkind); if (!buf2) goto error; release2 = 1; } else if (kind2 > rkind) { + /* widen self and buf1 */ rkind = kind2; sbuf = _PyUnicode_AsKind(self, rkind); if (!sbuf) goto error; @@ -9841,17 +9830,21 @@ goto error; } new_size = slen + product; + if (new_size == 0) { + Py_INCREF(unicode_empty); + u = unicode_empty; + goto done; + } if (new_size < 0 || new_size > (PY_SSIZE_T_MAX >> (rkind-1))) { PyErr_SetString(PyExc_OverflowError, "replace string is too long"); goto error; } - maxchar = PyUnicode_MAX_CHAR_VALUE(self); - maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(str2)); - rstr = PyUnicode_New(new_size, maxchar); - if (!rstr) + u = PyUnicode_New(new_size, maxchar); + if (!u) goto error; - res = PyUnicode_DATA(rstr); + assert(PyUnicode_KIND(u) == rkind); + res = PyUnicode_DATA(u); ires = i = 0; if (len1 > 0) { while (n-- > 0) { @@ -9882,7 +9875,8 @@ memcpy(res + rkind * ires, sbuf + rkind * i, rkind * (slen-i)); - } else { + } + else { /* interleave */ while (n > 0) { memcpy(res + rkind * ires, @@ -9901,11 +9895,15 @@ sbuf + rkind * i, rkind * (slen-i)); } - u = rstr; + } + + if (mayshrink) { unicode_adjust_maxchar(&u); if (u == NULL) goto error; } + + done: if (srelease) PyMem_FREE(sbuf); if (release1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 00:08:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 00:08:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313155=3A_Optimize_?= =?utf8?q?finding_the_optimal_character_width_of_an_unicode_string?= Message-ID: http://hg.python.org/cpython/rev/9c7d3207fc15 changeset: 72902:9c7d3207fc15 user: Antoine Pitrou date: Thu Oct 13 00:02:27 2011 +0200 summary: Issue #13155: Optimize finding the optimal character width of an unicode string files: Makefile.pre.in | 1 + Objects/stringlib/find_max_char.h | 136 +++++++++++++++ Objects/unicodeobject.c | 158 +++++++---------- 3 files changed, 207 insertions(+), 88 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -631,6 +631,7 @@ $(srcdir)/Objects/stringlib/eq.h \ $(srcdir)/Objects/stringlib/fastsearch.h \ $(srcdir)/Objects/stringlib/find.h \ + $(srcdir)/Objects/stringlib/find_max_char.h \ $(srcdir)/Objects/stringlib/partition.h \ $(srcdir)/Objects/stringlib/split.h \ $(srcdir)/Objects/stringlib/stringdefs.h \ diff --git a/Objects/stringlib/find_max_char.h b/Objects/stringlib/find_max_char.h new file mode 100644 --- /dev/null +++ b/Objects/stringlib/find_max_char.h @@ -0,0 +1,136 @@ +/* Finding the optimal width of unicode characters in a buffer */ + +#if STRINGLIB_IS_UNICODE + +/* Mask to check or force alignment of a pointer to C 'long' boundaries */ +#define LONG_PTR_MASK (size_t) (SIZEOF_LONG - 1) + +/* Mask to quickly check whether a C 'long' contains a + non-ASCII, UTF8-encoded char. */ +#if (SIZEOF_LONG == 8) +# define UCS1_ASCII_CHAR_MASK 0x8080808080808080L +#elif (SIZEOF_LONG == 4) +# define UCS1_ASCII_CHAR_MASK 0x80808080L +#else +# error C 'long' size should be either 4 or 8! +#endif + +#if STRINGLIB_SIZEOF_CHAR == 1 + +Py_LOCAL_INLINE(Py_UCS4) +STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end) +{ + const unsigned char *p = (const unsigned char *) begin; + const unsigned char *aligned_end = (const unsigned char *) ((size_t) end & ~LONG_PTR_MASK); + + while (p < end) { + if (!((size_t) p & LONG_PTR_MASK)) { + /* Help register allocation */ + register const unsigned char *_p = p; + while (_p < aligned_end) { + unsigned long value = *(unsigned long *) _p; + if (value & UCS1_ASCII_CHAR_MASK) + return 255; + _p += SIZEOF_LONG; + } + p = _p; + if (p == end) + break; + } + if (*p++ & 0x80) + return 255; + } + return 127; +} + +#undef LONG_PTR_MASK +#undef ASCII_CHAR_MASK + +#else /* STRINGLIB_SIZEOF_CHAR == 1 */ + +#define MASK_ASCII 0xFFFFFF80 +#define MASK_UCS1 0xFFFFFF00 +#define MASK_UCS2 0xFFFF0000 + +#define MAX_CHAR_ASCII 0x7f +#define MAX_CHAR_UCS1 0xff +#define MAX_CHAR_UCS2 0xffff +#define MAX_CHAR_UCS4 0x10ffff + +Py_LOCAL_INLINE(Py_UCS4) +STRINGLIB(find_max_char)(const STRINGLIB_CHAR *begin, const STRINGLIB_CHAR *end) +{ +#if STRINGLIB_SIZEOF_CHAR == 2 + const Py_UCS4 mask_limit = MASK_UCS1; + const Py_UCS4 max_char_limit = MAX_CHAR_UCS2; +#elif STRINGLIB_SIZEOF_CHAR == 4 + const Py_UCS4 mask_limit = MASK_UCS2; + const Py_UCS4 max_char_limit = MAX_CHAR_UCS4; +#else +#error Invalid STRINGLIB_SIZEOF_CHAR (must be 1, 2 or 4) +#endif + register Py_UCS4 mask; + Py_ssize_t n = end - begin; + const STRINGLIB_CHAR *p = begin; + const STRINGLIB_CHAR *unrolled_end = begin + (n & ~ (Py_ssize_t) 3); + Py_UCS4 max_char; + + max_char = MAX_CHAR_ASCII; + mask = MASK_ASCII; + while (p < unrolled_end) { + STRINGLIB_CHAR bits = p[0] | p[1] | p[2] | p[3]; + if (bits & mask) { + if (mask == mask_limit) { + /* Limit reached */ + return max_char_limit; + } + if (mask == MASK_ASCII) { + max_char = MAX_CHAR_UCS1; + mask = MASK_UCS1; + } + else { + /* mask can't be MASK_UCS2 because of mask_limit above */ + assert(mask == MASK_UCS1); + max_char = MAX_CHAR_UCS2; + mask = MASK_UCS2; + } + /* We check the new mask on the same chars in the next iteration */ + continue; + } + p += 4; + } + while (p < end) { + if (p[0] & mask) { + if (mask == mask_limit) { + /* Limit reached */ + return max_char_limit; + } + if (mask == MASK_ASCII) { + max_char = MAX_CHAR_UCS1; + mask = MASK_UCS1; + } + else { + /* mask can't be MASK_UCS2 because of mask_limit above */ + assert(mask == MASK_UCS1); + max_char = MAX_CHAR_UCS2; + mask = MASK_UCS2; + } + /* We check the new mask on the same chars in the next iteration */ + continue; + } + p++; + } + return max_char; +} + +#undef MASK_ASCII +#undef MASK_UCS1 +#undef MASK_UCS2 +#undef MAX_CHAR_ASCII +#undef MAX_CHAR_UCS1 +#undef MAX_CHAR_UCS2 +#undef MAX_CHAR_UCS4 + +#endif /* STRINGLIB_SIZEOF_CHAR == 1 */ +#endif /* STRINGLIB_IS_UNICODE */ + diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -260,6 +260,15 @@ #endif static PyObject * +unicode_fromascii(const unsigned char *s, Py_ssize_t size); +static PyObject * +_PyUnicode_FromUCS1(const unsigned char *s, Py_ssize_t size); +static PyObject * +_PyUnicode_FromUCS2(const Py_UCS2 *s, Py_ssize_t size); +static PyObject * +_PyUnicode_FromUCS4(const Py_UCS4 *s, Py_ssize_t size); + +static PyObject * unicode_encode_call_errorhandler(const char *errors, PyObject **errorHandler,const char *encoding, const char *reason, const Py_UNICODE *unicode, Py_ssize_t size, PyObject **exceptionObject, @@ -468,6 +477,48 @@ (BLOOM(mask, chr) \ && (PyUnicode_FindChar(str, chr, 0, PyUnicode_GET_LENGTH(str), 1) >= 0)) +/* Compilation of templated routines */ + +#include "stringlib/asciilib.h" +#include "stringlib/fastsearch.h" +#include "stringlib/partition.h" +#include "stringlib/split.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/find_max_char.h" +#include "stringlib/localeutil.h" +#include "stringlib/undef.h" + +#include "stringlib/ucs1lib.h" +#include "stringlib/fastsearch.h" +#include "stringlib/partition.h" +#include "stringlib/split.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/find_max_char.h" +#include "stringlib/localeutil.h" +#include "stringlib/undef.h" + +#include "stringlib/ucs2lib.h" +#include "stringlib/fastsearch.h" +#include "stringlib/partition.h" +#include "stringlib/split.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/find_max_char.h" +#include "stringlib/localeutil.h" +#include "stringlib/undef.h" + +#include "stringlib/ucs4lib.h" +#include "stringlib/fastsearch.h" +#include "stringlib/partition.h" +#include "stringlib/split.h" +#include "stringlib/count.h" +#include "stringlib/find.h" +#include "stringlib/find_max_char.h" +#include "stringlib/localeutil.h" +#include "stringlib/undef.h" + /* --- Unicode Object ----------------------------------------------------- */ static PyObject * @@ -1689,17 +1740,11 @@ { PyObject *res; unsigned char max_char = 127; - Py_ssize_t i; assert(size >= 0); if (size == 1) return get_latin1_char(u[0]); - for (i = 0; i < size; i++) { - if (u[i] & 0x80) { - max_char = 255; - break; - } - } + max_char = ucs1lib_find_max_char(u, u + size); res = PyUnicode_New(size, max_char); if (!res) return NULL; @@ -1713,26 +1758,20 @@ { PyObject *res; Py_UCS2 max_char = 0; - Py_ssize_t i; assert(size >= 0); if (size == 1 && u[0] < 256) return get_latin1_char((unsigned char)u[0]); - for (i = 0; i < size; i++) { - if (u[i] > max_char) { - max_char = u[i]; - if (max_char >= 256) - break; - } - } + max_char = ucs2lib_find_max_char(u, u + size); res = PyUnicode_New(size, max_char); if (!res) return NULL; if (max_char >= 256) memcpy(PyUnicode_2BYTE_DATA(res), u, sizeof(Py_UCS2)*size); - else - for (i = 0; i < size; i++) - PyUnicode_1BYTE_DATA(res)[i] = (Py_UCS1)u[i]; + else { + _PyUnicode_CONVERT_BYTES( + Py_UCS2, Py_UCS1, u, u + size, PyUnicode_1BYTE_DATA(res)); + } assert(_PyUnicode_CheckConsistency(res, 1)); return res; } @@ -1742,18 +1781,11 @@ { PyObject *res; Py_UCS4 max_char = 0; - Py_ssize_t i; assert(size >= 0); if (size == 1 && u[0] < 256) return get_latin1_char(u[0]); - for (i = 0; i < size; i++) { - if (u[i] > max_char) { - max_char = u[i]; - if (max_char >= 0x10000) - break; - } - } + max_char = ucs4lib_find_max_char(u, u + size); res = PyUnicode_New(size, max_char); if (!res) return NULL; @@ -1794,7 +1826,7 @@ { PyObject *unicode, *copy; Py_UCS4 max_char; - Py_ssize_t i, len; + Py_ssize_t len; unsigned int kind; assert(p_unicode != NULL); @@ -1807,37 +1839,23 @@ kind = PyUnicode_KIND(unicode); if (kind == PyUnicode_1BYTE_KIND) { const Py_UCS1 *u = PyUnicode_1BYTE_DATA(unicode); - for (i = 0; i < len; i++) { - if (u[i] & 0x80) - return; - } - max_char = 127; + max_char = ucs1lib_find_max_char(u, u + len); + if (max_char >= 128) + return; } else if (kind == PyUnicode_2BYTE_KIND) { const Py_UCS2 *u = PyUnicode_2BYTE_DATA(unicode); - max_char = 0; - for (i = 0; i < len; i++) { - if (u[i] > max_char) { - max_char = u[i]; - if (max_char >= 256) - return; - } - } + max_char = ucs2lib_find_max_char(u, u + len); + if (max_char >= 256) + return; } else { - const Py_UCS4 *u; + const Py_UCS4 *u = PyUnicode_4BYTE_DATA(unicode); assert(kind == PyUnicode_4BYTE_KIND); - u = PyUnicode_4BYTE_DATA(unicode); - max_char = 0; - for (i = 0; i < len; i++) { - if (u[i] > max_char) { - max_char = u[i]; - if (max_char >= 0x10000) - return; - } - } - } - assert(max_char < PyUnicode_MAX_CHAR_VALUE(unicode)); + max_char = ucs4lib_find_max_char(u, u + len); + if (max_char >= 0x10000) + return; + } copy = PyUnicode_New(len, max_char); copy_characters(copy, 0, unicode, 0, len); Py_DECREF(unicode); @@ -8508,42 +8526,6 @@ /* --- Helpers ------------------------------------------------------------ */ -#include "stringlib/asciilib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/localeutil.h" -#include "stringlib/undef.h" - -#include "stringlib/ucs1lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/localeutil.h" -#include "stringlib/undef.h" - -#include "stringlib/ucs2lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/localeutil.h" -#include "stringlib/undef.h" - -#include "stringlib/ucs4lib.h" -#include "stringlib/fastsearch.h" -#include "stringlib/partition.h" -#include "stringlib/split.h" -#include "stringlib/count.h" -#include "stringlib/find.h" -#include "stringlib/localeutil.h" -#include "stringlib/undef.h" - static Py_ssize_t any_find_slice(int direction, PyObject* s1, PyObject* s2, Py_ssize_t start, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 01:17:29 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 01:17:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_findchar=28=29_for?= =?utf8?q?_PyUnicode=5F1BYTE=5FKIND=3A_use_memchr_and_memrchr?= Message-ID: http://hg.python.org/cpython/rev/e5bd48b43a58 changeset: 72903:e5bd48b43a58 user: Victor Stinner date: Thu Oct 13 00:18:12 2011 +0200 summary: Optimize findchar() for PyUnicode_1BYTE_KIND: use memchr and memrchr files: Objects/unicodeobject.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -530,6 +530,14 @@ { /* like wcschr, but doesn't stop at NULL characters */ Py_ssize_t i; + if (kind == 1) { + if (direction == 1) + return memchr(s, ch, size); +#ifdef HAVE_MEMRCHR + else + return memrchr(s, ch, size); +#endif + } if (direction == 1) { for(i = 0; i < size; i++) if (PyUnicode_READ(kind, s, i) == ch) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 01:17:29 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 01:17:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_PyUnicode=5FMAX=5F?= =?utf8?q?CHAR=5FVALUE?= Message-ID: http://hg.python.org/cpython/rev/f60e8228aeb2 changeset: 72904:f60e8228aeb2 user: Victor Stinner date: Thu Oct 13 01:12:01 2011 +0200 summary: Simplify PyUnicode_MAX_CHAR_VALUE Use PyUnicode_IS_ASCII instead of PyUnicode_IS_COMPACT_ASCII, so the following test can be removed: PyUnicode_DATA(op) == (((PyCompactUnicodeObject *)(op))->utf8) files: Include/unicodeobject.h | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -548,14 +548,13 @@ than iterating over the string. */ #define PyUnicode_MAX_CHAR_VALUE(op) \ (assert(PyUnicode_IS_READY(op)), \ - (PyUnicode_IS_COMPACT_ASCII(op) ? 0x7f: \ + (PyUnicode_IS_ASCII(op) ? \ + (0x7f) : \ (PyUnicode_KIND(op) == PyUnicode_1BYTE_KIND ? \ - (PyUnicode_DATA(op) == (((PyCompactUnicodeObject *)(op))->utf8) ? \ - (0x7fU) : (0xffU) \ - ) : \ + (0xffU) : \ (PyUnicode_KIND(op) == PyUnicode_2BYTE_KIND ? \ - (0xffffU) : (0x10ffffU) \ - )))) + (0xffffU) : \ + (0x10ffffU))))) #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 01:17:30 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 01:17:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Don=27t_use_PyUnicode=5FMAX?= =?utf8?b?X0NIQVJfVkFMVUUoKSBtYWNybyBpbiBQeV9NQVgoKQ==?= Message-ID: http://hg.python.org/cpython/rev/21a8dcd055f5 changeset: 72905:21a8dcd055f5 user: Victor Stinner date: Thu Oct 13 01:12:34 2011 +0200 summary: Don't use PyUnicode_MAX_CHAR_VALUE() macro in Py_MAX() files: Objects/unicodeobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10257,7 +10257,7 @@ PyUnicode_Concat(PyObject *left, PyObject *right) { PyObject *u = NULL, *v = NULL, *w; - Py_UCS4 maxchar; + Py_UCS4 maxchar, maxchar2; /* Coerce the two arguments */ u = PyUnicode_FromObject(left); @@ -10278,7 +10278,8 @@ } maxchar = PyUnicode_MAX_CHAR_VALUE(u); - maxchar = Py_MAX(maxchar, PyUnicode_MAX_CHAR_VALUE(v)); + maxchar2 = PyUnicode_MAX_CHAR_VALUE(v); + maxchar = Py_MAX(maxchar, maxchar2); /* Concat the two Unicode strings */ w = PyUnicode_New( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 01:17:31 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 01:17:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_unicode=5Fsubscrip?= =?utf8?q?t=28=29_for_step_!=3D_1_and_ascii_strings?= Message-ID: http://hg.python.org/cpython/rev/b1ec313b10ae changeset: 72906:b1ec313b10ae user: Victor Stinner date: Thu Oct 13 01:17:06 2011 +0200 summary: Optimize unicode_subscript() for step != 1 and ascii strings files: Objects/unicodeobject.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12614,18 +12614,22 @@ start, start + slicelength); } /* General case */ - max_char = 0; src_kind = PyUnicode_KIND(self); - kind_limit = kind_maxchar_limit(src_kind); src_data = PyUnicode_DATA(self); - for (cur = start, i = 0; i < slicelength; cur += step, i++) { - ch = PyUnicode_READ(src_kind, src_data, cur); - if (ch > max_char) { - max_char = ch; - if (max_char >= kind_limit) - break; - } - } + if (!PyUnicode_IS_ASCII(self)) { + kind_limit = kind_maxchar_limit(src_kind); + max_char = 0; + for (cur = start, i = 0; i < slicelength; cur += step, i++) { + ch = PyUnicode_READ(src_kind, src_data, cur); + if (ch > max_char) { + max_char = ch; + if (max_char >= kind_limit) + break; + } + } + } + else + max_char = 127; result = PyUnicode_New(slicelength, max_char); if (result == NULL) return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 01:59:24 2011 From: python-checkins at python.org (nick.coghlan) Date: Thu, 13 Oct 2011 01:59:24 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_I_had_a_new_idea_I_think_is_si?= =?utf8?q?gnificantly_better=2C_so_this_PEP_is_dead?= Message-ID: http://hg.python.org/peps/rev/e660b277755a changeset: 3958:e660b277755a user: Nick Coghlan date: Thu Oct 13 09:39:12 2011 +1000 summary: I had a new idea I think is significantly better, so this PEP is dead files: pep-3150.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-3150.txt b/pep-3150.txt --- a/pep-3150.txt +++ b/pep-3150.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Deferred +Status: Withdrawn Type: Standards Track Content-Type: text/x-rst Created: 2010-07-09 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 01:59:25 2011 From: python-checkins at python.org (nick.coghlan) Date: Thu, 13 Oct 2011 01:59:25 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_PEP_403=2C_Statement_Local?= =?utf8?q?_Classes_and_Functions=2C_a_significantly_simpler?= Message-ID: http://hg.python.org/peps/rev/2e1f0462a847 changeset: 3959:2e1f0462a847 user: Nick Coghlan date: Thu Oct 13 09:52:39 2011 +1000 summary: Add PEP 403, Statement Local Classes and Functions, a significantly simpler alternative to PEP 3150 files: pep-0403.txt | 304 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 304 insertions(+), 0 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt new file mode 100644 --- /dev/null +++ b/pep-0403.txt @@ -0,0 +1,304 @@ +PEP: 403 +Title: Statement local classes and functions +Version: $Revision$ +Last-Modified: $Date$ +Author: Nick Coghlan +Status: Deferred +Type: Standards Track +Content-Type: text/x-rst +Created: 2011-10-13 +Python-Version: 3.x +Post-History: 2011-10-13 +Resolution: TBD + + +Abstract +======== + +This PEP proposes the addition of ':' as a new class and function prefix +syntax (analogous to decorators) that permits a statement local function or +class definition to be appended to any Python statement that currently does +not have an associated suite. + +In addition, the new syntax would allow the '@' symbol to be used to refer +to the statement local function or class without needing to repeat the name. + +When the ':' prefix syntax is used, the associated statement would be executed +*instead of* the normal local name binding currently implicit in function +and class definitions. + +This PEP is based heavily on many of the ideas in PEP 3150 (Statement Local +Namespaces) so some elements of the rationale will be familiar to readers of +that PEP. That PEP has now been withdrawn in favour of this one. + + +PEP Deferral +============ + +Like PEP 3150, this PEP currently exists in a deferred state. Unlike PEP 3150, +this isn't because I suspect it might be a terrible idea or see nasty problems +lurking in the implementation (aside from one potential parsing issue). + +Instead, it's because I think fleshing out the concept, exploring syntax +variants, creating a reference implementation and generally championing +the idea is going to require more time than I can give it in the 3.3 time +frame. + +So, it's deferred. If anyone wants to step forward to drive the PEP for 3.3, +let me know and I can add you as co-author and move it to Draft status. + + +Basic Examples +============== + +Before diving into the long history of this problem and the detailed +rationale for this specific proposed solution, here are a few simple +examples of the kind of code it is designed to simplify. + +As a trivial example, weakref callbacks could be defined as follows:: + + :x = weakref.ref(obj, @) + def report_destruction(obj): + print("{} is being destroyed".format(obj)) + +This contrasts with the current repetitive "out of order" syntax for this +operation:: + + def report_destruction(obj): + print("{} is being destroyed".format(obj)) + + x = weakref.ref(obj, report_destruction) + +That structure is OK when you're using the callable multiple times, but +it's irritating to be forced into it for one-off operations. + +Similarly, singleton classes could now be defined as:: + + :instance = @() + class OnlyOneInstance: + pass + +Rather than:: + + class OnlyOneInstance: + pass + + instance = OnlyOneInstance() + +And the infamous accumulator example could become:: + + def counter(): + x = 0 + :return @ + def increment(): + nonlocal x + x += 1 + return x + +Proposal +======== + +This PEP proposes the addition of an optional block prefix clause to the +syntax for function and class definitions. + +This block prefix would be introduced by a leading ``:`` and would be +allowed to contain any simple statement (including those that don't +make any sense in that context - while such code would be legal, +there wouldn't be any point in writing it). + +The decorator symbol ``@`` would be repurposed inside the block prefix +to refer to the function or class being defined. + +When a block prefix is provided, it *replaces* the standard local +name binding otherwise implicit in a class or function definition. + + +Background +========== + +The question of "multi-line lambdas" has been a vexing one for many +Python users for a very long time, and it took an exploration of Ruby's +block functionality for me to finally understand why this bugs people +so much: Python's demand that the function be named and introduced +before the operation that needs it breaks the developer's flow of thought. +They get to a point where they go "I need a one-shot operation that does +", and instead of being able to just *say* that, they instead have to back +up, name a function to do , then call that function from the operation +they actually wanted to do in the first place. Lambda expressions can help +sometimes, but they're no substitute for being able to use a full suite. + +Ruby's block syntax also heavily inspired the style of the solution in this +PEP, by making it clear that even when limited to *one* anonymous function per +statement, anonymous functions could still be incredibly useful. Consider how +many constructs Python has where one expression is responsible for the bulk of +the heavy lifting: + + * comprehensions, generator expressions, map(), filter() + * key arguments to sorted(), min(), max() + * partial function application + * provision of callbacks (e.g. for weak references) + * array broadcast operations in NumPy + +However, adopting Ruby's block syntax directly won't work for Python, since +the effectiveness of Ruby's blocks relies heavily on various conventions in +the way functions are *defined* (specifically, Ruby's ``yield`` syntax to +call blocks directly and the ``&arg`` mechanism to accept a block as a +functions final argument. + +Since Python has relied on named functions for so long, the signatures of +APIs that accept callbacks are far more diverse, thus requiring a solution +that allows anonymous functions to be slotted in at the appropriate location. + + +Relation to PEP 3150 +==================== + +PEP 3150 (Statement Local Namespaces) described its primary motivation +as being to elevate ordinary assignment statements to be on par with ``class`` +and ``def`` statements where the name of the item to be defined is presented +to the reader in advance of the details of how the value of that item is +calculated. This PEP achieves the same goal in a different way, by allowing +the simple name binding of a standard function definition to be replaced +with something else (like assigning the result of the function to a value). + +This PEP also achieves most of the other effects described in PEP 3150 +without introducing a new brainbending kind of scope. All of the complex +scoping rules in PEP 3150 are replaced in this PEP with the simple ``@`` +reference to the statement local function or class definition. + + +Symbol Choice +============== + +The ':' symbol was chosen due to its existing presence in Python and its +association with 'functions in expressions' via ``lambda`` expressions. The +past Simple Implicit Lambda proposal (PEP ???) was also a factor. + +The proposal definitely requires *some* kind of prefix to avoid parsing +ambiguity and backwards compatibility problems and ':' at least has the +virtue of brevity. There's no obious alternative symbol that offers a +clear improvement. + +Introducing a new keyword is another possibility, but I haven't come up +with one that really has anything to offer over the leading colon. + + +Syntax Change +============= + +Current:: + + atom: ('(' [yield_expr|testlist_comp] ')' | + '[' [testlist_comp] ']' | + '{' [dictorsetmaker] '}' | + NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') + +Changed:: + + atom: ('(' [yield_expr|testlist_comp] ')' | + '[' [testlist_comp] ']' | + '{' [dictorsetmaker] '}' | + NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' | '@') + +New:: + + blockprefix: ':' simple_stmt + block: blockprefix (decorated | classdef | funcdef) + +The above is the general idea, but I suspect that change to the 'atom' +definition would cause an ambiguity problem in the parser when it comes to +detecting decorator lines. So the actual implementation would be more complex +than that. + +Grammar: http://hg.python.org/cpython/file/default/Grammar/Grammar + + +Possible Implementation Strategy +================================ + +This proposal has one titanic advantage over PEP 3150: implementation +should be relatively straightforward. + +Both the class and function definition statements emit code to perform +the local name binding for their defined name. Implementing this PEP +should just require intercepting that code generation and replacing +it with the code in the block prefix. + +The one potentially tricky part is working out how to allow the dual +use of '@' without rewriting half the grammar definition. + +More Examples +============= + +Calculating attributes without polluting the local namespace (from os.py):: + + # Current Python (manual namespace cleanup) + def _createenviron(): + ... # 27 line function + + environ = _createenviron() + del _createenviron + + # Becomes: + :environ = @() + def _createenviron(): + ... # 27 line function + +Loop early binding:: + + # Current Python (default argument hack) + funcs = [(lambda x, i=i: x + i) for i in range(10)] + + # Becomes: + :funcs = [@(i) for i in range(10)] + def make_incrementor(i): + return lambda x: x + i + + # Or even: + :funcs = [@(i) for i in range(10)] + def make_incrementor(i): + :return @ + def incrementor(x): + return x + i + + +Reference Implementation +======================== + +None as yet. + + +TO DO +===== + +Sort out links and references to everything :) + + +Acknowledgements +================ + +Huge thanks to Gary Bernhardt for being blunt in pointing out that I had no +idea what I was talking about in criticising Ruby's blocks, kicking off a +rather enlightening process of investigation. + + +References +========== + +TBD + + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 02:02:38 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 13 Oct 2011 02:02:38 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_closes_issue13154__Just_co?= =?utf8?q?rrect_the_author_email_id=2C_instead_of_changing?= Message-ID: http://hg.python.org/peps/rev/25ff1adf5f30 changeset: 3960:25ff1adf5f30 parent: 3955:398596beeee3 user: Senthil Kumaran date: Thu Oct 13 08:01:42 2011 +0800 summary: Fix closes issue13154 Just correct the author email id, instead of changing changing the logic for handling multiple emails in pep0/output.py files: pep-0335.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -2,7 +2,7 @@ Title: Overloadable Boolean Operators Version: $Revision$ Last-Modified: $Date$ -Author: Gregory Ewing +Author: Gregory Ewing Status: Draft Type: Standards Track Content-Type: text/x-rst -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 02:02:38 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 13 Oct 2011 02:02:38 +0200 Subject: [Python-checkins] =?utf8?q?peps_=28merge_default_-=3E_default=29?= =?utf8?q?=3A_merge_from_default?= Message-ID: http://hg.python.org/peps/rev/55bd9678e8ac changeset: 3961:55bd9678e8ac parent: 3960:25ff1adf5f30 parent: 3959:2e1f0462a847 user: Senthil Kumaran date: Thu Oct 13 08:02:28 2011 +0800 summary: merge from default files: pep-0393.txt | 2 +- pep-0403.txt | 304 +++++++++++++++++++++++++++++++++++++++ pep-3150.txt | 2 +- pep-3151.txt | 6 +- 4 files changed, 311 insertions(+), 3 deletions(-) diff --git a/pep-0393.txt b/pep-0393.txt --- a/pep-0393.txt +++ b/pep-0393.txt @@ -94,7 +94,7 @@ immediately follow the base structure. If the maximum character is less than 128, they use the PyASCIIObject structure, and the UTF-8 data, the UTF-8 length and the wstr length are the same as the length -and the ASCII data. For non-ASCII strings, the PyCompactObject +of the ASCII data. For non-ASCII strings, the PyCompactObject structure is used. Resizing compact objects is not supported. Objects for which the maximum character is not given at creation time diff --git a/pep-0403.txt b/pep-0403.txt new file mode 100644 --- /dev/null +++ b/pep-0403.txt @@ -0,0 +1,304 @@ +PEP: 403 +Title: Statement local classes and functions +Version: $Revision$ +Last-Modified: $Date$ +Author: Nick Coghlan +Status: Deferred +Type: Standards Track +Content-Type: text/x-rst +Created: 2011-10-13 +Python-Version: 3.x +Post-History: 2011-10-13 +Resolution: TBD + + +Abstract +======== + +This PEP proposes the addition of ':' as a new class and function prefix +syntax (analogous to decorators) that permits a statement local function or +class definition to be appended to any Python statement that currently does +not have an associated suite. + +In addition, the new syntax would allow the '@' symbol to be used to refer +to the statement local function or class without needing to repeat the name. + +When the ':' prefix syntax is used, the associated statement would be executed +*instead of* the normal local name binding currently implicit in function +and class definitions. + +This PEP is based heavily on many of the ideas in PEP 3150 (Statement Local +Namespaces) so some elements of the rationale will be familiar to readers of +that PEP. That PEP has now been withdrawn in favour of this one. + + +PEP Deferral +============ + +Like PEP 3150, this PEP currently exists in a deferred state. Unlike PEP 3150, +this isn't because I suspect it might be a terrible idea or see nasty problems +lurking in the implementation (aside from one potential parsing issue). + +Instead, it's because I think fleshing out the concept, exploring syntax +variants, creating a reference implementation and generally championing +the idea is going to require more time than I can give it in the 3.3 time +frame. + +So, it's deferred. If anyone wants to step forward to drive the PEP for 3.3, +let me know and I can add you as co-author and move it to Draft status. + + +Basic Examples +============== + +Before diving into the long history of this problem and the detailed +rationale for this specific proposed solution, here are a few simple +examples of the kind of code it is designed to simplify. + +As a trivial example, weakref callbacks could be defined as follows:: + + :x = weakref.ref(obj, @) + def report_destruction(obj): + print("{} is being destroyed".format(obj)) + +This contrasts with the current repetitive "out of order" syntax for this +operation:: + + def report_destruction(obj): + print("{} is being destroyed".format(obj)) + + x = weakref.ref(obj, report_destruction) + +That structure is OK when you're using the callable multiple times, but +it's irritating to be forced into it for one-off operations. + +Similarly, singleton classes could now be defined as:: + + :instance = @() + class OnlyOneInstance: + pass + +Rather than:: + + class OnlyOneInstance: + pass + + instance = OnlyOneInstance() + +And the infamous accumulator example could become:: + + def counter(): + x = 0 + :return @ + def increment(): + nonlocal x + x += 1 + return x + +Proposal +======== + +This PEP proposes the addition of an optional block prefix clause to the +syntax for function and class definitions. + +This block prefix would be introduced by a leading ``:`` and would be +allowed to contain any simple statement (including those that don't +make any sense in that context - while such code would be legal, +there wouldn't be any point in writing it). + +The decorator symbol ``@`` would be repurposed inside the block prefix +to refer to the function or class being defined. + +When a block prefix is provided, it *replaces* the standard local +name binding otherwise implicit in a class or function definition. + + +Background +========== + +The question of "multi-line lambdas" has been a vexing one for many +Python users for a very long time, and it took an exploration of Ruby's +block functionality for me to finally understand why this bugs people +so much: Python's demand that the function be named and introduced +before the operation that needs it breaks the developer's flow of thought. +They get to a point where they go "I need a one-shot operation that does +", and instead of being able to just *say* that, they instead have to back +up, name a function to do , then call that function from the operation +they actually wanted to do in the first place. Lambda expressions can help +sometimes, but they're no substitute for being able to use a full suite. + +Ruby's block syntax also heavily inspired the style of the solution in this +PEP, by making it clear that even when limited to *one* anonymous function per +statement, anonymous functions could still be incredibly useful. Consider how +many constructs Python has where one expression is responsible for the bulk of +the heavy lifting: + + * comprehensions, generator expressions, map(), filter() + * key arguments to sorted(), min(), max() + * partial function application + * provision of callbacks (e.g. for weak references) + * array broadcast operations in NumPy + +However, adopting Ruby's block syntax directly won't work for Python, since +the effectiveness of Ruby's blocks relies heavily on various conventions in +the way functions are *defined* (specifically, Ruby's ``yield`` syntax to +call blocks directly and the ``&arg`` mechanism to accept a block as a +functions final argument. + +Since Python has relied on named functions for so long, the signatures of +APIs that accept callbacks are far more diverse, thus requiring a solution +that allows anonymous functions to be slotted in at the appropriate location. + + +Relation to PEP 3150 +==================== + +PEP 3150 (Statement Local Namespaces) described its primary motivation +as being to elevate ordinary assignment statements to be on par with ``class`` +and ``def`` statements where the name of the item to be defined is presented +to the reader in advance of the details of how the value of that item is +calculated. This PEP achieves the same goal in a different way, by allowing +the simple name binding of a standard function definition to be replaced +with something else (like assigning the result of the function to a value). + +This PEP also achieves most of the other effects described in PEP 3150 +without introducing a new brainbending kind of scope. All of the complex +scoping rules in PEP 3150 are replaced in this PEP with the simple ``@`` +reference to the statement local function or class definition. + + +Symbol Choice +============== + +The ':' symbol was chosen due to its existing presence in Python and its +association with 'functions in expressions' via ``lambda`` expressions. The +past Simple Implicit Lambda proposal (PEP ???) was also a factor. + +The proposal definitely requires *some* kind of prefix to avoid parsing +ambiguity and backwards compatibility problems and ':' at least has the +virtue of brevity. There's no obious alternative symbol that offers a +clear improvement. + +Introducing a new keyword is another possibility, but I haven't come up +with one that really has anything to offer over the leading colon. + + +Syntax Change +============= + +Current:: + + atom: ('(' [yield_expr|testlist_comp] ')' | + '[' [testlist_comp] ']' | + '{' [dictorsetmaker] '}' | + NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') + +Changed:: + + atom: ('(' [yield_expr|testlist_comp] ')' | + '[' [testlist_comp] ']' | + '{' [dictorsetmaker] '}' | + NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' | '@') + +New:: + + blockprefix: ':' simple_stmt + block: blockprefix (decorated | classdef | funcdef) + +The above is the general idea, but I suspect that change to the 'atom' +definition would cause an ambiguity problem in the parser when it comes to +detecting decorator lines. So the actual implementation would be more complex +than that. + +Grammar: http://hg.python.org/cpython/file/default/Grammar/Grammar + + +Possible Implementation Strategy +================================ + +This proposal has one titanic advantage over PEP 3150: implementation +should be relatively straightforward. + +Both the class and function definition statements emit code to perform +the local name binding for their defined name. Implementing this PEP +should just require intercepting that code generation and replacing +it with the code in the block prefix. + +The one potentially tricky part is working out how to allow the dual +use of '@' without rewriting half the grammar definition. + +More Examples +============= + +Calculating attributes without polluting the local namespace (from os.py):: + + # Current Python (manual namespace cleanup) + def _createenviron(): + ... # 27 line function + + environ = _createenviron() + del _createenviron + + # Becomes: + :environ = @() + def _createenviron(): + ... # 27 line function + +Loop early binding:: + + # Current Python (default argument hack) + funcs = [(lambda x, i=i: x + i) for i in range(10)] + + # Becomes: + :funcs = [@(i) for i in range(10)] + def make_incrementor(i): + return lambda x: x + i + + # Or even: + :funcs = [@(i) for i in range(10)] + def make_incrementor(i): + :return @ + def incrementor(x): + return x + i + + +Reference Implementation +======================== + +None as yet. + + +TO DO +===== + +Sort out links and references to everything :) + + +Acknowledgements +================ + +Huge thanks to Gary Bernhardt for being blunt in pointing out that I had no +idea what I was talking about in criticising Ruby's blocks, kicking off a +rather enlightening process of investigation. + + +References +========== + +TBD + + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: diff --git a/pep-3150.txt b/pep-3150.txt --- a/pep-3150.txt +++ b/pep-3150.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Deferred +Status: Withdrawn Type: Standards Track Content-Type: text/x-rst Created: 2010-07-09 diff --git a/pep-3151.txt b/pep-3151.txt --- a/pep-3151.txt +++ b/pep-3151.txt @@ -193,10 +193,14 @@ * useful compatibility doesn't make exception catching any narrower, but it can be broader for *careless* exception-catching code. Given the following kind of snippet, all exceptions caught before this PEP will also be - caught after this PEP, but the reverse may be false:: + caught after this PEP, but the reverse may be false (because the coalescing + of ``OSError``, ``IOError`` and others means the ``except`` clause throws + a slightly broader net):: try: + ... os.remove(filename) + ... except OSError: pass -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 02:05:13 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 02:05:13 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Mark_PEP_accepted=2E?= Message-ID: http://hg.python.org/peps/rev/f50f0e14c774 changeset: 3962:f50f0e14c774 parent: 3959:2e1f0462a847 user: Antoine Pitrou date: Thu Oct 13 02:01:21 2011 +0200 summary: Mark PEP accepted. files: pep-3151.txt | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pep-3151.txt b/pep-3151.txt --- a/pep-3151.txt +++ b/pep-3151.txt @@ -3,13 +3,12 @@ Version: $Revision$ Last-Modified: $Date$ Author: Antoine Pitrou -Status: Draft +Status: Accepted Type: Standards Track Content-Type: text/x-rst Created: 2010-07-21 Python-Version: 3.3 Post-History: -Resolution: TBD Abstract @@ -507,9 +506,10 @@ Implementation ============== -A reference implementation is available in -http://hg.python.org/features/pep-3151/ in branch ``pep-3151``. It is -also tracked on the bug tracker at http://bugs.python.org/issue12555. +The reference implementation has been integrated into Python 3.3. +It was formerly developed in http://hg.python.org/features/pep-3151/ in +branch ``pep-3151``, and also tracked on the bug tracker at +http://bugs.python.org/issue12555. It has been successfully tested on a variety of systems: Linux, Windows, OpenIndiana and FreeBSD buildbots. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 02:05:13 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 02:05:13 +0200 Subject: [Python-checkins] =?utf8?q?peps_=28merge_default_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/peps/rev/5ab6d6aace71 changeset: 3963:5ab6d6aace71 parent: 3962:f50f0e14c774 parent: 3961:55bd9678e8ac user: Antoine Pitrou date: Thu Oct 13 02:01:28 2011 +0200 summary: Merge files: pep-0335.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -2,7 +2,7 @@ Title: Overloadable Boolean Operators Version: $Revision$ Last-Modified: $Date$ -Author: Gregory Ewing +Author: Gregory Ewing Status: Draft Type: Standards Track Content-Type: text/x-rst -- Repository URL: http://hg.python.org/peps From benjamin at python.org Thu Oct 13 02:10:22 2011 From: benjamin at python.org (Benjamin Peterson) Date: Wed, 12 Oct 2011 20:10:22 -0400 Subject: [Python-checkins] peps: Mark PEP accepted. In-Reply-To: References: Message-ID: Isn't now final? 2011/10/12 antoine.pitrou : > http://hg.python.org/peps/rev/f50f0e14c774 > changeset: ? 3962:f50f0e14c774 > parent: ? ? ?3959:2e1f0462a847 > user: ? ? ? ?Antoine Pitrou > date: ? ? ? ?Thu Oct 13 02:01:21 2011 +0200 > summary: > ?Mark PEP accepted. > > files: > ?pep-3151.txt | ?10 +++++----- > ?1 files changed, 5 insertions(+), 5 deletions(-) > > > diff --git a/pep-3151.txt b/pep-3151.txt > --- a/pep-3151.txt > +++ b/pep-3151.txt > @@ -3,13 +3,12 @@ > ?Version: $Revision$ > ?Last-Modified: $Date$ > ?Author: Antoine Pitrou > -Status: Draft > +Status: Accepted > ?Type: Standards Track > ?Content-Type: text/x-rst > ?Created: 2010-07-21 > ?Python-Version: 3.3 > ?Post-History: > -Resolution: TBD > > > ?Abstract > @@ -507,9 +506,10 @@ > ?Implementation > ?============== > > -A reference implementation is available in > -http://hg.python.org/features/pep-3151/ in branch ``pep-3151``. ?It is > -also tracked on the bug tracker at http://bugs.python.org/issue12555. > +The reference implementation has been integrated into Python 3.3. > +It was formerly developed in http://hg.python.org/features/pep-3151/ in > +branch ``pep-3151``, and also tracked on the bug tracker at > +http://bugs.python.org/issue12555. > ?It has been successfully tested on a variety of systems: Linux, Windows, > ?OpenIndiana and FreeBSD buildbots. > > > -- > Repository URL: http://hg.python.org/peps > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > > -- Regards, Benjamin From python-checkins at python.org Thu Oct 13 02:17:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 02:17:18 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Final=2C_not_accepted?= Message-ID: http://hg.python.org/peps/rev/15b0df76af76 changeset: 3964:15b0df76af76 user: Antoine Pitrou date: Thu Oct 13 02:13:24 2011 +0200 summary: Final, not accepted files: pep-3151.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-3151.txt b/pep-3151.txt --- a/pep-3151.txt +++ b/pep-3151.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Antoine Pitrou -Status: Accepted +Status: Final Type: Standards Track Content-Type: text/x-rst Created: 2010-07-21 -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Thu Oct 13 02:14:01 2011 From: solipsis at pitrou.net (Antoine Pitrou) Date: Thu, 13 Oct 2011 02:14:01 +0200 Subject: [Python-checkins] peps: Mark PEP accepted. References: Message-ID: <20111013021401.30470ea2@pitrou.net> On Wed, 12 Oct 2011 20:10:22 -0400 Benjamin Peterson wrote: > Isn't now final? Ah, it seems you're right indeed. Thanks, Antoine. > > 2011/10/12 antoine.pitrou : > > http://hg.python.org/peps/rev/f50f0e14c774 > > changeset: ? 3962:f50f0e14c774 > > parent: ? ? ?3959:2e1f0462a847 > > user: ? ? ? ?Antoine Pitrou > > date: ? ? ? ?Thu Oct 13 02:01:21 2011 +0200 > > summary: > > ?Mark PEP accepted. > > > > files: > > ?pep-3151.txt | ?10 +++++----- > > ?1 files changed, 5 insertions(+), 5 deletions(-) > > > > > > diff --git a/pep-3151.txt b/pep-3151.txt > > --- a/pep-3151.txt > > +++ b/pep-3151.txt > > @@ -3,13 +3,12 @@ > > ?Version: $Revision$ > > ?Last-Modified: $Date$ > > ?Author: Antoine Pitrou > > -Status: Draft > > +Status: Accepted > > ?Type: Standards Track > > ?Content-Type: text/x-rst > > ?Created: 2010-07-21 > > ?Python-Version: 3.3 > > ?Post-History: > > -Resolution: TBD > > > > > > ?Abstract > > @@ -507,9 +506,10 @@ > > ?Implementation > > ?============== > > > > -A reference implementation is available in > > -http://hg.python.org/features/pep-3151/ in branch ``pep-3151``. ?It is > > -also tracked on the bug tracker at http://bugs.python.org/issue12555. > > +The reference implementation has been integrated into Python 3.3. > > +It was formerly developed in http://hg.python.org/features/pep-3151/ in > > +branch ``pep-3151``, and also tracked on the bug tracker at > > +http://bugs.python.org/issue12555. > > ?It has been successfully tested on a variety of systems: Linux, Windows, > > ?OpenIndiana and FreeBSD buildbots. > > > > > > -- > > Repository URL: http://hg.python.org/peps > > > > _______________________________________________ > > Python-checkins mailing list > > Python-checkins at python.org > > http://mail.python.org/mailman/listinfo/python-checkins > > > > > > > > -- > Regards, > Benjamin > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins From solipsis at pitrou.net Thu Oct 13 05:26:16 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 13 Oct 2011 05:26:16 +0200 Subject: [Python-checkins] Daily reference leaks (b1ec313b10ae): sum=0 Message-ID: results for b1ec313b10ae on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog8vpZye', '-x'] From python-checkins at python.org Thu Oct 13 13:30:20 2011 From: python-checkins at python.org (nick.coghlan) Date: Thu, 13 Oct 2011 13:30:20 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Switch_PEP_403_from_=3A_and_?= =?utf8?q?=40_symbols_to_postdef_and_def_keywords?= Message-ID: http://hg.python.org/peps/rev/b4dc86fcc359 changeset: 3965:b4dc86fcc359 user: Nick Coghlan date: Thu Oct 13 21:30:11 2011 +1000 summary: Switch PEP 403 from : and @ symbols to postdef and def keywords files: pep-0403.txt | 138 ++++++++++++++++++++++---------------- 1 files changed, 80 insertions(+), 58 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -1,5 +1,5 @@ PEP: 403 -Title: Statement local classes and functions +Title: Prefix syntax for post function definition operations Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan @@ -15,17 +15,17 @@ Abstract ======== -This PEP proposes the addition of ':' as a new class and function prefix -syntax (analogous to decorators) that permits a statement local function or -class definition to be appended to any Python statement that currently does -not have an associated suite. +This PEP proposes the addition of ``postdef`` as a new function prefix +syntax (analogous to decorators) that permits the execution of a single simple +statement (potentially including substatements separated by semi-colons) after -In addition, the new syntax would allow the '@' symbol to be used to refer -to the statement local function or class without needing to repeat the name. +In addition, the new syntax would allow the 'def' keyword to be used to refer +to the function being defined without needing to repeat the name. -When the ':' prefix syntax is used, the associated statement would be executed -*instead of* the normal local name binding currently implicit in function -and class definitions. +When the 'postdef' prefix syntax is used, the associated statement would be +executed *in addition to* the normal local name binding implicit in function +definitions. Any name collision are expected to be minor, analagous to those +encountered with ``for`` loop iteration variables. This PEP is based heavily on many of the ideas in PEP 3150 (Statement Local Namespaces) so some elements of the rationale will be familiar to readers of @@ -57,7 +57,7 @@ As a trivial example, weakref callbacks could be defined as follows:: - :x = weakref.ref(obj, @) + postdef x = weakref.ref(target, def) def report_destruction(obj): print("{} is being destroyed".format(obj)) @@ -67,33 +67,39 @@ def report_destruction(obj): print("{} is being destroyed".format(obj)) - x = weakref.ref(obj, report_destruction) + x = weakref.ref(target, report_destruction) That structure is OK when you're using the callable multiple times, but it's irritating to be forced into it for one-off operations. -Similarly, singleton classes could now be defined as:: +Similarly, a sorted operation on a particularly poorly defined type could +now be defined as:: - :instance = @() - class OnlyOneInstance: - pass + postdef sorted_list = sorted(original, key=def) + def force_sort(item): + try: + return item.calc_sort_order() + except NotSortableError: + return float('inf') Rather than:: - class OnlyOneInstance: - pass + def force_sort(item): + try: + return item.calc_sort_order() + except NotSortableError: + return float('inf') - instance = OnlyOneInstance() + sorted_list = sorted(original, key=force_sort) -And the infamous accumulator example could become:: +And early binding semantics in a list comprehension could be attained via:: - def counter(): - x = 0 - :return @ - def increment(): - nonlocal x - x += 1 - return x + postdef funcs = [def(i) for i in range(10)] + def make_incrementor(i): + postdef return def + def incrementor(x): + return x + i + Proposal ======== @@ -101,16 +107,19 @@ This PEP proposes the addition of an optional block prefix clause to the syntax for function and class definitions. -This block prefix would be introduced by a leading ``:`` and would be +This block prefix would be introduced by a leading ``postdef`` and would be allowed to contain any simple statement (including those that don't make any sense in that context - while such code would be legal, -there wouldn't be any point in writing it). +there wouldn't be any point in writing it). This permissive structure is +easier to define and easier to explain, but a more restrictive approach that +only permits operations that "make sense" would also be possible (see PEP +3150 for a list of possible candidates) -The decorator symbol ``@`` would be repurposed inside the block prefix -to refer to the function or class being defined. +The function definition keyword ``def`` would be repurposed inside the block prefix +to refer to the function being defined. -When a block prefix is provided, it *replaces* the standard local -name binding otherwise implicit in a class or function definition. +When a block prefix is provided, the standard local name binding implicit +in the function definition still takes place. Background @@ -143,7 +152,7 @@ the effectiveness of Ruby's blocks relies heavily on various conventions in the way functions are *defined* (specifically, Ruby's ``yield`` syntax to call blocks directly and the ``&arg`` mechanism to accept a block as a -functions final argument. +function's final argument). Since Python has relied on named functions for so long, the signatures of APIs that accept callbacks are far more diverse, thus requiring a solution @@ -163,24 +172,35 @@ This PEP also achieves most of the other effects described in PEP 3150 without introducing a new brainbending kind of scope. All of the complex -scoping rules in PEP 3150 are replaced in this PEP with the simple ``@`` -reference to the statement local function or class definition. +scoping rules in PEP 3150 are replaced in this PEP with the simple ``def`` +reference to the associated function definition. -Symbol Choice +Keyword Choice ============== -The ':' symbol was chosen due to its existing presence in Python and its -association with 'functions in expressions' via ``lambda`` expressions. The -past Simple Implicit Lambda proposal (PEP ???) was also a factor. +The proposal definitely requires *some* kind of prefix to avoid parsing +ambiguity and backwards compatibility problems with existing constructs. +It also needs to be clearly highlighted to readers, since it declares that +the following piece of code is going to be executed out of order. -The proposal definitely requires *some* kind of prefix to avoid parsing -ambiguity and backwards compatibility problems and ':' at least has the -virtue of brevity. There's no obious alternative symbol that offers a -clear improvement. +The 'postdef' keyword was chosen as a literal explanation of exactly what +the new clause does: execute the specified statement *after* the associated +function definition, even though it is physically written *before* the +definition in the source code. -Introducing a new keyword is another possibility, but I haven't come up -with one that really has anything to offer over the leading colon. + +Requirement to Name Functions +============================= + +One of the objections to widespread use of lambda expressions is that they +have an atrocious effect on traceback intelligibility and other aspects of +introspection. Accordingly, this PEP requires that even throwaway functions +be given some kind of name. + +To help encourage the use of meaningful names without users having to repeat +themselves, the PEP suggests the provision of the ``def`` shorthand reference +to the current function from the ``postdef`` clause. Syntax Change @@ -198,17 +218,17 @@ atom: ('(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' | '{' [dictorsetmaker] '}' | - NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' | '@') + NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' | 'def') New:: - blockprefix: ':' simple_stmt - block: blockprefix (decorated | classdef | funcdef) + blockprefix: 'postdef' simple_stmt + block: blockprefix funcdef -The above is the general idea, but I suspect that change to the 'atom' -definition would cause an ambiguity problem in the parser when it comes to -detecting decorator lines. So the actual implementation would be more complex -than that. +The above is the general idea, but I suspect that the change to the 'atom' +definition may cause an ambiguity problem in the parser when it comes to +detecting function definitions. So the actual implementation may need to be +more complex than that. Grammar: http://hg.python.org/cpython/file/default/Grammar/Grammar @@ -219,13 +239,12 @@ This proposal has one titanic advantage over PEP 3150: implementation should be relatively straightforward. -Both the class and function definition statements emit code to perform -the local name binding for their defined name. Implementing this PEP -should just require intercepting that code generation and replacing -it with the code in the block prefix. +The post definition statement can be incorporated into the AST for the +function node and simply visited out of sequence. The one potentially tricky part is working out how to allow the dual -use of '@' without rewriting half the grammar definition. +use of 'def' without rewriting half the grammar definition. + More Examples ============= @@ -273,6 +292,9 @@ Sort out links and references to everything :) +Start of python-ideas thread: +http://mail.python.org/pipermail/python-ideas/2011-October/012276.html + Acknowledgements ================ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Oct 13 13:45:42 2011 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 13 Oct 2011 13:45:42 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTU5?= =?utf8?q?=3A_Replace_FileIO=27s_quadratic-time_buffer_growth_algorithm_wi?= =?utf8?q?th_a?= Message-ID: http://hg.python.org/cpython/rev/d18c80a8c119 changeset: 72907:d18c80a8c119 branch: 3.2 parent: 72855:61eb59516b55 user: Nadeem Vawda date: Thu Oct 13 13:34:16 2011 +0200 summary: Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one. Also fix the bz2 module, whose classes used the same algorithm. files: Misc/NEWS | 3 +++ Modules/_io/fileio.c | 19 ++++--------------- Modules/bz2module.c | 19 ++++--------------- 3 files changed, 11 insertions(+), 30 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -121,6 +121,9 @@ Extension Modules ----------------- +- Issue #13159: FileIO and BZ2File now use a linear-time buffer growth + strategy instead of a quadratic-time one. + - Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -43,12 +43,6 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - typedef struct { PyObject_HEAD int fd; @@ -565,15 +559,10 @@ } } #endif - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } static PyObject * diff --git a/Modules/bz2module.c b/Modules/bz2module.c --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -218,25 +218,14 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - /* This is a hacked version of Python's fileobject.c:new_buffersize(). */ static size_t Util_NewBufferSize(size_t currentsize) { - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } /* This is a hacked version of Python's fileobject.c:get_line(). */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 13:45:43 2011 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 13 Oct 2011 13:45:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_=2313159=3A_Replace_FileIO=27s_quadratic-time_buffer_g?= =?utf8?q?rowth_algorithm_with_a?= Message-ID: http://hg.python.org/cpython/rev/4a6709a071d0 changeset: 72908:4a6709a071d0 parent: 72906:b1ec313b10ae parent: 72907:d18c80a8c119 user: Nadeem Vawda date: Thu Oct 13 13:38:14 2011 +0200 summary: Merge #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one. Also fix the bz2 module, which suffered from the same problem. files: Misc/NEWS | 3 +++ Modules/_bz2module.c | 16 ++++------------ Modules/_io/fileio.c | 19 ++++--------------- 3 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1342,6 +1342,9 @@ Extension Modules ----------------- +- Issue #13159: FileIO and BZ2Compressor/BZ2Decompressor now use a linear-time + buffer growth strategy instead of a quadratic-time one. + - Issue #10141: socket: Add SocketCAN (PF_CAN) support. Initial patch by Matthias Fuchs, updated by Tiago Gon?alves. diff --git a/Modules/_bz2module.c b/Modules/_bz2module.c --- a/Modules/_bz2module.c +++ b/Modules/_bz2module.c @@ -116,22 +116,14 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - static int grow_buffer(PyObject **buf) { + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ size_t size = PyBytes_GET_SIZE(*buf); - if (size <= SMALLCHUNK) - return _PyBytes_Resize(buf, size + SMALLCHUNK); - else if (size <= BIGCHUNK) - return _PyBytes_Resize(buf, size * 2); - else - return _PyBytes_Resize(buf, size + BIGCHUNK); + return _PyBytes_Resize(buf, size + (size >> 3) + 6); } diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -43,12 +43,6 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - typedef struct { PyObject_HEAD int fd; @@ -572,15 +566,10 @@ } } #endif - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 13:58:30 2011 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 13 Oct 2011 13:58:30 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTU5?= =?utf8?q?=3A_Replace_FileIO=27s_quadratic-time_buffer_growth_algorithm_wi?= =?utf8?q?th_a?= Message-ID: http://hg.python.org/cpython/rev/c1c434e30e06 changeset: 72909:c1c434e30e06 branch: 2.7 parent: 72900:3313ce92cef7 user: Nadeem Vawda date: Thu Oct 13 13:52:46 2011 +0200 summary: Issue #13159: Replace FileIO's quadratic-time buffer growth algorithm with a linear-time one. Also fix the builtin file class and the bz2 module, which used the same algorithm. files: Misc/NEWS | 3 +++ Modules/_io/fileio.c | 19 ++++--------------- Modules/bz2module.c | 19 ++++--------------- Objects/fileobject.c | 19 ++++--------------- 4 files changed, 15 insertions(+), 45 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -229,6 +229,9 @@ Extension Modules ----------------- +- Issue #13159: FileIO, BZ2File, and the built-in file class now use a + linear-time buffer growth strategy instead of a quadratic one. + - Issue #13070: Fix a crash when a TextIOWrapper caught in a reference cycle would be finalized after the reference to its underlying BufferedRWPair's writer got cleared by the GC. diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -42,12 +42,6 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - typedef struct { PyObject_HEAD int fd; @@ -528,15 +522,10 @@ } } #endif - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } static PyObject * diff --git a/Modules/bz2module.c b/Modules/bz2module.c --- a/Modules/bz2module.c +++ b/Modules/bz2module.c @@ -224,25 +224,14 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - /* This is a hacked version of Python's fileobject.c:new_buffersize(). */ static size_t Util_NewBufferSize(size_t currentsize) { - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } /* This is a hacked version of Python's fileobject.c:get_line(). */ diff --git a/Objects/fileobject.c b/Objects/fileobject.c --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -992,12 +992,6 @@ #define SMALLCHUNK BUFSIZ #endif -#if SIZEOF_INT < 4 -#define BIGCHUNK (512 * 32) -#else -#define BIGCHUNK (512 * 1024) -#endif - static size_t new_buffersize(PyFileObject *f, size_t currentsize) { @@ -1026,15 +1020,10 @@ /* Add 1 so if the file were to grow we'd notice. */ } #endif - if (currentsize > SMALLCHUNK) { - /* Keep doubling until we reach BIGCHUNK; - then keep adding BIGCHUNK. */ - if (currentsize <= BIGCHUNK) - return currentsize + currentsize; - else - return currentsize + BIGCHUNK; - } - return currentsize + SMALLCHUNK; + /* Expand the buffer by an amount proportional to the current size, + giving us amortized linear-time behavior. Use a less-than-double + growth factor to avoid excessive allocation. */ + return currentsize + (currentsize >> 3) + 6; } #if defined(EWOULDBLOCK) && defined(EAGAIN) && EWOULDBLOCK != EAGAIN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 17:21:33 2011 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 13 Oct 2011 17:21:33 +0200 (CEST) Subject: [Python-checkins] r88909 - in projects: external external/xz-5.0.3 external/xz-5.0.3/bin_i486 external/xz-5.0.3/bin_i486/liblzma.dll external/xz-5.0.3/bin_i486/lzmadec.exe external/xz-5.0.3/bin_i486/lzmainfo.exe external/xz-5.0.3/bin_i486/xz.exe external/xz-5.0.3/bin_i486/xzdec.exe external/xz-5.0.3/bin_x86-64 external/xz-5.0.3/bin_x86-64/liblzma.dll external/xz-5.0.3/bin_x86-64/lzmadec.exe external/xz-5.0.3/bin_x86-64/lzmainfo.exe external/xz-5.0.3/bin_x86-64/xz.exe external/xz-5.0.3/bin_x86-64/xzdec.exe external/xz-5.0.3/doc external/xz-5.0.3/doc/AUTHORS.txt external/xz-5.0.3/doc/COPYING-Windows.txt external/xz-5.0.3/doc/COPYING.txt external/xz-5.0.3/doc/NEWS.txt external/xz-5.0.3/doc/README-Windows.txt external/xz-5.0.3/doc/README.txt external/xz-5.0.3/doc/THANKS.txt external/xz-5.0.3/doc/TODO.txt external/xz-5.0.3/doc/examples external/xz-5.0.3/doc/examples/xz_pipe_comp.c external/xz-5.0.3/doc/examples/xz_pipe_decomp.c external/xz-5.0.3/doc/faq.txt external/xz-5.0.3/doc/history.txt external/xz-5.0.3/doc/liblzma.def external/xz-5.0.3/doc/lzma-file-format.txt external/xz-5.0.3/doc/manuals external/xz-5.0.3/doc/manuals/lzmainfo-a4.pdf external/xz-5.0.3/doc/manuals/lzmainfo-letter.pdf external/xz-5.0.3/doc/manuals/lzmainfo.txt external/xz-5.0.3/doc/manuals/xz-a4.pdf external/xz-5.0.3/doc/manuals/xz-letter.pdf external/xz-5.0.3/doc/manuals/xz.txt external/xz-5.0.3/doc/manuals/xzdec-a4.pdf external/xz-5.0.3/doc/manuals/xzdec-letter.pdf external/xz-5.0.3/doc/manuals/xzdec.txt external/xz-5.0.3/doc/xz-file-format.txt external/xz-5.0.3/include external/xz-5.0.3/include/lzma external/xz-5.0.3/include/lzma.h external/xz-5.0.3/include/lzma/base.h external/xz-5.0.3/include/lzma/bcj.h external/xz-5.0.3/include/lzma/block.h external/xz-5.0.3/include/lzma/check.h external/xz-5.0.3/include/lzma/container.h external/xz-5.0.3/include/lzma/delta.h external/xz-5.0.3/include/lzma/filter.h external/xz-5.0.3/include/lzma/hardware.h external/xz-5.0.3/include/lzma/index.h external/xz-5.0.3/include/lzma/index_hash.h external/xz-5.0.3/include/lzma/lzma.h external/xz-5.0.3/include/lzma/stream_flags.h external/xz-5.0.3/include/lzma/version.h external/xz-5.0.3/include/lzma/vli.h external/xz-5.0.3/svn-commit.tmp Message-ID: <3SKG4F1ltczPSj@mail.python.org> Author: martin.v.loewis Date: Thu Oct 13 17:21:32 2011 New Revision: 88909 Log: Import from http://tukaani.org/xz/xz-5.0.3-windows.zip Added: projects/ projects/external/ projects/external/xz-5.0.3/ projects/external/xz-5.0.3/bin_i486/ projects/external/xz-5.0.3/bin_i486/liblzma.dll (contents, props changed) projects/external/xz-5.0.3/bin_i486/lzmadec.exe (contents, props changed) projects/external/xz-5.0.3/bin_i486/lzmainfo.exe (contents, props changed) projects/external/xz-5.0.3/bin_i486/xz.exe (contents, props changed) projects/external/xz-5.0.3/bin_i486/xzdec.exe (contents, props changed) projects/external/xz-5.0.3/bin_x86-64/ projects/external/xz-5.0.3/bin_x86-64/liblzma.dll (contents, props changed) projects/external/xz-5.0.3/bin_x86-64/lzmadec.exe (contents, props changed) projects/external/xz-5.0.3/bin_x86-64/lzmainfo.exe (contents, props changed) projects/external/xz-5.0.3/bin_x86-64/xz.exe (contents, props changed) projects/external/xz-5.0.3/bin_x86-64/xzdec.exe (contents, props changed) projects/external/xz-5.0.3/doc/ projects/external/xz-5.0.3/doc/AUTHORS.txt projects/external/xz-5.0.3/doc/COPYING-Windows.txt projects/external/xz-5.0.3/doc/COPYING.txt projects/external/xz-5.0.3/doc/NEWS.txt projects/external/xz-5.0.3/doc/README-Windows.txt projects/external/xz-5.0.3/doc/README.txt projects/external/xz-5.0.3/doc/THANKS.txt projects/external/xz-5.0.3/doc/TODO.txt projects/external/xz-5.0.3/doc/examples/ projects/external/xz-5.0.3/doc/examples/xz_pipe_comp.c projects/external/xz-5.0.3/doc/examples/xz_pipe_decomp.c projects/external/xz-5.0.3/doc/faq.txt projects/external/xz-5.0.3/doc/history.txt projects/external/xz-5.0.3/doc/liblzma.def projects/external/xz-5.0.3/doc/lzma-file-format.txt projects/external/xz-5.0.3/doc/manuals/ projects/external/xz-5.0.3/doc/manuals/lzmainfo-a4.pdf (contents, props changed) projects/external/xz-5.0.3/doc/manuals/lzmainfo-letter.pdf (contents, props changed) projects/external/xz-5.0.3/doc/manuals/lzmainfo.txt projects/external/xz-5.0.3/doc/manuals/xz-a4.pdf (contents, props changed) projects/external/xz-5.0.3/doc/manuals/xz-letter.pdf (contents, props changed) projects/external/xz-5.0.3/doc/manuals/xz.txt projects/external/xz-5.0.3/doc/manuals/xzdec-a4.pdf projects/external/xz-5.0.3/doc/manuals/xzdec-letter.pdf (contents, props changed) projects/external/xz-5.0.3/doc/manuals/xzdec.txt projects/external/xz-5.0.3/doc/xz-file-format.txt projects/external/xz-5.0.3/include/ projects/external/xz-5.0.3/include/lzma/ projects/external/xz-5.0.3/include/lzma.h projects/external/xz-5.0.3/include/lzma/base.h projects/external/xz-5.0.3/include/lzma/bcj.h projects/external/xz-5.0.3/include/lzma/block.h projects/external/xz-5.0.3/include/lzma/check.h projects/external/xz-5.0.3/include/lzma/container.h projects/external/xz-5.0.3/include/lzma/delta.h projects/external/xz-5.0.3/include/lzma/filter.h projects/external/xz-5.0.3/include/lzma/hardware.h projects/external/xz-5.0.3/include/lzma/index.h projects/external/xz-5.0.3/include/lzma/index_hash.h projects/external/xz-5.0.3/include/lzma/lzma.h projects/external/xz-5.0.3/include/lzma/stream_flags.h projects/external/xz-5.0.3/include/lzma/version.h projects/external/xz-5.0.3/include/lzma/vli.h projects/external/xz-5.0.3/svn-commit.tmp Added: projects/external/xz-5.0.3/bin_i486/liblzma.dll ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_i486/lzmadec.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_i486/lzmainfo.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_i486/xz.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_i486/xzdec.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_x86-64/liblzma.dll ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_x86-64/lzmadec.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_x86-64/lzmainfo.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_x86-64/xz.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/bin_x86-64/xzdec.exe ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/AUTHORS.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/AUTHORS.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,27 @@ + +Authors of XZ Utils +=================== + + XZ Utils is developed and maintained by Lasse Collin + . + + Major parts of liblzma are based on code written by Igor Pavlov, + specifically the LZMA SDK . Without + this code, XZ Utils wouldn't exist. + + The SHA-256 implementation in liblzma is based on the code found from + 7-Zip , which has a modified version of the SHA-256 + code found from Crypto++ . The SHA-256 code + in Crypto++ was written by Kevin Springle and Wei Dai. + + Some scripts have been adapted from gzip. The original versions + were written by Jean-loup Gailly, Charles Levert, and Paul Eggert. + Andrew Dudman helped adapting the script and their man pages for + XZ Utils. + + The GNU Autotools based build system contains files from many authors, + which I'm not trying list here. + + Several people have contributed fixes or reported bugs. Most of them + are mentioned in the file THANKS. + Added: projects/external/xz-5.0.3/doc/COPYING-Windows.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/COPYING-Windows.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,185 @@ +MinGW-w64 runtime licensing +*************************** + +This program or library was built using MinGW-w64 and statically +linked against the MinGW-w64 runtime. Some parts of the runtime +are under licenses which require that the copyright and license +notices are included when distributing the code in binary form. +These notices are listed below. + + +======================== +Overall copyright notice +======================== + +Copyright (c) 2009, 2010 by the mingw-w64 project + +This license has been certified as open source. It has also been designated +as GPL compatible by the Free Software Foundation (FSF). + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions in source code must retain the accompanying copyright + notice, this list of conditions, and the following disclaimer. + 2. Redistributions in binary form must reproduce the accompanying + copyright notice, this list of conditions, and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + 3. Names of the copyright holders must not be used to endorse or promote + products derived from this software without prior written permission + from the copyright holders. + 4. The right to distribute this software or to use it for any purpose does + not give you the right to use Servicemarks (sm) or Trademarks (tm) of + the copyright holders. Use of them is covered by separate agreement + with the copyright holders. + 5. If any files are modified, you must cause the modified files to carry + prominent notices stating that you changed the files and the date of + any change. + +Disclaimer + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +======================================== +getopt, getopt_long, and getop_long_only +======================================== + +Copyright (c) 2002 Todd C. Miller + +Permission to use, copy, modify, and distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +Sponsored in part by the Defense Advanced Research Projects +Agency (DARPA) and Air Force Research Laboratory, Air Force +Materiel Command, USAF, under agreement number F39502-99-1-0512. + + * * * * * * * + +Copyright (c) 2000 The NetBSD Foundation, Inc. +All rights reserved. + +This code is derived from software contributed to The NetBSD Foundation +by Dieter Baron and Thomas Klausner. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS +``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +=============================================================== +gdtoa: Converting between IEEE floating point numbers and ASCII +=============================================================== + +The author of this software is David M. Gay. + +Copyright (C) 1997, 1998, 1999, 2000, 2001 by Lucent Technologies +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + + * * * * * * * + +The author of this software is David M. Gay. + +Copyright (C) 2005 by David M. Gay +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that the copyright notice and this permission notice and warranty +disclaimer appear in supporting documentation, and that the name of +the author or any of his current or former employers not be used in +advertising or publicity pertaining to distribution of the software +without specific, written prior permission. + +THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN +NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS BE +LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + + * * * * * * * + +The author of this software is David M. Gay. + +Copyright (C) 2004 by David M. Gay. +All Rights Reserved +Based on material in the rest of /netlib/fp/gdota.tar.gz, +which is copyright (C) 1998, 2000 by Lucent Technologies. + +Permission to use, copy, modify, and distribute this software and +its documentation for any purpose and without fee is hereby +granted, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of Lucent or any of its entities +not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior +permission. + +LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY +SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. Added: projects/external/xz-5.0.3/doc/COPYING.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/COPYING.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,65 @@ + +XZ Utils Licensing +================== + + Different licenses apply to different files in this package. Here + is a rough summary of which licenses apply to which parts of this + package (but check the individual files to be sure!): + + - liblzma is in the public domain. + + - xz, xzdec, and lzmadec command line tools are in the public + domain unless GNU getopt_long had to be compiled and linked + in from the lib directory. The getopt_long code is under + GNU LGPLv2.1+. + + - The scripts to grep, diff, and view compressed files have been + adapted from gzip. These scripts and their documentation are + under GNU GPLv2+. + + - All the documentation in the doc directory and most of the + XZ Utils specific documentation files in other directories + are in the public domain. + + - Translated messages are in the public domain. + + - The build system contains public domain files, and files that + are under GNU GPLv2+ or GNU GPLv3+. None of these files end up + in the binaries being built. + + - Test files and test code in the tests directory, and debugging + utilities in the debug directory are in the public domain. + + - The extra directory may contain public domain files, and files + that are under various free software licenses. + + You can do whatever you want with the files that have been put into + the public domain. If you find public domain legally problematic, + take the previous sentence as a license grant. If you still find + the lack of copyright legally problematic, you have too many + lawyers. + + As usual, this software is provided "as is", without any warranty. + + If you copy significant amounts of public domain code from XZ Utils + into your project, acknowledging this somewhere in your software is + polite (especially if it is proprietary, non-free software), but + naturally it is not legally required. Here is an example of a good + notice to put into "about box" or into documentation: + + This software includes code from XZ Utils . + + The following license texts are included in the following files: + - COPYING.LGPLv2.1: GNU Lesser General Public License version 2.1 + - COPYING.GPLv2: GNU General Public License version 2 + - COPYING.GPLv3: GNU General Public License version 3 + + Note that the toolchain (compiler, linker etc.) may add some code + pieces that are copyrighted. Thus, it is possible that e.g. liblzma + binary wouldn't actually be in the public domain in its entirety + even though it contains no copyrighted code from the XZ Utils source + package. + + If you have questions, don't hesitate to ask the author(s) for more + information. + Added: projects/external/xz-5.0.3/doc/NEWS.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/NEWS.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,126 @@ + +XZ Utils Release Notes +====================== + +5.0.3 (2011-05-21) + + * liblzma fixes: + + - A memory leak was fixed. + + - lzma_stream_buffer_encode() no longer creates an empty .xz + Block if encoding an empty buffer. Such an empty Block with + LZMA2 data would trigger a bug in 5.0.1 and older (see the + first bullet point in 5.0.2 notes). When releasing 5.0.2, + I thought that no encoder creates this kind of files but + I was wrong. + + - Validate function arguments better in a few functions. Most + importantly, specifying an unsupported integrity check to + lzma_stream_buffer_encode() no longer creates a corrupt .xz + file. Probably no application tries to do that, so this + shouldn't be a big problem in practice. + + - Document that lzma_block_buffer_encode(), + lzma_easy_buffer_encode(), lzma_stream_encoder(), and + lzma_stream_buffer_encode() may return LZMA_UNSUPPORTED_CHECK. + + - The return values of the _memusage() functions are now + documented better. + + * Fix command name detection in xzgrep. xzegrep and xzfgrep now + correctly use egrep and fgrep instead of grep. + + * French translation was added. + + +5.0.2 (2011-04-01) + + * LZMA2 decompressor now correctly accepts LZMA2 streams with no + uncompressed data. Previously it considered them corrupt. The + bug can affect applications that use raw LZMA2 streams. It is + very unlikely to affect .xz files because no compressor creates + .xz files with empty LZMA2 streams. (Empty .xz files are a + different thing than empty LZMA2 streams.) + + * "xz --suffix=.foo filename.foo" now refuses to compress the + file due to it already having the suffix .foo. It was already + documented on the man page, but the code lacked the test. + + * "xzgrep -l foo bar.xz" works now. + + * Polish translation was added. + + +5.0.1 (2011-01-29) + + * xz --force now (de)compresses files that have setuid, setgid, + or sticky bit set and files that have multiple hard links. + The man page had it documented this way already, but the code + had a bug. + + * gzip and bzip2 support in xzdiff was fixed. + + * Portability fixes + + * Minor fix to Czech translation + + +5.0.0 (2010-10-23) + + Only the most important changes compared to 4.999.9beta are listed + here. One change is especially important: + + * The memory usage limit is now disabled by default. Some scripts + written before this change may have used --memory=max on xz command + line or in XZ_OPT. THESE USES OF --memory=max SHOULD BE REMOVED + NOW, because they interfere with user's ability to set the memory + usage limit himself. If user-specified limit causes problems to + your script, blame the user. + + Other significant changes: + + * Added support for XZ_DEFAULTS environment variable. This variable + allows users to set default options for xz, e.g. default memory + usage limit or default compression level. Scripts that use xz + must never set or unset XZ_DEFAULTS. Scripts should use XZ_OPT + instead if they need a way to pass options to xz via an + environment variable. + + * The compression settings associated with the preset levels + -0 ... -9 have been changed. --extreme was changed a little too. + It is now less likely to make compression worse, but with some + files the new --extreme may compress slightly worse than the old + --extreme. + + * If a preset level (-0 ... -9) is specified after a custom filter + chain options have been used (e.g. --lzma2), the custom filter + chain will be forgotten. Earlier the preset options were + completely ignored after custom filter chain options had been + seen. + + * xz will create sparse files when decompressing if the uncompressed + data contains long sequences of binary zeros. This is done even + when writing to standard output that is connected to a regular + file and certain additional conditions are met to make it safe. + + * Support for "xz --list" was added. Combine with --verbose or + --verbose --verbose (-vv) for detailed output. + + * I had hoped that liblzma API would have been stable after + 4.999.9beta, but there have been a couple of changes in the + advanced features, which don't affect most applications: + + - Index handling code was revised. If you were using the old + API, you will get a compiler error (so it's easy to notice). + + - A subtle but important change was made to the Block handling + API. lzma_block.version has to be initialized even for + lzma_block_header_decode(). Code that doesn't do it will work + for now, but might break in the future, which makes this API + change easy to miss. + + * The major soname has been bumped to 5.0.0. liblzma API and ABI + are now stable, so the need to recompile programs linking against + liblzma shouldn't arise soon. + Added: projects/external/xz-5.0.3/doc/README-Windows.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/README-Windows.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,115 @@ + +XZ Utils for Windows +==================== + +Introduction +------------ + + This package includes command line tools (xz.exe and a few others) + and the liblzma compression library from XZ Utils. You can find the + latest version and full source code from . + + The parts of the XZ Utils source code, that are relevant to this + binary package, are in the public domain. XZ Utils have been built + for this package with MinGW-w64 and linked statically against its + runtime libraries. See COPYING-Windows.txt for the copyright and + license information that applies to the MinGW-w64 runtime. You must + include it when redistributing these XZ Utils binaries. + + +Package contents +---------------- + + All executables and libraries in this package require msvcrt.dll. + It's included in all recent Windows versions. On Windows 95 it + might be missing, but once you get it somewhere, XZ Utils should + run even on Windows 95. + + There are two different versions of the executable and library files. + There is one directory for each type of binaries: + + bin_i486 32-bit x86 (i486 and up), Windows 95 and later + bin_x86-64 64-bit x86-64, Windows XP and later + + Each of the above directories have the following files: + + *.exe Command line tools. (It's useless to double-click + these; use the command prompt instead.) These have + been linked statically against liblzma, so they + don't require liblzma.dll. Thus, you can copy e.g. + xz.exe to a directory that is in PATH without copying + any other files from this package. + + liblzma.dll Shared version of the liblzma compression library. + This file is mostly useful to developers, although + some non-developers might use it to upgrade their + copy of liblzma. + + liblzma.a Static version of the liblzma compression library. + This file is useful only for developers. + + The rest of the directories contain architecture-independent files: + + doc Documentation in the plain text (TXT) format. The + manuals of the command line tools are provided also + in the PDF format. liblzma.def is in this directory + too. + + include C header files for liblzma. These should be + compatible with most C and C++ compilers. If you + have problems, try to fix it and send your fixes + upstream, or at least report a bug, thanks. + + +Linking against liblzma +----------------------- + +MinGW + + If you use MinGW, linking against liblzma.dll or liblzma.a should + be straightforward. You don't need an import library to link + against liblzma.dll, and for static linking, you don't need to + worry about the LZMA_API_STATIC macro. + + Note that the MinGW distribution includes liblzma. If you are + building packages that will be part of the MinGW distribution, you + probably should use the version of liblzma shipped in MinGW instead + of this package. + + +Microsoft Visual C++ + + To link against liblzma.dll, you need to create an import library + first. You need the "lib" command from MSVC and liblzma.def from + the "doc" directory of this package. Here is the command that works + on 32-bit x86: + + lib /def:liblzma.def /out:liblzma.lib /machine:ix86 + + On x86-64, the /machine argument has to naturally be changed: + + lib /def:liblzma.def /out:liblzma.lib /machine:x64 + + Linking against static liblzma should work too. Rename liblzma.a + to e.g. liblzma_static.lib and tell MSVC to link against it. You + also need to tell lzma.h to not use __declspec(dllimport) by defining + the macro LZMA_API_STATIC. You can do it either in the C/C++ code + + #define LZMA_API_STATIC + #include + + or by adding it to compiler options. + + +Other compilers + + If you are using some other compiler, see its documentation how to + create an import library (if it is needed). If it is simple, I + might consider including the instructions here. + + +Reporting bugs +-------------- + + Report bugs to (in English or Finnish). + Added: projects/external/xz-5.0.3/doc/README.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/README.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,304 @@ + +XZ Utils +======== + + 0. Overview + 1. Documentation + 1.1. Overall documentation + 1.2. Documentation for command line tools + 1.3. Documentation for liblzma + 2. Version numbering + 3. Reporting bugs + 4. Translating the xz tool + 5. Other implementations of the .xz format + 6. Contact information + + +0. Overview +----------- + + XZ Utils provide a general-purpose data compression library and + command line tools. The native file format is the .xz format, but + also the legacy .lzma format is supported. The .xz format supports + multiple compression algorithms, which are called "filters" in + context of XZ Utils. The primary filter is currently LZMA2. With + typical files, XZ Utils create about 30 % smaller files than gzip. + + To ease adapting support for the .xz format into existing applications + and scripts, the API of liblzma is somewhat similar to the API of the + popular zlib library. For the same reason, the command line tool xz + has similar command line syntax than that of gzip. + + When aiming for the highest compression ratio, LZMA2 encoder uses + a lot of CPU time and may use, depending on the settings, even + hundreds of megabytes of RAM. However, in fast modes, LZMA2 encoder + competes with bzip2 in compression speed, RAM usage, and compression + ratio. + + LZMA2 is reasonably fast to decompress. It is a little slower than + gzip, but a lot faster than bzip2. Being fast to decompress means + that the .xz format is especially nice when the same file will be + decompressed very many times (usually on different computers), which + is the case e.g. when distributing software packages. In such + situations, it's not too bad if the compression takes some time, + since that needs to be done only once to benefit many people. + + With some file types, combining (or "chaining") LZMA2 with an + additional filter can improve compression ratio. A filter chain may + contain up to four filters, although usually only one two is used. + For example, putting a BCJ (Branch/Call/Jump) filter before LZMA2 + in the filter chain can improve compression ratio of executable files. + + Since the .xz format allows adding new filter IDs, it is possible that + some day there will be a filter that is, for example, much faster to + compress than LZMA2 (but probably with worse compression ratio). + Similarly, it is possible that some day there is a filter that will + compress better than LZMA2. + + XZ Utils doesn't support multithreaded compression or decompression + yet. It has been planned though and taken into account when designing + the .xz file format. + + +1. Documentation +---------------- + +1.1. Overall documentation + + README This file + + INSTALL.generic Generic install instructions for those not familiar + with packages using GNU Autotools + INSTALL Installation instructions specific to XZ Utils + PACKAGERS Information to packagers of XZ Utils + + COPYING XZ Utils copyright and license information + COPYING.GPLv2 GNU General Public License version 2 + COPYING.GPLv3 GNU General Public License version 3 + COPYING.LGPLv2.1 GNU Lesser General Public License version 2.1 + + AUTHORS The main authors of XZ Utils + THANKS Incomplete list of people who have helped making + this software + NEWS User-visible changes between XZ Utils releases + ChangeLog Detailed list of changes (commit log) + TODO Known bugs and some sort of to-do list + + Note that only some of the above files are included in binary + packages. + + +1.2. Documentation for command line tools + + The command line tools are documented as man pages. In source code + releases (and possibly also in some binary packages), the man pages + are also provided in plain text (ASCII only) and PDF formats in the + directory "doc/man" to make the man pages more accessible to those + whose operating system doesn't provide an easy way to view man pages. + + +1.3. Documentation for liblzma + + The liblzma API headers include short docs about each function + and data type as Doxygen tags. These docs should be quite OK as + a quick reference. + + I have planned to write a bunch of very well documented example + programs, which (due to comments) should work as a tutorial to + various features of liblzma. No such example programs have been + written yet. + + For now, if you have never used liblzma, libbzip2, or zlib, I + recommend learning *basics* of zlib API. Once you know that, it + should be easier to learn liblzma. + + http://zlib.net/manual.html + http://zlib.net/zlib_how.html + + +2. Version numbering +-------------------- + + The version number format of XZ Utils is X.Y.ZS: + + - X is the major version. When this is incremented, the library + API and ABI break. + + - Y is the minor version. It is incremented when new features are + added without breaking existing API or ABI. Even Y indicates + stable release and odd Y indicates unstable (alpha or beta + version). + + - Z is the revision. This has different meaning for stable and + unstable releases: + * Stable: Z is incremented when bugs get fixed without adding + any new features. + * Unstable: Z is just a counter. API or ABI of features added + in earlier unstable releases having the same X.Y may break. + + - S indicates stability of the release. It is missing from the + stable releases where Y is an even number. When Y is odd, S + is either "alpha" or "beta" to make it very clear that such + versions are not stable releases. The same X.Y.Z combination is + not used for more than one stability level i.e. after X.Y.Zalpha, + the next version can be X.Y.(Z+1)beta but not X.Y.Zbeta. + + +3. Reporting bugs +----------------- + + Naturally it is easiest for me if you already know what causes the + unexpected behavior. Even better if you have a patch to propose. + However, quite often the reason for unexpected behavior is unknown, + so here are a few things to do before sending a bug report: + + 1. Try to create a small example how to reproduce the issue. + + 2. Compile XZ Utils with debugging code using configure switches + --enable-debug and, if possible, --disable-shared. If you are + using GCC, use CFLAGS='-O0 -ggdb3'. Don't strip the resulting + binaries. + + 3. Turn on core dumps. The exact command depends on your shell; + for example in GNU bash it is done with "ulimit -c unlimited", + and in tcsh with "limit coredumpsize unlimited". + + 4. Try to reproduce the suspected bug. If you get "assertion failed" + message, be sure to include the complete message in your bug + report. If the application leaves a coredump, get a backtrace + using gdb: + $ gdb /path/to/app-binary # Load the app to the debugger. + (gdb) core core # Open the coredump. + (gdb) bt # Print the backtrace. Copy & paste to bug report. + (gdb) quit # Quit gdb. + + Report your bug via email or IRC (see Contact information below). + Don't send core dump files or any executables. If you have a small + example file(s) (total size less than 256 KiB), please include + it/them as an attachment. If you have bigger test files, put them + online somewhere and include an URL to the file(s) in the bug report. + + Always include the exact version number of XZ Utils in the bug report. + If you are using a snapshot from the git repository, use "git describe" + to get the exact snapshot version. If you are using XZ Utils shipped + in an operating system distribution, mention the distribution name, + distribution version, and exact xz package version; if you cannot + repeat the bug with the code compiled from unpatched source code, + you probably need to report a bug to your distribution's bug tracking + system. + + +4. Translating the xz tool +-------------------------- + + The messages from the xz tool have been translated into a few + languages. Before starting to translate into a new language, ask + the author that someone else hasn't already started working on it. + + Test your translation. Testing includes comparing the translated + output to the original English version by running the same commands + in both your target locale and with LC_ALL=C. Ask someone to + proof-read and test the translation. + + Testing can be done e.g. by installing xz into a temporary directory: + + ./configure --disable-shared --prefix=/tmp/xz-test + # + make -C po update-po + make install + bash debug/translations.bash | less + bash debug/translations.bash | less -S # For --list outputs + + Repeat the above as needed (no need to re-run configure though). + + Note especially the following: + + - The output of --help and --long-help must look nice on + a 80-column terminal. It's OK to add extra lines if needed. + + - In contrast, don't add extra lines to error messages and such. + They are often preceded with e.g. a filename on the same line, + so you have no way to predict where to put a \n. Let the terminal + do the wrapping even if it looks ugly. Adding new lines will be + even uglier in the generic case even if it looks nice in a few + limited examples. + + - Be careful with column alignment in tables and table-like output + (--list, --list --verbose --verbose, --info-memory, --help, and + --long-help): + + * All descriptions of options in --help should start in the + same column (but it doesn't need to be the same column as + in the English messages; just be consistent if you change it). + Check that both --help and --long-help look OK, since they + share several strings. + + * --list --verbose and --info-memory print lines that have + the format "Description: %s". If you need a longer + description, you can put extra space between the colon + and %s. Then you may need to add extra space to other + strings too so that the result as a whole looks good (all + values start at the same column). + + * The columns of the actual tables in --list --verbose --verbose + should be aligned properly. Abbreviate if necessary. It might + be good to keep at least 2 or 3 spaces between column headings + and avoid spaces in the headings so that the columns stand out + better, but this is a matter of opinion. Do what you think + looks best. + + - Be careful to put a period at the end of a sentence when the + original version has it, and don't put it when the original + doesn't have it. Similarly, be careful with \n characters + at the beginning and end of the strings. + + - Read the TRANSLATORS comments that have been extracted from the + source code and included in xz.pot. If they suggest testing the + translation with some type of command, do it. If testing needs + input files, use e.g. tests/files/good-*.xz. + + - When updating the translation, read the fuzzy (modified) strings + carefully, and don't mark them as updated before you actually + have updated them. Reading through the unchanged messages can be + good too; sometimes you may find a better wording for them. + + - If you find language problems in the original English strings, + feel free to suggest improvements. Ask if something is unclear. + + - The translated messages should be understandable (sometimes this + may be a problem with the original English messages too). Don't + make a direct word-by-word translation from English especially if + the result doesn't sound good in your language. + + In short, take your time and pay attention to the details. Making + a good translation is not a quick and trivial thing to do. The + translated xz should look as polished as the English version. + + +5. Other implementations of the .xz format +------------------------------------------ + + 7-Zip and the p7zip port of 7-Zip support the .xz format starting + from the version 9.00alpha. + + http://7-zip.org/ + http://p7zip.sourceforge.net/ + + XZ Embedded is a limited implementation written for use in the Linux + kernel, but it is also suitable for other embedded use. + + http://tukaani.org/xz/embedded.html + + +6. Contact information +---------------------- + + If you have questions, bug reports, patches etc. related to XZ Utils, + contact Lasse Collin (in Finnish or English). + I'm sometimes slow at replying. If you haven't got a reply within two + weeks, assume that your email has got lost and resend it or use IRC. + + You can find me also from #tukaani on Freenode; my nick is Larhzu. + The channel tends to be pretty quiet, so just ask your question and + someone may wake up. + Added: projects/external/xz-5.0.3/doc/THANKS.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/THANKS.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,84 @@ + +Thanks +====== + +Some people have helped more, some less, but nevertheless everyone's help +has been important. :-) In alphabetical order: + - Mark Adler + - H. Peter Anvin + - Nelson H. F. Beebe + - Karl Berry + - Anders F. Bj?rklund + - Emmanuel Blot + - Martin Blumenstingl + - Jakub Bogusz + - Maarten Bosmans + - Trent W. Buck + - David Burklund + - Daniel Mealha Cabrita + - Milo Casagrande + - Marek ?ernock? + - Andrew Dudman + - Markus Duft + - ?smail D?nmez + - Robert Elz + - Gilles Espinasse + - Denis Excoffier + - Mike Frysinger + - Jason Gorski + - Juan Manuel Guerrero + - Joachim Henke + - Peter Ivanov + - Jouk Jansen + - Per ?yvind Karlsen + - Thomas Klausner + - Richard Koch + - Ville Koskinen + - Stephan Kulow + - Peter Lawler + - Hin-Tak Leung + - Andra? 'ruskie' Levstik + - Wim Lewis + - Lorenzo De Liso + - Gregory Margo + - Jim Meyering + - Rafa? Mu?y?o + - Adrien Nader + - Hongbo Ni + - Jonathan Nieder + - Andre Noll + - Peter O'Gorman + - Igor Pavlov + - Diego Elio Petten? + - Elbert Pol + - Mikko Pouru + - Robert Readman + - Bernhard Reutner-Fischer + - Cristian Rodr?guez + - Christian von Roques + - Jukka Salmi + - Alexandre Sauv? + - Andreas Schwab + - Dan Shechter + - Stuart Shelton + - Jonathan Stott + - Dan Stromberg + - Paul Townsend + - Mohammed Adn?ne Trojette + - Alexey Tourbin + - Patrick J. Volkerding + - Martin V?th + - Christian Weisgerber + - Bert Wesarg + - Ralf Wildenhues + - Charles Wilson + - Lars Wirzenius + - Pilorz Wojciech + - Ryan Young + - Andreas Zieringer + +Also thanks to all the people who have participated in the Tukaani project. + +I have probably forgot to add some names to the above list. Sorry about +that and thanks for your help. + Added: projects/external/xz-5.0.3/doc/TODO.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/TODO.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,67 @@ + +XZ Utils To-Do List +=================== + +Known bugs +---------- + + The test suite is too incomplete. + + If the memory usage limit is less than about 13 MiB, xz is unable to + automatically scale down the compression settings enough even though + it would be possible by switching from BT2/BT3/BT4 match finder to + HC3/HC4. + + The code to detect number of CPU cores doesn't count hyperthreading + as multiple cores. In context of xz, it probably should. + Hyperthreading is good at least with p7zip. + + XZ Utils compress some files significantly worse than LZMA Utils. + This is due to faster compression presets used by XZ Utils, and + can often be worked around by using "xz --extreme". With some files + --extreme isn't enough though: it's most likely with files that + compress extremely well, so going from compression ratio of 0.003 + to 0.004 means big relative increase in the compressed file size. + + xz doesn't quote unprintable characters when it displays file names + given on the command line. + + tuklib_exit() doesn't block signals => EINTR is possible. + + SIGTSTP is not handled. If xz is stopped, the estimated remaining + time and calculated (de)compression speed won't make sense in the + progress indicator (xz --verbose). + + +Missing features +---------------- + + xz doesn't support copying extended attributes, access control + lists etc. from source to target file. + + Multithreaded compression + + Multithreaded decompression + + Buffer-to-buffer coding could use less RAM (especially when + decompressing LZMA1 or LZMA2). + + I/O library is not implemented (similar to gzopen() in zlib). + It will be a separate library that supports uncompressed, .gz, + .bz2, .lzma, and .xz files. + + lzma_strerror() to convert lzma_ret to human readable form? + This is tricky, because the same error codes are used with + slightly different meanings, and this cannot be fixed anymore. + + +Documentation +------------- + + Some tutorial is needed for liblzma. I have planned to write some + extremely well commented example programs, which would work as + a tutorial. I suppose the Doxygen tags are quite OK as a quick + reference once one is familiar with the liblzma API. + + Document the LZMA1 and LZMA2 algorithms. + Added: projects/external/xz-5.0.3/doc/examples/xz_pipe_comp.c ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/examples/xz_pipe_comp.c Thu Oct 13 17:21:32 2011 @@ -0,0 +1,127 @@ +/* + * xz_pipe_comp.c + * A simple example of pipe-only xz compressor implementation. + * version: 2010-07-12 - by Daniel Mealha Cabrita + * Not copyrighted -- provided to the public domain. + * + * Compiling: + * Link with liblzma. GCC example: + * $ gcc -llzma xz_pipe_comp.c -o xz_pipe_comp + * + * Usage example: + * $ cat some_file | ./xz_pipe_comp > some_file.xz + */ + +#include +#include +#include +#include +#include + + +/* COMPRESSION SETTINGS */ + +/* analogous to xz CLI options: -0 to -9 */ +#define COMPRESSION_LEVEL 6 + +/* boolean setting, analogous to xz CLI option: -e */ +#define COMPRESSION_EXTREME true + +/* see: /usr/include/lzma/check.h LZMA_CHECK_* */ +#define INTEGRITY_CHECK LZMA_CHECK_CRC64 + + +/* read/write buffer sizes */ +#define IN_BUF_MAX 4096 +#define OUT_BUF_MAX 4096 + +/* error codes */ +#define RET_OK 0 +#define RET_ERROR_INIT 1 +#define RET_ERROR_INPUT 2 +#define RET_ERROR_OUTPUT 3 +#define RET_ERROR_COMPRESSION 4 + + +/* note: in_file and out_file must be open already */ +int xz_compress (FILE *in_file, FILE *out_file) +{ + uint32_t preset = COMPRESSION_LEVEL | (COMPRESSION_EXTREME ? LZMA_PRESET_EXTREME : 0); + lzma_check check = INTEGRITY_CHECK; + lzma_stream strm = LZMA_STREAM_INIT; /* alloc and init lzma_stream struct */ + uint8_t in_buf [IN_BUF_MAX]; + uint8_t out_buf [OUT_BUF_MAX]; + size_t in_len; /* length of useful data in in_buf */ + size_t out_len; /* length of useful data in out_buf */ + bool in_finished = false; + bool out_finished = false; + lzma_action action; + lzma_ret ret_xz; + int ret; + + ret = RET_OK; + + /* initialize xz encoder */ + ret_xz = lzma_easy_encoder (&strm, preset, check); + if (ret_xz != LZMA_OK) { + fprintf (stderr, "lzma_easy_encoder error: %d\n", (int) ret_xz); + return RET_ERROR_INIT; + } + + while ((! in_finished) && (! out_finished)) { + /* read incoming data */ + in_len = fread (in_buf, 1, IN_BUF_MAX, in_file); + + if (feof (in_file)) { + in_finished = true; + } + if (ferror (in_file)) { + in_finished = true; + ret = RET_ERROR_INPUT; + } + + strm.next_in = in_buf; + strm.avail_in = in_len; + + /* if no more data from in_buf, flushes the + internal xz buffers and closes the xz data + with LZMA_FINISH */ + action = in_finished ? LZMA_FINISH : LZMA_RUN; + + /* loop until there's no pending compressed output */ + do { + /* out_buf is clean at this point */ + strm.next_out = out_buf; + strm.avail_out = OUT_BUF_MAX; + + /* compress data */ + ret_xz = lzma_code (&strm, action); + + if ((ret_xz != LZMA_OK) && (ret_xz != LZMA_STREAM_END)) { + fprintf (stderr, "lzma_code error: %d\n", (int) ret_xz); + out_finished = true; + ret = RET_ERROR_COMPRESSION; + } else { + /* write compressed data */ + out_len = OUT_BUF_MAX - strm.avail_out; + fwrite (out_buf, 1, out_len, out_file); + if (ferror (out_file)) { + out_finished = true; + ret = RET_ERROR_OUTPUT; + } + } + } while (strm.avail_out == 0); + } + + lzma_end (&strm); + return ret; +} + +int main () +{ + int ret; + + ret = xz_compress (stdin, stdout); + return ret; +} + Added: projects/external/xz-5.0.3/doc/examples/xz_pipe_decomp.c ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/examples/xz_pipe_decomp.c Thu Oct 13 17:21:32 2011 @@ -0,0 +1,115 @@ +/* + * xz_pipe_decomp.c + * A simple example of pipe-only xz decompressor implementation. + * version: 2010-07-12 - by Daniel Mealha Cabrita + * Not copyrighted -- provided to the public domain. + * + * Compiling: + * Link with liblzma. GCC example: + * $ gcc -llzma xz_pipe_decomp.c -o xz_pipe_decomp + * + * Usage example: + * $ cat some_file.xz | ./xz_pipe_decomp > some_file + */ + +#include +#include +#include +#include +#include + + +/* read/write buffer sizes */ +#define IN_BUF_MAX 4096 +#define OUT_BUF_MAX 4096 + +/* error codes */ +#define RET_OK 0 +#define RET_ERROR_INIT 1 +#define RET_ERROR_INPUT 2 +#define RET_ERROR_OUTPUT 3 +#define RET_ERROR_DECOMPRESSION 4 + + +/* note: in_file and out_file must be open already */ +int xz_decompress (FILE *in_file, FILE *out_file) +{ + lzma_stream strm = LZMA_STREAM_INIT; /* alloc and init lzma_stream struct */ + const uint32_t flags = LZMA_TELL_UNSUPPORTED_CHECK | LZMA_CONCATENATED; + const uint64_t memory_limit = UINT64_MAX; /* no memory limit */ + uint8_t in_buf [IN_BUF_MAX]; + uint8_t out_buf [OUT_BUF_MAX]; + size_t in_len; /* length of useful data in in_buf */ + size_t out_len; /* length of useful data in out_buf */ + bool in_finished = false; + bool out_finished = false; + lzma_action action; + lzma_ret ret_xz; + int ret; + + ret = RET_OK; + + /* initialize xz decoder */ + ret_xz = lzma_stream_decoder (&strm, memory_limit, flags); + if (ret_xz != LZMA_OK) { + fprintf (stderr, "lzma_stream_decoder error: %d\n", (int) ret_xz); + return RET_ERROR_INIT; + } + + while ((! in_finished) && (! out_finished)) { + /* read incoming data */ + in_len = fread (in_buf, 1, IN_BUF_MAX, in_file); + + if (feof (in_file)) { + in_finished = true; + } + if (ferror (in_file)) { + in_finished = true; + ret = RET_ERROR_INPUT; + } + + strm.next_in = in_buf; + strm.avail_in = in_len; + + /* if no more data from in_buf, flushes the + internal xz buffers and closes the decompressed data + with LZMA_FINISH */ + action = in_finished ? LZMA_FINISH : LZMA_RUN; + + /* loop until there's no pending decompressed output */ + do { + /* out_buf is clean at this point */ + strm.next_out = out_buf; + strm.avail_out = OUT_BUF_MAX; + + /* decompress data */ + ret_xz = lzma_code (&strm, action); + + if ((ret_xz != LZMA_OK) && (ret_xz != LZMA_STREAM_END)) { + fprintf (stderr, "lzma_code error: %d\n", (int) ret_xz); + out_finished = true; + ret = RET_ERROR_DECOMPRESSION; + } else { + /* write decompressed data */ + out_len = OUT_BUF_MAX - strm.avail_out; + fwrite (out_buf, 1, out_len, out_file); + if (ferror (out_file)) { + out_finished = true; + ret = RET_ERROR_OUTPUT; + } + } + } while (strm.avail_out == 0); + } + + lzma_end (&strm); + return ret; +} + +int main () +{ + int ret; + + ret = xz_decompress (stdin, stdout); + return ret; +} + Added: projects/external/xz-5.0.3/doc/faq.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/faq.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,224 @@ + +XZ Utils FAQ +============ + +Q: What do the letters XZ mean? + +A: Nothing. They are just two letters, which come from the file format + suffix .xz. The .xz suffix was selected, because it seemed to be + pretty much unused. It has no deeper meaning. + + +Q: What are LZMA and LZMA2? + +A: LZMA stands for Lempel-Ziv-Markov chain-Algorithm. It is the name + of the compression algorithm designed by Igor Pavlov for 7-Zip. + LZMA is based on LZ77 and range encoding. + + LZMA2 is an updated version of the original LZMA to fix a couple of + practical issues. In context of XZ Utils, LZMA is called LZMA1 to + emphasize that LZMA is not the same thing as LZMA2. LZMA2 is the + primary compression algorithm in the .xz file format. + + +Q: There are many LZMA related projects. How does XZ Utils relate to them? + +A: 7-Zip and LZMA SDK are the original projects. LZMA SDK is roughly + a subset of the 7-Zip source tree. + + p7zip is 7-Zip's command line tools ported to POSIX-like systems. + + LZMA Utils provide a gzip-like lzma tool for POSIX-like systems. + LZMA Utils are based on LZMA SDK. XZ Utils are the successor to + LZMA Utils. + + There are several other projects using LZMA. Most are more or less + based on LZMA SDK. See . + + +Q: Why is liblzma named liblzma if its primary file format is .xz? + Shouldn't it be e.g. libxz? + +A: When the designing of the .xz format began, the idea was to replace + the .lzma format and use the same .lzma suffix. It would have been + quite OK to reuse the suffix when there were very few .lzma files + around. However, the old .lzma format become popular before the + new format was finished. The new format was renamed to .xz but the + name of liblzma wasn't changed. + + +Q: Do XZ Utils support the .7z format? + +A: No. Use 7-Zip (Windows) or p7zip (POSIX-like systems) to handle .7z + files. + + +Q: I have many .tar.7z files. Can I convert them to .tar.xz without + spending hours recompressing the data? + +A: In the "extra" directory, there is a script named 7z2lzma.bash which + is able to convert some .7z files to the .lzma format (not .xz). It + needs the 7za (or 7z) command from p7zip. The script may silently + produce corrupt output if certain assumptions are not met, so + decompress the resulting .lzma file and compare it against the + original before deleting the original file! + + +Q: I have many .lzma files. Can I quickly convert them to the .xz format? + +A: For now, no. Since XZ Utils supports the .lzma format, it's usually + not too bad to keep the old files in the old format. If you want to + do the conversion anyway, you need to decompress the .lzma files and + then recompress to the .xz format. + + Technically, there is a way to make the conversion relatively fast + (roughly twice the time that normal decompression takes). Writing + such a tool would take quite a bit time though, and would probably + be useful to only a few people. If you really want such a conversion + tool, contact Lasse Collin and offer some money. + + +Q: I have installed xz, but my tar doesn't recognize .tar.xz files. + How can I extract .tar.xz files? + +A: xz -dc foo.tar.xz | tar xf - + + +Q: Can I recover parts of a broken .xz file (e.g. corrupted CD-R)? + +A: It may be possible if the file consists of multiple blocks, which + typically is not the case if the file was created in single-threaded + mode. There is no recovery program yet. + + +Q: Is (some part of) XZ Utils patented? + +A: Lasse Collin is not aware of any patents that could affect XZ Utils. + However, due to nature of software patents, it's not possible to + guarantee that XZ Utils isn't affected by any third party patent(s). + + +Q: Where can I find documentation about the file format and algorithms? + +A: The .xz format is documented in xz-file-format.txt. It is a container + format only, and doesn't include descriptions of any non-trivial + filters. + + Documenting LZMA and LZMA2 is planned, but for now, there is no other + documentation that the source code. Before you begin, you should know + the basics of LZ77 and range coding algorithms. LZMA is based on LZ77, + but LZMA is a lot more complex. Range coding is used to compress + the final bitstream like Huffman coding is used in Deflate. + + +Q: I cannot find BCJ and BCJ2 filters. Don't they exist in liblzma? + +A: BCJ filter is called "x86" in liblzma. BCJ2 is not included, + because it requires using more than one encoded output stream. + A streamable version of BCJ2-style filtering is planned. + + +Q: I need to use a script that runs "xz -9". On a system with 256 MiB + of RAM, xz says that it cannot allocate memory. Can I make the + script work without modifying it? + +A: Set a default memory usage limit for compression. You can do it e.g. + in a shell initialization script such as ~/.bashrc or /etc/profile: + + XZ_DEFAULTS=--memlimit-compress=150MiB + export XZ_DEFAULTS + + xz will then scale the compression settings down so that the given + memory usage limit is not reached. This way xz shouldn't run out + of memory. + + Check also that memory-related resource limits are high enough. + On most systems, "ulimit -a" will show the current resource limits. + + +Q: How do I create files that can be decompressed with XZ Embedded? + +A: See the documentation in XZ Embedded. In short, something like + this is a good start: + + xz --check=crc32 --lzma2=preset=6e,dict=64KiB + + Or if a BCJ filter is needed too, e.g. if compressing + a kernel image for PowerPC: + + xz --check=crc32 --powerpc --lzma2=preset=6e,dict=64KiB + + Adjust dictionary size to get a good compromise between + compression ratio and decompressor memory usage. Note that + in single-call decompression mode of XZ Embedded, a big + dictionary doesn't increase memory usage. + + +Q: Will xz support threaded compression? + +A: It is planned and has been taken into account when designing + the .xz file format. Eventually there will probably be three types + of threading, each method having its own advantages and disadvantages. + + The simplest method is splitting the uncompressed data into blocks + and compressing them in parallel independent from each other. + Since the blocks are compressed independently, they can also be + decompressed independently. Together with the index feature in .xz, + this allows using threads to create .xz files for random-access + reading. This also makes threaded decompression possible, although + it is not clear if threaded decompression will ever be implemented. + + The independent blocks method has a couple of disadvantages too. It + will compress worse than a single-block method. Often the difference + is not too big (maybe 1-2 %) but sometimes it can be too big. Also, + the memory usage of the compressor increases linearly when adding + threads. + + Match finder parallelization is another threading method. It has + been in 7-Zip for ages. It doesn't affect compression ratio or + memory usage significantly. Among the three threading methods, only + this is useful when compressing small files (files that are not + significantly bigger than the dictionary). Unfortunately this method + scales only to about two CPU cores. + + The third method is pigz-style threading (I use that name, because + pigz uses that method). It doesn't + affect compression ratio significantly and scales to many cores. + The memory usage scales linearly when threads are added. It isn't + significant with pigz, because Deflate uses only 32 KiB dictionary, + but with LZMA2 the memory usage will increase dramatically just like + with the independent blocks method. There is also a constant + computational overhead, which may make pigz-method a bit dull on + dual-core compared to the parallel match finder method, but with more + cores the overhead is not a big deal anymore. + + Combining the threading methods will be possible and also useful. + E.g. combining match finder parallelization with pigz-style threading + can cut the memory usage by 50 %. + + It is possible that the single-threaded method will be modified to + create files indentical to the pigz-style method. We'll see once + pigz-style threading has been implemented in liblzma. + + +Q: How do I build a program that needs liblzmadec (lzmadec.h)? + +A: liblzmadec is part of LZMA Utils. XZ Utils has liblzma, but no + liblzmadec. The code using liblzmadec should be ported to use + liblzma instead. If you cannot or don't want to do that, download + LZMA Utils from . + + +Q: The default build of liblzma is too big. How can I make it smaller? + +A: Give --enable-small to the configure script. Use also appropriate + --enable or --disable options to include only those filter encoders + and decoders and integrity checks that you actually need. Use + CFLAGS=-Os (with GCC) or equivalent to tell your compiler to optimize + for size. See INSTALL for information about configure options. + + If the result is still too big, take a look at XZ Embedded. It is + a separate project, which provides a limited but significantly + smaller XZ decoder implementation than XZ Utils. You can find it + at . + Added: projects/external/xz-5.0.3/doc/history.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/history.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,149 @@ + +History of LZMA Utils and XZ Utils +================================== + +Tukaani distribution + + In 2005, there was a small group working on Tukaani distribution, which + was a Slackware fork. One of the project goals was to fit the distro on + a single 700 MiB ISO-9660 image. Using LZMA instead of gzip helped a + lot. Roughly speaking, one could fit data that took 1000 MiB in gzipped + form into 700 MiB with LZMA. Naturally compression ratio varied across + packages, but this was what we got on average. + + Slackware packages have traditionally had .tgz as the filename suffix, + which is an abbreviation of .tar.gz. A logical naming for LZMA + compressed packages was .tlz, being an abbreviation of .tar.lzma. + + At the end of the year 2007, there was no distribution under the + Tukaani project anymore, but development of LZMA Utils was kept going. + Still, there were .tlz packages around, because at least Vector Linux + (a Slackware based distribution) used LZMA for its packages. + + First versions of the modified pkgtools used the LZMA_Alone tool from + Igor Pavlov's LZMA SDK as is. It was fine, because users wouldn't need + to interact with LZMA_Alone directly. But people soon wanted to use + LZMA for other files too, and the interface of LZMA_Alone wasn't + comfortable for those used to gzip and bzip2. + + +First steps of LZMA Utils + + The first version of LZMA Utils (4.22.0) included a shell script called + lzmash. It was wrapper that had gzip-like command line interface. It + used the LZMA_Alone tool from LZMA SDK to do all the real work. zgrep, + zdiff, and related scripts from gzip were adapted work with LZMA and + were part of the first LZMA Utils release too. + + LZMA Utils 4.22.0 included also lzmadec, which was a small (less than + 10 KiB) decoder-only command line tool. It was written on top of the + decoder-only C code found from the LZMA SDK. lzmadec was convenient in + situations where LZMA_Alone (a few hundred KiB) would be too big. + + lzmash and lzmadec were written by Lasse Collin. + + +Second generation + + The lzmash script was an ugly and not very secure hack. The last + version of LZMA Utils to use lzmash was 4.27.1. + + LZMA Utils 4.32.0beta1 introduced a new lzma command line tool written + by Ville Koskinen. It was written in C++, and used the encoder and + decoder from C++ LZMA SDK with little modifications. This tool replaced + both the lzmash script and the LZMA_Alone command line tool in LZMA + Utils. + + Introducing this new tool caused some temporary incompatibilities, + because LZMA_Alone executable was simply named lzma like the new + command line tool, but they had completely different command line + interface. The file format was still the same. + + Lasse wrote liblzmadec, which was a small decoder-only library based + on the C code found from LZMA SDK. liblzmadec had API similar to zlib, + although there were some significant differences, which made it + non-trivial to use it in some applications designed for zlib and + libbzip2. + + The lzmadec command line tool was converted to use liblzmadec. + + Alexandre Sauv? helped converting build system to use GNU Autotools. + This made is easier to test for certain less portable features needed + by the new command line tool. + + Since the new command line tool never got completely finished (for + example, it didn't support LZMA_OPT environment variable), the intent + was to not call 4.32.x stable. Similarly, liblzmadec wasn't polished, + but appeared to work well enough, so some people started using it too. + + Because the development of the third generation of LZMA Utils was + delayed considerably (3-4 years), the 4.32.x branch had to be kept + maintained. It got some bug fixes now and then, and finally it was + decided to call it stable, although most of the missing features were + never added. + + +File format problems + + The file format used by LZMA_Alone was primitive. It was designed for + embedded systems in mind, and thus provided only minimal set of + features. The two biggest problems for non-embedded use were lack of + magic bytes and integrity check. + + Igor and Lasse started developing a new file format with some help + from Ville Koskinen. Also Mark Adler, Mikko Pouru, H. Peter Anvin, + and Lars Wirzenius helped with some minor things at some point of the + development. Designing the new format took quite a long time (actually, + too long time would be more appropriate expression). It was mostly + because Lasse was quite slow at getting things done due to personal + reasons. + + Originally the new format was supposed to use the same .lzma suffix + that was already used by the old file format. Switching to the new + format wouldn't have caused much trouble when the old format wasn't + used by many people. But since the development of the new format took + so long time, the old format got quite popular, and it was decided + that the new file format must use a different suffix. + + It was decided to use .xz as the suffix of the new file format. The + first stable .xz file format specification was finally released in + December 2008. In addition to fixing the most obvious problems of + the old .lzma format, the .xz format added some new features like + support for multiple filters (compression algorithms), filter chaining + (like piping on the command line), and limited random-access reading. + + Currently the primary compression algorithm used in .xz is LZMA2. + It is an extension on top of the original LZMA to fix some practical + problems: LZMA2 adds support for flushing the encoder, uncompressed + chunks, eases stateful decoder implementations, and improves support + for multithreading. Since LZMA2 is better than the original LZMA, the + original LZMA is not supported in .xz. + + +Transition to XZ Utils + + The early versions of XZ Utils were called LZMA Utils. The first + releases were 4.42.0alphas. They dropped the rest of the C++ LZMA SDK. + The code was still directly based on LZMA SDK but ported to C and + converted from callback API to stateful API. Later, Igor Pavlov made + C version of the LZMA encoder too; these ports from C++ to C were + independent in LZMA SDK and LZMA Utils. + + The core of the new LZMA Utils was liblzma, a compression library with + zlib-like API. liblzma supported both the old and new file format. The + gzip-like lzma command line tool was rewritten to use liblzma. + + The new LZMA Utils code base was renamed to XZ Utils when the name + of the new file format had been decided. The liblzma compression + library retained its name though, because changing it would have + caused unnecessary breakage in applications already using the early + liblzma snapshots. + + The xz command line tool can emulate the gzip-like lzma tool by + creating appropriate symlinks (e.g. lzma -> xz). Thus, practically + all scripts using the lzma tool from LZMA Utils will work as is with + XZ Utils (and will keep using the old .lzma format). Still, the .lzma + format is more or less deprecated. XZ Utils will keep supporting it, + but new applications should use the .xz format, and migrating old + applications to .xz is often a good idea too. + Added: projects/external/xz-5.0.3/doc/liblzma.def ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/liblzma.def Thu Oct 13 17:21:32 2011 @@ -0,0 +1,94 @@ +EXPORTS + lzma_alone_decoder + lzma_alone_encoder + lzma_auto_decoder + lzma_block_buffer_bound + lzma_block_buffer_decode + lzma_block_buffer_encode + lzma_block_compressed_size + lzma_block_decoder + lzma_block_encoder + lzma_block_header_decode + lzma_block_header_encode + lzma_block_header_size + lzma_block_total_size + lzma_block_unpadded_size + lzma_check_is_supported + lzma_check_size + lzma_code + lzma_crc32 + lzma_crc64 + lzma_easy_buffer_encode + lzma_easy_decoder_memusage + lzma_easy_encoder + lzma_easy_encoder_memusage + lzma_end + lzma_filter_decoder_is_supported + lzma_filter_encoder_is_supported + lzma_filter_flags_decode + lzma_filter_flags_encode + lzma_filter_flags_size + lzma_filters_copy + lzma_filters_update + lzma_get_check + lzma_index_append + lzma_index_block_count + lzma_index_buffer_decode + lzma_index_buffer_encode + lzma_index_cat + lzma_index_checks + lzma_index_decoder + lzma_index_dup + lzma_index_encoder + lzma_index_end + lzma_index_file_size + lzma_index_hash_append + lzma_index_hash_decode + lzma_index_hash_end + lzma_index_hash_init + lzma_index_hash_size + lzma_index_init + lzma_index_iter_init + lzma_index_iter_locate + lzma_index_iter_next + lzma_index_iter_rewind + lzma_index_memusage + lzma_index_memused + lzma_index_size + lzma_index_stream_count + lzma_index_stream_flags + lzma_index_stream_padding + lzma_index_stream_size + lzma_index_total_size + lzma_index_uncompressed_size + lzma_lzma_preset + lzma_memlimit_get + lzma_memlimit_set + lzma_memusage + lzma_mf_is_supported + lzma_mode_is_supported + lzma_physmem + lzma_properties_decode + lzma_properties_encode + lzma_properties_size + lzma_raw_buffer_decode + lzma_raw_buffer_encode + lzma_raw_decoder + lzma_raw_decoder_memusage + lzma_raw_encoder + lzma_raw_encoder_memusage + lzma_stream_buffer_bound + lzma_stream_buffer_decode + lzma_stream_buffer_encode + lzma_stream_decoder + lzma_stream_encoder + lzma_stream_flags_compare + lzma_stream_footer_decode + lzma_stream_footer_encode + lzma_stream_header_decode + lzma_stream_header_encode + lzma_version_number + lzma_version_string + lzma_vli_decode + lzma_vli_encode + lzma_vli_size Added: projects/external/xz-5.0.3/doc/lzma-file-format.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/lzma-file-format.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,166 @@ + +The .lzma File Format +===================== + + 0. Preface + 0.1. Notices and Acknowledgements + 0.2. Changes + 1. File Format + 1.1. Header + 1.1.1. Properties + 1.1.2. Dictionary Size + 1.1.3. Uncompressed Size + 1.2. LZMA Compressed Data + 2. References + + +0. Preface + + This document describes the .lzma file format, which is + sometimes also called LZMA_Alone format. It is a legacy file + format, which is being or has been replaced by the .xz format. + The MIME type of the .lzma format is `application/x-lzma'. + + The most commonly used software to handle .lzma files are + LZMA SDK, LZMA Utils, 7-Zip, and XZ Utils. This document + describes some of the differences between these implementations + and gives hints what subset of the .lzma format is the most + portable. + + +0.1. Notices and Acknowledgements + + This file format was designed by Igor Pavlov for use in + LZMA SDK. This document was written by Lasse Collin + using the documentation found + from the LZMA SDK. + + This document has been put into the public domain. + + +0.2. Changes + + Last modified: 2011-04-12 11:55+0300 + + +1. File Format + + +-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+ + | Header | LZMA Compressed Data | + +-+-+-+-+-+-+-+-+-+-+-+-+-+==========================+ + + The .lzma format file consist of 13-byte Header followed by + the LZMA Compressed Data. + + Unlike the .gz, .bz2, and .xz formats, it is not possible to + concatenate multiple .lzma files as is and expect the + decompression tool to decode the resulting file as if it were + a single .lzma file. + + For example, the command line tools from LZMA Utils and + LZMA SDK silently ignore all the data after the first .lzma + stream. In contrast, the command line tool from XZ Utils + considers the .lzma file to be corrupt if there is data after + the first .lzma stream. + + +1.1. Header + + +------------+----+----+----+----+--+--+--+--+--+--+--+--+ + | Properties | Dictionary Size | Uncompressed Size | + +------------+----+----+----+----+--+--+--+--+--+--+--+--+ + + +1.1.1. Properties + + The Properties field contains three properties. An abbreviation + is given in parentheses, followed by the value range of the + property. The field consists of + + 1) the number of literal context bits (lc, [0, 8]); + 2) the number of literal position bits (lp, [0, 4]); and + 3) the number of position bits (pb, [0, 4]). + + The properties are encoded using the following formula: + + Properties = (pb * 5 + lp) * 9 + lc + + The following C code illustrates a straightforward way to + decode the Properties field: + + uint8_t lc, lp, pb; + uint8_t prop = get_lzma_properties(); + if (prop > (4 * 5 + 4) * 9 + 8) + return LZMA_PROPERTIES_ERROR; + + pb = prop / (9 * 5); + prop -= pb * 9 * 5; + lp = prop / 9; + lc = prop - lp * 9; + + XZ Utils has an additional requirement: lc + lp <= 4. Files + which don't follow this requirement cannot be decompressed + with XZ Utils. Usually this isn't a problem since the most + common lc/lp/pb values are 3/0/2. It is the only lc/lp/pb + combination that the files created by LZMA Utils can have, + but LZMA Utils can decompress files with any lc/lp/pb. + + +1.1.2. Dictionary Size + + Dictionary Size is stored as an unsigned 32-bit little endian + integer. Any 32-bit value is possible, but for maximum + portability, only sizes of 2^n and 2^n + 2^(n-1) should be + used. + + LZMA Utils creates only files with dictionary size 2^n, + 16 <= n <= 25. LZMA Utils can decompress files with any + dictionary size. + + XZ Utils creates and decompresses .lzma files only with + dictionary sizes 2^n and 2^n + 2^(n-1). If some other + dictionary size is specified when compressing, the value + stored in the Dictionary Size field is a rounded up, but the + specified value is still used in the actual compression code. + + +1.1.3. Uncompressed Size + + Uncompressed Size is stored as unsigned 64-bit little endian + integer. A special value of 0xFFFF_FFFF_FFFF_FFFF indicates + that Uncompressed Size is unknown. End of Payload Marker (*) + is used if and only if Uncompressed Size is unknown. + + XZ Utils rejects files whose Uncompressed Size field specifies + a known size that is 256 GiB or more. This is to reject false + positives when trying to guess if the input file is in the + .lzma format. When Uncompressed Size is unknown, there is no + limit for the uncompressed size of the file. + + (*) Some tools use the term End of Stream (EOS) marker + instead of End of Payload Marker. + + +1.2. LZMA Compressed Data + + Detailed description of the format of this field is out of + scope of this document. + + +2. References + + LZMA SDK - The original LZMA implementation + http://7-zip.org/sdk.html + + 7-Zip + http://7-zip.org/ + + LZMA Utils - LZMA adapted to POSIX-like systems + http://tukaani.org/lzma/ + + XZ Utils - The next generation of LZMA Utils + http://tukaani.org/xz/ + + The .xz file format - The successor of the .lzma format + http://tukaani.org/xz/xz-file-format.txt + Added: projects/external/xz-5.0.3/doc/manuals/lzmainfo-a4.pdf ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/manuals/lzmainfo-letter.pdf ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/manuals/lzmainfo.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/manuals/lzmainfo.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,40 @@ +LZMAINFO(1) XZ Utils LZMAINFO(1) + + + +NAME + lzmainfo - show information stored in the .lzma file header + +SYNOPSIS + lzmainfo [--help] [--version] [file]... + +DESCRIPTION + lzmainfo shows information stored in the .lzma file header. It reads + the first 13 bytes from the specified file, decodes the header, and + prints it to standard output in human readable format. If no files are + given or file is -, standard input is read. + + Usually the most interesting information is the uncompressed size and + the dictionary size. Uncompressed size can be shown only if the file + is in the non-streamed .lzma format variant. The amount of memory + required to decompress the file is a few dozen kilobytes plus the dic- + tionary size. + + lzmainfo is included in XZ Utils primarily for backward compatibility + with LZMA Utils. + +EXIT STATUS + 0 All is good. + + 1 An error occurred. + +BUGS + lzmainfo uses MB while the correct suffix would be MiB (2^20 bytes). + This is to keep the output compatible with LZMA Utils. + +SEE ALSO + xz(1) + + + +Tukaani 2010-09-27 LZMAINFO(1) Added: projects/external/xz-5.0.3/doc/manuals/xz-a4.pdf ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/manuals/xz-letter.pdf ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/manuals/xz.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/manuals/xz.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,1363 @@ +XZ(1) XZ Utils XZ(1) + + + +NAME + xz, unxz, xzcat, lzma, unlzma, lzcat - Compress or decompress .xz and + .lzma files + +SYNOPSIS + xz [option]... [file]... + + unxz is equivalent to xz --decompress. + xzcat is equivalent to xz --decompress --stdout. + lzma is equivalent to xz --format=lzma. + unlzma is equivalent to xz --format=lzma --decompress. + lzcat is equivalent to xz --format=lzma --decompress --stdout. + + When writing scripts that need to decompress files, it is recommended + to always use the name xz with appropriate arguments (xz -d or xz -dc) + instead of the names unxz and xzcat. + +DESCRIPTION + xz is a general-purpose data compression tool with command line syntax + similar to gzip(1) and bzip2(1). The native file format is the .xz + format, but the legacy .lzma format used by LZMA Utils and raw com- + pressed streams with no container format headers are also supported. + + xz compresses or decompresses each file according to the selected oper- + ation mode. If no files are given or file is -, xz reads from standard + input and writes the processed data to standard output. xz will refuse + (display an error and skip the file) to write compressed data to stan- + dard output if it is a terminal. Similarly, xz will refuse to read + compressed data from standard input if it is a terminal. + + Unless --stdout is specified, files other than - are written to a new + file whose name is derived from the source file name: + + o When compressing, the suffix of the target file format (.xz or + .lzma) is appended to the source filename to get the target file- + name. + + o When decompressing, the .xz or .lzma suffix is removed from the + filename to get the target filename. xz also recognizes the suf- + fixes .txz and .tlz, and replaces them with the .tar suffix. + + If the target file already exists, an error is displayed and the file + is skipped. + + Unless writing to standard output, xz will display a warning and skip + the file if any of the following applies: + + o File is not a regular file. Symbolic links are not followed, and + thus they are not considered to be regular files. + + o File has more than one hard link. + + o File has setuid, setgid, or sticky bit set. + + o The operation mode is set to compress and the file already has a + suffix of the target file format (.xz or .txz when compressing to + the .xz format, and .lzma or .tlz when compressing to the .lzma for- + mat). + + o The operation mode is set to decompress and the file doesn't have a + suffix of any of the supported file formats (.xz, .txz, .lzma, or + .tlz). + + After successfully compressing or decompressing the file, xz copies the + owner, group, permissions, access time, and modification time from the + source file to the target file. If copying the group fails, the per- + missions are modified so that the target file doesn't become accessible + to users who didn't have permission to access the source file. xz + doesn't support copying other metadata like access control lists or + extended attributes yet. + + Once the target file has been successfully closed, the source file is + removed unless --keep was specified. The source file is never removed + if the output is written to standard output. + + Sending SIGINFO or SIGUSR1 to the xz process makes it print progress + information to standard error. This has only limited use since when + standard error is a terminal, using --verbose will display an automati- + cally updating progress indicator. + + Memory usage + The memory usage of xz varies from a few hundred kilobytes to several + gigabytes depending on the compression settings. The settings used + when compressing a file determine the memory requirements of the decom- + pressor. Typically the decompressor needs 5 % to 20 % of the amount of + memory that the compressor needed when creating the file. For example, + decompressing a file created with xz -9 currently requires 65 MiB of + memory. Still, it is possible to have .xz files that require several + gigabytes of memory to decompress. + + Especially users of older systems may find the possibility of very + large memory usage annoying. To prevent uncomfortable surprises, xz + has a built-in memory usage limiter, which is disabled by default. + While some operating systems provide ways to limit the memory usage of + processes, relying on it wasn't deemed to be flexible enough (e.g. + using ulimit(1) to limit virtual memory tends to cripple mmap(2)). + + The memory usage limiter can be enabled with the command line option + --memlimit=limit. Often it is more convenient to enable the limiter by + default by setting the environment variable XZ_DEFAULTS, e.g. + XZ_DEFAULTS=--memlimit=150MiB. It is possible to set the limits sepa- + rately for compression and decompression by using --memlimit-com- + press=limit and --memlimit-decompress=limit. Using these two options + outside XZ_DEFAULTS is rarely useful because a single run of xz cannot + do both compression and decompression and --memlimit=limit (or -M + limit) is shorter to type on the command line. + + If the specified memory usage limit is exceeded when decompressing, xz + will display an error and decompressing the file will fail. If the + limit is exceeded when compressing, xz will try to scale the settings + down so that the limit is no longer exceeded (except when using --for- + mat=raw or --no-adjust). This way the operation won't fail unless the + limit is very small. The scaling of the settings is done in steps that + don't match the compression level presets, e.g. if the limit is only + slightly less than the amount required for xz -9, the settings will be + scaled down only a little, not all the way down to xz -8. + + Concatenation and padding with .xz files + It is possible to concatenate .xz files as is. xz will decompress such + files as if they were a single .xz file. + + It is possible to insert padding between the concatenated parts or + after the last part. The padding must consist of null bytes and the + size of the padding must be a multiple of four bytes. This can be use- + ful e.g. if the .xz file is stored on a medium that measures file sizes + in 512-byte blocks. + + Concatenation and padding are not allowed with .lzma files or raw + streams. + +OPTIONS + Integer suffixes and special values + In most places where an integer argument is expected, an optional suf- + fix is supported to easily indicate large integers. There must be no + space between the integer and the suffix. + + KiB Multiply the integer by 1,024 (2^10). Ki, k, kB, K, and KB are + accepted as synonyms for KiB. + + MiB Multiply the integer by 1,048,576 (2^20). Mi, m, M, and MB are + accepted as synonyms for MiB. + + GiB Multiply the integer by 1,073,741,824 (2^30). Gi, g, G, and GB + are accepted as synonyms for GiB. + + The special value max can be used to indicate the maximum integer value + supported by the option. + + Operation mode + If multiple operation mode options are given, the last one takes + effect. + + -z, --compress + Compress. This is the default operation mode when no operation + mode option is specified and no other operation mode is implied + from the command name (for example, unxz implies --decompress). + + -d, --decompress, --uncompress + Decompress. + + -t, --test + Test the integrity of compressed files. This option is equiva- + lent to --decompress --stdout except that the decompressed data + is discarded instead of being written to standard output. No + files are created or removed. + + -l, --list + Print information about compressed files. No uncompressed out- + put is produced, and no files are created or removed. In list + mode, the program cannot read the compressed data from standard + input or from other unseekable sources. + + The default listing shows basic information about files, one + file per line. To get more detailed information, use also the + --verbose option. For even more information, use --verbose + twice, but note that this may be slow, because getting all the + extra information requires many seeks. The width of verbose + output exceeds 80 characters, so piping the output to e.g. + less -S may be convenient if the terminal isn't wide enough. + + The exact output may vary between xz versions and different + locales. For machine-readable output, --robot --list should be + used. + + Operation modifiers + -k, --keep + Don't delete the input files. + + -f, --force + This option has several effects: + + o If the target file already exists, delete it before compress- + ing or decompressing. + + o Compress or decompress even if the input is a symbolic link + to a regular file, has more than one hard link, or has the + setuid, setgid, or sticky bit set. The setuid, setgid, and + sticky bits are not copied to the target file. + + o When used with --decompress --stdout and xz cannot recognize + the type of the source file, copy the source file as is to + standard output. This allows xzcat --force to be used like + cat(1) for files that have not been compressed with xz. Note + that in future, xz might support new compressed file formats, + which may make xz decompress more types of files instead of + copying them as is to standard output. --format=format can + be used to restrict xz to decompress only a single file for- + mat. + + -c, --stdout, --to-stdout + Write the compressed or decompressed data to standard output + instead of a file. This implies --keep. + + --no-sparse + Disable creation of sparse files. By default, if decompressing + into a regular file, xz tries to make the file sparse if the + decompressed data contains long sequences of binary zeros. It + also works when writing to standard output as long as standard + output is connected to a regular file and certain additional + conditions are met to make it safe. Creating sparse files may + save disk space and speed up the decompression by reducing the + amount of disk I/O. + + -S .suf, --suffix=.suf + When compressing, use .suf as the suffix for the target file + instead of .xz or .lzma. If not writing to standard output and + the source file already has the suffix .suf, a warning is dis- + played and the file is skipped. + + When decompressing, recognize files with the suffix .suf in + addition to files with the .xz, .txz, .lzma, or .tlz suffix. If + the source file has the suffix .suf, the suffix is removed to + get the target filename. + + When compressing or decompressing raw streams (--format=raw), + the suffix must always be specified unless writing to standard + output, because there is no default suffix for raw streams. + + --files[=file] + Read the filenames to process from file; if file is omitted, + filenames are read from standard input. Filenames must be ter- + minated with the newline character. A dash (-) is taken as a + regular filename; it doesn't mean standard input. If filenames + are given also as command line arguments, they are processed + before the filenames read from file. + + --files0[=file] + This is identical to --files[=file] except that each filename + must be terminated with the null character. + + Basic file format and compression options + -F format, --format=format + Specify the file format to compress or decompress: + + auto This is the default. When compressing, auto is equiva- + lent to xz. When decompressing, the format of the input + file is automatically detected. Note that raw streams + (created with --format=raw) cannot be auto-detected. + + xz Compress to the .xz file format, or accept only .xz files + when decompressing. + + lzma, alone + Compress to the legacy .lzma file format, or accept only + .lzma files when decompressing. The alternative name + alone is provided for backwards compatibility with LZMA + Utils. + + raw Compress or uncompress a raw stream (no headers). This + is meant for advanced users only. To decode raw streams, + you need use --format=raw and explicitly specify the fil- + ter chain, which normally would have been stored in the + container headers. + + -C check, --check=check + Specify the type of the integrity check. The check is calcu- + lated from the uncompressed data and stored in the .xz file. + This option has an effect only when compressing into the .xz + format; the .lzma format doesn't support integrity checks. The + integrity check (if any) is verified when the .xz file is decom- + pressed. + + Supported check types: + + none Don't calculate an integrity check at all. This is usu- + ally a bad idea. This can be useful when integrity of + the data is verified by other means anyway. + + crc32 Calculate CRC32 using the polynomial from IEEE-802.3 + (Ethernet). + + crc64 Calculate CRC64 using the polynomial from ECMA-182. This + is the default, since it is slightly better than CRC32 at + detecting damaged files and the speed difference is neg- + ligible. + + sha256 Calculate SHA-256. This is somewhat slower than CRC32 + and CRC64. + + Integrity of the .xz headers is always verified with CRC32. It + is not possible to change or disable it. + + -0 ... -9 + Select a compression preset level. The default is -6. If mul- + tiple preset levels are specified, the last one takes effect. + If a custom filter chain was already specified, setting a com- + pression preset level clears the custom filter chain. + + The differences between the presets are more significant than + with gzip(1) and bzip2(1). The selected compression settings + determine the memory requirements of the decompressor, thus + using a too high preset level might make it painful to decom- + press the file on an old system with little RAM. Specifically, + it's not a good idea to blindly use -9 for everything like it + often is with gzip(1) and bzip2(1). + + -0 ... -3 + These are somewhat fast presets. -0 is sometimes faster + than gzip -9 while compressing much better. The higher + ones often have speed comparable to bzip2(1) with compa- + rable or better compression ratio, although the results + depend a lot on the type of data being compressed. + + -4 ... -6 + Good to very good compression while keeping decompressor + memory usage reasonable even for old systems. -6 is the + default, which is usually a good choice e.g. for dis- + tributing files that need to be decompressible even on + systems with only 16 MiB RAM. (-5e or -6e may be worth + considering too. See --extreme.) + + -7 ... -9 + These are like -6 but with higher compressor and decom- + pressor memory requirements. These are useful only when + compressing files bigger than 8 MiB, 16 MiB, and 32 MiB, + respectively. + + On the same hardware, the decompression speed is approximately a + constant number of bytes of compressed data per second. In + other words, the better the compression, the faster the decom- + pression will usually be. This also means that the amount of + uncompressed output produced per second can vary a lot. + + The following table summarises the features of the presets: + + Preset DictSize CompCPU CompMem DecMem + -0 256 KiB 0 3 MiB 1 MiB + -1 1 MiB 1 9 MiB 2 MiB + -2 2 MiB 2 17 MiB 3 MiB + -3 4 MiB 3 32 MiB 5 MiB + -4 4 MiB 4 48 MiB 5 MiB + -5 8 MiB 5 94 MiB 9 MiB + -6 8 MiB 6 94 MiB 9 MiB + -7 16 MiB 6 186 MiB 17 MiB + -8 32 MiB 6 370 MiB 33 MiB + -9 64 MiB 6 674 MiB 65 MiB + + Column descriptions: + + o DictSize is the LZMA2 dictionary size. It is waste of memory + to use a dictionary bigger than the size of the uncompressed + file. This is why it is good to avoid using the presets -7 + ... -9 when there's no real need for them. At -6 and lower, + the amount of memory wasted is usually low enough to not mat- + ter. + + o CompCPU is a simplified representation of the LZMA2 settings + that affect compression speed. The dictionary size affects + speed too, so while CompCPU is the same for levels -6 ... -9, + higher levels still tend to be a little slower. To get even + slower and thus possibly better compression, see --extreme. + + o CompMem contains the compressor memory requirements in the + single-threaded mode. It may vary slightly between xz ver- + sions. Memory requirements of some of the future multi- + threaded modes may be dramatically higher than that of the + single-threaded mode. + + o DecMem contains the decompressor memory requirements. That + is, the compression settings determine the memory require- + ments of the decompressor. The exact decompressor memory + usage is slighly more than the LZMA2 dictionary size, but the + values in the table have been rounded up to the next full + MiB. + + -e, --extreme + Use a slower variant of the selected compression preset level + (-0 ... -9) to hopefully get a little bit better compression + ratio, but with bad luck this can also make it worse. Decom- + pressor memory usage is not affected, but compressor memory + usage increases a little at preset levels -0 ... -3. + + Since there are two presets with dictionary sizes 4 MiB and + 8 MiB, the presets -3e and -5e use slightly faster settings + (lower CompCPU) than -4e and -6e, respectively. That way no two + presets are identical. + + Preset DictSize CompCPU CompMem DecMem + -0e 256 KiB 8 4 MiB 1 MiB + -1e 1 MiB 8 13 MiB 2 MiB + -2e 2 MiB 8 25 MiB 3 MiB + -3e 4 MiB 7 48 MiB 5 MiB + -4e 4 MiB 8 48 MiB 5 MiB + -5e 8 MiB 7 94 MiB 9 MiB + -6e 8 MiB 8 94 MiB 9 MiB + -7e 16 MiB 8 186 MiB 17 MiB + -8e 32 MiB 8 370 MiB 33 MiB + -9e 64 MiB 8 674 MiB 65 MiB + + For example, there are a total of four presets that use 8 MiB + dictionary, whose order from the fastest to the slowest is -5, + -6, -5e, and -6e. + + --fast + --best These are somewhat misleading aliases for -0 and -9, respec- + tively. These are provided only for backwards compatibility + with LZMA Utils. Avoid using these options. + + --memlimit-compress=limit + Set a memory usage limit for compression. If this option is + specified multiple times, the last one takes effect. + + If the compression settings exceed the limit, xz will adjust the + settings downwards so that the limit is no longer exceeded and + display a notice that automatic adjustment was done. Such + adjustments are not made when compressing with --format=raw or + if --no-adjust has been specified. In those cases, an error is + displayed and xz will exit with exit status 1. + + The limit can be specified in multiple ways: + + o The limit can be an absolute value in bytes. Using an inte- + ger suffix like MiB can be useful. Example: --memlimit-com- + press=80MiB + + o The limit can be specified as a percentage of total physical + memory (RAM). This can be useful especially when setting the + XZ_DEFAULTS environment variable in a shell initialization + script that is shared between different computers. That way + the limit is automatically bigger on systems with more mem- + ory. Example: --memlimit-compress=70% + + o The limit can be reset back to its default value by setting + it to 0. This is currently equivalent to setting the limit + to max (no memory usage limit). Once multithreading support + has been implemented, there may be a difference between 0 and + max for the multithreaded case, so it is recommended to use 0 + instead of max until the details have been decided. + + See also the section Memory usage. + + --memlimit-decompress=limit + Set a memory usage limit for decompression. This also affects + the --list mode. If the operation is not possible without + exceeding the limit, xz will display an error and decompressing + the file will fail. See --memlimit-compress=limit for possible + ways to specify the limit. + + -M limit, --memlimit=limit, --memory=limit + This is equivalent to specifying --memlimit-compress=limit + --memlimit-decompress=limit. + + --no-adjust + Display an error and exit if the compression settings exceed the + memory usage limit. The default is to adjust the settings down- + wards so that the memory usage limit is not exceeded. Automatic + adjusting is always disabled when creating raw streams (--for- + mat=raw). + + -T threads, --threads=threads + Specify the number of worker threads to use. The actual number + of threads can be less than threads if using more threads would + exceed the memory usage limit. + + Multithreaded compression and decompression are not implemented + yet, so this option has no effect for now. + + As of writing (2010-09-27), it hasn't been decided if threads + will be used by default on multicore systems once support for + threading has been implemented. Comments are welcome. The com- + plicating factor is that using many threads will increase the + memory usage dramatically. Note that if multithreading will be + the default, it will probably be done so that single-threaded + and multithreaded modes produce the same output, so compression + ratio won't be significantly affected if threading will be + enabled by default. + + Custom compressor filter chains + A custom filter chain allows specifying the compression settings in + detail instead of relying on the settings associated to the preset lev- + els. When a custom filter chain is specified, the compression preset + level options (-0 ... -9 and --extreme) are silently ignored. + + A filter chain is comparable to piping on the command line. When com- + pressing, the uncompressed input goes to the first filter, whose output + goes to the next filter (if any). The output of the last filter gets + written to the compressed file. The maximum number of filters in the + chain is four, but typically a filter chain has only one or two fil- + ters. + + Many filters have limitations on where they can be in the filter chain: + some filters can work only as the last filter in the chain, some only + as a non-last filter, and some work in any position in the chain. + Depending on the filter, this limitation is either inherent to the fil- + ter design or exists to prevent security issues. + + A custom filter chain is specified by using one or more filter options + in the order they are wanted in the filter chain. That is, the order + of filter options is significant! When decoding raw streams (--for- + mat=raw), the filter chain is specified in the same order as it was + specified when compressing. + + Filters take filter-specific options as a comma-separated list. Extra + commas in options are ignored. Every option has a default value, so + you need to specify only those you want to change. + + --lzma1[=options] + --lzma2[=options] + Add LZMA1 or LZMA2 filter to the filter chain. These filters + can be used only as the last filter in the chain. + + LZMA1 is a legacy filter, which is supported almost solely due + to the legacy .lzma file format, which supports only LZMA1. + LZMA2 is an updated version of LZMA1 to fix some practical + issues of LZMA1. The .xz format uses LZMA2 and doesn't support + LZMA1 at all. Compression speed and ratios of LZMA1 and LZMA2 + are practically the same. + + LZMA1 and LZMA2 share the same set of options: + + preset=preset + Reset all LZMA1 or LZMA2 options to preset. Preset con- + sist of an integer, which may be followed by single-let- + ter preset modifiers. The integer can be from 0 to 9, + matching the command line options -0 ... -9. The only + supported modifier is currently e, which matches + --extreme. The default preset is 6, from which the + default values for the rest of the LZMA1 or LZMA2 options + are taken. + + dict=size + Dictionary (history buffer) size indicates how many bytes + of the recently processed uncompressed data is kept in + memory. The algorithm tries to find repeating byte + sequences (matches) in the uncompressed data, and replace + them with references to the data currently in the dictio- + nary. The bigger the dictionary, the higher is the + chance to find a match. Thus, increasing dictionary size + usually improves compression ratio, but a dictionary big- + ger than the uncompressed file is waste of memory. + + Typical dictionary size is from 64 KiB to 64 MiB. The + minimum is 4 KiB. The maximum for compression is cur- + rently 1.5 GiB (1536 MiB). The decompressor already sup- + ports dictionaries up to one byte less than 4 GiB, which + is the maximum for the LZMA1 and LZMA2 stream formats. + + Dictionary size and match finder (mf) together determine + the memory usage of the LZMA1 or LZMA2 encoder. The same + (or bigger) dictionary size is required for decompressing + that was used when compressing, thus the memory usage of + the decoder is determined by the dictionary size used + when compressing. The .xz headers store the dictionary + size either as 2^n or 2^n + 2^(n-1), so these sizes are + somewhat preferred for compression. Other sizes will get + rounded up when stored in the .xz headers. + + lc=lc Specify the number of literal context bits. The minimum + is 0 and the maximum is 4; the default is 3. In addi- + tion, the sum of lc and lp must not exceed 4. + + All bytes that cannot be encoded as matches are encoded + as literals. That is, literals are simply 8-bit bytes + that are encoded one at a time. + + The literal coding makes an assumption that the highest + lc bits of the previous uncompressed byte correlate with + the next byte. E.g. in typical English text, an upper- + case letter is often followed by a lower-case letter, and + a lower-case letter is usually followed by another lower- + case letter. In the US-ASCII character set, the highest + three bits are 010 for upper-case letters and 011 for + lower-case letters. When lc is at least 3, the literal + coding can take advantage of this property in the uncom- + pressed data. + + The default value (3) is usually good. If you want maxi- + mum compression, test lc=4. Sometimes it helps a little, + and sometimes it makes compression worse. If it makes it + worse, test e.g. lc=2 too. + + lp=lp Specify the number of literal position bits. The minimum + is 0 and the maximum is 4; the default is 0. + + Lp affects what kind of alignment in the uncompressed + data is assumed when encoding literals. See pb below for + more information about alignment. + + pb=pb Specify the number of position bits. The minimum is 0 + and the maximum is 4; the default is 2. + + Pb affects what kind of alignment in the uncompressed + data is assumed in general. The default means four-byte + alignment (2^pb=2^2=4), which is often a good choice when + there's no better guess. + + When the aligment is known, setting pb accordingly may + reduce the file size a little. E.g. with text files hav- + ing one-byte alignment (US-ASCII, ISO-8859-*, UTF-8), + setting pb=0 can improve compression slightly. For + UTF-16 text, pb=1 is a good choice. If the alignment is + an odd number like 3 bytes, pb=0 might be the best + choice. + + Even though the assumed alignment can be adjusted with pb + and lp, LZMA1 and LZMA2 still slightly favor 16-byte + alignment. It might be worth taking into account when + designing file formats that are likely to be often com- + pressed with LZMA1 or LZMA2. + + mf=mf Match finder has a major effect on encoder speed, memory + usage, and compression ratio. Usually Hash Chain match + finders are faster than Binary Tree match finders. The + default depends on the preset: 0 uses hc3, 1-3 use hc4, + and the rest use bt4. + + The following match finders are supported. The memory + usage formulas below are rough approximations, which are + closest to the reality when dict is a power of two. + + hc3 Hash Chain with 2- and 3-byte hashing + Minimum value for nice: 3 + Memory usage: + dict * 7.5 (if dict <= 16 MiB); + dict * 5.5 + 64 MiB (if dict > 16 MiB) + + hc4 Hash Chain with 2-, 3-, and 4-byte hashing + Minimum value for nice: 4 + Memory usage: + dict * 7.5 (if dict <= 32 MiB); + dict * 6.5 (if dict > 32 MiB) + + bt2 Binary Tree with 2-byte hashing + Minimum value for nice: 2 + Memory usage: dict * 9.5 + + bt3 Binary Tree with 2- and 3-byte hashing + Minimum value for nice: 3 + Memory usage: + dict * 11.5 (if dict <= 16 MiB); + dict * 9.5 + 64 MiB (if dict > 16 MiB) + + bt4 Binary Tree with 2-, 3-, and 4-byte hashing + Minimum value for nice: 4 + Memory usage: + dict * 11.5 (if dict <= 32 MiB); + dict * 10.5 (if dict > 32 MiB) + + mode=mode + Compression mode specifies the method to analyze the data + produced by the match finder. Supported modes are fast + and normal. The default is fast for presets 0-3 and nor- + mal for presets 4-9. + + Usually fast is used with Hash Chain match finders and + normal with Binary Tree match finders. This is also what + the presets do. + + nice=nice + Specify what is considered to be a nice length for a + match. Once a match of at least nice bytes is found, the + algorithm stops looking for possibly better matches. + + Nice can be 2-273 bytes. Higher values tend to give bet- + ter compression ratio at the expense of speed. The + default depends on the preset. + + depth=depth + Specify the maximum search depth in the match finder. + The default is the special value of 0, which makes the + compressor determine a reasonable depth from mf and nice. + + Reasonable depth for Hash Chains is 4-100 and 16-1000 for + Binary Trees. Using very high values for depth can make + the encoder extremely slow with some files. Avoid set- + ting the depth over 1000 unless you are prepared to + interrupt the compression in case it is taking far too + long. + + When decoding raw streams (--format=raw), LZMA2 needs only the + dictionary size. LZMA1 needs also lc, lp, and pb. + + --x86[=options] + --powerpc[=options] + --ia64[=options] + --arm[=options] + --armthumb[=options] + --sparc[=options] + Add a branch/call/jump (BCJ) filter to the filter chain. These + filters can be used only as a non-last filter in the filter + chain. + + A BCJ filter converts relative addresses in the machine code to + their absolute counterparts. This doesn't change the size of + the data, but it increases redundancy, which can help LZMA2 to + produce 0-15 % smaller .xz file. The BCJ filters are always + reversible, so using a BCJ filter for wrong type of data doesn't + cause any data loss, although it may make the compression ratio + slightly worse. + + It is fine to apply a BCJ filter on a whole executable; there's + no need to apply it only on the executable section. Applying a + BCJ filter on an archive that contains both executable and non- + executable files may or may not give good results, so it gener- + ally isn't good to blindly apply a BCJ filter when compressing + binary packages for distribution. + + These BCJ filters are very fast and use insignificant amount of + memory. If a BCJ filter improves compression ratio of a file, + it can improve decompression speed at the same time. This is + because, on the same hardware, the decompression speed of LZMA2 + is roughly a fixed number of bytes of compressed data per sec- + ond. + + These BCJ filters have known problems related to the compression + ratio: + + o Some types of files containing executable code (e.g. object + files, static libraries, and Linux kernel modules) have the + addresses in the instructions filled with filler values. + These BCJ filters will still do the address conversion, which + will make the compression worse with these files. + + o Applying a BCJ filter on an archive containing multiple simi- + lar executables can make the compression ratio worse than not + using a BCJ filter. This is because the BCJ filter doesn't + detect the boundaries of the executable files, and doesn't + reset the address conversion counter for each executable. + + Both of the above problems will be fixed in the future in a new + filter. The old BCJ filters will still be useful in embedded + systems, because the decoder of the new filter will be bigger + and use more memory. + + Different instruction sets have have different alignment: + + Filter Alignment Notes + x86 1 32-bit or 64-bit x86 + PowerPC 4 Big endian only + ARM 4 Little endian only + ARM-Thumb 2 Little endian only + IA-64 16 Big or little endian + SPARC 4 Big or little endian + + Since the BCJ-filtered data is usually compressed with LZMA2, + the compression ratio may be improved slightly if the LZMA2 + options are set to match the alignment of the selected BCJ fil- + ter. For example, with the IA-64 filter, it's good to set pb=4 + with LZMA2 (2^4=16). The x86 filter is an exception; it's usu- + ally good to stick to LZMA2's default four-byte alignment when + compressing x86 executables. + + All BCJ filters support the same options: + + start=offset + Specify the start offset that is used when converting + between relative and absolute addresses. The offset must + be a multiple of the alignment of the filter (see the ta- + ble above). The default is zero. In practice, the + default is good; specifying a custom offset is almost + never useful. + + --delta[=options] + Add the Delta filter to the filter chain. The Delta filter can + be only used as a non-last filter in the filter chain. + + Currently only simple byte-wise delta calculation is supported. + It can be useful when compressing e.g. uncompressed bitmap + images or uncompressed PCM audio. However, special purpose + algorithms may give significantly better results than Delta + + LZMA2. This is true especially with audio, which compresses + faster and better e.g. with flac(1). + + Supported options: + + dist=distance + Specify the distance of the delta calculation in bytes. + distance must be 1-256. The default is 1. + + For example, with dist=2 and eight-byte input A1 B1 A2 B3 + A3 B5 A4 B7, the output will be A1 B1 01 02 01 02 01 02. + + Other options + -q, --quiet + Suppress warnings and notices. Specify this twice to suppress + errors too. This option has no effect on the exit status. That + is, even if a warning was suppressed, the exit status to indi- + cate a warning is still used. + + -v, --verbose + Be verbose. If standard error is connected to a terminal, xz + will display a progress indicator. Specifying --verbose twice + will give even more verbose output. + + The progress indicator shows the following information: + + o Completion percentage is shown if the size of the input file + is known. That is, the percentage cannot be shown in pipes. + + o Amount of compressed data produced (compressing) or consumed + (decompressing). + + o Amount of uncompressed data consumed (compressing) or pro- + duced (decompressing). + + o Compression ratio, which is calculated by dividing the amount + of compressed data processed so far by the amount of uncom- + pressed data processed so far. + + o Compression or decompression speed. This is measured as the + amount of uncompressed data consumed (compression) or pro- + duced (decompression) per second. It is shown after a few + seconds have passed since xz started processing the file. + + o Elapsed time in the format M:SS or H:MM:SS. + + o Estimated remaining time is shown only when the size of the + input file is known and a couple of seconds have already + passed since xz started processing the file. The time is + shown in a less precise format which never has any colons, + e.g. 2 min 30 s. + + When standard error is not a terminal, --verbose will make xz + print the filename, compressed size, uncompressed size, compres- + sion ratio, and possibly also the speed and elapsed time on a + single line to standard error after compressing or decompressing + the file. The speed and elapsed time are included only when the + operation took at least a few seconds. If the operation didn't + finish, e.g. due to user interruption, also the completion per- + centage is printed if the size of the input file is known. + + -Q, --no-warn + Don't set the exit status to 2 even if a condition worth a warn- + ing was detected. This option doesn't affect the verbosity + level, thus both --quiet and --no-warn have to be used to not + display warnings and to not alter the exit status. + + --robot + Print messages in a machine-parsable format. This is intended + to ease writing frontends that want to use xz instead of + liblzma, which may be the case with various scripts. The output + with this option enabled is meant to be stable across xz + releases. See the section ROBOT MODE for details. + + --info-memory + Display, in human-readable format, how much physical memory + (RAM) xz thinks the system has and the memory usage limits for + compression and decompression, and exit successfully. + + -h, --help + Display a help message describing the most commonly used + options, and exit successfully. + + -H, --long-help + Display a help message describing all features of xz, and exit + successfully + + -V, --version + Display the version number of xz and liblzma in human readable + format. To get machine-parsable output, specify --robot before + --version. + +ROBOT MODE + The robot mode is activated with the --robot option. It makes the out- + put of xz easier to parse by other programs. Currently --robot is sup- + ported only together with --version, --info-memory, and --list. It + will be supported for normal compression and decompression in the + future. + + Version + xz --robot --version will print the version number of xz and liblzma in + the following format: + + XZ_VERSION=XYYYZZZS + LIBLZMA_VERSION=XYYYZZZS + + X Major version. + + YYY Minor version. Even numbers are stable. Odd numbers are alpha + or beta versions. + + ZZZ Patch level for stable releases or just a counter for develop- + ment releases. + + S Stability. 0 is alpha, 1 is beta, and 2 is stable. S should be + always 2 when YYY is even. + + XYYYZZZS are the same on both lines if xz and liblzma are from the same + XZ Utils release. + + Examples: 4.999.9beta is 49990091 and 5.0.0 is 50000002. + + Memory limit information + xz --robot --info-memory prints a single line with three tab-separated + columns: + + 1. Total amount of physical memory (RAM) in bytes + + 2. Memory usage limit for compression in bytes. A special value of + zero indicates the default setting, which for single-threaded mode + is the same as no limit. + + 3. Memory usage limit for decompression in bytes. A special value of + zero indicates the default setting, which for single-threaded mode + is the same as no limit. + + In the future, the output of xz --robot --info-memory may have more + columns, but never more than a single line. + + List mode + xz --robot --list uses tab-separated output. The first column of every + line has a string that indicates the type of the information found on + that line: + + name This is always the first line when starting to list a file. The + second column on the line is the filename. + + file This line contains overall information about the .xz file. This + line is always printed after the name line. + + stream This line type is used only when --verbose was specified. There + are as many stream lines as there are streams in the .xz file. + + block This line type is used only when --verbose was specified. There + are as many block lines as there are blocks in the .xz file. + The block lines are shown after all the stream lines; different + line types are not interleaved. + + summary + This line type is used only when --verbose was specified twice. + This line is printed after all block lines. Like the file line, + the summary line contains overall information about the .xz + file. + + totals This line is always the very last line of the list output. It + shows the total counts and sizes. + + The columns of the file lines: + 2. Number of streams in the file + 3. Total number of blocks in the stream(s) + 4. Compressed size of the file + 5. Uncompressed size of the file + 6. Compression ratio, for example 0.123. If ratio is over + 9.999, three dashes (---) are displayed instead of the + ratio. + 7. Comma-separated list of integrity check names. The follow- + ing strings are used for the known check types: None, CRC32, + CRC64, and SHA-256. For unknown check types, Unknown-N is + used, where N is the Check ID as a decimal number (one or + two digits). + 8. Total size of stream padding in the file + + The columns of the stream lines: + 2. Stream number (the first stream is 1) + 3. Number of blocks in the stream + 4. Compressed start offset + 5. Uncompressed start offset + 6. Compressed size (does not include stream padding) + 7. Uncompressed size + 8. Compression ratio + 9. Name of the integrity check + 10. Size of stream padding + + The columns of the block lines: + 2. Number of the stream containing this block + 3. Block number relative to the beginning of the stream (the + first block is 1) + 4. Block number relative to the beginning of the file + 5. Compressed start offset relative to the beginning of the + file + 6. Uncompressed start offset relative to the beginning of the + file + 7. Total compressed size of the block (includes headers) + 8. Uncompressed size + 9. Compression ratio + 10. Name of the integrity check + + If --verbose was specified twice, additional columns are included on + the block lines. These are not displayed with a single --verbose, + because getting this information requires many seeks and can thus be + slow: + 11. Value of the integrity check in hexadecimal + 12. Block header size + 13. Block flags: c indicates that compressed size is present, + and u indicates that uncompressed size is present. If the + flag is not set, a dash (-) is shown instead to keep the + string length fixed. New flags may be added to the end of + the string in the future. + 14. Size of the actual compressed data in the block (this + excludes the block header, block padding, and check fields) + 15. Amount of memory (in bytes) required to decompress this + block with this xz version + 16. Filter chain. Note that most of the options used at com- + pression time cannot be known, because only the options that + are needed for decompression are stored in the .xz headers. + + The columns of the totals line: + 2. Number of streams + 3. Number of blocks + 4. Compressed size + 5. Uncompressed size + 6. Average compression ratio + 7. Comma-separated list of integrity check names that were + present in the files + 8. Stream padding size + 9. Number of files. This is here to keep the order of the ear- + lier columns the same as on file lines. + + If --verbose was specified twice, additional columns are included on + the totals line: + 10. Maximum amount of memory (in bytes) required to decompress + the files with this xz version + 11. yes or no indicating if all block headers have both com- + pressed size and uncompressed size stored in them + + Future versions may add new line types and new columns can be added to + the existing line types, but the existing columns won't be changed. + +EXIT STATUS + 0 All is good. + + 1 An error occurred. + + 2 Something worth a warning occurred, but no actual errors + occurred. + + Notices (not warnings or errors) printed on standard error don't affect + the exit status. + +ENVIRONMENT + xz parses space-separated lists of options from the environment vari- + ables XZ_DEFAULTS and XZ_OPT, in this order, before parsing the options + from the command line. Note that only options are parsed from the + environment variables; all non-options are silently ignored. Parsing + is done with getopt_long(3) which is used also for the command line + arguments. + + XZ_DEFAULTS + User-specific or system-wide default options. Typically this is + set in a shell initialization script to enable xz's memory usage + limiter by default. Excluding shell initialization scripts and + similar special cases, scripts must never set or unset + XZ_DEFAULTS. + + XZ_OPT This is for passing options to xz when it is not possible to set + the options directly on the xz command line. This is the case + e.g. when xz is run by a script or tool, e.g. GNU tar(1): + + XZ_OPT=-2v tar caf foo.tar.xz foo + + Scripts may use XZ_OPT e.g. to set script-specific default com- + pression options. It is still recommended to allow users to + override XZ_OPT if that is reasonable, e.g. in sh(1) scripts one + may use something like this: + + XZ_OPT=${XZ_OPT-"-7e"} + export XZ_OPT + +LZMA UTILS COMPATIBILITY + The command line syntax of xz is practically a superset of lzma, + unlzma, and lzcat as found from LZMA Utils 4.32.x. In most cases, it + is possible to replace LZMA Utils with XZ Utils without breaking exist- + ing scripts. There are some incompatibilities though, which may some- + times cause problems. + + Compression preset levels + The numbering of the compression level presets is not identical in xz + and LZMA Utils. The most important difference is how dictionary sizes + are mapped to different presets. Dictionary size is roughly equal to + the decompressor memory usage. + + Level xz LZMA Utils + -0 256 KiB N/A + -1 1 MiB 64 KiB + -2 2 MiB 1 MiB + -3 4 MiB 512 KiB + -4 4 MiB 1 MiB + + -5 8 MiB 2 MiB + -6 8 MiB 4 MiB + -7 16 MiB 8 MiB + -8 32 MiB 16 MiB + -9 64 MiB 32 MiB + + The dictionary size differences affect the compressor memory usage too, + but there are some other differences between LZMA Utils and XZ Utils, + which make the difference even bigger: + + Level xz LZMA Utils 4.32.x + -0 3 MiB N/A + -1 9 MiB 2 MiB + -2 17 MiB 12 MiB + -3 32 MiB 12 MiB + -4 48 MiB 16 MiB + -5 94 MiB 26 MiB + -6 94 MiB 45 MiB + -7 186 MiB 83 MiB + -8 370 MiB 159 MiB + -9 674 MiB 311 MiB + + The default preset level in LZMA Utils is -7 while in XZ Utils it is + -6, so both use an 8 MiB dictionary by default. + + Streamed vs. non-streamed .lzma files + The uncompressed size of the file can be stored in the .lzma header. + LZMA Utils does that when compressing regular files. The alternative + is to mark that uncompressed size is unknown and use end-of-payload + marker to indicate where the decompressor should stop. LZMA Utils uses + this method when uncompressed size isn't known, which is the case for + example in pipes. + + xz supports decompressing .lzma files with or without end-of-payload + marker, but all .lzma files created by xz will use end-of-payload + marker and have uncompressed size marked as unknown in the .lzma + header. This may be a problem in some uncommon situations. For exam- + ple, a .lzma decompressor in an embedded device might work only with + files that have known uncompressed size. If you hit this problem, you + need to use LZMA Utils or LZMA SDK to create .lzma files with known + uncompressed size. + + Unsupported .lzma files + The .lzma format allows lc values up to 8, and lp values up to 4. LZMA + Utils can decompress files with any lc and lp, but always creates files + with lc=3 and lp=0. Creating files with other lc and lp is possible + with xz and with LZMA SDK. + + The implementation of the LZMA1 filter in liblzma requires that the sum + of lc and lp must not exceed 4. Thus, .lzma files, which exceed this + limitation, cannot be decompressed with xz. + + LZMA Utils creates only .lzma files which have a dictionary size of 2^n + (a power of 2) but accepts files with any dictionary size. liblzma + accepts only .lzma files which have a dictionary size of 2^n or 2^n + + 2^(n-1). This is to decrease false positives when detecting .lzma + files. + + These limitations shouldn't be a problem in practice, since practically + all .lzma files have been compressed with settings that liblzma will + accept. + + Trailing garbage + When decompressing, LZMA Utils silently ignore everything after the + first .lzma stream. In most situations, this is a bug. This also + means that LZMA Utils don't support decompressing concatenated .lzma + files. + + If there is data left after the first .lzma stream, xz considers the + file to be corrupt. This may break obscure scripts which have assumed + that trailing garbage is ignored. + +NOTES + Compressed output may vary + The exact compressed output produced from the same uncompressed input + file may vary between XZ Utils versions even if compression options are + identical. This is because the encoder can be improved (faster or bet- + ter compression) without affecting the file format. The output can + vary even between different builds of the same XZ Utils version, if + different build options are used. + + The above means that implementing --rsyncable to create rsyncable .xz + files is not going to happen without freezing a part of the encoder + implementation, which can then be used with --rsyncable. + + Embedded .xz decompressors + Embedded .xz decompressor implementations like XZ Embedded don't neces- + sarily support files created with integrity check types other than none + and crc32. Since the default is --check=crc64, you must use + --check=none or --check=crc32 when creating files for embedded systems. + + Outside embedded systems, all .xz format decompressors support all the + check types, or at least are able to decompress the file without veri- + fying the integrity check if the particular check is not supported. + + XZ Embedded supports BCJ filters, but only with the default start off- + set. + +EXAMPLES + Basics + Compress the file foo into foo.xz using the default compression level + (-6), and remove foo if compression is successful: + + xz foo + + Decompress bar.xz into bar and don't remove bar.xz even if decompres- + sion is successful: + + xz -dk bar.xz + + Create baz.tar.xz with the preset -4e (-4 --extreme), which is slower + than e.g. the default -6, but needs less memory for compression and + decompression (48 MiB and 5 MiB, respectively): + + tar cf - baz | xz -4e > baz.tar.xz + + A mix of compressed and uncompressed files can be decompressed to stan- + dard output with a single command: + + xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt + + Parallel compression of many files + On GNU and *BSD, find(1) and xargs(1) can be used to parallelize com- + pression of many files: + + find . -type f \! -name '*.xz' -print0 \ + | xargs -0r -P4 -n16 xz -T1 + + The -P option to xargs(1) sets the number of parallel xz processes. + The best value for the -n option depends on how many files there are to + be compressed. If there are only a couple of files, the value should + probably be 1; with tens of thousands of files, 100 or even more may be + appropriate to reduce the number of xz processes that xargs(1) will + eventually create. + + The option -T1 for xz is there to force it to single-threaded mode, + because xargs(1) is used to control the amount of parallelization. + + Robot mode + Calculate how many bytes have been saved in total after compressing + multiple files: + + xz --robot --list *.xz | awk '/^totals/{print $5-$4}' + + A script may want to know that it is using new enough xz. The follow- + ing sh(1) script checks that the version number of the xz tool is at + least 5.0.0. This method is compatible with old beta versions, which + didn't support the --robot option: + + if ! eval "$(xz --robot --version 2> /dev/null)" || + [ "$XZ_VERSION" -lt 50000002 ]; then + echo "Your xz is too old." + fi + unset XZ_VERSION LIBLZMA_VERSION + + Set a memory usage limit for decompression using XZ_OPT, but if a limit + has already been set, don't increase it: + + NEWLIM=$((123 << 20)) # 123 MiB + OLDLIM=$(xz --robot --info-memory | cut -f3) + if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then + XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM" + export XZ_OPT + fi + + Custom compressor filter chains + The simplest use for custom filter chains is customizing a LZMA2 pre- + set. This can be useful, because the presets cover only a subset of + the potentially useful combinations of compression settings. + + The CompCPU columns of the tables from the descriptions of the options + -0 ... -9 and --extreme are useful when customizing LZMA2 presets. + Here are the relevant parts collected from those two tables: + + Preset CompCPU + -0 0 + -1 1 + -2 2 + -3 3 + -4 4 + -5 5 + -6 6 + -5e 7 + -6e 8 + + If you know that a file requires somewhat big dictionary (e.g. 32 MiB) + to compress well, but you want to compress it quicker than xz -8 would + do, a preset with a low CompCPU value (e.g. 1) can be modified to use a + bigger dictionary: + + xz --lzma2=preset=1,dict=32MiB foo.tar + + With certain files, the above command may be faster than xz -6 while + compressing significantly better. However, it must be emphasized that + only some files benefit from a big dictionary while keeping the CompCPU + value low. The most obvious situation, where a big dictionary can help + a lot, is an archive containing very similar files of at least a few + megabytes each. The dictionary size has to be significantly bigger + than any individual file to allow LZMA2 to take full advantage of the + similarities between consecutive files. + + If very high compressor and decompressor memory usage is fine, and the + file being compressed is at least several hundred megabytes, it may be + useful to use an even bigger dictionary than the 64 MiB that xz -9 + would use: + + xz -vv --lzma2=dict=192MiB big_foo.tar + + Using -vv (--verbose --verbose) like in the above example can be useful + to see the memory requirements of the compressor and decompressor. + Remember that using a dictionary bigger than the size of the uncom- + pressed file is waste of memory, so the above command isn't useful for + small files. + + Sometimes the compression time doesn't matter, but the decompressor + memory usage has to be kept low e.g. to make it possible to decompress + the file on an embedded system. The following command uses -6e (-6 + --extreme) as a base and sets the dictionary to only 64 KiB. The + resulting file can be decompressed with XZ Embedded (that's why there + is --check=crc32) using about 100 KiB of memory. + + xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo + + If you want to squeeze out as many bytes as possible, adjusting the + number of literal context bits (lc) and number of position bits (pb) + can sometimes help. Adjusting the number of literal position bits (lp) + might help too, but usually lc and pb are more important. E.g. a + source code archive contains mostly US-ASCII text, so something like + the following might give slightly (like 0.1 %) smaller file than xz -6e + (try also without lc=4): + + xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar + + Using another filter together with LZMA2 can improve compression with + certain file types. E.g. to compress a x86-32 or x86-64 shared library + using the x86 BCJ filter: + + xz --x86 --lzma2 libfoo.so + + Note that the order of the filter options is significant. If --x86 is + specified after --lzma2, xz will give an error, because there cannot be + any filter after LZMA2, and also because the x86 BCJ filter cannot be + used as the last filter in the chain. + + The Delta filter together with LZMA2 can give good results with bitmap + images. It should usually beat PNG, which has a few more advanced fil- + ters than simple delta but uses Deflate for the actual compression. + + The image has to be saved in uncompressed format, e.g. as uncompressed + TIFF. The distance parameter of the Delta filter is set to match the + number of bytes per pixel in the image. E.g. 24-bit RGB bitmap needs + dist=3, and it is also good to pass pb=0 to LZMA2 to accommodate the + three-byte alignment: + + xz --delta=dist=3 --lzma2=pb=0 foo.tiff + + If multiple images have been put into a single archive (e.g. .tar), the + Delta filter will work on that too as long as all images have the same + number of bytes per pixel. + +SEE ALSO + xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), + bzip2(1), 7z(1) + + XZ Utils: + XZ Embedded: + LZMA SDK: + + + +Tukaani 2010-10-04 XZ(1) Added: projects/external/xz-5.0.3/doc/manuals/xzdec-a4.pdf ============================================================================== Binary files (empty file) and projects/external/xz-5.0.3/doc/manuals/xzdec-a4.pdf Thu Oct 13 17:21:32 2011 differ Added: projects/external/xz-5.0.3/doc/manuals/xzdec-letter.pdf ============================================================================== Binary file. No diff available. Added: projects/external/xz-5.0.3/doc/manuals/xzdec.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/manuals/xzdec.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,80 @@ +XZDEC(1) XZ Utils XZDEC(1) + + + +NAME + xzdec, lzmadec - Small .xz and .lzma decompressors + +SYNOPSIS + xzdec [option]... [file]... + lzmadec [option]... [file]... + +DESCRIPTION + xzdec is a liblzma-based decompression-only tool for .xz (and only .xz) + files. xzdec is intended to work as a drop-in replacement for xz(1) in + the most common situations where a script has been written to use xz + --decompress --stdout (and possibly a few other commonly used options) + to decompress .xz files. lzmadec is identical to xzdec except that + lzmadec supports .lzma files instead of .xz files. + + To reduce the size of the executable, xzdec doesn't support multi- + threading or localization, and doesn't read options from XZ_DEFAULTS + and XZ_OPT environment variables. xzdec doesn't support displaying + intermediate progress information: sending SIGINFO to xzdec does noth- + ing, but sending SIGUSR1 terminates the process instead of displaying + progress information. + +OPTIONS + -d, --decompress, --uncompress + Ignored for xz(1) compatibility. xzdec supports only decompres- + sion. + + -k, --keep + Ignored for xz(1) compatibility. xzdec never creates or removes + any files. + + -c, --stdout, --to-stdout + Ignored for xz(1) compatibility. xzdec always writes the decom- + pressed data to standard output. + + -q, --quiet + Specifying this once does nothing since xzdec never displays any + warnings or notices. Specify this twice to suppress errors. + + -Q, --no-warn + Ignored for xz(1) compatibility. xzdec never uses the exit sta- + tus 2. + + -h, --help + Display a help message and exit successfully. + + -V, --version + Display the version number of xzdec and liblzma. + +EXIT STATUS + 0 All was good. + + 1 An error occurred. + + xzdec doesn't have any warning messages like xz(1) has, thus the exit + status 2 is not used by xzdec. + +NOTES + Use xz(1) instead of xzdec or lzmadec for normal everyday use. xzdec + or lzmadec are meant only for situations where it is important to have + a smaller decompressor than the full-featured xz(1). + + xzdec and lzmadec are not really that small. The size can be reduced + further by dropping features from liblzma at compile time, but that + shouldn't usually be done for executables distributed in typical non- + embedded operating system distributions. If you need a truly small .xz + decompressor, consider using XZ Embedded. + +SEE ALSO + xz(1) + + XZ Embedded: + + + +Tukaani 2010-09-27 XZDEC(1) Added: projects/external/xz-5.0.3/doc/xz-file-format.txt ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/doc/xz-file-format.txt Thu Oct 13 17:21:32 2011 @@ -0,0 +1,1150 @@ + +The .xz File Format +=================== + +Version 1.0.4 (2009-08-27) + + + 0. Preface + 0.1. Notices and Acknowledgements + 0.2. Getting the Latest Version + 0.3. Version History + 1. Conventions + 1.1. Byte and Its Representation + 1.2. Multibyte Integers + 2. Overall Structure of .xz File + 2.1. Stream + 2.1.1. Stream Header + 2.1.1.1. Header Magic Bytes + 2.1.1.2. Stream Flags + 2.1.1.3. CRC32 + 2.1.2. Stream Footer + 2.1.2.1. CRC32 + 2.1.2.2. Backward Size + 2.1.2.3. Stream Flags + 2.1.2.4. Footer Magic Bytes + 2.2. Stream Padding + 3. Block + 3.1. Block Header + 3.1.1. Block Header Size + 3.1.2. Block Flags + 3.1.3. Compressed Size + 3.1.4. Uncompressed Size + 3.1.5. List of Filter Flags + 3.1.6. Header Padding + 3.1.7. CRC32 + 3.2. Compressed Data + 3.3. Block Padding + 3.4. Check + 4. Index + 4.1. Index Indicator + 4.2. Number of Records + 4.3. List of Records + 4.3.1. Unpadded Size + 4.3.2. Uncompressed Size + 4.4. Index Padding + 4.5. CRC32 + 5. Filter Chains + 5.1. Alignment + 5.2. Security + 5.3. Filters + 5.3.1. LZMA2 + 5.3.2. Branch/Call/Jump Filters for Executables + 5.3.3. Delta + 5.3.3.1. Format of the Encoded Output + 5.4. Custom Filter IDs + 5.4.1. Reserved Custom Filter ID Ranges + 6. Cyclic Redundancy Checks + 7. References + + +0. Preface + + This document describes the .xz file format (filename suffix + ".xz", MIME type "application/x-xz"). It is intended that this + this format replace the old .lzma format used by LZMA SDK and + LZMA Utils. + + +0.1. Notices and Acknowledgements + + This file format was designed by Lasse Collin + and Igor Pavlov. + + Special thanks for helping with this document goes to + Ville Koskinen. Thanks for helping with this document goes to + Mark Adler, H. Peter Anvin, Mikko Pouru, and Lars Wirzenius. + + This document has been put into the public domain. + + +0.2. Getting the Latest Version + + The latest official version of this document can be downloaded + from . + + Specific versions of this document have a filename + xz-file-format-X.Y.Z.txt where X.Y.Z is the version number. + For example, the version 1.0.0 of this document is available + at . + + +0.3. Version History + + Version Date Description + + 1.0.4 2009-08-27 Language improvements in Sections 1.2, + 2.1.1.2, 3.1.1, 3.1.2, and 5.3.1 + + 1.0.3 2009-06-05 Spelling fixes in Sections 5.1 and 5.4 + + 1.0.2 2009-06-04 Typo fixes in Sections 4 and 5.3.1 + + 1.0.1 2009-06-01 Typo fix in Section 0.3 and minor + clarifications to Sections 2, 2.2, + 3.3, 4.4, and 5.3.2 + + 1.0.0 2009-01-14 The first official version + + +1. Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", + "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this + document are to be interpreted as described in [RFC-2119]. + + Indicating a warning means displaying a message, returning + appropriate exit status, or doing something else to let the + user know that something worth warning occurred. The operation + SHOULD still finish if a warning is indicated. + + Indicating an error means displaying a message, returning + appropriate exit status, or doing something else to let the + user know that something prevented successfully finishing the + operation. The operation MUST be aborted once an error has + been indicated. + + +1.1. Byte and Its Representation + + In this document, byte is always 8 bits. + + A "null byte" has all bits unset. That is, the value of a null + byte is 0x00. + + To represent byte blocks, this document uses notation that + is similar to the notation used in [RFC-1952]: + + +-------+ + | Foo | One byte. + +-------+ + + +---+---+ + | Foo | Two bytes; that is, some of the vertical bars + +---+---+ can be missing. + + +=======+ + | Foo | Zero or more bytes. + +=======+ + + In this document, a boxed byte or a byte sequence declared + using this notation is called "a field". The example field + above would be called "the Foo field" or plain "Foo". + + If there are many fields, they may be split to multiple lines. + This is indicated with an arrow ("--->"): + + +=====+ + | Foo | + +=====+ + + +=====+ + ---> | Bar | + +=====+ + + The above is equivalent to this: + + +=====+=====+ + | Foo | Bar | + +=====+=====+ + + +1.2. Multibyte Integers + + Multibyte integers of static length, such as CRC values, + are stored in little endian byte order (least significant + byte first). + + When smaller values are more likely than bigger values (for + example file sizes), multibyte integers are encoded in a + variable-length representation: + - Numbers in the range [0, 127] are copied as is, and take + one byte of space. + - Bigger numbers will occupy two or more bytes. All but the + last byte of the multibyte representation have the highest + (eighth) bit set. + + For now, the value of the variable-length integers is limited + to 63 bits, which limits the encoded size of the integer to + nine bytes. These limits may be increased in the future if + needed. + + The following C code illustrates encoding and decoding of + variable-length integers. The functions return the number of + bytes occupied by the integer (1-9), or zero on error. + + #include + #include + + size_t + encode(uint8_t buf[static 9], uint64_t num) + { + if (num > UINT64_MAX / 2) + return 0; + + size_t i = 0; + + while (num >= 0x80) { + buf[i++] = (uint8_t)(num) | 0x80; + num >>= 7; + } + + buf[i++] = (uint8_t)(num); + + return i; + } + + size_t + decode(const uint8_t buf[], size_t size_max, uint64_t *num) + { + if (size_max == 0) + return 0; + + if (size_max > 9) + size_max = 9; + + *num = buf[0] & 0x7F; + size_t i = 0; + + while (buf[i++] & 0x80) { + if (i >= size_max || buf[i] == 0x00) + return 0; + + *num |= (uint64_t)(buf[i] & 0x7F) << (i * 7); + } + + return i; + } + + +2. Overall Structure of .xz File + + A standalone .xz files consist of one or more Streams which may + have Stream Padding between or after them: + + +========+================+========+================+ + | Stream | Stream Padding | Stream | Stream Padding | ... + +========+================+========+================+ + + The sizes of Stream and Stream Padding are always multiples + of four bytes, thus the size of every valid .xz file MUST be + a multiple of four bytes. + + While a typical file contains only one Stream and no Stream + Padding, a decoder handling standalone .xz files SHOULD support + files that have more than one Stream or Stream Padding. + + In contrast to standalone .xz files, when the .xz file format + is used as an internal part of some other file format or + communication protocol, it usually is expected that the decoder + stops after the first Stream, and doesn't look for Stream + Padding or possibly other Streams. + + +2.1. Stream + + +-+-+-+-+-+-+-+-+-+-+-+-+=======+=======+ +=======+ + | Stream Header | Block | Block | ... | Block | + +-+-+-+-+-+-+-+-+-+-+-+-+=======+=======+ +=======+ + + +=======+-+-+-+-+-+-+-+-+-+-+-+-+ + ---> | Index | Stream Footer | + +=======+-+-+-+-+-+-+-+-+-+-+-+-+ + + All the above fields have a size that is a multiple of four. If + Stream is used as an internal part of another file format, it + is RECOMMENDED to make the Stream start at an offset that is + a multiple of four bytes. + + Stream Header, Index, and Stream Footer are always present in + a Stream. The maximum size of the Index field is 16 GiB (2^34). + + There are zero or more Blocks. The maximum number of Blocks is + limited only by the maximum size of the Index field. + + Total size of a Stream MUST be less than 8 EiB (2^63 bytes). + The same limit applies to the total amount of uncompressed + data stored in a Stream. + + If an implementation supports handling .xz files with multiple + concatenated Streams, it MAY apply the above limits to the file + as a whole instead of limiting per Stream basis. + + +2.1.1. Stream Header + + +---+---+---+---+---+---+-------+------+--+--+--+--+ + | Header Magic Bytes | Stream Flags | CRC32 | + +---+---+---+---+---+---+-------+------+--+--+--+--+ + + +2.1.1.1. Header Magic Bytes + + The first six (6) bytes of the Stream are so called Header + Magic Bytes. They can be used to identify the file type. + + Using a C array and ASCII: + const uint8_t HEADER_MAGIC[6] + = { 0xFD, '7', 'z', 'X', 'Z', 0x00 }; + + In plain hexadecimal: + FD 37 7A 58 5A 00 + + Notes: + - The first byte (0xFD) was chosen so that the files cannot + be erroneously detected as being in .lzma format, in which + the first byte is in the range [0x00, 0xE0]. + - The sixth byte (0x00) was chosen to prevent applications + from misdetecting the file as a text file. + + If the Header Magic Bytes don't match, the decoder MUST + indicate an error. + + +2.1.1.2. Stream Flags + + The first byte of Stream Flags is always a null byte. In the + future, this byte may be used to indicate a new Stream version + or other Stream properties. + + The second byte of Stream Flags is a bit field: + + Bit(s) Mask Description + 0-3 0x0F Type of Check (see Section 3.4): + ID Size Check name + 0x00 0 bytes None + 0x01 4 bytes CRC32 + 0x02 4 bytes (Reserved) + 0x03 4 bytes (Reserved) + 0x04 8 bytes CRC64 + 0x05 8 bytes (Reserved) + 0x06 8 bytes (Reserved) + 0x07 16 bytes (Reserved) + 0x08 16 bytes (Reserved) + 0x09 16 bytes (Reserved) + 0x0A 32 bytes SHA-256 + 0x0B 32 bytes (Reserved) + 0x0C 32 bytes (Reserved) + 0x0D 64 bytes (Reserved) + 0x0E 64 bytes (Reserved) + 0x0F 64 bytes (Reserved) + 4-7 0xF0 Reserved for future use; MUST be zero for now. + + Implementations SHOULD support at least the Check IDs 0x00 + (None) and 0x01 (CRC32). Supporting other Check IDs is + OPTIONAL. If an unsupported Check is used, the decoder SHOULD + indicate a warning or error. + + If any reserved bit is set, the decoder MUST indicate an error. + It is possible that there is a new field present which the + decoder is not aware of, and can thus parse the Stream Header + incorrectly. + + +2.1.1.3. CRC32 + + The CRC32 is calculated from the Stream Flags field. It is + stored as an unsigned 32-bit little endian integer. If the + calculated value does not match the stored one, the decoder + MUST indicate an error. + + The idea is that Stream Flags would always be two bytes, even + if new features are needed. This way old decoders will be able + to verify the CRC32 calculated from Stream Flags, and thus + distinguish between corrupt files (CRC32 doesn't match) and + files that the decoder doesn't support (CRC32 matches but + Stream Flags has reserved bits set). + + +2.1.2. Stream Footer + + +-+-+-+-+---+---+---+---+-------+------+----------+---------+ + | CRC32 | Backward Size | Stream Flags | Footer Magic Bytes | + +-+-+-+-+---+---+---+---+-------+------+----------+---------+ + + +2.1.2.1. CRC32 + + The CRC32 is calculated from the Backward Size and Stream Flags + fields. It is stored as an unsigned 32-bit little endian + integer. If the calculated value does not match the stored one, + the decoder MUST indicate an error. + + The reason to have the CRC32 field before the Backward Size and + Stream Flags fields is to keep the four-byte fields aligned to + a multiple of four bytes. + + +2.1.2.2. Backward Size + + Backward Size is stored as a 32-bit little endian integer, + which indicates the size of the Index field as multiple of + four bytes, minimum value being four bytes: + + real_backward_size = (stored_backward_size + 1) * 4; + + If the stored value does not match the real size of the Index + field, the decoder MUST indicate an error. + + Using a fixed-size integer to store Backward Size makes + it slightly simpler to parse the Stream Footer when the + application needs to parse the Stream backwards. + + +2.1.2.3. Stream Flags + + This is a copy of the Stream Flags field from the Stream + Header. The information stored to Stream Flags is needed + when parsing the Stream backwards. The decoder MUST compare + the Stream Flags fields in both Stream Header and Stream + Footer, and indicate an error if they are not identical. + + +2.1.2.4. Footer Magic Bytes + + As the last step of the decoding process, the decoder MUST + verify the existence of Footer Magic Bytes. If they don't + match, an error MUST be indicated. + + Using a C array and ASCII: + const uint8_t FOOTER_MAGIC[2] = { 'Y', 'Z' }; + + In hexadecimal: + 59 5A + + The primary reason to have Footer Magic Bytes is to make + it easier to detect incomplete files quickly, without + uncompressing. If the file does not end with Footer Magic Bytes + (excluding Stream Padding described in Section 2.2), it cannot + be undamaged, unless someone has intentionally appended garbage + after the end of the Stream. + + +2.2. Stream Padding + + Only the decoders that support decoding of concatenated Streams + MUST support Stream Padding. + + Stream Padding MUST contain only null bytes. To preserve the + four-byte alignment of consecutive Streams, the size of Stream + Padding MUST be a multiple of four bytes. Empty Stream Padding + is allowed. If these requirements are not met, the decoder MUST + indicate an error. + + Note that non-empty Stream Padding is allowed at the end of the + file; there doesn't need to be a new Stream after non-empty + Stream Padding. This can be convenient in certain situations + [GNU-tar]. + + The possibility of Stream Padding MUST be taken into account + when designing an application that parses Streams backwards, + and the application supports concatenated Streams. + + +3. Block + + +==============+=================+===============+=======+ + | Block Header | Compressed Data | Block Padding | Check | + +==============+=================+===============+=======+ + + +3.1. Block Header + + +-------------------+-------------+=================+ + | Block Header Size | Block Flags | Compressed Size | + +-------------------+-------------+=================+ + + +===================+======================+ + ---> | Uncompressed Size | List of Filter Flags | + +===================+======================+ + + +================+--+--+--+--+ + ---> | Header Padding | CRC32 | + +================+--+--+--+--+ + + +3.1.1. Block Header Size + + This field overlaps with the Index Indicator field (see + Section 4.1). + + This field contains the size of the Block Header field, + including the Block Header Size field itself. Valid values are + in the range [0x01, 0xFF], which indicate the size of the Block + Header as multiples of four bytes, minimum size being eight + bytes: + + real_header_size = (encoded_header_size + 1) * 4; + + If a Block Header bigger than 1024 bytes is needed in the + future, a new field can be added between the Block Header and + Compressed Data fields. The presence of this new field would + be indicated in the Block Header field. + + +3.1.2. Block Flags + + The Block Flags field is a bit field: + + Bit(s) Mask Description + 0-1 0x03 Number of filters (1-4) + 2-5 0x3C Reserved for future use; MUST be zero for now. + 6 0x40 The Compressed Size field is present. + 7 0x80 The Uncompressed Size field is present. + + If any reserved bit is set, the decoder MUST indicate an error. + It is possible that there is a new field present which the + decoder is not aware of, and can thus parse the Block Header + incorrectly. + + +3.1.3. Compressed Size + + This field is present only if the appropriate bit is set in + the Block Flags field (see Section 3.1.2). + + The Compressed Size field contains the size of the Compressed + Data field, which MUST be non-zero. Compressed Size is stored + using the encoding described in Section 1.2. If the Compressed + Size doesn't match the size of the Compressed Data field, the + decoder MUST indicate an error. + + +3.1.4. Uncompressed Size + + This field is present only if the appropriate bit is set in + the Block Flags field (see Section 3.1.2). + + The Uncompressed Size field contains the size of the Block + after uncompressing. Uncompressed Size is stored using the + encoding described in Section 1.2. If the Uncompressed Size + does not match the real uncompressed size, the decoder MUST + indicate an error. + + Storing the Compressed Size and Uncompressed Size fields serves + several purposes: + - The decoder knows how much memory it needs to allocate + for a temporary buffer in multithreaded mode. + - Simple error detection: wrong size indicates a broken file. + - Seeking forwards to a specific location in streamed mode. + + It should be noted that the only reliable way to determine + the real uncompressed size is to uncompress the Block, + because the Block Header and Index fields may contain + (intentionally or unintentionally) invalid information. + + +3.1.5. List of Filter Flags + + +================+================+ +================+ + | Filter 0 Flags | Filter 1 Flags | ... | Filter n Flags | + +================+================+ +================+ + + The number of Filter Flags fields is stored in the Block Flags + field (see Section 3.1.2). + + The format of each Filter Flags field is as follows: + + +===========+====================+===================+ + | Filter ID | Size of Properties | Filter Properties | + +===========+====================+===================+ + + Both Filter ID and Size of Properties are stored using the + encoding described in Section 1.2. Size of Properties indicates + the size of the Filter Properties field as bytes. The list of + officially defined Filter IDs and the formats of their Filter + Properties are described in Section 5.3. + + Filter IDs greater than or equal to 0x4000_0000_0000_0000 + (2^62) are reserved for implementation-specific internal use. + These Filter IDs MUST never be used in List of Filter Flags. + + +3.1.6. Header Padding + + This field contains as many null byte as it is needed to make + the Block Header have the size specified in Block Header Size. + If any of the bytes are not null bytes, the decoder MUST + indicate an error. It is possible that there is a new field + present which the decoder is not aware of, and can thus parse + the Block Header incorrectly. + + +3.1.7. CRC32 + + The CRC32 is calculated over everything in the Block Header + field except the CRC32 field itself. It is stored as an + unsigned 32-bit little endian integer. If the calculated + value does not match the stored one, the decoder MUST indicate + an error. + + By verifying the CRC32 of the Block Header before parsing the + actual contents allows the decoder to distinguish between + corrupt and unsupported files. + + +3.2. Compressed Data + + The format of Compressed Data depends on Block Flags and List + of Filter Flags. Excluding the descriptions of the simplest + filters in Section 5.3, the format of the filter-specific + encoded data is out of scope of this document. + + +3.3. Block Padding + + Block Padding MUST contain 0-3 null bytes to make the size of + the Block a multiple of four bytes. This can be needed when + the size of Compressed Data is not a multiple of four. If any + of the bytes in Block Padding are not null bytes, the decoder + MUST indicate an error. + + +3.4. Check + + The type and size of the Check field depends on which bits + are set in the Stream Flags field (see Section 2.1.1.2). + + The Check, when used, is calculated from the original + uncompressed data. If the calculated Check does not match the + stored one, the decoder MUST indicate an error. If the selected + type of Check is not supported by the decoder, it SHOULD + indicate a warning or error. + + +4. Index + + +-----------------+===================+ + | Index Indicator | Number of Records | + +-----------------+===================+ + + +=================+===============+-+-+-+-+ + ---> | List of Records | Index Padding | CRC32 | + +=================+===============+-+-+-+-+ + + Index serves several purposes. Using it, one can + - verify that all Blocks in a Stream have been processed; + - find out the uncompressed size of a Stream; and + - quickly access the beginning of any Block (random access). + + +4.1. Index Indicator + + This field overlaps with the Block Header Size field (see + Section 3.1.1). The value of Index Indicator is always 0x00. + + +4.2. Number of Records + + This field indicates how many Records there are in the List + of Records field, and thus how many Blocks there are in the + Stream. The value is stored using the encoding described in + Section 1.2. If the decoder has decoded all the Blocks of the + Stream, and then notices that the Number of Records doesn't + match the real number of Blocks, the decoder MUST indicate an + error. + + +4.3. List of Records + + List of Records consists of as many Records as indicated by the + Number of Records field: + + +========+========+ + | Record | Record | ... + +========+========+ + + Each Record contains information about one Block: + + +===============+===================+ + | Unpadded Size | Uncompressed Size | + +===============+===================+ + + If the decoder has decoded all the Blocks of the Stream, it + MUST verify that the contents of the Records match the real + Unpadded Size and Uncompressed Size of the respective Blocks. + + Implementation hint: It is possible to verify the Index with + constant memory usage by calculating for example SHA-256 of + both the real size values and the List of Records, then + comparing the hash values. Implementing this using + non-cryptographic hash like CRC32 SHOULD be avoided unless + small code size is important. + + If the decoder supports random-access reading, it MUST verify + that Unpadded Size and Uncompressed Size of every completely + decoded Block match the sizes stored in the Index. If only + partial Block is decoded, the decoder MUST verify that the + processed sizes don't exceed the sizes stored in the Index. + + +4.3.1. Unpadded Size + + This field indicates the size of the Block excluding the Block + Padding field. That is, Unpadded Size is the size of the Block + Header, Compressed Data, and Check fields. Unpadded Size is + stored using the encoding described in Section 1.2. The value + MUST never be zero; with the current structure of Blocks, the + actual minimum value for Unpadded Size is five. + + Implementation note: Because the size of the Block Padding + field is not included in Unpadded Size, calculating the total + size of a Stream or doing random-access reading requires + calculating the actual size of the Blocks by rounding Unpadded + Sizes up to the next multiple of four. + + The reason to exclude Block Padding from Unpadded Size is to + ease making a raw copy of Compressed Data without Block + Padding. This can be useful, for example, if someone wants + to convert Streams to some other file format quickly. + + +4.3.2. Uncompressed Size + + This field indicates the Uncompressed Size of the respective + Block as bytes. The value is stored using the encoding + described in Section 1.2. + + +4.4. Index Padding + + This field MUST contain 0-3 null bytes to pad the Index to + a multiple of four bytes. If any of the bytes are not null + bytes, the decoder MUST indicate an error. + + +4.5. CRC32 + + The CRC32 is calculated over everything in the Index field + except the CRC32 field itself. The CRC32 is stored as an + unsigned 32-bit little endian integer. If the calculated + value does not match the stored one, the decoder MUST indicate + an error. + + +5. Filter Chains + + The Block Flags field defines how many filters are used. When + more than one filter is used, the filters are chained; that is, + the output of one filter is the input of another filter. The + following figure illustrates the direction of data flow. + + v Uncompressed Data ^ + | Filter 0 | + Encoder | Filter 1 | Decoder + | Filter n | + v Compressed Data ^ + + +5.1. Alignment + + Alignment of uncompressed input data is usually the job of + the application producing the data. For example, to get the + best results, an archiver tool should make sure that all + PowerPC executable files in the archive stream start at + offsets that are multiples of four bytes. + + Some filters, for example LZMA2, can be configured to take + advantage of specified alignment of input data. Note that + taking advantage of aligned input can be beneficial also when + a filter is not the first filter in the chain. For example, + if you compress PowerPC executables, you may want to use the + PowerPC filter and chain that with the LZMA2 filter. Because + not only the input but also the output alignment of the PowerPC + filter is four bytes, it is now beneficial to set LZMA2 + settings so that the LZMA2 encoder can take advantage of its + four-byte-aligned input data. + + The output of the last filter in the chain is stored to the + Compressed Data field, which is is guaranteed to be aligned + to a multiple of four bytes relative to the beginning of the + Stream. This can increase + - speed, if the filtered data is handled multiple bytes at + a time by the filter-specific encoder and decoder, + because accessing aligned data in computer memory is + usually faster; and + - compression ratio, if the output data is later compressed + with an external compression tool. + + +5.2. Security + + If filters would be allowed to be chained freely, it would be + possible to create malicious files, that would be very slow to + decode. Such files could be used to create denial of service + attacks. + + Slow files could occur when multiple filters are chained: + + v Compressed input data + | Filter 1 decoder (last filter) + | Filter 0 decoder (non-last filter) + v Uncompressed output data + + The decoder of the last filter in the chain produces a lot of + output from little input. Another filter in the chain takes the + output of the last filter, and produces very little output + while consuming a lot of input. As a result, a lot of data is + moved inside the filter chain, but the filter chain as a whole + gets very little work done. + + To prevent this kind of slow files, there are restrictions on + how the filters can be chained. These restrictions MUST be + taken into account when designing new filters. + + The maximum number of filters in the chain has been limited to + four, thus there can be at maximum of three non-last filters. + Of these three non-last filters, only two are allowed to change + the size of the data. + + The non-last filters, that change the size of the data, MUST + have a limit how much the decoder can compress the data: the + decoder SHOULD produce at least n bytes of output when the + filter is given 2n bytes of input. This limit is not + absolute, but significant deviations MUST be avoided. + + The above limitations guarantee that if the last filter in the + chain produces 4n bytes of output, the chain as a whole will + produce at least n bytes of output. + + +5.3. Filters + +5.3.1. LZMA2 + + LZMA (Lempel-Ziv-Markov chain-Algorithm) is a general-purpose + compression algorithm with high compression ratio and fast + decompression. LZMA is based on LZ77 and range coding + algorithms. + + LZMA2 is an extension on top of the original LZMA. LZMA2 uses + LZMA internally, but adds support for flushing the encoder, + uncompressed chunks, eases stateful decoder implementations, + and improves support for multithreading. Thus, the plain LZMA + will not be supported in this file format. + + Filter ID: 0x21 + Size of Filter Properties: 1 byte + Changes size of data: Yes + Allow as a non-last filter: No + Allow as the last filter: Yes + + Preferred alignment: + Input data: Adjustable to 1/2/4/8/16 byte(s) + Output data: 1 byte + + The format of the one-byte Filter Properties field is as + follows: + + Bits Mask Description + 0-5 0x3F Dictionary Size + 6-7 0xC0 Reserved for future use; MUST be zero for now. + + Dictionary Size is encoded with one-bit mantissa and five-bit + exponent. The smallest dictionary size is 4 KiB and the biggest + is 4 GiB. + + Raw value Mantissa Exponent Dictionary size + 0 2 11 4 KiB + 1 3 11 6 KiB + 2 2 12 8 KiB + 3 3 12 12 KiB + 4 2 13 16 KiB + 5 3 13 24 KiB + 6 2 14 32 KiB + ... ... ... ... + 35 3 27 768 MiB + 36 2 28 1024 MiB + 37 3 29 1536 MiB + 38 2 30 2048 MiB + 39 3 30 3072 MiB + 40 2 31 4096 MiB - 1 B + + Instead of having a table in the decoder, the dictionary size + can be decoded using the following C code: + + const uint8_t bits = get_dictionary_flags() & 0x3F; + if (bits > 40) + return DICTIONARY_TOO_BIG; // Bigger than 4 GiB + + uint32_t dictionary_size; + if (bits == 40) { + dictionary_size = UINT32_MAX; + } else { + dictionary_size = 2 | (bits & 1); + dictionary_size <<= bits / 2 + 11; + } + + +5.3.2. Branch/Call/Jump Filters for Executables + + These filters convert relative branch, call, and jump + instructions to their absolute counterparts in executable + files. This conversion increases redundancy and thus + compression ratio. + + Size of Filter Properties: 0 or 4 bytes + Changes size of data: No + Allow as a non-last filter: Yes + Allow as the last filter: No + + Below is the list of filters in this category. The alignment + is the same for both input and output data. + + Filter ID Alignment Description + 0x04 1 byte x86 filter (BCJ) + 0x05 4 bytes PowerPC (big endian) filter + 0x06 16 bytes IA64 filter + 0x07 4 bytes ARM (little endian) filter + 0x08 2 bytes ARM Thumb (little endian) filter + 0x09 4 bytes SPARC filter + + If the size of Filter Properties is four bytes, the Filter + Properties field contains the start offset used for address + conversions. It is stored as an unsigned 32-bit little endian + integer. The start offset MUST be a multiple of the alignment + of the filter as listed in the table above; if it isn't, the + decoder MUST indicate an error. If the size of Filter + Properties is zero, the start offset is zero. + + Setting the start offset may be useful if an executable has + multiple sections, and there are many cross-section calls. + Taking advantage of this feature usually requires usage of + the Subblock filter, whose design is not complete yet. + + +5.3.3. Delta + + The Delta filter may increase compression ratio when the value + of the next byte correlates with the value of an earlier byte + at specified distance. + + Filter ID: 0x03 + Size of Filter Properties: 1 byte + Changes size of data: No + Allow as a non-last filter: Yes + Allow as the last filter: No + + Preferred alignment: + Input data: 1 byte + Output data: Same as the original input data + + The Properties byte indicates the delta distance, which can be + 1-256 bytes backwards from the current byte: 0x00 indicates + distance of 1 byte and 0xFF distance of 256 bytes. + + +5.3.3.1. Format of the Encoded Output + + The code below illustrates both encoding and decoding with + the Delta filter. + + // Distance is in the range [1, 256]. + const unsigned int distance = get_properties_byte() + 1; + uint8_t pos = 0; + uint8_t delta[256]; + + memset(delta, 0, sizeof(delta)); + + while (1) { + const int byte = read_byte(); + if (byte == EOF) + break; + + uint8_t tmp = delta[(uint8_t)(distance + pos)]; + if (is_encoder) { + tmp = (uint8_t)(byte) - tmp; + delta[pos] = (uint8_t)(byte); + } else { + tmp = (uint8_t)(byte) + tmp; + delta[pos] = tmp; + } + + write_byte(tmp); + --pos; + } + + +5.4. Custom Filter IDs + + If a developer wants to use custom Filter IDs, he has two + choices. The first choice is to contact Lasse Collin and ask + him to allocate a range of IDs for the developer. + + The second choice is to generate a 40-bit random integer, + which the developer can use as his personal Developer ID. + To minimize the risk of collisions, Developer ID has to be + a randomly generated integer, not manually selected "hex word". + The following command, which works on many free operating + systems, can be used to generate Developer ID: + + dd if=/dev/urandom bs=5 count=1 | hexdump + + The developer can then use his Developer ID to create unique + (well, hopefully unique) Filter IDs. + + Bits Mask Description + 0-15 0x0000_0000_0000_FFFF Filter ID + 16-55 0x00FF_FFFF_FFFF_0000 Developer ID + 56-62 0x3F00_0000_0000_0000 Static prefix: 0x3F + + The resulting 63-bit integer will use 9 bytes of space when + stored using the encoding described in Section 1.2. To get + a shorter ID, see the beginning of this Section how to + request a custom ID range. + + +5.4.1. Reserved Custom Filter ID Ranges + + Range Description + 0x0000_0300 - 0x0000_04FF Reserved to ease .7z compatibility + 0x0002_0000 - 0x0007_FFFF Reserved to ease .7z compatibility + 0x0200_0000 - 0x07FF_FFFF Reserved to ease .7z compatibility + + +6. Cyclic Redundancy Checks + + There are several incompatible variations to calculate CRC32 + and CRC64. For simplicity and clarity, complete examples are + provided to calculate the checks as they are used in this file + format. Implementations MAY use different code as long as it + gives identical results. + + The program below reads data from standard input, calculates + the CRC32 and CRC64 values, and prints the calculated values + as big endian hexadecimal strings to standard output. + + #include + #include + #include + + uint32_t crc32_table[256]; + uint64_t crc64_table[256]; + + void + init(void) + { + static const uint32_t poly32 = UINT32_C(0xEDB88320); + static const uint64_t poly64 + = UINT64_C(0xC96C5795D7870F42); + + for (size_t i = 0; i < 256; ++i) { + uint32_t crc32 = i; + uint64_t crc64 = i; + + for (size_t j = 0; j < 8; ++j) { + if (crc32 & 1) + crc32 = (crc32 >> 1) ^ poly32; + else + crc32 >>= 1; + + if (crc64 & 1) + crc64 = (crc64 >> 1) ^ poly64; + else + crc64 >>= 1; + } + + crc32_table[i] = crc32; + crc64_table[i] = crc64; + } + } + + uint32_t + crc32(const uint8_t *buf, size_t size, uint32_t crc) + { + crc = ~crc; + for (size_t i = 0; i < size; ++i) + crc = crc32_table[buf[i] ^ (crc & 0xFF)] + ^ (crc >> 8); + return ~crc; + } + + uint64_t + crc64(const uint8_t *buf, size_t size, uint64_t crc) + { + crc = ~crc; + for (size_t i = 0; i < size; ++i) + crc = crc64_table[buf[i] ^ (crc & 0xFF)] + ^ (crc >> 8); + return ~crc; + } + + int + main() + { + init(); + + uint32_t value32 = 0; + uint64_t value64 = 0; + uint64_t total_size = 0; + uint8_t buf[8192]; + + while (1) { + const size_t buf_size + = fread(buf, 1, sizeof(buf), stdin); + if (buf_size == 0) + break; + + total_size += buf_size; + value32 = crc32(buf, buf_size, value32); + value64 = crc64(buf, buf_size, value64); + } + + printf("Bytes: %" PRIu64 "\n", total_size); + printf("CRC-32: 0x%08" PRIX32 "\n", value32); + printf("CRC-64: 0x%016" PRIX64 "\n", value64); + + return 0; + } + + +7. References + + LZMA SDK - The original LZMA implementation + http://7-zip.org/sdk.html + + LZMA Utils - LZMA adapted to POSIX-like systems + http://tukaani.org/lzma/ + + XZ Utils - The next generation of LZMA Utils + http://tukaani.org/xz/ + + [RFC-1952] + GZIP file format specification version 4.3 + http://www.ietf.org/rfc/rfc1952.txt + - Notation of byte boxes in section "2.1. Overall conventions" + + [RFC-2119] + Key words for use in RFCs to Indicate Requirement Levels + http://www.ietf.org/rfc/rfc2119.txt + + [GNU-tar] + GNU tar 1.21 manual + http://www.gnu.org/software/tar/manual/html_node/Blocking-Factor.html + - Node 9.4.2 "Blocking Factor", paragraph that begins + "gzip will complain about trailing garbage" + - Note that this URL points to the latest version of the + manual, and may some day not contain the note which is in + 1.21. For the exact version of the manual, download GNU + tar 1.21: ftp://ftp.gnu.org/pub/gnu/tar/tar-1.21.tar.gz + Added: projects/external/xz-5.0.3/include/lzma.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,313 @@ +/** + * \file api/lzma.h + * \brief The public API of liblzma data compression library + * + * liblzma is a public domain general-purpose data compression library with + * a zlib-like API. The native file format is .xz, but also the old .lzma + * format and raw (no headers) streams are supported. Multiple compression + * algorithms (filters) are supported. Currently LZMA2 is the primary filter. + * + * liblzma is part of XZ Utils . XZ Utils includes + * a gzip-like command line tool named xz and some other tools. XZ Utils + * is developed and maintained by Lasse Collin. + * + * Major parts of liblzma are based on Igor Pavlov's public domain LZMA SDK + * . + * + * The SHA-256 implementation is based on the public domain code found from + * 7-Zip , which has a modified version of the public + * domain SHA-256 code found from Crypto++ . + * The SHA-256 code in Crypto++ was written by Kevin Springle and Wei Dai. + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + */ + +#ifndef LZMA_H +#define LZMA_H + +/***************************** + * Required standard headers * + *****************************/ + +/* + * liblzma API headers need some standard types and macros. To allow + * including lzma.h without requiring the application to include other + * headers first, lzma.h includes the required standard headers unless + * they already seem to be included already or if LZMA_MANUAL_HEADERS + * has been defined. + * + * Here's what types and macros are needed and from which headers: + * - stddef.h: size_t, NULL + * - stdint.h: uint8_t, uint32_t, uint64_t, UINT32_C(n), uint64_C(n), + * UINT32_MAX, UINT64_MAX + * + * However, inttypes.h is a little more portable than stdint.h, although + * inttypes.h declares some unneeded things compared to plain stdint.h. + * + * The hacks below aren't perfect, specifically they assume that inttypes.h + * exists and that it typedefs at least uint8_t, uint32_t, and uint64_t, + * and that, in case of incomplete inttypes.h, unsigned int is 32-bit. + * If the application already takes care of setting up all the types and + * macros properly (for example by using gnulib's stdint.h or inttypes.h), + * we try to detect that the macros are already defined and don't include + * inttypes.h here again. However, you may define LZMA_MANUAL_HEADERS to + * force this file to never include any system headers. + * + * Some could argue that liblzma API should provide all the required types, + * for example lzma_uint64, LZMA_UINT64_C(n), and LZMA_UINT64_MAX. This was + * seen as an unnecessary mess, since most systems already provide all the + * necessary types and macros in the standard headers. + * + * Note that liblzma API still has lzma_bool, because using stdbool.h would + * break C89 and C++ programs on many systems. sizeof(bool) in C99 isn't + * necessarily the same as sizeof(bool) in C++. + */ + +#ifndef LZMA_MANUAL_HEADERS + /* + * I suppose this works portably also in C++. Note that in C++, + * we need to get size_t into the global namespace. + */ +# include + + /* + * Skip inttypes.h if we already have all the required macros. If we + * have the macros, we assume that we have the matching typedefs too. + */ +# if !defined(UINT32_C) || !defined(UINT64_C) \ + || !defined(UINT32_MAX) || !defined(UINT64_MAX) + /* + * MSVC has no C99 support, and thus it cannot be used to + * compile liblzma. The liblzma API has to still be usable + * from MSVC, so we need to define the required standard + * integer types here. + */ +# if defined(_WIN32) && defined(_MSC_VER) + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + typedef unsigned __int64 uint64_t; +# else + /* Use the standard inttypes.h. */ +# ifdef __cplusplus + /* + * C99 sections 7.18.2 and 7.18.4 specify + * that C++ implementations define the limit + * and constant macros only if specifically + * requested. Note that if you want the + * format macros (PRIu64 etc.) too, you need + * to define __STDC_FORMAT_MACROS before + * including lzma.h, since re-including + * inttypes.h with __STDC_FORMAT_MACROS + * defined doesn't necessarily work. + */ +# ifndef __STDC_LIMIT_MACROS +# define __STDC_LIMIT_MACROS 1 +# endif +# ifndef __STDC_CONSTANT_MACROS +# define __STDC_CONSTANT_MACROS 1 +# endif +# endif + +# include +# endif + + /* + * Some old systems have only the typedefs in inttypes.h, and + * lack all the macros. For those systems, we need a few more + * hacks. We assume that unsigned int is 32-bit and unsigned + * long is either 32-bit or 64-bit. If these hacks aren't + * enough, the application has to setup the types manually + * before including lzma.h. + */ +# ifndef UINT32_C +# if defined(_WIN32) && defined(_MSC_VER) +# define UINT32_C(n) n ## UI32 +# else +# define UINT32_C(n) n ## U +# endif +# endif + +# ifndef UINT64_C +# if defined(_WIN32) && defined(_MSC_VER) +# define UINT64_C(n) n ## UI64 +# else + /* Get ULONG_MAX. */ +# include +# if ULONG_MAX == 4294967295UL +# define UINT64_C(n) n ## ULL +# else +# define UINT64_C(n) n ## UL +# endif +# endif +# endif + +# ifndef UINT32_MAX +# define UINT32_MAX (UINT32_C(4294967295)) +# endif + +# ifndef UINT64_MAX +# define UINT64_MAX (UINT64_C(18446744073709551615)) +# endif +# endif +#endif /* ifdef LZMA_MANUAL_HEADERS */ + + +/****************** + * LZMA_API macro * + ******************/ + +/* + * Some systems require that the functions and function pointers are + * declared specially in the headers. LZMA_API_IMPORT is for importing + * symbols and LZMA_API_CALL is to specify the calling convention. + * + * By default it is assumed that the application will link dynamically + * against liblzma. #define LZMA_API_STATIC in your application if you + * want to link against static liblzma. If you don't care about portability + * to operating systems like Windows, or at least don't care about linking + * against static liblzma on them, don't worry about LZMA_API_STATIC. That + * is, most developers will never need to use LZMA_API_STATIC. + * + * The GCC variants are a special case on Windows (Cygwin and MinGW). + * We rely on GCC doing the right thing with its auto-import feature, + * and thus don't use __declspec(dllimport). This way developers don't + * need to worry about LZMA_API_STATIC. Also the calling convention is + * omitted on Cygwin but not on MinGW. + */ +#ifndef LZMA_API_IMPORT +# if !defined(LZMA_API_STATIC) && defined(_WIN32) && !defined(__GNUC__) +# define LZMA_API_IMPORT __declspec(dllimport) +# else +# define LZMA_API_IMPORT +# endif +#endif + +#ifndef LZMA_API_CALL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define LZMA_API_CALL __cdecl +# else +# define LZMA_API_CALL +# endif +#endif + +#ifndef LZMA_API +# define LZMA_API(type) LZMA_API_IMPORT type LZMA_API_CALL +#endif + + +/*********** + * nothrow * + ***********/ + +/* + * None of the functions in liblzma may throw an exception. Even + * the functions that use callback functions won't throw exceptions, + * because liblzma would break if a callback function threw an exception. + */ +#ifndef lzma_nothrow +# if defined(__cplusplus) +# define lzma_nothrow throw() +# elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) +# define lzma_nothrow __attribute__((__nothrow__)) +# else +# define lzma_nothrow +# endif +#endif + + +/******************** + * GNU C extensions * + ********************/ + +/* + * GNU C extensions are used conditionally in the public API. It doesn't + * break anything if these are sometimes enabled and sometimes not, only + * affects warnings and optimizations. + */ +#if __GNUC__ >= 3 +# ifndef lzma_attribute +# define lzma_attribute(attr) __attribute__(attr) +# endif + + /* warn_unused_result was added in GCC 3.4. */ +# ifndef lzma_attr_warn_unused_result +# if __GNUC__ == 3 && __GNUC_MINOR__ < 4 +# define lzma_attr_warn_unused_result +# endif +# endif + +#else +# ifndef lzma_attribute +# define lzma_attribute(attr) +# endif +#endif + + +#ifndef lzma_attr_pure +# define lzma_attr_pure lzma_attribute((__pure__)) +#endif + +#ifndef lzma_attr_const +# define lzma_attr_const lzma_attribute((__const__)) +#endif + +#ifndef lzma_attr_warn_unused_result +# define lzma_attr_warn_unused_result \ + lzma_attribute((__warn_unused_result__)) +#endif + + +/************** + * Subheaders * + **************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Subheaders check that this is defined. It is to prevent including + * them directly from applications. + */ +#define LZMA_H_INTERNAL 1 + +/* Basic features */ +#include "lzma/version.h" +#include "lzma/base.h" +#include "lzma/vli.h" +#include "lzma/check.h" + +/* Filters */ +#include "lzma/filter.h" +#include "lzma/bcj.h" +#include "lzma/delta.h" +#include "lzma/lzma.h" + +/* Container formats */ +#include "lzma/container.h" + +/* Advanced features */ +#include "lzma/stream_flags.h" +#include "lzma/block.h" +#include "lzma/index.h" +#include "lzma/index_hash.h" + +/* Hardware information */ +#include "lzma/hardware.h" + +/* + * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications + * re-including the subheaders. + */ +#undef LZMA_H_INTERNAL + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef LZMA_H */ Added: projects/external/xz-5.0.3/include/lzma/base.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/base.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,601 @@ +/** + * \file lzma/base.h + * \brief Data types and functions used in many places in liblzma API + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Boolean + * + * This is here because C89 doesn't have stdbool.h. To set a value for + * variables having type lzma_bool, you can use + * - C99's `true' and `false' from stdbool.h; + * - C++'s internal `true' and `false'; or + * - integers one (true) and zero (false). + */ +typedef unsigned char lzma_bool; + + +/** + * \brief Type of reserved enumeration variable in structures + * + * To avoid breaking library ABI when new features are added, several + * structures contain extra variables that may be used in future. Since + * sizeof(enum) can be different than sizeof(int), and sizeof(enum) may + * even vary depending on the range of enumeration constants, we specify + * a separate type to be used for reserved enumeration variables. All + * enumeration constants in liblzma API will be non-negative and less + * than 128, which should guarantee that the ABI won't break even when + * new constants are added to existing enumerations. + */ +typedef enum { + LZMA_RESERVED_ENUM = 0 +} lzma_reserved_enum; + + +/** + * \brief Return values used by several functions in liblzma + * + * Check the descriptions of specific functions to find out which return + * values they can return. With some functions the return values may have + * more specific meanings than described here; those differences are + * described per-function basis. + */ +typedef enum { + LZMA_OK = 0, + /**< + * \brief Operation completed successfully + */ + + LZMA_STREAM_END = 1, + /**< + * \brief End of stream was reached + * + * In encoder, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, or + * LZMA_FINISH was finished. In decoder, this indicates + * that all the data was successfully decoded. + * + * In all cases, when LZMA_STREAM_END is returned, the last + * output bytes should be picked from strm->next_out. + */ + + LZMA_NO_CHECK = 2, + /**< + * \brief Input stream has no integrity check + * + * This return value can be returned only if the + * LZMA_TELL_NO_CHECK flag was used when initializing + * the decoder. LZMA_NO_CHECK is just a warning, and + * the decoding can be continued normally. + * + * It is possible to call lzma_get_check() immediately after + * lzma_code has returned LZMA_NO_CHECK. The result will + * naturally be LZMA_CHECK_NONE, but the possibility to call + * lzma_get_check() may be convenient in some applications. + */ + + LZMA_UNSUPPORTED_CHECK = 3, + /**< + * \brief Cannot calculate the integrity check + * + * The usage of this return value is different in encoders + * and decoders. + * + * Encoders can return this value only from the initialization + * function. If initialization fails with this value, the + * encoding cannot be done, because there's no way to produce + * output with the correct integrity check. + * + * Decoders can return this value only from lzma_code() and + * only if the LZMA_TELL_UNSUPPORTED_CHECK flag was used when + * initializing the decoder. The decoding can still be + * continued normally even if the check type is unsupported, + * but naturally the check will not be validated, and possible + * errors may go undetected. + * + * With decoder, it is possible to call lzma_get_check() + * immediately after lzma_code() has returned + * LZMA_UNSUPPORTED_CHECK. This way it is possible to find + * out what the unsupported Check ID was. + */ + + LZMA_GET_CHECK = 4, + /**< + * \brief Integrity check type is now available + * + * This value can be returned only by the lzma_code() function + * and only if the decoder was initialized with the + * LZMA_TELL_ANY_CHECK flag. LZMA_GET_CHECK tells the + * application that it may now call lzma_get_check() to find + * out the Check ID. This can be used, for example, to + * implement a decoder that accepts only files that have + * strong enough integrity check. + */ + + LZMA_MEM_ERROR = 5, + /**< + * \brief Cannot allocate memory + * + * Memory allocation failed, or the size of the allocation + * would be greater than SIZE_MAX. + * + * Due to internal implementation reasons, the coding cannot + * be continued even if more memory were made available after + * LZMA_MEM_ERROR. + */ + + LZMA_MEMLIMIT_ERROR = 6, + /** + * \brief Memory usage limit was reached + * + * Decoder would need more memory than allowed by the + * specified memory usage limit. To continue decoding, + * the memory usage limit has to be increased with + * lzma_memlimit_set(). + */ + + LZMA_FORMAT_ERROR = 7, + /**< + * \brief File format not recognized + * + * The decoder did not recognize the input as supported file + * format. This error can occur, for example, when trying to + * decode .lzma format file with lzma_stream_decoder, + * because lzma_stream_decoder accepts only the .xz format. + */ + + LZMA_OPTIONS_ERROR = 8, + /**< + * \brief Invalid or unsupported options + * + * Invalid or unsupported options, for example + * - unsupported filter(s) or filter options; or + * - reserved bits set in headers (decoder only). + * + * Rebuilding liblzma with more features enabled, or + * upgrading to a newer version of liblzma may help. + */ + + LZMA_DATA_ERROR = 9, + /**< + * \brief Data is corrupt + * + * The usage of this return value is different in encoders + * and decoders. In both encoder and decoder, the coding + * cannot continue after this error. + * + * Encoders return this if size limits of the target file + * format would be exceeded. These limits are huge, thus + * getting this error from an encoder is mostly theoretical. + * For example, the maximum compressed and uncompressed + * size of a .xz Stream is roughly 8 EiB (2^63 bytes). + * + * Decoders return this error if the input data is corrupt. + * This can mean, for example, invalid CRC32 in headers + * or invalid check of uncompressed data. + */ + + LZMA_BUF_ERROR = 10, + /**< + * \brief No progress is possible + * + * This error code is returned when the coder cannot consume + * any new input and produce any new output. The most common + * reason for this error is that the input stream being + * decoded is truncated or corrupt. + * + * This error is not fatal. Coding can be continued normally + * by providing more input and/or more output space, if + * possible. + * + * Typically the first call to lzma_code() that can do no + * progress returns LZMA_OK instead of LZMA_BUF_ERROR. Only + * the second consecutive call doing no progress will return + * LZMA_BUF_ERROR. This is intentional. + * + * With zlib, Z_BUF_ERROR may be returned even if the + * application is doing nothing wrong, so apps will need + * to handle Z_BUF_ERROR specially. The above hack + * guarantees that liblzma never returns LZMA_BUF_ERROR + * to properly written applications unless the input file + * is truncated or corrupt. This should simplify the + * applications a little. + */ + + LZMA_PROG_ERROR = 11, + /**< + * \brief Programming error + * + * This indicates that the arguments given to the function are + * invalid or the internal state of the decoder is corrupt. + * - Function arguments are invalid or the structures + * pointed by the argument pointers are invalid + * e.g. if strm->next_out has been set to NULL and + * strm->avail_out > 0 when calling lzma_code(). + * - lzma_* functions have been called in wrong order + * e.g. lzma_code() was called right after lzma_end(). + * - If errors occur randomly, the reason might be flaky + * hardware. + * + * If you think that your code is correct, this error code + * can be a sign of a bug in liblzma. See the documentation + * how to report bugs. + */ +} lzma_ret; + + +/** + * \brief The `action' argument for lzma_code() + * + * After the first use of LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, or LZMA_FINISH, + * the same `action' must is used until lzma_code() returns LZMA_STREAM_END. + * Also, the amount of input (that is, strm->avail_in) must not be modified + * by the application until lzma_code() returns LZMA_STREAM_END. Changing the + * `action' or modifying the amount of input will make lzma_code() return + * LZMA_PROG_ERROR. + */ +typedef enum { + LZMA_RUN = 0, + /**< + * \brief Continue coding + * + * Encoder: Encode as much input as possible. Some internal + * buffering will probably be done (depends on the filter + * chain in use), which causes latency: the input used won't + * usually be decodeable from the output of the same + * lzma_code() call. + * + * Decoder: Decode as much input as possible and produce as + * much output as possible. + */ + + LZMA_SYNC_FLUSH = 1, + /**< + * \brief Make all the input available at output + * + * Normally the encoder introduces some latency. + * LZMA_SYNC_FLUSH forces all the buffered data to be + * available at output without resetting the internal + * state of the encoder. This way it is possible to use + * compressed stream for example for communication over + * network. + * + * Only some filters support LZMA_SYNC_FLUSH. Trying to use + * LZMA_SYNC_FLUSH with filters that don't support it will + * make lzma_code() return LZMA_OPTIONS_ERROR. For example, + * LZMA1 doesn't support LZMA_SYNC_FLUSH but LZMA2 does. + * + * Using LZMA_SYNC_FLUSH very often can dramatically reduce + * the compression ratio. With some filters (for example, + * LZMA2), fine-tuning the compression options may help + * mitigate this problem significantly (for example, + * match finder with LZMA2). + * + * Decoders don't support LZMA_SYNC_FLUSH. + */ + + LZMA_FULL_FLUSH = 2, + /**< + * \brief Finish encoding of the current Block + * + * All the input data going to the current Block must have + * been given to the encoder (the last bytes can still be + * pending in* next_in). Call lzma_code() with LZMA_FULL_FLUSH + * until it returns LZMA_STREAM_END. Then continue normally + * with LZMA_RUN or finish the Stream with LZMA_FINISH. + * + * This action is currently supported only by Stream encoder + * and easy encoder (which uses Stream encoder). If there is + * no unfinished Block, no empty Block is created. + */ + + LZMA_FINISH = 3 + /**< + * \brief Finish the coding operation + * + * All the input data must have been given to the encoder + * (the last bytes can still be pending in next_in). + * Call lzma_code() with LZMA_FINISH until it returns + * LZMA_STREAM_END. Once LZMA_FINISH has been used, + * the amount of input must no longer be changed by + * the application. + * + * When decoding, using LZMA_FINISH is optional unless the + * LZMA_CONCATENATED flag was used when the decoder was + * initialized. When LZMA_CONCATENATED was not used, the only + * effect of LZMA_FINISH is that the amount of input must not + * be changed just like in the encoder. + */ +} lzma_action; + + +/** + * \brief Custom functions for memory handling + * + * A pointer to lzma_allocator may be passed via lzma_stream structure + * to liblzma, and some advanced functions take a pointer to lzma_allocator + * as a separate function argument. The library will use the functions + * specified in lzma_allocator for memory handling instead of the default + * malloc() and free(). C++ users should note that the custom memory + * handling functions must not throw exceptions. + * + * liblzma doesn't make an internal copy of lzma_allocator. Thus, it is + * OK to change these function pointers in the middle of the coding + * process, but obviously it must be done carefully to make sure that the + * replacement `free' can deallocate memory allocated by the earlier + * `alloc' function(s). + */ +typedef struct { + /** + * \brief Pointer to a custom memory allocation function + * + * If you don't want a custom allocator, but still want + * custom free(), set this to NULL and liblzma will use + * the standard malloc(). + * + * \param opaque lzma_allocator.opaque (see below) + * \param nmemb Number of elements like in calloc(). liblzma + * will always set nmemb to 1, so it is safe to + * ignore nmemb in a custom allocator if you like. + * The nmemb argument exists only for + * compatibility with zlib and libbzip2. + * \param size Size of an element in bytes. + * liblzma never sets this to zero. + * + * \return Pointer to the beginning of a memory block of + * `size' bytes, or NULL if allocation fails + * for some reason. When allocation fails, functions + * of liblzma return LZMA_MEM_ERROR. + * + * The allocator should not waste time zeroing the allocated buffers. + * This is not only about speed, but also memory usage, since the + * operating system kernel doesn't necessarily allocate the requested + * memory in physical memory until it is actually used. With small + * input files, liblzma may actually need only a fraction of the + * memory that it requested for allocation. + * + * \note LZMA_MEM_ERROR is also used when the size of the + * allocation would be greater than SIZE_MAX. Thus, + * don't assume that the custom allocator must have + * returned NULL if some function from liblzma + * returns LZMA_MEM_ERROR. + */ + void *(LZMA_API_CALL *alloc)(void *opaque, size_t nmemb, size_t size); + + /** + * \brief Pointer to a custom memory freeing function + * + * If you don't want a custom freeing function, but still + * want a custom allocator, set this to NULL and liblzma + * will use the standard free(). + * + * \param opaque lzma_allocator.opaque (see below) + * \param ptr Pointer returned by lzma_allocator.alloc(), + * or when it is set to NULL, a pointer returned + * by the standard malloc(). + */ + void (LZMA_API_CALL *free)(void *opaque, void *ptr); + + /** + * \brief Pointer passed to .alloc() and .free() + * + * opaque is passed as the first argument to lzma_allocator.alloc() + * and lzma_allocator.free(). This intended to ease implementing + * custom memory allocation functions for use with liblzma. + * + * If you don't need this, you should set this to NULL. + */ + void *opaque; + +} lzma_allocator; + + +/** + * \brief Internal data structure + * + * The contents of this structure is not visible outside the library. + */ +typedef struct lzma_internal_s lzma_internal; + + +/** + * \brief Passing data to and from liblzma + * + * The lzma_stream structure is used for + * - passing pointers to input and output buffers to liblzma; + * - defining custom memory hander functions; and + * - holding a pointer to coder-specific internal data structures. + * + * Typical usage: + * + * - After allocating lzma_stream (on stack or with malloc()), it must be + * initialized to LZMA_STREAM_INIT (see LZMA_STREAM_INIT for details). + * + * - Initialize a coder to the lzma_stream, for example by using + * lzma_easy_encoder() or lzma_auto_decoder(). Some notes: + * - In contrast to zlib, strm->next_in and strm->next_out are + * ignored by all initialization functions, thus it is safe + * to not initialize them yet. + * - The initialization functions always set strm->total_in and + * strm->total_out to zero. + * - If the initialization function fails, no memory is left allocated + * that would require freeing with lzma_end() even if some memory was + * associated with the lzma_stream structure when the initialization + * function was called. + * + * - Use lzma_code() to do the actual work. + * + * - Once the coding has been finished, the existing lzma_stream can be + * reused. It is OK to reuse lzma_stream with different initialization + * function without calling lzma_end() first. Old allocations are + * automatically freed. + * + * - Finally, use lzma_end() to free the allocated memory. lzma_end() never + * frees the lzma_stream structure itself. + * + * Application may modify the values of total_in and total_out as it wants. + * They are updated by liblzma to match the amount of data read and + * written, but aren't used for anything else. + */ +typedef struct { + const uint8_t *next_in; /**< Pointer to the next input byte. */ + size_t avail_in; /**< Number of available input bytes in next_in. */ + uint64_t total_in; /**< Total number of bytes read by liblzma. */ + + uint8_t *next_out; /**< Pointer to the next output position. */ + size_t avail_out; /**< Amount of free space in next_out. */ + uint64_t total_out; /**< Total number of bytes written by liblzma. */ + + /** + * \brief Custom memory allocation functions + * + * In most cases this is NULL which makes liblzma use + * the standard malloc() and free(). + */ + lzma_allocator *allocator; + + /** Internal state is not visible to applications. */ + lzma_internal *internal; + + /* + * Reserved space to allow possible future extensions without + * breaking the ABI. Excluding the initialization of this structure, + * you should not touch these, because the names of these variables + * may change. + */ + void *reserved_ptr1; + void *reserved_ptr2; + void *reserved_ptr3; + void *reserved_ptr4; + uint64_t reserved_int1; + uint64_t reserved_int2; + size_t reserved_int3; + size_t reserved_int4; + lzma_reserved_enum reserved_enum1; + lzma_reserved_enum reserved_enum2; + +} lzma_stream; + + +/** + * \brief Initialization for lzma_stream + * + * When you declare an instance of lzma_stream, you can immediately + * initialize it so that initialization functions know that no memory + * has been allocated yet: + * + * lzma_stream strm = LZMA_STREAM_INIT; + * + * If you need to initialize a dynamically allocated lzma_stream, you can use + * memset(strm_pointer, 0, sizeof(lzma_stream)). Strictly speaking, this + * violates the C standard since NULL may have different internal + * representation than zero, but it should be portable enough in practice. + * Anyway, for maximum portability, you can use something like this: + * + * lzma_stream tmp = LZMA_STREAM_INIT; + * *strm = tmp; + */ +#define LZMA_STREAM_INIT \ + { NULL, 0, 0, NULL, 0, 0, NULL, NULL, \ + NULL, NULL, NULL, NULL, 0, 0, 0, 0, \ + LZMA_RESERVED_ENUM, LZMA_RESERVED_ENUM } + + +/** + * \brief Encode or decode data + * + * Once the lzma_stream has been successfully initialized (e.g. with + * lzma_stream_encoder()), the actual encoding or decoding is done + * using this function. The application has to update strm->next_in, + * strm->avail_in, strm->next_out, and strm->avail_out to pass input + * to and get output from liblzma. + * + * See the description of the coder-specific initialization function to find + * out what `action' values are supported by the coder. + */ +extern LZMA_API(lzma_ret) lzma_code(lzma_stream *strm, lzma_action action) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Free memory allocated for the coder data structures + * + * \param strm Pointer to lzma_stream that is at least initialized + * with LZMA_STREAM_INIT. + * + * After lzma_end(strm), strm->internal is guaranteed to be NULL. No other + * members of the lzma_stream structure are touched. + * + * \note zlib indicates an error if application end()s unfinished + * stream structure. liblzma doesn't do this, and assumes that + * application knows what it is doing. + */ +extern LZMA_API(void) lzma_end(lzma_stream *strm) lzma_nothrow; + + +/** + * \brief Get the memory usage of decoder filter chain + * + * This function is currently supported only when *strm has been initialized + * with a function that takes a memlimit argument. With other functions, you + * should use e.g. lzma_raw_encoder_memusage() or lzma_raw_decoder_memusage() + * to estimate the memory requirements. + * + * This function is useful e.g. after LZMA_MEMLIMIT_ERROR to find out how big + * the memory usage limit should have been to decode the input. Note that + * this may give misleading information if decoding .xz Streams that have + * multiple Blocks, because each Block can have different memory requirements. + * + * \return How much memory is currently allocated for the filter + * decoders. If no filter chain is currently allocated, + * some non-zero value is still returned, which is less than + * or equal to what any filter chain would indicate as its + * memory requirement. + * + * If this function isn't supported by *strm or some other error + * occurs, zero is returned. + */ +extern LZMA_API(uint64_t) lzma_memusage(const lzma_stream *strm) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the current memory usage limit + * + * This function is supported only when *strm has been initialized with + * a function that takes a memlimit argument. + * + * \return On success, the current memory usage limit is returned + * (always non-zero). On error, zero is returned. + */ +extern LZMA_API(uint64_t) lzma_memlimit_get(const lzma_stream *strm) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Set the memory usage limit + * + * This function is supported only when *strm has been initialized with + * a function that takes a memlimit argument. + * + * \return - LZMA_OK: New memory usage limit successfully set. + * - LZMA_MEMLIMIT_ERROR: The new limit is too small. + * The limit was not changed. + * - LZMA_PROG_ERROR: Invalid arguments, e.g. *strm doesn't + * support memory usage limit or memlimit was zero. + */ +extern LZMA_API(lzma_ret) lzma_memlimit_set( + lzma_stream *strm, uint64_t memlimit) lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/bcj.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/bcj.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,90 @@ +/** + * \file lzma/bcj.h + * \brief Branch/Call/Jump conversion filters + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/* Filter IDs for lzma_filter.id */ + +#define LZMA_FILTER_X86 LZMA_VLI_C(0x04) + /**< + * Filter for x86 binaries + */ + +#define LZMA_FILTER_POWERPC LZMA_VLI_C(0x05) + /**< + * Filter for Big endian PowerPC binaries + */ + +#define LZMA_FILTER_IA64 LZMA_VLI_C(0x06) + /**< + * Filter for IA-64 (Itanium) binaries. + */ + +#define LZMA_FILTER_ARM LZMA_VLI_C(0x07) + /**< + * Filter for ARM binaries. + */ + +#define LZMA_FILTER_ARMTHUMB LZMA_VLI_C(0x08) + /**< + * Filter for ARM-Thumb binaries. + */ + +#define LZMA_FILTER_SPARC LZMA_VLI_C(0x09) + /**< + * Filter for SPARC binaries. + */ + + +/** + * \brief Options for BCJ filters + * + * The BCJ filters never change the size of the data. Specifying options + * for them is optional: if pointer to options is NULL, default value is + * used. You probably never need to specify options to BCJ filters, so just + * set the options pointer to NULL and be happy. + * + * If options with non-default values have been specified when encoding, + * the same options must also be specified when decoding. + * + * \note At the moment, none of the BCJ filters support + * LZMA_SYNC_FLUSH. If LZMA_SYNC_FLUSH is specified, + * LZMA_OPTIONS_ERROR will be returned. If there is need, + * partial support for LZMA_SYNC_FLUSH can be added in future. + * Partial means that flushing would be possible only at + * offsets that are multiple of 2, 4, or 16 depending on + * the filter, except x86 which cannot be made to support + * LZMA_SYNC_FLUSH predictably. + */ +typedef struct { + /** + * \brief Start offset for conversions + * + * This setting is useful only when the same filter is used + * _separately_ for multiple sections of the same executable file, + * and the sections contain cross-section branch/call/jump + * instructions. In that case it is beneficial to set the start + * offset of the non-first sections so that the relative addresses + * of the cross-section branch/call/jump instructions will use the + * same absolute addresses as in the first section. + * + * When the pointer to options is NULL, the default value (zero) + * is used. + */ + uint32_t start_offset; + +} lzma_options_bcj; Added: projects/external/xz-5.0.3/include/lzma/block.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/block.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,530 @@ +/** + * \file lzma/block.h + * \brief .xz Block handling + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Options for the Block and Block Header encoders and decoders + * + * Different Block handling functions use different parts of this structure. + * Some read some members, other functions write, and some do both. Only the + * members listed for reading need to be initialized when the specified + * functions are called. The members marked for writing will be assigned + * new values at some point either by calling the given function or by + * later calls to lzma_code(). + */ +typedef struct { + /** + * \brief Block format version + * + * To prevent API and ABI breakages if new features are needed in + * the Block field, a version number is used to indicate which + * fields in this structure are in use. For now, version must always + * be zero. With non-zero version, most Block related functions will + * return LZMA_OPTIONS_ERROR. + * + * Read by: + * - All functions that take pointer to lzma_block as argument, + * including lzma_block_header_decode(). + * + * Written by: + * - lzma_block_header_decode() + */ + uint32_t version; + + /** + * \brief Size of the Block Header field + * + * This is always a multiple of four. + * + * Read by: + * - lzma_block_header_encode() + * - lzma_block_header_decode() + * - lzma_block_compressed_size() + * - lzma_block_unpadded_size() + * - lzma_block_total_size() + * - lzma_block_decoder() + * - lzma_block_buffer_decode() + * + * Written by: + * - lzma_block_header_size() + * - lzma_block_buffer_encode() + */ + uint32_t header_size; +# define LZMA_BLOCK_HEADER_SIZE_MIN 8 +# define LZMA_BLOCK_HEADER_SIZE_MAX 1024 + + /** + * \brief Type of integrity Check + * + * The Check ID is not stored into the Block Header, thus its value + * must be provided also when decoding. + * + * Read by: + * - lzma_block_header_encode() + * - lzma_block_header_decode() + * - lzma_block_compressed_size() + * - lzma_block_unpadded_size() + * - lzma_block_total_size() + * - lzma_block_encoder() + * - lzma_block_decoder() + * - lzma_block_buffer_encode() + * - lzma_block_buffer_decode() + */ + lzma_check check; + + /** + * \brief Size of the Compressed Data in bytes + * + * Encoding: If this is not LZMA_VLI_UNKNOWN, Block Header encoder + * will store this value to the Block Header. Block encoder doesn't + * care about this value, but will set it once the encoding has been + * finished. + * + * Decoding: If this is not LZMA_VLI_UNKNOWN, Block decoder will + * verify that the size of the Compressed Data field matches + * compressed_size. + * + * Usually you don't know this value when encoding in streamed mode, + * and thus cannot write this field into the Block Header. + * + * In non-streamed mode you can reserve space for this field before + * encoding the actual Block. After encoding the data, finish the + * Block by encoding the Block Header. Steps in detail: + * + * - Set compressed_size to some big enough value. If you don't know + * better, use LZMA_VLI_MAX, but remember that bigger values take + * more space in Block Header. + * + * - Call lzma_block_header_size() to see how much space you need to + * reserve for the Block Header. + * + * - Encode the Block using lzma_block_encoder() and lzma_code(). + * It sets compressed_size to the correct value. + * + * - Use lzma_block_header_encode() to encode the Block Header. + * Because space was reserved in the first step, you don't need + * to call lzma_block_header_size() anymore, because due to + * reserving, header_size has to be big enough. If it is "too big", + * lzma_block_header_encode() will add enough Header Padding to + * make Block Header to match the size specified by header_size. + * + * Read by: + * - lzma_block_header_size() + * - lzma_block_header_encode() + * - lzma_block_compressed_size() + * - lzma_block_unpadded_size() + * - lzma_block_total_size() + * - lzma_block_decoder() + * - lzma_block_buffer_decode() + * + * Written by: + * - lzma_block_header_decode() + * - lzma_block_compressed_size() + * - lzma_block_encoder() + * - lzma_block_decoder() + * - lzma_block_buffer_encode() + * - lzma_block_buffer_decode() + */ + lzma_vli compressed_size; + + /** + * \brief Uncompressed Size in bytes + * + * This is handled very similarly to compressed_size above. + * + * uncompressed_size is needed by fewer functions than + * compressed_size. This is because uncompressed_size isn't + * needed to validate that Block stays within proper limits. + * + * Read by: + * - lzma_block_header_size() + * - lzma_block_header_encode() + * - lzma_block_decoder() + * - lzma_block_buffer_decode() + * + * Written by: + * - lzma_block_header_decode() + * - lzma_block_encoder() + * - lzma_block_decoder() + * - lzma_block_buffer_encode() + * - lzma_block_buffer_decode() + */ + lzma_vli uncompressed_size; + + /** + * \brief Array of filters + * + * There can be 1-4 filters. The end of the array is marked with + * .id = LZMA_VLI_UNKNOWN. + * + * Read by: + * - lzma_block_header_size() + * - lzma_block_header_encode() + * - lzma_block_encoder() + * - lzma_block_decoder() + * - lzma_block_buffer_encode() + * - lzma_block_buffer_decode() + * + * Written by: + * - lzma_block_header_decode(): Note that this does NOT free() + * the old filter options structures. All unused filters[] will + * have .id == LZMA_VLI_UNKNOWN and .options == NULL. If + * decoding fails, all filters[] are guaranteed to be + * LZMA_VLI_UNKNOWN and NULL. + * + * \note Because of the array is terminated with + * .id = LZMA_VLI_UNKNOWN, the actual array must + * have LZMA_FILTERS_MAX + 1 members or the Block + * Header decoder will overflow the buffer. + */ + lzma_filter *filters; + + /** + * \brief Raw value stored in the Check field + * + * After successful coding, the first lzma_check_size(check) bytes + * of this array contain the raw value stored in the Check field. + * + * Note that CRC32 and CRC64 are stored in little endian byte order. + * Take it into account if you display the Check values to the user. + * + * Written by: + * - lzma_block_encoder() + * - lzma_block_decoder() + * - lzma_block_buffer_encode() + * - lzma_block_buffer_decode() + */ + uint8_t raw_check[LZMA_CHECK_SIZE_MAX]; + + /* + * Reserved space to allow possible future extensions without + * breaking the ABI. You should not touch these, because the names + * of these variables may change. These are and will never be used + * with the currently supported options, so it is safe to leave these + * uninitialized. + */ + void *reserved_ptr1; + void *reserved_ptr2; + void *reserved_ptr3; + uint32_t reserved_int1; + uint32_t reserved_int2; + lzma_vli reserved_int3; + lzma_vli reserved_int4; + lzma_vli reserved_int5; + lzma_vli reserved_int6; + lzma_vli reserved_int7; + lzma_vli reserved_int8; + lzma_reserved_enum reserved_enum1; + lzma_reserved_enum reserved_enum2; + lzma_reserved_enum reserved_enum3; + lzma_reserved_enum reserved_enum4; + lzma_bool reserved_bool1; + lzma_bool reserved_bool2; + lzma_bool reserved_bool3; + lzma_bool reserved_bool4; + lzma_bool reserved_bool5; + lzma_bool reserved_bool6; + lzma_bool reserved_bool7; + lzma_bool reserved_bool8; + +} lzma_block; + + +/** + * \brief Decode the Block Header Size field + * + * To decode Block Header using lzma_block_header_decode(), the size of the + * Block Header has to be known and stored into lzma_block.header_size. + * The size can be calculated from the first byte of a Block using this macro. + * Note that if the first byte is 0x00, it indicates beginning of Index; use + * this macro only when the byte is not 0x00. + * + * There is no encoding macro, because Block Header encoder is enough for that. + */ +#define lzma_block_header_size_decode(b) (((uint32_t)(b) + 1) * 4) + + +/** + * \brief Calculate Block Header Size + * + * Calculate the minimum size needed for the Block Header field using the + * settings specified in the lzma_block structure. Note that it is OK to + * increase the calculated header_size value as long as it is a multiple of + * four and doesn't exceed LZMA_BLOCK_HEADER_SIZE_MAX. Increasing header_size + * just means that lzma_block_header_encode() will add Header Padding. + * + * \return - LZMA_OK: Size calculated successfully and stored to + * block->header_size. + * - LZMA_OPTIONS_ERROR: Unsupported version, filters or + * filter options. + * - LZMA_PROG_ERROR: Invalid values like compressed_size == 0. + * + * \note This doesn't check that all the options are valid i.e. this + * may return LZMA_OK even if lzma_block_header_encode() or + * lzma_block_encoder() would fail. If you want to validate the + * filter chain, consider using lzma_memlimit_encoder() which as + * a side-effect validates the filter chain. + */ +extern LZMA_API(lzma_ret) lzma_block_header_size(lzma_block *block) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Encode Block Header + * + * The caller must have calculated the size of the Block Header already with + * lzma_block_header_size(). If a value larger than the one calculated by + * lzma_block_header_size() is used, the Block Header will be padded to the + * specified size. + * + * \param out Beginning of the output buffer. This must be + * at least block->header_size bytes. + * \param block Block options to be encoded. + * + * \return - LZMA_OK: Encoding was successful. block->header_size + * bytes were written to output buffer. + * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. + * - LZMA_PROG_ERROR: Invalid arguments, for example + * block->header_size is invalid or block->filters is NULL. + */ +extern LZMA_API(lzma_ret) lzma_block_header_encode( + const lzma_block *block, uint8_t *out) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode Block Header + * + * block->version should be set to the highest value supported by the + * application; currently the only possible version is zero. This function + * will set version to the lowest value that still supports all the features + * required by the Block Header. + * + * The size of the Block Header must have already been decoded with + * lzma_block_header_size_decode() macro and stored to block->header_size. + * + * block->filters must have been allocated, but they don't need to be + * initialized (possible existing filter options are not freed). + * + * \param block Destination for Block options. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() (and also free() + * if an error occurs). + * \param in Beginning of the input buffer. This must be + * at least block->header_size bytes. + * + * \return - LZMA_OK: Decoding was successful. block->header_size + * bytes were read from the input buffer. + * - LZMA_OPTIONS_ERROR: The Block Header specifies some + * unsupported options such as unsupported filters. This can + * happen also if block->version was set to a too low value + * compared to what would be required to properly represent + * the information stored in the Block Header. + * - LZMA_DATA_ERROR: Block Header is corrupt, for example, + * the CRC32 doesn't match. + * - LZMA_PROG_ERROR: Invalid arguments, for example + * block->header_size is invalid or block->filters is NULL. + */ +extern LZMA_API(lzma_ret) lzma_block_header_decode(lzma_block *block, + lzma_allocator *allocator, const uint8_t *in) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Validate and set Compressed Size according to Unpadded Size + * + * Block Header stores Compressed Size, but Index has Unpadded Size. If the + * application has already parsed the Index and is now decoding Blocks, + * it can calculate Compressed Size from Unpadded Size. This function does + * exactly that with error checking: + * + * - Compressed Size calculated from Unpadded Size must be positive integer, + * that is, Unpadded Size must be big enough that after Block Header and + * Check fields there's still at least one byte for Compressed Size. + * + * - If Compressed Size was present in Block Header, the new value + * calculated from Unpadded Size is compared against the value + * from Block Header. + * + * \note This function must be called _after_ decoding the Block Header + * field so that it can properly validate Compressed Size if it + * was present in Block Header. + * + * \return - LZMA_OK: block->compressed_size was set successfully. + * - LZMA_DATA_ERROR: unpadded_size is too small compared to + * block->header_size and lzma_check_size(block->check). + * - LZMA_PROG_ERROR: Some values are invalid. For example, + * block->header_size must be a multiple of four and + * between 8 and 1024 inclusive. + */ +extern LZMA_API(lzma_ret) lzma_block_compressed_size( + lzma_block *block, lzma_vli unpadded_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Calculate Unpadded Size + * + * The Index field stores Unpadded Size and Uncompressed Size. The latter + * can be taken directly from the lzma_block structure after coding a Block, + * but Unpadded Size needs to be calculated from Block Header Size, + * Compressed Size, and size of the Check field. This is where this function + * is needed. + * + * \return Unpadded Size on success, or zero on error. + */ +extern LZMA_API(lzma_vli) lzma_block_unpadded_size(const lzma_block *block) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Calculate the total encoded size of a Block + * + * This is equivalent to lzma_block_unpadded_size() except that the returned + * value includes the size of the Block Padding field. + * + * \return On success, total encoded size of the Block. On error, + * zero is returned. + */ +extern LZMA_API(lzma_vli) lzma_block_total_size(const lzma_block *block) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Initialize .xz Block encoder + * + * Valid actions for lzma_code() are LZMA_RUN, LZMA_SYNC_FLUSH (only if the + * filter chain supports it), and LZMA_FINISH. + * + * \return - LZMA_OK: All good, continue with lzma_code(). + * - LZMA_MEM_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_UNSUPPORTED_CHECK: block->check specifies a Check ID + * that is not supported by this buid of liblzma. Initializing + * the encoder failed. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_block_encoder( + lzma_stream *strm, lzma_block *block) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize .xz Block decoder + * + * Valid actions for lzma_code() are LZMA_RUN and LZMA_FINISH. Using + * LZMA_FINISH is not required. It is supported only for convenience. + * + * \return - LZMA_OK: All good, continue with lzma_code(). + * - LZMA_UNSUPPORTED_CHECK: Initialization was successful, but + * the given Check ID is not supported, thus Check will be + * ignored. + * - LZMA_PROG_ERROR + * - LZMA_MEM_ERROR + */ +extern LZMA_API(lzma_ret) lzma_block_decoder( + lzma_stream *strm, lzma_block *block) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Calculate maximum output size for single-call Block encoding + * + * This is equivalent to lzma_stream_buffer_bound() but for .xz Blocks. + * See the documentation of lzma_stream_buffer_bound(). + */ +extern LZMA_API(size_t) lzma_block_buffer_bound(size_t uncompressed_size) + lzma_nothrow; + + +/** + * \brief Single-call .xz Block encoder + * + * In contrast to the multi-call encoder initialized with + * lzma_block_encoder(), this function encodes also the Block Header. This + * is required to make it possible to write appropriate Block Header also + * in case the data isn't compressible, and different filter chain has to be + * used to encode the data in uncompressed form using uncompressed chunks + * of the LZMA2 filter. + * + * When the data isn't compressible, header_size, compressed_size, and + * uncompressed_size are set just like when the data was compressible, but + * it is possible that header_size is too small to hold the filter chain + * specified in block->filters, because that isn't necessarily the filter + * chain that was actually used to encode the data. lzma_block_unpadded_size() + * still works normally, because it doesn't read the filters array. + * + * \param block Block options: block->version, block->check, + * and block->filters must have been initialized. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_size Size of the input buffer + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_BUF_ERROR: Not enough output buffer space. + * - LZMA_UNSUPPORTED_CHECK + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + * - LZMA_DATA_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_block_buffer_encode( + lzma_block *block, lzma_allocator *allocator, + const uint8_t *in, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Single-call .xz Block decoder + * + * This is single-call equivalent of lzma_block_decoder(), and requires that + * the caller has already decoded Block Header and checked its memory usage. + * + * \param block Block options just like with lzma_block_decoder(). + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_pos The next byte will be read from in[*in_pos]. + * *in_pos is updated only if decoding succeeds. + * \param in_size Size of the input buffer; the first byte that + * won't be read is in[in_size]. + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Decoding was successful. + * - LZMA_OPTIONS_ERROR + * - LZMA_DATA_ERROR + * - LZMA_MEM_ERROR + * - LZMA_BUF_ERROR: Output buffer was too small. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_block_buffer_decode( + lzma_block *block, lzma_allocator *allocator, + const uint8_t *in, size_t *in_pos, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) + lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/check.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/check.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,150 @@ +/** + * \file lzma/check.h + * \brief Integrity checks + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Type of the integrity check (Check ID) + * + * The .xz format supports multiple types of checks that are calculated + * from the uncompressed data. They vary in both speed and ability to + * detect errors. + */ +typedef enum { + LZMA_CHECK_NONE = 0, + /**< + * No Check is calculated. + * + * Size of the Check field: 0 bytes + */ + + LZMA_CHECK_CRC32 = 1, + /**< + * CRC32 using the polynomial from the IEEE 802.3 standard + * + * Size of the Check field: 4 bytes + */ + + LZMA_CHECK_CRC64 = 4, + /**< + * CRC64 using the polynomial from the ECMA-182 standard + * + * Size of the Check field: 8 bytes + */ + + LZMA_CHECK_SHA256 = 10 + /**< + * SHA-256 + * + * Size of the Check field: 32 bytes + */ +} lzma_check; + + +/** + * \brief Maximum valid Check ID + * + * The .xz file format specification specifies 16 Check IDs (0-15). Some + * of them are only reserved, that is, no actual Check algorithm has been + * assigned. When decoding, liblzma still accepts unknown Check IDs for + * future compatibility. If a valid but unsupported Check ID is detected, + * liblzma can indicate a warning; see the flags LZMA_TELL_NO_CHECK, + * LZMA_TELL_UNSUPPORTED_CHECK, and LZMA_TELL_ANY_CHECK in container.h. + */ +#define LZMA_CHECK_ID_MAX 15 + + +/** + * \brief Test if the given Check ID is supported + * + * Return true if the given Check ID is supported by this liblzma build. + * Otherwise false is returned. It is safe to call this with a value that + * is not in the range [0, 15]; in that case the return value is always false. + * + * You can assume that LZMA_CHECK_NONE and LZMA_CHECK_CRC32 are always + * supported (even if liblzma is built with limited features). + */ +extern LZMA_API(lzma_bool) lzma_check_is_supported(lzma_check check) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Get the size of the Check field with the given Check ID + * + * Although not all Check IDs have a check algorithm associated, the size of + * every Check is already frozen. This function returns the size (in bytes) of + * the Check field with the specified Check ID. The values are: + * { 0, 4, 4, 4, 8, 8, 8, 16, 16, 16, 32, 32, 32, 64, 64, 64 } + * + * If the argument is not in the range [0, 15], UINT32_MAX is returned. + */ +extern LZMA_API(uint32_t) lzma_check_size(lzma_check check) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Maximum size of a Check field + */ +#define LZMA_CHECK_SIZE_MAX 64 + + +/** + * \brief Calculate CRC32 + * + * Calculate CRC32 using the polynomial from the IEEE 802.3 standard. + * + * \param buf Pointer to the input buffer + * \param size Size of the input buffer + * \param crc Previously returned CRC value. This is used to + * calculate the CRC of a big buffer in smaller chunks. + * Set to zero when starting a new calculation. + * + * \return Updated CRC value, which can be passed to this function + * again to continue CRC calculation. + */ +extern LZMA_API(uint32_t) lzma_crc32( + const uint8_t *buf, size_t size, uint32_t crc) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Calculate CRC64 + * + * Calculate CRC64 using the polynomial from the ECMA-182 standard. + * + * This function is used similarly to lzma_crc32(). See its documentation. + */ +extern LZMA_API(uint64_t) lzma_crc64( + const uint8_t *buf, size_t size, uint64_t crc) + lzma_nothrow lzma_attr_pure; + + +/* + * SHA-256 functions are currently not exported to public API. + * Contact Lasse Collin if you think it should be. + */ + + +/** + * \brief Get the type of the integrity check + * + * This function can be called only immediately after lzma_code() has + * returned LZMA_NO_CHECK, LZMA_UNSUPPORTED_CHECK, or LZMA_GET_CHECK. + * Calling this function in any other situation has undefined behavior. + */ +extern LZMA_API(lzma_check) lzma_get_check(const lzma_stream *strm) + lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/container.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/container.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,424 @@ +/** + * \file lzma/container.h + * \brief File formats + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/************ + * Encoding * + ************/ + +/** + * \brief Default compression preset + * + * It's not straightforward to recommend a default preset, because in some + * cases keeping the resource usage relatively low is more important that + * getting the maximum compression ratio. + */ +#define LZMA_PRESET_DEFAULT UINT32_C(6) + + +/** + * \brief Mask for preset level + * + * This is useful only if you need to extract the level from the preset + * variable. That should be rare. + */ +#define LZMA_PRESET_LEVEL_MASK UINT32_C(0x1F) + + +/* + * Preset flags + * + * Currently only one flag is defined. + */ + +/** + * \brief Extreme compression preset + * + * This flag modifies the preset to make the encoding significantly slower + * while improving the compression ratio only marginally. This is useful + * when you don't mind wasting time to get as small result as possible. + * + * This flag doesn't affect the memory usage requirements of the decoder (at + * least not significantly). The memory usage of the encoder may be increased + * a little but only at the lowest preset levels (0-3). + */ +#define LZMA_PRESET_EXTREME (UINT32_C(1) << 31) + + +/** + * \brief Calculate approximate memory usage of easy encoder + * + * This function is a wrapper for lzma_raw_encoder_memusage(). + * + * \param preset Compression preset (level and possible flags) + * + * \return Number of bytes of memory required for the given + * preset when encoding. If an error occurs, for example + * due to unsupported preset, UINT64_MAX is returned. + */ +extern LZMA_API(uint64_t) lzma_easy_encoder_memusage(uint32_t preset) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Calculate approximate decoder memory usage of a preset + * + * This function is a wrapper for lzma_raw_decoder_memusage(). + * + * \param preset Compression preset (level and possible flags) + * + * \return Number of bytes of memory required to decompress a file + * that was compressed using the given preset. If an error + * occurs, for example due to unsupported preset, UINT64_MAX + * is returned. + */ +extern LZMA_API(uint64_t) lzma_easy_decoder_memusage(uint32_t preset) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Initialize .xz Stream encoder using a preset number + * + * This function is intended for those who just want to use the basic features + * if liblzma (that is, most developers out there). + * + * \param strm Pointer to lzma_stream that is at least initialized + * with LZMA_STREAM_INIT. + * \param preset Compression preset to use. A preset consist of level + * number and zero or more flags. Usually flags aren't + * used, so preset is simply a number [0, 9] which match + * the options -0 ... -9 of the xz command line tool. + * Additional flags can be be set using bitwise-or with + * the preset level number, e.g. 6 | LZMA_PRESET_EXTREME. + * \param check Integrity check type to use. See check.h for available + * checks. The xz command line tool defaults to + * LZMA_CHECK_CRC64, which is a good choice if you are + * unsure. LZMA_CHECK_CRC32 is good too as long as the + * uncompressed file is not many gigabytes. + * + * \return - LZMA_OK: Initialization succeeded. Use lzma_code() to + * encode your data. + * - LZMA_MEM_ERROR: Memory allocation failed. + * - LZMA_OPTIONS_ERROR: The given compression preset is not + * supported by this build of liblzma. + * - LZMA_UNSUPPORTED_CHECK: The given check type is not + * supported by this liblzma build. + * - LZMA_PROG_ERROR: One or more of the parameters have values + * that will never be valid. For example, strm == NULL. + * + * If initialization fails (return value is not LZMA_OK), all the memory + * allocated for *strm by liblzma is always freed. Thus, there is no need + * to call lzma_end() after failed initialization. + * + * If initialization succeeds, use lzma_code() to do the actual encoding. + * Valid values for `action' (the second argument of lzma_code()) are + * LZMA_RUN, LZMA_SYNC_FLUSH, LZMA_FULL_FLUSH, and LZMA_FINISH. In future, + * there may be compression levels or flags that don't support LZMA_SYNC_FLUSH. + */ +extern LZMA_API(lzma_ret) lzma_easy_encoder( + lzma_stream *strm, uint32_t preset, lzma_check check) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Single-call .xz Stream encoding using a preset number + * + * The maximum required output buffer size can be calculated with + * lzma_stream_buffer_bound(). + * + * \param preset Compression preset to use. See the description + * in lzma_easy_encoder(). + * \param check Type of the integrity check to calculate from + * uncompressed data. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_size Size of the input buffer + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_BUF_ERROR: Not enough output buffer space. + * - LZMA_UNSUPPORTED_CHECK + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + * - LZMA_DATA_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_easy_buffer_encode( + uint32_t preset, lzma_check check, + lzma_allocator *allocator, const uint8_t *in, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; + + +/** + * \brief Initialize .xz Stream encoder using a custom filter chain + * + * \param strm Pointer to properly prepared lzma_stream + * \param filters Array of filters. This must be terminated with + * filters[n].id = LZMA_VLI_UNKNOWN. See filter.h for + * more information. + * \param check Type of the integrity check to calculate from + * uncompressed data. + * + * \return - LZMA_OK: Initialization was successful. + * - LZMA_MEM_ERROR + * - LZMA_UNSUPPORTED_CHECK + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_stream_encoder(lzma_stream *strm, + const lzma_filter *filters, lzma_check check) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize .lzma encoder (legacy file format) + * + * The .lzma format is sometimes called the LZMA_Alone format, which is the + * reason for the name of this function. The .lzma format supports only the + * LZMA1 filter. There is no support for integrity checks like CRC32. + * + * Use this function if and only if you need to create files readable by + * legacy LZMA tools such as LZMA Utils 4.32.x. Moving to the .xz format + * is strongly recommended. + * + * The valid action values for lzma_code() are LZMA_RUN and LZMA_FINISH. + * No kind of flushing is supported, because the file format doesn't make + * it possible. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_alone_encoder( + lzma_stream *strm, const lzma_options_lzma *options) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Calculate output buffer size for single-call Stream encoder + * + * When trying to compress uncompressible data, the encoded size will be + * slightly bigger than the input data. This function calculates how much + * output buffer space is required to be sure that lzma_stream_buffer_encode() + * doesn't return LZMA_BUF_ERROR. + * + * The calculated value is not exact, but it is guaranteed to be big enough. + * The actual maximum output space required may be slightly smaller (up to + * about 100 bytes). This should not be a problem in practice. + * + * If the calculated maximum size doesn't fit into size_t or would make the + * Stream grow past LZMA_VLI_MAX (which should never happen in practice), + * zero is returned to indicate the error. + * + * \note The limit calculated by this function applies only to + * single-call encoding. Multi-call encoding may (and probably + * will) have larger maximum expansion when encoding + * uncompressible data. Currently there is no function to + * calculate the maximum expansion of multi-call encoding. + */ +extern LZMA_API(size_t) lzma_stream_buffer_bound(size_t uncompressed_size) + lzma_nothrow; + + +/** + * \brief Single-call .xz Stream encoder + * + * \param filters Array of filters. This must be terminated with + * filters[n].id = LZMA_VLI_UNKNOWN. See filter.h + * for more information. + * \param check Type of the integrity check to calculate from + * uncompressed data. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_size Size of the input buffer + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_BUF_ERROR: Not enough output buffer space. + * - LZMA_UNSUPPORTED_CHECK + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + * - LZMA_DATA_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_stream_buffer_encode( + lzma_filter *filters, lzma_check check, + lzma_allocator *allocator, const uint8_t *in, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/************ + * Decoding * + ************/ + +/** + * This flag makes lzma_code() return LZMA_NO_CHECK if the input stream + * being decoded has no integrity check. Note that when used with + * lzma_auto_decoder(), all .lzma files will trigger LZMA_NO_CHECK + * if LZMA_TELL_NO_CHECK is used. + */ +#define LZMA_TELL_NO_CHECK UINT32_C(0x01) + + +/** + * This flag makes lzma_code() return LZMA_UNSUPPORTED_CHECK if the input + * stream has an integrity check, but the type of the integrity check is not + * supported by this liblzma version or build. Such files can still be + * decoded, but the integrity check cannot be verified. + */ +#define LZMA_TELL_UNSUPPORTED_CHECK UINT32_C(0x02) + + +/** + * This flag makes lzma_code() return LZMA_GET_CHECK as soon as the type + * of the integrity check is known. The type can then be got with + * lzma_get_check(). + */ +#define LZMA_TELL_ANY_CHECK UINT32_C(0x04) + + +/** + * This flag enables decoding of concatenated files with file formats that + * allow concatenating compressed files as is. From the formats currently + * supported by liblzma, only the .xz format allows concatenated files. + * Concatenated files are not allowed with the legacy .lzma format. + * + * This flag also affects the usage of the `action' argument for lzma_code(). + * When LZMA_CONCATENATED is used, lzma_code() won't return LZMA_STREAM_END + * unless LZMA_FINISH is used as `action'. Thus, the application has to set + * LZMA_FINISH in the same way as it does when encoding. + * + * If LZMA_CONCATENATED is not used, the decoders still accept LZMA_FINISH + * as `action' for lzma_code(), but the usage of LZMA_FINISH isn't required. + */ +#define LZMA_CONCATENATED UINT32_C(0x08) + + +/** + * \brief Initialize .xz Stream decoder + * + * \param strm Pointer to properly prepared lzma_stream + * \param memlimit Memory usage limit as bytes. Use UINT64_MAX + * to effectively disable the limiter. + * \param flags Bitwise-or of zero or more of the decoder flags: + * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, + * LZMA_TELL_ANY_CHECK, LZMA_CONCATENATED + * + * \return - LZMA_OK: Initialization was successful. + * - LZMA_MEM_ERROR: Cannot allocate memory. + * - LZMA_OPTIONS_ERROR: Unsupported flags + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_stream_decoder( + lzma_stream *strm, uint64_t memlimit, uint32_t flags) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode .xz Streams and .lzma files with autodetection + * + * This decoder autodetects between the .xz and .lzma file formats, and + * calls lzma_stream_decoder() or lzma_alone_decoder() once the type + * of the input file has been detected. + * + * \param strm Pointer to properly prepared lzma_stream + * \param memlimit Memory usage limit as bytes. Use UINT64_MAX + * to effectively disable the limiter. + * \param flags Bitwise-or of flags, or zero for no flags. + * + * \return - LZMA_OK: Initialization was successful. + * - LZMA_MEM_ERROR: Cannot allocate memory. + * - LZMA_OPTIONS_ERROR: Unsupported flags + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_auto_decoder( + lzma_stream *strm, uint64_t memlimit, uint32_t flags) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize .lzma decoder (legacy file format) + * + * Valid `action' arguments to lzma_code() are LZMA_RUN and LZMA_FINISH. + * There is no need to use LZMA_FINISH, but allowing it may simplify + * certain types of applications. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_alone_decoder( + lzma_stream *strm, uint64_t memlimit) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Single-call .xz Stream decoder + * + * \param memlimit Pointer to how much memory the decoder is allowed + * to allocate. The value pointed by this pointer is + * modified if and only if LZMA_MEMLIMIT_ERROR is + * returned. + * \param flags Bitwise-or of zero or more of the decoder flags: + * LZMA_TELL_NO_CHECK, LZMA_TELL_UNSUPPORTED_CHECK, + * LZMA_CONCATENATED. Note that LZMA_TELL_ANY_CHECK + * is not allowed and will return LZMA_PROG_ERROR. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_pos The next byte will be read from in[*in_pos]. + * *in_pos is updated only if decoding succeeds. + * \param in_size Size of the input buffer; the first byte that + * won't be read is in[in_size]. + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if decoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Decoding was successful. + * - LZMA_FORMAT_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_DATA_ERROR + * - LZMA_NO_CHECK: This can be returned only if using + * the LZMA_TELL_NO_CHECK flag. + * - LZMA_UNSUPPORTED_CHECK: This can be returned only if using + * the LZMA_TELL_UNSUPPORTED_CHECK flag. + * - LZMA_MEM_ERROR + * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. + * The minimum required memlimit value was stored to *memlimit. + * - LZMA_BUF_ERROR: Output buffer was too small. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_stream_buffer_decode( + uint64_t *memlimit, uint32_t flags, lzma_allocator *allocator, + const uint8_t *in, size_t *in_pos, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) + lzma_nothrow lzma_attr_warn_unused_result; Added: projects/external/xz-5.0.3/include/lzma/delta.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/delta.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,77 @@ +/** + * \file lzma/delta.h + * \brief Delta filter + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Filter ID + * + * Filter ID of the Delta filter. This is used as lzma_filter.id. + */ +#define LZMA_FILTER_DELTA LZMA_VLI_C(0x03) + + +/** + * \brief Type of the delta calculation + * + * Currently only byte-wise delta is supported. Other possible types could + * be, for example, delta of 16/32/64-bit little/big endian integers, but + * these are not currently planned since byte-wise delta is almost as good. + */ +typedef enum { + LZMA_DELTA_TYPE_BYTE +} lzma_delta_type; + + +/** + * \brief Options for the Delta filter + * + * These options are needed by both encoder and decoder. + */ +typedef struct { + /** For now, this must always be LZMA_DELTA_TYPE_BYTE. */ + lzma_delta_type type; + + /** + * \brief Delta distance + * + * With the only currently supported type, LZMA_DELTA_TYPE_BYTE, + * the distance is as bytes. + * + * Examples: + * - 16-bit stereo audio: distance = 4 bytes + * - 24-bit RGB image data: distance = 3 bytes + */ + uint32_t dist; +# define LZMA_DELTA_DIST_MIN 1 +# define LZMA_DELTA_DIST_MAX 256 + + /* + * Reserved space to allow possible future extensions without + * breaking the ABI. You should not touch these, because the names + * of these variables may change. These are and will never be used + * when type is LZMA_DELTA_TYPE_BYTE, so it is safe to leave these + * uninitialized. + */ + uint32_t reserved_int1; + uint32_t reserved_int2; + uint32_t reserved_int3; + uint32_t reserved_int4; + void *reserved_ptr1; + void *reserved_ptr2; + +} lzma_options_delta; Added: projects/external/xz-5.0.3/include/lzma/filter.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/filter.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,424 @@ +/** + * \file lzma/filter.h + * \brief Common filter related types and functions + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Maximum number of filters in a chain + * + * A filter chain can have 1-4 filters, of which three are allowed to change + * the size of the data. Usually only one or two filters are needed. + */ +#define LZMA_FILTERS_MAX 4 + + +/** + * \brief Filter options + * + * This structure is used to pass Filter ID and a pointer filter's + * options to liblzma. A few functions work with a single lzma_filter + * structure, while most functions expect a filter chain. + * + * A filter chain is indicated with an array of lzma_filter structures. + * The array is terminated with .id = LZMA_VLI_UNKNOWN. Thus, the filter + * array must have LZMA_FILTERS_MAX + 1 elements (that is, five) to + * be able to hold any arbitrary filter chain. This is important when + * using lzma_block_header_decode() from block.h, because too small + * array would make liblzma write past the end of the filters array. + */ +typedef struct { + /** + * \brief Filter ID + * + * Use constants whose name begin with `LZMA_FILTER_' to specify + * different filters. In an array of lzma_filter structures, use + * LZMA_VLI_UNKNOWN to indicate end of filters. + * + * \note This is not an enum, because on some systems enums + * cannot be 64-bit. + */ + lzma_vli id; + + /** + * \brief Pointer to filter-specific options structure + * + * If the filter doesn't need options, set this to NULL. If id is + * set to LZMA_VLI_UNKNOWN, options is ignored, and thus + * doesn't need be initialized. + */ + void *options; + +} lzma_filter; + + +/** + * \brief Test if the given Filter ID is supported for encoding + * + * Return true if the give Filter ID is supported for encoding by this + * liblzma build. Otherwise false is returned. + * + * There is no way to list which filters are available in this particular + * liblzma version and build. It would be useless, because the application + * couldn't know what kind of options the filter would need. + */ +extern LZMA_API(lzma_bool) lzma_filter_encoder_is_supported(lzma_vli id) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Test if the given Filter ID is supported for decoding + * + * Return true if the give Filter ID is supported for decoding by this + * liblzma build. Otherwise false is returned. + */ +extern LZMA_API(lzma_bool) lzma_filter_decoder_is_supported(lzma_vli id) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Copy the filters array + * + * Copy the Filter IDs and filter-specific options from src to dest. + * Up to LZMA_FILTERS_MAX filters are copied, plus the terminating + * .id == LZMA_VLI_UNKNOWN. Thus, dest should have at least + * LZMA_FILTERS_MAX + 1 elements space unless the caller knows that + * src is smaller than that. + * + * Unless the filter-specific options is NULL, the Filter ID has to be + * supported by liblzma, because liblzma needs to know the size of every + * filter-specific options structure. The filter-specific options are not + * validated. If options is NULL, any unsupported Filter IDs are copied + * without returning an error. + * + * Old filter-specific options in dest are not freed, so dest doesn't + * need to be initialized by the caller in any way. + * + * If an error occurs, memory possibly already allocated by this function + * is always freed. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_OPTIONS_ERROR: Unsupported Filter ID and its options + * is not NULL. + * - LZMA_PROG_ERROR: src or dest is NULL. + */ +extern LZMA_API(lzma_ret) lzma_filters_copy(const lzma_filter *src, + lzma_filter *dest, lzma_allocator *allocator) lzma_nothrow; + + +/** + * \brief Calculate approximate memory requirements for raw encoder + * + * This function can be used to calculate the memory requirements for + * Block and Stream encoders too because Block and Stream encoders don't + * need significantly more memory than raw encoder. + * + * \param filters Array of filters terminated with + * .id == LZMA_VLI_UNKNOWN. + * + * \return Number of bytes of memory required for the given + * filter chain when encoding. If an error occurs, + * for example due to unsupported filter chain, + * UINT64_MAX is returned. + */ +extern LZMA_API(uint64_t) lzma_raw_encoder_memusage(const lzma_filter *filters) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Calculate approximate memory requirements for raw decoder + * + * This function can be used to calculate the memory requirements for + * Block and Stream decoders too because Block and Stream decoders don't + * need significantly more memory than raw decoder. + * + * \param filters Array of filters terminated with + * .id == LZMA_VLI_UNKNOWN. + * + * \return Number of bytes of memory required for the given + * filter chain when decoding. If an error occurs, + * for example due to unsupported filter chain, + * UINT64_MAX is returned. + */ +extern LZMA_API(uint64_t) lzma_raw_decoder_memusage(const lzma_filter *filters) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Initialize raw encoder + * + * This function may be useful when implementing custom file formats. + * + * \param strm Pointer to properly prepared lzma_stream + * \param filters Array of lzma_filter structures. The end of the + * array must be marked with .id = LZMA_VLI_UNKNOWN. + * + * The `action' with lzma_code() can be LZMA_RUN, LZMA_SYNC_FLUSH (if the + * filter chain supports it), or LZMA_FINISH. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_raw_encoder( + lzma_stream *strm, const lzma_filter *filters) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize raw decoder + * + * The initialization of raw decoder goes similarly to raw encoder. + * + * The `action' with lzma_code() can be LZMA_RUN or LZMA_FINISH. Using + * LZMA_FINISH is not required, it is supported just for convenience. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_raw_decoder( + lzma_stream *strm, const lzma_filter *filters) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Update the filter chain in the encoder + * + * This function is for advanced users only. This function has two slightly + * different purposes: + * + * - After LZMA_FULL_FLUSH when using Stream encoder: Set a new filter + * chain, which will be used starting from the next Block. + * + * - After LZMA_SYNC_FLUSH using Raw, Block, or Stream encoder: Change + * the filter-specific options in the middle of encoding. The actual + * filters in the chain (Filter IDs) cannot be changed. In the future, + * it might become possible to change the filter options without + * using LZMA_SYNC_FLUSH. + * + * While rarely useful, this function may be called also when no data has + * been compressed yet. In that case, this function will behave as if + * LZMA_FULL_FLUSH (Stream encoder) or LZMA_SYNC_FLUSH (Raw or Block + * encoder) had been used right before calling this function. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_MEMLIMIT_ERROR + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_filters_update( + lzma_stream *strm, const lzma_filter *filters) lzma_nothrow; + + +/** + * \brief Single-call raw encoder + * + * \param filters Array of lzma_filter structures. The end of the + * array must be marked with .id = LZMA_VLI_UNKNOWN. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_size Size of the input buffer + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_BUF_ERROR: Not enough output buffer space. + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + * - LZMA_DATA_ERROR + * - LZMA_PROG_ERROR + * + * \note There is no function to calculate how big output buffer + * would surely be big enough. (lzma_stream_buffer_bound() + * works only for lzma_stream_buffer_encode(); raw encoder + * won't necessarily meet that bound.) + */ +extern LZMA_API(lzma_ret) lzma_raw_buffer_encode( + const lzma_filter *filters, lzma_allocator *allocator, + const uint8_t *in, size_t in_size, uint8_t *out, + size_t *out_pos, size_t out_size) lzma_nothrow; + + +/** + * \brief Single-call raw decoder + * + * \param filters Array of lzma_filter structures. The end of the + * array must be marked with .id = LZMA_VLI_UNKNOWN. + * \param allocator lzma_allocator for custom allocator functions. + * Set to NULL to use malloc() and free(). + * \param in Beginning of the input buffer + * \param in_pos The next byte will be read from in[*in_pos]. + * *in_pos is updated only if decoding succeeds. + * \param in_size Size of the input buffer; the first byte that + * won't be read is in[in_size]. + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + */ +extern LZMA_API(lzma_ret) lzma_raw_buffer_decode( + const lzma_filter *filters, lzma_allocator *allocator, + const uint8_t *in, size_t *in_pos, size_t in_size, + uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; + + +/** + * \brief Get the size of the Filter Properties field + * + * This function may be useful when implementing custom file formats + * using the raw encoder and decoder. + * + * \param size Pointer to uint32_t to hold the size of the properties + * \param filter Filter ID and options (the size of the properties may + * vary depending on the options) + * + * \return - LZMA_OK + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + * + * \note This function validates the Filter ID, but does not + * necessarily validate the options. Thus, it is possible + * that this returns LZMA_OK while the following call to + * lzma_properties_encode() returns LZMA_OPTIONS_ERROR. + */ +extern LZMA_API(lzma_ret) lzma_properties_size( + uint32_t *size, const lzma_filter *filter) lzma_nothrow; + + +/** + * \brief Encode the Filter Properties field + * + * \param filter Filter ID and options + * \param props Buffer to hold the encoded options. The size of + * buffer must have been already determined with + * lzma_properties_size(). + * + * \return - LZMA_OK + * - LZMA_OPTIONS_ERROR + * - LZMA_PROG_ERROR + * + * \note Even this function won't validate more options than actually + * necessary. Thus, it is possible that encoding the properties + * succeeds but using the same options to initialize the encoder + * will fail. + * + * \note If lzma_properties_size() indicated that the size + * of the Filter Properties field is zero, calling + * lzma_properties_encode() is not required, but it + * won't do any harm either. + */ +extern LZMA_API(lzma_ret) lzma_properties_encode( + const lzma_filter *filter, uint8_t *props) lzma_nothrow; + + +/** + * \brief Decode the Filter Properties field + * + * \param filter filter->id must have been set to the correct + * Filter ID. filter->options doesn't need to be + * initialized (it's not freed by this function). The + * decoded options will be stored to filter->options. + * filter->options is set to NULL if there are no + * properties or if an error occurs. + * \param allocator Custom memory allocator used to allocate the + * options. Set to NULL to use the default malloc(), + * and in case of an error, also free(). + * \param props Input buffer containing the properties. + * \param props_size Size of the properties. This must be the exact + * size; giving too much or too little input will + * return LZMA_OPTIONS_ERROR. + * + * \return - LZMA_OK + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + */ +extern LZMA_API(lzma_ret) lzma_properties_decode( + lzma_filter *filter, lzma_allocator *allocator, + const uint8_t *props, size_t props_size) lzma_nothrow; + + +/** + * \brief Calculate encoded size of a Filter Flags field + * + * Knowing the size of Filter Flags is useful to know when allocating + * memory to hold the encoded Filter Flags. + * + * \param size Pointer to integer to hold the calculated size + * \param filter Filter ID and associated options whose encoded + * size is to be calculated + * + * \return - LZMA_OK: *size set successfully. Note that this doesn't + * guarantee that filter->options is valid, thus + * lzma_filter_flags_encode() may still fail. + * - LZMA_OPTIONS_ERROR: Unknown Filter ID or unsupported options. + * - LZMA_PROG_ERROR: Invalid options + * + * \note If you need to calculate size of List of Filter Flags, + * you need to loop over every lzma_filter entry. + */ +extern LZMA_API(lzma_ret) lzma_filter_flags_size( + uint32_t *size, const lzma_filter *filter) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Encode Filter Flags into given buffer + * + * In contrast to some functions, this doesn't allocate the needed buffer. + * This is due to how this function is used internally by liblzma. + * + * \param filter Filter ID and options to be encoded + * \param out Beginning of the output buffer + * \param out_pos out[*out_pos] is the next write position. This + * is updated by the encoder. + * \param out_size out[out_size] is the first byte to not write. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_OPTIONS_ERROR: Invalid or unsupported options. + * - LZMA_PROG_ERROR: Invalid options or not enough output + * buffer space (you should have checked it with + * lzma_filter_flags_size()). + */ +extern LZMA_API(lzma_ret) lzma_filter_flags_encode(const lzma_filter *filter, + uint8_t *out, size_t *out_pos, size_t out_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode Filter Flags from given buffer + * + * The decoded result is stored into *filter. The old value of + * filter->options is not free()d. + * + * \return - LZMA_OK + * - LZMA_OPTIONS_ERROR + * - LZMA_MEM_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_filter_flags_decode( + lzma_filter *filter, lzma_allocator *allocator, + const uint8_t *in, size_t *in_pos, size_t in_size) + lzma_nothrow lzma_attr_warn_unused_result; Added: projects/external/xz-5.0.3/include/lzma/hardware.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/hardware.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,50 @@ +/** + * \file lzma/hardware.h + * \brief Hardware information + * + * Since liblzma can consume a lot of system resources, it also provides + * ways to limit the resource usage. Applications linking against liblzma + * need to do the actual decisions how much resources to let liblzma to use. + * To ease making these decisions, liblzma provides functions to find out + * the relevant capabilities of the underlaying hardware. Currently there + * is only a function to find out the amount of RAM, but in the future there + * will be also a function to detect how many concurrent threads the system + * can run. + * + * \note On some operating systems, these function may temporarily + * load a shared library or open file descriptor(s) to find out + * the requested hardware information. Unless the application + * assumes that specific file descriptors are not touched by + * other threads, this should have no effect on thread safety. + * Possible operations involving file descriptors will restart + * the syscalls if they return EINTR. + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Get the total amount of physical memory (RAM) in bytes + * + * This function may be useful when determining a reasonable memory + * usage limit for decompressing or how much memory it is OK to use + * for compressing. + * + * \return On success, the total amount of physical memory in bytes + * is returned. If the amount of RAM cannot be determined, + * zero is returned. This can happen if an error occurs + * or if there is no code in liblzma to detect the amount + * of RAM on the specific operating system. + */ +extern LZMA_API(uint64_t) lzma_physmem(void) lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/index.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/index.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,682 @@ +/** + * \file lzma/index.h + * \brief Handling of .xz Index and related information + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Opaque data type to hold the Index(es) and other information + * + * lzma_index often holds just one .xz Index and possibly the Stream Flags + * of the same Stream and size of the Stream Padding field. However, + * multiple lzma_indexes can be concatenated with lzma_index_cat() and then + * there may be information about multiple Streams in the same lzma_index. + * + * Notes about thread safety: Only one thread may modify lzma_index at + * a time. All functions that take non-const pointer to lzma_index + * modify it. As long as no thread is modifying the lzma_index, getting + * information from the same lzma_index can be done from multiple threads + * at the same time with functions that take a const pointer to + * lzma_index or use lzma_index_iter. The same iterator must be used + * only by one thread at a time, of course, but there can be as many + * iterators for the same lzma_index as needed. + */ +typedef struct lzma_index_s lzma_index; + + +/** + * \brief Iterator to get information about Blocks and Streams + */ +typedef struct { + struct { + /** + * \brief Pointer to Stream Flags + * + * This is NULL if Stream Flags have not been set for + * this Stream with lzma_index_stream_flags(). + */ + const lzma_stream_flags *flags; + + const void *reserved_ptr1; + const void *reserved_ptr2; + const void *reserved_ptr3; + + /** + * \brief Stream number in the lzma_index + * + * The first Stream is 1. + */ + lzma_vli number; + + /** + * \brief Number of Blocks in the Stream + * + * If this is zero, the block structure below has + * undefined values. + */ + lzma_vli block_count; + + /** + * \brief Compressed start offset of this Stream + * + * The offset is relative to the beginning of the lzma_index + * (i.e. usually the beginning of the .xz file). + */ + lzma_vli compressed_offset; + + /** + * \brief Uncompressed start offset of this Stream + * + * The offset is relative to the beginning of the lzma_index + * (i.e. usually the beginning of the .xz file). + */ + lzma_vli uncompressed_offset; + + /** + * \brief Compressed size of this Stream + * + * This includes all headers except the possible + * Stream Padding after this Stream. + */ + lzma_vli compressed_size; + + /** + * \brief Uncompressed size of this Stream + */ + lzma_vli uncompressed_size; + + /** + * \brief Size of Stream Padding after this Stream + * + * If it hasn't been set with lzma_index_stream_padding(), + * this defaults to zero. Stream Padding is always + * a multiple of four bytes. + */ + lzma_vli padding; + + lzma_vli reserved_vli1; + lzma_vli reserved_vli2; + lzma_vli reserved_vli3; + lzma_vli reserved_vli4; + } stream; + + struct { + /** + * \brief Block number in the file + * + * The first Block is 1. + */ + lzma_vli number_in_file; + + /** + * \brief Compressed start offset of this Block + * + * This offset is relative to the beginning of the + * lzma_index (i.e. usually the beginning of the .xz file). + * Normally this is where you should seek in the .xz file + * to start decompressing this Block. + */ + lzma_vli compressed_file_offset; + + /** + * \brief Uncompressed start offset of this Block + * + * This offset is relative to the beginning of the lzma_index + * (i.e. usually the beginning of the .xz file). + * + * When doing random-access reading, it is possible that + * the target offset is not exactly at Block boundary. One + * will need to compare the target offset against + * uncompressed_file_offset or uncompressed_stream_offset, + * and possibly decode and throw away some amount of data + * before reaching the target offset. + */ + lzma_vli uncompressed_file_offset; + + /** + * \brief Block number in this Stream + * + * The first Block is 1. + */ + lzma_vli number_in_stream; + + /** + * \brief Compressed start offset of this Block + * + * This offset is relative to the beginning of the Stream + * containing this Block. + */ + lzma_vli compressed_stream_offset; + + /** + * \brief Uncompressed start offset of this Block + * + * This offset is relative to the beginning of the Stream + * containing this Block. + */ + lzma_vli uncompressed_stream_offset; + + /** + * \brief Uncompressed size of this Block + * + * You should pass this to the Block decoder if you will + * decode this Block. It will allow the Block decoder to + * validate the uncompressed size. + */ + lzma_vli uncompressed_size; + + /** + * \brief Unpadded size of this Block + * + * You should pass this to the Block decoder if you will + * decode this Block. It will allow the Block decoder to + * validate the unpadded size. + */ + lzma_vli unpadded_size; + + /** + * \brief Total compressed size + * + * This includes all headers and padding in this Block. + * This is useful if you need to know how many bytes + * the Block decoder will actually read. + */ + lzma_vli total_size; + + lzma_vli reserved_vli1; + lzma_vli reserved_vli2; + lzma_vli reserved_vli3; + lzma_vli reserved_vli4; + + const void *reserved_ptr1; + const void *reserved_ptr2; + const void *reserved_ptr3; + const void *reserved_ptr4; + } block; + + /* + * Internal data which is used to store the state of the iterator. + * The exact format may vary between liblzma versions, so don't + * touch these in any way. + */ + union { + const void *p; + size_t s; + lzma_vli v; + } internal[6]; +} lzma_index_iter; + + +/** + * \brief Operation mode for lzma_index_iter_next() + */ +typedef enum { + LZMA_INDEX_ITER_ANY = 0, + /**< + * \brief Get the next Block or Stream + * + * Go to the next Block if the current Stream has at least + * one Block left. Otherwise go to the next Stream even if + * it has no Blocks. If the Stream has no Blocks + * (lzma_index_iter.stream.block_count == 0), + * lzma_index_iter.block will have undefined values. + */ + + LZMA_INDEX_ITER_STREAM = 1, + /**< + * \brief Get the next Stream + * + * Go to the next Stream even if the current Stream has + * unread Blocks left. If the next Stream has at least one + * Block, the iterator will point to the first Block. + * If there are no Blocks, lzma_index_iter.block will have + * undefined values. + */ + + LZMA_INDEX_ITER_BLOCK = 2, + /**< + * \brief Get the next Block + * + * Go to the next Block if the current Stream has at least + * one Block left. If the current Stream has no Blocks left, + * the next Stream with at least one Block is located and + * the iterator will be made to point to the first Block of + * that Stream. + */ + + LZMA_INDEX_ITER_NONEMPTY_BLOCK = 3 + /**< + * \brief Get the next non-empty Block + * + * This is like LZMA_INDEX_ITER_BLOCK except that it will + * skip Blocks whose Uncompressed Size is zero. + */ + +} lzma_index_iter_mode; + + +/** + * \brief Calculate memory usage of lzma_index + * + * On disk, the size of the Index field depends on both the number of Records + * stored and how big values the Records store (due to variable-length integer + * encoding). When the Index is kept in lzma_index structure, the memory usage + * depends only on the number of Records/Blocks stored in the Index(es), and + * in case of concatenated lzma_indexes, the number of Streams. The size in + * RAM is almost always significantly bigger than in the encoded form on disk. + * + * This function calculates an approximate amount of memory needed hold + * the given number of Streams and Blocks in lzma_index structure. This + * value may vary between CPU architectures and also between liblzma versions + * if the internal implementation is modified. + */ +extern LZMA_API(uint64_t) lzma_index_memusage( + lzma_vli streams, lzma_vli blocks) lzma_nothrow; + + +/** + * \brief Calculate the memory usage of an existing lzma_index + * + * This is a shorthand for lzma_index_memusage(lzma_index_stream_count(i), + * lzma_index_block_count(i)). + */ +extern LZMA_API(uint64_t) lzma_index_memused(const lzma_index *i) + lzma_nothrow; + + +/** + * \brief Allocate and initialize a new lzma_index structure + * + * \return On success, a pointer to an empty initialized lzma_index is + * returned. If allocation fails, NULL is returned. + */ +extern LZMA_API(lzma_index *) lzma_index_init(lzma_allocator *allocator) + lzma_nothrow; + + +/** + * \brief Deallocate lzma_index + * + * If i is NULL, this does nothing. + */ +extern LZMA_API(void) lzma_index_end(lzma_index *i, lzma_allocator *allocator) + lzma_nothrow; + + +/** + * \brief Add a new Block to lzma_index + * + * \param i Pointer to a lzma_index structure + * \param allocator Pointer to lzma_allocator, or NULL to + * use malloc() + * \param unpadded_size Unpadded Size of a Block. This can be + * calculated with lzma_block_unpadded_size() + * after encoding or decoding the Block. + * \param uncompressed_size Uncompressed Size of a Block. This can be + * taken directly from lzma_block structure + * after encoding or decoding the Block. + * + * Appending a new Block does not invalidate iterators. For example, + * if an iterator was pointing to the end of the lzma_index, after + * lzma_index_append() it is possible to read the next Block with + * an existing iterator. + * + * \return - LZMA_OK + * - LZMA_MEM_ERROR + * - LZMA_DATA_ERROR: Compressed or uncompressed size of the + * Stream or size of the Index field would grow too big. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_append( + lzma_index *i, lzma_allocator *allocator, + lzma_vli unpadded_size, lzma_vli uncompressed_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Set the Stream Flags + * + * Set the Stream Flags of the last (and typically the only) Stream + * in lzma_index. This can be useful when reading information from the + * lzma_index, because to decode Blocks, knowing the integrity check type + * is needed. + * + * The given Stream Flags are copied into internal preallocated structure + * in the lzma_index, thus the caller doesn't need to keep the *stream_flags + * available after calling this function. + * + * \return - LZMA_OK + * - LZMA_OPTIONS_ERROR: Unsupported stream_flags->version. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_stream_flags( + lzma_index *i, const lzma_stream_flags *stream_flags) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Get the types of integrity Checks + * + * If lzma_index_stream_flags() is used to set the Stream Flags for + * every Stream, lzma_index_checks() can be used to get a bitmask to + * indicate which Check types have been used. It can be useful e.g. if + * showing the Check types to the user. + * + * The bitmask is 1 << check_id, e.g. CRC32 is 1 << 1 and SHA-256 is 1 << 10. + */ +extern LZMA_API(uint32_t) lzma_index_checks(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Set the amount of Stream Padding + * + * Set the amount of Stream Padding of the last (and typically the only) + * Stream in the lzma_index. This is needed when planning to do random-access + * reading within multiple concatenated Streams. + * + * By default, the amount of Stream Padding is assumed to be zero bytes. + * + * \return - LZMA_OK + * - LZMA_DATA_ERROR: The file size would grow too big. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_stream_padding( + lzma_index *i, lzma_vli stream_padding) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Get the number of Streams + */ +extern LZMA_API(lzma_vli) lzma_index_stream_count(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the number of Blocks + * + * This returns the total number of Blocks in lzma_index. To get number + * of Blocks in individual Streams, use lzma_index_iter. + */ +extern LZMA_API(lzma_vli) lzma_index_block_count(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the size of the Index field as bytes + * + * This is needed to verify the Backward Size field in the Stream Footer. + */ +extern LZMA_API(lzma_vli) lzma_index_size(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the total size of the Stream + * + * If multiple lzma_indexes have been combined, this works as if the Blocks + * were in a single Stream. This is useful if you are going to combine + * Blocks from multiple Streams into a single new Stream. + */ +extern LZMA_API(lzma_vli) lzma_index_stream_size(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the total size of the Blocks + * + * This doesn't include the Stream Header, Stream Footer, Stream Padding, + * or Index fields. + */ +extern LZMA_API(lzma_vli) lzma_index_total_size(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the total size of the file + * + * When no lzma_indexes have been combined with lzma_index_cat() and there is + * no Stream Padding, this function is identical to lzma_index_stream_size(). + * If multiple lzma_indexes have been combined, this includes also the headers + * of each separate Stream and the possible Stream Padding fields. + */ +extern LZMA_API(lzma_vli) lzma_index_file_size(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Get the uncompressed size of the file + */ +extern LZMA_API(lzma_vli) lzma_index_uncompressed_size(const lzma_index *i) + lzma_nothrow lzma_attr_pure; + + +/** + * \brief Initialize an iterator + * + * \param iter Pointer to a lzma_index_iter structure + * \param i lzma_index to which the iterator will be associated + * + * This function associates the iterator with the given lzma_index, and calls + * lzma_index_iter_rewind() on the iterator. + * + * This function doesn't allocate any memory, thus there is no + * lzma_index_iter_end(). The iterator is valid as long as the + * associated lzma_index is valid, that is, until lzma_index_end() or + * using it as source in lzma_index_cat(). Specifically, lzma_index doesn't + * become invalid if new Blocks are added to it with lzma_index_append() or + * if it is used as the destination in lzma_index_cat(). + * + * It is safe to make copies of an initialized lzma_index_iter, for example, + * to easily restart reading at some particular position. + */ +extern LZMA_API(void) lzma_index_iter_init( + lzma_index_iter *iter, const lzma_index *i) lzma_nothrow; + + +/** + * \brief Rewind the iterator + * + * Rewind the iterator so that next call to lzma_index_iter_next() will + * return the first Block or Stream. + */ +extern LZMA_API(void) lzma_index_iter_rewind(lzma_index_iter *iter) + lzma_nothrow; + + +/** + * \brief Get the next Block or Stream + * + * \param iter Iterator initialized with lzma_index_iter_init() + * \param mode Specify what kind of information the caller wants + * to get. See lzma_index_iter_mode for details. + * + * \return If next Block or Stream matching the mode was found, *iter + * is updated and this function returns false. If no Block or + * Stream matching the mode is found, *iter is not modified + * and this function returns true. If mode is set to an unknown + * value, *iter is not modified and this function returns true. + */ +extern LZMA_API(lzma_bool) lzma_index_iter_next( + lzma_index_iter *iter, lzma_index_iter_mode mode) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Locate a Block + * + * If it is possible to seek in the .xz file, it is possible to parse + * the Index field(s) and use lzma_index_iter_locate() to do random-access + * reading with granularity of Block size. + * + * \param iter Iterator that was earlier initialized with + * lzma_index_iter_init(). + * \param target Uncompressed target offset which the caller would + * like to locate from the Stream + * + * If the target is smaller than the uncompressed size of the Stream (can be + * checked with lzma_index_uncompressed_size()): + * - Information about the Stream and Block containing the requested + * uncompressed offset is stored into *iter. + * - Internal state of the iterator is adjusted so that + * lzma_index_iter_next() can be used to read subsequent Blocks or Streams. + * - This function returns false. + * + * If target is greater than the uncompressed size of the Stream, *iter + * is not modified, and this function returns true. + */ +extern LZMA_API(lzma_bool) lzma_index_iter_locate( + lzma_index_iter *iter, lzma_vli target) lzma_nothrow; + + +/** + * \brief Concatenate lzma_indexes + * + * Concatenating lzma_indexes is useful when doing random-access reading in + * multi-Stream .xz file, or when combining multiple Streams into single + * Stream. + * + * \param dest lzma_index after which src is appended + * \param src lzma_index to be appended after dest. If this + * function succeeds, the memory allocated for src + * is freed or moved to be part of dest, and all + * iterators pointing to src will become invalid. + * \param allocator Custom memory allocator; can be NULL to use + * malloc() and free(). + * + * \return - LZMA_OK: lzma_indexes were concatenated successfully. + * src is now a dangling pointer. + * - LZMA_DATA_ERROR: *dest would grow too big. + * - LZMA_MEM_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_cat( + lzma_index *dest, lzma_index *src, lzma_allocator *allocator) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Duplicate lzma_index + * + * \return A copy of the lzma_index, or NULL if memory allocation failed. + */ +extern LZMA_API(lzma_index *) lzma_index_dup( + const lzma_index *i, lzma_allocator *allocator) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize .xz Index encoder + * + * \param strm Pointer to properly prepared lzma_stream + * \param i Pointer to lzma_index which should be encoded. + * + * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH. + * It is enough to use only one of them (you can choose freely; use LZMA_RUN + * to support liblzma versions older than 5.0.0). + * + * \return - LZMA_OK: Initialization succeeded, continue with lzma_code(). + * - LZMA_MEM_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_encoder( + lzma_stream *strm, const lzma_index *i) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Initialize .xz Index decoder + * + * \param strm Pointer to properly prepared lzma_stream + * \param i The decoded Index will be made available via + * this pointer. Initially this function will + * set *i to NULL (the old value is ignored). If + * decoding succeeds (lzma_code() returns + * LZMA_STREAM_END), *i will be set to point + * to a new lzma_index, which the application + * has to later free with lzma_index_end(). + * \param memlimit How much memory the resulting lzma_index is + * allowed to require. + * + * The valid `action' values for lzma_code() are LZMA_RUN and LZMA_FINISH. + * It is enough to use only one of them (you can choose freely; use LZMA_RUN + * to support liblzma versions older than 5.0.0). + * + * \return - LZMA_OK: Initialization succeeded, continue with lzma_code(). + * - LZMA_MEM_ERROR + * - LZMA_MEMLIMIT_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_decoder( + lzma_stream *strm, lzma_index **i, uint64_t memlimit) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Single-call .xz Index encoder + * + * \param i lzma_index to be encoded + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * *out_pos is updated only if encoding succeeds. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_BUF_ERROR: Output buffer is too small. Use + * lzma_index_size() to find out how much output + * space is needed. + * - LZMA_PROG_ERROR + * + * \note This function doesn't take allocator argument since all + * the internal data is allocated on stack. + */ +extern LZMA_API(lzma_ret) lzma_index_buffer_encode(const lzma_index *i, + uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; + + +/** + * \brief Single-call .xz Index decoder + * + * \param i If decoding succeeds, *i will point to a new + * lzma_index, which the application has to + * later free with lzma_index_end(). If an error + * occurs, *i will be NULL. The old value of *i + * is always ignored and thus doesn't need to be + * initialized by the caller. + * \param memlimit Pointer to how much memory the resulting + * lzma_index is allowed to require. The value + * pointed by this pointer is modified if and only + * if LZMA_MEMLIMIT_ERROR is returned. + * \param allocator Pointer to lzma_allocator, or NULL to use malloc() + * \param in Beginning of the input buffer + * \param in_pos The next byte will be read from in[*in_pos]. + * *in_pos is updated only if decoding succeeds. + * \param in_size Size of the input buffer; the first byte that + * won't be read is in[in_size]. + * + * \return - LZMA_OK: Decoding was successful. + * - LZMA_MEM_ERROR + * - LZMA_MEMLIMIT_ERROR: Memory usage limit was reached. + * The minimum required memlimit value was stored to *memlimit. + * - LZMA_DATA_ERROR + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_buffer_decode(lzma_index **i, + uint64_t *memlimit, lzma_allocator *allocator, + const uint8_t *in, size_t *in_pos, size_t in_size) + lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/index_hash.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/index_hash.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,107 @@ +/** + * \file lzma/index_hash.h + * \brief Validate Index by using a hash function + * + * Hashing makes it possible to use constant amount of memory to validate + * Index of arbitrary size. + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + +/** + * \brief Opaque data type to hold the Index hash + */ +typedef struct lzma_index_hash_s lzma_index_hash; + + +/** + * \brief Allocate and initialize a new lzma_index_hash structure + * + * If index_hash is NULL, a new lzma_index_hash structure is allocated, + * initialized, and a pointer to it returned. If allocation fails, NULL + * is returned. + * + * If index_hash is non-NULL, it is reinitialized and the same pointer + * returned. In this case, return value cannot be NULL or a different + * pointer than the index_hash that was given as an argument. + */ +extern LZMA_API(lzma_index_hash *) lzma_index_hash_init( + lzma_index_hash *index_hash, lzma_allocator *allocator) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Deallocate lzma_index_hash structure + */ +extern LZMA_API(void) lzma_index_hash_end( + lzma_index_hash *index_hash, lzma_allocator *allocator) + lzma_nothrow; + + +/** + * \brief Add a new Record to an Index hash + * + * \param index Pointer to a lzma_index_hash structure + * \param unpadded_size Unpadded Size of a Block + * \param uncompressed_size Uncompressed Size of a Block + * + * \return - LZMA_OK + * - LZMA_DATA_ERROR: Compressed or uncompressed size of the + * Stream or size of the Index field would grow too big. + * - LZMA_PROG_ERROR: Invalid arguments or this function is being + * used when lzma_index_hash_decode() has already been used. + */ +extern LZMA_API(lzma_ret) lzma_index_hash_append(lzma_index_hash *index_hash, + lzma_vli unpadded_size, lzma_vli uncompressed_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode and validate the Index field + * + * After telling the sizes of all Blocks with lzma_index_hash_append(), + * the actual Index field is decoded with this function. Specifically, + * once decoding of the Index field has been started, no more Records + * can be added using lzma_index_hash_append(). + * + * This function doesn't use lzma_stream structure to pass the input data. + * Instead, the input buffer is specified using three arguments. This is + * because it matches better the internal APIs of liblzma. + * + * \param index_hash Pointer to a lzma_index_hash structure + * \param in Pointer to the beginning of the input buffer + * \param in_pos in[*in_pos] is the next byte to process + * \param in_size in[in_size] is the first byte not to process + * + * \return - LZMA_OK: So far good, but more input is needed. + * - LZMA_STREAM_END: Index decoded successfully and it matches + * the Records given with lzma_index_hash_append(). + * - LZMA_DATA_ERROR: Index is corrupt or doesn't match the + * information given with lzma_index_hash_append(). + * - LZMA_BUF_ERROR: Cannot progress because *in_pos >= in_size. + * - LZMA_PROG_ERROR + */ +extern LZMA_API(lzma_ret) lzma_index_hash_decode(lzma_index_hash *index_hash, + const uint8_t *in, size_t *in_pos, size_t in_size) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Get the size of the Index field as bytes + * + * This is needed to verify the Backward Size field in the Stream Footer. + */ +extern LZMA_API(lzma_vli) lzma_index_hash_size( + const lzma_index_hash *index_hash) + lzma_nothrow lzma_attr_pure; Added: projects/external/xz-5.0.3/include/lzma/lzma.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/lzma.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,420 @@ +/** + * \file lzma/lzma.h + * \brief LZMA1 and LZMA2 filters + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief LZMA1 Filter ID + * + * LZMA1 is the very same thing as what was called just LZMA in LZMA Utils, + * 7-Zip, and LZMA SDK. It's called LZMA1 here to prevent developers from + * accidentally using LZMA when they actually want LZMA2. + * + * LZMA1 shouldn't be used for new applications unless you _really_ know + * what you are doing. LZMA2 is almost always a better choice. + */ +#define LZMA_FILTER_LZMA1 LZMA_VLI_C(0x4000000000000001) + +/** + * \brief LZMA2 Filter ID + * + * Usually you want this instead of LZMA1. Compared to LZMA1, LZMA2 adds + * support for LZMA_SYNC_FLUSH, uncompressed chunks (smaller expansion + * when trying to compress uncompressible data), possibility to change + * lc/lp/pb in the middle of encoding, and some other internal improvements. + */ +#define LZMA_FILTER_LZMA2 LZMA_VLI_C(0x21) + + +/** + * \brief Match finders + * + * Match finder has major effect on both speed and compression ratio. + * Usually hash chains are faster than binary trees. + * + * If you will use LZMA_SYNC_FLUSH often, the hash chains may be a better + * choice, because binary trees get much higher compression ratio penalty + * with LZMA_SYNC_FLUSH. + * + * The memory usage formulas are only rough estimates, which are closest to + * reality when dict_size is a power of two. The formulas are more complex + * in reality, and can also change a little between liblzma versions. Use + * lzma_raw_encoder_memusage() to get more accurate estimate of memory usage. + */ +typedef enum { + LZMA_MF_HC3 = 0x03, + /**< + * \brief Hash Chain with 2- and 3-byte hashing + * + * Minimum nice_len: 3 + * + * Memory usage: + * - dict_size <= 16 MiB: dict_size * 7.5 + * - dict_size > 16 MiB: dict_size * 5.5 + 64 MiB + */ + + LZMA_MF_HC4 = 0x04, + /**< + * \brief Hash Chain with 2-, 3-, and 4-byte hashing + * + * Minimum nice_len: 4 + * + * Memory usage: + * - dict_size <= 32 MiB: dict_size * 7.5 + * - dict_size > 32 MiB: dict_size * 6.5 + */ + + LZMA_MF_BT2 = 0x12, + /**< + * \brief Binary Tree with 2-byte hashing + * + * Minimum nice_len: 2 + * + * Memory usage: dict_size * 9.5 + */ + + LZMA_MF_BT3 = 0x13, + /**< + * \brief Binary Tree with 2- and 3-byte hashing + * + * Minimum nice_len: 3 + * + * Memory usage: + * - dict_size <= 16 MiB: dict_size * 11.5 + * - dict_size > 16 MiB: dict_size * 9.5 + 64 MiB + */ + + LZMA_MF_BT4 = 0x14 + /**< + * \brief Binary Tree with 2-, 3-, and 4-byte hashing + * + * Minimum nice_len: 4 + * + * Memory usage: + * - dict_size <= 32 MiB: dict_size * 11.5 + * - dict_size > 32 MiB: dict_size * 10.5 + */ +} lzma_match_finder; + + +/** + * \brief Test if given match finder is supported + * + * Return true if the given match finder is supported by this liblzma build. + * Otherwise false is returned. It is safe to call this with a value that + * isn't listed in lzma_match_finder enumeration; the return value will be + * false. + * + * There is no way to list which match finders are available in this + * particular liblzma version and build. It would be useless, because + * a new match finder, which the application developer wasn't aware, + * could require giving additional options to the encoder that the older + * match finders don't need. + */ +extern LZMA_API(lzma_bool) lzma_mf_is_supported(lzma_match_finder match_finder) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Compression modes + * + * This selects the function used to analyze the data produced by the match + * finder. + */ +typedef enum { + LZMA_MODE_FAST = 1, + /**< + * \brief Fast compression + * + * Fast mode is usually at its best when combined with + * a hash chain match finder. + */ + + LZMA_MODE_NORMAL = 2 + /**< + * \brief Normal compression + * + * This is usually notably slower than fast mode. Use this + * together with binary tree match finders to expose the + * full potential of the LZMA1 or LZMA2 encoder. + */ +} lzma_mode; + + +/** + * \brief Test if given compression mode is supported + * + * Return true if the given compression mode is supported by this liblzma + * build. Otherwise false is returned. It is safe to call this with a value + * that isn't listed in lzma_mode enumeration; the return value will be false. + * + * There is no way to list which modes are available in this particular + * liblzma version and build. It would be useless, because a new compression + * mode, which the application developer wasn't aware, could require giving + * additional options to the encoder that the older modes don't need. + */ +extern LZMA_API(lzma_bool) lzma_mode_is_supported(lzma_mode mode) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Options specific to the LZMA1 and LZMA2 filters + * + * Since LZMA1 and LZMA2 share most of the code, it's simplest to share + * the options structure too. For encoding, all but the reserved variables + * need to be initialized unless specifically mentioned otherwise. + * lzma_lzma_preset() can be used to get a good starting point. + * + * For raw decoding, both LZMA1 and LZMA2 need dict_size, preset_dict, and + * preset_dict_size (if preset_dict != NULL). LZMA1 needs also lc, lp, and pb. + */ +typedef struct { + /** + * \brief Dictionary size in bytes + * + * Dictionary size indicates how many bytes of the recently processed + * uncompressed data is kept in memory. One method to reduce size of + * the uncompressed data is to store distance-length pairs, which + * indicate what data to repeat from the dictionary buffer. Thus, + * the bigger the dictionary, the better the compression ratio + * usually is. + * + * Maximum size of the dictionary depends on multiple things: + * - Memory usage limit + * - Available address space (not a problem on 64-bit systems) + * - Selected match finder (encoder only) + * + * Currently the maximum dictionary size for encoding is 1.5 GiB + * (i.e. (UINT32_C(1) << 30) + (UINT32_C(1) << 29)) even on 64-bit + * systems for certain match finder implementation reasons. In the + * future, there may be match finders that support bigger + * dictionaries. + * + * Decoder already supports dictionaries up to 4 GiB - 1 B (i.e. + * UINT32_MAX), so increasing the maximum dictionary size of the + * encoder won't cause problems for old decoders. + * + * Because extremely small dictionaries sizes would have unneeded + * overhead in the decoder, the minimum dictionary size is 4096 bytes. + * + * \note When decoding, too big dictionary does no other harm + * than wasting memory. + */ + uint32_t dict_size; +# define LZMA_DICT_SIZE_MIN UINT32_C(4096) +# define LZMA_DICT_SIZE_DEFAULT (UINT32_C(1) << 23) + + /** + * \brief Pointer to an initial dictionary + * + * It is possible to initialize the LZ77 history window using + * a preset dictionary. It is useful when compressing many + * similar, relatively small chunks of data independently from + * each other. The preset dictionary should contain typical + * strings that occur in the files being compressed. The most + * probable strings should be near the end of the preset dictionary. + * + * This feature should be used only in special situations. For + * now, it works correctly only with raw encoding and decoding. + * Currently none of the container formats supported by + * liblzma allow preset dictionary when decoding, thus if + * you create a .xz or .lzma file with preset dictionary, it + * cannot be decoded with the regular decoder functions. In the + * future, the .xz format will likely get support for preset + * dictionary though. + */ + const uint8_t *preset_dict; + + /** + * \brief Size of the preset dictionary + * + * Specifies the size of the preset dictionary. If the size is + * bigger than dict_size, only the last dict_size bytes are + * processed. + * + * This variable is read only when preset_dict is not NULL. + * If preset_dict is not NULL but preset_dict_size is zero, + * no preset dictionary is used (identical to only setting + * preset_dict to NULL). + */ + uint32_t preset_dict_size; + + /** + * \brief Number of literal context bits + * + * How many of the highest bits of the previous uncompressed + * eight-bit byte (also known as `literal') are taken into + * account when predicting the bits of the next literal. + * + * E.g. in typical English text, an upper-case letter is + * often followed by a lower-case letter, and a lower-case + * letter is usually followed by another lower-case letter. + * In the US-ASCII character set, the highest three bits are 010 + * for upper-case letters and 011 for lower-case letters. + * When lc is at least 3, the literal coding can take advantage of + * this property in the uncompressed data. + * + * There is a limit that applies to literal context bits and literal + * position bits together: lc + lp <= 4. Without this limit the + * decoding could become very slow, which could have security related + * results in some cases like email servers doing virus scanning. + * This limit also simplifies the internal implementation in liblzma. + * + * There may be LZMA1 streams that have lc + lp > 4 (maximum possible + * lc would be 8). It is not possible to decode such streams with + * liblzma. + */ + uint32_t lc; +# define LZMA_LCLP_MIN 0 +# define LZMA_LCLP_MAX 4 +# define LZMA_LC_DEFAULT 3 + + /** + * \brief Number of literal position bits + * + * lp affects what kind of alignment in the uncompressed data is + * assumed when encoding literals. A literal is a single 8-bit byte. + * See pb below for more information about alignment. + */ + uint32_t lp; +# define LZMA_LP_DEFAULT 0 + + /** + * \brief Number of position bits + * + * pb affects what kind of alignment in the uncompressed data is + * assumed in general. The default means four-byte alignment + * (2^ pb =2^2=4), which is often a good choice when there's + * no better guess. + * + * When the aligment is known, setting pb accordingly may reduce + * the file size a little. E.g. with text files having one-byte + * alignment (US-ASCII, ISO-8859-*, UTF-8), setting pb=0 can + * improve compression slightly. For UTF-16 text, pb=1 is a good + * choice. If the alignment is an odd number like 3 bytes, pb=0 + * might be the best choice. + * + * Even though the assumed alignment can be adjusted with pb and + * lp, LZMA1 and LZMA2 still slightly favor 16-byte alignment. + * It might be worth taking into account when designing file formats + * that are likely to be often compressed with LZMA1 or LZMA2. + */ + uint32_t pb; +# define LZMA_PB_MIN 0 +# define LZMA_PB_MAX 4 +# define LZMA_PB_DEFAULT 2 + + /** Compression mode */ + lzma_mode mode; + + /** + * \brief Nice length of a match + * + * This determines how many bytes the encoder compares from the match + * candidates when looking for the best match. Once a match of at + * least nice_len bytes long is found, the encoder stops looking for + * better candidates and encodes the match. (Naturally, if the found + * match is actually longer than nice_len, the actual length is + * encoded; it's not truncated to nice_len.) + * + * Bigger values usually increase the compression ratio and + * compression time. For most files, 32 to 128 is a good value, + * which gives very good compression ratio at good speed. + * + * The exact minimum value depends on the match finder. The maximum + * is 273, which is the maximum length of a match that LZMA1 and + * LZMA2 can encode. + */ + uint32_t nice_len; + + /** Match finder ID */ + lzma_match_finder mf; + + /** + * \brief Maximum search depth in the match finder + * + * For every input byte, match finder searches through the hash chain + * or binary tree in a loop, each iteration going one step deeper in + * the chain or tree. The searching stops if + * - a match of at least nice_len bytes long is found; + * - all match candidates from the hash chain or binary tree have + * been checked; or + * - maximum search depth is reached. + * + * Maximum search depth is needed to prevent the match finder from + * wasting too much time in case there are lots of short match + * candidates. On the other hand, stopping the search before all + * candidates have been checked can reduce compression ratio. + * + * Setting depth to zero tells liblzma to use an automatic default + * value, that depends on the selected match finder and nice_len. + * The default is in the range [4, 200] or so (it may vary between + * liblzma versions). + * + * Using a bigger depth value than the default can increase + * compression ratio in some cases. There is no strict maximum value, + * but high values (thousands or millions) should be used with care: + * the encoder could remain fast enough with typical input, but + * malicious input could cause the match finder to slow down + * dramatically, possibly creating a denial of service attack. + */ + uint32_t depth; + + /* + * Reserved space to allow possible future extensions without + * breaking the ABI. You should not touch these, because the names + * of these variables may change. These are and will never be used + * with the currently supported options, so it is safe to leave these + * uninitialized. + */ + uint32_t reserved_int1; + uint32_t reserved_int2; + uint32_t reserved_int3; + uint32_t reserved_int4; + uint32_t reserved_int5; + uint32_t reserved_int6; + uint32_t reserved_int7; + uint32_t reserved_int8; + lzma_reserved_enum reserved_enum1; + lzma_reserved_enum reserved_enum2; + lzma_reserved_enum reserved_enum3; + lzma_reserved_enum reserved_enum4; + void *reserved_ptr1; + void *reserved_ptr2; + +} lzma_options_lzma; + + +/** + * \brief Set a compression preset to lzma_options_lzma structure + * + * 0 is the fastest and 9 is the slowest. These match the switches -0 .. -9 + * of the xz command line tool. In addition, it is possible to bitwise-or + * flags to the preset. Currently only LZMA_PRESET_EXTREME is supported. + * The flags are defined in container.h, because the flags are used also + * with lzma_easy_encoder(). + * + * The preset values are subject to changes between liblzma versions. + * + * This function is available only if LZMA1 or LZMA2 encoder has been enabled + * when building liblzma. + * + * \return On success, false is returned. If the preset is not + * supported, true is returned. + */ +extern LZMA_API(lzma_bool) lzma_lzma_preset( + lzma_options_lzma *options, uint32_t preset) lzma_nothrow; Added: projects/external/xz-5.0.3/include/lzma/stream_flags.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/stream_flags.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,223 @@ +/** + * \file lzma/stream_flags.h + * \brief .xz Stream Header and Stream Footer encoder and decoder + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Size of Stream Header and Stream Footer + * + * Stream Header and Stream Footer have the same size and they are not + * going to change even if a newer version of the .xz file format is + * developed in future. + */ +#define LZMA_STREAM_HEADER_SIZE 12 + + +/** + * \brief Options for encoding/decoding Stream Header and Stream Footer + */ +typedef struct { + /** + * \brief Stream Flags format version + * + * To prevent API and ABI breakages if new features are needed in + * Stream Header or Stream Footer, a version number is used to + * indicate which fields in this structure are in use. For now, + * version must always be zero. With non-zero version, the + * lzma_stream_header_encode() and lzma_stream_footer_encode() + * will return LZMA_OPTIONS_ERROR. + * + * lzma_stream_header_decode() and lzma_stream_footer_decode() + * will always set this to the lowest value that supports all the + * features indicated by the Stream Flags field. The application + * must check that the version number set by the decoding functions + * is supported by the application. Otherwise it is possible that + * the application will decode the Stream incorrectly. + */ + uint32_t version; + + /** + * \brief Backward Size + * + * Backward Size must be a multiple of four bytes. In this Stream + * format version, Backward Size is the size of the Index field. + * + * Backward Size isn't actually part of the Stream Flags field, but + * it is convenient to include in this structure anyway. Backward + * Size is present only in the Stream Footer. There is no need to + * initialize backward_size when encoding Stream Header. + * + * lzma_stream_header_decode() always sets backward_size to + * LZMA_VLI_UNKNOWN so that it is convenient to use + * lzma_stream_flags_compare() when both Stream Header and Stream + * Footer have been decoded. + */ + lzma_vli backward_size; +# define LZMA_BACKWARD_SIZE_MIN 4 +# define LZMA_BACKWARD_SIZE_MAX (LZMA_VLI_C(1) << 34) + + /** + * \brief Check ID + * + * This indicates the type of the integrity check calculated from + * uncompressed data. + */ + lzma_check check; + + /* + * Reserved space to allow possible future extensions without + * breaking the ABI. You should not touch these, because the + * names of these variables may change. + * + * (We will never be able to use all of these since Stream Flags + * is just two bytes plus Backward Size of four bytes. But it's + * nice to have the proper types when they are needed.) + */ + lzma_reserved_enum reserved_enum1; + lzma_reserved_enum reserved_enum2; + lzma_reserved_enum reserved_enum3; + lzma_reserved_enum reserved_enum4; + lzma_bool reserved_bool1; + lzma_bool reserved_bool2; + lzma_bool reserved_bool3; + lzma_bool reserved_bool4; + lzma_bool reserved_bool5; + lzma_bool reserved_bool6; + lzma_bool reserved_bool7; + lzma_bool reserved_bool8; + uint32_t reserved_int1; + uint32_t reserved_int2; + +} lzma_stream_flags; + + +/** + * \brief Encode Stream Header + * + * \param options Stream Header options to be encoded. + * options->backward_size is ignored and doesn't + * need to be initialized. + * \param out Beginning of the output buffer of + * LZMA_STREAM_HEADER_SIZE bytes. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_OPTIONS_ERROR: options->version is not supported by + * this liblzma version. + * - LZMA_PROG_ERROR: Invalid options. + */ +extern LZMA_API(lzma_ret) lzma_stream_header_encode( + const lzma_stream_flags *options, uint8_t *out) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Encode Stream Footer + * + * \param options Stream Footer options to be encoded. + * \param out Beginning of the output buffer of + * LZMA_STREAM_HEADER_SIZE bytes. + * + * \return - LZMA_OK: Encoding was successful. + * - LZMA_OPTIONS_ERROR: options->version is not supported by + * this liblzma version. + * - LZMA_PROG_ERROR: Invalid options. + */ +extern LZMA_API(lzma_ret) lzma_stream_footer_encode( + const lzma_stream_flags *options, uint8_t *out) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode Stream Header + * + * \param options Target for the decoded Stream Header options. + * \param in Beginning of the input buffer of + * LZMA_STREAM_HEADER_SIZE bytes. + * + * options->backward_size is always set to LZMA_VLI_UNKNOWN. This is to + * help comparing Stream Flags from Stream Header and Stream Footer with + * lzma_stream_flags_compare(). + * + * \return - LZMA_OK: Decoding was successful. + * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given + * buffer cannot be Stream Header. + * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the header + * is corrupt. + * - LZMA_OPTIONS_ERROR: Unsupported options are present + * in the header. + * + * \note When decoding .xz files that contain multiple Streams, it may + * make sense to print "file format not recognized" only if + * decoding of the Stream Header of the _first_ Stream gives + * LZMA_FORMAT_ERROR. If non-first Stream Header gives + * LZMA_FORMAT_ERROR, the message used for LZMA_DATA_ERROR is + * probably more appropriate. + * + * For example, Stream decoder in liblzma uses LZMA_DATA_ERROR if + * LZMA_FORMAT_ERROR is returned by lzma_stream_header_decode() + * when decoding non-first Stream. + */ +extern LZMA_API(lzma_ret) lzma_stream_header_decode( + lzma_stream_flags *options, const uint8_t *in) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Decode Stream Footer + * + * \param options Target for the decoded Stream Header options. + * \param in Beginning of the input buffer of + * LZMA_STREAM_HEADER_SIZE bytes. + * + * \return - LZMA_OK: Decoding was successful. + * - LZMA_FORMAT_ERROR: Magic bytes don't match, thus the given + * buffer cannot be Stream Footer. + * - LZMA_DATA_ERROR: CRC32 doesn't match, thus the Stream Footer + * is corrupt. + * - LZMA_OPTIONS_ERROR: Unsupported options are present + * in Stream Footer. + * + * \note If Stream Header was already decoded successfully, but + * decoding Stream Footer returns LZMA_FORMAT_ERROR, the + * application should probably report some other error message + * than "file format not recognized", since the file more likely + * is corrupt (possibly truncated). Stream decoder in liblzma + * uses LZMA_DATA_ERROR in this situation. + */ +extern LZMA_API(lzma_ret) lzma_stream_footer_decode( + lzma_stream_flags *options, const uint8_t *in) + lzma_nothrow lzma_attr_warn_unused_result; + + +/** + * \brief Compare two lzma_stream_flags structures + * + * backward_size values are compared only if both are not + * LZMA_VLI_UNKNOWN. + * + * \return - LZMA_OK: Both are equal. If either had backward_size set + * to LZMA_VLI_UNKNOWN, backward_size values were not + * compared or validated. + * - LZMA_DATA_ERROR: The structures differ. + * - LZMA_OPTIONS_ERROR: version in either structure is greater + * than the maximum supported version (currently zero). + * - LZMA_PROG_ERROR: Invalid value, e.g. invalid check or + * backward_size. + */ +extern LZMA_API(lzma_ret) lzma_stream_flags_compare( + const lzma_stream_flags *a, const lzma_stream_flags *b) + lzma_nothrow lzma_attr_pure; Added: projects/external/xz-5.0.3/include/lzma/version.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/version.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,121 @@ +/** + * \file lzma/version.h + * \brief Version number + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/* + * Version number split into components + */ +#define LZMA_VERSION_MAJOR 5 +#define LZMA_VERSION_MINOR 0 +#define LZMA_VERSION_PATCH 3 +#define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE + +#ifndef LZMA_VERSION_COMMIT +# define LZMA_VERSION_COMMIT "" +#endif + + +/* + * Map symbolic stability levels to integers. + */ +#define LZMA_VERSION_STABILITY_ALPHA 0 +#define LZMA_VERSION_STABILITY_BETA 1 +#define LZMA_VERSION_STABILITY_STABLE 2 + + +/** + * \brief Compile-time version number + * + * The version number is of format xyyyzzzs where + * - x = major + * - yyy = minor + * - zzz = revision + * - s indicates stability: 0 = alpha, 1 = beta, 2 = stable + * + * The same xyyyzzz triplet is never reused with different stability levels. + * For example, if 5.1.0alpha has been released, there will never be 5.1.0beta + * or 5.1.0 stable. + * + * \note The version number of liblzma has nothing to with + * the version number of Igor Pavlov's LZMA SDK. + */ +#define LZMA_VERSION (LZMA_VERSION_MAJOR * UINT32_C(10000000) \ + + LZMA_VERSION_MINOR * UINT32_C(10000) \ + + LZMA_VERSION_PATCH * UINT32_C(10) \ + + LZMA_VERSION_STABILITY) + + +/* + * Macros to construct the compile-time version string + */ +#if LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_ALPHA +# define LZMA_VERSION_STABILITY_STRING "alpha" +#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_BETA +# define LZMA_VERSION_STABILITY_STRING "beta" +#elif LZMA_VERSION_STABILITY == LZMA_VERSION_STABILITY_STABLE +# define LZMA_VERSION_STABILITY_STRING "" +#else +# error Incorrect LZMA_VERSION_STABILITY +#endif + +#define LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) \ + #major "." #minor "." #patch stability commit + +#define LZMA_VERSION_STRING_C(major, minor, patch, stability, commit) \ + LZMA_VERSION_STRING_C_(major, minor, patch, stability, commit) + + +/** + * \brief Compile-time version as a string + * + * This can be for example "4.999.5alpha", "4.999.8beta", or "5.0.0" (stable + * versions don't have any "stable" suffix). In future, a snapshot built + * from source code repository may include an additional suffix, for example + * "4.999.8beta-21-g1d92". The commit ID won't be available in numeric form + * in LZMA_VERSION macro. + */ +#define LZMA_VERSION_STRING LZMA_VERSION_STRING_C( \ + LZMA_VERSION_MAJOR, LZMA_VERSION_MINOR, \ + LZMA_VERSION_PATCH, LZMA_VERSION_STABILITY_STRING, \ + LZMA_VERSION_COMMIT) + + +/* #ifndef is needed for use with windres (MinGW or Cygwin). */ +#ifndef LZMA_H_INTERNAL_RC + +/** + * \brief Run-time version number as an integer + * + * Return the value of LZMA_VERSION macro at the compile time of liblzma. + * This allows the application to compare if it was built against the same, + * older, or newer version of liblzma that is currently running. + */ +extern LZMA_API(uint32_t) lzma_version_number(void) + lzma_nothrow lzma_attr_const; + + +/** + * \brief Run-time version as a string + * + * This function may be useful if you want to display which version of + * liblzma your application is currently using. + */ +extern LZMA_API(const char *) lzma_version_string(void) + lzma_nothrow lzma_attr_const; + +#endif Added: projects/external/xz-5.0.3/include/lzma/vli.h ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/include/lzma/vli.h Thu Oct 13 17:21:32 2011 @@ -0,0 +1,166 @@ +/** + * \file lzma/vli.h + * \brief Variable-length integer handling + * + * In the .xz format, most integers are encoded in a variable-length + * representation, which is sometimes called little endian base-128 encoding. + * This saves space when smaller values are more likely than bigger values. + * + * The encoding scheme encodes seven bits to every byte, using minimum + * number of bytes required to represent the given value. Encodings that use + * non-minimum number of bytes are invalid, thus every integer has exactly + * one encoded representation. The maximum number of bits in a VLI is 63, + * thus the vli argument must be less than or equal to UINT64_MAX / 2. You + * should use LZMA_VLI_MAX for clarity. + */ + +/* + * Author: Lasse Collin + * + * This file has been put into the public domain. + * You can do whatever you want with this file. + * + * See ../lzma.h for information about liblzma as a whole. + */ + +#ifndef LZMA_H_INTERNAL +# error Never include this file directly. Use instead. +#endif + + +/** + * \brief Maximum supported value of a variable-length integer + */ +#define LZMA_VLI_MAX (UINT64_MAX / 2) + +/** + * \brief VLI value to denote that the value is unknown + */ +#define LZMA_VLI_UNKNOWN UINT64_MAX + +/** + * \brief Maximum supported encoded length of variable length integers + */ +#define LZMA_VLI_BYTES_MAX 9 + +/** + * \brief VLI constant suffix + */ +#define LZMA_VLI_C(n) UINT64_C(n) + + +/** + * \brief Variable-length integer type + * + * Valid VLI values are in the range [0, LZMA_VLI_MAX]. Unknown value is + * indicated with LZMA_VLI_UNKNOWN, which is the maximum value of the + * underlaying integer type. + * + * lzma_vli will be uint64_t for the foreseeable future. If a bigger size + * is needed in the future, it is guaranteed that 2 * LZMA_VLI_MAX will + * not overflow lzma_vli. This simplifies integer overflow detection. + */ +typedef uint64_t lzma_vli; + + +/** + * \brief Validate a variable-length integer + * + * This is useful to test that application has given acceptable values + * for example in the uncompressed_size and compressed_size variables. + * + * \return True if the integer is representable as VLI or if it + * indicates unknown value. + */ +#define lzma_vli_is_valid(vli) \ + ((vli) <= LZMA_VLI_MAX || (vli) == LZMA_VLI_UNKNOWN) + + +/** + * \brief Encode a variable-length integer + * + * This function has two modes: single-call and multi-call. Single-call mode + * encodes the whole integer at once; it is an error if the output buffer is + * too small. Multi-call mode saves the position in *vli_pos, and thus it is + * possible to continue encoding if the buffer becomes full before the whole + * integer has been encoded. + * + * \param vli Integer to be encoded + * \param vli_pos How many VLI-encoded bytes have already been written + * out. When starting to encode a new integer in + * multi-call mode, *vli_pos must be set to zero. + * To use single-call encoding, set vli_pos to NULL. + * \param out Beginning of the output buffer + * \param out_pos The next byte will be written to out[*out_pos]. + * \param out_size Size of the out buffer; the first byte into + * which no data is written to is out[out_size]. + * + * \return Slightly different return values are used in multi-call and + * single-call modes. + * + * Single-call (vli_pos == NULL): + * - LZMA_OK: Integer successfully encoded. + * - LZMA_PROG_ERROR: Arguments are not sane. This can be due + * to too little output space; single-call mode doesn't use + * LZMA_BUF_ERROR, since the application should have checked + * the encoded size with lzma_vli_size(). + * + * Multi-call (vli_pos != NULL): + * - LZMA_OK: So far all OK, but the integer is not + * completely written out yet. + * - LZMA_STREAM_END: Integer successfully encoded. + * - LZMA_BUF_ERROR: No output space was provided. + * - LZMA_PROG_ERROR: Arguments are not sane. + */ +extern LZMA_API(lzma_ret) lzma_vli_encode(lzma_vli vli, size_t *vli_pos, + uint8_t *out, size_t *out_pos, size_t out_size) lzma_nothrow; + + +/** + * \brief Decode a variable-length integer + * + * Like lzma_vli_encode(), this function has single-call and multi-call modes. + * + * \param vli Pointer to decoded integer. The decoder will + * initialize it to zero when *vli_pos == 0, so + * application isn't required to initialize *vli. + * \param vli_pos How many bytes have already been decoded. When + * starting to decode a new integer in multi-call + * mode, *vli_pos must be initialized to zero. To + * use single-call decoding, set vli_pos to NULL. + * \param in Beginning of the input buffer + * \param in_pos The next byte will be read from in[*in_pos]. + * \param in_size Size of the input buffer; the first byte that + * won't be read is in[in_size]. + * + * \return Slightly different return values are used in multi-call and + * single-call modes. + * + * Single-call (vli_pos == NULL): + * - LZMA_OK: Integer successfully decoded. + * - LZMA_DATA_ERROR: Integer is corrupt. This includes hitting + * the end of the input buffer before the whole integer was + * decoded; providing no input at all will use LZMA_DATA_ERROR. + * - LZMA_PROG_ERROR: Arguments are not sane. + * + * Multi-call (vli_pos != NULL): + * - LZMA_OK: So far all OK, but the integer is not + * completely decoded yet. + * - LZMA_STREAM_END: Integer successfully decoded. + * - LZMA_DATA_ERROR: Integer is corrupt. + * - LZMA_BUF_ERROR: No input was provided. + * - LZMA_PROG_ERROR: Arguments are not sane. + */ +extern LZMA_API(lzma_ret) lzma_vli_decode(lzma_vli *vli, size_t *vli_pos, + const uint8_t *in, size_t *in_pos, size_t in_size) + lzma_nothrow; + + +/** + * \brief Get the number of bytes required to encode a VLI + * + * \return Number of bytes on success (1-9). If vli isn't valid, + * zero is returned. + */ +extern LZMA_API(uint32_t) lzma_vli_size(lzma_vli vli) + lzma_nothrow lzma_attr_pure; Added: projects/external/xz-5.0.3/svn-commit.tmp ============================================================================== --- (empty file) +++ projects/external/xz-5.0.3/svn-commit.tmp Thu Oct 13 17:21:32 2011 @@ -0,0 +1,4 @@ +Import from http://tukaani.org/xz/xz-5.0.3-windows.zip +-- Diese und die folgenden Zeilen werden ignoriert -- + +A . From python-checkins at python.org Thu Oct 13 17:25:42 2011 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 13 Oct 2011 17:25:42 +0200 (CEST) Subject: [Python-checkins] r88910 - external/xz-5.0.3 projects/external/xz-5.0.3 Message-ID: <3SKG921yWPzPTK@mail.python.org> Author: martin.v.loewis Date: Thu Oct 13 17:25:41 2011 New Revision: 88910 Log: Fix import path. Removed: projects/external/xz-5.0.3/ Changes in other areas also in this revision: Added: external/xz-5.0.3/ - copied from r88909, /projects/external/xz-5.0.3/ From python-checkins at python.org Thu Oct 13 17:26:48 2011 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 13 Oct 2011 17:26:48 +0200 (CEST) Subject: [Python-checkins] r88911 - projects Message-ID: <3SKGBJ4prHzPQF@mail.python.org> Author: martin.v.loewis Date: Thu Oct 13 17:26:48 2011 New Revision: 88911 Log: Remove bogus directory. Removed: projects/ From python-checkins at python.org Thu Oct 13 18:05:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 18:05:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_heuristic_for_when?= =?utf8?q?_to_use_memchr?= Message-ID: http://hg.python.org/cpython/rev/c61137ff5f52 changeset: 72910:c61137ff5f52 parent: 72908:4a6709a071d0 user: Antoine Pitrou date: Thu Oct 13 17:58:11 2011 +0200 summary: Simplify heuristic for when to use memchr files: Objects/stringlib/fastsearch.h | 12 +----------- 1 files changed, 1 insertions(+), 11 deletions(-) diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -113,20 +113,10 @@ /* use memchr if we can choose a needle without two many likely false positives */ unsigned char needle; - int use_needle = 1; needle = p[0] & 0xff; #if STRINGLIB_SIZEOF_CHAR > 1 - if (needle == 0) { - needle = (p[0] >> 8) & 0xff; -#if STRINGLIB_SIZEOF_CHAR > 2 - if (needle == 0) - needle = (p[0] >> 16) & 0xff; + if (needle != 0) #endif - if (needle >= 32 || needle == 0) - use_needle = 0; - } -#endif - if (use_needle) return STRINGLIB(fastsearch_memchr_1char) (s, n, p[0], needle, maxcount, mode); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 18:11:23 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 18:11:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_a_comment_explaining_th?= =?utf8?q?is_heuristic=2E?= Message-ID: http://hg.python.org/cpython/rev/701b2e0e6f3f changeset: 72911:701b2e0e6f3f user: Antoine Pitrou date: Thu Oct 13 18:07:37 2011 +0200 summary: Add a comment explaining this heuristic. files: Objects/stringlib/fastsearch.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -115,6 +115,9 @@ unsigned char needle; needle = p[0] & 0xff; #if STRINGLIB_SIZEOF_CHAR > 1 + /* If looking for a multiple of 256, we'd have two + many false positives looking for the '\0' byte in UCS2 + and UCS4 representations. */ if (needle != 0) #endif return STRINGLIB(fastsearch_memchr_1char) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 18:59:21 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 13 Oct 2011 18:59:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Reuse_the_stringlib_in_find?= =?utf8?q?char=28=29=2C_and_make_its_signature_more_convenient?= Message-ID: http://hg.python.org/cpython/rev/62f2ed19807b changeset: 72912:62f2ed19807b user: Antoine Pitrou date: Thu Oct 13 18:55:09 2011 +0200 summary: Reuse the stringlib in findchar(), and make its signature more convenient files: Objects/unicodeobject.c | 84 ++++++++++++++-------------- 1 files changed, 43 insertions(+), 41 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -519,36 +519,45 @@ #include "stringlib/localeutil.h" #include "stringlib/undef.h" +#include "stringlib/unicodedefs.h" +#include "stringlib/fastsearch.h" +#include "stringlib/count.h" +#include "stringlib/find.h" + /* --- Unicode Object ----------------------------------------------------- */ static PyObject * fixup(PyObject *self, Py_UCS4 (*fixfct)(PyObject *s)); -Py_LOCAL_INLINE(char *) findchar(void *s, int kind, - Py_ssize_t size, Py_UCS4 ch, - int direction) -{ - /* like wcschr, but doesn't stop at NULL characters */ - Py_ssize_t i; - if (kind == 1) { - if (direction == 1) - return memchr(s, ch, size); -#ifdef HAVE_MEMRCHR - else - return memrchr(s, ch, size); -#endif - } - if (direction == 1) { - for(i = 0; i < size; i++) - if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + kind * i; - } - else { - for(i = size-1; i >= 0; i--) - if (PyUnicode_READ(kind, s, i) == ch) - return (char*)s + kind * i; - } - return NULL; +Py_LOCAL_INLINE(Py_ssize_t) findchar(void *s, int kind, + Py_ssize_t size, Py_UCS4 ch, + int direction) +{ + int mode = (direction == 1) ? FAST_SEARCH : FAST_RSEARCH; + + switch (kind) { + case PyUnicode_1BYTE_KIND: + { + Py_UCS1 ch1 = (Py_UCS1) ch; + if (ch1 == ch) + return ucs1lib_fastsearch((Py_UCS1 *) s, size, &ch1, 1, 0, mode); + else + return -1; + } + case PyUnicode_2BYTE_KIND: + { + Py_UCS2 ch2 = (Py_UCS2) ch; + if (ch2 == ch) + return ucs2lib_fastsearch((Py_UCS2 *) s, size, &ch2, 1, 0, mode); + else + return -1; + } + case PyUnicode_4BYTE_KIND: + return ucs4lib_fastsearch((Py_UCS4 *) s, size, &ch, 1, 0, mode); + default: + assert(0); + return -1; + } } static PyObject* @@ -3311,7 +3320,7 @@ } } if (findchar(PyUnicode_DATA(output), PyUnicode_KIND(output), - PyUnicode_GET_LENGTH(output), 0, 1)) { + PyUnicode_GET_LENGTH(output), 0, 1) >= 0) { PyErr_SetString(PyExc_TypeError, "embedded NUL character"); Py_DECREF(output); return 0; @@ -8638,12 +8647,6 @@ } -#include "stringlib/unicodedefs.h" -#include "stringlib/fastsearch.h" - -#include "stringlib/count.h" -#include "stringlib/find.h" - /* helper macro to fixup start/end slice values */ #define ADJUST_INDICES(start, end, len) \ if (end > len) \ @@ -8779,8 +8782,8 @@ Py_ssize_t start, Py_ssize_t end, int direction) { - char *result; int kind; + Py_ssize_t result; if (PyUnicode_READY(str) == -1) return -2; if (start < 0 || end < 0) { @@ -8790,13 +8793,12 @@ if (end > PyUnicode_GET_LENGTH(str)) end = PyUnicode_GET_LENGTH(str); kind = PyUnicode_KIND(str); - result = findchar(PyUnicode_1BYTE_DATA(str) - + kind*start, - kind, - end-start, ch, direction); - if (!result) + result = findchar(PyUnicode_1BYTE_DATA(str) + kind*start, + kind, end-start, ch, direction); + if (result == -1) return -1; - return (result-(char*)PyUnicode_DATA(str)) >> (kind-1); + else + return start + result; } static int @@ -9707,8 +9709,8 @@ Py_UCS4 u1, u2; int rkind; u1 = PyUnicode_READ_CHAR(str1, 0); - if (!findchar(sbuf, PyUnicode_KIND(self), - slen, u1, 1)) + if (findchar(sbuf, PyUnicode_KIND(self), + slen, u1, 1) < 0) goto nothing; u2 = PyUnicode_READ_CHAR(str2, 0); u = PyUnicode_New(slen, maxchar); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 20:04:06 2011 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 13 Oct 2011 20:04:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_GetAttrId_directly=2E_P?= =?utf8?q?roposed_by_Amaury=2E?= Message-ID: http://hg.python.org/cpython/rev/c060261a65b8 changeset: 72913:c060261a65b8 user: Martin v. L?wis date: Thu Oct 13 20:03:57 2011 +0200 summary: Use GetAttrId directly. Proposed by Amaury. files: Objects/typeobject.c | 9 +-------- 1 files changed, 1 insertions(+), 8 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -6308,16 +6308,9 @@ } else { /* Try the slow way */ - PyObject *class_str = NULL; PyObject *class_attr; - class_str = _PyUnicode_FromId(&PyId___class__); - if (class_str == NULL) - return NULL; - - class_attr = PyObject_GetAttr(obj, class_str); - Py_DECREF(class_str); - + class_attr = _PyObject_GetAttrId(obj, &PyId___class__); if (class_attr != NULL && PyType_Check(class_attr) && (PyTypeObject *)class_attr != Py_TYPE(obj)) -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Thu Oct 13 20:05:06 2011 From: martin at v.loewis.de (=?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?=) Date: Thu, 13 Oct 2011 20:05:06 +0200 Subject: [Python-checkins] cpython: Use identifier API for PyObject_GetAttrString. In-Reply-To: References: Message-ID: <4E972852.5060906@v.loewis.de> > - In Modules/_json.c, line 1126, _Py_identifier(strict) is > declared but not used, and there are 5 other possible replacements. Antoine reverted this in 8ed6a627a834. I think I started doing them, then noticed that this is an initializer, so it's likely not called that often. In any case, I'll make several more passes over the code base, so I may revisit this point. > - In Objects/typeobject.c, line 6318, it seems that > _PyObject_GetAttrId could be used directly Good point. Fixed in c060261a65b8. Regards, Martin From python-checkins at python.org Thu Oct 13 23:29:53 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 23:29:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_dictviews=5For=28=29_uses_?= =?utf8?q?=5FPy=5Fidentifier?= Message-ID: http://hg.python.org/cpython/rev/d5c05e90be4c changeset: 72914:d5c05e90be4c user: Victor Stinner date: Thu Oct 13 22:51:17 2011 +0200 summary: dictviews_or() uses _Py_identifier files: Objects/dictobject.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2747,10 +2747,12 @@ { PyObject *result = PySet_New(self); PyObject *tmp; + _Py_identifier(update); + if (result == NULL) return NULL; - tmp = PyObject_CallMethod(result, "update", "O", other); + tmp = _PyObject_CallMethodId(result, &PyId_update, "O", other); if (tmp == NULL) { Py_DECREF(result); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 13 23:29:54 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 13 Oct 2011 23:29:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_convertsimple=28=29=3A_=22s?= =?utf8?q?tr_without_bytes=22_=3D=3E_=22str_without_characters=22?= Message-ID: http://hg.python.org/cpython/rev/9685f893fffe changeset: 72915:9685f893fffe user: Victor Stinner date: Thu Oct 13 23:25:03 2011 +0200 summary: convertsimple(): "str without bytes" => "str without characters" files: Python/getargs.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Python/getargs.c b/Python/getargs.c --- a/Python/getargs.c +++ b/Python/getargs.c @@ -961,8 +961,8 @@ arg, msgbuf, bufsize); if (*p != NULL && sarg != NULL && (Py_ssize_t) strlen(*p) != len) return converterr( - c == 'z' ? "str without null bytes or None" - : "str without null bytes", + c == 'z' ? "str without null characters or None" + : "str without null characters", arg, msgbuf, bufsize); } break; @@ -1002,7 +1002,7 @@ RETURN_ERR_OCCURRED; if (Py_UNICODE_strlen(*p) != len) return converterr( - "str without null character or None", + "str without null characters or None", arg, msgbuf, bufsize); } else return converterr(c == 'Z' ? "str or None" : "str", -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 00:09:29 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 00:09:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo_in_the_os_doc=3A_l?= =?utf8?q?removeattr_=3D=3E_lremovexattr?= Message-ID: http://hg.python.org/cpython/rev/d82a5daa77cf changeset: 72916:d82a5daa77cf user: Victor Stinner date: Fri Oct 14 00:07:53 2011 +0200 summary: Fix typo in the os doc: lremoveattr => lremovexattr files: Doc/library/os.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1658,9 +1658,9 @@ .. versionadded:: 3.3 -.. function:: lremoveattr(path, attr) - - This works exactly like :func:`removeattr` but doesn't follow symlinks. +.. function:: lremovexattr(path, attr) + + This works exactly like :func:`removexattr` but doesn't follow symlinks. Availability: Linux -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 00:09:30 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 00:09:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_What=27s_new_in_Python_3=2E?= =?utf8?q?3=3A_document_new_functions_of_the_os_module?= Message-ID: http://hg.python.org/cpython/rev/cdf612215084 changeset: 72917:cdf612215084 user: Victor Stinner date: Fri Oct 14 00:08:29 2011 +0200 summary: What's new in Python 3.3: document new functions of the os module files: Doc/whatsnew/3.3.rst | 73 ++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+), 0 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -307,6 +307,79 @@ (Patch submitted by Giampaolo Rodol? in :issue:`10784`.) +* "at" functions (:issue:`4761`): + + * :func:`~os.faccessat` + * :func:`~os.fchmodat` + * :func:`~os.fchownat` + * :func:`~os.fstatat` + * :func:`~os.futimesat` + * :func:`~os.futimesat` + * :func:`~os.linkat` + * :func:`~os.mkdirat` + * :func:`~os.mkfifoat` + * :func:`~os.mknodat` + * :func:`~os.openat` + * :func:`~os.readlinkat` + * :func:`~os.renameat` + * :func:`~os.symlinkat` + * :func:`~os.unlinkat` + * :func:`~os.utimensat` + * :func:`~os.utimensat` + +* extended attributes (:issue:`12720`): + + * :func:`~os.fgetxattr` + * :func:`~os.flistxattr` + * :func:`~os.fremovexattr` + * :func:`~os.fsetxattr` + * :func:`~os.getxattr` + * :func:`~os.lgetxattr` + * :func:`~os.listxattr` + * :func:`~os.llistxattr` + * :func:`~os.lremovexattr` + * :func:`~os.lsetxattr` + * :func:`~os.removexattr` + * :func:`~os.setxattr` + +* Scheduler functions (:issue:`12655`): + + * :func:`~os.sched_get_priority_max` + * :func:`~os.sched_get_priority_min` + * :func:`~os.sched_getaffinity` + * :func:`~os.sched_getparam` + * :func:`~os.sched_getscheduler` + * :func:`~os.sched_rr_get_interval` + * :func:`~os.sched_setaffinity` + * :func:`~os.sched_setparam` + * :func:`~os.sched_setscheduler` + * :func:`~os.sched_yield` + +* Add some extra posix functions to the os module (:issue:`10812`): + + * :func:`~os.fexecve` + * :func:`~os.futimens` + * :func:`~os.futimens` + * :func:`~os.futimes` + * :func:`~os.futimes` + * :func:`~os.lockf` + * :func:`~os.lutimes` + * :func:`~os.lutimes` + * :func:`~os.posix_fadvise` + * :func:`~os.posix_fallocate` + * :func:`~os.pread` + * :func:`~os.pwrite` + * :func:`~os.readv` + * :func:`~os.sync` + * :func:`~os.truncate` + * :func:`~os.waitid` + * :func:`~os.writev` + +* Other new functions: + + * :func:`~os.fdlistdir` (:issue:`10755`) + * :func:`~os.getgrouplist` (:issue:`9344`) + packaging --------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 02:18:17 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 02:18:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313088=3A_Add_share?= =?utf8?q?d_Py=5Fhexdigits_constant_to_format_a_number_into_base_16?= Message-ID: http://hg.python.org/cpython/rev/d76338eacf7c changeset: 72918:d76338eacf7c user: Victor Stinner date: Fri Oct 14 02:13:11 2011 +0200 summary: Issue #13088: Add shared Py_hexdigits constant to format a number into base 16 files: Include/codecs.h | 2 + Modules/_codecsmodule.c | 5 +- Modules/_hashopenssl.c | 8 +- Modules/_json.c | 16 +- Modules/_pickle.c | 25 ++-- Modules/binascii.c | 8 +- Modules/md5module.c | 8 +- Modules/sha1module.c | 8 +- Modules/sha256module.c | 8 +- Modules/sha512module.c | 8 +- Objects/bytearrayobject.c | 5 +- Objects/bytesobject.c | 5 +- Objects/floatobject.c | 2 +- Objects/unicodeobject.c | 118 ++++++++++++------------- Python/codecs.c | 24 ++-- Python/traceback.c | 3 +- 16 files changed, 118 insertions(+), 135 deletions(-) diff --git a/Include/codecs.h b/Include/codecs.h --- a/Include/codecs.h +++ b/Include/codecs.h @@ -174,6 +174,8 @@ /* replace the unicode encode error with backslash escapes (\x, \u and \U) */ PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); +extern const char *Py_hexdigits; + #ifdef __cplusplus } #endif diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -162,7 +162,6 @@ escape_encode(PyObject *self, PyObject *args) { - static const char *hexdigits = "0123456789abcdef"; PyObject *str; Py_ssize_t size; Py_ssize_t newsize; @@ -205,8 +204,8 @@ else if (c < ' ' || c >= 0x7f) { *p++ = '\\'; *p++ = 'x'; - *p++ = hexdigits[(c & 0xf0) >> 4]; - *p++ = hexdigits[c & 0xf]; + *p++ = Py_hexdigits[(c & 0xf0) >> 4]; + *p++ = Py_hexdigits[c & 0xf]; } else *p++ = c; diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c --- a/Modules/_hashopenssl.c +++ b/Modules/_hashopenssl.c @@ -201,13 +201,11 @@ /* Make hex version of the digest */ for(i=j=0; i> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; } retval = PyUnicode_FromStringAndSize(hex_digest, digest_size * 2); PyMem_Free(hex_digest); diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -175,18 +175,18 @@ Py_UCS4 v = c - 0x10000; c = 0xd800 | ((v >> 10) & 0x3ff); output[chars++] = 'u'; - output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; - output[chars++] = "0123456789abcdef"[(c ) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 12) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 8) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 4) & 0xf]; + output[chars++] = Py_hexdigits[(c ) & 0xf]; c = 0xdc00 | (v & 0x3ff); output[chars++] = '\\'; } output[chars++] = 'u'; - output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 8) & 0xf]; - output[chars++] = "0123456789abcdef"[(c >> 4) & 0xf]; - output[chars++] = "0123456789abcdef"[(c ) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 12) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 8) & 0xf]; + output[chars++] = Py_hexdigits[(c >> 4) & 0xf]; + output[chars++] = Py_hexdigits[(c ) & 0xf]; } return chars; } diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -1776,7 +1776,6 @@ static PyObject * raw_unicode_escape(PyObject *obj) { - static const char *hexdigits = "0123456789abcdef"; PyObject *repr, *result; char *p; Py_ssize_t i, size, expandsize; @@ -1809,23 +1808,23 @@ if (ch >= 0x10000) { *p++ = '\\'; *p++ = 'U'; - *p++ = hexdigits[(ch >> 28) & 0xf]; - *p++ = hexdigits[(ch >> 24) & 0xf]; - *p++ = hexdigits[(ch >> 20) & 0xf]; - *p++ = hexdigits[(ch >> 16) & 0xf]; - *p++ = hexdigits[(ch >> 12) & 0xf]; - *p++ = hexdigits[(ch >> 8) & 0xf]; - *p++ = hexdigits[(ch >> 4) & 0xf]; - *p++ = hexdigits[ch & 15]; + *p++ = Py_hexdigits[(ch >> 28) & 0xf]; + *p++ = Py_hexdigits[(ch >> 24) & 0xf]; + *p++ = Py_hexdigits[(ch >> 20) & 0xf]; + *p++ = Py_hexdigits[(ch >> 16) & 0xf]; + *p++ = Py_hexdigits[(ch >> 12) & 0xf]; + *p++ = Py_hexdigits[(ch >> 8) & 0xf]; + *p++ = Py_hexdigits[(ch >> 4) & 0xf]; + *p++ = Py_hexdigits[ch & 15]; } /* Map 16-bit characters to '\uxxxx' */ else if (ch >= 256 || ch == '\\' || ch == '\n') { *p++ = '\\'; *p++ = 'u'; - *p++ = hexdigits[(ch >> 12) & 0xf]; - *p++ = hexdigits[(ch >> 8) & 0xf]; - *p++ = hexdigits[(ch >> 4) & 0xf]; - *p++ = hexdigits[ch & 15]; + *p++ = Py_hexdigits[(ch >> 12) & 0xf]; + *p++ = Py_hexdigits[(ch >> 8) & 0xf]; + *p++ = Py_hexdigits[(ch >> 4) & 0xf]; + *p++ = Py_hexdigits[ch & 15]; } /* Copy everything else as-is */ else diff --git a/Modules/binascii.c b/Modules/binascii.c --- a/Modules/binascii.c +++ b/Modules/binascii.c @@ -1078,13 +1078,11 @@ /* make hex version of string, taken from shamodule.c */ for (i=j=0; i < arglen; i++) { - char c; + unsigned char c; c = (argbuf[i] >> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - retbuf[j++] = c; + retbuf[j++] = Py_hexdigits[c]; c = argbuf[i] & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - retbuf[j++] = c; + retbuf[j++] = Py_hexdigits[c]; } PyBuffer_Release(&parg); return retval; diff --git a/Modules/md5module.c b/Modules/md5module.c --- a/Modules/md5module.c +++ b/Modules/md5module.c @@ -391,13 +391,11 @@ /* Make hex version of the digest */ for(i=j=0; i> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; } return retval; } diff --git a/Modules/sha1module.c b/Modules/sha1module.c --- a/Modules/sha1module.c +++ b/Modules/sha1module.c @@ -367,13 +367,11 @@ /* Make hex version of the digest */ for(i=j=0; i> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; } return retval; } diff --git a/Modules/sha256module.c b/Modules/sha256module.c --- a/Modules/sha256module.c +++ b/Modules/sha256module.c @@ -460,13 +460,11 @@ /* Make hex version of the digest */ for(i=j=0; idigestsize; i++) { - char c; + unsigned char c; c = (digest[i] >> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; } return retval; } diff --git a/Modules/sha512module.c b/Modules/sha512module.c --- a/Modules/sha512module.c +++ b/Modules/sha512module.c @@ -526,13 +526,11 @@ /* Make hex version of the digest */ for (i=j=0; idigestsize; i++) { - char c; + unsigned char c; c = (digest[i] >> 4) & 0xf; - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; c = (digest[i] & 0xf); - c = (c>9) ? c+'a'-10 : c + '0'; - hex_digest[j++] = c; + hex_digest[j++] = Py_hexdigits[c]; } return retval; } diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -850,7 +850,6 @@ static PyObject * bytearray_repr(PyByteArrayObject *self) { - static const char *hexdigits = "0123456789abcdef"; const char *quote_prefix = "bytearray(b"; const char *quote_postfix = ")"; Py_ssize_t length = Py_SIZE(self); @@ -912,8 +911,8 @@ else if (c < ' ' || c >= 0x7f) { *p++ = '\\'; *p++ = 'x'; - *p++ = hexdigits[(c & 0xf0) >> 4]; - *p++ = hexdigits[c & 0xf]; + *p++ = Py_hexdigits[(c & 0xf0) >> 4]; + *p++ = Py_hexdigits[c & 0xf]; } else *p++ = c; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -564,7 +564,6 @@ PyObject * PyBytes_Repr(PyObject *obj, int smartquotes) { - static const char *hexdigits = "0123456789abcdef"; register PyBytesObject* op = (PyBytesObject*) obj; Py_ssize_t i, length = Py_SIZE(op); size_t newsize, squotes, dquotes; @@ -620,8 +619,8 @@ else if (c < ' ' || c >= 0x7f) { *p++ = '\\'; *p++ = 'x'; - *p++ = hexdigits[(c & 0xf0) >> 4]; - *p++ = hexdigits[c & 0xf]; + *p++ = Py_hexdigits[(c & 0xf0) >> 4]; + *p++ = Py_hexdigits[c & 0xf]; } else *p++ = c; diff --git a/Objects/floatobject.c b/Objects/floatobject.c --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -1058,7 +1058,7 @@ char_from_hex(int x) { assert(0 <= x && x < 16); - return "0123456789abcdef"[x]; + return Py_hexdigits[x]; } static int diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5943,8 +5943,6 @@ */ -static const char *hexdigits = "0123456789abcdef"; - PyObject * PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) @@ -6006,14 +6004,14 @@ else if (ch >= 0x10000) { *p++ = '\\'; *p++ = 'U'; - *p++ = hexdigits[(ch >> 28) & 0x0000000F]; - *p++ = hexdigits[(ch >> 24) & 0x0000000F]; - *p++ = hexdigits[(ch >> 20) & 0x0000000F]; - *p++ = hexdigits[(ch >> 16) & 0x0000000F]; - *p++ = hexdigits[(ch >> 12) & 0x0000000F]; - *p++ = hexdigits[(ch >> 8) & 0x0000000F]; - *p++ = hexdigits[(ch >> 4) & 0x0000000F]; - *p++ = hexdigits[ch & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 28) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 24) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 20) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 16) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 12) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 8) & 0x0000000F]; + *p++ = Py_hexdigits[(ch >> 4) & 0x0000000F]; + *p++ = Py_hexdigits[ch & 0x0000000F]; continue; } #else @@ -6028,14 +6026,14 @@ ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; *p++ = '\\'; *p++ = 'U'; - *p++ = hexdigits[(ucs >> 28) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 24) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 20) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 16) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 12) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 8) & 0x0000000F]; - *p++ = hexdigits[(ucs >> 4) & 0x0000000F]; - *p++ = hexdigits[ucs & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 28) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 24) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 20) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 16) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 12) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 8) & 0x0000000F]; + *p++ = Py_hexdigits[(ucs >> 4) & 0x0000000F]; + *p++ = Py_hexdigits[ucs & 0x0000000F]; continue; } /* Fall through: isolated surrogates are copied as-is */ @@ -6048,10 +6046,10 @@ if (ch >= 256) { *p++ = '\\'; *p++ = 'u'; - *p++ = hexdigits[(ch >> 12) & 0x000F]; - *p++ = hexdigits[(ch >> 8) & 0x000F]; - *p++ = hexdigits[(ch >> 4) & 0x000F]; - *p++ = hexdigits[ch & 0x000F]; + *p++ = Py_hexdigits[(ch >> 12) & 0x000F]; + *p++ = Py_hexdigits[(ch >> 8) & 0x000F]; + *p++ = Py_hexdigits[(ch >> 4) & 0x000F]; + *p++ = Py_hexdigits[ch & 0x000F]; } /* Map special whitespace to '\t', \n', '\r' */ @@ -6072,8 +6070,8 @@ else if (ch < ' ' || ch >= 0x7F) { *p++ = '\\'; *p++ = 'x'; - *p++ = hexdigits[(ch >> 4) & 0x000F]; - *p++ = hexdigits[ch & 0x000F]; + *p++ = Py_hexdigits[(ch >> 4) & 0x000F]; + *p++ = Py_hexdigits[ch & 0x000F]; } /* Copy everything else as-is */ @@ -6258,14 +6256,14 @@ if (ch >= 0x10000) { *p++ = '\\'; *p++ = 'U'; - *p++ = hexdigits[(ch >> 28) & 0xf]; - *p++ = hexdigits[(ch >> 24) & 0xf]; - *p++ = hexdigits[(ch >> 20) & 0xf]; - *p++ = hexdigits[(ch >> 16) & 0xf]; - *p++ = hexdigits[(ch >> 12) & 0xf]; - *p++ = hexdigits[(ch >> 8) & 0xf]; - *p++ = hexdigits[(ch >> 4) & 0xf]; - *p++ = hexdigits[ch & 15]; + *p++ = Py_hexdigits[(ch >> 28) & 0xf]; + *p++ = Py_hexdigits[(ch >> 24) & 0xf]; + *p++ = Py_hexdigits[(ch >> 20) & 0xf]; + *p++ = Py_hexdigits[(ch >> 16) & 0xf]; + *p++ = Py_hexdigits[(ch >> 12) & 0xf]; + *p++ = Py_hexdigits[(ch >> 8) & 0xf]; + *p++ = Py_hexdigits[(ch >> 4) & 0xf]; + *p++ = Py_hexdigits[ch & 15]; } else #else @@ -6280,14 +6278,14 @@ ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; *p++ = '\\'; *p++ = 'U'; - *p++ = hexdigits[(ucs >> 28) & 0xf]; - *p++ = hexdigits[(ucs >> 24) & 0xf]; - *p++ = hexdigits[(ucs >> 20) & 0xf]; - *p++ = hexdigits[(ucs >> 16) & 0xf]; - *p++ = hexdigits[(ucs >> 12) & 0xf]; - *p++ = hexdigits[(ucs >> 8) & 0xf]; - *p++ = hexdigits[(ucs >> 4) & 0xf]; - *p++ = hexdigits[ucs & 0xf]; + *p++ = Py_hexdigits[(ucs >> 28) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 24) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 20) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 16) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 12) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 8) & 0xf]; + *p++ = Py_hexdigits[(ucs >> 4) & 0xf]; + *p++ = Py_hexdigits[ucs & 0xf]; continue; } /* Fall through: isolated surrogates are copied as-is */ @@ -6299,10 +6297,10 @@ if (ch >= 256) { *p++ = '\\'; *p++ = 'u'; - *p++ = hexdigits[(ch >> 12) & 0xf]; - *p++ = hexdigits[(ch >> 8) & 0xf]; - *p++ = hexdigits[(ch >> 4) & 0xf]; - *p++ = hexdigits[ch & 15]; + *p++ = Py_hexdigits[(ch >> 12) & 0xf]; + *p++ = Py_hexdigits[(ch >> 8) & 0xf]; + *p++ = Py_hexdigits[(ch >> 4) & 0xf]; + *p++ = Py_hexdigits[ch & 15]; } /* Copy everything else as-is */ else @@ -11648,8 +11646,8 @@ else if (ch < ' ' || ch == 0x7F) { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'x'); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 4) & 0x000F]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[ch & 0x000F]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]); } /* Copy ASCII characters as-is */ @@ -11667,30 +11665,30 @@ if (ch <= 0xff) { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'x'); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 4) & 0x000F]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[ch & 0x000F]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0x000F]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0x000F]); } /* Map 21-bit characters to '\U00xxxxxx' */ else if (ch >= 0x10000) { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'U'); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 28) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 24) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 20) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 16) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 12) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 8) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 4) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[ch & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 28) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 24) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 20) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 16) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]); } /* Map 16-bit characters to '\uxxxx' */ else { PyUnicode_WRITE(okind, odata, o++, '\\'); PyUnicode_WRITE(okind, odata, o++, 'u'); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 12) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 8) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[(ch >> 4) & 0xF]); - PyUnicode_WRITE(okind, odata, o++, hexdigits[ch & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 12) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 8) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[(ch >> 4) & 0xF]); + PyUnicode_WRITE(okind, odata, o++, Py_hexdigits[ch & 0xF]); } } /* Copy characters as-is */ diff --git a/Python/codecs.c b/Python/codecs.c --- a/Python/codecs.c +++ b/Python/codecs.c @@ -11,6 +11,8 @@ #include "Python.h" #include +const char *Py_hexdigits = "0123456789abcdef"; + /* --- Codec Registry ----------------------------------------------------- */ /* Import the standard encodings package which will register the first @@ -673,8 +675,6 @@ } } -static const char *hexdigits = "0123456789abcdef"; - PyObject *PyCodec_BackslashReplaceErrors(PyObject *exc) { #ifndef Py_UNICODE_WIDE @@ -731,22 +731,22 @@ } if (c >= 0x00010000) { *outp++ = 'U'; - *outp++ = hexdigits[(c>>28)&0xf]; - *outp++ = hexdigits[(c>>24)&0xf]; - *outp++ = hexdigits[(c>>20)&0xf]; - *outp++ = hexdigits[(c>>16)&0xf]; - *outp++ = hexdigits[(c>>12)&0xf]; - *outp++ = hexdigits[(c>>8)&0xf]; + *outp++ = Py_hexdigits[(c>>28)&0xf]; + *outp++ = Py_hexdigits[(c>>24)&0xf]; + *outp++ = Py_hexdigits[(c>>20)&0xf]; + *outp++ = Py_hexdigits[(c>>16)&0xf]; + *outp++ = Py_hexdigits[(c>>12)&0xf]; + *outp++ = Py_hexdigits[(c>>8)&0xf]; } else if (c >= 0x100) { *outp++ = 'u'; - *outp++ = hexdigits[(c>>12)&0xf]; - *outp++ = hexdigits[(c>>8)&0xf]; + *outp++ = Py_hexdigits[(c>>12)&0xf]; + *outp++ = Py_hexdigits[(c>>8)&0xf]; } else *outp++ = 'x'; - *outp++ = hexdigits[(c>>4)&0xf]; - *outp++ = hexdigits[c&0xf]; + *outp++ = Py_hexdigits[(c>>4)&0xf]; + *outp++ = Py_hexdigits[c&0xf]; } restuple = Py_BuildValue("(On)", res, end); diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -463,12 +463,11 @@ static void dump_hexadecimal(int width, unsigned long value, int fd) { - const char *hexdigits = "0123456789abcdef"; int len; char buffer[sizeof(unsigned long) * 2 + 1]; len = 0; do { - buffer[len] = hexdigits[value & 15]; + buffer[len] = Py_hexdigits[value & 15]; value >>= 4; len++; } while (len < width || value); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 02:38:21 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 02:38:21 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwNjUz?= =?utf8?q?=3A_On_Windows=2C_use_strftime=28=29_instead_of_wcsftime=28=29_b?= =?utf8?q?ecause?= Message-ID: http://hg.python.org/cpython/rev/e3d9c5e690fc changeset: 72919:e3d9c5e690fc branch: 3.2 parent: 72907:d18c80a8c119 user: Victor Stinner date: Fri Oct 14 02:36:13 2011 +0200 summary: Issue #10653: On Windows, use strftime() instead of wcsftime() because wcsftime() doesn't format time zone correctly. files: Misc/NEWS | 3 +++ Modules/timemodule.c | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Library ------- +- Issue #10653: On Windows, use strftime() instead of wcsftime() because + wcsftime() doesn't format time zone correctly. + - Issue #11171: Fix distutils.sysconfig.get_makefile_filename when Python was configured with different prefix and exec-prefix. diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -431,6 +431,11 @@ return 1; } +#ifdef MS_WINDOWS + /* wcsftime() doesn't format correctly time zones, see issue #10653 */ +# undef HAVE_WCSFTIME +#endif + #ifdef HAVE_STRFTIME #ifdef HAVE_WCSFTIME #define time_char wchar_t -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 02:38:22 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 02:38:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28Merge_3=2E2=29_Issue_=2310653=3A_On_Windows=2C_use_strfti?= =?utf8?q?me=28=29_instead_of_wcsftime=28=29?= Message-ID: http://hg.python.org/cpython/rev/79e60977fc04 changeset: 72920:79e60977fc04 parent: 72918:d76338eacf7c parent: 72919:e3d9c5e690fc user: Victor Stinner date: Fri Oct 14 02:39:06 2011 +0200 summary: (Merge 3.2) Issue #10653: On Windows, use strftime() instead of wcsftime() because wcsftime() doesn't format time zone correctly. files: Misc/NEWS | 3 +++ Modules/timemodule.c | 5 +++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -305,6 +305,9 @@ Library ------- +- Issue #10653: On Windows, use strftime() instead of wcsftime() because + wcsftime() doesn't format time zone correctly. + - Issue #13150: The tokenize module doesn't compile large regular expressions at startup anymore. diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -386,6 +386,11 @@ return 1; } +#ifdef MS_WINDOWS + /* wcsftime() doesn't format correctly time zones, see issue #10653 */ +# undef HAVE_WCSFTIME +#endif + #ifdef HAVE_STRFTIME #ifdef HAVE_WCSFTIME #define time_char wchar_t -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 03:04:24 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 03:04:24 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDI1?= =?utf8?q?=3A_mimetypes_is_now_reading_MIME_types_using_the_UTF-8_encoding?= =?utf8?q?=2C?= Message-ID: http://hg.python.org/cpython/rev/8d8ab3e04363 changeset: 72921:8d8ab3e04363 branch: 3.2 parent: 72919:e3d9c5e690fc user: Victor Stinner date: Fri Oct 14 03:03:35 2011 +0200 summary: Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, instead of the locale encoding. files: Lib/mimetypes.py | 2 +- Lib/test/mime.types | 1445 ++++++++++++++++++++++++ Lib/test/test_mimetypes.py | 17 +- Misc/NEWS | 3 + 4 files changed, 1464 insertions(+), 3 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -199,7 +199,7 @@ list of standard types, else to the list of non-standard types. """ - with open(filename) as fp: + with open(filename, encoding='utf-8') as fp: self.readfp(fp, strict) def readfp(self, fp, strict=True): diff --git a/Lib/test/mime.types b/Lib/test/mime.types new file mode 100644 --- /dev/null +++ b/Lib/test/mime.types @@ -0,0 +1,1445 @@ +# This is a comment. I love comments. -*- indent-tabs-mode: t -*- + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at . + +# IANA types + +# MIME type Extensions +application/1d-interleaved-parityfec +application/3gpp-ims+xml +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomcat+xml atomcat +application/atomicmail +application/atomsvc+xml atomsvc +application/auth-policy+xml apxml +application/batch-SMTP +application/beep+xml +application/cals-1840 +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +application/cea-2018+xml +application/cellml+xml cellml cml +application/cfw +application/cnrp+xml +application/commonground +application/conference-info+xml +application/cpl+xml cpl +application/csta+xml +application/CSTAdata+xml +application/cybercash +application/davmount+xml davmount +application/dca-rft +application/dec-dx +application/dialog-info+xml +application/dicom dcm +application/dns +application/dskpp+xml xmls +application/dssc+der dssc +application/dssc+xml xdssc +application/dvcs dvc +application/ecmascript +application/EDI-Consent +application/EDI-X12 +application/EDIFACT +application/emma+xml emma +application/epp+xml +application/eshop +application/exi exi +application/fastinfoset finf +application/fastsoap +# fits, fit, fts: image/fits +application/fits +application/font-tdpfr pfr +application/framework-attributes+xml +application/H224 +application/hal+xml hal +application/held+xml +application/http +application/hyperstudio stk +application/ibe-key-request+xml +application/ibe-pkg-reply+xml +application/ibe-pp-data +application/iges +application/im-iscomposing+xml +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipfix ipfix +application/ipp +application/isup +application/javascript js +application/json json +application/kpml-request+xml +application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica nb ma mb +application/mathml-content+xml +application/mathml-presentation+xml +application/mathml+xml mml +application/mbms-associated-procedure-description+xml +application/mbms-deregister+xml +application/mbms-envelope+xml +application/mbms-msk-response+xml +application/mbms-msk+xml +application/mbms-protection-description+xml +application/mbms-reception-report+xml +application/mbms-register-response+xml +application/mbms-register+xml +application/mbms-user-service-description+xml +application/mbox mbox +application/media_control+xml +application/mediaservercontrol+xml +application/metalink4+xml meta4 +application/mets+xml mets +application/mikey +application/mods+xml mods +application/moss-keys +application/moss-signature +application/mosskey-data +application/mosskey-request +application/mp21 m21 mp21 +# mp4, mpg4: video/mp4, see RFC 4337 +application/mp4 +application/mpeg4-generic +application/mpeg4-iod +application/mpeg4-iod-xmt +application/msc-ivr+xml +application/msc-mixer+xml +application/msword doc +application/mxf mxf +application/nasdata +application/news-checkgroups +application/news-groupinfo +application/news-transmission +application/nss +application/ocsp-request orq +application/ocsp-response ors +application/octet-stream bin lha lzh exe class so dll img iso +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/parityfec +# xer: application/xcap-error+xml +application/patch-ops-error+xml +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature sig +application/pidf-diff+xml +application/pidf+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +# ac: application/vnd.nokia.n-gage.ac+xml +application/pkix-attr-cert +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp +application/pls+xml pls +application/poc-settings+xml +application/postscript ps eps ai +application/prs.alvestrand.titrax-sheet +application/prs.cww cw cww +application/prs.nprend rnd rct +application/prs.plucker +application/prs.rdf-xml-crypt rdf-crypt +application/prs.xsf+xml xsf +application/pskc+xml pskcxml +application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/remote-printing +application/resource-lists-diff+xml rld +application/resource-lists+xml rl +application/riscos +application/rlmi+xml +application/rls-services+xml rs +application/rtf rtf +application/rtx +application/samlassertion+xml +application/samlmetadata+xml +application/sbml+xml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog soc +application/shf+xml shf +application/sieve siv sieve +application/simple-filter+xml cl +application/simple-message-summary +application/simpleSymbolContainer +application/slate +# obsoleted by application/smil+xml +application/smil smil smi sml +# smil, smi: application/smil for now +application/smil+xml +application/soap+fastinfoset +application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssml+xml ssml +application/tamp-apex-update tau +application/tamp-apex-update-confirm auc +application/tamp-community-update tcu +application/tamp-community-update-confirm cuc +application/tamp-error ter +application/tamp-sequence-adjust tsa +application/tamp-sequence-adjust-confirm sac +# tsq: application/timestamp-query +application/tamp-status-query +# tsr: application/timestamp-reply +application/tamp-status-response +application/tamp-update tur +application/tamp-update-confirm tuc +application/tei+xml tei teiCorpus odd +application/thraud+xml tfi +application/timestamp-query tsq +application/timestamp-reply tsr +application/timestamped-data tsd +application/tve-trigger +application/ulpfec +application/vemmi +application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# sms: application/vnd.3gpp2.sms +application/vnd.3gpp.sms +application/vnd.3gpp2.bcmcsinfo+xml +application/vnd.3gpp2.sms sms +application/vnd.3gpp2.tcap tcap +application/vnd.3M.Post-it-Notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.fxp fxp fxpl +application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.aether.imp +application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.amundsen.maze+xml +application/vnd.anser-web-certificate-issue-initiation cii +# Not in IANA listing, but is on FTP site? +application/vnd.anser-web-funds-transfer-initiation fti +# atx: audio/ATRAC-X +application/vnd.antix.game-component +application/vnd.apple.installer+xml dist distz pkg mpkg +# m3u: application/x-mpegurl for now +application/vnd.apple.mpegurl m3u8 +application/vnd.aristanetworks.swi swi +application/vnd.audiograph aep +application/vnd.autopackage package +application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +application/vnd.bluetooth.ep.oob ep +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.cab-jscript +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cendio.thinlinc.clientconf tlclient +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# icc: application/vnd.iccprofile +application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8 +application/vnd.commonspace csp cst +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.ctct.ws+xml +application/vnd.cups-pdf +application/vnd.cups-postscript +application/vnd.cups-ppd ppd +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl curl +application/vnd.cybank +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mobile.1 +application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg mwc dpgraph +application/vnd.dreamfactory dfac +application/vnd.dvb.ait ait +# class: application/octet-stream +application/vnd.dvb.dvbj +application/vnd.dvb.esgcontainer +application/vnd.dvb.ipdcdftnotifaccess +application/vnd.dvb.ipdcesgaccess +application/vnd.dvb.ipdcesgaccess2 +application/vnd.dvb.ipdcesgpdd +application/vnd.dvb.ipdcroaming +application/vnd.dvb.iptv.alfec-base +application/vnd.dvb.iptv.alfec-enhancement +application/vnd.dvb.notif-aggregate-root+xml +application/vnd.dvb.notif-container+xml +application/vnd.dvb.notif-generic+xml +application/vnd.dvb.notif-ia-msglist+xml +application/vnd.dvb.notif-ia-registration-request+xml +application/vnd.dvb.notif-ia-registration-response+xml +application/vnd.dvb.notif-init+xml +# pfr: application/font-tdpfr +application/vnd.dvb.pfr +application/vnd.dvb.service svc +# dxr: application/x-director +application/vnd.dxr +application/vnd.dynageo geo +application/vnd.easykaraoke.cdgdownload +application/vnd.ecdis-update +application/vnd.ecowin.chart mag +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.ericsson.quickcall qcall qca +application/vnd.eszigno3+xml es3 et3 +application/vnd.etsi.aoc+xml +application/vnd.etsi.cug+xml +application/vnd.etsi.iptvcommand+xml +application/vnd.etsi.iptvdiscovery+xml +application/vnd.etsi.iptvprofile+xml +application/vnd.etsi.iptvsad-bc+xml +application/vnd.etsi.iptvsad-cod+xml +application/vnd.etsi.iptvsad-npvr+xml +application/vnd.etsi.iptvservice+xml +application/vnd.etsi.iptvsync+xml +application/vnd.etsi.iptvueprofile+xml +application/vnd.etsi.mcid+xml +application/vnd.etsi.overload-control-policy-dataset+xml +application/vnd.etsi.sci+xml +application/vnd.etsi.simservs+xml +application/vnd.etsi.tsl.der +application/vnd.etsi.tsl+xml +application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed msd mseed +application/vnd.fdsn.seed seed dataless +application/vnd.ffsns +# all extensions: application/vnd.hbci +application/vnd.fints +application/vnd.FloGraphIt gph +application/vnd.fluxtime.clip ftc +application/vnd.font-fontforge-sfd sfd +application/vnd.framemaker fm +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.ART-EX +application/vnd.fujixerox.ART4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fujixerox.HBPL +application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geocube+xml g3 g? +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +application/vnd.globalplatform.card-content-mgt +application/vnd.globalplatform.card-content-mgt-response +# application/vnd.gmx deprecated 2009-03-04 +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.HandHeld-Entertainment+xml zmm +application/vnd.hbci hbci hbc kom upa pkd bpd +# rep: application/vnd.businessobjects +application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-HPGL hpgl +application/vnd.hp-hpid hpi hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-PCL pcl +application/vnd.hp-PCLXL +application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.hzn-3d-crossword x3d +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media emm +application/vnd.ibm.MiniPay mpy +application/vnd.ibm.modcap list3820 listafp afp pseg3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary obsoleted by application/vnd.visionary +application/vnd.infotech.project +application/vnd.infotech.project+xml +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.iptc.g2.conceptitem+xml +application/vnd.iptc.g2.knowledgeitem+xml +application/vnd.iptc.g2.newsitem+xml +application/vnd.iptc.g2.packageitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.Kinar kne knp sdf +application/vnd.koan skp skd skm skt +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 wk4 wk3 wk1 +application/vnd.lotus-approach apr vew +application/vnd.lotus-freelance prz pre +application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg +application/vnd.lotus-organizer or3 or2 org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp sam +application/vnd.macports.portpkg portpkg +application/vnd.marlin.drm.actiontoken+xml +application/vnd.marlin.drm.conftoken+xml +application/vnd.marlin.drm.license+xml +application/vnd.marlin.drm.mdcf mdc +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.meridian-slingshot +application/vnd.MFER mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.Mobius.DAF daf +application/vnd.Mobius.DIS dis +application/vnd.Mobius.MBK mbk +application/vnd.Mobius.MQY mqy +application/vnd.Mobius.MSL msl +application/vnd.Mobius.PLC plc +application/vnd.Mobius.TXF txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-asf asf +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xls +application/vnd.ms-excel.template.macroEnabled.12 xltm +application/vnd.ms-excel.addin.macroEnabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb +application/vnd.ms-excel.sheet.macroEnabled.12 xlsm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-office.activeX+xml +application/vnd.ms-officetheme thmx +application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt +application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm +application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm +application/vnd.ms-powerpoint.template.macroEnabled.12 potm +application/vnd.ms-project mpp +application/vnd.ms-tnef tnef tnf +application/vnd.ms-wmdrm.lic-chlg-req +application/vnd.ms-wmdrm.lic-resp +application/vnd.ms-wmdrm.meter-chlg-req +application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroEnabled.12 docm +application/vnd.ms-word.template.macroEnabled.12 dotm +application/vnd.ms-works wcm wdb wks wps +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.msign +application/vnd.multiad.creator crtr +application/vnd.multiad.creator.cif cif +application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.ncd.control +application/vnd.ncd.reference +application/vnd.nervana entity request bkm kcm +application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.catalogs +application/vnd.nokia.conml+wbxml +application/vnd.nokia.conml+xml +application/vnd.nokia.iptv.config+xml +application/vnd.nokia.iSDS-radio-presets +application/vnd.nokia.landmark+wbxml +application/vnd.nokia.landmark+xml +application/vnd.nokia.landmarkcollection+xml +application/vnd.nokia.n-gage.ac+xml ac +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.ncd +application/vnd.nokia.pcd+wbxml +application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.EDM edm +application/vnd.novadigm.EDX edx +application/vnd.novadigm.EXT ext +application/vnd.ntt-local.file-transfer +application/vnd.ntt-local.sip-ta_remote +application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template otf +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.obn +application/vnd.oipf.contentaccessdownload+xml +application/vnd.oipf.contentaccessstreaming+xml +application/vnd.oipf.cspg-hexbinary +application/vnd.oipf.dae.svg+xml +application/vnd.oipf.dae.xhtml+xml +application/vnd.oipf.mippvcontrolmessage+xml +application/vnd.oipf.pae.gem +application/vnd.oipf.spdiscovery+xml +application/vnd.oipf.spdlist+xml +application/vnd.oipf.ueprofile+xml +application/vnd.olpc-sugar xo +application/vnd.oma.bcast.associated-procedure-parameter+xml +application/vnd.oma.bcast.drm-trigger+xml +application/vnd.oma.bcast.imd+xml +application/vnd.oma.bcast.ltkm +application/vnd.oma.bcast.notification+xml +application/vnd.oma.bcast.provisioningtrigger +application/vnd.oma.bcast.sgboot +application/vnd.oma.bcast.sgdd+xml +application/vnd.oma.bcast.sgdu +application/vnd.oma.bcast.simple-symbol-container +application/vnd.oma.bcast.smartcard-trigger+xml +application/vnd.oma.bcast.sprov+xml +application/vnd.oma.bcast.stkm +application/vnd.oma.cab-address-book+xml +application/vnd.oma.cab-feature-handler+xml +application/vnd.oma.cab-pcc+xml +application/vnd.oma.cab-user-prefs+xml +application/vnd.oma.dcd +application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +application/vnd.oma.drm.risd+xml +application/vnd.oma.group-usage-list+xml +application/vnd.oma.poc.detailed-progress-report+xml +application/vnd.oma.poc.final-report+xml +application/vnd.oma.poc.groups+xml +application/vnd.oma.poc.invocation-descriptor+xml +application/vnd.oma.poc.optimized-progress-report+xml +application/vnd.oma.push +application/vnd.oma.scidm.messages+xml +application/vnd.oma.xcap-directory+xml +application/vnd.oma-scws-config +application/vnd.oma-scws-http-request +application/vnd.oma-scws-http-response +application/vnd.omads-email+xml +application/vnd.omads-file+xml +application/vnd.omads-folder+xml +application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.custom-properties+xml +application/vnd.openxmlformats-officedocument.customXmlProperties+xml +application/vnd.openxmlformats-officedocument.drawing+xml +application/vnd.openxmlformats-officedocument.drawingml.chart+xml +application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml +application/vnd.openxmlformats-officedocument.extended-properties+xml +application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml +application/vnd.openxmlformats-officedocument.presentationml.comments+xml +application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml +application/vnd.openxmlformats-officedocument.presentationml.presProps+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slide+xml +application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml +application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml +application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +application/vnd.openxmlformats-officedocument.theme+xml +application/vnd.openxmlformats-officedocument.themeOverride+xml +application/vnd.openxmlformats-officedocument.vmlDrawing +application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml +application/vnd.openxmlformats-package.core-properties+xml +application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +application/vnd.openxmlformats-package.relationships+xml +application/vnd.osa.netdeploy ndc +application/vnd.osgeo.mapguide.package mgp +# jar: application/x-java-archive +application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.otps.ct-kip+xml +application/vnd.palm prc pdb pqa oprc +application/vnd.paos+xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.piaccess.application-license pil +application/vnd.picsel efif +application/vnd.pmi.widget wg +application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.preminet preminet +application/vnd.previewsystems.box box vbox +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +# pti: image/prs.pti +application/vnd.pvi.ptid1 ptid +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.qualcomm.brew-app-res bar +application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb +application/vnd.quobject-quoxdocument quox quiz +application/vnd.radisys.moml+xml +application/vnd.radisys.msml-audit-conf+xml +application/vnd.radisys.msml-audit-conn+xml +application/vnd.radisys.msml-audit-dialog+xml +application/vnd.radisys.msml-audit-stream+xml +application/vnd.radisys.msml-audit+xml +application/vnd.radisys.msml-conf+xml +application/vnd.radisys.msml-dialog-base+xml +application/vnd.radisys.msml-dialog-fax-detect+xml +application/vnd.radisys.msml-dialog-fax-sendrecv+xml +application/vnd.radisys.msml-dialog-group+xml +application/vnd.radisys.msml-dialog-speech+xml +application/vnd.radisys.msml-dialog-transform+xml +application/vnd.radisys.msml-dialog+xml +application/vnd.radisys.msml+xml +application/vnd.rainstor.data tree +application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml +application/vnd.RenLearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.route66.link66+xml link66 +application/vnd.ruckus.download +application/vnd.s3sms +application/vnd.sailingtracker.track st +application/vnd.sbm.cid +application/vnd.sbm.mid2 +application/vnd.scribus scd sla slaz +application/vnd.sealed.3df s3df +application/vnd.sealed.csf scsf +application/vnd.sealed.doc sdoc sdo s1w +application/vnd.sealed.eml seml sem +application/vnd.sealed.mht smht smh +application/vnd.sealed.net +# spp: application/scvp-vp-response +application/vnd.sealed.ppt sppt s1p +application/vnd.sealed.tiff stif +application/vnd.sealed.xls sxls sxl s1e +# stm: audio/x-stm +application/vnd.sealedmedia.softseal.html stml s1h +application/vnd.sealedmedia.softseal.pdf spdf spd s1a +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.SimTech-MindMapper twd twds +application/vnd.smaf mmf +application/vnd.smart.notebook notebook +application/vnd.smart.teacher teacher +application/vnd.software602.filler.form+xml fo +application/vnd.software602.filler.form-xml-zip zfo +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stepmania.stepchart sm +application/vnd.street-stream +application/vnd.sun.wadl+xml wadl +application/vnd.sus-calendar sus susp +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.syncml.dm.notification +application/vnd.syncml.ds.notification +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.syncml+xml xsm +application/vnd.tao.intent-module-archive tao +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.truedoc +# cab: application/vnd.ms-cab-compressed +application/vnd.ubisoft.webplayer +application/vnd.ufdl ufdl ufd frm +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml uo +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx vcx +# sxi: application/vnd.sun.xml.impress +application/vnd.vd-study mxi study-inter model-inter +# mcd: application/vnd.mcd +application/vnd.vectorworks vwx +application/vnd.verimatrix.vcas +application/vnd.vidsoft.vidconference vsc +application/vnd.visio vsd vst vsw vss +application/vnd.visionary vis +# vsc: application/vnd.vidsoft.vidconference +application/vnd.vividence.scriptfile +application/vnd.vsf vsf +application/vnd.wap.sic sic +application/vnd.wap.slc slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wfa.wsc wsc +application/vnd.wmc wmc +application/vnd.wmf.bootstrap +# nb: application/mathematica for now +application/vnd.wolfram.mathematica +application/vnd.wolfram.mathematica.package m +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +application/vnd.wv.csp+xml +application/vnd.wv.csp+wbxml wv +application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl xfd +application/vnd.xfdl.webform +application/vnd.xmi+xml +application/vnd.xmpie.cpkg cpkg +application/vnd.xmpie.dpkg dpkg +# dpkg: application/vnd.xmpie.dpkg +application/vnd.xmpie.plan +application/vnd.xmpie.ppkg ppkg +application/vnd.xmpie.xlim xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml +application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/vq-rtcp-xr +application/watcherinfo+xml wif +application/whoispp-query +application/whoispp-response +application/widget wgt +application/wita +application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x400-bp +application/xcap-att+xml xav +application/xcap-caps+xml xca +application/xcap-diff+xml xdf +application/xcap-el+xml xel +application/xcap-error+xml xer +application/xcap-ns+xml xns +application/xcon-conference-info-diff+xml +application/xcon-conference-info+xml +application/xenc+xml +application/xhtml+xml xhtml xhtm xht +# application/xhtml-voice+xml obsoleted by application/xv+xml +# xml, xsd, rng: text/xml +application/xml +# mod: audio/x-mod +application/xml-dtd dtd +# ent: text/xml-external-parsed-entity +application/xml-external-parsed-entity +application/xmpp+xml +application/xop+xml xop +application/xslt+xml xsl xslt +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +audio/1d-interleaved-parityfec +audio/32kadpcm 726 +# 3gp, 3gpp: video/3gpp +audio/3gpp +# 3g2, 3gpp2: video/3gpp2 +audio/3gpp2 +audio/ac3 ac3 +audio/AMR amr +audio/AMR-WB awb +audio/amr-wb+ +audio/asc acn +# aa3, omg: audio/ATRAC3 +audio/ATRAC-ADVANCED-LOSSLESS aal +# aa3, omg: audio/ATRAC3 +audio/ATRAC-X atx +audio/ATRAC3 at3 aa3 omg +audio/basic au snd +audio/BV16 +audio/BV32 +audio/clearmode +audio/CN +audio/DAT12 +audio/dls dls +audio/dsr-es201108 +audio/dsr-es202050 +audio/dsr-es202211 +audio/dsr-es202212 +audio/DVI4 +audio/eac3 +audio/EVRC evc +# qcp: audio/qcelp +audio/EVRC-QCP +audio/EVRC0 +audio/EVRC1 +audio/EVRCB evb +audio/EVRCB0 +audio/EVRCWB evw +audio/EVRCWB0 +audio/EVRCWB1 +audio/G719 +audio/G722 +audio/G7221 +audio/G723 +audio/G726-16 +audio/G726-24 +audio/G726-32 +audio/G726-40 +audio/G728 +audio/G729 +audio/G7291 +audio/G729D +audio/G729E +audio/GSM +audio/GSM-EFR +audio/GSM-HR-08 +audio/iLBC lbc +audio/ip-mr_v2.5 +# wav: audio/wav +audio/L16 l16 +audio/L20 +audio/L24 +audio/L8 +audio/LPC +audio/mobile-xmf mxmf +# mp4, mpg4: video/mp4, see RFC 4337 +audio/mp4 +audio/MP4A-LATM +audio/MPA +audio/mpa-robust +audio/mpeg mp3 mpga mp1 mp2 +audio/mpeg4-generic +audio/ogg oga ogg spx +audio/parityfec +audio/PCMA +audio/PCMA-WB +audio/PCMU +audio/PCMU-WB +audio/prs.sid sid psid +audio/qcelp qcp +audio/RED +audio/rtp-enc-aescm128 +audio/rtp-midi +audio/rtx +audio/SMV smv +# qcp: audio/qcelp, see RFC 3625 +audio/SMV-QCP +audio/SMV0 +# mid: audio/midi +audio/sp-midi +audio/speex +audio/t140c +audio/t38 +audio/telephone-event +audio/tone +audio/UEMCLIP +audio/ulpfec +audio/VDVI +audio/VMR-WB +audio/vnd.3gpp.iufp +audio/vnd.4SB +audio/vnd.audikoz koz +audio/vnd.CELP +audio/vnd.cisco.nse +audio/vnd.cmles.radio-events +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +audio/vnd.dlna.adts +audio/vnd.dolby.heaac.1 +audio/vnd.dolby.heaac.2 +audio/vnd.dolby.mlp mlp +audio/vnd.dolby.mps +audio/vnd.dolby.pl2 +audio/vnd.dolby.pl2x +audio/vnd.dolby.pl2z +audio/vnd.dolby.pulse.1 +audio/vnd.dra +# wav: audio/wav, cpt: application/mac-compactpro +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.dvb.file dvb +audio/vnd.everad.plj plj +# rm: audio/x-pn-realaudio +audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# mxmf: audio/mobile-xmf +audio/vnd.nokia.mobile-xmf +audio/vnd.nortel.vbk vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.octel.sbc +# audio/vnd.qcelp deprecated in favour of audio/qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m +audio/vnd.vmx.cvsd +audio/vorbis +audio/vorbis-config +image/cgm +image/fits fits fit fts +image/g3fax +image/gif gif +image/ief ief +image/jp2 jp2 jpg2 +image/jpeg jpg jpeg jpe jfif +image/jpm jpm jpgm +image/jpx jpx jpf +image/ktx ktx +image/naplps +image/png png +image/prs.btif btif btf +image/prs.pti pti +image/svg+xml svg svgz +image/t38 t38 +image/tiff tiff tif +image/tiff-fx tfx +image/vnd.adobe.photoshop psd +image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.globalgraphics.pgb pgb +image/vnd.microsoft.icon ico +image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.net-fpx +image/vnd.radiance hdr rgbe xyze +image/vnd.sealed.png spng spn s1n +image/vnd.sealedmedia.softseal.gif sgif sgi s1g +image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +message/CPIM +message/delivery-status +message/disposition-notification +message/external-body +message/feedback-report +message/global u8msg +message/global-delivery-status u8dsn +message/global-disposition-notification u8mdn +message/global-headers u8hdr +message/http +# cl: application/simple-filter+xml +message/imdn+xml +# message/news obsoleted by message/rfc822 +message/partial +message/rfc822 eml mail art +message/s-http +message/sip +message/sipfrag +message/tracking-status +message/vnd.si.simp +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# 3dml, 3dm: text/vnd.in3d.3dml +model/vnd.flatland.3dml +model/vnd.gdl gdl gsm win dor lmp rsm msm ism +model/vnd.gs-gdl +model/vnd.gtw gtw +model/vnd.moml+xml moml +model/vnd.mts mts +model/vnd.parasolid.transmit.binary x_b xmt_bin +model/vnd.parasolid.transmit.text x_t xmt_txt +model/vnd.vtu vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message vpm +text/1d-interleaved-parityfec +text/calendar ics ifb +text/css css +text/csv csv +text/directory +text/dns soa zone +# text/ecmascript obsoleted by application/ecmascript +text/enriched +text/html html htm +# text/javascript obsoleted by application/javascript +text/n3 n3 +text/parityfec +text/plain txt asc text pm el c h cc hh cxx hxx f90 +text/prs.fallenstein.rst rst +text/prs.lines.tag tag dsc +text/RED +text/rfc822-headers +text/richtext rtx +# rtf: application/rtf +text/rtf +text/rtp-enc-aescm128 +text/rtx +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/troff +text/turtle ttl +text/ulpfec +text/uri-list uris uri +text/vnd.abc abc +# curl: application/vnd.curl +text/vnd.curl +text/vnd.DMClientScript dms +text/vnd.esmertec.theme-descriptor jtd +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv dot +text/vnd.in3d.3dml 3dml 3dm +text/vnd.in3d.spot spot spo +text/vnd.IPTC.NewsML +text/vnd.IPTC.NITF +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage mpf +text/vnd.net2phone.commcenter.command ccc +text/vnd.radisys.msml-basic-layout +text/vnd.si.uricatalogue uric +text/vnd.sun.j2me.app-descriptor jad +text/vnd.trolltech.linguist ts +text/vnd.wap.si si +text/vnd.wap.sl sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/xml xml xsd rng +text/xml-external-parsed-entity ent +video/1d-interleaved-parityfec +video/3gpp 3gp 3gpp +video/3gpp2 3g2 3gpp2 +video/3gpp-tt +video/BMPEG +video/BT656 +video/CelB +video/DV +video/H261 +video/H263 +video/H263-1998 +video/H263-2000 +video/H264 +video/H264-RCDO +video/H264-SVC +video/JPEG +video/jpeg2000 +video/mj2 mj2 mjp2 +video/MP1S +video/MP2P +video/MP2T +video/mp4 mp4 mpg4 +video/MP4V-ES +video/mpeg mpeg mpg mpe +video/mpeg4-generic +video/MPV +video/nv +video/ogg ogv +video/parityfec +video/pointer +video/quicktime mov qt +video/raw +video/rtp-enc-aescm128 +video/rtx +video/SMPTE292M +video/ulpfec +video/vc1 +video/vnd.CCTV +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +video/vnd.dece.mp4 uvu uvvu +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +video/vnd.directv.mpeg +video/vnd.directv.mpeg-tts +video/vnd.dlna.mpeg-tts +video/vnd.fvt fvt +# rm: audio/x-pn-realaudio +video/vnd.hns.video +video/vnd.iptvforum.1dparityfec-1010 +video/vnd.iptvforum.1dparityfec-2005 +video/vnd.iptvforum.2dparityfec-1010 +video/vnd.iptvforum.2dparityfec-2005 +video/vnd.iptvforum.ttsavc +video/vnd.iptvforum.ttsmpeg2 +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +video/vnd.nokia.interleaved-multimedia nim +video/vnd.nokia.videovoip +# mp4: video/mp4 +video/vnd.objectvideo +video/vnd.sealed.mpeg1 smpg s11 +# smpg: video/vnd.sealed.mpeg1 +video/vnd.sealed.mpeg4 s14 +video/vnd.sealed.swf sswf ssw +video/vnd.sealedmedia.softseal.mov smov smo s1q +# uvu, uvvu: video/vnd.dece.mp4 +video/vnd.uvvu.mp4 +video/vnd.vivo + +# Non-IANA types + +application/epub+zip epub +application/mac-compactpro cpt +application/metalink+xml metalink +application/rss+xml rss +application/vnd.android.package-archive apk +application/vnd.oma.dd+xml dd +application/vnd.oma.drm.content dcf +# odf: application/vnd.oasis.opendocument.formula +application/vnd.oma.drm.dcf o4a o4v +application/vnd.oma.drm.message dm +application/vnd.oma.drm.rights+wbxml drc +application/vnd.oma.drm.rights+xml dr +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.symbian.install sis +application/vnd.wap.mms-message mms +application/x-annodex anx +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-bzip2 bz2 +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip gz tgz +application/x-hdf hdf +application/x-java-archive jar +application/x-java-jnlp-file jnlp +application/x-java-pack200 pack +application/x-killustrator kil +application/x-latex latex +application/x-netcdf nc cdf +application/x-perl pl +application/x-rpm rpm +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man 1 2 3 4 5 6 7 8 +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x-xpinstall xpi +application/x-xspf+xml xspf +application/x-xz xz +audio/midi mid midi kar +audio/x-aiff aif aiff aifc +audio/x-annodex axa +audio/x-flac flac +audio/x-mod mod ult uni m15 mtm 669 med +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram rm +audio/x-realaudio ra +audio/x-s3m s3m +audio/x-stm stm +audio/x-wav wav +chemical/x-xyz xyz +image/bmp bmp +image/x-cmu-raster ras +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-targa tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +text/cache-manifest manifest +text/html-sandboxed sandboxed +text/x-pod pod +text/x-setext etx +text/x-vcard vcf +video/webm webm +video/x-annodex axv +video/x-flv flv +video/x-javafx fxm +video/x-ms-asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice +x-epoc/x-sisx-app sisx diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -1,7 +1,8 @@ +import io +import locale import mimetypes -import io +import sys import unittest -import sys from test import support @@ -62,6 +63,18 @@ all = self.db.guess_all_extensions('image/jpg', strict=True) eq(all, []) + def test_encoding(self): + getpreferredencoding = locale.getpreferredencoding + self.addCleanup(setattr, locale, 'getpreferredencoding', + getpreferredencoding) + locale.getpreferredencoding = lambda: 'ascii' + + filename = support.findfile("mime.types") + mimes = mimetypes.MimeTypes([filename]) + exts = mimes.guess_all_extensions('application/vnd.geocube+xml', + strict=True) + self.assertEqual(exts, ['.g3', '.g\xb3']) + @unittest.skipUnless(sys.platform.startswith("win"), "Windows only") class Win32MimeTypesTestCase(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Library ------- +- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, + instead of the locale encoding. + - Issue #10653: On Windows, use strftime() instead of wcsftime() because wcsftime() doesn't format time zone correctly. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 03:04:25 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 14 Oct 2011 03:04:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28Merge_3=2E2=29_Issue_=2313025=3A_mimetypes_is_now_reading?= =?utf8?q?_MIME_types_using_the_UTF-8?= Message-ID: http://hg.python.org/cpython/rev/2c223d686feb changeset: 72922:2c223d686feb parent: 72920:79e60977fc04 parent: 72921:8d8ab3e04363 user: Victor Stinner date: Fri Oct 14 03:05:10 2011 +0200 summary: (Merge 3.2) Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, instead of the locale encoding. files: Lib/mimetypes.py | 2 +- Lib/test/mime.types | 1445 ++++++++++++++++++++++++ Lib/test/test_mimetypes.py | 17 +- Misc/NEWS | 3 + 4 files changed, 1464 insertions(+), 3 deletions(-) diff --git a/Lib/mimetypes.py b/Lib/mimetypes.py --- a/Lib/mimetypes.py +++ b/Lib/mimetypes.py @@ -199,7 +199,7 @@ list of standard types, else to the list of non-standard types. """ - with open(filename) as fp: + with open(filename, encoding='utf-8') as fp: self.readfp(fp, strict) def readfp(self, fp, strict=True): diff --git a/Lib/test/mime.types b/Lib/test/mime.types new file mode 100644 --- /dev/null +++ b/Lib/test/mime.types @@ -0,0 +1,1445 @@ +# This is a comment. I love comments. -*- indent-tabs-mode: t -*- + +# This file controls what Internet media types are sent to the client for +# given file extension(s). Sending the correct media type to the client +# is important so they know how to handle the content of the file. +# Extra types can either be added here or by using an AddType directive +# in your config files. For more information about Internet media types, +# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type +# registry is at . + +# IANA types + +# MIME type Extensions +application/1d-interleaved-parityfec +application/3gpp-ims+xml +application/activemessage +application/andrew-inset ez +application/applefile +application/atom+xml atom +application/atomcat+xml atomcat +application/atomicmail +application/atomsvc+xml atomsvc +application/auth-policy+xml apxml +application/batch-SMTP +application/beep+xml +application/cals-1840 +application/ccxml+xml ccxml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +application/cea-2018+xml +application/cellml+xml cellml cml +application/cfw +application/cnrp+xml +application/commonground +application/conference-info+xml +application/cpl+xml cpl +application/csta+xml +application/CSTAdata+xml +application/cybercash +application/davmount+xml davmount +application/dca-rft +application/dec-dx +application/dialog-info+xml +application/dicom dcm +application/dns +application/dskpp+xml xmls +application/dssc+der dssc +application/dssc+xml xdssc +application/dvcs dvc +application/ecmascript +application/EDI-Consent +application/EDI-X12 +application/EDIFACT +application/emma+xml emma +application/epp+xml +application/eshop +application/exi exi +application/fastinfoset finf +application/fastsoap +# fits, fit, fts: image/fits +application/fits +application/font-tdpfr pfr +application/framework-attributes+xml +application/H224 +application/hal+xml hal +application/held+xml +application/http +application/hyperstudio stk +application/ibe-key-request+xml +application/ibe-pkg-reply+xml +application/ibe-pp-data +application/iges +application/im-iscomposing+xml +application/index +application/index.cmd +application/index.obj +application/index.response +application/index.vnd +application/iotp +application/ipfix ipfix +application/ipp +application/isup +application/javascript js +application/json json +application/kpml-request+xml +application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica nb ma mb +application/mathml-content+xml +application/mathml-presentation+xml +application/mathml+xml mml +application/mbms-associated-procedure-description+xml +application/mbms-deregister+xml +application/mbms-envelope+xml +application/mbms-msk-response+xml +application/mbms-msk+xml +application/mbms-protection-description+xml +application/mbms-reception-report+xml +application/mbms-register-response+xml +application/mbms-register+xml +application/mbms-user-service-description+xml +application/mbox mbox +application/media_control+xml +application/mediaservercontrol+xml +application/metalink4+xml meta4 +application/mets+xml mets +application/mikey +application/mods+xml mods +application/moss-keys +application/moss-signature +application/mosskey-data +application/mosskey-request +application/mp21 m21 mp21 +# mp4, mpg4: video/mp4, see RFC 4337 +application/mp4 +application/mpeg4-generic +application/mpeg4-iod +application/mpeg4-iod-xmt +application/msc-ivr+xml +application/msc-mixer+xml +application/msword doc +application/mxf mxf +application/nasdata +application/news-checkgroups +application/news-groupinfo +application/news-transmission +application/nss +application/ocsp-request orq +application/ocsp-response ors +application/octet-stream bin lha lzh exe class so dll img iso +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/parityfec +# xer: application/xcap-error+xml +application/patch-ops-error+xml +application/pdf pdf +application/pgp-encrypted +application/pgp-keys +application/pgp-signature sig +application/pidf-diff+xml +application/pidf+xml +application/pkcs10 p10 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +# ac: application/vnd.nokia.n-gage.ac+xml +application/pkix-attr-cert +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp +application/pls+xml pls +application/poc-settings+xml +application/postscript ps eps ai +application/prs.alvestrand.titrax-sheet +application/prs.cww cw cww +application/prs.nprend rnd rct +application/prs.plucker +application/prs.rdf-xml-crypt rdf-crypt +application/prs.xsf+xml xsf +application/pskc+xml pskcxml +application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +application/remote-printing +application/resource-lists-diff+xml rld +application/resource-lists+xml rl +application/riscos +application/rlmi+xml +application/rls-services+xml rs +application/rtf rtf +application/rtx +application/samlassertion+xml +application/samlmetadata+xml +application/sbml+xml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +application/set-payment +application/set-payment-initiation +application/set-registration +application/set-registration-initiation +application/sgml +application/sgml-open-catalog soc +application/shf+xml shf +application/sieve siv sieve +application/simple-filter+xml cl +application/simple-message-summary +application/simpleSymbolContainer +application/slate +# obsoleted by application/smil+xml +application/smil smil smi sml +# smil, smi: application/smil for now +application/smil+xml +application/soap+fastinfoset +application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssml+xml ssml +application/tamp-apex-update tau +application/tamp-apex-update-confirm auc +application/tamp-community-update tcu +application/tamp-community-update-confirm cuc +application/tamp-error ter +application/tamp-sequence-adjust tsa +application/tamp-sequence-adjust-confirm sac +# tsq: application/timestamp-query +application/tamp-status-query +# tsr: application/timestamp-reply +application/tamp-status-response +application/tamp-update tur +application/tamp-update-confirm tuc +application/tei+xml tei teiCorpus odd +application/thraud+xml tfi +application/timestamp-query tsq +application/timestamp-reply tsr +application/timestamped-data tsd +application/tve-trigger +application/ulpfec +application/vemmi +application/vnd.3gpp.bsf+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# sms: application/vnd.3gpp2.sms +application/vnd.3gpp.sms +application/vnd.3gpp2.bcmcsinfo+xml +application/vnd.3gpp2.sms sms +application/vnd.3gpp2.tcap tcap +application/vnd.3M.Post-it-Notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.fxp fxp fxpl +application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +application/vnd.aether.imp +application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.amundsen.maze+xml +application/vnd.anser-web-certificate-issue-initiation cii +# Not in IANA listing, but is on FTP site? +application/vnd.anser-web-funds-transfer-initiation fti +# atx: audio/ATRAC-X +application/vnd.antix.game-component +application/vnd.apple.installer+xml dist distz pkg mpkg +# m3u: application/x-mpegurl for now +application/vnd.apple.mpegurl m3u8 +application/vnd.aristanetworks.swi swi +application/vnd.audiograph aep +application/vnd.autopackage package +application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +application/vnd.bluetooth.ep.oob ep +application/vnd.bmi bmi +application/vnd.businessobjects rep +application/vnd.cab-jscript +application/vnd.canon-cpdl +application/vnd.canon-lips +application/vnd.cendio.thinlinc.clientconf tlclient +application/vnd.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# icc: application/vnd.iccprofile +application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8 +application/vnd.commonspace csp cst +application/vnd.contact.cmsg cdbcmsg +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +application/vnd.ctct.ws+xml +application/vnd.cups-pdf +application/vnd.cups-postscript +application/vnd.cups-ppd ppd +application/vnd.cups-raster +application/vnd.cups-raw +application/vnd.curl curl +application/vnd.cybank +application/vnd.data-vision.rdz rdz +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.denovo.fcselayout-link fe_launch +application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mobile.1 +application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg mwc dpgraph +application/vnd.dreamfactory dfac +application/vnd.dvb.ait ait +# class: application/octet-stream +application/vnd.dvb.dvbj +application/vnd.dvb.esgcontainer +application/vnd.dvb.ipdcdftnotifaccess +application/vnd.dvb.ipdcesgaccess +application/vnd.dvb.ipdcesgaccess2 +application/vnd.dvb.ipdcesgpdd +application/vnd.dvb.ipdcroaming +application/vnd.dvb.iptv.alfec-base +application/vnd.dvb.iptv.alfec-enhancement +application/vnd.dvb.notif-aggregate-root+xml +application/vnd.dvb.notif-container+xml +application/vnd.dvb.notif-generic+xml +application/vnd.dvb.notif-ia-msglist+xml +application/vnd.dvb.notif-ia-registration-request+xml +application/vnd.dvb.notif-ia-registration-response+xml +application/vnd.dvb.notif-init+xml +# pfr: application/font-tdpfr +application/vnd.dvb.pfr +application/vnd.dvb.service svc +# dxr: application/x-director +application/vnd.dxr +application/vnd.dynageo geo +application/vnd.easykaraoke.cdgdownload +application/vnd.ecdis-update +application/vnd.ecowin.chart mag +application/vnd.ecowin.filerequest +application/vnd.ecowin.fileupdate +application/vnd.ecowin.series +application/vnd.ecowin.seriesrequest +application/vnd.ecowin.seriesupdate +application/vnd.enliven nml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +application/vnd.ericsson.quickcall qcall qca +application/vnd.eszigno3+xml es3 et3 +application/vnd.etsi.aoc+xml +application/vnd.etsi.cug+xml +application/vnd.etsi.iptvcommand+xml +application/vnd.etsi.iptvdiscovery+xml +application/vnd.etsi.iptvprofile+xml +application/vnd.etsi.iptvsad-bc+xml +application/vnd.etsi.iptvsad-cod+xml +application/vnd.etsi.iptvsad-npvr+xml +application/vnd.etsi.iptvservice+xml +application/vnd.etsi.iptvsync+xml +application/vnd.etsi.iptvueprofile+xml +application/vnd.etsi.mcid+xml +application/vnd.etsi.overload-control-policy-dataset+xml +application/vnd.etsi.sci+xml +application/vnd.etsi.simservs+xml +application/vnd.etsi.tsl.der +application/vnd.etsi.tsl+xml +application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +application/vnd.f-secure.mobile +application/vnd.fdf fdf +application/vnd.fdsn.mseed msd mseed +application/vnd.fdsn.seed seed dataless +application/vnd.ffsns +# all extensions: application/vnd.hbci +application/vnd.fints +application/vnd.FloGraphIt gph +application/vnd.fluxtime.clip ftc +application/vnd.font-fontforge-sfd sfd +application/vnd.framemaker fm +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +application/vnd.fujixerox.ART-EX +application/vnd.fujixerox.ART4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +application/vnd.fujixerox.HBPL +application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +application/vnd.geocube+xml g3 g? +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +application/vnd.globalplatform.card-content-mgt +application/vnd.globalplatform.card-content-mgt-response +# application/vnd.gmx deprecated 2009-03-04 +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +application/vnd.grafeq gqf gqs +application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +application/vnd.HandHeld-Entertainment+xml zmm +application/vnd.hbci hbci hbc kom upa pkd bpd +# rep: application/vnd.businessobjects +application/vnd.hcl-bireports +application/vnd.hhe.lesson-player les +application/vnd.hp-HPGL hpgl +application/vnd.hp-hpid hpi hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-PCL pcl +application/vnd.hp-PCLXL +application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +application/vnd.hzn-3d-crossword x3d +application/vnd.ibm.afplinedata +application/vnd.ibm.electronic-media emm +application/vnd.ibm.MiniPay mpy +application/vnd.ibm.modcap list3820 listafp afp pseg3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary obsoleted by application/vnd.visionary +application/vnd.infotech.project +application/vnd.infotech.project+xml +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +application/vnd.intertrust.digibox +application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +application/vnd.iptc.g2.conceptitem+xml +application/vnd.iptc.g2.knowledgeitem+xml +application/vnd.iptc.g2.newsitem+xml +application/vnd.iptc.g2.packageitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +application/vnd.japannet-directory-service +application/vnd.japannet-jpnstore-wakeup +application/vnd.japannet-payment-wakeup +application/vnd.japannet-registration +application/vnd.japannet-registration-wakeup +application/vnd.japannet-setstore-wakeup +application/vnd.japannet-verification +application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.Kinar kne knp sdf +application/vnd.koan skp skd skm skt +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 wk4 wk3 wk1 +application/vnd.lotus-approach apr vew +application/vnd.lotus-freelance prz pre +application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg +application/vnd.lotus-organizer or3 or2 org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp sam +application/vnd.macports.portpkg portpkg +application/vnd.marlin.drm.actiontoken+xml +application/vnd.marlin.drm.conftoken+xml +application/vnd.marlin.drm.license+xml +application/vnd.marlin.drm.mdcf mdc +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +application/vnd.meridian-slingshot +application/vnd.MFER mwf +application/vnd.mfmp mfm +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +application/vnd.mif mif +application/vnd.minisoft-hp3000-save +application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.Mobius.DAF daf +application/vnd.Mobius.DIS dis +application/vnd.Mobius.MBK mbk +application/vnd.Mobius.MQY mqy +application/vnd.Mobius.MSL msl +application/vnd.Mobius.PLC plc +application/vnd.Mobius.TXF txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +application/vnd.motorola.flexsuite +application/vnd.motorola.flexsuite.adsi +application/vnd.motorola.flexsuite.fis +application/vnd.motorola.flexsuite.gotap +application/vnd.motorola.flexsuite.kmr +application/vnd.motorola.flexsuite.ttc +application/vnd.motorola.flexsuite.wem +application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +application/vnd.ms-artgalry cil +application/vnd.ms-asf asf +application/vnd.ms-cab-compressed cab +application/vnd.ms-excel xls +application/vnd.ms-excel.template.macroEnabled.12 xltm +application/vnd.ms-excel.addin.macroEnabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb +application/vnd.ms-excel.sheet.macroEnabled.12 xlsm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +application/vnd.ms-office.activeX+xml +application/vnd.ms-officetheme thmx +application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt +application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm +application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm +application/vnd.ms-powerpoint.template.macroEnabled.12 potm +application/vnd.ms-project mpp +application/vnd.ms-tnef tnef tnf +application/vnd.ms-wmdrm.lic-chlg-req +application/vnd.ms-wmdrm.lic-resp +application/vnd.ms-wmdrm.meter-chlg-req +application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroEnabled.12 docm +application/vnd.ms-word.template.macroEnabled.12 dotm +application/vnd.ms-works wcm wdb wks wps +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +application/vnd.mseq mseq +application/vnd.msign +application/vnd.multiad.creator crtr +application/vnd.multiad.creator.cif cif +application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.ncd.control +application/vnd.ncd.reference +application/vnd.nervana entity request bkm kcm +application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +application/vnd.nokia.catalogs +application/vnd.nokia.conml+wbxml +application/vnd.nokia.conml+xml +application/vnd.nokia.iptv.config+xml +application/vnd.nokia.iSDS-radio-presets +application/vnd.nokia.landmark+wbxml +application/vnd.nokia.landmark+xml +application/vnd.nokia.landmarkcollection+xml +application/vnd.nokia.n-gage.ac+xml ac +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +application/vnd.nokia.ncd +application/vnd.nokia.pcd+wbxml +application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.EDM edm +application/vnd.novadigm.EDX edx +application/vnd.novadigm.EXT ext +application/vnd.ntt-local.file-transfer +application/vnd.ntt-local.sip-ta_remote +application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template otf +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +application/vnd.obn +application/vnd.oipf.contentaccessdownload+xml +application/vnd.oipf.contentaccessstreaming+xml +application/vnd.oipf.cspg-hexbinary +application/vnd.oipf.dae.svg+xml +application/vnd.oipf.dae.xhtml+xml +application/vnd.oipf.mippvcontrolmessage+xml +application/vnd.oipf.pae.gem +application/vnd.oipf.spdiscovery+xml +application/vnd.oipf.spdlist+xml +application/vnd.oipf.ueprofile+xml +application/vnd.olpc-sugar xo +application/vnd.oma.bcast.associated-procedure-parameter+xml +application/vnd.oma.bcast.drm-trigger+xml +application/vnd.oma.bcast.imd+xml +application/vnd.oma.bcast.ltkm +application/vnd.oma.bcast.notification+xml +application/vnd.oma.bcast.provisioningtrigger +application/vnd.oma.bcast.sgboot +application/vnd.oma.bcast.sgdd+xml +application/vnd.oma.bcast.sgdu +application/vnd.oma.bcast.simple-symbol-container +application/vnd.oma.bcast.smartcard-trigger+xml +application/vnd.oma.bcast.sprov+xml +application/vnd.oma.bcast.stkm +application/vnd.oma.cab-address-book+xml +application/vnd.oma.cab-feature-handler+xml +application/vnd.oma.cab-pcc+xml +application/vnd.oma.cab-user-prefs+xml +application/vnd.oma.dcd +application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +application/vnd.oma.drm.risd+xml +application/vnd.oma.group-usage-list+xml +application/vnd.oma.poc.detailed-progress-report+xml +application/vnd.oma.poc.final-report+xml +application/vnd.oma.poc.groups+xml +application/vnd.oma.poc.invocation-descriptor+xml +application/vnd.oma.poc.optimized-progress-report+xml +application/vnd.oma.push +application/vnd.oma.scidm.messages+xml +application/vnd.oma.xcap-directory+xml +application/vnd.oma-scws-config +application/vnd.oma-scws-http-request +application/vnd.oma-scws-http-response +application/vnd.omads-email+xml +application/vnd.omads-file+xml +application/vnd.omads-folder+xml +application/vnd.omaloc-supl-init +application/vnd.openofficeorg.extension oxt +application/vnd.openxmlformats-officedocument.custom-properties+xml +application/vnd.openxmlformats-officedocument.customXmlProperties+xml +application/vnd.openxmlformats-officedocument.drawing+xml +application/vnd.openxmlformats-officedocument.drawingml.chart+xml +application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml +application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml +application/vnd.openxmlformats-officedocument.extended-properties+xml +application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml +application/vnd.openxmlformats-officedocument.presentationml.comments+xml +application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml +application/vnd.openxmlformats-officedocument.presentationml.presProps+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +application/vnd.openxmlformats-officedocument.presentationml.slide+xml +application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml +application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml +application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +application/vnd.openxmlformats-officedocument.theme+xml +application/vnd.openxmlformats-officedocument.themeOverride+xml +application/vnd.openxmlformats-officedocument.vmlDrawing +application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml +application/vnd.openxmlformats-package.core-properties+xml +application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +application/vnd.openxmlformats-package.relationships+xml +application/vnd.osa.netdeploy ndc +application/vnd.osgeo.mapguide.package mgp +# jar: application/x-java-archive +application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.otps.ct-kip+xml +application/vnd.palm prc pdb pqa oprc +application/vnd.paos+xml +application/vnd.pawaafile paw +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +application/vnd.piaccess.application-license pil +application/vnd.picsel efif +application/vnd.pmi.widget wg +application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +application/vnd.powerbuilder6-s +application/vnd.powerbuilder7 +application/vnd.powerbuilder7-s +application/vnd.powerbuilder75 +application/vnd.powerbuilder75-s +application/vnd.preminet preminet +application/vnd.previewsystems.box box vbox +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +# pti: image/prs.pti +application/vnd.pvi.ptid1 ptid +application/vnd.pwg-multiplexed +application/vnd.pwg-xhtml-print+xml +application/vnd.qualcomm.brew-app-res bar +application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb +application/vnd.quobject-quoxdocument quox quiz +application/vnd.radisys.moml+xml +application/vnd.radisys.msml-audit-conf+xml +application/vnd.radisys.msml-audit-conn+xml +application/vnd.radisys.msml-audit-dialog+xml +application/vnd.radisys.msml-audit-stream+xml +application/vnd.radisys.msml-audit+xml +application/vnd.radisys.msml-conf+xml +application/vnd.radisys.msml-dialog-base+xml +application/vnd.radisys.msml-dialog-fax-detect+xml +application/vnd.radisys.msml-dialog-fax-sendrecv+xml +application/vnd.radisys.msml-dialog-group+xml +application/vnd.radisys.msml-dialog-speech+xml +application/vnd.radisys.msml-dialog-transform+xml +application/vnd.radisys.msml-dialog+xml +application/vnd.radisys.msml+xml +application/vnd.rainstor.data tree +application/vnd.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml +application/vnd.RenLearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.route66.link66+xml link66 +application/vnd.ruckus.download +application/vnd.s3sms +application/vnd.sailingtracker.track st +application/vnd.sbm.cid +application/vnd.sbm.mid2 +application/vnd.scribus scd sla slaz +application/vnd.sealed.3df s3df +application/vnd.sealed.csf scsf +application/vnd.sealed.doc sdoc sdo s1w +application/vnd.sealed.eml seml sem +application/vnd.sealed.mht smht smh +application/vnd.sealed.net +# spp: application/scvp-vp-response +application/vnd.sealed.ppt sppt s1p +application/vnd.sealed.tiff stif +application/vnd.sealed.xls sxls sxl s1e +# stm: audio/x-stm +application/vnd.sealedmedia.softseal.html stml s1h +application/vnd.sealedmedia.softseal.pdf spdf spd s1a +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.SimTech-MindMapper twd twds +application/vnd.smaf mmf +application/vnd.smart.notebook notebook +application/vnd.smart.teacher teacher +application/vnd.software602.filler.form+xml fo +application/vnd.software602.filler.form-xml-zip zfo +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +application/vnd.sss-cod +application/vnd.sss-dtf +application/vnd.sss-ntf +application/vnd.stepmania.stepchart sm +application/vnd.street-stream +application/vnd.sun.wadl+xml wadl +application/vnd.sus-calendar sus susp +application/vnd.svd +application/vnd.swiftview-ics +application/vnd.syncml.dm.notification +application/vnd.syncml.ds.notification +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +application/vnd.syncml+xml xsm +application/vnd.tao.intent-module-archive tao +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +application/vnd.truedoc +# cab: application/vnd.ms-cab-compressed +application/vnd.ubisoft.webplayer +application/vnd.ufdl ufdl ufd frm +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml uo +application/vnd.uplanet.alert +application/vnd.uplanet.alert-wbxml +application/vnd.uplanet.bearer-choice +application/vnd.uplanet.bearer-choice-wbxml +application/vnd.uplanet.cacheop +application/vnd.uplanet.cacheop-wbxml +application/vnd.uplanet.channel +application/vnd.uplanet.channel-wbxml +application/vnd.uplanet.list +application/vnd.uplanet.list-wbxml +application/vnd.uplanet.listcmd +application/vnd.uplanet.listcmd-wbxml +application/vnd.uplanet.signal +application/vnd.vcx vcx +# sxi: application/vnd.sun.xml.impress +application/vnd.vd-study mxi study-inter model-inter +# mcd: application/vnd.mcd +application/vnd.vectorworks vwx +application/vnd.verimatrix.vcas +application/vnd.vidsoft.vidconference vsc +application/vnd.visio vsd vst vsw vss +application/vnd.visionary vis +# vsc: application/vnd.vidsoft.vidconference +application/vnd.vividence.scriptfile +application/vnd.vsf vsf +application/vnd.wap.sic sic +application/vnd.wap.slc slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +application/vnd.wfa.wsc wsc +application/vnd.wmc wmc +application/vnd.wmf.bootstrap +# nb: application/mathematica for now +application/vnd.wolfram.mathematica +application/vnd.wolfram.mathematica.package m +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +application/vnd.wv.csp+xml +application/vnd.wv.csp+wbxml wv +application/vnd.wv.ssp+xml +application/vnd.xara xar +application/vnd.xfdl xfdl xfd +application/vnd.xfdl.webform +application/vnd.xmi+xml +application/vnd.xmpie.cpkg cpkg +application/vnd.xmpie.dpkg dpkg +# dpkg: application/vnd.xmpie.dpkg +application/vnd.xmpie.plan +application/vnd.xmpie.ppkg ppkg +application/vnd.xmpie.xlim xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml +application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yamaha.tunnel-udpencap +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +application/vq-rtcp-xr +application/watcherinfo+xml wif +application/whoispp-query +application/whoispp-response +application/widget wgt +application/wita +application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x400-bp +application/xcap-att+xml xav +application/xcap-caps+xml xca +application/xcap-diff+xml xdf +application/xcap-el+xml xel +application/xcap-error+xml xer +application/xcap-ns+xml xns +application/xcon-conference-info-diff+xml +application/xcon-conference-info+xml +application/xenc+xml +application/xhtml+xml xhtml xhtm xht +# application/xhtml-voice+xml obsoleted by application/xv+xml +# xml, xsd, rng: text/xml +application/xml +# mod: audio/x-mod +application/xml-dtd dtd +# ent: text/xml-external-parsed-entity +application/xml-external-parsed-entity +application/xmpp+xml +application/xop+xml xop +application/xslt+xml xsl xslt +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +audio/1d-interleaved-parityfec +audio/32kadpcm 726 +# 3gp, 3gpp: video/3gpp +audio/3gpp +# 3g2, 3gpp2: video/3gpp2 +audio/3gpp2 +audio/ac3 ac3 +audio/AMR amr +audio/AMR-WB awb +audio/amr-wb+ +audio/asc acn +# aa3, omg: audio/ATRAC3 +audio/ATRAC-ADVANCED-LOSSLESS aal +# aa3, omg: audio/ATRAC3 +audio/ATRAC-X atx +audio/ATRAC3 at3 aa3 omg +audio/basic au snd +audio/BV16 +audio/BV32 +audio/clearmode +audio/CN +audio/DAT12 +audio/dls dls +audio/dsr-es201108 +audio/dsr-es202050 +audio/dsr-es202211 +audio/dsr-es202212 +audio/DVI4 +audio/eac3 +audio/EVRC evc +# qcp: audio/qcelp +audio/EVRC-QCP +audio/EVRC0 +audio/EVRC1 +audio/EVRCB evb +audio/EVRCB0 +audio/EVRCWB evw +audio/EVRCWB0 +audio/EVRCWB1 +audio/G719 +audio/G722 +audio/G7221 +audio/G723 +audio/G726-16 +audio/G726-24 +audio/G726-32 +audio/G726-40 +audio/G728 +audio/G729 +audio/G7291 +audio/G729D +audio/G729E +audio/GSM +audio/GSM-EFR +audio/GSM-HR-08 +audio/iLBC lbc +audio/ip-mr_v2.5 +# wav: audio/wav +audio/L16 l16 +audio/L20 +audio/L24 +audio/L8 +audio/LPC +audio/mobile-xmf mxmf +# mp4, mpg4: video/mp4, see RFC 4337 +audio/mp4 +audio/MP4A-LATM +audio/MPA +audio/mpa-robust +audio/mpeg mp3 mpga mp1 mp2 +audio/mpeg4-generic +audio/ogg oga ogg spx +audio/parityfec +audio/PCMA +audio/PCMA-WB +audio/PCMU +audio/PCMU-WB +audio/prs.sid sid psid +audio/qcelp qcp +audio/RED +audio/rtp-enc-aescm128 +audio/rtp-midi +audio/rtx +audio/SMV smv +# qcp: audio/qcelp, see RFC 3625 +audio/SMV-QCP +audio/SMV0 +# mid: audio/midi +audio/sp-midi +audio/speex +audio/t140c +audio/t38 +audio/telephone-event +audio/tone +audio/UEMCLIP +audio/ulpfec +audio/VDVI +audio/VMR-WB +audio/vnd.3gpp.iufp +audio/vnd.4SB +audio/vnd.audikoz koz +audio/vnd.CELP +audio/vnd.cisco.nse +audio/vnd.cmles.radio-events +audio/vnd.cns.anp1 +audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +audio/vnd.dlna.adts +audio/vnd.dolby.heaac.1 +audio/vnd.dolby.heaac.2 +audio/vnd.dolby.mlp mlp +audio/vnd.dolby.mps +audio/vnd.dolby.pl2 +audio/vnd.dolby.pl2x +audio/vnd.dolby.pl2z +audio/vnd.dolby.pulse.1 +audio/vnd.dra +# wav: audio/wav, cpt: application/mac-compactpro +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +audio/vnd.dvb.file dvb +audio/vnd.everad.plj plj +# rm: audio/x-pn-realaudio +audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# mxmf: audio/mobile-xmf +audio/vnd.nokia.mobile-xmf +audio/vnd.nortel.vbk vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +audio/vnd.octel.sbc +# audio/vnd.qcelp deprecated in favour of audio/qcelp +audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m +audio/vnd.vmx.cvsd +audio/vorbis +audio/vorbis-config +image/cgm +image/fits fits fit fts +image/g3fax +image/gif gif +image/ief ief +image/jp2 jp2 jpg2 +image/jpeg jpg jpeg jpe jfif +image/jpm jpm jpgm +image/jpx jpx jpf +image/ktx ktx +image/naplps +image/png png +image/prs.btif btif btf +image/prs.pti pti +image/svg+xml svg svgz +image/t38 t38 +image/tiff tiff tif +image/tiff-fx tfx +image/vnd.adobe.photoshop psd +image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +image/vnd.globalgraphics.pgb pgb +image/vnd.microsoft.icon ico +image/vnd.mix +image/vnd.ms-modi mdi +image/vnd.net-fpx +image/vnd.radiance hdr rgbe xyze +image/vnd.sealed.png spng spn s1n +image/vnd.sealedmedia.softseal.gif sgif sgi s1g +image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j +image/vnd.svf +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +message/CPIM +message/delivery-status +message/disposition-notification +message/external-body +message/feedback-report +message/global u8msg +message/global-delivery-status u8dsn +message/global-disposition-notification u8mdn +message/global-headers u8hdr +message/http +# cl: application/simple-filter+xml +message/imdn+xml +# message/news obsoleted by message/rfc822 +message/partial +message/rfc822 eml mail art +message/s-http +message/sip +message/sipfrag +message/tracking-status +message/vnd.si.simp +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# 3dml, 3dm: text/vnd.in3d.3dml +model/vnd.flatland.3dml +model/vnd.gdl gdl gsm win dor lmp rsm msm ism +model/vnd.gs-gdl +model/vnd.gtw gtw +model/vnd.moml+xml moml +model/vnd.mts mts +model/vnd.parasolid.transmit.binary x_b xmt_bin +model/vnd.parasolid.transmit.text x_t xmt_txt +model/vnd.vtu vtu +model/vrml wrl vrml +multipart/alternative +multipart/appledouble +multipart/byteranges +multipart/digest +multipart/encrypted +multipart/form-data +multipart/header-set +multipart/mixed +multipart/parallel +multipart/related +multipart/report +multipart/signed +multipart/voice-message vpm +text/1d-interleaved-parityfec +text/calendar ics ifb +text/css css +text/csv csv +text/directory +text/dns soa zone +# text/ecmascript obsoleted by application/ecmascript +text/enriched +text/html html htm +# text/javascript obsoleted by application/javascript +text/n3 n3 +text/parityfec +text/plain txt asc text pm el c h cc hh cxx hxx f90 +text/prs.fallenstein.rst rst +text/prs.lines.tag tag dsc +text/RED +text/rfc822-headers +text/richtext rtx +# rtf: application/rtf +text/rtf +text/rtp-enc-aescm128 +text/rtx +text/sgml sgml sgm +text/t140 +text/tab-separated-values tsv +text/troff +text/turtle ttl +text/ulpfec +text/uri-list uris uri +text/vnd.abc abc +# curl: application/vnd.curl +text/vnd.curl +text/vnd.DMClientScript dms +text/vnd.esmertec.theme-descriptor jtd +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv dot +text/vnd.in3d.3dml 3dml 3dm +text/vnd.in3d.spot spot spo +text/vnd.IPTC.NewsML +text/vnd.IPTC.NITF +text/vnd.latex-z +text/vnd.motorola.reflex +text/vnd.ms-mediapackage mpf +text/vnd.net2phone.commcenter.command ccc +text/vnd.radisys.msml-basic-layout +text/vnd.si.uricatalogue uric +text/vnd.sun.j2me.app-descriptor jad +text/vnd.trolltech.linguist ts +text/vnd.wap.si si +text/vnd.wap.sl sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/xml xml xsd rng +text/xml-external-parsed-entity ent +video/1d-interleaved-parityfec +video/3gpp 3gp 3gpp +video/3gpp2 3g2 3gpp2 +video/3gpp-tt +video/BMPEG +video/BT656 +video/CelB +video/DV +video/H261 +video/H263 +video/H263-1998 +video/H263-2000 +video/H264 +video/H264-RCDO +video/H264-SVC +video/JPEG +video/jpeg2000 +video/mj2 mj2 mjp2 +video/MP1S +video/MP2P +video/MP2T +video/mp4 mp4 mpg4 +video/MP4V-ES +video/mpeg mpeg mpg mpe +video/mpeg4-generic +video/MPV +video/nv +video/ogg ogv +video/parityfec +video/pointer +video/quicktime mov qt +video/raw +video/rtp-enc-aescm128 +video/rtx +video/SMPTE292M +video/ulpfec +video/vc1 +video/vnd.CCTV +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +video/vnd.dece.mp4 uvu uvvu +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +video/vnd.directv.mpeg +video/vnd.directv.mpeg-tts +video/vnd.dlna.mpeg-tts +video/vnd.fvt fvt +# rm: audio/x-pn-realaudio +video/vnd.hns.video +video/vnd.iptvforum.1dparityfec-1010 +video/vnd.iptvforum.1dparityfec-2005 +video/vnd.iptvforum.2dparityfec-1010 +video/vnd.iptvforum.2dparityfec-2005 +video/vnd.iptvforum.ttsavc +video/vnd.iptvforum.ttsmpeg2 +video/vnd.motorola.video +video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +video/vnd.nokia.interleaved-multimedia nim +video/vnd.nokia.videovoip +# mp4: video/mp4 +video/vnd.objectvideo +video/vnd.sealed.mpeg1 smpg s11 +# smpg: video/vnd.sealed.mpeg1 +video/vnd.sealed.mpeg4 s14 +video/vnd.sealed.swf sswf ssw +video/vnd.sealedmedia.softseal.mov smov smo s1q +# uvu, uvvu: video/vnd.dece.mp4 +video/vnd.uvvu.mp4 +video/vnd.vivo + +# Non-IANA types + +application/epub+zip epub +application/mac-compactpro cpt +application/metalink+xml metalink +application/rss+xml rss +application/vnd.android.package-archive apk +application/vnd.oma.dd+xml dd +application/vnd.oma.drm.content dcf +# odf: application/vnd.oasis.opendocument.formula +application/vnd.oma.drm.dcf o4a o4v +application/vnd.oma.drm.message dm +application/vnd.oma.drm.rights+wbxml drc +application/vnd.oma.drm.rights+xml dr +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.symbian.install sis +application/vnd.wap.mms-message mms +application/x-annodex anx +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-bzip2 bz2 +application/x-cdlink vcd +application/x-chess-pgn pgn +application/x-cpio cpio +application/x-csh csh +application/x-director dcr dir dxr +application/x-dvi dvi +application/x-futuresplash spl +application/x-gtar gtar +application/x-gzip gz tgz +application/x-hdf hdf +application/x-java-archive jar +application/x-java-jnlp-file jnlp +application/x-java-pack200 pack +application/x-killustrator kil +application/x-latex latex +application/x-netcdf nc cdf +application/x-perl pl +application/x-rpm rpm +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-stuffit sit +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-texinfo texinfo texi +application/x-troff t tr roff +application/x-troff-man man 1 2 3 4 5 6 7 8 +application/x-troff-me me +application/x-troff-ms ms +application/x-ustar ustar +application/x-wais-source src +application/x-xpinstall xpi +application/x-xspf+xml xspf +application/x-xz xz +audio/midi mid midi kar +audio/x-aiff aif aiff aifc +audio/x-annodex axa +audio/x-flac flac +audio/x-mod mod ult uni m15 mtm 669 med +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram rm +audio/x-realaudio ra +audio/x-s3m s3m +audio/x-stm stm +audio/x-wav wav +chemical/x-xyz xyz +image/bmp bmp +image/x-cmu-raster ras +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-targa tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +text/cache-manifest manifest +text/html-sandboxed sandboxed +text/x-pod pod +text/x-setext etx +text/x-vcard vcf +video/webm webm +video/x-annodex axv +video/x-flv flv +video/x-javafx fxm +video/x-ms-asf asx +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +x-conference/x-cooltalk ice +x-epoc/x-sisx-app sisx diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -1,7 +1,8 @@ +import io +import locale import mimetypes -import io +import sys import unittest -import sys from test import support @@ -62,6 +63,18 @@ all = self.db.guess_all_extensions('image/jpg', strict=True) eq(all, []) + def test_encoding(self): + getpreferredencoding = locale.getpreferredencoding + self.addCleanup(setattr, locale, 'getpreferredencoding', + getpreferredencoding) + locale.getpreferredencoding = lambda: 'ascii' + + filename = support.findfile("mime.types") + mimes = mimetypes.MimeTypes([filename]) + exts = mimes.guess_all_extensions('application/vnd.geocube+xml', + strict=True) + self.assertEqual(exts, ['.g3', '.g\xb3']) + @unittest.skipUnless(sys.platform.startswith("win"), "Windows only") class Win32MimeTypesTestCase(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -305,6 +305,9 @@ Library ------- +- Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, + instead of the locale encoding. + - Issue #10653: On Windows, use strftime() instead of wcsftime() because wcsftime() doesn't format time zone correctly. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 14 05:27:18 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 14 Oct 2011 05:27:18 +0200 Subject: [Python-checkins] Daily reference leaks (2c223d686feb): sum=0 Message-ID: results for 2c223d686feb on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogW1Y6v5', '-x'] From python-checkins at python.org Fri Oct 14 12:54:45 2011 From: python-checkins at python.org (lars.gustaebel) Date: Fri, 14 Oct 2011 12:54:45 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTU4?= =?utf8?q?=3A_Fix_decoding_and_encoding_of_base-256_number_fields_in_tarfi?= =?utf8?b?bGUu?= Message-ID: http://hg.python.org/cpython/rev/341008eab87d changeset: 72923:341008eab87d branch: 3.2 parent: 72921:8d8ab3e04363 user: Lars Gust?bel date: Fri Oct 14 12:46:40 2011 +0200 summary: Issue #13158: Fix decoding and encoding of base-256 number fields in tarfile. The nti() function that converts a number field from a tar header to a number failed to decode GNU tar specific base-256 fields. I also added support for decoding and encoding negative base-256 number fields. files: Lib/tarfile.py | 45 ++++++++++++++------------- Lib/test/test_tarfile.py | 24 ++++++++++++++- Misc/NEWS | 3 + 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -196,16 +196,18 @@ """ # There are two possible encodings for a number field, see # itn() below. - if s[0] != chr(0o200): + if s[0] in (0o200, 0o377): + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += s[i + 1] + if s[0] == 0o377: + n = -(256 ** (len(s) - 1) - n) + else: try: n = int(nts(s, "ascii", "strict") or "0", 8) except ValueError: raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) return n def itn(n, digits=8, format=DEFAULT_FORMAT): @@ -214,25 +216,26 @@ # POSIX 1003.1-1988 requires numbers to be encoded as a string of # octal digits followed by a null-byte, this allows values up to # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. + # that if necessary. A leading 0o200 or 0o377 byte indicate this + # particular encoding, the following digits-1 bytes are a big-endian + # base-256 representation. This allows values up to (256**(digits-1))-1. + # A 0o200 byte indicates a positive number, a 0o377 byte a negative + # number. if 0 <= n < 8 ** (digits - 1): s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL + elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1): + if n >= 0: + s = bytearray([0o200]) + else: + s = bytearray([0o377]) + n = 256 ** digits + n + + for i in range(digits - 1): + s.insert(1, n & 0o377) + n >>= 8 else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") + raise ValueError("overflow in number field") - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) return s def calc_chksums(buf): diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1582,9 +1582,31 @@ self.assertEqual(tarfile.nts(b"foo\0\0\0\0\0", "ascii", "strict"), "foo") self.assertEqual(tarfile.nts(b"foo\0bar\0", "ascii", "strict"), "foo") - def test_number_fields(self): + def test_read_number_fields(self): + # Issue 13158: Test if GNU tar specific base-256 number fields + # are decoded correctly. + self.assertEqual(tarfile.nti(b"0000001\x00"), 1) + self.assertEqual(tarfile.nti(b"7777777\x00"), 0o7777777) + self.assertEqual(tarfile.nti(b"\x80\x00\x00\x00\x00\x20\x00\x00"), 0o10000000) + self.assertEqual(tarfile.nti(b"\x80\x00\x00\x00\xff\xff\xff\xff"), 0xffffffff) + self.assertEqual(tarfile.nti(b"\xff\xff\xff\xff\xff\xff\xff\xff"), -1) + self.assertEqual(tarfile.nti(b"\xff\xff\xff\xff\xff\xff\xff\x9c"), -100) + self.assertEqual(tarfile.nti(b"\xff\x00\x00\x00\x00\x00\x00\x00"), -0x100000000000000) + + def test_write_number_fields(self): self.assertEqual(tarfile.itn(1), b"0000001\x00") + self.assertEqual(tarfile.itn(0o7777777), b"7777777\x00") + self.assertEqual(tarfile.itn(0o10000000), b"\x80\x00\x00\x00\x00\x20\x00\x00") self.assertEqual(tarfile.itn(0xffffffff), b"\x80\x00\x00\x00\xff\xff\xff\xff") + self.assertEqual(tarfile.itn(-1), b"\xff\xff\xff\xff\xff\xff\xff\xff") + self.assertEqual(tarfile.itn(-100), b"\xff\xff\xff\xff\xff\xff\xff\x9c") + self.assertEqual(tarfile.itn(-0x100000000000000), b"\xff\x00\x00\x00\x00\x00\x00\x00") + + def test_number_field_limits(self): + self.assertRaises(ValueError, tarfile.itn, -1, 8, tarfile.USTAR_FORMAT) + self.assertRaises(ValueError, tarfile.itn, 0o10000000, 8, tarfile.USTAR_FORMAT) + self.assertRaises(ValueError, tarfile.itn, -0x10000000001, 6, tarfile.GNU_FORMAT) + self.assertRaises(ValueError, tarfile.itn, 0x10000000000, 6, tarfile.GNU_FORMAT) class ContextManagerTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -43,6 +43,9 @@ Library ------- +- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number + fields in tarfile. + - Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, instead of the locale encoding. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 12:54:46 2011 From: python-checkins at python.org (lars.gustaebel) Date: Fri, 14 Oct 2011 12:54:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2=3A_Issue_=2313158=3A_Fix_decoding_and_encod?= =?utf8?q?ing_of_base-256_number?= Message-ID: http://hg.python.org/cpython/rev/158430b2b552 changeset: 72924:158430b2b552 parent: 72922:2c223d686feb parent: 72923:341008eab87d user: Lars Gust?bel date: Fri Oct 14 12:53:10 2011 +0200 summary: Merge with 3.2: Issue #13158: Fix decoding and encoding of base-256 number fields in tarfile. The nti() function that converts a number field from a tar header to a number failed to decode GNU tar specific base-256 fields. I also added support for decoding and encoding negative base-256 number fields. files: Lib/tarfile.py | 45 ++++++++++++++------------- Lib/test/test_tarfile.py | 24 ++++++++++++++- Misc/NEWS | 3 + 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -194,16 +194,18 @@ """ # There are two possible encodings for a number field, see # itn() below. - if s[0] != chr(0o200): + if s[0] in (0o200, 0o377): + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += s[i + 1] + if s[0] == 0o377: + n = -(256 ** (len(s) - 1) - n) + else: try: n = int(nts(s, "ascii", "strict") or "0", 8) except ValueError: raise InvalidHeaderError("invalid header") - else: - n = 0 - for i in range(len(s) - 1): - n <<= 8 - n += ord(s[i + 1]) return n def itn(n, digits=8, format=DEFAULT_FORMAT): @@ -212,25 +214,26 @@ # POSIX 1003.1-1988 requires numbers to be encoded as a string of # octal digits followed by a null-byte, this allows values up to # (8**(digits-1))-1. GNU tar allows storing numbers greater than - # that if necessary. A leading 0o200 byte indicates this particular - # encoding, the following digits-1 bytes are a big-endian - # representation. This allows values up to (256**(digits-1))-1. + # that if necessary. A leading 0o200 or 0o377 byte indicate this + # particular encoding, the following digits-1 bytes are a big-endian + # base-256 representation. This allows values up to (256**(digits-1))-1. + # A 0o200 byte indicates a positive number, a 0o377 byte a negative + # number. if 0 <= n < 8 ** (digits - 1): s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL + elif format == GNU_FORMAT and -256 ** (digits - 1) <= n < 256 ** (digits - 1): + if n >= 0: + s = bytearray([0o200]) + else: + s = bytearray([0o377]) + n = 256 ** digits + n + + for i in range(digits - 1): + s.insert(1, n & 0o377) + n >>= 8 else: - if format != GNU_FORMAT or n >= 256 ** (digits - 1): - raise ValueError("overflow in number field") + raise ValueError("overflow in number field") - if n < 0: - # XXX We mimic GNU tar's behaviour with negative numbers, - # this could raise OverflowError. - n = struct.unpack("L", struct.pack("l", n))[0] - - s = bytearray() - for i in range(digits - 1): - s.insert(0, n & 0o377) - n >>= 8 - s.insert(0, 0o200) return s def calc_chksums(buf): diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py --- a/Lib/test/test_tarfile.py +++ b/Lib/test/test_tarfile.py @@ -1582,9 +1582,31 @@ self.assertEqual(tarfile.nts(b"foo\0\0\0\0\0", "ascii", "strict"), "foo") self.assertEqual(tarfile.nts(b"foo\0bar\0", "ascii", "strict"), "foo") - def test_number_fields(self): + def test_read_number_fields(self): + # Issue 13158: Test if GNU tar specific base-256 number fields + # are decoded correctly. + self.assertEqual(tarfile.nti(b"0000001\x00"), 1) + self.assertEqual(tarfile.nti(b"7777777\x00"), 0o7777777) + self.assertEqual(tarfile.nti(b"\x80\x00\x00\x00\x00\x20\x00\x00"), 0o10000000) + self.assertEqual(tarfile.nti(b"\x80\x00\x00\x00\xff\xff\xff\xff"), 0xffffffff) + self.assertEqual(tarfile.nti(b"\xff\xff\xff\xff\xff\xff\xff\xff"), -1) + self.assertEqual(tarfile.nti(b"\xff\xff\xff\xff\xff\xff\xff\x9c"), -100) + self.assertEqual(tarfile.nti(b"\xff\x00\x00\x00\x00\x00\x00\x00"), -0x100000000000000) + + def test_write_number_fields(self): self.assertEqual(tarfile.itn(1), b"0000001\x00") + self.assertEqual(tarfile.itn(0o7777777), b"7777777\x00") + self.assertEqual(tarfile.itn(0o10000000), b"\x80\x00\x00\x00\x00\x20\x00\x00") self.assertEqual(tarfile.itn(0xffffffff), b"\x80\x00\x00\x00\xff\xff\xff\xff") + self.assertEqual(tarfile.itn(-1), b"\xff\xff\xff\xff\xff\xff\xff\xff") + self.assertEqual(tarfile.itn(-100), b"\xff\xff\xff\xff\xff\xff\xff\x9c") + self.assertEqual(tarfile.itn(-0x100000000000000), b"\xff\x00\x00\x00\x00\x00\x00\x00") + + def test_number_field_limits(self): + self.assertRaises(ValueError, tarfile.itn, -1, 8, tarfile.USTAR_FORMAT) + self.assertRaises(ValueError, tarfile.itn, 0o10000000, 8, tarfile.USTAR_FORMAT) + self.assertRaises(ValueError, tarfile.itn, -0x10000000001, 6, tarfile.GNU_FORMAT) + self.assertRaises(ValueError, tarfile.itn, 0x10000000000, 6, tarfile.GNU_FORMAT) class ContextManagerTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -305,6 +305,9 @@ Library ------- +- Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number + fields in tarfile. + - Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, instead of the locale encoding. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 15:16:51 2011 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 14 Oct 2011 15:16:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Rename_=5FPy=5Fidentifier_t?= =?utf8?q?o_=5FPy=5FIDENTIFIER=2E?= Message-ID: http://hg.python.org/cpython/rev/7109f31300fb changeset: 72925:7109f31300fb user: Martin v. L?wis date: Fri Oct 14 10:20:37 2011 +0200 summary: Rename _Py_identifier to _Py_IDENTIFIER. files: Include/unicodeobject.h | 4 +- Modules/_bisectmodule.c | 4 +- Modules/_collectionsmodule.c | 4 +- Modules/_csv.c | 2 +- Modules/_ctypes/_ctypes.c | 2 +- Modules/_ctypes/callproc.c | 4 +- Modules/_cursesmodule.c | 4 +- Modules/_datetimemodule.c | 38 ++-- Modules/_elementtree.c | 8 +- Modules/_io/_iomodule.c | 4 +- Modules/_io/bufferedio.c | 24 +- Modules/_io/fileio.c | 2 +- Modules/_io/iobase.c | 12 +- Modules/_io/textio.c | 34 ++-- Modules/_pickle.c | 24 +- Modules/_posixsubprocess.c | 6 +- Modules/_sqlite/connection.c | 10 +- Modules/_sqlite/cursor.c | 2 +- Modules/_sqlite/microprotocols.c | 4 +- Modules/_sqlite/module.c | 2 +- Modules/arraymodule.c | 8 +- Modules/cjkcodecs/multibytecodec.c | 4 +- Modules/faulthandler.c | 6 +- Modules/gcmodule.c | 2 +- Modules/itertoolsmodule.c | 2 +- Modules/mmapmodule.c | 2 +- Modules/ossaudiodev.c | 2 +- Modules/parsermodule.c | 6 +- Modules/posixmodule.c | 2 +- Modules/pyexpat.c | 2 +- Modules/socketmodule.c | 2 +- Modules/timemodule.c | 2 +- Modules/zipimport.c | 2 +- Objects/abstract.c | 6 +- Objects/bytearrayobject.c | 2 +- Objects/classobject.c | 2 +- Objects/descrobject.c | 12 +- Objects/dictobject.c | 6 +- Objects/fileobject.c | 8 +- Objects/moduleobject.c | 2 +- Objects/setobject.c | 2 +- Objects/typeobject.c | 14 +- Objects/weakrefobject.c | 4 +- PC/_msi.c | 4 +- Parser/tokenizer.c | 4 +- Python/Python-ast.c | 130 ++++++++-------- Python/_warnings.c | 4 +- Python/ast.c | 2 +- Python/bltinmodule.c | 12 +- Python/ceval.c | 2 +- Python/codecs.c | 4 +- Python/errors.c | 2 +- Python/import.c | 12 +- Python/marshal.c | 6 +- Python/pythonrun.c | 32 ++-- Python/sysmodule.c | 8 +- Python/traceback.c | 8 +- 57 files changed, 262 insertions(+), 262 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -2031,7 +2031,7 @@ do - _Py_identifier(foo); + _Py_IDENTIFIER(foo); ... r = _PyObject_CallMethodId(o, &PyId_foo, "args", ...); @@ -2050,7 +2050,7 @@ } _Py_Identifier; #define _Py_static_string(varname, value) static _Py_Identifier varname = { 0, value, 0 } -#define _Py_identifier(varname) _Py_static_string(PyId_##varname, #varname) +#define _Py_IDENTIFIER(varname) _Py_static_string(PyId_##varname, #varname) /* Return an interned Unicode object for an Identifier; may fail if there is no memory.*/ PyAPI_FUNC(PyObject*) _PyUnicode_FromId(_Py_Identifier*); diff --git a/Modules/_bisectmodule.c b/Modules/_bisectmodule.c --- a/Modules/_bisectmodule.c +++ b/Modules/_bisectmodule.c @@ -86,7 +86,7 @@ if (PyList_Insert(list, index, item) < 0) return NULL; } else { - _Py_identifier(insert); + _Py_IDENTIFIER(insert); result = _PyObject_CallMethodId(list, &PyId_insert, "nO", index, item); if (result == NULL) @@ -188,7 +188,7 @@ if (PyList_Insert(list, index, item) < 0) return NULL; } else { - _Py_identifier(insert); + _Py_IDENTIFIER(insert); result = _PyObject_CallMethodId(list, &PyId_insert, "iO", index, item); if (result == NULL) diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -767,7 +767,7 @@ deque_reduce(dequeobject *deque) { PyObject *dict, *result, *aslist; - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); dict = _PyObject_GetAttrId((PyObject *)deque, &PyId___dict__); if (dict == NULL) @@ -1335,7 +1335,7 @@ PyObject *items; PyObject *iter; PyObject *result; - _Py_identifier(items); + _Py_IDENTIFIER(items); if (dd->default_factory == NULL || dd->default_factory == Py_None) args = PyTuple_New(0); diff --git a/Modules/_csv.c b/Modules/_csv.c --- a/Modules/_csv.c +++ b/Modules/_csv.c @@ -1317,7 +1317,7 @@ { PyObject * output_file, * dialect = NULL; WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type); - _Py_identifier(write); + _Py_IDENTIFIER(write); if (!self) return NULL; diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -3679,7 +3679,7 @@ PyTuple_SET_ITEM(tup, index, v); index++; } else if (bit & outmask) { - _Py_identifier(__ctypes_from_outparam__); + _Py_IDENTIFIER(__ctypes_from_outparam__); v = PyTuple_GET_ITEM(callargs, i); v = _PyObject_CallMethodId(v, &PyId___ctypes_from_outparam__, NULL); diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -1687,8 +1687,8 @@ PyObject *state; PyObject *result; PyObject *tmp; - _Py_identifier(__new__); - _Py_identifier(__setstate__); + _Py_IDENTIFIER(__new__); + _Py_IDENTIFIER(__setstate__); if (!PyArg_ParseTuple(args, "OO", &typ, &state)) return NULL; diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1418,7 +1418,7 @@ while (1) { char buf[BUFSIZ]; Py_ssize_t n = fread(buf, 1, BUFSIZ, fp); - _Py_identifier(write); + _Py_IDENTIFIER(write); if (n <= 0) break; @@ -1913,7 +1913,7 @@ WINDOW *win; PyCursesInitialised; - _Py_identifier(read); + _Py_IDENTIFIER(read); strcpy(fn, "/tmp/py.curses.getwin.XXXXXX"); fd = mkstemp(fn); diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -946,7 +946,7 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg) { PyObject *result; - _Py_identifier(tzname); + _Py_IDENTIFIER(tzname); assert(tzinfo != NULL); assert(check_tzinfo_subclass(tzinfo) >= 0); @@ -1079,7 +1079,7 @@ PyObject *temp; PyObject *tzinfo = get_tzinfo_member(object); PyObject *Zreplacement = PyUnicode_FromStringAndSize(NULL, 0); - _Py_identifier(replace); + _Py_IDENTIFIER(replace); if (Zreplacement == NULL) return NULL; @@ -1289,7 +1289,7 @@ goto Done; format = PyUnicode_FromString(PyBytes_AS_STRING(newfmt)); if (format != NULL) { - _Py_identifier(strftime); + _Py_IDENTIFIER(strftime); result = _PyObject_CallMethodId(time, &PyId_strftime, "OO", format, timetuple, NULL); @@ -1318,7 +1318,7 @@ PyObject *time = PyImport_ImportModuleNoBlock("time"); if (time != NULL) { - _Py_identifier(time); + _Py_IDENTIFIER(time); result = _PyObject_CallMethodId(time, &PyId_time, "()"); Py_DECREF(time); @@ -1337,7 +1337,7 @@ time = PyImport_ImportModuleNoBlock("time"); if (time != NULL) { - _Py_identifier(struct_time); + _Py_IDENTIFIER(struct_time); result = _PyObject_CallMethodId(time, &PyId_struct_time, "((iiiiiiiii))", @@ -1578,7 +1578,7 @@ PyObject *result = NULL; PyObject *pyus_in = NULL, *temp, *pyus_out; PyObject *ratio = NULL; - _Py_identifier(as_integer_ratio); + _Py_IDENTIFIER(as_integer_ratio); pyus_in = delta_to_microseconds(delta); if (pyus_in == NULL) @@ -1677,7 +1677,7 @@ PyObject *result = NULL; PyObject *pyus_in = NULL, *temp, *pyus_out; PyObject *ratio = NULL; - _Py_identifier(as_integer_ratio); + _Py_IDENTIFIER(as_integer_ratio); pyus_in = delta_to_microseconds(delta); if (pyus_in == NULL) @@ -2473,7 +2473,7 @@ { PyObject *time; PyObject *result; - _Py_identifier(fromtimestamp); + _Py_IDENTIFIER(fromtimestamp); time = time_time(); if (time == NULL) @@ -2626,7 +2626,7 @@ static PyObject * date_str(PyDateTime_Date *self) { - _Py_identifier(isoformat); + _Py_IDENTIFIER(isoformat); return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()"); } @@ -2647,7 +2647,7 @@ PyObject *result; PyObject *tuple; PyObject *format; - _Py_identifier(timetuple); + _Py_IDENTIFIER(timetuple); static char *keywords[] = {"format", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "U:strftime", keywords, @@ -2667,7 +2667,7 @@ date_format(PyDateTime_Date *self, PyObject *args) { PyObject *format; - _Py_identifier(strftime); + _Py_IDENTIFIER(strftime); if (!PyArg_ParseTuple(args, "U:__format__", &format)) return NULL; @@ -3077,8 +3077,8 @@ { PyObject *args, *state, *tmp; PyObject *getinitargs, *getstate; - _Py_identifier(__getinitargs__); - _Py_identifier(__getstate__); + _Py_IDENTIFIER(__getinitargs__); + _Py_IDENTIFIER(__getstate__); tmp = PyTuple_New(0); if (tmp == NULL) @@ -3592,7 +3592,7 @@ static PyObject * time_str(PyDateTime_Time *self) { - _Py_identifier(isoformat); + _Py_IDENTIFIER(isoformat); return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "()"); } @@ -4173,7 +4173,7 @@ if (self != NULL && tzinfo != Py_None) { /* Convert UTC to tzinfo's zone. */ PyObject *temp = self; - _Py_identifier(fromutc); + _Py_IDENTIFIER(fromutc); self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self); Py_DECREF(temp); @@ -4212,7 +4212,7 @@ if (self != NULL && tzinfo != Py_None) { /* Convert UTC to tzinfo's zone. */ PyObject *temp = self; - _Py_identifier(fromutc); + _Py_IDENTIFIER(fromutc); self = _PyObject_CallMethodId(tzinfo, &PyId_fromutc, "O", self); Py_DECREF(temp); @@ -4239,7 +4239,7 @@ { static PyObject *module = NULL; PyObject *string, *format; - _Py_identifier(_strptime_datetime); + _Py_IDENTIFIER(_strptime_datetime); if (!PyArg_ParseTuple(args, "UU:strptime", &string, &format)) return NULL; @@ -4495,7 +4495,7 @@ static PyObject * datetime_str(PyDateTime_DateTime *self) { - _Py_identifier(isoformat); + _Py_IDENTIFIER(isoformat); return _PyObject_CallMethodId((PyObject *)self, &PyId_isoformat, "(s)", " "); } @@ -4704,7 +4704,7 @@ PyObject *offset; PyObject *temp; PyObject *tzinfo; - _Py_identifier(fromutc); + _Py_IDENTIFIER(fromutc); static char *keywords[] = {"tz", NULL}; if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords, diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -797,7 +797,7 @@ return NULL; if (checkpath(tag) || namespaces != Py_None) { - _Py_identifier(find); + _Py_IDENTIFIER(find); return _PyObject_CallMethodId( elementpath_obj, &PyId_find, "OOO", self, tag, namespaces ); @@ -825,7 +825,7 @@ PyObject* tag; PyObject* default_value = Py_None; PyObject* namespaces = Py_None; - _Py_identifier(findtext); + _Py_IDENTIFIER(findtext); if (!PyArg_ParseTuple(args, "O|OO:findtext", &tag, &default_value, &namespaces)) return NULL; @@ -868,7 +868,7 @@ return NULL; if (checkpath(tag) || namespaces != Py_None) { - _Py_identifier(findall); + _Py_IDENTIFIER(findall); return _PyObject_CallMethodId( elementpath_obj, &PyId_findall, "OOO", self, tag, namespaces ); @@ -900,7 +900,7 @@ { PyObject* tag; PyObject* namespaces = Py_None; - _Py_identifier(iterfind); + _Py_IDENTIFIER(iterfind); if (!PyArg_ParseTuple(args, "O|O:iterfind", &tag, &namespaces)) return NULL; diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -225,8 +225,8 @@ PyObject *raw, *modeobj = NULL, *buffer = NULL, *wrapper = NULL; - _Py_identifier(isatty); - _Py_identifier(fileno); + _Py_IDENTIFIER(isatty); + _Py_IDENTIFIER(fileno); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist, &file, &mode, &buffering, diff --git a/Modules/_io/bufferedio.c b/Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c +++ b/Modules/_io/bufferedio.c @@ -13,17 +13,17 @@ #include "pythread.h" #include "_iomodule.h" -_Py_identifier(close); -_Py_identifier(_dealloc_warn); -_Py_identifier(flush); -_Py_identifier(isatty); -_Py_identifier(peek); -_Py_identifier(read); -_Py_identifier(read1); -_Py_identifier(readable); -_Py_identifier(readinto); -_Py_identifier(writable); -_Py_identifier(write); +_Py_IDENTIFIER(close); +_Py_IDENTIFIER(_dealloc_warn); +_Py_IDENTIFIER(flush); +_Py_IDENTIFIER(isatty); +_Py_IDENTIFIER(peek); +_Py_IDENTIFIER(read); +_Py_IDENTIFIER(read1); +_Py_IDENTIFIER(readable); +_Py_IDENTIFIER(readinto); +_Py_IDENTIFIER(writable); +_Py_IDENTIFIER(write); /* * BufferedIOBase class, inherits from IOBase. @@ -50,7 +50,7 @@ Py_buffer buf; Py_ssize_t len; PyObject *data; - _Py_identifier(read); + _Py_IDENTIFIER(read); if (!PyArg_ParseTuple(args, "w*:readinto", &buf)) { return NULL; diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -122,7 +122,7 @@ static PyObject * fileio_close(fileio *self) { - _Py_identifier(close); + _Py_IDENTIFIER(close); if (!self->closefd) { self->fd = -1; Py_RETURN_NONE; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -97,7 +97,7 @@ static PyObject * iobase_tell(PyObject *self, PyObject *args) { - _Py_identifier(seek); + _Py_IDENTIFIER(seek); return _PyObject_CallMethodId(self, &PyId_seek, "ii", 0, 1); } @@ -466,7 +466,7 @@ int has_peek = 0; PyObject *buffer, *result; Py_ssize_t old_size = -1; - _Py_identifier(read); + _Py_IDENTIFIER(read); if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) { return NULL; @@ -484,7 +484,7 @@ PyObject *b; if (has_peek) { - _Py_identifier(peek); + _Py_IDENTIFIER(peek); PyObject *readahead = _PyObject_CallMethodId(self, &PyId_peek, "i", 1); if (readahead == NULL) @@ -606,7 +606,7 @@ /* XXX special-casing this made sense in the Python version in order to remove the bytecode interpretation overhead, but it could probably be removed here. */ - _Py_identifier(extend); + _Py_IDENTIFIER(extend); PyObject *ret = _PyObject_CallMethodId(result, &PyId_extend, "O", self); if (ret == NULL) { @@ -789,7 +789,7 @@ } if (n < 0) { - _Py_identifier(readall); + _Py_IDENTIFIER(readall); return _PyObject_CallMethodId(self, &PyId_readall, NULL); } @@ -833,7 +833,7 @@ return NULL; while (1) { - _Py_identifier(read); + _Py_IDENTIFIER(read); PyObject *data = _PyObject_CallMethodId(self, &PyId_read, "i", DEFAULT_BUFFER_SIZE); if (!data) { diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -11,23 +11,23 @@ #include "structmember.h" #include "_iomodule.h" -_Py_identifier(close); -_Py_identifier(_dealloc_warn); -_Py_identifier(decode); -_Py_identifier(device_encoding); -_Py_identifier(fileno); -_Py_identifier(flush); -_Py_identifier(getpreferredencoding); -_Py_identifier(isatty); -_Py_identifier(read); -_Py_identifier(readable); -_Py_identifier(replace); -_Py_identifier(reset); -_Py_identifier(seek); -_Py_identifier(seekable); -_Py_identifier(setstate); -_Py_identifier(tell); -_Py_identifier(writable); +_Py_IDENTIFIER(close); +_Py_IDENTIFIER(_dealloc_warn); +_Py_IDENTIFIER(decode); +_Py_IDENTIFIER(device_encoding); +_Py_IDENTIFIER(fileno); +_Py_IDENTIFIER(flush); +_Py_IDENTIFIER(getpreferredencoding); +_Py_IDENTIFIER(isatty); +_Py_IDENTIFIER(read); +_Py_IDENTIFIER(readable); +_Py_IDENTIFIER(replace); +_Py_IDENTIFIER(reset); +_Py_IDENTIFIER(seek); +_Py_IDENTIFIER(seekable); +_Py_IDENTIFIER(setstate); +_Py_IDENTIFIER(tell); +_Py_IDENTIFIER(writable); /* TextIOBase */ diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -826,7 +826,7 @@ static int _Pickler_SetOutputStream(PicklerObject *self, PyObject *file) { - _Py_identifier(write); + _Py_IDENTIFIER(write); assert(file != NULL); self->write = _PyObject_GetAttrId(file, &PyId_write); if (self->write == NULL) { @@ -1174,9 +1174,9 @@ static int _Unpickler_SetInputStream(UnpicklerObject *self, PyObject *file) { - _Py_identifier(peek); - _Py_identifier(read); - _Py_identifier(readline); + _Py_IDENTIFIER(peek); + _Py_IDENTIFIER(read); + _Py_IDENTIFIER(readline); self->peek = _PyObject_GetAttrId(file, &PyId_peek); if (self->peek == NULL) { @@ -2492,7 +2492,7 @@ status = batch_dict_exact(self, obj); Py_LeaveRecursiveCall(); } else { - _Py_identifier(items); + _Py_IDENTIFIER(items); items = _PyObject_CallMethodId(obj, &PyId_items, "()"); if (items == NULL) @@ -3394,7 +3394,7 @@ PyObject *file; PyObject *proto_obj = NULL; PyObject *fix_imports = Py_True; - _Py_identifier(persistent_id); + _Py_IDENTIFIER(persistent_id); if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|OO:Pickler", kwlist, &file, &proto_obj, &fix_imports)) @@ -3781,7 +3781,7 @@ static PyObject * find_class(UnpicklerObject *self, PyObject *module_name, PyObject *global_name) { - _Py_identifier(find_class); + _Py_IDENTIFIER(find_class); return _PyObject_CallMethodId((PyObject *)self, &PyId_find_class, "OO", module_name, global_name); @@ -4397,7 +4397,7 @@ result = PyObject_CallObject(cls, args); } else { - _Py_identifier(__new__); + _Py_IDENTIFIER(__new__); result = _PyObject_CallMethodId(cls, &PyId___new__, "O", cls); } @@ -4940,7 +4940,7 @@ } else { PyObject *append_func; - _Py_identifier(append); + _Py_IDENTIFIER(append); append_func = _PyObject_GetAttrId(list, &PyId_append); if (append_func == NULL) @@ -5029,7 +5029,7 @@ PyObject *state, *inst, *slotstate; PyObject *setstate; int status = 0; - _Py_identifier(__setstate__); + _Py_IDENTIFIER(__setstate__); /* Stack is ... instance, state. We want to leave instance at * the stack top, possibly mutated via instance.__setstate__(state). @@ -5086,7 +5086,7 @@ PyObject *dict; PyObject *d_key, *d_value; Py_ssize_t i; - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); if (!PyDict_Check(state)) { PyErr_SetString(UnpicklingError, "state is not a dictionary"); @@ -5592,7 +5592,7 @@ return -1; if (PyObject_HasAttrString((PyObject *)self, "persistent_load")) { - _Py_identifier(persistent_load); + _Py_IDENTIFIER(persistent_load); self->pers_func = _PyObject_GetAttrId((PyObject *)self, &PyId_persistent_load); if (self->pers_func == NULL) diff --git a/Modules/_posixsubprocess.c b/Modules/_posixsubprocess.c --- a/Modules/_posixsubprocess.c +++ b/Modules/_posixsubprocess.c @@ -18,7 +18,7 @@ static int _enable_gc(PyObject *gc_module) { PyObject *result; - _Py_identifier(enable); + _Py_IDENTIFIER(enable); result = _PyObject_CallMethodId(gc_module, &PyId_enable, NULL); if (result == NULL) @@ -251,8 +251,8 @@ /* We need to call gc.disable() when we'll be calling preexec_fn */ if (preexec_fn != Py_None) { PyObject *result; - _Py_identifier(isenabled); - _Py_identifier(disable); + _Py_IDENTIFIER(isenabled); + _Py_IDENTIFIER(disable); gc_module = PyImport_ImportModule("gc"); if (gc_module == NULL) diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -675,7 +675,7 @@ { PyObject* function_result = NULL; PyObject** aggregate_instance; - _Py_identifier(finalize); + _Py_IDENTIFIER(finalize); #ifdef WITH_THREAD PyGILState_STATE threadstate; @@ -1231,7 +1231,7 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; - _Py_identifier(cursor); + _Py_IDENTIFIER(cursor); cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { @@ -1261,7 +1261,7 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; - _Py_identifier(cursor); + _Py_IDENTIFIER(cursor); cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { @@ -1291,7 +1291,7 @@ PyObject* cursor = 0; PyObject* result = 0; PyObject* method = 0; - _Py_identifier(cursor); + _Py_IDENTIFIER(cursor); cursor = _PyObject_CallMethodId((PyObject*)self, &PyId_cursor, ""); if (!cursor) { @@ -1441,7 +1441,7 @@ PyObject* name; PyObject* retval; Py_ssize_t i, len; - _Py_identifier(upper); + _Py_IDENTIFIER(upper); char *uppercase_name_str; int rc; unsigned int kind; diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -150,7 +150,7 @@ { PyObject* upcase_key; PyObject* retval; - _Py_identifier(upper); + _Py_IDENTIFIER(upper); upcase_key = _PyObject_CallMethodId(key, &PyId_upper, ""); if (!upcase_key) { diff --git a/Modules/_sqlite/microprotocols.c b/Modules/_sqlite/microprotocols.c --- a/Modules/_sqlite/microprotocols.c +++ b/Modules/_sqlite/microprotocols.c @@ -95,7 +95,7 @@ /* try to have the protocol adapt this object*/ if (PyObject_HasAttrString(proto, "__adapt__")) { - _Py_identifier(__adapt__); + _Py_IDENTIFIER(__adapt__); PyObject *adapted = _PyObject_CallMethodId(proto, &PyId___adapt__, "O", obj); if (adapted) { @@ -112,7 +112,7 @@ /* and finally try to have the object adapt itself */ if (PyObject_HasAttrString(obj, "__conform__")) { - _Py_identifier(__conform__); + _Py_IDENTIFIER(__conform__); PyObject *adapted = _PyObject_CallMethodId(obj, &PyId___conform__,"O", proto); if (adapted) { diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c --- a/Modules/_sqlite/module.c +++ b/Modules/_sqlite/module.c @@ -179,7 +179,7 @@ PyObject* name = NULL; PyObject* callable; PyObject* retval = NULL; - _Py_identifier(upper); + _Py_IDENTIFIER(upper); if (!PyArg_ParseTuple(args, "UO", &orig_name, &callable)) { return NULL; diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1253,7 +1253,7 @@ PyObject *f, *b, *res; Py_ssize_t itemsize = self->ob_descr->itemsize; Py_ssize_t n, nbytes; - _Py_identifier(read); + _Py_IDENTIFIER(read); int not_enough_bytes; if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n)) @@ -1322,7 +1322,7 @@ char* ptr = self->ob_item + i*BLOCKSIZE; Py_ssize_t size = BLOCKSIZE; PyObject *bytes, *res; - _Py_identifier(write); + _Py_IDENTIFIER(write); if (i*BLOCKSIZE + size > nbytes) size = nbytes - i*BLOCKSIZE; @@ -2003,8 +2003,8 @@ int mformat_code; static PyObject *array_reconstructor = NULL; long protocol; - _Py_identifier(_array_reconstructor); - _Py_identifier(__dict__); + _Py_IDENTIFIER(_array_reconstructor); + _Py_IDENTIFIER(__dict__); if (array_reconstructor == NULL) { PyObject *array_module = PyImport_ImportModule("array"); diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1579,7 +1579,7 @@ PyObject *unistr) { PyObject *str, *wr; - _Py_identifier(write); + _Py_IDENTIFIER(write); str = encoder_encode_stateful(STATEFUL_ECTX(self), unistr, 0); if (str == NULL) @@ -1651,7 +1651,7 @@ assert(PyBytes_Check(pwrt)); if (PyBytes_Size(pwrt) > 0) { PyObject *wr; - _Py_identifier(write); + _Py_IDENTIFIER(write); wr = _PyObject_CallMethodId(self->stream, &PyId_write, "O", pwrt); if (wr == NULL) { diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -146,8 +146,8 @@ faulthandler_get_fileno(PyObject *file, int *p_fd) { PyObject *result; - _Py_identifier(fileno); - _Py_identifier(flush); + _Py_IDENTIFIER(fileno); + _Py_IDENTIFIER(flush); long fd_long; int fd; @@ -1199,7 +1199,7 @@ faulthandler_env_options(void) { PyObject *xoptions, *key, *module, *res; - _Py_identifier(enable); + _Py_IDENTIFIER(enable); if (!Py_GETENV("PYTHONFAULTHANDLER")) { int has_key; diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -769,7 +769,7 @@ { double result = 0; if (tmod != NULL) { - _Py_identifier(time); + _Py_IDENTIFIER(time); PyObject *f = _PyObject_CallMethodId(tmod, &PyId_time, NULL); if (f == NULL) { diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -654,7 +654,7 @@ copyable = it; PyTuple_SET_ITEM(result, 0, copyable); for (i=1 ; iob_bytes) latin1 = PyUnicode_DecodeLatin1(self->ob_bytes, diff --git a/Objects/classobject.c b/Objects/classobject.c --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -14,7 +14,7 @@ #define PyMethod_MAXFREELIST 256 #endif -_Py_identifier(__name__); +_Py_IDENTIFIER(__name__); PyObject * PyMethod_Function(PyObject *im) diff --git a/Objects/descrobject.c b/Objects/descrobject.c --- a/Objects/descrobject.c +++ b/Objects/descrobject.c @@ -703,7 +703,7 @@ proxy_get(proxyobject *pp, PyObject *args) { PyObject *key, *def = Py_None; - _Py_identifier(get); + _Py_IDENTIFIER(get); if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def)) return NULL; @@ -713,28 +713,28 @@ static PyObject * proxy_keys(proxyobject *pp) { - _Py_identifier(keys); + _Py_IDENTIFIER(keys); return _PyObject_CallMethodId(pp->dict, &PyId_keys, NULL); } static PyObject * proxy_values(proxyobject *pp) { - _Py_identifier(values); + _Py_IDENTIFIER(values); return _PyObject_CallMethodId(pp->dict, &PyId_values, NULL); } static PyObject * proxy_items(proxyobject *pp) { - _Py_identifier(items); + _Py_IDENTIFIER(items); return _PyObject_CallMethodId(pp->dict, &PyId_items, NULL); } static PyObject * proxy_copy(proxyobject *pp) { - _Py_identifier(copy); + _Py_IDENTIFIER(copy); return _PyObject_CallMethodId(pp->dict, &PyId_copy, NULL); } @@ -1299,7 +1299,7 @@ /* if no docstring given and the getter has one, use that one */ if ((doc == NULL || doc == Py_None) && get != NULL) { - _Py_identifier(__doc__); + _Py_IDENTIFIER(__doc__); PyObject *get_doc = _PyObject_GetAttrId(get, &PyId___doc__); if (get_doc) { if (Py_TYPE(self) == &PyProperty_Type) { diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -2707,7 +2707,7 @@ { PyObject *result = PySet_New(self); PyObject *tmp; - _Py_identifier(difference_update); + _Py_IDENTIFIER(difference_update); if (result == NULL) return NULL; @@ -2727,7 +2727,7 @@ { PyObject *result = PySet_New(self); PyObject *tmp; - _Py_identifier(intersection_update); + _Py_IDENTIFIER(intersection_update); if (result == NULL) return NULL; @@ -2767,7 +2767,7 @@ { PyObject *result = PySet_New(self); PyObject *tmp; - _Py_identifier(symmetric_difference_update); + _Py_IDENTIFIER(symmetric_difference_update); if (result == NULL) return NULL; diff --git a/Objects/fileobject.c b/Objects/fileobject.c --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -30,7 +30,7 @@ char *errors, char *newline, int closefd) { PyObject *io, *stream; - _Py_identifier(open); + _Py_IDENTIFIER(open); io = PyImport_ImportModule("io"); if (io == NULL) @@ -59,7 +59,7 @@ { PyObject *reader; PyObject *args; - _Py_identifier(readline); + _Py_IDENTIFIER(readline); reader = _PyObject_GetAttrId(f, &PyId_readline); if (reader == NULL) @@ -128,7 +128,7 @@ PyFile_WriteObject(PyObject *v, PyObject *f, int flags) { PyObject *writer, *value, *args, *result; - _Py_identifier(write); + _Py_IDENTIFIER(write); if (f == NULL) { PyErr_SetString(PyExc_TypeError, "writeobject with NULL file"); @@ -197,7 +197,7 @@ { int fd; PyObject *meth; - _Py_identifier(fileno); + _Py_IDENTIFIER(fileno); if (PyLong_Check(o)) { fd = PyLong_AsLong(o); diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c --- a/Objects/moduleobject.c +++ b/Objects/moduleobject.c @@ -415,7 +415,7 @@ static PyObject * module_dir(PyObject *self, PyObject *args) { - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); PyObject *result = NULL; PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1933,7 +1933,7 @@ set_reduce(PySetObject *so) { PyObject *keys=NULL, *args=NULL, *result=NULL, *dict=NULL; - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); keys = PySequence_List((PyObject *)so); if (keys == NULL) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -35,8 +35,8 @@ static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]; static unsigned int next_version_tag = 0; -_Py_identifier(__dict__); -_Py_identifier(__class__); +_Py_IDENTIFIER(__dict__); +_Py_IDENTIFIER(__class__); unsigned int PyType_ClearCache(void) @@ -1284,7 +1284,7 @@ static PyObject * class_name(PyObject *cls) { - _Py_identifier(__name__); + _Py_IDENTIFIER(__name__); PyObject *name = _PyObject_GetAttrId(cls, &PyId___name__); if (name == NULL) { PyErr_Clear(); @@ -2599,7 +2599,7 @@ { PyObject *classdict; PyObject *bases; - _Py_identifier(__bases__); + _Py_IDENTIFIER(__bases__); assert(PyDict_Check(dict)); assert(aclass); @@ -2901,7 +2901,7 @@ PyObject *sorted; PyObject *sorted_methods = NULL; PyObject *joined = NULL; - _Py_identifier(join); + _Py_IDENTIFIER(join); /* Compute ", ".join(sorted(type.__abstractmethods__)) into joined. */ @@ -3189,7 +3189,7 @@ PyObject *copyreg; PyObject *slotnames; static PyObject *str_slotnames; - _Py_identifier(_slotnames); + _Py_IDENTIFIER(_slotnames); if (str_slotnames == NULL) { str_slotnames = PyUnicode_InternFromString("__slotnames__"); @@ -3329,7 +3329,7 @@ Py_INCREF(dictitems); } else { - _Py_identifier(items); + _Py_IDENTIFIER(items); PyObject *items = _PyObject_CallMethodId(obj, &PyId_items, ""); if (items == NULL) goto end; diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -157,7 +157,7 @@ weakref_repr(PyWeakReference *self) { PyObject *name, *repr; - _Py_identifier(__name__); + _Py_IDENTIFIER(__name__); if (PyWeakref_GET_OBJECT(self) == Py_None) return PyUnicode_FromFormat("", self); @@ -441,7 +441,7 @@ #define WRAP_METHOD(method, special) \ static PyObject * \ method(PyObject *proxy) { \ - _Py_identifier(special); \ + _Py_IDENTIFIER(special); \ UNWRAP(proxy); \ return _PyObject_CallMethodId(proxy, &PyId_##special, ""); \ } diff --git a/PC/_msi.c b/PC/_msi.c --- a/PC/_msi.c +++ b/PC/_msi.c @@ -122,7 +122,7 @@ static FNFCISTATUS(cb_status) { if (pv) { - _Py_identifier(status); + _Py_IDENTIFIER(status); PyObject *result = _PyObject_CallMethodId(pv, &PyId_status, "iii", typeStatus, cb1, cb2); if (result == NULL) @@ -135,7 +135,7 @@ static FNFCIGETNEXTCABINET(cb_getnextcabinet) { if (pv) { - _Py_identifier(getnextcabinet); + _Py_IDENTIFIER(getnextcabinet); PyObject *result = _PyObject_CallMethodId(pv, &PyId_getnextcabinet, "i", pccab->iCab); if (result == NULL) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -462,8 +462,8 @@ fp_setreadl(struct tok_state *tok, const char* enc) { PyObject *readline = NULL, *stream = NULL, *io = NULL; - _Py_identifier(open); - _Py_identifier(readline); + _Py_IDENTIFIER(open); + _Py_IDENTIFIER(readline); int fd; io = PyImport_ImportModuleNoBlock("io"); diff --git a/Python/Python-ast.c b/Python/Python-ast.c --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -7,7 +7,7 @@ static PyTypeObject *mod_type; static PyObject* ast2obj_mod(void*); static PyTypeObject *Module_type; -_Py_identifier(body); +_Py_IDENTIFIER(body); static char *Module_fields[]={ "body", }; @@ -24,18 +24,18 @@ "body", }; static PyTypeObject *stmt_type; -_Py_identifier(lineno); -_Py_identifier(col_offset); +_Py_IDENTIFIER(lineno); +_Py_IDENTIFIER(col_offset); static char *stmt_attributes[] = { "lineno", "col_offset", }; static PyObject* ast2obj_stmt(void*); static PyTypeObject *FunctionDef_type; -_Py_identifier(name); -_Py_identifier(args); -_Py_identifier(decorator_list); -_Py_identifier(returns); +_Py_IDENTIFIER(name); +_Py_IDENTIFIER(args); +_Py_IDENTIFIER(decorator_list); +_Py_IDENTIFIER(returns); static char *FunctionDef_fields[]={ "name", "args", @@ -44,10 +44,10 @@ "returns", }; static PyTypeObject *ClassDef_type; -_Py_identifier(bases); -_Py_identifier(keywords); -_Py_identifier(starargs); -_Py_identifier(kwargs); +_Py_IDENTIFIER(bases); +_Py_IDENTIFIER(keywords); +_Py_IDENTIFIER(starargs); +_Py_IDENTIFIER(kwargs); static char *ClassDef_fields[]={ "name", "bases", @@ -58,12 +58,12 @@ "decorator_list", }; static PyTypeObject *Return_type; -_Py_identifier(value); +_Py_IDENTIFIER(value); static char *Return_fields[]={ "value", }; static PyTypeObject *Delete_type; -_Py_identifier(targets); +_Py_IDENTIFIER(targets); static char *Delete_fields[]={ "targets", }; @@ -73,16 +73,16 @@ "value", }; static PyTypeObject *AugAssign_type; -_Py_identifier(target); -_Py_identifier(op); +_Py_IDENTIFIER(target); +_Py_IDENTIFIER(op); static char *AugAssign_fields[]={ "target", "op", "value", }; static PyTypeObject *For_type; -_Py_identifier(iter); -_Py_identifier(orelse); +_Py_IDENTIFIER(iter); +_Py_IDENTIFIER(orelse); static char *For_fields[]={ "target", "iter", @@ -90,7 +90,7 @@ "orelse", }; static PyTypeObject *While_type; -_Py_identifier(test); +_Py_IDENTIFIER(test); static char *While_fields[]={ "test", "body", @@ -103,21 +103,21 @@ "orelse", }; static PyTypeObject *With_type; -_Py_identifier(items); +_Py_IDENTIFIER(items); static char *With_fields[]={ "items", "body", }; static PyTypeObject *Raise_type; -_Py_identifier(exc); -_Py_identifier(cause); +_Py_IDENTIFIER(exc); +_Py_IDENTIFIER(cause); static char *Raise_fields[]={ "exc", "cause", }; static PyTypeObject *Try_type; -_Py_identifier(handlers); -_Py_identifier(finalbody); +_Py_IDENTIFIER(handlers); +_Py_IDENTIFIER(finalbody); static char *Try_fields[]={ "body", "handlers", @@ -125,19 +125,19 @@ "finalbody", }; static PyTypeObject *Assert_type; -_Py_identifier(msg); +_Py_IDENTIFIER(msg); static char *Assert_fields[]={ "test", "msg", }; static PyTypeObject *Import_type; -_Py_identifier(names); +_Py_IDENTIFIER(names); static char *Import_fields[]={ "names", }; static PyTypeObject *ImportFrom_type; -_Py_identifier(module); -_Py_identifier(level); +_Py_IDENTIFIER(module); +_Py_IDENTIFIER(level); static char *ImportFrom_fields[]={ "module", "names", @@ -165,21 +165,21 @@ }; static PyObject* ast2obj_expr(void*); static PyTypeObject *BoolOp_type; -_Py_identifier(values); +_Py_IDENTIFIER(values); static char *BoolOp_fields[]={ "op", "values", }; static PyTypeObject *BinOp_type; -_Py_identifier(left); -_Py_identifier(right); +_Py_IDENTIFIER(left); +_Py_IDENTIFIER(right); static char *BinOp_fields[]={ "left", "op", "right", }; static PyTypeObject *UnaryOp_type; -_Py_identifier(operand); +_Py_IDENTIFIER(operand); static char *UnaryOp_fields[]={ "op", "operand", @@ -196,19 +196,19 @@ "orelse", }; static PyTypeObject *Dict_type; -_Py_identifier(keys); +_Py_IDENTIFIER(keys); static char *Dict_fields[]={ "keys", "values", }; static PyTypeObject *Set_type; -_Py_identifier(elts); +_Py_IDENTIFIER(elts); static char *Set_fields[]={ "elts", }; static PyTypeObject *ListComp_type; -_Py_identifier(elt); -_Py_identifier(generators); +_Py_IDENTIFIER(elt); +_Py_IDENTIFIER(generators); static char *ListComp_fields[]={ "elt", "generators", @@ -219,7 +219,7 @@ "generators", }; static PyTypeObject *DictComp_type; -_Py_identifier(key); +_Py_IDENTIFIER(key); static char *DictComp_fields[]={ "key", "value", @@ -235,15 +235,15 @@ "value", }; static PyTypeObject *Compare_type; -_Py_identifier(ops); -_Py_identifier(comparators); +_Py_IDENTIFIER(ops); +_Py_IDENTIFIER(comparators); static char *Compare_fields[]={ "left", "ops", "comparators", }; static PyTypeObject *Call_type; -_Py_identifier(func); +_Py_IDENTIFIER(func); static char *Call_fields[]={ "func", "args", @@ -252,12 +252,12 @@ "kwargs", }; static PyTypeObject *Num_type; -_Py_identifier(n); +_Py_IDENTIFIER(n); static char *Num_fields[]={ "n", }; static PyTypeObject *Str_type; -_Py_identifier(s); +_Py_IDENTIFIER(s); static char *Str_fields[]={ "s", }; @@ -267,15 +267,15 @@ }; static PyTypeObject *Ellipsis_type; static PyTypeObject *Attribute_type; -_Py_identifier(attr); -_Py_identifier(ctx); +_Py_IDENTIFIER(attr); +_Py_IDENTIFIER(ctx); static char *Attribute_fields[]={ "value", "attr", "ctx", }; static PyTypeObject *Subscript_type; -_Py_identifier(slice); +_Py_IDENTIFIER(slice); static char *Subscript_fields[]={ "value", "slice", @@ -287,7 +287,7 @@ "ctx", }; static PyTypeObject *Name_type; -_Py_identifier(id); +_Py_IDENTIFIER(id); static char *Name_fields[]={ "id", "ctx", @@ -315,16 +315,16 @@ static PyTypeObject *slice_type; static PyObject* ast2obj_slice(void*); static PyTypeObject *Slice_type; -_Py_identifier(lower); -_Py_identifier(upper); -_Py_identifier(step); +_Py_IDENTIFIER(lower); +_Py_IDENTIFIER(upper); +_Py_IDENTIFIER(step); static char *Slice_fields[]={ "lower", "upper", "step", }; static PyTypeObject *ExtSlice_type; -_Py_identifier(dims); +_Py_IDENTIFIER(dims); static char *ExtSlice_fields[]={ "dims", }; @@ -380,7 +380,7 @@ static PyTypeObject *NotIn_type; static PyTypeObject *comprehension_type; static PyObject* ast2obj_comprehension(void*); -_Py_identifier(ifs); +_Py_IDENTIFIER(ifs); static char *comprehension_fields[]={ "target", "iter", @@ -393,7 +393,7 @@ }; static PyObject* ast2obj_excepthandler(void*); static PyTypeObject *ExceptHandler_type; -_Py_identifier(type); +_Py_IDENTIFIER(type); static char *ExceptHandler_fields[]={ "type", "name", @@ -401,13 +401,13 @@ }; static PyTypeObject *arguments_type; static PyObject* ast2obj_arguments(void*); -_Py_identifier(vararg); -_Py_identifier(varargannotation); -_Py_identifier(kwonlyargs); -_Py_identifier(kwarg); -_Py_identifier(kwargannotation); -_Py_identifier(defaults); -_Py_identifier(kw_defaults); +_Py_IDENTIFIER(vararg); +_Py_IDENTIFIER(varargannotation); +_Py_IDENTIFIER(kwonlyargs); +_Py_IDENTIFIER(kwarg); +_Py_IDENTIFIER(kwargannotation); +_Py_IDENTIFIER(defaults); +_Py_IDENTIFIER(kw_defaults); static char *arguments_fields[]={ "args", "vararg", @@ -420,8 +420,8 @@ }; static PyTypeObject *arg_type; static PyObject* ast2obj_arg(void*); -_Py_identifier(arg); -_Py_identifier(annotation); +_Py_IDENTIFIER(arg); +_Py_IDENTIFIER(annotation); static char *arg_fields[]={ "arg", "annotation", @@ -434,15 +434,15 @@ }; static PyTypeObject *alias_type; static PyObject* ast2obj_alias(void*); -_Py_identifier(asname); +_Py_IDENTIFIER(asname); static char *alias_fields[]={ "name", "asname", }; static PyTypeObject *withitem_type; static PyObject* ast2obj_withitem(void*); -_Py_identifier(context_expr); -_Py_identifier(optional_vars); +_Py_IDENTIFIER(context_expr); +_Py_IDENTIFIER(optional_vars); static char *withitem_fields[]={ "context_expr", "optional_vars", @@ -452,7 +452,7 @@ static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { - _Py_identifier(_fields); + _Py_IDENTIFIER(_fields); Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; @@ -506,7 +506,7 @@ ast_type_reduce(PyObject *self, PyObject *unused) { PyObject *res; - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -18,7 +18,7 @@ check_matched(PyObject *obj, PyObject *arg) { PyObject *result; - _Py_identifier(match); + _Py_IDENTIFIER(match); int rc; if (obj == Py_None) @@ -247,7 +247,7 @@ PyObject *f_stderr; PyObject *name; char lineno_str[128]; - _Py_identifier(__name__); + _Py_IDENTIFIER(__name__); PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno); diff --git a/Python/ast.c b/Python/ast.c --- a/Python/ast.c +++ b/Python/ast.c @@ -527,7 +527,7 @@ static identifier new_identifier(const char* n, PyArena *arena) { - _Py_identifier(normalize); + _Py_IDENTIFIER(normalize); PyObject* id = PyUnicode_DecodeUTF8(n, strlen(n), NULL); if (!id || PyUnicode_READY(id) == -1) return NULL; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -32,8 +32,8 @@ int Py_HasFileSystemDefaultEncoding = 0; #endif -_Py_identifier(fileno); -_Py_identifier(flush); +_Py_IDENTIFIER(fileno); +_Py_IDENTIFIER(flush); static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) @@ -41,7 +41,7 @@ PyObject *func, *name, *bases, *mkw, *meta, *prep, *ns, *cell; PyObject *cls = NULL; Py_ssize_t nargs; - _Py_identifier(__prepare__); + _Py_IDENTIFIER(__prepare__); assert(args != NULL); if (!PyTuple_Check(args)) { @@ -1614,7 +1614,7 @@ char *stdin_encoding_str; PyObject *result; size_t len; - _Py_identifier(encoding); + _Py_IDENTIFIER(encoding); stdin_encoding = _PyObject_GetAttrId(fin, &PyId_encoding); if (!stdin_encoding) @@ -1790,7 +1790,7 @@ PyObject *callable; static char *kwlist[] = {"iterable", "key", "reverse", 0}; int reverse; - _Py_identifier(sort); + _Py_IDENTIFIER(sort); /* args 1-3 should match listsort in Objects/listobject.c */ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|Oi:sorted", @@ -1847,7 +1847,7 @@ Py_INCREF(d); } else { - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); d = _PyObject_GetAttrId(v, &PyId___dict__); if (d == NULL) { PyErr_SetString(PyExc_TypeError, diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -372,7 +372,7 @@ void PyEval_ReInitThreads(void) { - _Py_identifier(_after_fork); + _Py_IDENTIFIER(_after_fork); PyObject *threading, *result; PyThreadState *tstate = PyThreadState_GET(); diff --git a/Python/codecs.c b/Python/codecs.c --- a/Python/codecs.c +++ b/Python/codecs.c @@ -467,8 +467,8 @@ static void wrong_exception_type(PyObject *exc) { - _Py_identifier(__class__); - _Py_identifier(__name__); + _Py_IDENTIFIER(__class__); + _Py_IDENTIFIER(__name__); PyObject *type = _PyObject_GetAttrId(exc, &PyId___class__); if (type != NULL) { PyObject *name = _PyObject_GetAttrId(type, &PyId___name__); diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -712,7 +712,7 @@ void PyErr_WriteUnraisable(PyObject *obj) { - _Py_identifier(__module__); + _Py_IDENTIFIER(__module__); PyObject *f, *t, *v, *tb; PyErr_Fetch(&t, &v, &tb); f = PySys_GetObject("stderr"); diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -154,7 +154,7 @@ }; static PyObject *initstr = NULL; -_Py_identifier(__path__); +_Py_IDENTIFIER(__path__); /* Initialize things */ @@ -248,7 +248,7 @@ PySys_WriteStderr("# can't import zipimport\n"); } else { - _Py_identifier(zipimporter); + _Py_IDENTIFIER(zipimporter); PyObject *zipimporter = _PyObject_GetAttrId(zimpimport, &PyId_zipimporter); Py_DECREF(zimpimport); @@ -1802,7 +1802,7 @@ /* sys.path_hooks import hook */ if (p_loader != NULL) { - _Py_identifier(find_module); + _Py_IDENTIFIER(find_module); PyObject *importer; importer = get_path_importer(path_importer_cache, @@ -2032,7 +2032,7 @@ /* sys.meta_path import hook */ if (p_loader != NULL) { - _Py_identifier(find_module); + _Py_IDENTIFIER(find_module); PyObject *meta_path; meta_path = PySys_GetObject("meta_path"); @@ -2462,7 +2462,7 @@ break; case IMP_HOOK: { - _Py_identifier(load_module); + _Py_IDENTIFIER(load_module); if (loader == NULL) { PyErr_SetString(PyExc_ImportError, "import hook without loader"); @@ -3227,7 +3227,7 @@ } if (PyUnicode_READ_CHAR(item, 0) == '*') { PyObject *all; - _Py_identifier(__all__); + _Py_IDENTIFIER(__all__); Py_DECREF(item); /* See if the package defines __all__ */ if (recursive) diff --git a/Python/marshal.c b/Python/marshal.c --- a/Python/marshal.c +++ b/Python/marshal.c @@ -480,7 +480,7 @@ } } else { - _Py_identifier(read); + _Py_IDENTIFIER(read); PyObject *data = _PyObject_CallMethodId(p->readable, &PyId_read, "i", n); read = 0; @@ -1292,7 +1292,7 @@ int version = Py_MARSHAL_VERSION; PyObject *s; PyObject *res; - _Py_identifier(write); + _Py_IDENTIFIER(write); if (!PyArg_ParseTuple(args, "OO|i:dump", &x, &f, &version)) return NULL; @@ -1321,7 +1321,7 @@ marshal_load(PyObject *self, PyObject *f) { PyObject *data, *result; - _Py_identifier(read); + _Py_IDENTIFIER(read); RFILE rf; /* diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -141,7 +141,7 @@ { char *name_utf8, *name_str; PyObject *codec, *name = NULL; - _Py_identifier(name); + _Py_IDENTIFIER(name); codec = _PyCodec_Lookup(encoding); if (!codec) @@ -353,7 +353,7 @@ PyObject *fout = PySys_GetObject("stdout"); PyObject *ferr = PySys_GetObject("stderr"); PyObject *tmp; - _Py_identifier(flush); + _Py_IDENTIFIER(flush); if (fout != NULL && fout != Py_None) { tmp = _PyObject_CallMethodId(fout, &PyId_flush, ""); @@ -807,9 +807,9 @@ const char* newline; PyObject *line_buffering; int buffering, isatty; - _Py_identifier(open); - _Py_identifier(isatty); - _Py_identifier(TextIOWrapper); + _Py_IDENTIFIER(open); + _Py_IDENTIFIER(isatty); + _Py_IDENTIFIER(TextIOWrapper); /* stdin is always opened in buffered mode, first because it shouldn't make a difference in common use cases, second because TextIOWrapper @@ -831,7 +831,7 @@ goto error; if (buffering) { - _Py_identifier(raw); + _Py_IDENTIFIER(raw); raw = _PyObject_GetAttrId(buf, &PyId_raw); if (raw == NULL) goto error; @@ -1117,7 +1117,7 @@ PyArena *arena; char *ps1 = "", *ps2 = "", *enc = NULL; int errcode = 0; - _Py_identifier(encoding); + _Py_IDENTIFIER(encoding); if (fp == stdin) { /* Fetch encoding from sys.stdin */ @@ -1321,11 +1321,11 @@ { long hold; PyObject *v; - _Py_identifier(msg); - _Py_identifier(filename); - _Py_identifier(lineno); - _Py_identifier(offset); - _Py_identifier(text); + _Py_IDENTIFIER(msg); + _Py_IDENTIFIER(filename); + _Py_IDENTIFIER(lineno); + _Py_IDENTIFIER(offset); + _Py_IDENTIFIER(text); /* old style errors */ if (PyTuple_Check(err)) @@ -1439,7 +1439,7 @@ goto done; if (PyExceptionInstance_Check(value)) { /* The error code should be in the `code' attribute. */ - _Py_identifier(code); + _Py_IDENTIFIER(code); PyObject *code = _PyObject_GetAttrId(value, &PyId_code); if (code) { Py_DECREF(value); @@ -1597,7 +1597,7 @@ else { PyObject* moduleName; char* className; - _Py_identifier(__module__); + _Py_IDENTIFIER(__module__); assert(PyExceptionClass_Check(type)); className = PyExceptionClass_Name(type); if (className != NULL) { @@ -1773,7 +1773,7 @@ { PyObject *f, *r; PyObject *type, *value, *traceback; - _Py_identifier(flush); + _Py_IDENTIFIER(flush); /* Save the current exception */ PyErr_Fetch(&type, &value, &traceback); @@ -2220,7 +2220,7 @@ wait_for_thread_shutdown(void) { #ifdef WITH_THREAD - _Py_identifier(_shutdown); + _Py_IDENTIFIER(_shutdown); PyObject *result; PyThreadState *tstate = PyThreadState_GET(); PyObject *threading = PyMapping_GetItemString(tstate->interp->modules, diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -79,8 +79,8 @@ PyObject *encoded, *escaped_str, *repr_str, *buffer, *result; char *stdout_encoding_str; int ret; - _Py_identifier(encoding); - _Py_identifier(buffer); + _Py_IDENTIFIER(encoding); + _Py_IDENTIFIER(buffer); stdout_encoding = _PyObject_GetAttrId(outf, &PyId_encoding); if (stdout_encoding == NULL) @@ -101,7 +101,7 @@ buffer = _PyObject_GetAttrId(outf, &PyId_buffer); if (buffer) { - _Py_identifier(write); + _Py_IDENTIFIER(write); result = _PyObject_CallMethodId(buffer, &PyId_write, "(O)", encoded); Py_DECREF(buffer); Py_DECREF(encoded); @@ -1843,7 +1843,7 @@ { PyObject *writer = NULL, *args = NULL, *result = NULL; int err; - _Py_identifier(write); + _Py_IDENTIFIER(write); if (file == NULL) return -1; diff --git a/Python/traceback.c b/Python/traceback.c --- a/Python/traceback.c +++ b/Python/traceback.c @@ -152,7 +152,7 @@ const char* filepath; Py_ssize_t len; PyObject* result; - _Py_identifier(open); + _Py_IDENTIFIER(open); filebytes = PyUnicode_EncodeFSDefault(filename); if (filebytes == NULL) { @@ -232,9 +232,9 @@ char buf[MAXPATHLEN+1]; int kind; void *data; - _Py_identifier(close); - _Py_identifier(open); - _Py_identifier(TextIOWrapper); + _Py_IDENTIFIER(close); + _Py_IDENTIFIER(open); + _Py_IDENTIFIER(TextIOWrapper); /* open the file */ if (filename == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 15:16:52 2011 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 14 Oct 2011 15:16:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Port_SetAttrString/HasAttrS?= =?utf8?q?tring_to_SetAttrId/GetAttrId=2E?= Message-ID: http://hg.python.org/cpython/rev/db4aa878cea2 changeset: 72926:db4aa878cea2 user: Martin v. L?wis date: Fri Oct 14 15:16:45 2011 +0200 summary: Port SetAttrString/HasAttrString to SetAttrId/GetAttrId. files: Modules/_cursesmodule.c | 11 +- Modules/_pickle.c | 7 +- Modules/itertoolsmodule.c | 4 +- Objects/descrobject.c | 2 +- Objects/dictobject.c | 5 +- Parser/asdl_c.py | 7 +- Python/Python-ast.c | 269 +++++++++++++------------ Python/_warnings.c | 32 +- Python/ceval.c | 6 +- Python/errors.c | 26 +- Python/pythonrun.c | 9 +- Python/sysmodule.c | 5 +- 12 files changed, 200 insertions(+), 183 deletions(-) diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -2454,6 +2454,8 @@ { PyObject *o; PyObject *m = PyImport_ImportModuleNoBlock("curses"); + _Py_IDENTIFIER(LINES); + _Py_IDENTIFIER(COLS); if (!m) return 0; @@ -2463,12 +2465,13 @@ Py_DECREF(m); return 0; } - if (PyObject_SetAttrString(m, "LINES", o)) { + if (_PyObject_SetAttrId(m, &PyId_LINES, o)) { Py_DECREF(m); Py_DECREF(o); return 0; } - if (PyDict_SetItemString(ModDict, "LINES", o)) { + /* PyId_LINES.object will be initialized here. */ + if (PyDict_SetItem(ModDict, PyId_LINES.object, o)) { Py_DECREF(m); Py_DECREF(o); return 0; @@ -2479,12 +2482,12 @@ Py_DECREF(m); return 0; } - if (PyObject_SetAttrString(m, "COLS", o)) { + if (_PyObject_SetAttrId(m, &PyId_COLS, o)) { Py_DECREF(m); Py_DECREF(o); return 0; } - if (PyDict_SetItemString(ModDict, "COLS", o)) { + if (PyDict_SetItem(ModDict, PyId_COLS.object, o)) { Py_DECREF(m); Py_DECREF(o); return 0; diff --git a/Modules/_pickle.c b/Modules/_pickle.c --- a/Modules/_pickle.c +++ b/Modules/_pickle.c @@ -4388,12 +4388,13 @@ instantiate(PyObject *cls, PyObject *args) { PyObject *result = NULL; + _Py_IDENTIFIER(__getinitargs__); /* Caller must assure args are a tuple. Normally, args come from Pdata_poptuple which packs objects from the top of the stack into a newly created tuple. */ assert(PyTuple_Check(args)); if (Py_SIZE(args) > 0 || !PyType_Check(cls) || - PyObject_HasAttrString(cls, "__getinitargs__")) { + _PyObject_HasAttrId(cls, &PyId___getinitargs__)) { result = PyObject_CallObject(cls, args); } else { @@ -5557,6 +5558,7 @@ PyObject *fix_imports = Py_True; char *encoding = NULL; char *errors = NULL; + _Py_IDENTIFIER(persistent_load); /* XXX: That is an horrible error message. But, I don't know how to do better... */ @@ -5591,8 +5593,7 @@ if (self->fix_imports == -1) return -1; - if (PyObject_HasAttrString((PyObject *)self, "persistent_load")) { - _Py_IDENTIFIER(persistent_load); + if (_PyObject_HasAttrId((PyObject *)self, &PyId_persistent_load)) { self->pers_func = _PyObject_GetAttrId((PyObject *)self, &PyId_persistent_load); if (self->pers_func == NULL) diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -626,6 +626,7 @@ { Py_ssize_t i, n=2; PyObject *it, *iterable, *copyable, *result; + _Py_IDENTIFIER(__copy__); if (!PyArg_ParseTuple(args, "O|n", &iterable, &n)) return NULL; @@ -643,7 +644,7 @@ Py_DECREF(result); return NULL; } - if (!PyObject_HasAttrString(it, "__copy__")) { + if (!_PyObject_HasAttrId(it, &PyId___copy__)) { copyable = tee_fromiterable(it); Py_DECREF(it); if (copyable == NULL) { @@ -654,7 +655,6 @@ copyable = it; PyTuple_SET_ITEM(result, 0, copyable); for (i=1 ; i= 0; + result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; Py_DECREF(l); return result; } @@ -1024,7 +1025,7 @@ for a in sum.attributes: self.emit("value = ast2obj_%s(o->%s);" % (a.type, a.name), 1) self.emit("if (!value) goto failed;", 1) - self.emit('if (PyObject_SetAttrString(result, "%s", value) < 0)' % a.name, 1) + self.emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) < 0)' % a.name, 1) self.emit('goto failed;', 2) self.emit('Py_DECREF(value);', 1) self.func_end() @@ -1070,7 +1071,7 @@ value = "o->v.%s.%s" % (name, field.name) self.set(field, value, depth) emit("if (!value) goto failed;", 0) - emit('if (PyObject_SetAttrString(result, "%s", value) == -1)' % field.name, 0) + emit('if (_PyObject_SetAttrId(result, &PyId_%s, value) == -1)' % field.name, 0) emit("goto failed;", 1) emit("Py_DECREF(value);", 0) diff --git a/Python/Python-ast.c b/Python/Python-ast.c --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -593,6 +593,7 @@ static int add_attributes(PyTypeObject* type, char**attrs, int num_fields) { int i, result; + _Py_IDENTIFIER(_attributes); PyObject *s, *l = PyTuple_New(num_fields); if (!l) return 0; @@ -604,7 +605,7 @@ } PyTuple_SET_ITEM(l, i, s); } - result = PyObject_SetAttrString((PyObject*)type, "_attributes", l) >= 0; + result = _PyObject_SetAttrId((PyObject*)type, &PyId__attributes, l) >= 0; Py_DECREF(l); return result; } @@ -2230,7 +2231,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Module.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2239,7 +2240,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Interactive.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2248,7 +2249,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Expression.body); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2257,7 +2258,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Suite.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2285,29 +2286,29 @@ if (!result) goto failed; value = ast2obj_identifier(o->v.FunctionDef.name); if (!value) goto failed; - if (PyObject_SetAttrString(result, "name", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_arguments(o->v.FunctionDef.args); if (!value) goto failed; - if (PyObject_SetAttrString(result, "args", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.FunctionDef.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.FunctionDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "decorator_list", value) == + if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.FunctionDef.returns); if (!value) goto failed; - if (PyObject_SetAttrString(result, "returns", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) goto failed; Py_DECREF(value); break; @@ -2316,38 +2317,38 @@ if (!result) goto failed; value = ast2obj_identifier(o->v.ClassDef.name); if (!value) goto failed; - if (PyObject_SetAttrString(result, "name", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ClassDef.bases, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "bases", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_bases, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ClassDef.keywords, ast2obj_keyword); if (!value) goto failed; - if (PyObject_SetAttrString(result, "keywords", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.ClassDef.starargs); if (!value) goto failed; - if (PyObject_SetAttrString(result, "starargs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.ClassDef.kwargs); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kwargs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ClassDef.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ClassDef.decorator_list, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "decorator_list", value) == + if (_PyObject_SetAttrId(result, &PyId_decorator_list, value) == -1) goto failed; Py_DECREF(value); @@ -2357,7 +2358,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Return.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -2366,7 +2367,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Delete.targets, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "targets", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) goto failed; Py_DECREF(value); break; @@ -2375,12 +2376,12 @@ if (!result) goto failed; value = ast2obj_list(o->v.Assign.targets, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "targets", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_targets, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Assign.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -2389,17 +2390,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.AugAssign.target); if (!value) goto failed; - if (PyObject_SetAttrString(result, "target", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_operator(o->v.AugAssign.op); if (!value) goto failed; - if (PyObject_SetAttrString(result, "op", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.AugAssign.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -2408,22 +2409,22 @@ if (!result) goto failed; value = ast2obj_expr(o->v.For.target); if (!value) goto failed; - if (PyObject_SetAttrString(result, "target", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.For.iter); if (!value) goto failed; - if (PyObject_SetAttrString(result, "iter", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.For.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.For.orelse, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "orelse", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); break; @@ -2432,17 +2433,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.While.test); if (!value) goto failed; - if (PyObject_SetAttrString(result, "test", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.While.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.While.orelse, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "orelse", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); break; @@ -2451,17 +2452,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.If.test); if (!value) goto failed; - if (PyObject_SetAttrString(result, "test", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.If.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.If.orelse, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "orelse", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); break; @@ -2470,12 +2471,12 @@ if (!result) goto failed; value = ast2obj_list(o->v.With.items, ast2obj_withitem); if (!value) goto failed; - if (PyObject_SetAttrString(result, "items", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_items, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.With.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2484,12 +2485,12 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Raise.exc); if (!value) goto failed; - if (PyObject_SetAttrString(result, "exc", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_exc, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Raise.cause); if (!value) goto failed; - if (PyObject_SetAttrString(result, "cause", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_cause, value) == -1) goto failed; Py_DECREF(value); break; @@ -2498,22 +2499,22 @@ if (!result) goto failed; value = ast2obj_list(o->v.Try.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Try.handlers, ast2obj_excepthandler); if (!value) goto failed; - if (PyObject_SetAttrString(result, "handlers", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_handlers, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Try.orelse, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "orelse", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Try.finalbody, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "finalbody", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_finalbody, value) == -1) goto failed; Py_DECREF(value); break; @@ -2522,12 +2523,12 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Assert.test); if (!value) goto failed; - if (PyObject_SetAttrString(result, "test", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Assert.msg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "msg", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_msg, value) == -1) goto failed; Py_DECREF(value); break; @@ -2536,7 +2537,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Import.names, ast2obj_alias); if (!value) goto failed; - if (PyObject_SetAttrString(result, "names", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) goto failed; Py_DECREF(value); break; @@ -2545,17 +2546,17 @@ if (!result) goto failed; value = ast2obj_identifier(o->v.ImportFrom.module); if (!value) goto failed; - if (PyObject_SetAttrString(result, "module", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_module, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ImportFrom.names, ast2obj_alias); if (!value) goto failed; - if (PyObject_SetAttrString(result, "names", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_int(o->v.ImportFrom.level); if (!value) goto failed; - if (PyObject_SetAttrString(result, "level", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_level, value) == -1) goto failed; Py_DECREF(value); break; @@ -2564,7 +2565,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Global.names, ast2obj_identifier); if (!value) goto failed; - if (PyObject_SetAttrString(result, "names", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) goto failed; Py_DECREF(value); break; @@ -2573,7 +2574,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Nonlocal.names, ast2obj_identifier); if (!value) goto failed; - if (PyObject_SetAttrString(result, "names", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_names, value) == -1) goto failed; Py_DECREF(value); break; @@ -2582,7 +2583,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Expr.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -2601,12 +2602,12 @@ } value = ast2obj_int(o->lineno); if (!value) goto failed; - if (PyObject_SetAttrString(result, "lineno", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) goto failed; Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - if (PyObject_SetAttrString(result, "col_offset", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -2632,12 +2633,12 @@ if (!result) goto failed; value = ast2obj_boolop(o->v.BoolOp.op); if (!value) goto failed; - if (PyObject_SetAttrString(result, "op", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.BoolOp.values, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "values", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) goto failed; Py_DECREF(value); break; @@ -2646,17 +2647,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.BinOp.left); if (!value) goto failed; - if (PyObject_SetAttrString(result, "left", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_operator(o->v.BinOp.op); if (!value) goto failed; - if (PyObject_SetAttrString(result, "op", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.BinOp.right); if (!value) goto failed; - if (PyObject_SetAttrString(result, "right", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_right, value) == -1) goto failed; Py_DECREF(value); break; @@ -2665,12 +2666,12 @@ if (!result) goto failed; value = ast2obj_unaryop(o->v.UnaryOp.op); if (!value) goto failed; - if (PyObject_SetAttrString(result, "op", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_op, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.UnaryOp.operand); if (!value) goto failed; - if (PyObject_SetAttrString(result, "operand", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_operand, value) == -1) goto failed; Py_DECREF(value); break; @@ -2679,12 +2680,12 @@ if (!result) goto failed; value = ast2obj_arguments(o->v.Lambda.args); if (!value) goto failed; - if (PyObject_SetAttrString(result, "args", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Lambda.body); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; @@ -2693,17 +2694,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.IfExp.test); if (!value) goto failed; - if (PyObject_SetAttrString(result, "test", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_test, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.IfExp.body); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.IfExp.orelse); if (!value) goto failed; - if (PyObject_SetAttrString(result, "orelse", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); break; @@ -2712,12 +2713,12 @@ if (!result) goto failed; value = ast2obj_list(o->v.Dict.keys, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "keys", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_keys, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Dict.values, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "values", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_values, value) == -1) goto failed; Py_DECREF(value); break; @@ -2726,7 +2727,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.Set.elts, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elts", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) goto failed; Py_DECREF(value); break; @@ -2735,13 +2736,13 @@ if (!result) goto failed; value = ast2obj_expr(o->v.ListComp.elt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elt", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ListComp.generators, ast2obj_comprehension); if (!value) goto failed; - if (PyObject_SetAttrString(result, "generators", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) goto failed; Py_DECREF(value); break; @@ -2750,13 +2751,13 @@ if (!result) goto failed; value = ast2obj_expr(o->v.SetComp.elt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elt", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.SetComp.generators, ast2obj_comprehension); if (!value) goto failed; - if (PyObject_SetAttrString(result, "generators", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) goto failed; Py_DECREF(value); break; @@ -2765,18 +2766,18 @@ if (!result) goto failed; value = ast2obj_expr(o->v.DictComp.key); if (!value) goto failed; - if (PyObject_SetAttrString(result, "key", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_key, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.DictComp.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.DictComp.generators, ast2obj_comprehension); if (!value) goto failed; - if (PyObject_SetAttrString(result, "generators", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) goto failed; Py_DECREF(value); break; @@ -2785,13 +2786,13 @@ if (!result) goto failed; value = ast2obj_expr(o->v.GeneratorExp.elt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elt", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elt, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.GeneratorExp.generators, ast2obj_comprehension); if (!value) goto failed; - if (PyObject_SetAttrString(result, "generators", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_generators, value) == -1) goto failed; Py_DECREF(value); break; @@ -2800,7 +2801,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Yield.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -2809,7 +2810,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Compare.left); if (!value) goto failed; - if (PyObject_SetAttrString(result, "left", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_left, value) == -1) goto failed; Py_DECREF(value); { @@ -2820,12 +2821,12 @@ PyList_SET_ITEM(value, i, ast2obj_cmpop((cmpop_ty)asdl_seq_GET(o->v.Compare.ops, i))); } if (!value) goto failed; - if (PyObject_SetAttrString(result, "ops", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ops, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Compare.comparators, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "comparators", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_comparators, value) == -1) goto failed; Py_DECREF(value); break; @@ -2834,27 +2835,27 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Call.func); if (!value) goto failed; - if (PyObject_SetAttrString(result, "func", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_func, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Call.args, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "args", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.Call.keywords, ast2obj_keyword); if (!value) goto failed; - if (PyObject_SetAttrString(result, "keywords", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_keywords, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Call.starargs); if (!value) goto failed; - if (PyObject_SetAttrString(result, "starargs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_starargs, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Call.kwargs); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kwargs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwargs, value) == -1) goto failed; Py_DECREF(value); break; @@ -2863,7 +2864,7 @@ if (!result) goto failed; value = ast2obj_object(o->v.Num.n); if (!value) goto failed; - if (PyObject_SetAttrString(result, "n", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_n, value) == -1) goto failed; Py_DECREF(value); break; @@ -2872,7 +2873,7 @@ if (!result) goto failed; value = ast2obj_string(o->v.Str.s); if (!value) goto failed; - if (PyObject_SetAttrString(result, "s", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_s, value) == -1) goto failed; Py_DECREF(value); break; @@ -2881,7 +2882,7 @@ if (!result) goto failed; value = ast2obj_bytes(o->v.Bytes.s); if (!value) goto failed; - if (PyObject_SetAttrString(result, "s", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_s, value) == -1) goto failed; Py_DECREF(value); break; @@ -2894,17 +2895,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Attribute.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_identifier(o->v.Attribute.attr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "attr", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_attr, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.Attribute.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; @@ -2913,17 +2914,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Subscript.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_slice(o->v.Subscript.slice); if (!value) goto failed; - if (PyObject_SetAttrString(result, "slice", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_slice, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.Subscript.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; @@ -2932,12 +2933,12 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Starred.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.Starred.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; @@ -2946,12 +2947,12 @@ if (!result) goto failed; value = ast2obj_identifier(o->v.Name.id); if (!value) goto failed; - if (PyObject_SetAttrString(result, "id", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_id, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.Name.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; @@ -2960,12 +2961,12 @@ if (!result) goto failed; value = ast2obj_list(o->v.List.elts, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elts", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.List.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; @@ -2974,24 +2975,24 @@ if (!result) goto failed; value = ast2obj_list(o->v.Tuple.elts, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "elts", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_elts, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr_context(o->v.Tuple.ctx); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ctx", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ctx, value) == -1) goto failed; Py_DECREF(value); break; } value = ast2obj_int(o->lineno); if (!value) goto failed; - if (PyObject_SetAttrString(result, "lineno", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) goto failed; Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - if (PyObject_SetAttrString(result, "col_offset", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3044,17 +3045,17 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Slice.lower); if (!value) goto failed; - if (PyObject_SetAttrString(result, "lower", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_lower, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Slice.upper); if (!value) goto failed; - if (PyObject_SetAttrString(result, "upper", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_upper, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->v.Slice.step); if (!value) goto failed; - if (PyObject_SetAttrString(result, "step", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_step, value) == -1) goto failed; Py_DECREF(value); break; @@ -3063,7 +3064,7 @@ if (!result) goto failed; value = ast2obj_list(o->v.ExtSlice.dims, ast2obj_slice); if (!value) goto failed; - if (PyObject_SetAttrString(result, "dims", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_dims, value) == -1) goto failed; Py_DECREF(value); break; @@ -3072,7 +3073,7 @@ if (!result) goto failed; value = ast2obj_expr(o->v.Index.value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); break; @@ -3218,17 +3219,17 @@ if (!result) return NULL; value = ast2obj_expr(o->target); if (!value) goto failed; - if (PyObject_SetAttrString(result, "target", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_target, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->iter); if (!value) goto failed; - if (PyObject_SetAttrString(result, "iter", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_iter, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->ifs, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "ifs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_ifs, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3254,29 +3255,29 @@ if (!result) goto failed; value = ast2obj_expr(o->v.ExceptHandler.type); if (!value) goto failed; - if (PyObject_SetAttrString(result, "type", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_type, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_identifier(o->v.ExceptHandler.name); if (!value) goto failed; - if (PyObject_SetAttrString(result, "name", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->v.ExceptHandler.body, ast2obj_stmt); if (!value) goto failed; - if (PyObject_SetAttrString(result, "body", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); break; } value = ast2obj_int(o->lineno); if (!value) goto failed; - if (PyObject_SetAttrString(result, "lineno", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) goto failed; Py_DECREF(value); value = ast2obj_int(o->col_offset); if (!value) goto failed; - if (PyObject_SetAttrString(result, "col_offset", value) < 0) + if (_PyObject_SetAttrId(result, &PyId_col_offset, value) < 0) goto failed; Py_DECREF(value); return result; @@ -3300,42 +3301,42 @@ if (!result) return NULL; value = ast2obj_list(o->args, ast2obj_arg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "args", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_args, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_identifier(o->vararg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "vararg", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_vararg, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->varargannotation); if (!value) goto failed; - if (PyObject_SetAttrString(result, "varargannotation", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_varargannotation, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->kwonlyargs, ast2obj_arg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kwonlyargs", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwonlyargs, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_identifier(o->kwarg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kwarg", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwarg, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->kwargannotation); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kwargannotation", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kwargannotation, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->defaults, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "defaults", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_defaults, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_list(o->kw_defaults, ast2obj_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "kw_defaults", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_kw_defaults, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3359,12 +3360,12 @@ if (!result) return NULL; value = ast2obj_identifier(o->arg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "arg", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->annotation); if (!value) goto failed; - if (PyObject_SetAttrString(result, "annotation", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3388,12 +3389,12 @@ if (!result) return NULL; value = ast2obj_identifier(o->arg); if (!value) goto failed; - if (PyObject_SetAttrString(result, "arg", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_arg, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->value); if (!value) goto failed; - if (PyObject_SetAttrString(result, "value", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3417,12 +3418,12 @@ if (!result) return NULL; value = ast2obj_identifier(o->name); if (!value) goto failed; - if (PyObject_SetAttrString(result, "name", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_name, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_identifier(o->asname); if (!value) goto failed; - if (PyObject_SetAttrString(result, "asname", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_asname, value) == -1) goto failed; Py_DECREF(value); return result; @@ -3446,12 +3447,12 @@ if (!result) return NULL; value = ast2obj_expr(o->context_expr); if (!value) goto failed; - if (PyObject_SetAttrString(result, "context_expr", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_context_expr, value) == -1) goto failed; Py_DECREF(value); value = ast2obj_expr(o->optional_vars); if (!value) goto failed; - if (PyObject_SetAttrString(result, "optional_vars", value) == -1) + if (_PyObject_SetAttrId(result, &PyId_optional_vars, value) == -1) goto failed; Py_DECREF(value); return result; diff --git a/Python/_warnings.c b/Python/_warnings.c --- a/Python/_warnings.c +++ b/Python/_warnings.c @@ -654,8 +654,9 @@ return NULL; if (module_globals) { - static PyObject *get_source_name = NULL; - static PyObject *splitlines_name = NULL; + _Py_IDENTIFIER(get_source); + _Py_IDENTIFIER(splitlines); + PyObject *tmp; PyObject *loader; PyObject *module_name; PyObject *source; @@ -663,16 +664,12 @@ PyObject *source_line; PyObject *returned; - if (get_source_name == NULL) { - get_source_name = PyUnicode_InternFromString("get_source"); - if (!get_source_name) - return NULL; - } - if (splitlines_name == NULL) { - splitlines_name = PyUnicode_InternFromString("splitlines"); - if (!splitlines_name) - return NULL; - } + if ((tmp = _PyUnicode_FromId(&PyId_get_source)) == NULL) + return NULL; + Py_DECREF(tmp); + if ((tmp = _PyUnicode_FromId(&PyId_splitlines)) == NULL) + return NULL; + Py_DECREF(tmp); /* Check/get the requisite pieces needed for the loader. */ loader = PyDict_GetItemString(module_globals, "__loader__"); @@ -682,11 +679,11 @@ goto standard_call; /* Make sure the loader implements the optional get_source() method. */ - if (!PyObject_HasAttrString(loader, "get_source")) + if (!_PyObject_HasAttrId(loader, &PyId_get_source)) goto standard_call; /* Call get_source() to get the source code. */ - source = PyObject_CallMethodObjArgs(loader, get_source_name, - module_name, NULL); + source = PyObject_CallMethodObjArgs(loader, PyId_get_source.object, + module_name, NULL); if (!source) return NULL; else if (source == Py_None) { @@ -695,8 +692,9 @@ } /* Split the source into lines. */ - source_list = PyObject_CallMethodObjArgs(source, splitlines_name, - NULL); + source_list = PyObject_CallMethodObjArgs(source, + PyId_splitlines.object, + NULL); Py_DECREF(source); if (!source_list) return NULL; diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -4422,7 +4422,9 @@ static int import_all_from(PyObject *locals, PyObject *v) { - PyObject *all = PyObject_GetAttrString(v, "__all__"); + _Py_IDENTIFIER(__all__); + _Py_IDENTIFIER(__dict__); + PyObject *all = _PyObject_GetAttrId(v, &PyId___all__); PyObject *dict, *name, *value; int skip_leading_underscores = 0; int pos, err; @@ -4431,7 +4433,7 @@ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return -1; /* Unexpected error */ PyErr_Clear(); - dict = PyObject_GetAttrString(v, "__dict__"); + dict = _PyObject_GetAttrId(v, &PyId___dict__); if (dict == NULL) { if (!PyErr_ExceptionMatches(PyExc_AttributeError)) return -1; diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -780,6 +780,12 @@ PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset) { PyObject *exc, *v, *tb, *tmp; + _Py_IDENTIFIER(filename); + _Py_IDENTIFIER(lineno); + _Py_IDENTIFIER(msg); + _Py_IDENTIFIER(offset); + _Py_IDENTIFIER(print_file_and_line); + _Py_IDENTIFIER(text); /* add attributes for the line number and filename for the error */ PyErr_Fetch(&exc, &v, &tb); @@ -790,7 +796,7 @@ if (tmp == NULL) PyErr_Clear(); else { - if (PyObject_SetAttrString(v, "lineno", tmp)) + if (_PyObject_SetAttrId(v, &PyId_lineno, tmp)) PyErr_Clear(); Py_DECREF(tmp); } @@ -799,7 +805,7 @@ if (tmp == NULL) PyErr_Clear(); else { - if (PyObject_SetAttrString(v, "offset", tmp)) + if (_PyObject_SetAttrId(v, &PyId_offset, tmp)) PyErr_Clear(); Py_DECREF(tmp); } @@ -809,35 +815,35 @@ if (tmp == NULL) PyErr_Clear(); else { - if (PyObject_SetAttrString(v, "filename", tmp)) + if (_PyObject_SetAttrId(v, &PyId_filename, tmp)) PyErr_Clear(); Py_DECREF(tmp); } tmp = PyErr_ProgramText(filename, lineno); if (tmp) { - if (PyObject_SetAttrString(v, "text", tmp)) + if (_PyObject_SetAttrId(v, &PyId_text, tmp)) PyErr_Clear(); Py_DECREF(tmp); } } - if (PyObject_SetAttrString(v, "offset", Py_None)) { + if (_PyObject_SetAttrId(v, &PyId_offset, Py_None)) { PyErr_Clear(); } if (exc != PyExc_SyntaxError) { - if (!PyObject_HasAttrString(v, "msg")) { + if (!_PyObject_HasAttrId(v, &PyId_msg)) { tmp = PyObject_Str(v); if (tmp) { - if (PyObject_SetAttrString(v, "msg", tmp)) + if (_PyObject_SetAttrId(v, &PyId_msg, tmp)) PyErr_Clear(); Py_DECREF(tmp); } else { PyErr_Clear(); } } - if (!PyObject_HasAttrString(v, "print_file_and_line")) { - if (PyObject_SetAttrString(v, "print_file_and_line", - Py_None)) + if (!_PyObject_HasAttrId(v, &PyId_print_file_and_line)) { + if (_PyObject_SetAttrId(v, &PyId_print_file_and_line, + Py_None)) PyErr_Clear(); } } diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -810,6 +810,8 @@ _Py_IDENTIFIER(open); _Py_IDENTIFIER(isatty); _Py_IDENTIFIER(TextIOWrapper); + _Py_IDENTIFIER(name); + _Py_IDENTIFIER(mode); /* stdin is always opened in buffered mode, first because it shouldn't make a difference in common use cases, second because TextIOWrapper @@ -842,7 +844,7 @@ } text = PyUnicode_FromString(name); - if (text == NULL || PyObject_SetAttrString(raw, "name", text) < 0) + if (text == NULL || _PyObject_SetAttrId(raw, &PyId_name, text) < 0) goto error; res = _PyObject_CallMethodId(raw, &PyId_isatty, ""); if (res == NULL) @@ -879,7 +881,7 @@ else mode = "r"; text = PyUnicode_FromString(mode); - if (!text || PyObject_SetAttrString(stream, "mode", text) < 0) + if (!text || _PyObject_SetAttrId(stream, &PyId_mode, text) < 0) goto error; Py_CLEAR(text); return stream; @@ -1547,6 +1549,7 @@ { int err = 0; PyObject *type, *tb; + _Py_IDENTIFIER(print_file_and_line); if (!PyExceptionInstance_Check(value)) { PyFile_WriteString("TypeError: print_exception(): Exception expected for value, ", f); @@ -1562,7 +1565,7 @@ if (tb && tb != Py_None) err = PyTraceBack_Print(tb, f); if (err == 0 && - PyObject_HasAttrString(value, "print_file_and_line")) + _PyObject_HasAttrId(value, &PyId_print_file_and_line)) { PyObject *message; const char *filename, *text; diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -139,6 +139,7 @@ PyObject *modules = interp->modules; PyObject *builtins = PyDict_GetItemString(modules, "builtins"); int err; + _Py_IDENTIFIER(_); if (builtins == NULL) { PyErr_SetString(PyExc_RuntimeError, "lost builtins module"); @@ -152,7 +153,7 @@ Py_INCREF(Py_None); return Py_None; } - if (PyObject_SetAttrString(builtins, "_", Py_None) != 0) + if (_PyObject_SetAttrId(builtins, &PyId__, Py_None) != 0) return NULL; outf = PySys_GetObject("stdout"); if (outf == NULL || outf == Py_None) { @@ -174,7 +175,7 @@ } if (PyFile_WriteString("\n", outf) != 0) return NULL; - if (PyObject_SetAttrString(builtins, "_", o) != 0) + if (_PyObject_SetAttrId(builtins, &PyId__, o) != 0) return NULL; Py_INCREF(Py_None); return Py_None; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:10 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_tests_for_Unicode_handl?= =?utf8?q?ing_in_packaging=E2=80=99_check_and_register_=28=2313114=29?= Message-ID: http://hg.python.org/cpython/rev/d5fb646e7ce1 changeset: 72927:d5fb646e7ce1 parent: 72847:f924e0f62bcb user: ?ric Araujo date: Tue Oct 11 02:18:12 2011 +0200 summary: Add tests for Unicode handling in packaging? check and register (#13114) files: Lib/packaging/tests/test_command_check.py | 25 ++++++++- Lib/packaging/tests/test_command_register.py | 28 +++++++-- 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/Lib/packaging/tests/test_command_check.py b/Lib/packaging/tests/test_command_check.py --- a/Lib/packaging/tests/test_command_check.py +++ b/Lib/packaging/tests/test_command_check.py @@ -56,6 +56,15 @@ cmd = self._run(metadata, strict=True) self.assertEqual([], self.get_logs(logging.WARNING)) + # now a test with non-ASCII characters + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': '1.2', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual([], self.get_logs(logging.WARNING)) + def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata @@ -95,14 +104,26 @@ @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): - # let's see if it detects broken rest in long_description + # let's see if it detects broken rest in description broken_rest = 'title\n===\n\ntest' pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + # clear warnings from the previous call + self.loghandler.flush() - pkg_info, dist = self.create_dist(description='title\n=====\n\ntest') + # let's see if we have an error with strict=1 + metadata = {'home_page': 'xxx', 'author': 'xxx', + 'author_email': 'xxx', + 'name': 'xxx', 'version': '1.2', + 'description': broken_rest} + self.assertRaises(PackagingSetupError, self._run, metadata, + strict=True, all=True) + self.loghandler.flush() + + # and non-broken rest, including a non-ASCII character to test #12114 + dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() self.assertEqual([], self.get_logs(logging.WARNING)) diff --git a/Lib/packaging/tests/test_command_register.py b/Lib/packaging/tests/test_command_register.py --- a/Lib/packaging/tests/test_command_register.py +++ b/Lib/packaging/tests/test_command_register.py @@ -200,12 +200,10 @@ @unittest.skipUnless(DOCUTILS_SUPPORT, 'needs docutils') def test_strict(self): - # testing the script option - # when on, the register command stops if - # the metadata is incomplete or if - # long_description is not reSt compliant + # testing the strict option: when on, the register command stops if the + # metadata is incomplete or if description contains bad reST - # empty metadata + # empty metadata # XXX this is not really empty.. cmd = self._get_cmd({'name': 'xxx', 'version': 'xxx'}) cmd.ensure_finalized() cmd.strict = True @@ -213,16 +211,15 @@ register_module.input = inputs self.assertRaises(PackagingSetupError, cmd.run) - # metadata is OK but long_description is broken + # metadata is OK but description is broken metadata = {'home_page': 'xxx', 'author': 'xxx', 'author_email': '?x?x?', - 'name': 'xxx', 'version': 'xxx', + 'name': 'xxx', 'version': '4.2', 'description': 'title\n==\n\ntext'} cmd = self._get_cmd(metadata) cmd.ensure_finalized() cmd.strict = True - self.assertRaises(PackagingSetupError, cmd.run) # now something that works @@ -243,6 +240,21 @@ cmd.ensure_finalized() cmd.run() + # and finally a Unicode test (bug #12114) + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = True + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs + cmd.ensure_finalized() + cmd.run() + def test_register_pep345(self): cmd = self._get_cmd({}) cmd.ensure_finalized() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:11 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Increase_test_c?= =?utf8?q?overage_for_distutils=2Efilelist_=28=2311751=29=2E?= Message-ID: http://hg.python.org/cpython/rev/866d098367c1 changeset: 72928:866d098367c1 branch: 3.2 parent: 72845:ea233722a4b6 user: ?ric Araujo date: Tue Oct 11 02:45:51 2011 +0200 summary: Increase test coverage for distutils.filelist (#11751). Patch by Justin Love. files: Lib/distutils/tests/test_filelist.py | 201 ++++++++++++++- Misc/ACKS | 1 + 2 files changed, 195 insertions(+), 7 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,11 +1,25 @@ """Tests for distutils.filelist.""" +import re import unittest +from distutils import debug +from distutils.log import WARN +from distutils.errors import DistutilsTemplateError +from distutils.filelist import glob_to_re, translate_pattern, FileList -from distutils.filelist import glob_to_re, FileList from test.support import captured_stdout, run_unittest -from distutils import debug +from distutils.tests import support -class FileListTestCase(unittest.TestCase): + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEqual(self.get_logs(WARN), []) + self.clear_logs() + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(WARN)), 0) + self.clear_logs() def test_glob_to_re(self): # simple cases @@ -23,18 +37,191 @@ file_list = FileList() with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), '') + self.assertEqual(stdout.getvalue(), '') debug.DEBUG = True try: with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), 'xxx\n') + self.assertEqual(stdout.getvalue(), 'xxx\n') finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand (sdist does it) + file_list.sort() + file_list.remove_duplicates() + self.assertEqual(file_list.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # not regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=False), + 'search')) + + # is a regex + regex = re.compile('a') + self.assertEqual( + translate_pattern(regex, anchor=True, is_regex=True), + regex) + + # plain string flagged as regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=True), + 'search')) + + # glob support + self.assertTrue(translate_pattern( + '*.py', anchor=True, is_regex=False).search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + # test excludes + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEqual(file_list.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + # test * matches all files + file_list = FileList() + self.assertIsNone(file_list.allfiles) + file_list.set_allfiles(['a.py', 'b.txt']) + file_list.include_pattern('*') + self.assertEqual(file_list.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + file_list = FileList() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune', 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, action) + + # include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEqual(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEqual(file_list.files, ['a.py']) + self.assertWarnings() + + # exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEqual(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEqual(file_list.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + + def test_suite(): return unittest.makeSuite(FileListTestCase) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -554,6 +554,7 @@ Stephanie Lockwood Anne Lord Tom Loredo +Justin Love Jason Lowe Tony Lownds Ray Loyzaga -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:12 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_=2311751_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/ba894d8a2a57 changeset: 72929:ba894d8a2a57 parent: 72927:d5fb646e7ce1 parent: 72928:866d098367c1 user: ?ric Araujo date: Tue Oct 11 02:46:59 2011 +0200 summary: Merge #11751 from 3.2 files: Lib/distutils/tests/test_filelist.py | 201 ++++++++++++++- Misc/ACKS | 1 + 2 files changed, 195 insertions(+), 7 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,11 +1,25 @@ """Tests for distutils.filelist.""" +import re import unittest +from distutils import debug +from distutils.log import WARN +from distutils.errors import DistutilsTemplateError +from distutils.filelist import glob_to_re, translate_pattern, FileList -from distutils.filelist import glob_to_re, FileList from test.support import captured_stdout, run_unittest -from distutils import debug +from distutils.tests import support -class FileListTestCase(unittest.TestCase): + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEqual(self.get_logs(WARN), []) + self.clear_logs() + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(WARN)), 0) + self.clear_logs() def test_glob_to_re(self): # simple cases @@ -23,18 +37,191 @@ file_list = FileList() with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), '') + self.assertEqual(stdout.getvalue(), '') debug.DEBUG = True try: with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), 'xxx\n') + self.assertEqual(stdout.getvalue(), 'xxx\n') finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand (sdist does it) + file_list.sort() + file_list.remove_duplicates() + self.assertEqual(file_list.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # not regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=False), + 'search')) + + # is a regex + regex = re.compile('a') + self.assertEqual( + translate_pattern(regex, anchor=True, is_regex=True), + regex) + + # plain string flagged as regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=True), + 'search')) + + # glob support + self.assertTrue(translate_pattern( + '*.py', anchor=True, is_regex=False).search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + # test excludes + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEqual(file_list.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + # test * matches all files + file_list = FileList() + self.assertIsNone(file_list.allfiles) + file_list.set_allfiles(['a.py', 'b.txt']) + file_list.include_pattern('*') + self.assertEqual(file_list.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + file_list = FileList() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune', 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, action) + + # include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEqual(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEqual(file_list.files, ['a.py']) + self.assertWarnings() + + # exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEqual(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEqual(file_list.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + + def test_suite(): return unittest.makeSuite(FileListTestCase) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -590,6 +590,7 @@ Stephanie Lockwood Anne Lord Tom Loredo +Justin Love Jason Lowe Tony Lownds Ray Loyzaga -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:13 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Increase_test_coverage_for_?= =?utf8?q?packaging=2Emanifest_=28=2311751=29=2E?= Message-ID: http://hg.python.org/cpython/rev/a30d4864a8e4 changeset: 72930:a30d4864a8e4 user: ?ric Araujo date: Tue Oct 11 03:06:16 2011 +0200 summary: Increase test coverage for packaging.manifest (#11751). Patch by Justin Love. files: Lib/packaging/manifest.py | 4 +- Lib/packaging/tests/test_manifest.py | 197 ++++++++++++++- 2 files changed, 199 insertions(+), 2 deletions(-) diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -147,7 +147,9 @@ def _parse_template_line(self, line): words = line.split() - if len(words) == 1: + if len(words) == 1 and words[0] not in ( + 'include', 'exclude', 'global-include', 'global-exclude', + 'recursive-include', 'recursive-exclude', 'graft', 'prune'): # no action given, let's use the default 'include' words.insert(0, 'include') diff --git a/Lib/packaging/tests/test_manifest.py b/Lib/packaging/tests/test_manifest.py --- a/Lib/packaging/tests/test_manifest.py +++ b/Lib/packaging/tests/test_manifest.py @@ -1,8 +1,10 @@ """Tests for packaging.manifest.""" import os +import re import logging from io import StringIO -from packaging.manifest import Manifest +from packaging.errors import PackagingTemplateError +from packaging.manifest import Manifest, _translate_pattern, _glob_to_re from packaging.tests import unittest, support @@ -34,6 +36,12 @@ os.chdir(self.cwd) super(ManifestTestCase, self).tearDown() + def assertNoWarnings(self): + self.assertEqual(self.get_logs(logging.WARNING), []) + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(logging.WARNING)), 0) + def test_manifest_reader(self): tmpdir = self.mkdtemp() MANIFEST = os.path.join(tmpdir, 'MANIFEST.in') @@ -69,6 +77,193 @@ manifest.read_template(content) self.assertEqual(['README', 'file1'], manifest.files) + def test_glob_to_re(self): + # simple cases + self.assertEqual(_glob_to_re('foo*'), 'foo[^/]*\\Z(?ms)') + self.assertEqual(_glob_to_re('foo?'), 'foo[^/]\\Z(?ms)') + self.assertEqual(_glob_to_re('foo??'), 'foo[^/][^/]\\Z(?ms)') + + # special cases + self.assertEqual(_glob_to_re(r'foo\\*'), r'foo\\\\[^/]*\Z(?ms)') + self.assertEqual(_glob_to_re(r'foo\\\*'), r'foo\\\\\\[^/]*\Z(?ms)') + self.assertEqual(_glob_to_re('foo????'), r'foo[^/][^/][^/][^/]\Z(?ms)') + self.assertEqual(_glob_to_re(r'foo\\??'), r'foo\\\\[^/][^/]\Z(?ms)') + + def test_remove_duplicates(self): + manifest = Manifest() + manifest.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand + manifest.sort() + manifest.remove_duplicates() + self.assertEqual(manifest.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # blackbox test of a private function + + # not regex + pattern = _translate_pattern('a', anchor=True, is_regex=False) + self.assertTrue(hasattr(pattern, 'search')) + + # is a regex + regex = re.compile('a') + pattern = _translate_pattern(regex, anchor=True, is_regex=True) + self.assertEqual(pattern, regex) + + # plain string flagged as regex + pattern = _translate_pattern('a', anchor=True, is_regex=True) + self.assertTrue(hasattr(pattern, 'search')) + + # glob support + pattern = _translate_pattern('*.py', anchor=True, is_regex=False) + self.assertTrue(pattern.search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + manifest = Manifest() + self.assertFalse(manifest.exclude_pattern('*.py')) + + # return True if files match + manifest = Manifest() + manifest.files = ['a.py', 'b.py'] + self.assertTrue(manifest.exclude_pattern('*.py')) + + # test excludes + manifest = Manifest() + manifest.files = ['a.py', 'a.txt'] + manifest.exclude_pattern('*.py') + self.assertEqual(manifest.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + manifest = Manifest() + manifest.allfiles = [] + self.assertFalse(manifest._include_pattern('*.py')) + + # return True if files match + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt'] + self.assertTrue(manifest._include_pattern('*.py')) + + # test * matches all files + manifest = Manifest() + self.assertIsNone(manifest.allfiles) + manifest.allfiles = ['a.py', 'b.txt'] + manifest._include_pattern('*') + self.assertEqual(manifest.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + manifest = Manifest() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune'): + self.assertRaises(PackagingTemplateError, + manifest._process_template_line, action) + + # implicit include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('*.py') + self.assertEqual(manifest.files, ['a.py']) + self.assertNoWarnings() + + # include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('include *.py') + self.assertEqual(manifest.files, ['a.py']) + self.assertNoWarnings() + + manifest._process_template_line('include *.rb') + self.assertEqual(manifest.files, ['a.py']) + self.assertWarnings() + + # exclude + manifest = Manifest() + manifest.files = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('exclude *.py') + self.assertEqual(manifest.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + manifest._process_template_line('exclude *.rb') + self.assertEqual(manifest.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('global-include *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + manifest._process_template_line('global-include *.rb') + self.assertEqual(manifest.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + manifest = Manifest() + manifest.files = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('global-exclude *.py') + self.assertEqual(manifest.files, ['b.txt']) + self.assertNoWarnings() + + manifest._process_template_line('global-exclude *.rb') + self.assertEqual(manifest.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + manifest = Manifest() + manifest.allfiles = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + manifest._process_template_line('recursive-include d *.py') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + manifest._process_template_line('recursive-include e *.py') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + manifest = Manifest() + manifest.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + manifest._process_template_line('recursive-exclude d *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + manifest._process_template_line('recursive-exclude e *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + manifest = Manifest() + manifest.allfiles = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + manifest._process_template_line('graft d') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + manifest._process_template_line('graft e') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + manifest = Manifest() + manifest.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + manifest._process_template_line('prune d') + self.assertEqual(manifest.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + manifest._process_template_line('prune e') + self.assertEqual(manifest.files, ['a.py', 'f/f.py']) + self.assertWarnings() + def test_suite(): return unittest.makeSuite(ManifestTestCase) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:13 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:13 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/f87187e61961 changeset: 72931:f87187e61961 branch: 3.2 parent: 72923:341008eab87d parent: 72928:866d098367c1 user: ?ric Araujo date: Fri Oct 14 16:50:09 2011 +0200 summary: Branch merge files: Lib/distutils/tests/test_filelist.py | 201 ++++++++++++++- Misc/ACKS | 1 + 2 files changed, 195 insertions(+), 7 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,11 +1,25 @@ """Tests for distutils.filelist.""" +import re import unittest +from distutils import debug +from distutils.log import WARN +from distutils.errors import DistutilsTemplateError +from distutils.filelist import glob_to_re, translate_pattern, FileList -from distutils.filelist import glob_to_re, FileList from test.support import captured_stdout, run_unittest -from distutils import debug +from distutils.tests import support -class FileListTestCase(unittest.TestCase): + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEqual(self.get_logs(WARN), []) + self.clear_logs() + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(WARN)), 0) + self.clear_logs() def test_glob_to_re(self): # simple cases @@ -23,18 +37,191 @@ file_list = FileList() with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), '') + self.assertEqual(stdout.getvalue(), '') debug.DEBUG = True try: with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), 'xxx\n') + self.assertEqual(stdout.getvalue(), 'xxx\n') finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand (sdist does it) + file_list.sort() + file_list.remove_duplicates() + self.assertEqual(file_list.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # not regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=False), + 'search')) + + # is a regex + regex = re.compile('a') + self.assertEqual( + translate_pattern(regex, anchor=True, is_regex=True), + regex) + + # plain string flagged as regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=True), + 'search')) + + # glob support + self.assertTrue(translate_pattern( + '*.py', anchor=True, is_regex=False).search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + # test excludes + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEqual(file_list.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + # test * matches all files + file_list = FileList() + self.assertIsNone(file_list.allfiles) + file_list.set_allfiles(['a.py', 'b.txt']) + file_list.include_pattern('*') + self.assertEqual(file_list.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + file_list = FileList() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune', 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, action) + + # include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEqual(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEqual(file_list.files, ['a.py']) + self.assertWarnings() + + # exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEqual(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEqual(file_list.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + + def test_suite(): return unittest.makeSuite(FileListTestCase) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -554,6 +554,7 @@ Stephanie Lockwood Anne Lord Tom Loredo +Justin Love Jason Lowe Tony Lownds Ray Loyzaga -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:14 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/5b6b53da3e40 changeset: 72932:5b6b53da3e40 parent: 72926:db4aa878cea2 parent: 72930:a30d4864a8e4 user: ?ric Araujo date: Fri Oct 14 16:56:02 2011 +0200 summary: Branch merge files: Lib/distutils/tests/test_filelist.py | 201 +++++++++- Lib/packaging/manifest.py | 4 +- Lib/packaging/tests/test_command_check.py | 25 +- Lib/packaging/tests/test_command_register.py | 28 +- Lib/packaging/tests/test_manifest.py | 197 +++++++++- Misc/ACKS | 1 + 6 files changed, 437 insertions(+), 19 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,11 +1,25 @@ """Tests for distutils.filelist.""" +import re import unittest +from distutils import debug +from distutils.log import WARN +from distutils.errors import DistutilsTemplateError +from distutils.filelist import glob_to_re, translate_pattern, FileList -from distutils.filelist import glob_to_re, FileList from test.support import captured_stdout, run_unittest -from distutils import debug +from distutils.tests import support -class FileListTestCase(unittest.TestCase): + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEqual(self.get_logs(WARN), []) + self.clear_logs() + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(WARN)), 0) + self.clear_logs() def test_glob_to_re(self): # simple cases @@ -23,18 +37,191 @@ file_list = FileList() with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), '') + self.assertEqual(stdout.getvalue(), '') debug.DEBUG = True try: with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), 'xxx\n') + self.assertEqual(stdout.getvalue(), 'xxx\n') finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand (sdist does it) + file_list.sort() + file_list.remove_duplicates() + self.assertEqual(file_list.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # not regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=False), + 'search')) + + # is a regex + regex = re.compile('a') + self.assertEqual( + translate_pattern(regex, anchor=True, is_regex=True), + regex) + + # plain string flagged as regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=True), + 'search')) + + # glob support + self.assertTrue(translate_pattern( + '*.py', anchor=True, is_regex=False).search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + # test excludes + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEqual(file_list.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + # test * matches all files + file_list = FileList() + self.assertIsNone(file_list.allfiles) + file_list.set_allfiles(['a.py', 'b.txt']) + file_list.include_pattern('*') + self.assertEqual(file_list.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + file_list = FileList() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune', 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, action) + + # include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEqual(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEqual(file_list.files, ['a.py']) + self.assertWarnings() + + # exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEqual(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEqual(file_list.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + + def test_suite(): return unittest.makeSuite(FileListTestCase) diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -147,7 +147,9 @@ def _parse_template_line(self, line): words = line.split() - if len(words) == 1: + if len(words) == 1 and words[0] not in ( + 'include', 'exclude', 'global-include', 'global-exclude', + 'recursive-include', 'recursive-exclude', 'graft', 'prune'): # no action given, let's use the default 'include' words.insert(0, 'include') diff --git a/Lib/packaging/tests/test_command_check.py b/Lib/packaging/tests/test_command_check.py --- a/Lib/packaging/tests/test_command_check.py +++ b/Lib/packaging/tests/test_command_check.py @@ -56,6 +56,15 @@ cmd = self._run(metadata, strict=True) self.assertEqual([], self.get_logs(logging.WARNING)) + # now a test with non-ASCII characters + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': '1.2', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + cmd = self._run(metadata) + self.assertEqual([], self.get_logs(logging.WARNING)) + def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata @@ -95,14 +104,26 @@ @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): - # let's see if it detects broken rest in long_description + # let's see if it detects broken rest in description broken_rest = 'title\n===\n\ntest' pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + # clear warnings from the previous call + self.loghandler.flush() - pkg_info, dist = self.create_dist(description='title\n=====\n\ntest') + # let's see if we have an error with strict=1 + metadata = {'home_page': 'xxx', 'author': 'xxx', + 'author_email': 'xxx', + 'name': 'xxx', 'version': '1.2', + 'description': broken_rest} + self.assertRaises(PackagingSetupError, self._run, metadata, + strict=True, all=True) + self.loghandler.flush() + + # and non-broken rest, including a non-ASCII character to test #12114 + dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() self.assertEqual([], self.get_logs(logging.WARNING)) diff --git a/Lib/packaging/tests/test_command_register.py b/Lib/packaging/tests/test_command_register.py --- a/Lib/packaging/tests/test_command_register.py +++ b/Lib/packaging/tests/test_command_register.py @@ -200,12 +200,10 @@ @unittest.skipUnless(DOCUTILS_SUPPORT, 'needs docutils') def test_strict(self): - # testing the script option - # when on, the register command stops if - # the metadata is incomplete or if - # long_description is not reSt compliant + # testing the strict option: when on, the register command stops if the + # metadata is incomplete or if description contains bad reST - # empty metadata + # empty metadata # XXX this is not really empty.. cmd = self._get_cmd({'name': 'xxx', 'version': 'xxx'}) cmd.ensure_finalized() cmd.strict = True @@ -213,16 +211,15 @@ register_module.input = inputs self.assertRaises(PackagingSetupError, cmd.run) - # metadata is OK but long_description is broken + # metadata is OK but description is broken metadata = {'home_page': 'xxx', 'author': 'xxx', 'author_email': '?x?x?', - 'name': 'xxx', 'version': 'xxx', + 'name': 'xxx', 'version': '4.2', 'description': 'title\n==\n\ntext'} cmd = self._get_cmd(metadata) cmd.ensure_finalized() cmd.strict = True - self.assertRaises(PackagingSetupError, cmd.run) # now something that works @@ -243,6 +240,21 @@ cmd.ensure_finalized() cmd.run() + # and finally a Unicode test (bug #12114) + metadata = {'home_page': 'xxx', 'author': '\u00c9ric', + 'author_email': 'xxx', 'name': 'xxx', + 'version': 'xxx', + 'summary': 'Something about esszet \u00df', + 'description': 'More things about esszet \u00df'} + + cmd = self._get_cmd(metadata) + cmd.ensure_finalized() + cmd.strict = True + inputs = Inputs('1', 'tarek', 'y') + register_module.input = inputs + cmd.ensure_finalized() + cmd.run() + def test_register_pep345(self): cmd = self._get_cmd({}) cmd.ensure_finalized() diff --git a/Lib/packaging/tests/test_manifest.py b/Lib/packaging/tests/test_manifest.py --- a/Lib/packaging/tests/test_manifest.py +++ b/Lib/packaging/tests/test_manifest.py @@ -1,8 +1,10 @@ """Tests for packaging.manifest.""" import os +import re import logging from io import StringIO -from packaging.manifest import Manifest +from packaging.errors import PackagingTemplateError +from packaging.manifest import Manifest, _translate_pattern, _glob_to_re from packaging.tests import unittest, support @@ -34,6 +36,12 @@ os.chdir(self.cwd) super(ManifestTestCase, self).tearDown() + def assertNoWarnings(self): + self.assertEqual(self.get_logs(logging.WARNING), []) + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(logging.WARNING)), 0) + def test_manifest_reader(self): tmpdir = self.mkdtemp() MANIFEST = os.path.join(tmpdir, 'MANIFEST.in') @@ -69,6 +77,193 @@ manifest.read_template(content) self.assertEqual(['README', 'file1'], manifest.files) + def test_glob_to_re(self): + # simple cases + self.assertEqual(_glob_to_re('foo*'), 'foo[^/]*\\Z(?ms)') + self.assertEqual(_glob_to_re('foo?'), 'foo[^/]\\Z(?ms)') + self.assertEqual(_glob_to_re('foo??'), 'foo[^/][^/]\\Z(?ms)') + + # special cases + self.assertEqual(_glob_to_re(r'foo\\*'), r'foo\\\\[^/]*\Z(?ms)') + self.assertEqual(_glob_to_re(r'foo\\\*'), r'foo\\\\\\[^/]*\Z(?ms)') + self.assertEqual(_glob_to_re('foo????'), r'foo[^/][^/][^/][^/]\Z(?ms)') + self.assertEqual(_glob_to_re(r'foo\\??'), r'foo\\\\[^/][^/]\Z(?ms)') + + def test_remove_duplicates(self): + manifest = Manifest() + manifest.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand + manifest.sort() + manifest.remove_duplicates() + self.assertEqual(manifest.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # blackbox test of a private function + + # not regex + pattern = _translate_pattern('a', anchor=True, is_regex=False) + self.assertTrue(hasattr(pattern, 'search')) + + # is a regex + regex = re.compile('a') + pattern = _translate_pattern(regex, anchor=True, is_regex=True) + self.assertEqual(pattern, regex) + + # plain string flagged as regex + pattern = _translate_pattern('a', anchor=True, is_regex=True) + self.assertTrue(hasattr(pattern, 'search')) + + # glob support + pattern = _translate_pattern('*.py', anchor=True, is_regex=False) + self.assertTrue(pattern.search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + manifest = Manifest() + self.assertFalse(manifest.exclude_pattern('*.py')) + + # return True if files match + manifest = Manifest() + manifest.files = ['a.py', 'b.py'] + self.assertTrue(manifest.exclude_pattern('*.py')) + + # test excludes + manifest = Manifest() + manifest.files = ['a.py', 'a.txt'] + manifest.exclude_pattern('*.py') + self.assertEqual(manifest.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + manifest = Manifest() + manifest.allfiles = [] + self.assertFalse(manifest._include_pattern('*.py')) + + # return True if files match + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt'] + self.assertTrue(manifest._include_pattern('*.py')) + + # test * matches all files + manifest = Manifest() + self.assertIsNone(manifest.allfiles) + manifest.allfiles = ['a.py', 'b.txt'] + manifest._include_pattern('*') + self.assertEqual(manifest.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + manifest = Manifest() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune'): + self.assertRaises(PackagingTemplateError, + manifest._process_template_line, action) + + # implicit include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('*.py') + self.assertEqual(manifest.files, ['a.py']) + self.assertNoWarnings() + + # include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('include *.py') + self.assertEqual(manifest.files, ['a.py']) + self.assertNoWarnings() + + manifest._process_template_line('include *.rb') + self.assertEqual(manifest.files, ['a.py']) + self.assertWarnings() + + # exclude + manifest = Manifest() + manifest.files = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('exclude *.py') + self.assertEqual(manifest.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + manifest._process_template_line('exclude *.rb') + self.assertEqual(manifest.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + manifest = Manifest() + manifest.allfiles = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('global-include *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + manifest._process_template_line('global-include *.rb') + self.assertEqual(manifest.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + manifest = Manifest() + manifest.files = ['a.py', 'b.txt', 'd/c.py'] + + manifest._process_template_line('global-exclude *.py') + self.assertEqual(manifest.files, ['b.txt']) + self.assertNoWarnings() + + manifest._process_template_line('global-exclude *.rb') + self.assertEqual(manifest.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + manifest = Manifest() + manifest.allfiles = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + manifest._process_template_line('recursive-include d *.py') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + manifest._process_template_line('recursive-include e *.py') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + manifest = Manifest() + manifest.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + manifest._process_template_line('recursive-exclude d *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + manifest._process_template_line('recursive-exclude e *.py') + self.assertEqual(manifest.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + manifest = Manifest() + manifest.allfiles = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + manifest._process_template_line('graft d') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + manifest._process_template_line('graft e') + self.assertEqual(manifest.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + manifest = Manifest() + manifest.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + manifest._process_template_line('prune d') + self.assertEqual(manifest.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + manifest._process_template_line('prune e') + self.assertEqual(manifest.files, ['a.py', 'f/f.py']) + self.assertWarnings() + def test_suite(): return unittest.makeSuite(ManifestTestCase) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -590,6 +590,7 @@ Stephanie Lockwood Anne Lord Tom Loredo +Justin Love Jason Lowe Tony Lownds Ray Loyzaga -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 16:57:15 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 16:57:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/2b24f446c443 changeset: 72933:2b24f446c443 parent: 72932:5b6b53da3e40 parent: 72931:f87187e61961 user: ?ric Araujo date: Fri Oct 14 16:56:17 2011 +0200 summary: Merge 3.2 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 17:06:08 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 17:06:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_writing_of_the_RESOURCE?= =?utf8?q?S_file_by_packaging_=28=2312386=29?= Message-ID: http://hg.python.org/cpython/rev/1f3459b08298 changeset: 72934:1f3459b08298 user: ?ric Araujo date: Fri Oct 14 16:58:23 2011 +0200 summary: Fix writing of the RESOURCES file by packaging (#12386) files: Lib/packaging/command/install_distinfo.py | 2 +- Lib/packaging/tests/test_command_install_data.py | 57 +++++++++- Lib/packaging/tests/test_command_install_distinfo.py | 5 +- Misc/NEWS | 4 +- 4 files changed, 62 insertions(+), 6 deletions(-) diff --git a/Lib/packaging/command/install_distinfo.py b/Lib/packaging/command/install_distinfo.py --- a/Lib/packaging/command/install_distinfo.py +++ b/Lib/packaging/command/install_distinfo.py @@ -104,7 +104,7 @@ 'RESOURCES') logger.info('creating %s', resources_path) if not self.dry_run: - with open(resources_path, 'wb') as f: + with open(resources_path, 'w') as f: writer = csv.writer(f, delimiter=',', lineterminator='\n', quotechar='"') diff --git a/Lib/packaging/tests/test_command_install_data.py b/Lib/packaging/tests/test_command_install_data.py --- a/Lib/packaging/tests/test_command_install_data.py +++ b/Lib/packaging/tests/test_command_install_data.py @@ -1,28 +1,37 @@ """Tests for packaging.command.install_data.""" import os +import sys import sysconfig +import packaging.database from sysconfig import _get_default_scheme from packaging.tests import unittest, support from packaging.command.install_data import install_data +from packaging.command.install_dist import install_dist +from packaging.command.install_distinfo import install_distinfo class InstallDataTestCase(support.TempdirManager, support.LoggingCatcher, unittest.TestCase): - def test_simple_run(self): + def setUp(self): + super(InstallDataTestCase, self).setUp() scheme = _get_default_scheme() old_items = sysconfig._SCHEMES.items(scheme) + def restore(): sysconfig._SCHEMES.remove_section(scheme) sysconfig._SCHEMES.add_section(scheme) for option, value in old_items: sysconfig._SCHEMES.set(scheme, option, value) + self.addCleanup(restore) + def test_simple_run(self): pkg_dir, dist = self.create_dist() cmd = install_data(dist) cmd.install_dir = inst = os.path.join(pkg_dir, 'inst') + scheme = _get_default_scheme() sysconfig._SCHEMES.set(scheme, 'inst', os.path.join(pkg_dir, 'inst')) @@ -67,8 +76,7 @@ three = os.path.join(cmd.install_dir, 'three') self.write_file(three, 'xx') - sysconfig._SCHEMES.set(scheme, 'inst3', - cmd.install_dir) + sysconfig._SCHEMES.set(scheme, 'inst3', cmd.install_dir) cmd.data_files = {one: '{inst}/one', two: '{inst2}/two', three: '{inst3}/three'} @@ -80,6 +88,49 @@ self.assertTrue(os.path.exists(os.path.join(inst2, rtwo))) self.assertTrue(os.path.exists(os.path.join(inst, rone))) + def test_resources(self): + install_dir = self.mkdtemp() + scripts_dir = self.mkdtemp() + project_dir, dist = self.create_dist( + name='Spamlib', version='0.1', + data_files={'spamd': '{scripts}/spamd'}) + + os.chdir(project_dir) + self.write_file('spamd', '# Python script') + sysconfig._SCHEMES.set(_get_default_scheme(), 'scripts', scripts_dir) + sys.path.insert(0, install_dir) + self.addCleanup(sys.path.remove, install_dir) + + cmd = install_dist(dist) + cmd.outputs = ['spamd'] + cmd.install_lib = install_dir + dist.command_obj['install_dist'] = cmd + + cmd = install_data(dist) + cmd.install_dir = install_dir + cmd.ensure_finalized() + dist.command_obj['install_data'] = cmd + cmd.run() + + cmd = install_distinfo(dist) + cmd.ensure_finalized() + dist.command_obj['install_distinfo'] = cmd + cmd.run() + + fn = os.path.join(install_dir, 'Spamlib-0.1.dist-info', 'RESOURCES') + with open(fn, encoding='utf-8') as fp: + content = fp.read().strip() + + expected = 'spamd,%s' % os.path.join(scripts_dir, 'spamd') + self.assertEqual(content, expected) + + # just to be sure, we also test that get_file works here, even though + # packaging.database has its own test file + with packaging.database.get_file('Spamlib', 'spamd') as fp: + content = fp.read() + + self.assertEqual('# Python script', content) + def test_suite(): return unittest.makeSuite(InstallDataTestCase) diff --git a/Lib/packaging/tests/test_command_install_distinfo.py b/Lib/packaging/tests/test_command_install_distinfo.py --- a/Lib/packaging/tests/test_command_install_distinfo.py +++ b/Lib/packaging/tests/test_command_install_distinfo.py @@ -1,4 +1,7 @@ -"""Tests for ``packaging.command.install_distinfo``. """ +"""Tests for ``packaging.command.install_distinfo``. + +Writing of the RESOURCES file is tested in test_command_install_data. +""" import os import csv diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,7 +12,7 @@ - PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy. -- Add internal API for static strings (_Py_identifier et.al.). +- Add internal API for static strings (_Py_identifier et al.). - Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described as "The pipe is being closed") is now mapped to POSIX errno EPIPE @@ -304,6 +304,8 @@ Library ------- +- Issue #12386: packaging does not fail anymore when writing the RESOURCES + file. - Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number fields in tarfile. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 17:06:09 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 17:06:09 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Cleanup_in_packaging=3A_sup?= =?utf8?q?er_considered_super?= Message-ID: http://hg.python.org/cpython/rev/5ae03b1e147a changeset: 72935:5ae03b1e147a user: ?ric Araujo date: Fri Oct 14 17:04:39 2011 +0200 summary: Cleanup in packaging: super considered super files: Lib/packaging/command/bdist_msi.py | 2 +- Lib/packaging/compiler/bcppcompiler.py | 2 +- Lib/packaging/compiler/cygwinccompiler.py | 14 ++++------ Lib/packaging/compiler/msvc9compiler.py | 2 +- Lib/packaging/compiler/msvccompiler.py | 2 +- Lib/packaging/metadata.py | 5 ++- Lib/packaging/tests/pypi_server.py | 2 +- Lib/packaging/tests/support.py | 2 +- 8 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Lib/packaging/command/bdist_msi.py b/Lib/packaging/command/bdist_msi.py --- a/Lib/packaging/command/bdist_msi.py +++ b/Lib/packaging/command/bdist_msi.py @@ -35,7 +35,7 @@ def __init__(self, *args, **kw): """Dialog(database, name, x, y, w, h, attributes, title, first, default, cancel, bitmap=true)""" - Dialog.__init__(self, *args) + super(PyDialog, self).__init__(*args) ruler = self.h - 36 #if kw.get("bitmap", True): # self.bitmap("Bitmap", 0, 0, bmwidth, ruler, "PythonWin") diff --git a/Lib/packaging/compiler/bcppcompiler.py b/Lib/packaging/compiler/bcppcompiler.py --- a/Lib/packaging/compiler/bcppcompiler.py +++ b/Lib/packaging/compiler/bcppcompiler.py @@ -48,7 +48,7 @@ def __init__(self, verbose=0, dry_run=False, force=False): - CCompiler.__init__(self, verbose, dry_run, force) + super(BCPPCompiler, self).__init__(verbose, dry_run, force) # These executables are assumed to all be in the path. # Borland doesn't seem to use any special registry settings to diff --git a/Lib/packaging/compiler/cygwinccompiler.py b/Lib/packaging/compiler/cygwinccompiler.py --- a/Lib/packaging/compiler/cygwinccompiler.py +++ b/Lib/packaging/compiler/cygwinccompiler.py @@ -93,8 +93,7 @@ exe_extension = ".exe" def __init__(self, verbose=0, dry_run=False, force=False): - - UnixCCompiler.__init__(self, verbose, dry_run, force) + super(CygwinCCompiler, self).__init__(verbose, dry_run, force) status, details = check_config_h() logger.debug("Python's GCC status: %s (details: %s)", status, details) @@ -255,14 +254,14 @@ if ext not in (self.src_extensions + ['.rc','.res']): raise UnknownFileError("unknown file type '%s' (from '%s')" % (ext, src_name)) if strip_dir: - base = os.path.basename (base) + base = os.path.basename(base) if ext in ('.res', '.rc'): # these need to be compiled to object files - obj_names.append (os.path.join(output_dir, + obj_names.append(os.path.join(output_dir, base + ext + self.obj_extension)) else: - obj_names.append (os.path.join(output_dir, - base + self.obj_extension)) + obj_names.append(os.path.join(output_dir, + base + self.obj_extension)) return obj_names # the same as cygwin plus some additional parameters @@ -273,8 +272,7 @@ description = 'MinGW32 compiler' def __init__(self, verbose=0, dry_run=False, force=False): - - CygwinCCompiler.__init__ (self, verbose, dry_run, force) + super(Mingw32CCompiler, self).__init__(verbose, dry_run, force) # ld_version >= "2.13" support -shared so use it instead of # -mdll -static diff --git a/Lib/packaging/compiler/msvc9compiler.py b/Lib/packaging/compiler/msvc9compiler.py --- a/Lib/packaging/compiler/msvc9compiler.py +++ b/Lib/packaging/compiler/msvc9compiler.py @@ -310,7 +310,7 @@ exe_extension = '.exe' def __init__(self, verbose=0, dry_run=False, force=False): - CCompiler.__init__(self, verbose, dry_run, force) + super(MSVCCompiler, self).__init__(verbose, dry_run, force) self.__version = VERSION self.__root = r"Software\Microsoft\VisualStudio" # self.__macros = MACROS diff --git a/Lib/packaging/compiler/msvccompiler.py b/Lib/packaging/compiler/msvccompiler.py --- a/Lib/packaging/compiler/msvccompiler.py +++ b/Lib/packaging/compiler/msvccompiler.py @@ -237,7 +237,7 @@ exe_extension = '.exe' def __init__(self, verbose=0, dry_run=False, force=False): - CCompiler.__init__(self, verbose, dry_run, force) + super(MSVCCompiler, self).__init__(verbose, dry_run, force) self.__version = get_build_version() self.__arch = get_build_architecture() if self.__arch == "Intel": diff --git a/Lib/packaging/metadata.py b/Lib/packaging/metadata.py --- a/Lib/packaging/metadata.py +++ b/Lib/packaging/metadata.py @@ -28,8 +28,9 @@ def __init__(self, source, report_level, halt_level, stream=None, debug=0, encoding='ascii', error_handler='replace'): self.messages = [] - Reporter.__init__(self, source, report_level, halt_level, stream, - debug, encoding, error_handler) + super(SilentReporter, self).__init__( + source, report_level, halt_level, stream, + debug, encoding, error_handler) def system_message(self, level, message, *children, **kwargs): self.messages.append((level, message, children, kwargs)) diff --git a/Lib/packaging/tests/pypi_server.py b/Lib/packaging/tests/pypi_server.py --- a/Lib/packaging/tests/pypi_server.py +++ b/Lib/packaging/tests/pypi_server.py @@ -103,7 +103,7 @@ """ # we want to launch the server in a new dedicated thread, to not freeze # tests. - threading.Thread.__init__(self) + super(PyPIServer, self).__init__() self._run = True self._serve_xmlrpc = serve_xmlrpc if static_filesystem_paths is None: diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -65,7 +65,7 @@ # stolen and adapted from test.support def __init__(self): - logging.handlers.BufferingHandler.__init__(self, 0) + super(_TestHandler, self).__init__(0) self.setLevel(logging.DEBUG) def shouldFlush(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 17:38:48 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 17:38:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Update_dead_ref?= =?utf8?q?erences_from_py=2Eorg/dev/faq_to_the_devguide_=28=2313176=29?= Message-ID: http://hg.python.org/cpython/rev/9ef20fbd340f changeset: 72936:9ef20fbd340f branch: 3.2 parent: 72931:f87187e61961 user: ?ric Araujo date: Fri Oct 14 17:37:45 2011 +0200 summary: Update dead references from py.org/dev/faq to the devguide (#13176) files: Doc/bugs.rst | 6 ++++-- Doc/faq/general.rst | 12 +++--------- Doc/using/windows.rst | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Doc/bugs.rst b/Doc/bugs.rst --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -57,12 +57,14 @@ Each bug report will be assigned to a developer who will determine what needs to be done to correct the problem. You will receive an update each time action is -taken on the bug. See http://www.python.org/dev/workflow/ for a detailed -description of the issue workflow. +taken on the bug. .. seealso:: + `Python Developer's Guide `_ + Detailed description of the issue workflow and developers tools. + `How to Report Bugs Effectively `_ Article which goes into some detail about how to create a useful bug report. This describes what kind of information is useful and why it is useful. diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -164,9 +164,7 @@ several useful pieces of freely distributable software. The source will compile and run out of the box on most UNIX platforms. -.. XXX update link once the dev faq is relocated - -Consult the `Developer FAQ `__ for more +Consult the `Developer FAQ `__ for more information on getting the source code and compiling it. @@ -221,10 +219,8 @@ newsgroups and on the Python home page at http://www.python.org/; an RSS feed of news is available. -.. XXX update link once the dev faq is relocated - You can also access the development version of Python through Subversion. See -http://www.python.org/dev/faq/ for details. +http://docs.python.org/devguide/faq for details. How do I submit bug reports and patches for Python? @@ -239,10 +235,8 @@ report bugs to Python, you can obtain your Roundup password through Roundup's `password reset procedure `_. -.. XXX adapt link to dev guide - For more information on how Python is developed, consult `the Python Developer's -Guide `_. +Guide `_. Are there any published articles about Python that I can reference? diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -290,7 +290,7 @@ If you want to compile CPython yourself, first thing you should do is get the `source `_. You can download either the latest release's source or just grab a fresh `checkout -`_. +`_. For Microsoft Visual C++, which is the compiler with which official Python releases are built, the source tree contains solutions/project files. View the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 17:38:49 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 17:38:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/30e5ce077554 changeset: 72937:30e5ce077554 parent: 72935:5ae03b1e147a parent: 72936:9ef20fbd340f user: ?ric Araujo date: Fri Oct 14 17:38:10 2011 +0200 summary: Merge 3.2 files: Doc/faq/general.rst | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -164,8 +164,6 @@ several useful pieces of freely distributable software. The source will compile and run out of the box on most UNIX platforms. -.. XXX update link once the dev faq is relocated - Consult the `Developer FAQ `__ for more information on getting the source code and compiling it. @@ -221,8 +219,6 @@ newsgroups and on the Python home page at http://www.python.org/; an RSS feed of news is available. -.. XXX update link once the dev faq is relocated - You can also access the development version of Python through Subversion. See http://docs.python.org/devguide/faq for details. @@ -239,8 +235,6 @@ report bugs to Python, you can obtain your Roundup password through Roundup's `password reset procedure `_. -.. XXX adapt link to dev guide - For more information on how Python is developed, consult `the Python Developer's Guide `_. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 18:06:05 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 18:06:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Update_dead_ref?= =?utf8?q?erences_from_py=2Eorg/dev/faq_to_the_devguide_=28=2313176=29?= Message-ID: http://hg.python.org/cpython/rev/ebf3f2a4c61a changeset: 72938:ebf3f2a4c61a branch: 2.7 parent: 72909:c1c434e30e06 user: ?ric Araujo date: Fri Oct 14 18:05:56 2011 +0200 summary: Update dead references from py.org/dev/faq to the devguide (#13176) files: Doc/faq/general.rst | 12 +++--------- Doc/using/windows.rst | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -164,9 +164,7 @@ several useful pieces of freely distributable software. The source will compile and run out of the box on most UNIX platforms. -.. XXX update link once the dev faq is relocated - -Consult the `Developer FAQ `__ for more +Consult the `Developer FAQ `__ for more information on getting the source code and compiling it. @@ -221,10 +219,8 @@ newsgroups and on the Python home page at http://www.python.org/; an RSS feed of news is available. -.. XXX update link once the dev faq is relocated - You can also access the development version of Python through Subversion. See -http://www.python.org/dev/faq/ for details. +http://docs.python.org/devguide/faq for details. How do I submit bug reports and patches for Python? @@ -239,10 +235,8 @@ report bugs to Python, you can obtain your Roundup password through Roundup's `password reset procedure `_. -.. XXX adapt link to dev guide - For more information on how Python is developed, consult `the Python Developer's -Guide `_. +Guide `_. Are there any published articles about Python that I can reference? diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -292,7 +292,7 @@ If you want to compile CPython yourself, first thing you should do is get the `source `_. You can download either the latest release's source or just grab a fresh `checkout -`_. +`_. For Microsoft Visual C++, which is the compiler with which official Python releases are built, the source tree contains solutions/project files. View the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 14 18:15:39 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 14 Oct 2011 18:15:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Increase_test_c?= =?utf8?q?overage_for_distutils=2Efilelist_=28=2311751=29=2E?= Message-ID: http://hg.python.org/cpython/rev/368134e10d09 changeset: 72939:368134e10d09 branch: 2.7 user: ?ric Araujo date: Fri Oct 14 18:15:31 2011 +0200 summary: Increase test coverage for distutils.filelist (#11751). Patch by Justin Love. files: Lib/distutils/tests/test_filelist.py | 207 ++++++++++++++- Misc/ACKS | 1 + 2 files changed, 198 insertions(+), 10 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,10 +1,14 @@ """Tests for distutils.filelist.""" +import re +import unittest from os.path import join -import unittest +from distutils import debug +from distutils.log import WARN +from distutils.errors import DistutilsTemplateError +from distutils.filelist import glob_to_re, translate_pattern, FileList + from test.test_support import captured_stdout, run_unittest - -from distutils.filelist import glob_to_re, FileList -from distutils import debug +from distutils.tests import support MANIFEST_IN = """\ include ok @@ -20,7 +24,17 @@ prune dir3 """ -class FileListTestCase(unittest.TestCase): + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEqual(self.get_logs(WARN), []) + self.clear_logs() + + def assertWarnings(self): + self.assertGreater(len(self.get_logs(WARN)), 0) + self.clear_logs() def test_glob_to_re(self): # simple cases @@ -48,7 +62,7 @@ join('dir', 'graft-one'), join('dir', 'dir2', 'graft2'), join('dir3', 'ok'), - join('dir3', 'sub', 'ok.txt') + join('dir3', 'sub', 'ok.txt'), ] for line in MANIFEST_IN.split('\n'): @@ -66,18 +80,191 @@ file_list = FileList() with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), '') + self.assertEqual(stdout.getvalue(), '') debug.DEBUG = True try: with captured_stdout() as stdout: file_list.debug_print('xxx') - stdout.seek(0) - self.assertEqual(stdout.read(), 'xxx\n') + self.assertEqual(stdout.getvalue(), 'xxx\n') finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'b', 'a', 'g', 'c', 'g'] + # files must be sorted beforehand (sdist does it) + file_list.sort() + file_list.remove_duplicates() + self.assertEqual(file_list.files, ['a', 'b', 'c', 'g']) + + def test_translate_pattern(self): + # not regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=False), + 'search')) + + # is a regex + regex = re.compile('a') + self.assertEqual( + translate_pattern(regex, anchor=True, is_regex=True), + regex) + + # plain string flagged as regex + self.assertTrue(hasattr( + translate_pattern('a', anchor=True, is_regex=True), + 'search')) + + # glob support + self.assertTrue(translate_pattern( + '*.py', anchor=True, is_regex=False).search('filelist.py')) + + def test_exclude_pattern(self): + # return False if no match + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + # test excludes + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEqual(file_list.files, ['a.txt']) + + def test_include_pattern(self): + # return False if no match + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + # return True if files match + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + # test * matches all files + file_list = FileList() + self.assertIsNone(file_list.allfiles) + file_list.set_allfiles(['a.py', 'b.txt']) + file_list.include_pattern('*') + self.assertEqual(file_list.allfiles, ['a.py', 'b.txt']) + + def test_process_template(self): + # invalid lines + file_list = FileList() + for action in ('include', 'exclude', 'global-include', + 'global-exclude', 'recursive-include', + 'recursive-exclude', 'graft', 'prune', 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, action) + + # include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEqual(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEqual(file_list.files, ['a.py']) + self.assertWarnings() + + # exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEqual(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + # global-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEqual(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + # global-exclude + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEqual(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEqual(file_list.files, ['b.txt']) + self.assertWarnings() + + # recursive-include + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # recursive-exclude + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEqual(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + # graft + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEqual(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + # prune + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEqual(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + + def test_suite(): return unittest.makeSuite(FileListTestCase) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -511,6 +511,7 @@ Stephanie Lockwood Anne Lord Tom Loredo +Justin Love Jason Lowe Tony Lownds Ray Loyzaga -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 15 05:29:26 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 15 Oct 2011 05:29:26 +0200 Subject: [Python-checkins] Daily reference leaks (30e5ce077554): sum=0 Message-ID: results for 30e5ce077554 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogKxaKQp', '-x'] From python-checkins at python.org Sat Oct 15 15:25:33 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 15 Oct 2011 15:25:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_remove_some_duplication?= Message-ID: http://hg.python.org/cpython/rev/cbaa9f8140db changeset: 72940:cbaa9f8140db parent: 72937:30e5ce077554 user: Benjamin Peterson date: Sat Oct 15 09:25:28 2011 -0400 summary: remove some duplication files: Objects/unicodeobject.c | 14 ++++---------- 1 files changed, 4 insertions(+), 10 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2838,6 +2838,10 @@ char *l; char *l_end; + if (encoding == NULL) { + strcpy(lower, "utf-8"); + return 1; + } e = encoding; l = lower; l_end = &lower[lower_len - 1]; @@ -2869,9 +2873,6 @@ Py_buffer info; char lower[11]; /* Enough for any encoding shortcut */ - if (encoding == NULL) - return PyUnicode_DecodeUTF8(s, size, errors); - /* Shortcuts for common default encodings */ if (normalize_encoding(encoding, lower, sizeof(lower))) { if ((strcmp(lower, "utf-8") == 0) || @@ -3101,13 +3102,6 @@ return NULL; } - if (encoding == NULL) { - if (errors == NULL || strcmp(errors, "strict") == 0) - return _PyUnicode_AsUTF8String(unicode, NULL); - else - return _PyUnicode_AsUTF8String(unicode, errors); - } - /* Shortcuts for common default encodings */ if (normalize_encoding(encoding, lower, sizeof(lower))) { if ((strcmp(lower, "utf-8") == 0) || -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 15 16:06:10 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 15 Oct 2011 16:06:10 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Mark_PEP_final=2E?= Message-ID: http://hg.python.org/peps/rev/1d2e5b627825 changeset: 3966:1d2e5b627825 user: Martin v. L?wis date: Sat Oct 15 16:06:07 2011 +0200 summary: Mark PEP final. files: pep-0393.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0393.txt b/pep-0393.txt --- a/pep-0393.txt +++ b/pep-0393.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Martin v. L?wis -Status: Accepted +Status: Final Type: Standards Track Content-Type: text/x-rst Created: 24-Jan-2010 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Oct 15 16:42:11 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 15 Oct 2011 16:42:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_build_under_Windows?= Message-ID: http://hg.python.org/cpython/rev/c63087ac1f6c changeset: 72941:c63087ac1f6c user: Antoine Pitrou date: Sat Oct 15 16:38:20 2011 +0200 summary: Fix build under Windows files: Include/codecs.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/codecs.h b/Include/codecs.h --- a/Include/codecs.h +++ b/Include/codecs.h @@ -174,7 +174,7 @@ /* replace the unicode encode error with backslash escapes (\x, \u and \U) */ PyAPI_FUNC(PyObject *) PyCodec_BackslashReplaceErrors(PyObject *exc); -extern const char *Py_hexdigits; +PyAPI_DATA(const char *) Py_hexdigits; #ifdef __cplusplus } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 15 19:43:31 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 15 Oct 2011 19:43:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_PyEval=5FCallOb?= =?utf8?q?ject_requires_a_tuple_of_args_=28closes_=2313186=29?= Message-ID: http://hg.python.org/cpython/rev/418fbf1af875 changeset: 72942:418fbf1af875 branch: 2.7 parent: 72939:368134e10d09 user: Benjamin Peterson date: Sat Oct 15 13:43:21 2011 -0400 summary: PyEval_CallObject requires a tuple of args (closes #13186) files: Lib/test/test_class.py | 13 +++++++++++++ Misc/NEWS | 3 +++ Modules/_testcapimodule.c | 14 ++++++++++++++ Objects/classobject.c | 2 +- 4 files changed, 31 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_class.py b/Lib/test/test_class.py --- a/Lib/test/test_class.py +++ b/Lib/test/test_class.py @@ -350,6 +350,19 @@ AllTests.__delslice__ = delslice + @test_support.cpython_only + def testDelItem(self): + class A: + ok = False + def __delitem__(self, key): + self.ok = True + a = A() + # Subtle: we need to call PySequence_SetItem, not PyMapping_SetItem. + from _testcapi import sequence_delitem + sequence_delitem(a, 2) + self.assertTrue(a.ok) + + def testUnaryOps(self): testme = AllTests() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #13186: Fix __delitem__ on old-style instances when invoked through + PySequence_DelItem. + - Issue #13156: Revert the patch for issue #10517 (reset TLS upon fork()), which was only relevant for the native pthread TLS implementation. diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1639,6 +1639,19 @@ return PyErr_NewExceptionWithDoc(name, doc, base, dict); } +static PyObject * +sequence_delitem(PyObject *self, PyObject *args) +{ + PyObject *seq; + Py_ssize_t i; + + if (!PyArg_ParseTuple(args, "On", &seq, &i)) + return NULL; + if (PySequence_DelItem(seq, i) < 0) + return NULL; + Py_RETURN_NONE; +} + static PyMethodDef TestMethods[] = { {"raise_exception", raise_exception, METH_VARARGS}, {"test_config", (PyCFunction)test_config, METH_NOARGS}, @@ -1695,6 +1708,7 @@ {"code_newempty", code_newempty, METH_VARARGS}, {"make_exception_with_doc", (PyCFunction)make_exception_with_doc, METH_VARARGS | METH_KEYWORDS}, + {"sequence_delitem", (PyCFunction)sequence_delitem, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; diff --git a/Objects/classobject.c b/Objects/classobject.c --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -1221,7 +1221,7 @@ if (func == NULL) return -1; if (item == NULL) - arg = PyInt_FromSsize_t(i); + arg = Py_BuildValue("(n)", i); else arg = Py_BuildValue("(nO)", i, item); if (arg == NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 05:10:31 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 16 Oct 2011 05:10:31 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Kill_PEP_403_in_light_of_pytho?= =?utf8?q?n-ideas_discussion=2E_Resurrect_PEP_3150_with_first?= Message-ID: http://hg.python.org/peps/rev/50e624ee58de changeset: 3967:50e624ee58de user: Nick Coghlan date: Sun Oct 16 13:10:10 2011 +1000 summary: Kill PEP 403 in light of python-ideas discussion. Resurrect PEP 3150 with first cut updates based on PEP 403 feedback files: pep-0403.txt | 45 +-- pep-3150.txt | 450 +++++++++++++++++++++++++++----------- 2 files changed, 340 insertions(+), 155 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Deferred +Status: Withdrawn Type: Standards Track Content-Type: text/x-rst Created: 2011-10-13 @@ -32,20 +32,14 @@ that PEP. That PEP has now been withdrawn in favour of this one. -PEP Deferral -============ +PEP Withdrawal +============== -Like PEP 3150, this PEP currently exists in a deferred state. Unlike PEP 3150, -this isn't because I suspect it might be a terrible idea or see nasty problems -lurking in the implementation (aside from one potential parsing issue). - -Instead, it's because I think fleshing out the concept, exploring syntax -variants, creating a reference implementation and generally championing -the idea is going to require more time than I can give it in the 3.3 time -frame. - -So, it's deferred. If anyone wants to step forward to drive the PEP for 3.3, -let me know and I can add you as co-author and move it to Draft status. +The python-ideas thread discussing this PEP [1]_ persuaded me that it was +essentially am unnecessarily cryptic, wholly inferior version of PEP 3150's +statement local namespaces. The discussion also resolved some of my concerns +with PEP 3150, so I am withdrawing this more limited version of the idea in +favour of resurrecting the original concept. Basic Examples @@ -259,7 +253,7 @@ del _createenviron # Becomes: - :environ = @() + postdef environ = def() def _createenviron(): ... # 27 line function @@ -269,14 +263,14 @@ funcs = [(lambda x, i=i: x + i) for i in range(10)] # Becomes: - :funcs = [@(i) for i in range(10)] + postdef funcs = [def(i) for i in range(10)] def make_incrementor(i): return lambda x: x + i # Or even: - :funcs = [@(i) for i in range(10)] + postdef funcs = [def(i) for i in range(10)] def make_incrementor(i): - :return @ + postdef return def def incrementor(x): return x + i @@ -287,15 +281,6 @@ None as yet. -TO DO -===== - -Sort out links and references to everything :) - -Start of python-ideas thread: -http://mail.python.org/pipermail/python-ideas/2011-October/012276.html - - Acknowledgements ================ @@ -303,11 +288,15 @@ idea what I was talking about in criticising Ruby's blocks, kicking off a rather enlightening process of investigation. +Even though this PEP has been withdrawn, the process of writing and arguing +in its favour has been quite influential on the future direction of PEP 3150. + References ========== -TBD +[1] Start of python-ideas thread: + http://mail.python.org/pipermail/python-ideas/2011-October/012276.html Copyright diff --git a/pep-3150.txt b/pep-3150.txt --- a/pep-3150.txt +++ b/pep-3150.txt @@ -3,11 +3,11 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Withdrawn +Status: Deferred Type: Standards Track Content-Type: text/x-rst Created: 2010-07-09 -Python-Version: 3.3 +Python-Version: 3.4 Post-History: 2010-07-14, 2011-04-21, 2011-06-13 Resolution: TBD @@ -21,46 +21,70 @@ accessible in the associated statement, but do not become part of the containing namespace. -The primary motivation is to elevate ordinary assignment statements to be -on par with ``class`` and ``def`` statements where the name of the item to -be defined is presented to the reader in advance of the details of how the -value of that item is calculated. +The primary motivation is to enable a more declarative style of programming, +where the operation to be performed is presented to the reader first, and the +details of the necessary subcalculations are presented in the following +indented suite. As a key example, this would elevate ordinary assignment +statements to be on par with ``class`` and ``def`` statements where the name +of the item to be defined is presented to the reader in advance of the +details of how the value of that item is calculated. It also allows named +functions to be used in a "multi-line lambda" fashion, where the name is used +solely as a placeholder in the current expression and then defined in the +following suite. A secondary motivation is to simplify interim calculations in module and class level code without polluting the resulting namespaces. -There are additional emergent properties of the proposed solution which may -be of interest to some users. Most notably, it is proposed that this clause -use a new kind of scope that performs early binding of variables, potentially -replacing other techniques that achieve the same effect (such as the "default -argument hack"). +The intent is that the relationship between a given clause and a separate +function definition that performs the specified operation will be similar to +the existing relationship between an explicit while loop and a generator that +produces the same sequence of operations as that while loop. The specific proposal in this PEP has been informed by various explorations -of this and related concepts over the years (e.g. [1], [2], [3], [6]), and is -inspired to some degree by the ``where`` and ``let`` clauses in Haskell. It -avoids some problems that have been identified in past proposals, but has not -yet itself been subject to the test of implementation. +of this and related concepts over the years (e.g. [1]_, [2]_, [3]_, [6]_, +[8]_), and is inspired to some degree by the ``where`` and ``let`` clauses in +Haskell. It avoids some problems that have been identified in past proposals, +but has not yet itself been subject to the test of implementation. PEP Deferral ============ Despite the lifting of the language moratorium (PEP 3003) for Python 3.3, -this PEP currently remains in a Deferred state. That means the PEP has to -pass at least *two* hurdles to become part of 3.3. +this PEP currently remains in a Deferred state. This idea, if implemented, +will potentially have a deep and pervasive effect on the way people write +Python code. -Firstly, I personally have to be sufficiently convinced of the PEP's value and -feasibility to return it to Draft status. While I do see merit in the concept -of statement local namespaces (otherwise I wouldn't have spent so much time -pondering the idea over the years), I also have grave doubts as to the wisdom -of actually adding it to the language (see "Key Concern" below). +When this PEP was first put forward, even I, as the PEP author, was not +convinced it was a good idea. Instead, I was simply writing it as a way to +avoid endlessly rehashing similar topics on python-ideas. When someone +broached the subject, they could be pointed at this PEP and told "Come back +when you've read and understood the arguments presented there". Subsequent +discussions (most notably, those surrounding PEP 403's attempt at a more +restricted version of the idea) have convinced me that the idea is valuable +and will help address a number of situations where developers feel that +Python "gets in the way" instead of "matching the way they think". For me, +it is this aspect of "let people express what they're thinking, rather than +forcing them to think differently due to Python's limitations" that finally +allowed the idea to clear the "status quo wins a stalemate" bar ([5]_). -Secondly, Guido van Rossum (or his delegate) will need to accept the PEP. At -the very least, that will not occur until a fully functional draft -implementation for CPython is available, and the other three major Python -implementations (PyPy, Jython, IronPython) have indicated that they consider +However, while I now think the idea is worthwhile, I don't think there is +sufficient time left in the 3.3 release cycle for the idea to mature. A +reference implementation is needed, and people need time to experiment with +that implementation and offer feedback on whether or not it helps with +programming paradigms that are currently somewhat clumsy in Python (like +callback programming). Even if a PEP co-author volunteered immediately to +work on the implementation and incorporate feedback into the PEP text, I feel +targetting 3.3 would be unnecessarily rushing things. So, I've marked this +PEP as a candidate for 3.4 rather than 3.3. + +Once that process is complete, Guido van Rossum (or his delegate) will need +to be sufficiently convinced of the idea's merit and accept the PEP. Such +acceptance will require not only a fully functional reference implementation +for CPython (as already mentioned), but also indications from the other three +major Python implementations (PyPy, Jython, IronPython) that they consider it feasible to implement the proposed semantics once they reach the point of -targetting 3.3 compatibility. Input from related projects with a vested +targetting 3.4 compatibility. Input from related projects with a vested interest in Python's syntax (e.g. Cython) will also be valuable. @@ -69,26 +93,27 @@ This PEP proposes the addition of an optional ``given`` clause to the syntax for simple statements which may contain an expression, or may -substitute for such an expression for purely syntactic purposes. The +substitute for such a statement for purely syntactic purposes. The current list of simple statements that would be affected by this addition is as follows: -* expression statement -* assignment statement -* augmented assignment statement -* del statement -* return statement -* yield statement -* raise statement -* assert statement -* pass statement + * expression statement + * assignment statement + * augmented assignment statement + * del statement + * return statement + * yield statement + * raise statement + * assert statement + * pass statement The ``given`` clause would allow subexpressions to be referenced by name in the header line, with the actual definitions following in the indented clause. As a simple example:: - c = sqrt(a*a + b*b) given: - a, b = 3, 4 + sorted_data = sorted(data, key=sort_key) given: + def sort_key(item): + return item.attr1, item.attr2 The ``pass`` statement is included to provide a consistent way to skip inclusion of a meaningful expression in the header line. While this is not @@ -150,7 +175,8 @@ One potentially useful way to think of the proposed clause is as a middle ground between conventional in-line code and separation of an -operation out into a dedicated function. +operation out into a dedicated function, just as an inline while loop may +eventually be factored out into a dedicator generator. Keyword Choice @@ -158,7 +184,7 @@ This proposal initially used ``where`` based on the name of a similar construct in Haskell. However, it has been pointed out that there -are existing Python libraries (such as Numpy [4]) that already use +are existing Python libraries (such as Numpy [4]_) that already use ``where`` in the SQL query condition sense, making that keyword choice potentially confusing. @@ -175,6 +201,176 @@ That way lies C++ and Perl :) +Anticipated Objections +====================== + + +Two Ways To Do It +----------------- + +A lot of code may now be written with values defined either before the +expression where they are used or afterwards in a ``given`` clause, creating +two ways to do it, perhaps without an obvious way of choosing between them. + +On reflection, I feel this is a misapplication of the "one obvious way" +aphorism. Python already offers *lots* of ways to write code. We can use +a for loop or a while loop, a functional style or an imperative style or an +object oriented style. The language, in general, is designed to let people +write code that matches the way they think. Since different people think +differently, the way they write their code will change accordingly. + +Such stylistic questions in a code base are rightly left to the development +group responsible for that code. When does an expression get so complicated +that the subexpressions should be taken out and assigned to variables, even +though those variables are only going to be used once? When should an inline +while loop be replaced with a generator that implements the same logic? +Opinions differ, and that's OK. + +However, explicit PEP 8 guidance will be needed for CPython and the standard +library, and that is discussed below. + + +Out of Order Execution +---------------------- + +The ``given`` clause makes execution jump around a little strangely, as the +body of the ``given`` clause is executed before the simple statement in the +clause header. The closest any other part of Python comes to this is the out +of order evaluation in list comprehensions, generator expressions and +conditional expressions and the delayed application of decorator functions to +the function they decorate (the decorator expressions themselves are executed +in the order they are written). + +While this is true, the syntax is intended for cases where people are +themselves *thinking* about a problem out of sequence (at least as far as +the language is concerned). As an example of this, consider the following +thought in the mind of a Python user: + + I want to sort the items in this sequence according to the values of + attr1 and attr2 on each item. + +If they're comfortable with Python's ``lambda`` expressions, then they might +choose to write it like this:: + + sorted_list = sorted(original, key=(lambda v: v.attr1, v.attr2)) + +That gets the job done, but it hardly reaches the standard of ``executable +pseudocode`` that Python aspires to, does it? + +If they don't like ``lambda`` specifically, the ``operator`` module offers an +alternative that still allows the key function to be defined inline:: + + sorted_list = sorted(original, + key=operator.attrgetter(v. 'attr1', 'attr2')) + +Again, it gets the job done, but executable pseudocode it ain't. + +If they think both of the above options are ugly and confusing, or they need +logic in their key function that can't be expressed as an expression (such +as catching an exception), then Python currently forces them to reverse the +order of their original thought and define the sorting criteria first:: + + def sort_key(item): + return item.attr1, item.attr2 + + sorted_list = sorted(original, key=sort_key) + +"Just define a function" has been the rote response to requests for multi-line +lambda support for years. As with the above options, it gets the job done, +but it really does represent a break between what the user is thinking and +what the language allows them to express. + +I believe the proposal in this PEP will finally let Python get close to the +"executable pseudocode" bar for the kind of thought expressed above:: + + sorted_list = sorted(original, key=sort_key) given: + def sort_key(item): + return item.attr1, item.attr2 + +Everything is in the same order as it was in the user's original thought, the +only addition they have to make is to give the sorting criteria a name so that +the usage can be linked up to the subsequent definition. + +One other useful note on this front, is that this PEP allows existing out of +order execution constructs to be described as special cases of the more +general out of order execution syntax (just as comprehensions are now special +cases of the more general generator expression syntax, even though list +comprehensions existed first):: + + @classmethod + def classname(cls): + return cls.__name__ + +Would be roughly equivalent to:: + + classname = f1(classname) given: + f1 = classmethod + def classname(cls): + return cls.__name__ + +A list comprehension like ``squares = [x*x for x in range(10)]`` +would be equivalent to:: + + # Note: this example uses an explicit early binding variant that + # isn't yet reflected in the rest of the PEP. It will get there, though. + squares = seq given outermost=range(10): + seq = [] + for x in outermost: + seq.append(x*x) + + +Harmful to Introspection +------------------------ + +Poking around in module and class internals is an invaluable tool for +white-box testing and interactive debugging. The ``given`` clause will be +quite effective at preventing access to temporary state used during +calculations (although no more so than current usage of ``del`` statements +in that regard). + +While this is a valid concern, design for testability is an issue that +cuts across many aspects of programming. If a component needs to be tested +independently, then a ``given`` statement should be refactored in to separate +statements so that information is exposed to the test suite. This isn't +significantly different from refactoring an operation hidden inside a +function or generator out into its own function purely to allow it to be +tested in isolation. + + +Lack of Real World Impact Assessment +------------------------------------ + +The examples in the current PEP are almost all relatively small "toy" +examples. The proposal in this PEP needs to be subjected to the test of +application to a large code base (such as the standard library or a large +Twisted application) in a search for examples where the readability of real +world code is genuinely enhanced. + +This is more of a deficiency in the PEP rather than the idea, though. + + +New PEP 8 Guidelines +==================== + +As discussed on python-ideas ([7]_, [9]_) new PEP 8 guidelines would also +need to be developed to provide appropriate direction on when to use the +``given`` clause over ordinary variable assignments. + +Based on the similar guidelines already present for ``try`` statements, this +PEP proposes the following additions for ``given`` statements to the +"Programming Conventions" section of PEP 8: + + - for code that could reasonably be factored out into a separate function, + but is not currently reused anywhere, consider using a ``given`` clause. + This clearly indicates which variables are being used only to define + subcomponents of another statement rather than to hold algorithm or + application state. + + - keep ``given`` clauses concise. If they become unwieldy, either break + them up into multiple steps or else move the details into a separate + function. + + Syntax Change ============= @@ -202,8 +398,9 @@ assert_stmt: 'assert' test [',' test] [given_clause] given_clause: "given" ":" suite -(Note that expr_stmt in the grammar covers assignment and augmented -assignment in addition to simple expression statements) +(Note that ``expr_stmt`` in the grammar is a slight misnomer, as it covers +assignment and augmented assignment in addition to simple expression +statements) The new clause is added as an optional element of the existing statements rather than as a new kind of compound statement in order to avoid creating @@ -213,6 +410,9 @@ break given: a = b = 1 + import sys given: + a = b = 1 + However, the precise Grammar change described above is inadequate, as it creates problems for the definition of simple_stmt (which allows chaining of multiple single line statements with ";" rather than "\\n"). @@ -348,6 +548,7 @@ However, as noted in the abstract, an actual implementation of this idea has never been tried. + Detailed Semantics #1: Early Binding of Variable References ----------------------------------------------------------- @@ -389,17 +590,19 @@ This intention is subject to revision based on feedback and practicalities of implementation. + Detailed Semantics #2: Handling of ``nonlocal`` and ``global`` -------------------------------------------------------------- ``nonlocal`` and ``global`` will largely operate as if the anonymous functions were defined as in the expansion above. However, they will also -override the default early-binding semantics from names from the containing +override the default early-binding semantics for names from the containing scope. This intention is subject to revision based on feedback and practicalities of implementation. + Detailed Semantics #3: Handling of ``break`` and ``continue`` ------------------------------------------------------------- @@ -408,6 +611,7 @@ in the ``given`` clause suite but will work normally if they appear within a ``for`` or ``while`` loop as part of that suite. + Detailed Semantics #4: Handling of ``return`` and ``yield`` ------------------------------------------------------------- @@ -416,6 +620,45 @@ they appear within a ``def`` statement within that suite. +Alternative Semantics for Name Binding +-------------------------------------- + +The "early binding" semantics proposed for the ``given`` clause are driven +by the desire to have ``given`` clauses work "normally" in class scopes (that +is, allowing them to see the local variables in the class, even though classes +do not participate in normal lexical scoping). + +There is an alternative, which is to simply declare that the ``given`` clause +creates an ordinary nested scope, just like comprehensions and generator +expressions. Thus, the given clause would share the same quirks as those +constructs: they exhibit surprising behaviour at class scope, since they +can't see the local variables in the class definition. While this behaviour +is considered desirable for method definitions (where class variables are +accessed via the class or instance argument passed to the method), it can be +surprising and inconvenient for implicit scopes that are designed to hide +their own name bindings from the containing scope rather than vice-versa. + +A third alternative, more analogous to the comprehension case (where the +outermost iterator expression is evaluated in the current scope and hence can +see class locals normally), would be to allow *explicit* early binding in the +``given`` clause, by passing an optional tuple of assignments after the +``given`` keyword:: + + # Explicit early binding via given clause + seq = [] + for i in range(10): + seq.append(f) given i=i: + def f(): + return i + assert [f() for f in seq] == list(range(10)) + +(Note: I actually like the explicit early binding idea significantly more +than I do the implicit early binding - expect a future version of the PEP +to be updated accordingly. I've already used it above when describing how +an existing construct like a list comprehension could be expressed as a +special case of the new syntax) + + Examples ======== @@ -426,6 +669,17 @@ ... # However many lines public_name = public_name(*params) + # Current Python (custom decorator) + def singleton(*args, **kwds): + def decorator(cls): + return cls(*args, **kwds) + return decorator + + @singleton(*params) + class public_name(): + ... # However many lines + public_name = public_name(*params) + # Becomes: public_name = MeaningfulClassName(*params) given: class MeaningfulClassName(): @@ -465,57 +719,21 @@ # nested functions, that isn't entirely clear in the current code. -Anticipated Objections -====================== - -* Two Ways To Do It: a lot of code may now be written with values - defined either before the expression where they are used or - afterwards in a ``given`` clause, creating two ways to do it, - without an obvious way of choosing between them. - -* Out of Order Execution: the ``given`` clause makes execution - jump around a little strangely, as the body of the ``given`` - clause is executed before the simple statement in the clause - header. The closest any other part of Python comes to this - is the out of order evaluation in list comprehensions, - generator expressions and conditional expressions. - -* Harmful to Introspection: poking around in module and class internals - is an invaluable tool for white-box testing and interactive debugging. - The ``given`` clause will be quite effective at preventing access to - temporary state used during calculations (although no more so than - current usage of ``del`` statements in that regard) - -These objections should not be dismissed lightly - the proposal -in this PEP needs to be subjected to the test of application to -a large code base (such as the standard library) in a search -for examples where the readability of real world code is genuinely -enhanced. - -New PEP 8 guidelines would also need to be developed to provide -appropriate direction on when to use the ``given`` clause over -ordinary variable assignments. Some thoughts on possible guidelines are -provided at [7] - - Possible Additions ================== * The current proposal allows the addition of a ``given`` clause only for simple statements. Extending the idea to allow the use of - compound statements would be quite possible, but doing so raises + compound statements would be quite possible (by appending the given + clause as an independent suite at the end), but doing so raises serious readability concerns (as values defined in the ``given`` clause may be used well before they are defined, exactly the kind of readability trap that other features like decorators and ``with`` statements are designed to eliminate) -* Currently only the outermost clause of comprehensions and generator - expressions can reference the surrounding namespace when executed - at class level. If this proposal is implemented successfully, the - associated namespace semantics could allow that restriction to be - lifted. There would be backwards compatibility implications in doing - so as existing code may be relying on the behaviour of ignoring - class level variables, but the idea is worth considering. +* The "explicit early binding" variant may be applicable to the discussions + on python-ideas on how to eliminate the default argument hack. A ``given`` + clause in the header line for functions may be the answer to that question. Reference Implementation @@ -525,41 +743,6 @@ semantics and code compilation, feel free to try ;) -Key Concern -=========== - -If a decision on the acceptance or rejection of this PEP had to be made -immediately, rejection would be far more likely. Unlike the previous -major syntax addition to Python (PEP 343's ``with`` statement), this -PEP as yet has no "killer application" of common code that is clearly and -obviously improved through the use of the new syntax. The ``with`` statement -(in conjunction with the generator enhancements in PEP 342) allowed -exception handling to be factored out into context managers in a way -that had never before been possible. Code using the new statement was -not only easier to read, but much easier to write correctly in the -first place. - -In the case of this PEP. however, the "Two Ways to Do It" objection is a -strong one. While the ability to break out subexpresions of a statement -without having to worry about name clashes with the rest of a -function or script and without distracting from the operation that is -the ultimate aim of the statement is potentially nice to have as a -language feature, it doesn't really provide significant expressive power -over and above what is already possible by assigning subexpressions to -ordinary local variables before the statement of interest. In particular, -explaining to new Python programmers when it is best to use a ``given`` -clause and when to use normal local variables is likely to be challenging -and an unnecessary distraction. - -"It might be kinda, sorta, nice to have, sometimes" really isn't a strong -argument for a new syntactic construct (particularly one this complicated). -"Status quo wins a stalemate" [5] is a very useful design principle, and I'm -not yet convinced that this PEP clears that hurdle. - -The case for it has definitely strengthened over time though, which is why -this PEP remains Deferred rather than Rejected. - - TO-DO ===== @@ -571,19 +754,32 @@ References ========== -.. [1] http://mail.python.org/pipermail/python-ideas/2010-June/007476.html +.. [1] Explicitation lines in Python: + http://mail.python.org/pipermail/python-ideas/2010-June/007476.html -.. [2] http://mail.python.org/pipermail/python-ideas/2010-July/007584.html +.. [2] 'where' statement in Python: + http://mail.python.org/pipermail/python-ideas/2010-July/007584.html -.. [3] http://mail.python.org/pipermail/python-ideas/2009-July/005132.html +.. [3] Where-statement (Proposal for function expressions): + http://mail.python.org/pipermail/python-ideas/2009-July/005132.html -.. [4] http://mail.python.org/pipermail/python-ideas/2010-July/007596.html +.. [4] Name conflict with NumPy for 'where' keyword choice: + http://mail.python.org/pipermail/python-ideas/2010-July/007596.html -.. [5] http://www.boredomandlaziness.org/2011/02/status-quo-wins-stalemate.html +.. [5] The "Status quo wins a stalemate" design principle: + http://www.boredomandlaziness.org/2011/02/status-quo-wins-stalemate.html -.. [6] http://mail.python.org/pipermail/python-ideas/2011-April/009863.html +.. [6] Assignments in list/generator expressions: + http://mail.python.org/pipermail/python-ideas/2011-April/009863.html -.. [7] http://mail.python.org/pipermail/python-ideas/2011-April/009869.html +.. [7] Possible PEP 3150 style guidelines (#1): + http://mail.python.org/pipermail/python-ideas/2011-April/009869.html + +.. [8] Discussion of PEP 403 (statement local function definition): + http://mail.python.org/pipermail/python-ideas/2011-October/012276.html + +.. [9] Possible PEP 3150 style guidelines (#2): + http://mail.python.org/pipermail/python-ideas/2011-October/012341.html Copyright ========= -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sun Oct 16 05:31:55 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 16 Oct 2011 05:31:55 +0200 Subject: [Python-checkins] Daily reference leaks (c63087ac1f6c): sum=0 Message-ID: results for c63087ac1f6c on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog4FcOUF', '-x'] From python-checkins at python.org Sun Oct 16 09:01:27 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 16 Oct 2011 09:01:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_13177=3A_?= =?utf8?q?Make_tracebacks_more_readable_by_avoiding_chained_exceptions_in?= Message-ID: http://hg.python.org/cpython/rev/8365f82f8a13 changeset: 72943:8365f82f8a13 branch: 3.2 parent: 72936:9ef20fbd340f user: Raymond Hettinger date: Sat Oct 15 23:50:42 2011 -0700 summary: Issue 13177: Make tracebacks more readable by avoiding chained exceptions in the lru_cache. files: Lib/functools.py | 34 ++++++++++++++----------- Lib/test/test_functools.py | 16 ++++++++++++ Misc/NEWS | 4 +++ 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/Lib/functools.py b/Lib/functools.py --- a/Lib/functools.py +++ b/Lib/functools.py @@ -141,7 +141,7 @@ hits = misses = 0 kwd_mark = (object(),) # separates positional and keyword args - lock = Lock() # needed because ordereddicts aren't threadsafe + lock = Lock() # needed because OrderedDict isn't threadsafe if maxsize is None: cache = dict() # simple cache without ordering or size limit @@ -155,13 +155,15 @@ try: result = cache[key] hits += 1 + return result except KeyError: - result = user_function(*args, **kwds) - cache[key] = result - misses += 1 + pass + result = user_function(*args, **kwds) + cache[key] = result + misses += 1 return result else: - cache = OrderedDict() # ordered least recent to most recent + cache = OrderedDict() # ordered least recent to most recent cache_popitem = cache.popitem cache_renew = cache.move_to_end @@ -171,18 +173,20 @@ key = args if kwds: key += kwd_mark + tuple(sorted(kwds.items())) - try: - with lock: + with lock: + try: result = cache[key] - cache_renew(key) # record recent use of this key + cache_renew(key) # record recent use of this key hits += 1 - except KeyError: - result = user_function(*args, **kwds) - with lock: - cache[key] = result # record recent use of this key - misses += 1 - if len(cache) > maxsize: - cache_popitem(0) # purge least recently used cache entry + return result + except KeyError: + pass + result = user_function(*args, **kwds) + with lock: + cache[key] = result # record recent use of this key + misses += 1 + if len(cache) > maxsize: + cache_popitem(0) # purge least recently used cache entry return result def cache_info(): diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -655,6 +655,22 @@ self.assertEqual(fib.cache_info(), functools._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)) + def test_lru_with_exceptions(self): + # Verify that user_function exceptions get passed through without + # creating a hard-to-read chained exception. + # http://bugs.python.org/issue13177 + for maxsize in (None, 100): + @functools.lru_cache(maxsize) + def func(i): + return 'abc'[i] + self.assertEqual(func(0), 'a') + with self.assertRaises(IndexError) as cm: + func(15) + self.assertIsNone(cm.exception.__context__) + # Verify that the previous exception did not result in a cached entry + with self.assertRaises(IndexError): + func(15) + def test_main(verbose=None): test_classes = ( TestPartial, diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -46,6 +46,10 @@ - Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number fields in tarfile. +- Issue #13177: Functools lru_cache() no longer calls the original function + inside an exception handler. This makes tracebacks easier to read because + chained exceptions are avoided. + - Issue #13025: mimetypes is now reading MIME types using the UTF-8 encoding, instead of the locale encoding. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 09:01:28 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 16 Oct 2011 09:01:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/5f4a871759ea changeset: 72944:5f4a871759ea parent: 72941:c63087ac1f6c parent: 72943:8365f82f8a13 user: Raymond Hettinger date: Sun Oct 16 00:00:51 2011 -0700 summary: Merge files: Lib/functools.py | 34 ++++++++++++++----------- Lib/test/test_functools.py | 16 ++++++++++++ 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Lib/functools.py b/Lib/functools.py --- a/Lib/functools.py +++ b/Lib/functools.py @@ -146,7 +146,7 @@ hits = misses = 0 kwd_mark = (object(),) # separates positional and keyword args - lock = Lock() # needed because ordereddicts aren't threadsafe + lock = Lock() # needed because OrderedDict isn't threadsafe if maxsize is None: cache = dict() # simple cache without ordering or size limit @@ -160,13 +160,15 @@ try: result = cache[key] hits += 1 + return result except KeyError: - result = user_function(*args, **kwds) - cache[key] = result - misses += 1 + pass + result = user_function(*args, **kwds) + cache[key] = result + misses += 1 return result else: - cache = OrderedDict() # ordered least recent to most recent + cache = OrderedDict() # ordered least recent to most recent cache_popitem = cache.popitem cache_renew = cache.move_to_end @@ -176,18 +178,20 @@ key = args if kwds: key += kwd_mark + tuple(sorted(kwds.items())) - try: - with lock: + with lock: + try: result = cache[key] - cache_renew(key) # record recent use of this key + cache_renew(key) # record recent use of this key hits += 1 - except KeyError: - result = user_function(*args, **kwds) - with lock: - cache[key] = result # record recent use of this key - misses += 1 - if len(cache) > maxsize: - cache_popitem(0) # purge least recently used cache entry + return result + except KeyError: + pass + result = user_function(*args, **kwds) + with lock: + cache[key] = result # record recent use of this key + misses += 1 + if len(cache) > maxsize: + cache_popitem(0) # purge least recently used cache entry return result def cache_info(): diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -718,6 +718,22 @@ self.assertEqual(fib.cache_info(), functools._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)) + def test_lru_with_exceptions(self): + # Verify that user_function exceptions get passed through without + # creating a hard-to-read chained exception. + # http://bugs.python.org/issue13177 + for maxsize in (None, 100): + @functools.lru_cache(maxsize) + def func(i): + return 'abc'[i] + self.assertEqual(func(0), 'a') + with self.assertRaises(IndexError) as cm: + func(15) + self.assertIsNone(cm.exception.__context__) + # Verify that the previous exception did not result in a cached entry + with self.assertRaises(IndexError): + func(15) + def test_main(verbose=None): test_classes = ( TestPartial, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 17:54:58 2011 From: python-checkins at python.org (senthil.kumaran) Date: Sun, 16 Oct 2011 17:54:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_closes_issue_1673007_ur?= =?utf8?q?llib=2Erequest_to_support_HEAD_requests_with_a_new?= Message-ID: http://hg.python.org/cpython/rev/0a0aafaa9bf5 changeset: 72945:0a0aafaa9bf5 user: Senthil Kumaran date: Sun Oct 16 23:54:44 2011 +0800 summary: Fix closes issue 1673007 urllib.request to support HEAD requests with a new method arg. files: Doc/library/urllib.request.rst | 35 +++++++++++++++++---- Doc/whatsnew/3.3.rst | 10 ++++++ Lib/test/test_urllib.py | 23 ++++++++++++++ Lib/urllib/request.py | 9 ++++- Misc/NEWS | 4 ++ 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -132,7 +132,7 @@ The following classes are provided: -.. class:: Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False) +.. class:: Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None) This class is an abstraction of a URL request. @@ -140,8 +140,8 @@ *data* may be a string specifying additional data to send to the server, or ``None`` if no such data is needed. Currently HTTP - requests are the only ones that use *data*; the HTTP request will - be a POST instead of a GET when the *data* parameter is provided. + requests are the only ones that use *data*, in order to choose between + ``'GET'`` and ``'POST'`` when *method* is not specified. *data* should be a buffer in the standard :mimetype:`application/x-www-form-urlencoded` format. The :func:`urllib.parse.urlencode` function takes a mapping or sequence @@ -157,8 +157,8 @@ :mod:`urllib`'s default user agent string is ``"Python-urllib/2.6"`` (on Python 2.6). - The final two arguments are only of interest for correct handling - of third-party HTTP cookies: + The following two arguments, *origin_req_host* and *unverifiable*, + are only of interest for correct handling of third-party HTTP cookies: *origin_req_host* should be the request-host of the origin transaction, as defined by :rfc:`2965`. It defaults to @@ -175,6 +175,13 @@ document, and the user had no option to approve the automatic fetching of the image, this should be true. + *method* should be a string that indicates the HTTP request method that + will be used (e.g. ``'HEAD'``). Its value is stored in the + :attr:`Request.method` attribute and is used by :meth:`Request.get_method()`. + + .. versionchanged:: 3.3 + :attr:`Request.method` argument is added to the Request class. + .. class:: OpenerDirector() @@ -369,6 +376,15 @@ boolean, indicates whether the request is unverifiable as defined by RFC 2965. +.. attribute:: Request.method + + The HTTP request method to use. This value is used by + :meth:`Request.get_method` to override the computed HTTP request + method that would otherwise be returned. This attribute is + initialized with the value of the *method* argument passed to the constructor. + + ..versionadded:: 3.3 + .. method:: Request.add_data(data) Set the :class:`Request` data to *data*. This is ignored by all handlers except @@ -378,8 +394,13 @@ .. method:: Request.get_method() - Return a string indicating the HTTP request method. This is only meaningful for - HTTP requests, and currently always returns ``'GET'`` or ``'POST'``. + Return a string indicating the HTTP request method. If + :attr:`Request.method` is not ``None``, return its value, otherwise return + ``'GET'`` if :attr:`Request.data` is ``None``, or ``'POST'`` if it's not. + This is only meaningful for HTTP requests. + + .. versionchanged:: 3.3 + get_method now looks at the value of :attr:`Request.method` first. .. method:: Request.has_data() diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -474,6 +474,16 @@ path also specifying the user/group names and not only their numeric ids. (Contributed by Sandro Tosi in :issue:`12191`) +urllib +------ + +The :class:`~urllib.request.Request` class, now accepts a *method* argument +used by :meth:`~urllib.request.Request.get_method` to determine what HTTP method +should be used. For example, this will send an ``'HEAD'`` request:: + + >>> urlopen(Request('http://www.python.org', method='HEAD')) + +(:issue:`1673007`) Optimizations ============= diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -1157,6 +1157,28 @@ # self.assertEqual(ftp.ftp.sock.gettimeout(), 30) # ftp.close() +class RequestTests(unittest.TestCase): + """Unit tests for urllib.request.Request.""" + + def test_default_values(self): + Request = urllib.request.Request + request = Request("http://www.python.org") + self.assertEqual(request.get_method(), 'GET') + request = Request("http://www.python.org", {}) + self.assertEqual(request.get_method(), 'POST') + + def test_with_method_arg(self): + Request = urllib.request.Request + request = Request("http://www.python.org", method='HEAD') + self.assertEqual(request.method, 'HEAD') + self.assertEqual(request.get_method(), 'HEAD') + request = Request("http://www.python.org", {}, method='HEAD') + self.assertEqual(request.method, 'HEAD') + self.assertEqual(request.get_method(), 'HEAD') + request = Request("http://www.python.org", method='GET') + self.assertEqual(request.get_method(), 'GET') + request.method = 'HEAD' + self.assertEqual(request.get_method(), 'HEAD') def test_main(): @@ -1172,6 +1194,7 @@ Utility_Tests, URLopener_Tests, #FTPWrapperTests, + RequestTests, ) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -177,7 +177,8 @@ class Request: def __init__(self, url, data=None, headers={}, - origin_req_host=None, unverifiable=False): + origin_req_host=None, unverifiable=False, + method=None): # unwrap('') --> 'type://host/path' self.full_url = unwrap(url) self.full_url, self.fragment = splittag(self.full_url) @@ -191,6 +192,7 @@ origin_req_host = request_host(self) self.origin_req_host = origin_req_host self.unverifiable = unverifiable + self.method = method self._parse() def _parse(self): @@ -202,7 +204,10 @@ self.host = unquote(self.host) def get_method(self): - if self.data is not None: + """Return a string indicating the HTTP request method.""" + if self.method is not None: + return self.method + elif self.data is not None: return "POST" else: return "GET" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -304,6 +304,10 @@ Library ------- + +- issue #1673007: urllib2 to support HEAD request via new method argument. + Patch contributions by David Stanek, Patrick Westerhoff and Ezio Melotti. + - Issue #12386: packaging does not fail anymore when writing the RESOURCES file. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 19:07:35 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 16 Oct 2011 19:07:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310653=3A_Fix_time?= =?utf8?q?=2Estrftime=28=29_on_Windows=2C_check_for_invalid_format_strings?= Message-ID: http://hg.python.org/cpython/rev/e3c13a1d2595 changeset: 72946:e3c13a1d2595 user: Victor Stinner date: Sun Oct 16 19:08:23 2011 +0200 summary: Issue #10653: Fix time.strftime() on Windows, check for invalid format strings files: Modules/timemodule.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -463,16 +463,16 @@ fmt = PyBytes_AS_STRING(format); #endif -#if defined(MS_WINDOWS) && defined(HAVE_WCSFTIME) +#if defined(MS_WINDOWS) /* check that the format string contains only valid directives */ - for(outbuf = wcschr(fmt, L'%'); + for(outbuf = strchr(fmt, '%'); outbuf != NULL; - outbuf = wcschr(outbuf+2, L'%')) + outbuf = strchr(outbuf+2, '%')) { if (outbuf[1]=='#') ++outbuf; /* not documented by python, */ if (outbuf[1]=='\0' || - !wcschr(L"aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) + !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 20:47:57 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 16 Oct 2011 20:47:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_test=5Fselect=3A_use_a_time?= =?utf8?b?b3V0PTAgaW4gdGVzdF9lcnJubygp?= Message-ID: http://hg.python.org/cpython/rev/60fecfbea397 changeset: 72947:60fecfbea397 user: Victor Stinner date: Sun Oct 16 20:48:52 2011 +0200 summary: test_select: use a timeout=0 in test_errno() files: Lib/test/test_select.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -28,7 +28,7 @@ fd = fp.fileno() fp.close() try: - select.select([fd], [], []) + select.select([fd], [], [], 0) except select.error as err: self.assertEqual(err.errno, errno.EBADF) else: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 22:14:35 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 16 Oct 2011 22:14:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_=2313174=3A_Fix_exten?= =?utf8?q?ded_attributes_tests_in_test=5Fos_for_SELinux?= Message-ID: http://hg.python.org/cpython/rev/78c660a63960 changeset: 72948:78c660a63960 user: Victor Stinner date: Sun Oct 16 22:12:03 2011 +0200 summary: Close #13174: Fix extended attributes tests in test_os for SELinux On Fedora, new files get the 'security.selinux' attribute. files: Lib/test/test_os.py | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1540,9 +1540,12 @@ with self.assertRaises(OSError) as cm: getxattr(fn, s("user.test")) self.assertEqual(cm.exception.errno, errno.ENODATA) - self.assertEqual(listxattr(fn), []) + init_xattr = listxattr(fn) + self.assertIsInstance(init_xattr, list) setxattr(fn, s("user.test"), b"") - self.assertEqual(listxattr(fn), ["user.test"]) + xattr = set(init_xattr) + xattr.add("user.test") + self.assertEqual(set(listxattr(fn)), xattr) self.assertEqual(getxattr(fn, b"user.test"), b"") setxattr(fn, s("user.test"), b"hello", os.XATTR_REPLACE) self.assertEqual(getxattr(fn, b"user.test"), b"hello") @@ -1553,12 +1556,14 @@ setxattr(fn, s("user.test2"), b"bye", os.XATTR_REPLACE) self.assertEqual(cm.exception.errno, errno.ENODATA) setxattr(fn, s("user.test2"), b"foo", os.XATTR_CREATE) - self.assertEqual(sorted(listxattr(fn)), ["user.test", "user.test2"]) + xattr.add("user.test2") + self.assertEqual(set(listxattr(fn)), xattr) removexattr(fn, s("user.test")) with self.assertRaises(OSError) as cm: getxattr(fn, s("user.test")) self.assertEqual(cm.exception.errno, errno.ENODATA) - self.assertEqual(listxattr(fn), ["user.test2"]) + xattr.remove("user.test") + self.assertEqual(set(listxattr(fn)), xattr) self.assertEqual(getxattr(fn, s("user.test2")), b"foo") setxattr(fn, s("user.test"), b"a"*1024) self.assertEqual(getxattr(fn, s("user.test")), b"a"*1024) @@ -1566,7 +1571,7 @@ many = sorted("user.test{}".format(i) for i in range(100)) for thing in many: setxattr(fn, thing, b"x") - self.assertEqual(sorted(listxattr(fn)), many) + self.assertEqual(set(listxattr(fn)), set(init_xattr) | set(many)) def _check_xattrs(self, *args): def make_bytes(s): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 23:45:12 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 16 Oct 2011 23:45:12 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwNjUz?= =?utf8?q?=3A_Fix_time=2Estrftime=28=29_on_Windows=2C_check_for_invalid_fo?= =?utf8?q?rmat_strings?= Message-ID: http://hg.python.org/cpython/rev/977c5753ca32 changeset: 72949:977c5753ca32 branch: 3.2 parent: 72943:8365f82f8a13 user: Victor Stinner date: Sun Oct 16 23:45:39 2011 +0200 summary: Issue #10653: Fix time.strftime() on Windows, check for invalid format strings files: Modules/timemodule.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -508,16 +508,16 @@ fmt = PyBytes_AS_STRING(format); #endif -#if defined(MS_WINDOWS) && defined(HAVE_WCSFTIME) +#if defined(MS_WINDOWS) /* check that the format string contains only valid directives */ - for(outbuf = wcschr(fmt, L'%'); + for(outbuf = strchr(fmt, '%'); outbuf != NULL; - outbuf = wcschr(outbuf+2, L'%')) + outbuf = strchr(outbuf+2, '%')) { if (outbuf[1]=='#') ++outbuf; /* not documented by python, */ if (outbuf[1]=='\0' || - !wcschr(L"aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) + !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 16 23:45:13 2011 From: python-checkins at python.org (victor.stinner) Date: Sun, 16 Oct 2011 23:45:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28null_merge_3=2E2=2C_fix_already_applied_to_default=29?= Message-ID: http://hg.python.org/cpython/rev/9a148ad59f80 changeset: 72950:9a148ad59f80 parent: 72948:78c660a63960 parent: 72949:977c5753ca32 user: Victor Stinner date: Sun Oct 16 23:46:06 2011 +0200 summary: (null merge 3.2, fix already applied to default) files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 02:38:20 2011 From: python-checkins at python.org (mark.hammond) Date: Mon, 17 Oct 2011 02:38:20 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzc4MzM6?= =?utf8?q?_Ext=2E_modules_built_using_distutils_on_Windows_no_longer_get_a?= Message-ID: http://hg.python.org/cpython/rev/fb886858024c changeset: 72951:fb886858024c branch: 2.7 parent: 72942:418fbf1af875 user: Mark Hammond date: Mon Oct 17 11:05:36 2011 +1100 summary: Issue #7833: Ext. modules built using distutils on Windows no longer get a manifest files: Lib/distutils/msvc9compiler.py | 77 ++++++++-- Lib/distutils/tests/test_msvc9compiler.py | 47 ++++++- Misc/NEWS | 4 + 3 files changed, 106 insertions(+), 22 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -640,15 +640,7 @@ self.library_filename(dll_name)) ld_args.append ('/IMPLIB:' + implib_file) - # Embedded manifests are recommended - see MSDN article titled - # "How to: Embed a Manifest Inside a C/C++ Application" - # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) - # Ask the linker to generate the manifest in the temp dir, so - # we can embed it later. - temp_manifest = os.path.join( - build_temp, - os.path.basename(output_filename) + ".manifest") - ld_args.append('/MANIFESTFILE:' + temp_manifest) + self.manifest_setup_ldargs(output_filename, build_temp, ld_args) if extra_preargs: ld_args[:0] = extra_preargs @@ -666,20 +658,54 @@ # will still consider the DLL up-to-date, but it will not have a # manifest. Maybe we should link to a temp file? OTOH, that # implies a build environment error that shouldn't go undetected. - if target_desc == CCompiler.EXECUTABLE: - mfid = 1 - else: - mfid = 2 - self._remove_visual_c_ref(temp_manifest) - out_arg = '-outputresource:%s;%s' % (output_filename, mfid) - try: - self.spawn(['mt.exe', '-nologo', '-manifest', - temp_manifest, out_arg]) - except DistutilsExecError, msg: - raise LinkError(msg) + mfinfo = self.manifest_get_embed_info(target_desc, ld_args) + if mfinfo is not None: + mffilename, mfid = mfinfo + out_arg = '-outputresource:%s;%s' % (output_filename, mfid) + try: + self.spawn(['mt.exe', '-nologo', '-manifest', + mffilename, out_arg]) + except DistutilsExecError, msg: + raise LinkError(msg) else: log.debug("skipping %s (up-to-date)", output_filename) + def manifest_setup_ldargs(self, output_filename, build_temp, ld_args): + # If we need a manifest at all, an embedded manifest is recommended. + # See MSDN article titled + # "How to: Embed a Manifest Inside a C/C++ Application" + # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) + # Ask the linker to generate the manifest in the temp dir, so + # we can check it, and possibly embed it, later. + temp_manifest = os.path.join( + build_temp, + os.path.basename(output_filename) + ".manifest") + ld_args.append('/MANIFESTFILE:' + temp_manifest) + + def manifest_get_embed_info(self, target_desc, ld_args): + # If a manifest should be embedded, return a tuple of + # (manifest_filename, resource_id). Returns None if no manifest + # should be embedded. See http://bugs.python.org/issue7833 for why + # we want to avoid any manifest for extension modules if we can) + for arg in ld_args: + if arg.startswith("/MANIFESTFILE:"): + temp_manifest = arg.split(":", 1)[1] + break + else: + # no /MANIFESTFILE so nothing to do. + return None + if target_desc == CCompiler.EXECUTABLE: + # by default, executables always get the manifest with the + # CRT referenced. + mfid = 1 + else: + # Extension modules try and avoid any manifest if possible. + mfid = 2 + temp_manifest = self._remove_visual_c_ref(temp_manifest) + if temp_manifest is None: + return None + return temp_manifest, mfid + def _remove_visual_c_ref(self, manifest_file): try: # Remove references to the Visual C runtime, so they will @@ -688,6 +714,8 @@ # runtimes are not in WinSxS folder, but in Python's own # folder), the runtimes do not need to be in every folder # with .pyd's. + # Returns either the filename of the modified manifest or + # None if no manifest should be embedded. manifest_f = open(manifest_file) try: manifest_buf = manifest_f.read() @@ -700,9 +728,18 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) + # Now see if any other assemblies are referenced - if not, we + # don't want a manifest embedded. + pattern = re.compile( + r"""|)""", re.DOTALL) + if re.search(pattern, manifest_buf) is None: + return None + manifest_f = open(manifest_file, 'w') try: manifest_f.write(manifest_buf) + return manifest_file finally: manifest_f.close() except IOError: diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py --- a/Lib/distutils/tests/test_msvc9compiler.py +++ b/Lib/distutils/tests/test_msvc9compiler.py @@ -7,7 +7,36 @@ from distutils.tests import support from test.test_support import run_unittest -_MANIFEST = """\ +# A manifest with the only assembly reference being the msvcrt assembly, so +# should have the assembly completely stripped. Note that although the +# assembly has a reference the assembly is removed - that is +# currently a "feature", not a bug :) +_MANIFEST_WITH_ONLY_MSVC_REFERENCE = """\ + + + + + + + + + + + + + + + + + +""" + +# A manifest with references to assemblies other than msvcrt. When processed, +# this assembly should be returned with just the msvcrt part removed. +_MANIFEST_WITH_MULTIPLE_REFERENCES = """\ @@ -115,7 +144,7 @@ manifest = os.path.join(tempdir, 'manifest') f = open(manifest, 'w') try: - f.write(_MANIFEST) + f.write(_MANIFEST_WITH_MULTIPLE_REFERENCES) finally: f.close() @@ -133,6 +162,20 @@ # makes sure the manifest was properly cleaned self.assertEqual(content, _CLEANED_MANIFEST) + def test_remove_entire_manifest(self): + from distutils.msvc9compiler import MSVCCompiler + tempdir = self.mkdtemp() + manifest = os.path.join(tempdir, 'manifest') + f = open(manifest, 'w') + try: + f.write(_MANIFEST_WITH_ONLY_MSVC_REFERENCE) + finally: + f.close() + + compiler = MSVCCompiler() + got = compiler._remove_visual_c_ref(manifest) + self.assertIs(got, None) + def test_suite(): return unittest.makeSuite(msvc9compilerTestCase) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,10 @@ Core and Builtins ----------------- +- Issue #7833: Extension modules built using distutils on Windows will no + longer include a "manifest" to prevent them failing at import time in some + embedded situations. + - Issue #13186: Fix __delitem__ on old-style instances when invoked through PySequence_DelItem. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 02:38:21 2011 From: python-checkins at python.org (mark.hammond) Date: Mon, 17 Oct 2011 02:38:21 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzc4MzM6?= =?utf8?q?_Ext=2E_modules_built_using_distutils_on_Windows_no_longer_get_a?= Message-ID: http://hg.python.org/cpython/rev/9caeb7215344 changeset: 72952:9caeb7215344 branch: 3.2 parent: 72949:977c5753ca32 user: Mark Hammond date: Mon Oct 17 11:05:57 2011 +1100 summary: Issue #7833: Ext. modules built using distutils on Windows no longer get a manifest files: Lib/distutils/msvc9compiler.py | 78 ++++++++-- Lib/distutils/tests/test_msvc9compiler.py | 47 ++++++- Misc/NEWS | 4 + 3 files changed, 106 insertions(+), 23 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -627,15 +627,7 @@ self.library_filename(dll_name)) ld_args.append ('/IMPLIB:' + implib_file) - # Embedded manifests are recommended - see MSDN article titled - # "How to: Embed a Manifest Inside a C/C++ Application" - # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) - # Ask the linker to generate the manifest in the temp dir, so - # we can embed it later. - temp_manifest = os.path.join( - build_temp, - os.path.basename(output_filename) + ".manifest") - ld_args.append('/MANIFESTFILE:' + temp_manifest) + self.manifest_setup_ldargs(output_filename, build_temp, ld_args) if extra_preargs: ld_args[:0] = extra_preargs @@ -653,21 +645,54 @@ # will still consider the DLL up-to-date, but it will not have a # manifest. Maybe we should link to a temp file? OTOH, that # implies a build environment error that shouldn't go undetected. - if target_desc == CCompiler.EXECUTABLE: - mfid = 1 - else: - mfid = 2 - # Remove references to the Visual C runtime - self._remove_visual_c_ref(temp_manifest) - out_arg = '-outputresource:%s;%s' % (output_filename, mfid) - try: - self.spawn(['mt.exe', '-nologo', '-manifest', - temp_manifest, out_arg]) - except DistutilsExecError as msg: - raise LinkError(msg) + mfinfo = self.manifest_get_embed_info(target_desc, ld_args) + if mfinfo is not None: + mffilename, mfid = mfinfo + out_arg = '-outputresource:%s;%s' % (output_filename, mfid) + try: + self.spawn(['mt.exe', '-nologo', '-manifest', + mffilename, out_arg]) + except DistutilsExecError as msg: + raise LinkError(msg) else: log.debug("skipping %s (up-to-date)", output_filename) + def manifest_setup_ldargs(self, output_filename, build_temp, ld_args): + # If we need a manifest at all, an embedded manifest is recommended. + # See MSDN article titled + # "How to: Embed a Manifest Inside a C/C++ Application" + # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) + # Ask the linker to generate the manifest in the temp dir, so + # we can check it, and possibly embed it, later. + temp_manifest = os.path.join( + build_temp, + os.path.basename(output_filename) + ".manifest") + ld_args.append('/MANIFESTFILE:' + temp_manifest) + + def manifest_get_embed_info(self, target_desc, ld_args): + # If a manifest should be embedded, return a tuple of + # (manifest_filename, resource_id). Returns None if no manifest + # should be embedded. See http://bugs.python.org/issue7833 for why + # we want to avoid any manifest for extension modules if we can) + for arg in ld_args: + if arg.startswith("/MANIFESTFILE:"): + temp_manifest = arg.split(":", 1)[1] + break + else: + # no /MANIFESTFILE so nothing to do. + return None + if target_desc == CCompiler.EXECUTABLE: + # by default, executables always get the manifest with the + # CRT referenced. + mfid = 1 + else: + # Extension modules try and avoid any manifest if possible. + mfid = 2 + temp_manifest = self._remove_visual_c_ref(temp_manifest) + if temp_manifest is None: + return None + return temp_manifest, mfid + def _remove_visual_c_ref(self, manifest_file): try: # Remove references to the Visual C runtime, so they will @@ -676,6 +701,8 @@ # runtimes are not in WinSxS folder, but in Python's own # folder), the runtimes do not need to be in every folder # with .pyd's. + # Returns either the filename of the modified manifest or + # None if no manifest should be embedded. manifest_f = open(manifest_file) try: manifest_buf = manifest_f.read() @@ -688,9 +715,18 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) + # Now see if any other assemblies are referenced - if not, we + # don't want a manifest embedded. + pattern = re.compile( + r"""|)""", re.DOTALL) + if re.search(pattern, manifest_buf) is None: + return None + manifest_f = open(manifest_file, 'w') try: manifest_f.write(manifest_buf) + return manifest_file finally: manifest_f.close() except IOError: diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py --- a/Lib/distutils/tests/test_msvc9compiler.py +++ b/Lib/distutils/tests/test_msvc9compiler.py @@ -7,7 +7,36 @@ from distutils.tests import support from test.support import run_unittest -_MANIFEST = """\ +# A manifest with the only assembly reference being the msvcrt assembly, so +# should have the assembly completely stripped. Note that although the +# assembly has a reference the assembly is removed - that is +# currently a "feature", not a bug :) +_MANIFEST_WITH_ONLY_MSVC_REFERENCE = """\ + + + + + + + + + + + + + + + + + +""" + +# A manifest with references to assemblies other than msvcrt. When processed, +# this assembly should be returned with just the msvcrt part removed. +_MANIFEST_WITH_MULTIPLE_REFERENCES = """\ @@ -115,7 +144,7 @@ manifest = os.path.join(tempdir, 'manifest') f = open(manifest, 'w') try: - f.write(_MANIFEST) + f.write(_MANIFEST_WITH_MULTIPLE_REFERENCES) finally: f.close() @@ -133,6 +162,20 @@ # makes sure the manifest was properly cleaned self.assertEqual(content, _CLEANED_MANIFEST) + def test_remove_entire_manifest(self): + from distutils.msvc9compiler import MSVCCompiler + tempdir = self.mkdtemp() + manifest = os.path.join(tempdir, 'manifest') + f = open(manifest, 'w') + try: + f.write(_MANIFEST_WITH_ONLY_MSVC_REFERENCE) + finally: + f.close() + + compiler = MSVCCompiler() + got = compiler._remove_visual_c_ref(manifest) + self.assertIs(got, None) + def test_suite(): return unittest.makeSuite(msvc9compilerTestCase) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #7833: Extension modules built using distutils on Windows will no + longer include a "manifest" to prevent them failing at import time in some + embedded situations. + - Issue #13063: the Windows error ERROR_NO_DATA (numbered 232 and described as "The pipe is being closed") is now mapped to POSIX errno EPIPE (previously EINVAL). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 02:38:24 2011 From: python-checkins at python.org (mark.hammond) Date: Mon, 17 Oct 2011 02:38:24 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=237833=3A_Ext=2E_modules_built_using_distutils_on_Win?= =?utf8?q?dows_no_longer_get_a?= Message-ID: http://hg.python.org/cpython/rev/3073ef853647 changeset: 72953:3073ef853647 parent: 72950:9a148ad59f80 parent: 72952:9caeb7215344 user: Mark Hammond date: Mon Oct 17 11:28:09 2011 +1100 summary: Issue #7833: Ext. modules built using distutils on Windows no longer get a manifest files: Lib/distutils/msvc9compiler.py | 78 ++++++++-- Lib/distutils/tests/test_msvc9compiler.py | 47 ++++++- Misc/NEWS | 4 + 3 files changed, 106 insertions(+), 23 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -627,15 +627,7 @@ self.library_filename(dll_name)) ld_args.append ('/IMPLIB:' + implib_file) - # Embedded manifests are recommended - see MSDN article titled - # "How to: Embed a Manifest Inside a C/C++ Application" - # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) - # Ask the linker to generate the manifest in the temp dir, so - # we can embed it later. - temp_manifest = os.path.join( - build_temp, - os.path.basename(output_filename) + ".manifest") - ld_args.append('/MANIFESTFILE:' + temp_manifest) + self.manifest_setup_ldargs(output_filename, build_temp, ld_args) if extra_preargs: ld_args[:0] = extra_preargs @@ -653,21 +645,54 @@ # will still consider the DLL up-to-date, but it will not have a # manifest. Maybe we should link to a temp file? OTOH, that # implies a build environment error that shouldn't go undetected. - if target_desc == CCompiler.EXECUTABLE: - mfid = 1 - else: - mfid = 2 - # Remove references to the Visual C runtime - self._remove_visual_c_ref(temp_manifest) - out_arg = '-outputresource:%s;%s' % (output_filename, mfid) - try: - self.spawn(['mt.exe', '-nologo', '-manifest', - temp_manifest, out_arg]) - except DistutilsExecError as msg: - raise LinkError(msg) + mfinfo = self.manifest_get_embed_info(target_desc, ld_args) + if mfinfo is not None: + mffilename, mfid = mfinfo + out_arg = '-outputresource:%s;%s' % (output_filename, mfid) + try: + self.spawn(['mt.exe', '-nologo', '-manifest', + mffilename, out_arg]) + except DistutilsExecError as msg: + raise LinkError(msg) else: log.debug("skipping %s (up-to-date)", output_filename) + def manifest_setup_ldargs(self, output_filename, build_temp, ld_args): + # If we need a manifest at all, an embedded manifest is recommended. + # See MSDN article titled + # "How to: Embed a Manifest Inside a C/C++ Application" + # (currently at http://msdn2.microsoft.com/en-us/library/ms235591(VS.80).aspx) + # Ask the linker to generate the manifest in the temp dir, so + # we can check it, and possibly embed it, later. + temp_manifest = os.path.join( + build_temp, + os.path.basename(output_filename) + ".manifest") + ld_args.append('/MANIFESTFILE:' + temp_manifest) + + def manifest_get_embed_info(self, target_desc, ld_args): + # If a manifest should be embedded, return a tuple of + # (manifest_filename, resource_id). Returns None if no manifest + # should be embedded. See http://bugs.python.org/issue7833 for why + # we want to avoid any manifest for extension modules if we can) + for arg in ld_args: + if arg.startswith("/MANIFESTFILE:"): + temp_manifest = arg.split(":", 1)[1] + break + else: + # no /MANIFESTFILE so nothing to do. + return None + if target_desc == CCompiler.EXECUTABLE: + # by default, executables always get the manifest with the + # CRT referenced. + mfid = 1 + else: + # Extension modules try and avoid any manifest if possible. + mfid = 2 + temp_manifest = self._remove_visual_c_ref(temp_manifest) + if temp_manifest is None: + return None + return temp_manifest, mfid + def _remove_visual_c_ref(self, manifest_file): try: # Remove references to the Visual C runtime, so they will @@ -676,6 +701,8 @@ # runtimes are not in WinSxS folder, but in Python's own # folder), the runtimes do not need to be in every folder # with .pyd's. + # Returns either the filename of the modified manifest or + # None if no manifest should be embedded. manifest_f = open(manifest_file) try: manifest_buf = manifest_f.read() @@ -688,9 +715,18 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) + # Now see if any other assemblies are referenced - if not, we + # don't want a manifest embedded. + pattern = re.compile( + r"""|)""", re.DOTALL) + if re.search(pattern, manifest_buf) is None: + return None + manifest_f = open(manifest_file, 'w') try: manifest_f.write(manifest_buf) + return manifest_file finally: manifest_f.close() except IOError: diff --git a/Lib/distutils/tests/test_msvc9compiler.py b/Lib/distutils/tests/test_msvc9compiler.py --- a/Lib/distutils/tests/test_msvc9compiler.py +++ b/Lib/distutils/tests/test_msvc9compiler.py @@ -7,7 +7,36 @@ from distutils.tests import support from test.support import run_unittest -_MANIFEST = """\ +# A manifest with the only assembly reference being the msvcrt assembly, so +# should have the assembly completely stripped. Note that although the +# assembly has a reference the assembly is removed - that is +# currently a "feature", not a bug :) +_MANIFEST_WITH_ONLY_MSVC_REFERENCE = """\ + + + + + + + + + + + + + + + + + +""" + +# A manifest with references to assemblies other than msvcrt. When processed, +# this assembly should be returned with just the msvcrt part removed. +_MANIFEST_WITH_MULTIPLE_REFERENCES = """\ @@ -115,7 +144,7 @@ manifest = os.path.join(tempdir, 'manifest') f = open(manifest, 'w') try: - f.write(_MANIFEST) + f.write(_MANIFEST_WITH_MULTIPLE_REFERENCES) finally: f.close() @@ -133,6 +162,20 @@ # makes sure the manifest was properly cleaned self.assertEqual(content, _CLEANED_MANIFEST) + def test_remove_entire_manifest(self): + from distutils.msvc9compiler import MSVCCompiler + tempdir = self.mkdtemp() + manifest = os.path.join(tempdir, 'manifest') + f = open(manifest, 'w') + try: + f.write(_MANIFEST_WITH_ONLY_MSVC_REFERENCE) + finally: + f.close() + + compiler = MSVCCompiler() + got = compiler._remove_visual_c_ref(manifest) + self.assertIs(got, None) + def test_suite(): return unittest.makeSuite(msvc9compilerTestCase) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #7833: Extension modules built using distutils on Windows will no + longer include a "manifest" to prevent them failing at import time in some + embedded situations. + - PEP 3151 / issue #12555: reworking the OS and IO exception hierarchy. - Add internal API for static strings (_Py_identifier et al.). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 02:38:25 2011 From: python-checkins at python.org (mark.hammond) Date: Mon, 17 Oct 2011 02:38:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_normalize_white?= =?utf8?q?space_in_Lib/distutils/msvc9compiler=2Epy?= Message-ID: http://hg.python.org/cpython/rev/a27df4b88d67 changeset: 72954:a27df4b88d67 branch: 2.7 parent: 72951:fb886858024c user: Mark Hammond date: Mon Oct 17 11:35:06 2011 +1100 summary: normalize whitespace in Lib/distutils/msvc9compiler.py files: Lib/distutils/msvc9compiler.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -685,7 +685,7 @@ def manifest_get_embed_info(self, target_desc, ld_args): # If a manifest should be embedded, return a tuple of # (manifest_filename, resource_id). Returns None if no manifest - # should be embedded. See http://bugs.python.org/issue7833 for why + # should be embedded. See http://bugs.python.org/issue7833 for why # we want to avoid any manifest for extension modules if we can) for arg in ld_args: if arg.startswith("/MANIFESTFILE:"): @@ -728,7 +728,7 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) - # Now see if any other assemblies are referenced - if not, we + # Now see if any other assemblies are referenced - if not, we # don't want a manifest embedded. pattern = re.compile( r""" http://hg.python.org/cpython/rev/3be599aa6a38 changeset: 72955:3be599aa6a38 branch: 3.2 parent: 72952:9caeb7215344 user: Mark Hammond date: Mon Oct 17 11:35:31 2011 +1100 summary: normalize whitespace in Lib/distutils/msvc9compiler.py files: Lib/distutils/msvc9compiler.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -715,7 +715,7 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) - # Now see if any other assemblies are referenced - if not, we + # Now see if any other assemblies are referenced - if not, we # don't want a manifest embedded. pattern = re.compile( r""" http://hg.python.org/cpython/rev/f6b3ad301851 changeset: 72956:f6b3ad301851 parent: 72953:3073ef853647 parent: 72955:3be599aa6a38 user: Mark Hammond date: Mon Oct 17 11:36:49 2011 +1100 summary: normalize whitespace in Lib/distutils/msvc9compiler.py files: Lib/distutils/msvc9compiler.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/msvc9compiler.py b/Lib/distutils/msvc9compiler.py --- a/Lib/distutils/msvc9compiler.py +++ b/Lib/distutils/msvc9compiler.py @@ -715,7 +715,7 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) - # Now see if any other assemblies are referenced - if not, we + # Now see if any other assemblies are referenced - if not, we # don't want a manifest embedded. pattern = re.compile( r""" results for f6b3ad301851 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogXeWqWK', '-x'] From python-checkins at python.org Mon Oct 17 19:10:34 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 17 Oct 2011 19:10:34 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_plug_possible_r?= =?utf8?q?efleak_=28closes_=2313199=29?= Message-ID: http://hg.python.org/cpython/rev/53c87a0275ab changeset: 72957:53c87a0275ab branch: 3.2 parent: 72955:3be599aa6a38 user: Benjamin Peterson date: Mon Oct 17 13:09:27 2011 -0400 summary: plug possible refleak (closes #13199) files: Objects/sliceobject.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -320,9 +320,13 @@ } t1 = PyTuple_New(3); + if (t1 == NULL) + return NULL; t2 = PyTuple_New(3); - if (t1 == NULL || t2 == NULL) + if (t2 == NULL) { + Py_DECREF(t1); return NULL; + } PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start); PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:10:35 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 17 Oct 2011 19:10:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?b?OiBtZXJnZSAzLjIgKCMxMzE5OSk=?= Message-ID: http://hg.python.org/cpython/rev/7bf70519795c changeset: 72958:7bf70519795c parent: 72956:f6b3ad301851 parent: 72957:53c87a0275ab user: Benjamin Peterson date: Mon Oct 17 13:10:24 2011 -0400 summary: merge 3.2 (#13199) files: Objects/sliceobject.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -347,9 +347,13 @@ } t1 = PyTuple_New(3); + if (t1 == NULL) + return NULL; t2 = PyTuple_New(3); - if (t1 == NULL || t2 == NULL) + if (t2 == NULL) { + Py_DECREF(t1); return NULL; + } PyTuple_SET_ITEM(t1, 0, ((PySliceObject *)v)->start); PyTuple_SET_ITEM(t1, 1, ((PySliceObject *)v)->stop); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:24:56 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 17 Oct 2011 19:24:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo?= Message-ID: http://hg.python.org/cpython/rev/ca00e021322d changeset: 72959:ca00e021322d user: Antoine Pitrou date: Mon Oct 17 19:21:04 2011 +0200 summary: Fix typo files: Objects/stringlib/fastsearch.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/stringlib/fastsearch.h b/Objects/stringlib/fastsearch.h --- a/Objects/stringlib/fastsearch.h +++ b/Objects/stringlib/fastsearch.h @@ -115,7 +115,7 @@ unsigned char needle; needle = p[0] & 0xff; #if STRINGLIB_SIZEOF_CHAR > 1 - /* If looking for a multiple of 256, we'd have two + /* If looking for a multiple of 256, we'd have too many false positives looking for the '\0' byte in UCS2 and UCS4 representations. */ if (needle != 0) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:34:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 17 Oct 2011 19:34:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313146=3A_Writing_a?= =?utf8?q?_pyc_file_is_now_atomic_under_POSIX=2E?= Message-ID: http://hg.python.org/cpython/rev/c16063765d3a changeset: 72960:c16063765d3a user: Antoine Pitrou date: Mon Oct 17 19:28:44 2011 +0200 summary: Issue #13146: Writing a pyc file is now atomic under POSIX. files: Lib/importlib/_bootstrap.py | 26 ++++++++++++- Misc/NEWS | 2 + Python/import.c | 47 +++++++++++++++++++----- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -80,6 +80,27 @@ return _path_join(_os.getcwd(), path) +def _write_atomic(path, data): + """Best-effort function to write data to a path atomically.""" + if not sys.platform.startswith('win'): + # On POSIX-like platforms, renaming is atomic + path_tmp = path + '.tmp' + try: + fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY) + with _io.FileIO(fd, 'wb') as file: + file.write(data) + _os.rename(path_tmp, path) + except OSError: + try: + _os.unlink(path_tmp) + except OSError: + pass + raise + else: + with _io.FileIO(path, 'wb') as file: + file.write(data) + + def _wrap(new, old): """Simple substitute for functools.wraps.""" for replace in ['__module__', '__name__', '__doc__']: @@ -494,9 +515,8 @@ else: raise try: - with _io.FileIO(path, 'wb') as file: - file.write(data) - except IOError as exc: + _write_atomic(path, data) + except OSError as exc: # Don't worry if you can't write bytecode. if exc.errno == errno.EACCES: return diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #13146: Writing a pyc file is now atomic under POSIX. + - Issue #7833: Extension modules built using distutils on Windows will no longer include a "manifest" to prevent them failing at import time in some embedded situations. diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1284,7 +1284,8 @@ #ifdef MS_WINDOWS int fd; #else - PyObject *cpathbytes; + PyObject *cpathbytes, *cpathbytes_tmp; + Py_ssize_t cpathbytes_len; #endif PyObject *dirname; Py_UCS4 *dirsep; @@ -1345,13 +1346,25 @@ else fp = NULL; #else + /* Under POSIX, we first write to a tmp file and then take advantage + of atomic renaming. */ cpathbytes = PyUnicode_EncodeFSDefault(cpathname); if (cpathbytes == NULL) { PyErr_Clear(); return; } - - fp = open_exclusive(PyBytes_AS_STRING(cpathbytes), mode); + cpathbytes_len = PyBytes_GET_SIZE(cpathbytes); + cpathbytes_tmp = PyBytes_FromStringAndSize(NULL, cpathbytes_len + 4); + if (cpathbytes_tmp == NULL) { + Py_DECREF(cpathbytes); + PyErr_Clear(); + return; + } + memcpy(PyBytes_AS_STRING(cpathbytes_tmp), PyBytes_AS_STRING(cpathbytes), + cpathbytes_len); + memcpy(PyBytes_AS_STRING(cpathbytes_tmp) + cpathbytes_len, ".tmp", 4); + + fp = open_exclusive(PyBytes_AS_STRING(cpathbytes_tmp), mode); #endif if (fp == NULL) { if (Py_VerboseFlag) @@ -1359,6 +1372,7 @@ "# can't create %R\n", cpathname); #ifndef MS_WINDOWS Py_DECREF(cpathbytes); + Py_DECREF(cpathbytes_tmp); #endif return; } @@ -1366,6 +1380,11 @@ /* First write a 0 for mtime */ PyMarshal_WriteLongToFile(0L, fp, Py_MARSHAL_VERSION); PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION); + fflush(fp); + /* Now write the true mtime */ + fseek(fp, 4L, 0); + assert(mtime < LONG_MAX); + PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); if (fflush(fp) != 0 || ferror(fp)) { if (Py_VerboseFlag) PySys_FormatStderr("# can't write %R\n", cpathname); @@ -1374,20 +1393,28 @@ #ifdef MS_WINDOWS (void)DeleteFileW(PyUnicode_AS_UNICODE(cpathname)); #else - (void) unlink(PyBytes_AS_STRING(cpathbytes)); + (void) unlink(PyBytes_AS_STRING(cpathbytes_tmp)); Py_DECREF(cpathbytes); + Py_DECREF(cpathbytes_tmp); #endif return; } + fclose(fp); + /* Under POSIX, do an atomic rename */ #ifndef MS_WINDOWS + if (rename(PyBytes_AS_STRING(cpathbytes_tmp), + PyBytes_AS_STRING(cpathbytes))) { + if (Py_VerboseFlag) + PySys_FormatStderr("# can't write %R\n", cpathname); + /* Don't keep tmp file */ + unlink(PyBytes_AS_STRING(cpathbytes_tmp)); + Py_DECREF(cpathbytes); + Py_DECREF(cpathbytes_tmp); + return; + } Py_DECREF(cpathbytes); + Py_DECREF(cpathbytes_tmp); #endif - /* Now write the true mtime */ - fseek(fp, 4L, 0); - assert(mtime < LONG_MAX); - PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION); - fflush(fp); - fclose(fp); if (Py_VerboseFlag) PySys_FormatStderr("# wrote %R\n", cpathname); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:41:19 2011 From: python-checkins at python.org (nadeem.vawda) Date: Mon, 17 Oct 2011 19:41:19 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTk0?= =?utf8?q?=3A_zlib=2Ecompressobj=28=29=2Ecopy=28=29_and_zlib=2Edecompresso?= =?utf8?b?YmooKS5jb3B5KCkgYXJlIG5vdw==?= Message-ID: http://hg.python.org/cpython/rev/80f07777accd changeset: 72961:80f07777accd branch: 2.7 parent: 72954:a27df4b88d67 user: Nadeem Vawda date: Mon Oct 17 19:33:38 2011 +0200 summary: Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. files: Misc/NEWS | 3 +++ PC/pyconfig.h | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,6 +60,9 @@ Library ------- +- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are + now available on Windows. + - Issue #13114: Fix the distutils commands check and register when the long description is a Unicode string with non-ASCII characters. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -643,6 +643,9 @@ #define HAVE_WCSCOLL 1 #endif +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + /* Define if you have the header file. */ /* #undef HAVE_DLFCN_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:41:19 2011 From: python-checkins at python.org (nadeem.vawda) Date: Mon, 17 Oct 2011 19:41:19 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTk0?= =?utf8?q?=3A_zlib=2Ecompressobj=28=29=2Ecopy=28=29_and_zlib=2Edecompresso?= =?utf8?b?YmooKS5jb3B5KCkgYXJlIG5vdw==?= Message-ID: http://hg.python.org/cpython/rev/fc7ee478ed3b changeset: 72962:fc7ee478ed3b branch: 3.2 parent: 72957:53c87a0275ab user: Nadeem Vawda date: Mon Oct 17 19:34:22 2011 +0200 summary: Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. files: Misc/NEWS | 3 +++ PC/pyconfig.h | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -47,6 +47,9 @@ Library ------- +- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are + now available on Windows. + - Issue #13158: Fix decoding and encoding of GNU tar specific base-256 number fields in tarfile. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -648,6 +648,9 @@ #define HAVE_WCSXFRM 1 #endif +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + /* Define if you have the header file. */ /* #undef HAVE_DLFCN_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:41:20 2011 From: python-checkins at python.org (nadeem.vawda) Date: Mon, 17 Oct 2011 19:41:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?b?OiBNZXJnZSAjMTMxOTQ6IHpsaWIuY29tcHJlc3NvYmooKS5jb3B5KCkgYW5kIHps?= =?utf8?b?aWIuZGVjb21wcmVzc29iaigpLmNvcHkoKSBhcmUgbm93?= Message-ID: http://hg.python.org/cpython/rev/80de33021488 changeset: 72963:80de33021488 parent: 72960:c16063765d3a parent: 72962:fc7ee478ed3b user: Nadeem Vawda date: Mon Oct 17 19:40:47 2011 +0200 summary: Merge #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. files: Misc/NEWS | 3 +++ PC/pyconfig.h | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -311,6 +311,9 @@ Library ------- +- Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are + now available on Windows. + - issue #1673007: urllib2 to support HEAD request via new method argument. Patch contributions by David Stanek, Patrick Westerhoff and Ezio Melotti. diff --git a/PC/pyconfig.h b/PC/pyconfig.h --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -644,6 +644,9 @@ #define HAVE_WCSXFRM 1 #endif +/* Define if the zlib library has inflateCopy */ +#define HAVE_ZLIB_COPY 1 + /* Define if you have the header file. */ /* #undef HAVE_DLFCN_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 19:54:42 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 17 Oct 2011 19:54:42 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312367=3A_Test_test?= =?utf8?q?=5Fselect=2Etest=5Ferrno=28=29_on_FreeBSD?= Message-ID: http://hg.python.org/cpython/rev/f6b8e4226260 changeset: 72964:f6b8e4226260 user: Victor Stinner date: Mon Oct 17 19:55:31 2011 +0200 summary: Issue #12367: Test test_select.test_errno() on FreeBSD See the FreeBSD bug: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/155606 files: Lib/test/test_select.py | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_select.py b/Lib/test/test_select.py --- a/Lib/test/test_select.py +++ b/Lib/test/test_select.py @@ -23,6 +23,9 @@ self.assertRaises(TypeError, select.select, [], [], [], "not a number") self.assertRaises(ValueError, select.select, [], [], [], -1) + # Issue #12367: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/155606 + @unittest.skipIf(sys.platform.startswith('freebsd'), + 'skip because of a FreeBSD bug: kern/155606') def test_errno(self): with open(__file__, 'rb') as fp: fd = fp.fileno() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 20:18:02 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 17 Oct 2011 20:18:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Instantiate_the_OS-related_?= =?utf8?q?exception_as_soon_as_we_raise_it=2C_so_that_=22except=22?= Message-ID: http://hg.python.org/cpython/rev/84aed9ef7aaf changeset: 72965:84aed9ef7aaf user: Victor Stinner date: Mon Oct 17 20:18:58 2011 +0200 summary: Instantiate the OS-related exception as soon as we raise it, so that "except" works properly. PyErr_SetFromErrnoWithFilenameObject() was already fixed by the changeset 793c75177d28. This commit fixes PyErr_SetExcFromWindowsErrWithFilenameObject(), used on Windows. files: Lib/test/test_pep3151.py | 13 ++++++++++++- Python/errors.c | 14 +++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_pep3151.py b/Lib/test/test_pep3151.py --- a/Lib/test/test_pep3151.py +++ b/Lib/test/test_pep3151.py @@ -80,12 +80,23 @@ self.assertIs(type(e), SubOSError) def test_try_except(self): + filename = "some_hopefully_non_existing_file" + # This checks that try .. except checks the concrete exception # (FileNotFoundError) and not the base type specified when # PyErr_SetFromErrnoWithFilenameObject was called. # (it is therefore deliberate that it doesn't use assertRaises) try: - open("some_hopefully_non_existing_file") + open(filename) + except FileNotFoundError: + pass + else: + self.fail("should have raised a FileNotFoundError") + + # Another test for PyErr_SetExcFromWindowsErrWithFilenameObject() + self.assertFalse(os.path.exists(filename)) + try: + os.unlink(filename) except FileNotFoundError: pass else: diff --git a/Python/errors.c b/Python/errors.c --- a/Python/errors.c +++ b/Python/errors.c @@ -468,7 +468,7 @@ int len; WCHAR *s_buf = NULL; /* Free via LocalFree */ PyObject *message; - PyObject *v; + PyObject *args, *v; DWORD err = (DWORD)ierr; if (err==0) err = GetLastError(); len = FormatMessageW( @@ -504,12 +504,16 @@ filenameObject = Py_None; /* This is the constructor signature for passing a Windows error code. The POSIX translation will be figured out by the constructor. */ - v = Py_BuildValue("(iOOi)", 0, message, filenameObject, err); + args = Py_BuildValue("(iOOi)", 0, message, filenameObject, err); Py_DECREF(message); - if (v != NULL) { - PyErr_SetObject(exc, v); - Py_DECREF(v); + if (args != NULL) { + v = PyObject_Call(exc, args, NULL); + Py_DECREF(args); + if (v != NULL) { + PyErr_SetObject((PyObject *) Py_TYPE(v), v); + Py_DECREF(v); + } } LocalFree(s_buf); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 17 20:43:58 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 17 Oct 2011 20:43:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_=2312454=3A_The_mailb?= =?utf8?q?ox_module_is_now_using_ASCII=2C_instead_of_the_locale?= Message-ID: http://hg.python.org/cpython/rev/5ea81e4c58a7 changeset: 72966:5ea81e4c58a7 user: Victor Stinner date: Mon Oct 17 20:44:22 2011 +0200 summary: Close #12454: The mailbox module is now using ASCII, instead of the locale encoding, to read and write MH mailboxes (.mh_sequences files). files: Lib/mailbox.py | 7 ++----- Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/mailbox.py b/Lib/mailbox.py --- a/Lib/mailbox.py +++ b/Lib/mailbox.py @@ -1108,8 +1108,7 @@ def get_sequences(self): """Return a name-to-key-list dictionary to define each sequence.""" results = {} - f = open(os.path.join(self._path, '.mh_sequences'), 'r') - try: + with open(os.path.join(self._path, '.mh_sequences'), 'r', encoding='ASCII') as f: all_keys = set(self.keys()) for line in f: try: @@ -1128,13 +1127,11 @@ except ValueError: raise FormatError('Invalid sequence specification: %s' % line.rstrip()) - finally: - f.close() return results def set_sequences(self, sequences): """Set sequences using the given name-to-key-list dictionary.""" - f = open(os.path.join(self._path, '.mh_sequences'), 'r+') + f = open(os.path.join(self._path, '.mh_sequences'), 'r+', encoding='ASCII') try: os.close(os.open(f.name, os.O_WRONLY | os.O_TRUNC)) for name, keys in sequences.items(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -311,6 +311,9 @@ Library ------- +- Issue #12454: The mailbox module is now using ASCII, instead of the locale + encoding, to read and write MH mailboxes (.mh_sequences files). + - Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 18 05:29:57 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 18 Oct 2011 05:29:57 +0200 Subject: [Python-checkins] Daily reference leaks (5ea81e4c58a7): sum=0 Message-ID: results for 5ea81e4c58a7 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogZqF6U4', '-x'] From python-checkins at python.org Tue Oct 18 12:02:22 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 12:02:22 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEyMjc3OiBhZGQg?= =?utf8?q?missing_comma=2E?= Message-ID: http://hg.python.org/cpython/rev/b41def1851b6 changeset: 72967:b41def1851b6 branch: 3.2 parent: 72962:fc7ee478ed3b user: Ezio Melotti date: Tue Oct 18 12:59:39 2011 +0300 summary: #12277: add missing comma. files: Doc/library/os.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1514,7 +1514,7 @@ ineffective, because in bottom-up mode the directories in *dirnames* are generated before *dirpath* itself is generated. - By default errors from the :func:`listdir` call are ignored. If optional + By default, errors from the :func:`listdir` call are ignored. If optional argument *onerror* is specified, it should be a function; it will be called with one argument, an :exc:`OSError` instance. It can report the error to continue with the walk, or raise the exception to abort the walk. Note that the filename -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 12:02:23 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 12:02:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2312277=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/7e57c95898d3 changeset: 72968:7e57c95898d3 parent: 72966:5ea81e4c58a7 parent: 72967:b41def1851b6 user: Ezio Melotti date: Tue Oct 18 13:00:36 2011 +0300 summary: #12277: merge with 3.2. files: Doc/library/os.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2168,7 +2168,7 @@ ineffective, because in bottom-up mode the directories in *dirnames* are generated before *dirpath* itself is generated. - By default errors from the :func:`listdir` call are ignored. If optional + By default, errors from the :func:`listdir` call are ignored. If optional argument *onerror* is specified, it should be a function; it will be called with one argument, an :exc:`OSError` instance. It can report the error to continue with the walk, or raise the exception to abort the walk. Note that the filename -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 12:02:23 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 12:02:23 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEyMjc3OiBhZGQg?= =?utf8?q?missing_comma=2E?= Message-ID: http://hg.python.org/cpython/rev/09a1bd44d96f changeset: 72969:09a1bd44d96f branch: 2.7 parent: 72961:80f07777accd user: Ezio Melotti date: Tue Oct 18 13:02:11 2011 +0300 summary: #12277: add missing comma. files: Doc/library/os.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1598,7 +1598,7 @@ ineffective, because in bottom-up mode the directories in *dirnames* are generated before *dirpath* itself is generated. - By default errors from the :func:`listdir` call are ignored. If optional + By default, errors from the :func:`listdir` call are ignored. If optional argument *onerror* is specified, it should be a function; it will be called with one argument, an :exc:`OSError` instance. It can report the error to continue with the walk, or raise the exception to abort the walk. Note that the filename -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 12:26:59 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 12:26:59 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEyNDQ4OiBzbXRw?= =?utf8?q?lib_now_flushes_stdout_while_running_=60=60python_-m_smtplib=60?= =?utf8?q?=60?= Message-ID: http://hg.python.org/cpython/rev/2c50343d0500 changeset: 72970:2c50343d0500 branch: 3.2 parent: 72967:b41def1851b6 user: Ezio Melotti date: Tue Oct 18 13:20:07 2011 +0300 summary: #12448: smtplib now flushes stdout while running ``python -m smtplib`` in order to display the prompt correctly. Patch by Petri Lehtinen. files: Lib/smtplib.py | 1 + Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/smtplib.py b/Lib/smtplib.py --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -912,6 +912,7 @@ def prompt(prompt): sys.stdout.write(prompt + ": ") + sys.stdout.flush() return sys.stdin.readline().strip() fromaddr = prompt("From") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -47,6 +47,9 @@ Library ------- +- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib`` + in order to display the prompt correctly. + - Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 12:27:00 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 12:27:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2312448=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/e08397a5537a changeset: 72971:e08397a5537a parent: 72968:7e57c95898d3 parent: 72970:2c50343d0500 user: Ezio Melotti date: Tue Oct 18 13:26:49 2011 +0300 summary: #12448: merge with 3.2. files: Lib/smtplib.py | 1 + Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/smtplib.py b/Lib/smtplib.py --- a/Lib/smtplib.py +++ b/Lib/smtplib.py @@ -940,6 +940,7 @@ def prompt(prompt): sys.stdout.write(prompt + ": ") + sys.stdout.flush() return sys.stdin.readline().strip() fromaddr = prompt("From") diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -311,6 +311,9 @@ Library ------- +- Issue #12448: smtplib now flushes stdout while running ``python -m smtplib`` + in order to display the prompt correctly. + - Issue #12454: The mailbox module is now using ASCII, instead of the locale encoding, to read and write MH mailboxes (.mh_sequences files). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 15:22:36 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 15:22:36 +0200 (CEST) Subject: [Python-checkins] r88912 - in tracker/instances/python-dev: extensions/pydevutils.py html/page.html Message-ID: <3SNHBh1lgYzPY0@mail.python.org> Author: ezio.melotti Date: Tue Oct 18 15:22:36 2011 New Revision: 88912 Log: Add a link to return a random open issue. Modified: tracker/instances/python-dev/extensions/pydevutils.py tracker/instances/python-dev/html/page.html Modified: tracker/instances/python-dev/extensions/pydevutils.py ============================================================================== --- tracker/instances/python-dev/extensions/pydevutils.py (original) +++ tracker/instances/python-dev/extensions/pydevutils.py Tue Oct 18 15:22:36 2011 @@ -1,3 +1,8 @@ +import random +from roundup.cgi.actions import Action +from roundup.cgi.exceptions import Redirect + + def is_history_ok(request): user = request.client.userid db = request.client.db @@ -35,8 +40,20 @@ return last_entry[4][1], last_action return None, None + +class RandomIssueAction(Action): + def handle(self): + """Redirect to a random open issue.""" + issue = self.context['context'] + # use issue._klass to get a list of ids, and not a list of instances + issue_ids = issue._klass.filter(None, {'status': 1}) + url = self.db.config.TRACKER_WEB + 'issue' + random.choice(issue_ids) + raise Redirect(url) + + def init(instance): instance.registerUtil('is_history_ok', is_history_ok) instance.registerUtil('is_coordinator', is_coordinator) instance.registerUtil('issueid_and_action_from_class', issueid_and_action_from_class) + instance.registerAction('random', RandomIssueAction) Modified: tracker/instances/python-dev/html/page.html ============================================================================== --- tracker/instances/python-dev/html/page.html (original) +++ tracker/instances/python-dev/html/page.html Tue Oct 18 15:22:36 2011 @@ -10,7 +10,7 @@ -

    -

    @@ -84,6 +84,7 @@ Create New
  • Search
  • +
  • Random Issue
  • @@ -276,7 +277,7 @@ Copyright © 1990-2011, Python Software Foundation
    From python-checkins at python.org Tue Oct 18 15:36:10 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 18 Oct 2011 15:36:10 +0200 (CEST) Subject: [Python-checkins] r88913 - in tracker/instances/python-dev/extensions: local_replace.py test/local_replace_data.txt test/test_local_replace.py Message-ID: <3SNHVL3TqgzPW2@mail.python.org> Author: ezio.melotti Date: Tue Oct 18 15:36:10 2011 New Revision: 88913 Log: #407: fix linkification of hg changesets. Modified: tracker/instances/python-dev/extensions/local_replace.py tracker/instances/python-dev/extensions/test/local_replace_data.txt tracker/instances/python-dev/extensions/test/test_local_replace.py Modified: tracker/instances/python-dev/extensions/local_replace.py ============================================================================== --- tracker/instances/python-dev/extensions/local_replace.py (original) +++ tracker/instances/python-dev/extensions/local_replace.py Tue Oct 18 15:36:10 2011 @@ -74,9 +74,9 @@ substitutions = [ # deadbeeffeed (hashes with exactly twelve or forty chars) - (re.compile(r'\b(?[a-fA-F0-9]{40})\b'), + (re.compile(r'\b(?[a-fA-F0-9]{40})\b'), r'\g'), - (re.compile(r'\b(?[a-fA-F0-9]{12})\b'), + (re.compile(r'\b(?[a-fA-F0-9]{12})\b'), r'\g'), # r12345, r 12345, rev12345, rev 12345, revision12345, revision 12345 Modified: tracker/instances/python-dev/extensions/test/local_replace_data.txt ============================================================================== --- tracker/instances/python-dev/extensions/test/local_replace_data.txt (original) +++ tracker/instances/python-dev/extensions/test/local_replace_data.txt Tue Oct 18 15:36:10 2011 @@ -21,6 +21,10 @@ I uploaded http://pypi.python.org/pypi/ctypesgen/0.r125 I uploaded http://pypi.python.org/pypi/ctypesgen/0.r125 ## +## hg revisions +http://code.google.com/p/spyderlib/source/detail?spec=svne5d86b685619a470d593aa5f9ee360ba60779bc1&r=323c6c697f045166e384cdc15803d40eebed0a2b +http://code.google.com/p/spyderlib/source/detail?spec=svne5d86b685619a470d593aa5f9ee360ba60779bc1&r=323c6c697f045166e384cdc15803d40eebed0a2b +## ## issues - the lowest issue id on bugs.python.org is #1000, the highest is #1779871 #1 #1 Modified: tracker/instances/python-dev/extensions/test/test_local_replace.py ============================================================================== --- tracker/instances/python-dev/extensions/test/test_local_replace.py (original) +++ tracker/instances/python-dev/extensions/test/test_local_replace.py Tue Oct 18 15:36:10 2011 @@ -47,6 +47,7 @@ class TestPyDevStringHTMLProperty(TemplatingTestCase): def test_replacement(self): + self.maxDiff = None # create a db with a few issue/msg/file ids self.client.db = self._db = PyDevMockDatabase( [1000, 5555, 555555, 1999999, 2000000, 1234567890123]) From python-checkins at python.org Tue Oct 18 16:47:01 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 18 Oct 2011 16:47:01 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTg4?= =?utf8?q?=3A_When_called_without_an_explicit_traceback_argument=2C?= Message-ID: http://hg.python.org/cpython/rev/dcf5cc88d5c9 changeset: 72972:dcf5cc88d5c9 branch: 3.2 parent: 72970:2c50343d0500 user: Antoine Pitrou date: Tue Oct 18 16:40:50 2011 +0200 summary: Issue #13188: When called without an explicit traceback argument, generator.throw() now gets the traceback from the passed exception's `__traceback__` attribute. Patch by Petri Lehtinen. files: Lib/test/test_generators.py | 26 +++++++++++++++++++++++++ Misc/NEWS | 4 +++ Objects/genobject.c | 5 ++++ 3 files changed, 35 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -1673,6 +1673,32 @@ ... ValueError: 7 +Plain "raise" inside a generator should preserve the traceback (#13188). +The traceback should have 3 levels: +- g.throw() +- f() +- 1/0 + +>>> def f(): +... try: +... yield +... except: +... raise +>>> g = f() +>>> try: +... 1/0 +... except ZeroDivisionError as v: +... try: +... g.throw(v) +... except Exception as w: +... tb = w.__traceback__ +>>> levels = 0 +>>> while tb: +... levels += 1 +... tb = tb.tb_next +>>> levels +3 + Now let's try closing a generator: >>> def f(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13188: When called without an explicit traceback argument, + generator.throw() now gets the traceback from the passed exception's + ``__traceback__`` attribute. Patch by Petri Lehtinen. + - Issue #7833: Extension modules built using distutils on Windows will no longer include a "manifest" to prevent them failing at import time in some embedded situations. diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -261,6 +261,11 @@ val = typ; typ = PyExceptionInstance_Class(typ); Py_INCREF(typ); + + if (tb == NULL) { + /* Returns NULL if there's no traceback */ + tb = PyException_GetTraceback(val); + } } } else { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 16:47:02 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 18 Oct 2011 16:47:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313188=3A_When_called_without_an_explicit_traceback_?= =?utf8?q?argument=2C?= Message-ID: http://hg.python.org/cpython/rev/f4e3db1194e4 changeset: 72973:f4e3db1194e4 parent: 72971:e08397a5537a parent: 72972:dcf5cc88d5c9 user: Antoine Pitrou date: Tue Oct 18 16:42:55 2011 +0200 summary: Issue #13188: When called without an explicit traceback argument, generator.throw() now gets the traceback from the passed exception's ``__traceback__`` attribute. Patch by Petri Lehtinen. files: Lib/test/test_generators.py | 26 +++++++++++++++++++++++++ Misc/NEWS | 4 +++ Objects/genobject.c | 5 ++++ 3 files changed, 35 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py --- a/Lib/test/test_generators.py +++ b/Lib/test/test_generators.py @@ -1673,6 +1673,32 @@ ... ValueError: 7 +Plain "raise" inside a generator should preserve the traceback (#13188). +The traceback should have 3 levels: +- g.throw() +- f() +- 1/0 + +>>> def f(): +... try: +... yield +... except: +... raise +>>> g = f() +>>> try: +... 1/0 +... except ZeroDivisionError as v: +... try: +... g.throw(v) +... except Exception as w: +... tb = w.__traceback__ +>>> levels = 0 +>>> while tb: +... levels += 1 +... tb = tb.tb_next +>>> levels +3 + Now let's try closing a generator: >>> def f(): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13188: When called without an explicit traceback argument, + generator.throw() now gets the traceback from the passed exception's + ``__traceback__`` attribute. Patch by Petri Lehtinen. + - Issue #13146: Writing a pyc file is now atomic under POSIX. - Issue #7833: Extension modules built using distutils on Windows will no diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -261,6 +261,11 @@ val = typ; typ = PyExceptionInstance_Class(typ); Py_INCREF(typ); + + if (tb == NULL) { + /* Returns NULL if there's no traceback */ + tb = PyException_GetTraceback(val); + } } } else { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 17:17:43 2011 From: python-checkins at python.org (lukasz.langa) Date: Tue, 18 Oct 2011 17:17:43 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogRml4ZXMgIzEwODYw?= =?utf8?q?=3A_Handle_empty_port_after_port_delimiter_in_httplib?= Message-ID: http://hg.python.org/cpython/rev/a3e48273dce3 changeset: 72974:a3e48273dce3 branch: 2.7 parent: 72969:09a1bd44d96f user: ?ukasz Langa date: Tue Oct 18 17:16:00 2011 +0200 summary: Fixes #10860: Handle empty port after port delimiter in httplib Thanks, Shawn Ligocki! 3.x version will come as a separate patch. files: Lib/httplib.py | 5 ++++- Lib/test/test_httplib.py | 25 ++++++++++++++++++++++++- Misc/NEWS | 3 +++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Lib/httplib.py b/Lib/httplib.py --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -715,7 +715,10 @@ try: port = int(host[i+1:]) except ValueError: - raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + if host[i+1:] == "": # http://foo.com:/ == http://foo.com/ + port = self.default_port + else: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) host = host[:i] else: port = self.default_port diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -152,13 +152,15 @@ def test_host_port(self): # Check invalid host_port - for hp in ("www.python.org:abc", "www.python.org:"): + # Note that httplib does not accept user:password@ in the host-port. + for hp in ("www.python.org:abc", "user:password at www.python.org"): self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp) for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b", 8000), ("www.python.org:80", "www.python.org", 80), ("www.python.org", "www.python.org", 80), + ("www.python.org:", "www.python.org", 80), ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)): http = httplib.HTTP(hp) c = http._conn @@ -439,6 +441,27 @@ h = httplib.HTTPSConnection(HOST, TimeoutTest.PORT, timeout=30) self.assertEqual(h.timeout, 30) + def test_host_port(self): + # Check invalid host_port + + # Note that httplib does not accept user:password@ in the host-port. + for hp in ("www.python.org:abc", "user:password at www.python.org"): + self.assertRaises(httplib.InvalidURL, httplib.HTTP, hp) + + for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b", + 8000), + ("pypi.python.org:443", "pypi.python.org", 443), + ("pypi.python.org", "pypi.python.org", 443), + ("pypi.python.org:", "pypi.python.org", 443), + ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 443)): + http = httplib.HTTPS(hp) + c = http._conn + if h != c.host: + self.fail("Host incorrectly parsed: %s != %s" % (h, c.host)) + if p != c.port: + self.fail("Port incorrectly parsed: %s != %s" % (p, c.host)) + + def test_main(verbose=None): test_support.run_unittest(HeaderTests, OfflineTest, BasicTest, TimeoutTest, HTTPSTimeoutTest, SourceAddressTest) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,9 @@ the following case: sys.stdin.read() stopped with CTRL+d (end of file), raw_input() interrupted by CTRL+c. +- Issue #10860: httplib now correctly handles an empty port after port + delimiter in URLs. + - dict_proxy objects now display their contents rather than just the class name. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 17:59:30 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 18 Oct 2011 17:59:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313150=3A_sysconfig?= =?utf8?q?_no_longer_parses_the_Makefile_and_config=2Eh_files?= Message-ID: http://hg.python.org/cpython/rev/70160b53117f changeset: 72975:70160b53117f parent: 72973:f4e3db1194e4 user: Antoine Pitrou date: Tue Oct 18 17:52:24 2011 +0200 summary: Issue #13150: sysconfig no longer parses the Makefile and config.h files when imported, instead doing it at build time. This makes importing sysconfig faster and reduces Python startup time by 20%. files: .hgignore | 1 + Lib/sysconfig.py | 19 ++++++++++++++++--- Makefile.pre.in | 11 +++++++---- Misc/NEWS | 4 ++++ 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -49,6 +49,7 @@ *.pyd *.cover *~ +Lib/_sysconfigdata.py Lib/lib2to3/*.pickle Lib/test/data/* Misc/*.wpu diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -319,9 +319,11 @@ config_dir_name = 'config' return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') - -def _init_posix(vars): - """Initialize the module as appropriate for POSIX systems.""" +def _generate_posix_vars(): + """Generate the Python module containing build-time variables.""" + import pprint + vars = {} + destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py') # load the installed Makefile: makefile = get_makefile_filename() try: @@ -346,7 +348,15 @@ # the scripts are in another directory. if _PYTHON_BUILD: vars['LDSHARED'] = vars['BLDSHARED'] + with open(destfile, 'w', encoding='utf8') as f: + f.write('build_time_vars = ') + pprint.pprint(vars, stream=f) +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # _sysconfigdata is generated at build time, see _generate_posix_vars() + from _sysconfigdata import build_time_vars + vars.update(build_time_vars) def _init_non_posix(vars): """Initialize the module as appropriate for NT""" @@ -753,6 +763,9 @@ def _main(): """Display all information sysconfig detains.""" + if '--generate-posix-vars' in sys.argv: + _generate_posix_vars() + return print('Platform: "%s"' % get_platform()) print('Python version: "%s"' % get_python_version()) print('Current installation scheme: "%s"' % _get_default_scheme()) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -396,7 +396,7 @@ # Default target all: build_all -build_all: $(BUILDPYTHON) oldsharedmods sharedmods gdbhooks Modules/_testembed +build_all: $(BUILDPYTHON) sysconfig oldsharedmods sharedmods gdbhooks Modules/_testembed # Compile a binary with gcc profile guided optimization. profile-opt: @@ -429,12 +429,15 @@ $(BUILDPYTHON): Modules/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Modules/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) -platform: $(BUILDPYTHON) +platform: $(BUILDPYTHON) sysconfig $(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from sysconfig import get_platform ; print(get_platform()+"-"+sys.version[0:3])' >platform +# Generate the sysconfig build-time data +sysconfig: $(BUILDPYTHON) + $(RUNSHARED) ./$(BUILDPYTHON) -SE -m sysconfig --generate-posix-vars # Build the shared modules -sharedmods: $(BUILDPYTHON) +sharedmods: $(BUILDPYTHON) sysconfig @case $$MAKEFLAGS in \ *s*) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py -q build;; \ *) $(RUNSHARED) CC='$(CC)' LDSHARED='$(BLDSHARED)' OPT='$(OPT)' ./$(BUILDPYTHON) -E $(srcdir)/setup.py build;; \ @@ -1379,7 +1382,7 @@ Python/thread.o: @THREADHEADERS@ # Declare targets that aren't real files -.PHONY: all build_all sharedmods oldsharedmods test quicktest +.PHONY: all build_all sysconfig sharedmods oldsharedmods test quicktest .PHONY: install altinstall oldsharedinstall bininstall altbininstall .PHONY: maninstall libinstall inclinstall libainstall sharedinstall .PHONY: frameworkinstall frameworkinstallframework frameworkinstallstructure diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -315,6 +315,10 @@ Library ------- +- Issue #13150: sysconfig no longer parses the Makefile and config.h files + when imported, instead doing it at build time. This makes importing + sysconfig faster and reduces Python startup time by 20%. + - Issue #12448: smtplib now flushes stdout while running ``python -m smtplib`` in order to display the prompt correctly. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 18:16:40 2011 From: python-checkins at python.org (eric.araujo) Date: Tue, 18 Oct 2011 18:16:40 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_default?= Message-ID: http://hg.python.org/distutils2/rev/34f377176773 changeset: 1213:34f377176773 branch: python3 parent: 1211:98e0d3c53a2f parent: 1212:5d858149df06 user: ?ric Araujo date: Tue Oct 18 18:16:00 2011 +0200 summary: Merge default files: distutils2/config.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/distutils2/config.py b/distutils2/config.py --- a/distutils2/config.py +++ b/distutils2/config.py @@ -233,8 +233,7 @@ raise ValueError('invalid line for package_data: %s ' '(misses "=")' % line) key, value = data - globs = self.dist.package_data.setdefault(key.strip(), []) - globs.extend([v.strip() for v in value.split(',')]) + self.dist.package_data[key.strip()] = value.strip() self.dist.data_files = [] for data in files.get('data_files', []): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Tue Oct 18 18:16:40 2011 From: python-checkins at python.org (eric.araujo) Date: Tue, 18 Oct 2011 18:16:40 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Synchronize_config_with_?= =?utf8?q?packaging_=28fixes_=2313170=29?= Message-ID: http://hg.python.org/distutils2/rev/5d858149df06 changeset: 1212:5d858149df06 parent: 1210:c4392e526e85 user: ?ric Araujo date: Tue Oct 18 18:05:20 2011 +0200 summary: Synchronize config with packaging (fixes #13170) files: distutils2/config.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/distutils2/config.py b/distutils2/config.py --- a/distutils2/config.py +++ b/distutils2/config.py @@ -237,8 +237,7 @@ raise ValueError('invalid line for package_data: %s ' '(misses "=")' % line) key, value = data - globs = self.dist.package_data.setdefault(key.strip(), []) - globs.extend([v.strip() for v in value.split(',')]) + self.dist.package_data[key.strip()] = value.strip() self.dist.data_files = [] for data in files.get('data_files', []): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Tue Oct 18 21:20:04 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 18 Oct 2011 21:20:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312281=3A_Rewrite_t?= =?utf8?q?he_MBCS_codec_to_handle_correctly_replace_and_ignore?= Message-ID: http://hg.python.org/cpython/rev/af0800b986b7 changeset: 72976:af0800b986b7 user: Victor Stinner date: Tue Oct 18 21:21:00 2011 +0200 summary: Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore error handlers on all Windows versions. The MBCS codec is now supporting all error handlers, instead of only replace to encode and ignore to decode. files: Doc/library/codecs.rst | 7 +- Doc/whatsnew/3.3.rst | 5 + Include/unicodeobject.h | 16 +- Lib/test/test_codecs.py | 198 +++++++ Misc/NEWS | 4 + Modules/_codecsmodule.c | 50 + Objects/unicodeobject.c | 782 ++++++++++++++++++++++----- Python/pythonrun.c | 5 +- 8 files changed, 904 insertions(+), 163 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1280,12 +1280,13 @@ .. module:: encodings.mbcs :synopsis: Windows ANSI codepage -Encode operand according to the ANSI codepage (CP_ACP). This codec only -supports ``'strict'`` and ``'replace'`` error handlers to encode, and -``'strict'`` and ``'ignore'`` error handlers to decode. +Encode operand according to the ANSI codepage (CP_ACP). Availability: Windows only. +.. versionchanged:: 3.3 + Support any error handler. + .. versionchanged:: 3.2 Before 3.2, the *errors* argument was ignored; ``'replace'`` was always used to encode, and ``'ignore'`` to decode. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -197,6 +197,11 @@ codecs ------ +The :mod:`~encodings.mbcs` codec has be rewritten to handle correclty +``replace`` and ``ignore`` error handlers on all Windows versions. The +:mod:`~encodings.mbcs` codec is now supporting all error handlers, instead of +only ``replace`` to encode and ``ignore`` to decode. + Multibyte CJK decoders now resynchronize faster. They only ignore the first byte of an invalid byte sequence. For example, ``b'\xff\n'.decode('gb2312', 'replace')`` now returns a ``\n`` after the replacement character. diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1466,6 +1466,14 @@ Py_ssize_t *consumed /* bytes consumed */ ); +PyAPI_FUNC(PyObject*) PyUnicode_DecodeCodePageStateful( + int code_page, /* code page number */ + const char *string, /* encoded string */ + Py_ssize_t length, /* size of string */ + const char *errors, /* error handling */ + Py_ssize_t *consumed /* bytes consumed */ + ); + PyAPI_FUNC(PyObject*) PyUnicode_AsMBCSString( PyObject *unicode /* Unicode object */ ); @@ -1473,11 +1481,17 @@ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject*) PyUnicode_EncodeMBCS( const Py_UNICODE *data, /* Unicode char buffer */ - Py_ssize_t length, /* Number of Py_UNICODE chars to encode */ + Py_ssize_t length, /* number of Py_UNICODE chars to encode */ const char *errors /* error handling */ ); #endif +PyAPI_FUNC(PyObject*) PyUnicode_EncodeCodePage( + int code_page, /* code page number */ + PyObject *unicode, /* Unicode object */ + const char *errors /* error handling */ + ); + #endif /* HAVE_MBCS */ /* --- Decimal Encoder ---------------------------------------------------- */ diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1744,6 +1744,203 @@ self.assertEqual(sout, b"\x80") +class CodePageTest(unittest.TestCase): + CP_UTF8 = 65001 + vista_or_later = (sys.getwindowsversion().major >= 6) + + def test_invalid_code_page(self): + self.assertRaises(ValueError, codecs.code_page_encode, -1, 'a') + self.assertRaises(ValueError, codecs.code_page_decode, -1, b'a') + self.assertRaises(WindowsError, codecs.code_page_encode, 123, 'a') + self.assertRaises(WindowsError, codecs.code_page_decode, 123, b'a') + + def test_code_page_name(self): + self.assertRaisesRegex(UnicodeEncodeError, 'cp932', + codecs.code_page_encode, 932, '\xff') + self.assertRaisesRegex(UnicodeDecodeError, 'cp932', + codecs.code_page_decode, 932, b'\x81\x00') + self.assertRaisesRegex(UnicodeDecodeError, 'CP_UTF8', + codecs.code_page_decode, self.CP_UTF8, b'\xff') + + def check_decode(self, cp, tests): + for raw, errors, expected in tests: + if expected is not None: + try: + decoded = codecs.code_page_decode(cp, raw, errors) + except UnicodeDecodeError as err: + self.fail('Unable to decode %a from "cp%s" with ' + 'errors=%r: %s' % (raw, cp, errors, err)) + self.assertEqual(decoded[0], expected, + '%a.decode("cp%s", %r)=%a != %a' + % (raw, cp, errors, decoded[0], expected)) + # assert 0 <= decoded[1] <= len(raw) + self.assertGreaterEqual(decoded[1], 0) + self.assertLessEqual(decoded[1], len(raw)) + else: + self.assertRaises(UnicodeDecodeError, + codecs.code_page_decode, cp, raw, errors) + + def check_encode(self, cp, tests): + for text, errors, expected in tests: + if expected is not None: + try: + encoded = codecs.code_page_encode(cp, text, errors) + except UnicodeEncodeError as err: + self.fail('Unable to encode %a to "cp%s" with ' + 'errors=%r: %s' % (text, cp, errors, err)) + self.assertEqual(encoded[0], expected, + '%a.encode("cp%s", %r)=%a != %a' + % (text, cp, errors, encoded[0], expected)) + self.assertEqual(encoded[1], len(text)) + else: + self.assertRaises(UnicodeEncodeError, + codecs.code_page_encode, cp, text, errors) + + def test_cp932(self): + self.check_encode(932, ( + ('abc', 'strict', b'abc'), + ('\uff44\u9a3e', 'strict', b'\x82\x84\xe9\x80'), + # not encodable + ('\xff', 'strict', None), + ('[\xff]', 'ignore', b'[]'), + ('[\xff]', 'replace', b'[y]'), + ('[\u20ac]', 'replace', b'[?]'), + )) + tests = [ + (b'abc', 'strict', 'abc'), + (b'\x82\x84\xe9\x80', 'strict', '\uff44\u9a3e'), + # invalid bytes + (b'\xff', 'strict', None), + (b'\xff', 'ignore', ''), + (b'\xff', 'replace', '\ufffd'), + (b'\x81\x00abc', 'strict', None), + (b'\x81\x00abc', 'ignore', '\x00abc'), + ] + if self.vista_or_later: + tests.append((b'\x81\x00abc', 'replace', '\ufffd\x00abc')) + else: + tests.append((b'\x81\x00abc', 'replace', '\x00\x00abc')) + self.check_decode(932, tests) + + def test_cp1252(self): + self.check_encode(1252, ( + ('abc', 'strict', b'abc'), + ('\xe9\u20ac', 'strict', b'\xe9\x80'), + ('\xff', 'strict', b'\xff'), + ('\u0141', 'strict', None), + ('\u0141', 'ignore', b''), + ('\u0141', 'replace', b'L'), + )) + self.check_decode(1252, ( + (b'abc', 'strict', 'abc'), + (b'\xe9\x80', 'strict', '\xe9\u20ac'), + (b'\xff', 'strict', '\xff'), + )) + + def test_cp_utf7(self): + cp = 65000 + self.check_encode(cp, ( + ('abc', 'strict', b'abc'), + ('\xe9\u20ac', 'strict', b'+AOkgrA-'), + ('\U0010ffff', 'strict', b'+2//f/w-'), + ('\udc80', 'strict', b'+3IA-'), + ('\ufffd', 'strict', b'+//0-'), + )) + self.check_decode(cp, ( + (b'abc', 'strict', 'abc'), + (b'+AOkgrA-', 'strict', '\xe9\u20ac'), + (b'+2//f/w-', 'strict', '\U0010ffff'), + (b'+3IA-', 'strict', '\udc80'), + (b'+//0-', 'strict', '\ufffd'), + # invalid bytes + (b'[+/]', 'strict', '[]'), + (b'[\xff]', 'strict', '[\xff]'), + )) + + def test_cp_utf8(self): + cp = self.CP_UTF8 + + tests = [ + ('abc', 'strict', b'abc'), + ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), + ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), + ] + if self.vista_or_later: + tests.append(('\udc80', 'strict', None)) + tests.append(('\udc80', 'ignore', b'')) + tests.append(('\udc80', 'replace', b'?')) + else: + tests.append(('\udc80', 'strict', b'\xed\xb2\x80')) + self.check_encode(cp, tests) + + tests = [ + (b'abc', 'strict', 'abc'), + (b'\xc3\xa9\xe2\x82\xac', 'strict', '\xe9\u20ac'), + (b'\xf4\x8f\xbf\xbf', 'strict', '\U0010ffff'), + (b'\xef\xbf\xbd', 'strict', '\ufffd'), + (b'[\xc3\xa9]', 'strict', '[\xe9]'), + # invalid bytes + (b'[\xff]', 'strict', None), + (b'[\xff]', 'ignore', '[]'), + (b'[\xff]', 'replace', '[\ufffd]'), + ] + if self.vista_or_later: + tests.extend(( + (b'[\xed\xb2\x80]', 'strict', None), + (b'[\xed\xb2\x80]', 'ignore', '[]'), + (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), + )) + else: + tests.extend(( + (b'[\xed\xb2\x80]', 'strict', '[\udc80]'), + )) + self.check_decode(cp, tests) + + def test_error_handlers(self): + self.check_encode(932, ( + ('\xff', 'backslashreplace', b'\\xff'), + ('\xff', 'xmlcharrefreplace', b'ÿ'), + )) + self.check_decode(932, ( + (b'\xff', 'surrogateescape', '\udcff'), + )) + if self.vista_or_later: + self.check_encode(self.CP_UTF8, ( + ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), + )) + + def test_multibyte_encoding(self): + self.check_decode(932, ( + (b'\x84\xe9\x80', 'ignore', '\u9a3e'), + (b'\x84\xe9\x80', 'replace', '\ufffd\u9a3e'), + )) + self.check_decode(self.CP_UTF8, ( + (b'\xff\xf4\x8f\xbf\xbf', 'ignore', '\U0010ffff'), + (b'\xff\xf4\x8f\xbf\xbf', 'replace', '\ufffd\U0010ffff'), + )) + if self.vista_or_later: + self.check_encode(self.CP_UTF8, ( + ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'), + ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), + )) + + def test_incremental(self): + decoded = codecs.code_page_decode(932, + b'\xe9\x80\xe9', 'strict', + False) + self.assertEqual(decoded, ('\u9a3e', 2)) + + decoded = codecs.code_page_decode(932, + b'\xe9\x80\xe9\x80', 'strict', + False) + self.assertEqual(decoded, ('\u9a3e\u9a3e', 4)) + + decoded = codecs.code_page_decode(932, + b'abc', 'strict', + False) + self.assertEqual(decoded, ('abc', 3)) + + def test_main(): support.run_unittest( UTF32Test, @@ -1772,6 +1969,7 @@ SurrogateEscapeTest, BomTest, TransformCodecTest, + CodePageTest, ) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore + error handlers on all Windows versions. The MBCS codec is now supporting all + error handlers, instead of only replace to encode and ignore to decode. + - Issue #13188: When called without an explicit traceback argument, generator.throw() now gets the traceback from the passed exception's ``__traceback__`` attribute. Patch by Petri Lehtinen. diff --git a/Modules/_codecsmodule.c b/Modules/_codecsmodule.c --- a/Modules/_codecsmodule.c +++ b/Modules/_codecsmodule.c @@ -612,6 +612,31 @@ return codec_tuple(decoded, consumed); } +static PyObject * +code_page_decode(PyObject *self, + PyObject *args) +{ + Py_buffer pbuf; + const char *errors = NULL; + int final = 0; + Py_ssize_t consumed; + PyObject *decoded = NULL; + int code_page; + + if (!PyArg_ParseTuple(args, "iy*|zi:code_page_decode", + &code_page, &pbuf, &errors, &final)) + return NULL; + consumed = pbuf.len; + + decoded = PyUnicode_DecodeCodePageStateful(code_page, + pbuf.buf, pbuf.len, errors, + final ? NULL : &consumed); + PyBuffer_Release(&pbuf); + if (decoded == NULL) + return NULL; + return codec_tuple(decoded, consumed); +} + #endif /* HAVE_MBCS */ /* --- Encoder ------------------------------------------------------------ */ @@ -1011,6 +1036,29 @@ return v; } +static PyObject * +code_page_encode(PyObject *self, + PyObject *args) +{ + PyObject *str, *v; + const char *errors = NULL; + int code_page; + + if (!PyArg_ParseTuple(args, "iO|z:code_page_encode", + &code_page, &str, &errors)) + return NULL; + + str = PyUnicode_FromObject(str); + if (str == NULL) + return NULL; + v = codec_tuple(PyUnicode_EncodeCodePage(code_page, + str, + errors), + PyUnicode_GET_LENGTH(str)); + Py_DECREF(str); + return v; +} + #endif /* HAVE_MBCS */ /* --- Error handler registry --------------------------------------------- */ @@ -1101,6 +1149,8 @@ #ifdef HAVE_MBCS {"mbcs_encode", mbcs_encode, METH_VARARGS}, {"mbcs_decode", mbcs_decode, METH_VARARGS}, + {"code_page_encode", code_page_encode, METH_VARARGS}, + {"code_page_decode", code_page_decode, METH_VARARGS}, #endif {"register_error", register_error, METH_VARARGS, register_error__doc__}, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -429,6 +429,10 @@ } #endif +#ifdef HAVE_MBCS +static OSVERSIONINFOEX winver; +#endif + /* --- Bloom Filters ----------------------------------------------------- */ /* stuff to implement simple "bloom filters" for Unicode characters. @@ -6896,130 +6900,307 @@ #define NEED_RETRY #endif -/* XXX This code is limited to "true" double-byte encodings, as - a) it assumes an incomplete character consists of a single byte, and - b) IsDBCSLeadByte (probably) does not work for non-DBCS multi-byte - encodings, see IsDBCSLeadByteEx documentation. */ +#ifndef WC_ERR_INVALID_CHARS +# define WC_ERR_INVALID_CHARS 0x0080 +#endif + +static char* +code_page_name(UINT code_page, PyObject **obj) +{ + *obj = NULL; + if (code_page == CP_ACP) + return "mbcs"; + if (code_page == CP_UTF7) + return "CP_UTF7"; + if (code_page == CP_UTF8) + return "CP_UTF8"; + + *obj = PyBytes_FromFormat("cp%u", code_page); + if (*obj == NULL) + return NULL; + return PyBytes_AS_STRING(*obj); +} static int -is_dbcs_lead_byte(const char *s, int offset) +is_dbcs_lead_byte(UINT code_page, const char *s, int offset) { const char *curr = s + offset; - - if (IsDBCSLeadByte(*curr)) { - const char *prev = CharPrev(s, curr); - return (prev == curr) || !IsDBCSLeadByte(*prev) || (curr - prev == 2); - } + const char *prev; + + if (!IsDBCSLeadByteEx(code_page, *curr)) + return 0; + + prev = CharPrevExA(code_page, s, curr, 0); + if (prev == curr) + return 1; + /* FIXME: This code is limited to "true" double-byte encodings, + as it assumes an incomplete character consists of a single + byte. */ + if (curr - prev == 2) + return 1; + if (!IsDBCSLeadByteEx(code_page, *prev)) + return 1; return 0; } +static DWORD +decode_code_page_flags(UINT code_page) +{ + if (code_page == CP_UTF7) { + /* The CP_UTF7 decoder only supports flags=0 */ + return 0; + } + else + return MB_ERR_INVALID_CHARS; +} + /* - * Decode MBCS string into unicode object. If 'final' is set, converts - * trailing lead-byte too. Returns consumed size if succeed, -1 otherwise. + * Decode a byte string from a Windows code page into unicode object in strict + * mode. + * + * Returns consumed size if succeed, returns -2 on decode error, or raise a + * WindowsError and returns -1 on other error. */ static int -decode_mbcs(PyUnicodeObject **v, - const char *s, /* MBCS string */ - int size, /* sizeof MBCS string */ - int final, - const char *errors) -{ - Py_UNICODE *p; - Py_ssize_t n; - DWORD usize; - DWORD flags; - - assert(size >= 0); - - /* check and handle 'errors' arg */ - if (errors==NULL || strcmp(errors, "strict")==0) - flags = MB_ERR_INVALID_CHARS; - else if (strcmp(errors, "ignore")==0) - flags = 0; - else { - PyErr_Format(PyExc_ValueError, - "mbcs encoding does not support errors='%s'", - errors); - return -1; - } - - /* Skip trailing lead-byte unless 'final' is set */ - if (!final && size >= 1 && is_dbcs_lead_byte(s, size - 1)) - --size; +decode_code_page_strict(UINT code_page, + PyUnicodeObject **v, + const char *in, + int insize) +{ + const DWORD flags = decode_code_page_flags(code_page); + Py_UNICODE *out; + DWORD outsize; /* First get the size of the result */ - if (size > 0) { - usize = MultiByteToWideChar(CP_ACP, flags, s, size, NULL, 0); - if (usize==0) - goto mbcs_decode_error; - } else - usize = 0; + assert(insize > 0); + outsize = MultiByteToWideChar(code_page, flags, in, insize, NULL, 0); + if (outsize <= 0) + goto error; if (*v == NULL) { /* Create unicode object */ - *v = _PyUnicode_New(usize); + *v = _PyUnicode_New(outsize); if (*v == NULL) return -1; - n = 0; + out = PyUnicode_AS_UNICODE(*v); } else { /* Extend unicode object */ - n = PyUnicode_GET_SIZE(*v); - if (PyUnicode_Resize((PyObject**)v, n + usize) < 0) + Py_ssize_t n = PyUnicode_GET_SIZE(*v); + if (PyUnicode_Resize((PyObject**)v, n + outsize) < 0) return -1; + out = PyUnicode_AS_UNICODE(*v) + n; } /* Do the conversion */ - if (usize > 0) { - p = PyUnicode_AS_UNICODE(*v) + n; - if (0 == MultiByteToWideChar(CP_ACP, flags, s, size, p, usize)) { - goto mbcs_decode_error; - } - } - return size; - -mbcs_decode_error: - /* If the last error was ERROR_NO_UNICODE_TRANSLATION, then - we raise a UnicodeDecodeError - else it is a 'generic' - windows error - */ - if (GetLastError()==ERROR_NO_UNICODE_TRANSLATION) { - /* Ideally, we should get reason from FormatMessage - this - is the Windows 2000 English version of the message - */ - PyObject *exc = NULL; - const char *reason = "No mapping for the Unicode character exists " - "in the target multi-byte code page."; - make_decode_exception(&exc, "mbcs", s, size, 0, 0, reason); + outsize = MultiByteToWideChar(code_page, flags, in, insize, out, outsize); + if (outsize <= 0) + goto error; + return insize; + +error: + if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) + return -2; + PyErr_SetFromWindowsErr(0); + return -1; +} + +/* + * Decode a byte string from a code page into unicode object with an error + * handler. + * + * Returns consumed size if succeed, or raise a WindowsError or + * UnicodeDecodeError exception and returns -1 on error. + */ +static int +decode_code_page_errors(UINT code_page, + PyUnicodeObject **v, + const char *in, + int size, + const char *errors) +{ + const char *startin = in; + const char *endin = in + size; + const DWORD flags = decode_code_page_flags(code_page); + /* Ideally, we should get reason from FormatMessage. This is the Windows + 2000 English version of the message. */ + const char *reason = "No mapping for the Unicode character exists " + "in the target code page."; + /* each step cannot decode more than 1 character, but a character can be + represented as a surrogate pair */ + wchar_t buffer[2], *startout, *out; + int insize, outsize; + PyObject *errorHandler = NULL; + PyObject *exc = NULL; + PyObject *encoding_obj = NULL; + char *encoding; + DWORD err; + int ret = -1; + + assert(size > 0); + + encoding = code_page_name(code_page, &encoding_obj); + if (encoding == NULL) + return -1; + + if (errors == NULL || strcmp(errors, "strict") == 0) { + /* The last error was ERROR_NO_UNICODE_TRANSLATION, then we raise a + UnicodeDecodeError. */ + make_decode_exception(&exc, encoding, in, size, 0, 0, reason); if (exc != NULL) { PyCodec_StrictErrors(exc); - Py_DECREF(exc); - } - } else { - PyErr_SetFromWindowsErrWithFilename(0, NULL); - } - return -1; -} - -PyObject * -PyUnicode_DecodeMBCSStateful(const char *s, - Py_ssize_t size, - const char *errors, - Py_ssize_t *consumed) + Py_CLEAR(exc); + } + goto error; + } + + if (*v == NULL) { + /* Create unicode object */ + if (size > PY_SSIZE_T_MAX / (Py_ssize_t)Py_ARRAY_LENGTH(buffer)) { + PyErr_NoMemory(); + goto error; + } + *v = _PyUnicode_New(size * Py_ARRAY_LENGTH(buffer)); + if (*v == NULL) + goto error; + startout = PyUnicode_AS_UNICODE(*v); + } + else { + /* Extend unicode object */ + Py_ssize_t n = PyUnicode_GET_SIZE(*v); + if (size > (PY_SSIZE_T_MAX - n) / (Py_ssize_t)Py_ARRAY_LENGTH(buffer)) { + PyErr_NoMemory(); + goto error; + } + if (PyUnicode_Resize((PyObject**)v, n + size * Py_ARRAY_LENGTH(buffer)) < 0) + goto error; + startout = PyUnicode_AS_UNICODE(*v) + n; + } + + /* Decode the byte string character per character */ + out = startout; + while (in < endin) + { + /* Decode a character */ + insize = 1; + do + { + outsize = MultiByteToWideChar(code_page, flags, + in, insize, + buffer, Py_ARRAY_LENGTH(buffer)); + if (outsize > 0) + break; + err = GetLastError(); + if (err != ERROR_NO_UNICODE_TRANSLATION + && err != ERROR_INSUFFICIENT_BUFFER) + { + PyErr_SetFromWindowsErr(0); + goto error; + } + insize++; + } + /* 4=maximum length of a UTF-8 sequence */ + while (insize <= 4 && (in + insize) <= endin); + + if (outsize <= 0) { + Py_ssize_t startinpos, endinpos, outpos; + + startinpos = in - startin; + endinpos = startinpos + 1; + outpos = out - PyUnicode_AS_UNICODE(*v); + if (unicode_decode_call_errorhandler( + errors, &errorHandler, + encoding, reason, + &startin, &endin, &startinpos, &endinpos, &exc, &in, + v, &outpos, &out)) + { + goto error; + } + } + else { + in += insize; + memcpy(out, buffer, outsize * sizeof(wchar_t)); + out += outsize; + } + } + + /* write a NUL character at the end */ + *out = 0; + + /* Extend unicode object */ + outsize = out - startout; + assert(outsize <= PyUnicode_WSTR_LENGTH(*v)); + if (PyUnicode_Resize((PyObject**)v, outsize) < 0) + goto error; + ret = 0; + +error: + Py_XDECREF(encoding_obj); + Py_XDECREF(errorHandler); + Py_XDECREF(exc); + return ret; +} + +/* + * Decode a byte string from a Windows code page into unicode object. If + * 'final' is set, converts trailing lead-byte too. + * + * Returns consumed size if succeed, or raise a WindowsError or + * UnicodeDecodeError exception and returns -1 on error. + */ +static int +decode_code_page(UINT code_page, + PyUnicodeObject **v, + const char *s, int size, + int final, const char *errors) +{ + int done; + + /* Skip trailing lead-byte unless 'final' is set */ + if (size == 0) { + if (*v == NULL) { + Py_INCREF(unicode_empty); + *v = (PyUnicodeObject*)unicode_empty; + if (*v == NULL) + return -1; + } + return 0; + } + + if (!final && is_dbcs_lead_byte(code_page, s, size - 1)) + --size; + + done = decode_code_page_strict(code_page, v, s, size); + if (done == -2) + done = decode_code_page_errors(code_page, v, s, size, errors); + return done; +} + +static PyObject * +decode_code_page_stateful(int code_page, + const char *s, + Py_ssize_t size, + const char *errors, + Py_ssize_t *consumed) { PyUnicodeObject *v = NULL; int done; + if (code_page < 0) { + PyErr_SetString(PyExc_ValueError, "invalid code page number"); + return NULL; + } + if (consumed) *consumed = 0; #ifdef NEED_RETRY retry: if (size > INT_MAX) - done = decode_mbcs(&v, s, INT_MAX, 0, errors); + done = decode_code_page(code_page, &v, s, INT_MAX, 0, errors); else #endif - done = decode_mbcs(&v, s, (int)size, !consumed, errors); + done = decode_code_page(code_page, &v, s, (int)size, !consumed, errors); if (done < 0) { Py_XDECREF(v); @@ -7036,6 +7217,7 @@ goto retry; } #endif + #ifndef DONT_MAKE_RESULT_READY if (_PyUnicode_READY_REPLACE(&v)) { Py_DECREF(v); @@ -7047,6 +7229,25 @@ } PyObject * +PyUnicode_DecodeCodePageStateful(int code_page, + const char *s, + Py_ssize_t size, + const char *errors, + Py_ssize_t *consumed) +{ + return decode_code_page_stateful(code_page, s, size, errors, consumed); +} + +PyObject * +PyUnicode_DecodeMBCSStateful(const char *s, + Py_ssize_t size, + const char *errors, + Py_ssize_t *consumed) +{ + return decode_code_page_stateful(CP_ACP, s, size, errors, consumed); +} + +PyObject * PyUnicode_DecodeMBCS(const char *s, Py_ssize_t size, const char *errors) @@ -7054,105 +7255,342 @@ return PyUnicode_DecodeMBCSStateful(s, size, errors, NULL); } +static DWORD +encode_code_page_flags(UINT code_page, const char *errors) +{ + if (code_page == CP_UTF8) { + if (winver.dwMajorVersion >= 6) + /* CP_UTF8 supports WC_ERR_INVALID_CHARS on Windows Vista + and later */ + return WC_ERR_INVALID_CHARS; + else + /* CP_UTF8 only supports flags=0 on Windows older than Vista */ + return 0; + } + else if (code_page == CP_UTF7) { + /* CP_UTF7 only supports flags=0 */ + return 0; + } + else { + if (errors != NULL && strcmp(errors, "replace") == 0) + return 0; + else + return WC_NO_BEST_FIT_CHARS; + } +} + /* - * Convert unicode into string object (MBCS). - * Returns 0 if succeed, -1 otherwise. + * Encode a Unicode string to a Windows code page into a byte string in strict + * mode. + * + * Returns consumed characters if succeed, returns -2 on encode error, or raise + * a WindowsError and returns -1 on other error. */ static int -encode_mbcs(PyObject **repr, - const Py_UNICODE *p, /* unicode */ - int size, /* size of unicode */ - const char* errors) +encode_code_page_strict(UINT code_page, PyObject **outbytes, + const Py_UNICODE *p, const int size, + const char* errors) { BOOL usedDefaultChar = FALSE; - BOOL *pusedDefaultChar; - int mbcssize; - Py_ssize_t n; + BOOL *pusedDefaultChar = &usedDefaultChar; + int outsize; PyObject *exc = NULL; - DWORD flags; - - assert(size >= 0); - - /* check and handle 'errors' arg */ - if (errors==NULL || strcmp(errors, "strict")==0) { - flags = WC_NO_BEST_FIT_CHARS; + const DWORD flags = encode_code_page_flags(code_page, NULL); + char *out; + + assert(size > 0); + + if (code_page != CP_UTF8 && code_page != CP_UTF7) pusedDefaultChar = &usedDefaultChar; - } else if (strcmp(errors, "replace")==0) { - flags = 0; + else pusedDefaultChar = NULL; - } else { - PyErr_Format(PyExc_ValueError, - "mbcs encoding does not support errors='%s'", - errors); - return -1; - } /* First get the size of the result */ - if (size > 0) { - mbcssize = WideCharToMultiByte(CP_ACP, flags, p, size, NULL, 0, - NULL, pusedDefaultChar); - if (mbcssize == 0) { - PyErr_SetFromWindowsErrWithFilename(0, NULL); + outsize = WideCharToMultiByte(code_page, flags, + p, size, + NULL, 0, + NULL, pusedDefaultChar); + if (outsize <= 0) + goto error; + /* If we used a default char, then we failed! */ + if (pusedDefaultChar && *pusedDefaultChar) + return -2; + + if (*outbytes == NULL) { + /* Create string object */ + *outbytes = PyBytes_FromStringAndSize(NULL, outsize); + if (*outbytes == NULL) return -1; - } - /* If we used a default char, then we failed! */ - if (pusedDefaultChar && *pusedDefaultChar) - goto mbcs_encode_error; - } else { - mbcssize = 0; - } - - if (*repr == NULL) { - /* Create string object */ - *repr = PyBytes_FromStringAndSize(NULL, mbcssize); - if (*repr == NULL) - return -1; - n = 0; + out = PyBytes_AS_STRING(*outbytes); } else { /* Extend string object */ - n = PyBytes_Size(*repr); - if (_PyBytes_Resize(repr, n + mbcssize) < 0) + const Py_ssize_t n = PyBytes_Size(*outbytes); + if (outsize > PY_SSIZE_T_MAX - n) { + PyErr_NoMemory(); return -1; + } + if (_PyBytes_Resize(outbytes, n + outsize) < 0) + return -1; + out = PyBytes_AS_STRING(*outbytes) + n; } /* Do the conversion */ - if (size > 0) { - char *s = PyBytes_AS_STRING(*repr) + n; - if (0 == WideCharToMultiByte(CP_ACP, flags, p, size, s, mbcssize, - NULL, pusedDefaultChar)) { - PyErr_SetFromWindowsErrWithFilename(0, NULL); - return -1; - } - if (pusedDefaultChar && *pusedDefaultChar) - goto mbcs_encode_error; - } + outsize = WideCharToMultiByte(code_page, flags, + p, size, + out, outsize, + NULL, pusedDefaultChar); + if (outsize <= 0) + goto error; + if (pusedDefaultChar && *pusedDefaultChar) + return -2; return 0; -mbcs_encode_error: - raise_encode_exception(&exc, "mbcs", p, size, 0, 0, "invalid character"); +error: + if (GetLastError() == ERROR_NO_UNICODE_TRANSLATION) + return -2; + PyErr_SetFromWindowsErr(0); + return -1; +} + +/* + * Encode a Unicode string to a Windows code page into a byte string using a + * error handler. + * + * Returns consumed characters if succeed, or raise a WindowsError and returns + * -1 on other error. + */ +static int +encode_code_page_errors(UINT code_page, PyObject **outbytes, + const Py_UNICODE *in, const int insize, + const char* errors) +{ + const DWORD flags = encode_code_page_flags(code_page, errors); + const Py_UNICODE *startin = in; + const Py_UNICODE *endin = in + insize; + /* Ideally, we should get reason from FormatMessage. This is the Windows + 2000 English version of the message. */ + const char *reason = "invalid character"; + /* 4=maximum length of a UTF-8 sequence */ + char buffer[4]; + BOOL usedDefaultChar = FALSE, *pusedDefaultChar; + Py_ssize_t outsize; + char *out; + int charsize; + PyObject *errorHandler = NULL; + PyObject *exc = NULL; + PyObject *encoding_obj = NULL; + char *encoding; + int err; + Py_ssize_t startpos, newpos, newoutsize; + PyObject *rep; + int ret = -1; + + assert(insize > 0); + + encoding = code_page_name(code_page, &encoding_obj); + if (encoding == NULL) + return -1; + + if (errors == NULL || strcmp(errors, "strict") == 0) { + /* The last error was ERROR_NO_UNICODE_TRANSLATION, + then we raise a UnicodeEncodeError. */ + make_encode_exception(&exc, encoding, in, insize, 0, 0, reason); + if (exc != NULL) { + PyCodec_StrictErrors(exc); + Py_DECREF(exc); + } + Py_XDECREF(encoding_obj); + return -1; + } + + if (code_page != CP_UTF8 && code_page != CP_UTF7) + pusedDefaultChar = &usedDefaultChar; + else + pusedDefaultChar = NULL; + + if (Py_ARRAY_LENGTH(buffer) > PY_SSIZE_T_MAX / insize) { + PyErr_NoMemory(); + goto error; + } + outsize = insize * Py_ARRAY_LENGTH(buffer); + + if (*outbytes == NULL) { + /* Create string object */ + *outbytes = PyBytes_FromStringAndSize(NULL, outsize); + if (*outbytes == NULL) + goto error; + out = PyBytes_AS_STRING(*outbytes); + } + else { + /* Extend string object */ + Py_ssize_t n = PyBytes_Size(*outbytes); + if (n > PY_SSIZE_T_MAX - outsize) { + PyErr_NoMemory(); + goto error; + } + if (_PyBytes_Resize(outbytes, n + outsize) < 0) + goto error; + out = PyBytes_AS_STRING(*outbytes) + n; + } + + /* Encode the string character per character */ + while (in < endin) + { + if ((in + 2) <= endin + && 0xD800 <= in[0] && in[0] <= 0xDBFF + && 0xDC00 <= in[1] && in[1] <= 0xDFFF) + charsize = 2; + else + charsize = 1; + + outsize = WideCharToMultiByte(code_page, flags, + in, charsize, + buffer, Py_ARRAY_LENGTH(buffer), + NULL, pusedDefaultChar); + if (outsize > 0) { + if (pusedDefaultChar == NULL || !(*pusedDefaultChar)) + { + in += charsize; + memcpy(out, buffer, outsize); + out += outsize; + continue; + } + } + else if (GetLastError() != ERROR_NO_UNICODE_TRANSLATION) { + PyErr_SetFromWindowsErr(0); + goto error; + } + + charsize = Py_MAX(charsize - 1, 1); + startpos = in - startin; + rep = unicode_encode_call_errorhandler( + errors, &errorHandler, encoding, reason, + startin, insize, &exc, + startpos, startpos + charsize, &newpos); + if (rep == NULL) + goto error; + in = startin + newpos; + + if (PyBytes_Check(rep)) { + outsize = PyBytes_GET_SIZE(rep); + if (outsize != 1) { + Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); + newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + if (_PyBytes_Resize(outbytes, newoutsize) < 0) { + Py_DECREF(rep); + goto error; + } + out = PyBytes_AS_STRING(*outbytes) + offset; + } + memcpy(out, PyBytes_AS_STRING(rep), outsize); + out += outsize; + } + else { + Py_ssize_t i; + enum PyUnicode_Kind kind; + void *data; + + if (PyUnicode_READY(rep) < 0) { + Py_DECREF(rep); + goto error; + } + + outsize = PyUnicode_GET_LENGTH(rep); + if (outsize != 1) { + Py_ssize_t offset = out - PyBytes_AS_STRING(*outbytes); + newoutsize = PyBytes_GET_SIZE(*outbytes) + (outsize - 1); + if (_PyBytes_Resize(outbytes, newoutsize) < 0) { + Py_DECREF(rep); + goto error; + } + out = PyBytes_AS_STRING(*outbytes) + offset; + } + kind = PyUnicode_KIND(rep); + data = PyUnicode_DATA(rep); + for (i=0; i < outsize; i++) { + Py_UCS4 ch = PyUnicode_READ(kind, data, i); + if (ch > 127) { + raise_encode_exception(&exc, + encoding, + startin, insize, + startpos, startpos + charsize, + "unable to encode error handler result to ASCII"); + Py_DECREF(rep); + goto error; + } + *out = (unsigned char)ch; + out++; + } + } + Py_DECREF(rep); + } + /* write a NUL byte */ + *out = 0; + outsize = out - PyBytes_AS_STRING(*outbytes); + assert(outsize <= PyBytes_GET_SIZE(*outbytes)); + if (_PyBytes_Resize(outbytes, outsize) < 0) + goto error; + ret = 0; + +error: + Py_XDECREF(encoding_obj); + Py_XDECREF(errorHandler); Py_XDECREF(exc); - return -1; -} - -PyObject * -PyUnicode_EncodeMBCS(const Py_UNICODE *p, - Py_ssize_t size, - const char *errors) -{ - PyObject *repr = NULL; + return ret; +} + +/* + * Encode a Unicode string to a Windows code page into a byte string. + * + * Returns consumed characters if succeed, or raise a WindowsError and returns + * -1 on other error. + */ +static int +encode_code_page_chunk(UINT code_page, PyObject **outbytes, + const Py_UNICODE *p, int size, + const char* errors) +{ + int done; + + if (size == 0) { + if (*outbytes == NULL) { + *outbytes = PyBytes_FromStringAndSize(NULL, 0); + if (*outbytes == NULL) + return -1; + } + return 0; + } + + done = encode_code_page_strict(code_page, outbytes, p, size, errors); + if (done == -2) + done = encode_code_page_errors(code_page, outbytes, p, size, errors); + return done; +} + +static PyObject * +encode_code_page(int code_page, + const Py_UNICODE *p, Py_ssize_t size, + const char *errors) +{ + PyObject *outbytes = NULL; int ret; + if (code_page < 0) { + PyErr_SetString(PyExc_ValueError, "invalid code page number"); + return NULL; + } + #ifdef NEED_RETRY retry: if (size > INT_MAX) - ret = encode_mbcs(&repr, p, INT_MAX, errors); + ret = encode_code_page_chunk(code_page, &outbytes, p, INT_MAX, errors); else #endif - ret = encode_mbcs(&repr, p, (int)size, errors); + ret = encode_code_page_chunk(code_page, &outbytes, p, (int)size, errors); if (ret < 0) { - Py_XDECREF(repr); + Py_XDECREF(outbytes); return NULL; } @@ -7164,7 +7602,28 @@ } #endif - return repr; + return outbytes; +} + +PyObject * +PyUnicode_EncodeMBCS(const Py_UNICODE *p, + Py_ssize_t size, + const char *errors) +{ + return encode_code_page(CP_ACP, p, size, errors); +} + +PyObject * +PyUnicode_EncodeCodePage(int code_page, + PyObject *unicode, + const char *errors) +{ + const Py_UNICODE *p; + Py_ssize_t size; + p = PyUnicode_AsUnicodeAndSize(unicode, &size); + if (p == NULL) + return NULL; + return encode_code_page(code_page, p, size, errors); } PyObject * @@ -13434,7 +13893,7 @@ /* Initialize the Unicode implementation */ -void _PyUnicode_Init(void) +int _PyUnicode_Init(void) { int i; @@ -13467,6 +13926,15 @@ Py_ARRAY_LENGTH(linebreak)); PyType_Ready(&EncodingMapType); + +#ifdef HAVE_MBCS + winver.dwOSVersionInfoSize = sizeof(winver); + if (!GetVersionEx((OSVERSIONINFO*)&winver)) { + PyErr_SetFromWindowsErr(0); + return -1; + } +#endif + return 0; } /* Finalize the Unicode implementation */ diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,7 +67,7 @@ static void call_py_exitfuncs(void); static void wait_for_thread_shutdown(void); static void call_ll_exitfuncs(void); -extern void _PyUnicode_Init(void); +extern int _PyUnicode_Init(void); extern void _PyUnicode_Fini(void); extern int _PyLong_Init(void); extern void PyLong_Fini(void); @@ -261,7 +261,8 @@ Py_FatalError("Py_Initialize: can't make modules_reloading dictionary"); /* Init Unicode implementation; relies on the codec registry */ - _PyUnicode_Init(); + if (_PyUnicode_Init() < 0) + Py_FatalError("Py_Initialize: can't initialize unicode"); bimod = _PyBuiltin_Init(); if (bimod == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 21:45:53 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 18 Oct 2011 21:45:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312281=3A_Skip_code?= =?utf8?q?_page_tests_on_non-Windows_platforms?= Message-ID: http://hg.python.org/cpython/rev/5841920d1ef6 changeset: 72977:5841920d1ef6 user: Victor Stinner date: Tue Oct 18 21:46:37 2011 +0200 summary: Issue #12281: Skip code page tests on non-Windows platforms files: Lib/test/test_codecs.py | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1744,9 +1744,13 @@ self.assertEqual(sout, b"\x80") + at unittest.skipUnless(sys.platform == 'win32', + 'code pages are specific to Windows') class CodePageTest(unittest.TestCase): CP_UTF8 = 65001 - vista_or_later = (sys.getwindowsversion().major >= 6) + + def vista_or_later(self): + return (sys.getwindowsversion().major >= 6) def test_invalid_code_page(self): self.assertRaises(ValueError, codecs.code_page_encode, -1, 'a') @@ -1816,7 +1820,7 @@ (b'\x81\x00abc', 'strict', None), (b'\x81\x00abc', 'ignore', '\x00abc'), ] - if self.vista_or_later: + if self.vista_or_later(): tests.append((b'\x81\x00abc', 'replace', '\ufffd\x00abc')) else: tests.append((b'\x81\x00abc', 'replace', '\x00\x00abc')) @@ -1865,7 +1869,7 @@ ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), ] - if self.vista_or_later: + if self.vista_or_later(): tests.append(('\udc80', 'strict', None)) tests.append(('\udc80', 'ignore', b'')) tests.append(('\udc80', 'replace', b'?')) @@ -1884,7 +1888,7 @@ (b'[\xff]', 'ignore', '[]'), (b'[\xff]', 'replace', '[\ufffd]'), ] - if self.vista_or_later: + if self.vista_or_later(): tests.extend(( (b'[\xed\xb2\x80]', 'strict', None), (b'[\xed\xb2\x80]', 'ignore', '[]'), @@ -1904,7 +1908,7 @@ self.check_decode(932, ( (b'\xff', 'surrogateescape', '\udcff'), )) - if self.vista_or_later: + if self.vista_or_later(): self.check_encode(self.CP_UTF8, ( ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), )) @@ -1918,7 +1922,7 @@ (b'\xff\xf4\x8f\xbf\xbf', 'ignore', '\U0010ffff'), (b'\xff\xf4\x8f\xbf\xbf', 'replace', '\ufffd\U0010ffff'), )) - if self.vista_or_later: + if self.vista_or_later(): self.check_encode(self.CP_UTF8, ( ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'), ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 21:54:26 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 18 Oct 2011 21:54:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312281=3A_Fix_test?= =?utf8?q?=5Fcodecs=2Etest=5Fcp932=28=29_on_Windows_XP?= Message-ID: http://hg.python.org/cpython/rev/413b89242766 changeset: 72978:413b89242766 user: Victor Stinner date: Tue Oct 18 21:55:25 2011 +0200 summary: Issue #12281: Fix test_codecs.test_cp932() on Windows XP Cool! Decoding b'\x81\x00abc' from cp932 with replace error handler is now giving the same result on all Windows versions. files: Lib/test/test_codecs.py | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -1810,7 +1810,7 @@ ('[\xff]', 'replace', b'[y]'), ('[\u20ac]', 'replace', b'[?]'), )) - tests = [ + self.check_decode(932, ( (b'abc', 'strict', 'abc'), (b'\x82\x84\xe9\x80', 'strict', '\uff44\u9a3e'), # invalid bytes @@ -1819,12 +1819,8 @@ (b'\xff', 'replace', '\ufffd'), (b'\x81\x00abc', 'strict', None), (b'\x81\x00abc', 'ignore', '\x00abc'), - ] - if self.vista_or_later(): - tests.append((b'\x81\x00abc', 'replace', '\ufffd\x00abc')) - else: - tests.append((b'\x81\x00abc', 'replace', '\x00\x00abc')) - self.check_decode(932, tests) + (b'\x81\x00abc', 'replace', '\ufffd\x00abc'), + )) def test_cp1252(self): self.check_encode(1252, ( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 22:09:17 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 18 Oct 2011 22:09:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_consistency_check_to_?= =?utf8?q?=5FPyUnicode=5FNew=28=29?= Message-ID: http://hg.python.org/cpython/rev/e2d82169458e changeset: 72979:e2d82169458e user: Victor Stinner date: Tue Oct 18 22:10:14 2011 +0200 summary: Add consistency check to _PyUnicode_New() files: Objects/unicodeobject.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -781,6 +781,7 @@ _PyUnicode_LENGTH(unicode) = 0; _PyUnicode_UTF8(unicode) = NULL; _PyUnicode_UTF8_LENGTH(unicode) = 0; + assert(_PyUnicode_CheckConsistency(unicode, 0)); return unicode; onError: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 18 23:31:59 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 18 Oct 2011 23:31:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_=5FPyUnicode=5FCOM?= =?utf8?q?PACT=5FDATA=28=29_macro?= Message-ID: http://hg.python.org/cpython/rev/cade7c20c728 changeset: 72980:cade7c20c728 user: Victor Stinner date: Tue Oct 18 23:32:53 2011 +0200 summary: Simplify _PyUnicode_COMPACT_DATA() macro files: Include/unicodeobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -452,7 +452,7 @@ /* Return a void pointer to the raw unicode buffer. */ #define _PyUnicode_COMPACT_DATA(op) \ - (PyUnicode_IS_COMPACT_ASCII(op) ? \ + (PyUnicode_IS_ASCII(op) ? \ ((void*)((PyASCIIObject*)(op) + 1)) : \ ((void*)((PyCompactUnicodeObject*)(op) + 1))) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 02:07:14 2011 From: python-checkins at python.org (lukasz.langa) Date: Wed, 19 Oct 2011 02:07:14 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogRml4ZXMgIzEwODYw?= =?utf8?q?=3A_Handle_empty_port_after_port_delimiter_in_httplib?= Message-ID: http://hg.python.org/cpython/rev/6ac59218c049 changeset: 72981:6ac59218c049 branch: 3.2 parent: 72972:dcf5cc88d5c9 user: ?ukasz Langa date: Tue Oct 18 21:17:39 2011 +0200 summary: Fixes #10860: Handle empty port after port delimiter in httplib files: Lib/http/client.py | 5 ++++- Lib/test/test_httplib.py | 24 ++++++++++++++++++++++-- Misc/NEWS | 3 +++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/Lib/http/client.py b/Lib/http/client.py --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -678,7 +678,10 @@ try: port = int(host[i+1:]) except ValueError: - raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + if host[i+1:] == "": # http://foo.com:/ == http://foo.com/ + port = self.default_port + else: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) host = host[:i] else: port = self.default_port diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -161,14 +161,16 @@ def test_host_port(self): # Check invalid host_port - for hp in ("www.python.org:abc", "www.python.org:"): + for hp in ("www.python.org:abc", "user:password at www.python.org"): self.assertRaises(client.InvalidURL, client.HTTPConnection, hp) for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b", 8000), ("www.python.org:80", "www.python.org", 80), + ("www.python.org:", "www.python.org", 80), ("www.python.org", "www.python.org", 80), - ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)): + ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80), + ("[fe80::207:e9ff:fe9b]:", "fe80::207:e9ff:fe9b", 80)): c = client.HTTPConnection(hp) self.assertEqual(h, c.host) self.assertEqual(p, c.port) @@ -539,6 +541,24 @@ resp = h.getresponse() self.assertEqual(resp.status, 404) + def test_host_port(self): + # Check invalid host_port + + for hp in ("www.python.org:abc", "user:password at www.python.org"): + self.assertRaises(client.InvalidURL, client.HTTPSConnection, hp) + + for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", + "fe80::207:e9ff:fe9b", 8000), + ("www.python.org:443", "www.python.org", 443), + ("www.python.org:", "www.python.org", 443), + ("www.python.org", "www.python.org", 443), + ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 443), + ("[fe80::207:e9ff:fe9b]:", "fe80::207:e9ff:fe9b", + 443)): + c = client.HTTPSConnection(hp) + self.assertEqual(h, c.host) + self.assertEqual(p, c.port) + class RequestBodyTest(TestCase): """Test cases where a request includes a message body.""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -137,6 +137,9 @@ - Issue #12650: Fix a race condition where a subprocess.Popen could leak resources (FD/zombie) when killed at the wrong time. +- Issue #10860: http.client now correctly handles an empty port after port + delimiter in URLs. + Tests ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 02:07:15 2011 From: python-checkins at python.org (lukasz.langa) Date: Wed, 19 Oct 2011 02:07:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_fix_for_=2310860_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/18dc3811f2b8 changeset: 72982:18dc3811f2b8 parent: 72980:cade7c20c728 parent: 72981:6ac59218c049 user: ?ukasz Langa date: Wed Oct 19 02:04:46 2011 +0200 summary: Merged fix for #10860 from 3.2 files: Lib/http/client.py | 5 ++++- Lib/test/test_httplib.py | 24 ++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/http/client.py b/Lib/http/client.py --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -678,7 +678,10 @@ try: port = int(host[i+1:]) except ValueError: - raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) + if host[i+1:] == "": # http://foo.com:/ == http://foo.com/ + port = self.default_port + else: + raise InvalidURL("nonnumeric port: '%s'" % host[i+1:]) host = host[:i] else: port = self.default_port diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -161,14 +161,16 @@ def test_host_port(self): # Check invalid host_port - for hp in ("www.python.org:abc", "www.python.org:"): + for hp in ("www.python.org:abc", "user:password at www.python.org"): self.assertRaises(client.InvalidURL, client.HTTPConnection, hp) for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", "fe80::207:e9ff:fe9b", 8000), ("www.python.org:80", "www.python.org", 80), + ("www.python.org:", "www.python.org", 80), ("www.python.org", "www.python.org", 80), - ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80)): + ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 80), + ("[fe80::207:e9ff:fe9b]:", "fe80::207:e9ff:fe9b", 80)): c = client.HTTPConnection(hp) self.assertEqual(h, c.host) self.assertEqual(p, c.port) @@ -539,6 +541,24 @@ self.assertEqual(resp.status, 404) del server + def test_host_port(self): + # Check invalid host_port + + for hp in ("www.python.org:abc", "user:password at www.python.org"): + self.assertRaises(client.InvalidURL, client.HTTPSConnection, hp) + + for hp, h, p in (("[fe80::207:e9ff:fe9b]:8000", + "fe80::207:e9ff:fe9b", 8000), + ("www.python.org:443", "www.python.org", 443), + ("www.python.org:", "www.python.org", 443), + ("www.python.org", "www.python.org", 443), + ("[fe80::207:e9ff:fe9b]", "fe80::207:e9ff:fe9b", 443), + ("[fe80::207:e9ff:fe9b]:", "fe80::207:e9ff:fe9b", + 443)): + c = client.HTTPSConnection(hp) + self.assertEqual(h, c.host) + self.assertEqual(p, c.port) + class RequestBodyTest(TestCase): """Test cases where a request includes a message body.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 02:41:25 2011 From: python-checkins at python.org (lukasz.langa) Date: Wed, 19 Oct 2011 02:41:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_A_ricochet_from_fixing_=231?= =?utf8?q?0680=3A_http=3A//http=3A//example=2Ecom/_no_longer_reports?= Message-ID: http://hg.python.org/cpython/rev/5c5c6a28b349 changeset: 72983:5c5c6a28b349 user: ?ukasz Langa date: Wed Oct 19 02:40:48 2011 +0200 summary: A ricochet from fixing #10680: http://http://example.com/ no longer reports 'nonnumeric port'. It parses to a host name of "http:" which is equivalent to http:80. files: Lib/packaging/tests/test_pypi_simple.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/packaging/tests/test_pypi_simple.py b/Lib/packaging/tests/test_pypi_simple.py --- a/Lib/packaging/tests/test_pypi_simple.py +++ b/Lib/packaging/tests/test_pypi_simple.py @@ -87,7 +87,7 @@ try: crawler._open_url(url) except Exception as v: - self.assertIn('nonnumeric port', str(v)) + self.assertIn('Download error', str(v)) # issue #160 url = server.full_address -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 19 05:29:12 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 19 Oct 2011 05:29:12 +0200 Subject: [Python-checkins] Daily reference leaks (5c5c6a28b349): sum=0 Message-ID: results for 5c5c6a28b349 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogNKs9BC', '-x'] From python-checkins at python.org Wed Oct 19 10:06:47 2011 From: python-checkins at python.org (ezio.melotti) Date: Wed, 19 Oct 2011 10:06:47 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Remove_duplicat?= =?utf8?q?ion=2E?= Message-ID: http://hg.python.org/cpython/rev/86e3943d0d5b changeset: 72984:86e3943d0d5b branch: 2.7 parent: 72974:a3e48273dce3 user: Ezio Melotti date: Wed Oct 19 10:39:35 2011 +0300 summary: Remove duplication. files: Demo/threads/sync.py | 2 +- Demo/tix/tixwidgets.py | 2 +- Doc/c-api/exceptions.rst | 2 +- Doc/distutils/apiref.rst | 2 +- Doc/howto/logging-cookbook.rst | 2 +- Doc/howto/pyporting.rst | 2 +- Doc/howto/webservers.rst | 2 +- Doc/library/collections.rst | 2 +- Doc/library/ctypes.rst | 2 +- Doc/library/email.message.rst | 2 +- Doc/library/email.mime.rst | 2 +- Doc/library/httplib.rst | 2 +- Doc/library/mailbox.rst | 2 +- Doc/library/multiprocessing.rst | 4 ++-- Doc/library/sqlite3.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/string.rst | 2 +- Doc/library/ttk.rst | 2 +- Doc/reference/compound_stmts.rst | 2 +- Doc/whatsnew/2.4.rst | 2 +- Lib/cookielib.py | 2 +- Lib/lib-tk/Tix.py | 6 +++--- Lib/lib-tk/turtle.py | 2 +- Lib/msilib/schema.py | 2 +- Lib/multiprocessing/__init__.py | 2 +- Lib/rfc822.py | 2 +- Lib/sched.py | 2 +- Lib/test/test_urlparse.py | 2 +- Lib/test/test_xmlrpc.py | 4 ++-- 29 files changed, 33 insertions(+), 33 deletions(-) diff --git a/Demo/threads/sync.py b/Demo/threads/sync.py --- a/Demo/threads/sync.py +++ b/Demo/threads/sync.py @@ -265,7 +265,7 @@ # intervening. If there are other threads waiting to write, they # are allowed to proceed only if the current thread calls # .read_out; threads waiting to read are only allowed to proceed -# if there are are no threads waiting to write. (This is a +# if there are no threads waiting to write. (This is a # weakness of the interface!) import thread diff --git a/Demo/tix/tixwidgets.py b/Demo/tix/tixwidgets.py --- a/Demo/tix/tixwidgets.py +++ b/Demo/tix/tixwidgets.py @@ -659,7 +659,7 @@ I have implemented a new image type called "compound". It allows you to glue together a bunch of bitmaps, images and text strings together to form a bigger image. Then you can use this image with widgets that -support the -image option. For example, you can display a text string string +support the -image option. For example, you can display a text string together with a bitmap, at the same time, inside a TK button widget. """) list.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -475,7 +475,7 @@ Marks a point where a recursive C-level call is about to be performed. - If :const:`USE_STACKCHECK` is defined, this function checks if the the OS + If :const:`USE_STACKCHECK` is defined, this function checks if the OS stack overflowed using :cfunc:`PyOS_CheckStack`. In this is the case, it sets a :exc:`MemoryError` and returns a nonzero value. diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1741,7 +1741,7 @@ Set final values for all the options that this command supports. This is always called as late as possible, ie. after any option assignments from the command-line or from other commands have been done. Thus, this is the place - to to code option dependencies: if *foo* depends on *bar*, then it is safe to + to code option dependencies: if *foo* depends on *bar*, then it is safe to set *foo* from *bar* as long as *foo* still has the same value it was assigned in :meth:`initialize_options`. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -679,6 +679,6 @@ ``.1``. Each of the existing backup files is renamed to increment the suffix (``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased. -Obviously this example sets the log length much much too small as an extreme +Obviously this example sets the log length much too small as an extreme example. You would want to set *maxBytes* to an appropriate value. diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -328,7 +328,7 @@ textual data, people have over the years been rather loose in their delineation of what ``str`` instances held text compared to bytes. In Python 3 you cannot be so care-free anymore and need to properly handle the difference. The key -handling this issue to to make sure that **every** string literal in your +handling this issue to make sure that **every** string literal in your Python 2 code is either syntactically of functionally marked as either bytes or text data. After this is done you then need to make sure your APIs are designed to either handle a specific type or made to be properly polymorphic. diff --git a/Doc/howto/webservers.rst b/Doc/howto/webservers.rst --- a/Doc/howto/webservers.rst +++ b/Doc/howto/webservers.rst @@ -264,7 +264,7 @@ * `FastCGI, SCGI, and Apache: Background and Future `_ - is a discussion on why the concept of FastCGI and SCGI is better that that + is a discussion on why the concept of FastCGI and SCGI is better than that of mod_python. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -188,7 +188,7 @@ * The multiset methods are designed only for use cases with positive values. The inputs may be negative or zero, but only outputs with positive values are created. There are no type restrictions, but the value type needs to - support support addition, subtraction, and comparison. + support addition, subtraction, and comparison. * The :meth:`elements` method requires integer counts. It ignores zero and negative counts. diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -2000,7 +2000,7 @@ .. function:: string_at(address[, size]) - This function returns the string starting at memory address address. If size + This function returns the string starting at memory address *address*. If size is specified, it is used as size, otherwise the string is assumed to be zero-terminated. diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -295,7 +295,7 @@ Content-Disposition: attachment; filename="bud.gif" - An example with with non-ASCII characters:: + An example with non-ASCII characters:: msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fu?baller.ppt')) diff --git a/Doc/library/email.mime.rst b/Doc/library/email.mime.rst --- a/Doc/library/email.mime.rst +++ b/Doc/library/email.mime.rst @@ -196,6 +196,6 @@ .. versionchanged:: 2.4 The previously deprecated *_encoding* argument has been removed. Content - Transfer Encoding now happens happens implicitly based on the *_charset* + Transfer Encoding now happens implicitly based on the *_charset* argument. diff --git a/Doc/library/httplib.rst b/Doc/library/httplib.rst --- a/Doc/library/httplib.rst +++ b/Doc/library/httplib.rst @@ -452,7 +452,7 @@ Set the host and the port for HTTP Connect Tunnelling. Normally used when it is required to do HTTPS Conection through a proxy server. - The headers argument should be a mapping of extra HTTP headers to to sent + The headers argument should be a mapping of extra HTTP headers to sent with the CONNECT request. .. versionadded:: 2.7 diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -765,7 +765,7 @@ There is no requirement that :class:`Message` instances be used to represent messages retrieved using :class:`Mailbox` instances. In some situations, the time and memory required to generate :class:`Message` representations might - not not acceptable. For such situations, :class:`Mailbox` instances also + not be acceptable. For such situations, :class:`Mailbox` instances also offer string and file-like representations, and a custom message factory may be specified when a :class:`Mailbox` instance is initialized. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1494,7 +1494,7 @@ a new shared object -- see documentation for the *method_to_typeid* argument of :meth:`BaseManager.register`. - If an exception is raised by the call, then then is re-raised by + If an exception is raised by the call, then is re-raised by :meth:`_callmethod`. If some other exception is raised in the manager's process then this is converted into a :exc:`RemoteError` exception and is raised by :meth:`_callmethod`. @@ -1617,7 +1617,7 @@ The *chunksize* argument is the same as the one used by the :meth:`.map` method. For very long iterables using a large value for *chunksize* can - make make the job complete **much** faster than using the default value of + make the job complete **much** faster than using the default value of ``1``. Also if *chunksize* is ``1`` then the :meth:`!next` method of the iterator diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -240,7 +240,7 @@ .. method:: Connection.commit() This method commits the current transaction. If you don't call this method, - anything you did since the last call to ``commit()`` is not visible from from + anything you did since the last call to ``commit()`` is not visible from other database connections. If you wonder why you don't see the data you've written to the database, please check you didn't forget to call this method. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1311,7 +1311,7 @@ Return ``True`` if there are only decimal characters in S, ``False`` otherwise. Decimal characters include digit characters, and all characters - that that can be used to form decimal-radix numbers, e.g. U+0660, + that can be used to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -243,7 +243,7 @@ See also the :ref:`formatspec` section. -The *field_name* itself begins with an *arg_name* that is either either a number or a +The *field_name* itself begins with an *arg_name* that is either a number or a keyword. If it's a number, it refers to a positional argument, and if it's a keyword, it refers to a named keyword argument. If the numerical arg_names in a format string are 0, 1, 2, ... in sequence, they can all be omitted (not just some) diff --git a/Doc/library/ttk.rst b/Doc/library/ttk.rst --- a/Doc/library/ttk.rst +++ b/Doc/library/ttk.rst @@ -1243,7 +1243,7 @@ *layoutspec*, if specified, is expected to be a list or some other sequence type (excluding strings), where each item should be a tuple and the first item is the layout name and the second item should have the - format described described in `Layouts`_. + format described in `Layouts`_. To understand the format, see the following example (it is not intended to do anything useful):: diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -470,7 +470,7 @@ **Default parameter values are evaluated when the function definition is executed.** This means that the expression is evaluated once, when the function -is defined, and that that same "pre-computed" value is used for each call. This +is defined, and that the same "pre-computed" value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -947,7 +947,7 @@ :meth:`__len__` method. (Contributed by Raymond Hettinger.) * The methods :meth:`list.__getitem__`, :meth:`dict.__getitem__`, and - :meth:`dict.__contains__` are are now implemented as :class:`method_descriptor` + :meth:`dict.__contains__` are now implemented as :class:`method_descriptor` objects rather than :class:`wrapper_descriptor` objects. This form of access doubles their performance and makes them more suitable for use as arguments to functionals: ``map(mydict.__getitem__, keylist)``. (Contributed by Raymond diff --git a/Lib/cookielib.py b/Lib/cookielib.py --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1014,7 +1014,7 @@ (not erhn.startswith(".") and not ("."+erhn).endswith(domain))): _debug(" effective request-host %s (even with added " - "initial dot) does not end end with %s", + "initial dot) does not end with %s", erhn, domain) return False if (cookie.version > 0 or diff --git a/Lib/lib-tk/Tix.py b/Lib/lib-tk/Tix.py --- a/Lib/lib-tk/Tix.py +++ b/Lib/lib-tk/Tix.py @@ -1874,13 +1874,13 @@ return self.tk.call(self, 'info', 'bbox', x, y) def move_column(self, from_, to, offset): - """Moves the the range of columns from position FROM through TO by + """Moves the range of columns from position FROM through TO by the distance indicated by OFFSET. For example, move_column(2, 4, 1) moves the columns 2,3,4 to columns 3,4,5.""" self.tk.call(self, 'move', 'column', from_, to, offset) def move_row(self, from_, to, offset): - """Moves the the range of rows from position FROM through TO by + """Moves the range of rows from position FROM through TO by the distance indicated by OFFSET. For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.""" self.tk.call(self, 'move', 'row', from_, to, offset) @@ -1939,7 +1939,7 @@ pad0 pixels Specifies the paddings to the top of a row. pad1 pixels - Specifies the paddings to the the bottom of a row. + Specifies the paddings to the bottom of a row. size val Specifies the height of a row. Val may be: "auto" -- the height of the row is set the diff --git a/Lib/lib-tk/turtle.py b/Lib/lib-tk/turtle.py --- a/Lib/lib-tk/turtle.py +++ b/Lib/lib-tk/turtle.py @@ -96,7 +96,7 @@ docstrings to disc, so it can serve as a template for translations. Behind the scenes there are some features included with possible -extensions in in mind. These will be commented and documented elsewhere. +extensions in mind. These will be commented and documented elsewhere. """ diff --git a/Lib/msilib/schema.py b/Lib/msilib/schema.py --- a/Lib/msilib/schema.py +++ b/Lib/msilib/schema.py @@ -958,7 +958,7 @@ (u'ServiceInstall',u'StartType',u'N',0,4,None, None, None, None, u'Type of the service',), (u'Shortcut',u'Name',u'N',None, None, None, None, u'Filename',None, u'The name of the shortcut to be created.',), (u'Shortcut',u'Description',u'Y',None, None, None, None, u'Text',None, u'The description for the shortcut.',), -(u'Shortcut',u'Component_',u'N',None, None, u'Component',1,u'Identifier',None, u'Foreign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion.',), +(u'Shortcut',u'Component_',u'N',None, None, u'Component',1,u'Identifier',None, u'Foreign key into the Component table denoting the component whose selection gates the shortcut creation/deletion.',), (u'Shortcut',u'Icon_',u'Y',None, None, u'Icon',1,u'Identifier',None, u'Foreign key into the File table denoting the external icon file for the shortcut.',), (u'Shortcut',u'IconIndex',u'Y',-32767,32767,None, None, None, None, u'The icon index for the shortcut.',), (u'Shortcut',u'Directory_',u'N',None, None, u'Directory',1,u'Identifier',None, u'Foreign key into the Directory table denoting the directory where the shortcut file is created.',), diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -9,7 +9,7 @@ # wrapper for 'threading'. # # Try calling `multiprocessing.doc.main()` to read the html -# documentation in in a webbrowser. +# documentation in a webbrowser. # # # Copyright (c) 2006-2008, R Oudkerk diff --git a/Lib/rfc822.py b/Lib/rfc822.py --- a/Lib/rfc822.py +++ b/Lib/rfc822.py @@ -34,7 +34,7 @@ libraries in which tell() discards buffered data before discovering that the lseek() system call doesn't work. For maximum portability, you should set the seekable argument to zero to prevent that initial \code{tell} when passing in -an unseekable object such as a a file object created from a socket object. If +an unseekable object such as a file object created from a socket object. If it is 1 on entry -- which it is by default -- the tell() method of the open file object is called once; if this raises an exception, seekable is reset to 0. For other nonzero values of seekable, this test is not made. diff --git a/Lib/sched.py b/Lib/sched.py --- a/Lib/sched.py +++ b/Lib/sched.py @@ -88,7 +88,7 @@ restarted. It is legal for both the delay function and the action - function to to modify the queue or to raise an exception; + function to modify the queue or to raise an exception; exceptions are not caught but the scheduler's state remains well-defined so run() may be called again. diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -9,7 +9,7 @@ RFC3986_BASE = 'http://a/b/c/d;p?q' SIMPLE_BASE = 'http://a/b/c/d' -# A list of test cases. Each test case is a a two-tuple that contains +# A list of test cases. Each test case is a two-tuple that contains # a string with the query and a dictionary with the expected result. parse_qsl_test_cases = [ diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -308,7 +308,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) @@ -367,7 +367,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 10:06:48 2011 From: python-checkins at python.org (ezio.melotti) Date: Wed, 19 Oct 2011 10:06:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Remove_duplicat?= =?utf8?q?ion=2E?= Message-ID: http://hg.python.org/cpython/rev/e19ccbbe70dd changeset: 72985:e19ccbbe70dd branch: 3.2 parent: 72981:6ac59218c049 user: Ezio Melotti date: Wed Oct 19 10:58:56 2011 +0300 summary: Remove duplication. files: Doc/c-api/method.rst | 4 ++-- Doc/distutils/apiref.rst | 2 +- Doc/howto/logging-cookbook.rst | 2 +- Doc/howto/pyporting.rst | 2 +- Doc/howto/webservers.rst | 2 +- Doc/library/collections.rst | 2 +- Doc/library/concurrent.futures.rst | 2 +- Doc/library/ctypes.rst | 2 +- Doc/library/email.message.rst | 2 +- Doc/library/functions.rst | 2 +- Doc/library/http.client.rst | 2 +- Doc/library/mailbox.rst | 2 +- Doc/library/mmap.rst | 2 +- Doc/library/multiprocessing.rst | 4 ++-- Doc/library/sqlite3.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/string.rst | 2 +- Doc/library/threading.rst | 2 +- Doc/library/tkinter.ttk.rst | 2 +- Doc/reference/compound_stmts.rst | 2 +- Doc/reference/toplevel_components.rst | 2 +- Doc/tutorial/floatingpoint.rst | 2 +- Doc/whatsnew/2.4.rst | 2 +- Lib/configparser.py | 2 +- Lib/datetime.py | 2 +- Lib/http/cookiejar.py | 2 +- Lib/msilib/schema.py | 2 +- Lib/multiprocessing/__init__.py | 2 +- Lib/sched.py | 2 +- Lib/test/test_urllib2.py | 2 +- Lib/test/test_urlparse.py | 2 +- Lib/test/test_xmlrpc.py | 4 ++-- Lib/threading.py | 2 +- Lib/tkinter/tix.py | 10 +++++----- Lib/tkinter/ttk.py | 2 +- Lib/turtle.py | 2 +- 36 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -27,7 +27,7 @@ .. c:function:: PyObject* PyInstanceMethod_New(PyObject *func) Return a new instance method object, with *func* being any callable object - *func* is is the function that will be called when the instance method is + *func* is the function that will be called when the instance method is called. @@ -70,7 +70,7 @@ .. c:function:: PyObject* PyMethod_New(PyObject *func, PyObject *self) Return a new method object, with *func* being any callable object and *self* - the instance the method should be bound. *func* is is the function that will + the instance the method should be bound. *func* is the function that will be called when the method is called. *self* must not be *NULL*. diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1745,7 +1745,7 @@ Set final values for all the options that this command supports. This is always called as late as possible, ie. after any option assignments from the command-line or from other commands have been done. Thus, this is the place - to to code option dependencies: if *foo* depends on *bar*, then it is safe to + to code option dependencies: if *foo* depends on *bar*, then it is safe to set *foo* from *bar* as long as *foo* still has the same value it was assigned in :meth:`initialize_options`. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -960,7 +960,7 @@ ``.1``. Each of the existing backup files is renamed to increment the suffix (``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased. -Obviously this example sets the log length much much too small as an extreme +Obviously this example sets the log length much too small as an extreme example. You would want to set *maxBytes* to an appropriate value. .. _zeromq-handlers: diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -328,7 +328,7 @@ textual data, people have over the years been rather loose in their delineation of what ``str`` instances held text compared to bytes. In Python 3 you cannot be so care-free anymore and need to properly handle the difference. The key -handling this issue to to make sure that **every** string literal in your +handling this issue to make sure that **every** string literal in your Python 2 code is either syntactically of functionally marked as either bytes or text data. After this is done you then need to make sure your APIs are designed to either handle a specific type or made to be properly polymorphic. diff --git a/Doc/howto/webservers.rst b/Doc/howto/webservers.rst --- a/Doc/howto/webservers.rst +++ b/Doc/howto/webservers.rst @@ -264,7 +264,7 @@ * `FastCGI, SCGI, and Apache: Background and Future `_ - is a discussion on why the concept of FastCGI and SCGI is better that that + is a discussion on why the concept of FastCGI and SCGI is better than that of mod_python. diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -191,7 +191,7 @@ * The multiset methods are designed only for use cases with positive values. The inputs may be negative or zero, but only outputs with positive values are created. There are no type restrictions, but the value type needs to - support support addition, subtraction, and comparison. + support addition, subtraction, and comparison. * The :meth:`elements` method requires integer counts. It ignores zero and negative counts. diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -14,7 +14,7 @@ The :mod:`concurrent.futures` module provides a high-level interface for asynchronously executing callables. -The asynchronous execution can be be performed with threads, using +The asynchronous execution can be performed with threads, using :class:`ThreadPoolExecutor`, or separate processes, using :class:`ProcessPoolExecutor`. Both implement the same interface, which is defined by the abstract :class:`Executor` class. diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1958,7 +1958,7 @@ .. function:: string_at(address, size=-1) - This function returns the C string starting at memory address address as a bytes + This function returns the C string starting at memory address *address* as a bytes object. If size is specified, it is used as size, otherwise the string is assumed to be zero-terminated. diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -291,7 +291,7 @@ Content-Disposition: attachment; filename="bud.gif" - An example with with non-ASCII characters:: + An example with non-ASCII characters:: msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fu?baller.ppt')) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -828,7 +828,7 @@ .. note:: Python doesn't depend on the underlying operating system's notion of text - files; all the the processing is done by Python itself, and is therefore + files; all the processing is done by Python itself, and is therefore platform-independent. *buffering* is an optional integer used to set the buffering policy. Pass 0 diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -435,7 +435,7 @@ Set the host and the port for HTTP Connect Tunnelling. Normally used when it is required to a HTTPS Connection through a proxy server. - The headers argument should be a mapping of extra HTTP headers to to sent + The headers argument should be a mapping of extra HTTP headers to sent with the CONNECT request. .. versionadded:: 3.2 diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -780,7 +780,7 @@ There is no requirement that :class:`Message` instances be used to represent messages retrieved using :class:`Mailbox` instances. In some situations, the time and memory required to generate :class:`Message` representations might - not not acceptable. For such situations, :class:`Mailbox` instances also + not be acceptable. For such situations, :class:`Mailbox` instances also offer string and file-like representations, and a custom message factory may be specified when a :class:`Mailbox` instance is initialized. diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -259,7 +259,7 @@ .. method:: write_byte(byte) - Write the the integer *byte* into memory at the current + Write the integer *byte* into memory at the current position of the file pointer; the file position is advanced by ``1``. If the mmap was created with :const:`ACCESS_READ`, then writing to it will raise a :exc:`TypeError` exception. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1494,7 +1494,7 @@ a new shared object -- see documentation for the *method_to_typeid* argument of :meth:`BaseManager.register`. - If an exception is raised by the call, then then is re-raised by + If an exception is raised by the call, then is re-raised by :meth:`_callmethod`. If some other exception is raised in the manager's process then this is converted into a :exc:`RemoteError` exception and is raised by :meth:`_callmethod`. @@ -1631,7 +1631,7 @@ The *chunksize* argument is the same as the one used by the :meth:`.map` method. For very long iterables using a large value for *chunksize* can - make make the job complete **much** faster than using the default value of + make the job complete **much** faster than using the default value of ``1``. Also if *chunksize* is ``1`` then the :meth:`!next` method of the iterator diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -243,7 +243,7 @@ .. method:: Connection.commit() This method commits the current transaction. If you don't call this method, - anything you did since the last call to ``commit()`` is not visible from from + anything you did since the last call to ``commit()`` is not visible from other database connections. If you wonder why you don't see the data you've written to the database, please check you didn't forget to call this method. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1117,7 +1117,7 @@ characters and there is at least one character, false otherwise. Decimal characters are those from general category "Nd". This category includes digit characters, and all characters - that that can be used to form decimal-radix numbers, e.g. U+0660, + that can be used to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -211,7 +211,7 @@ See also the :ref:`formatspec` section. -The *field_name* itself begins with an *arg_name* that is either either a number or a +The *field_name* itself begins with an *arg_name* that is either a number or a keyword. If it's a number, it refers to a positional argument, and if it's a keyword, it refers to a named keyword argument. If the numerical arg_names in a format string are 0, 1, 2, ... in sequence, they can all be omitted (not just some) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -864,7 +864,7 @@ Pass the barrier. When all the threads party to the barrier have called this function, they are all released simultaneously. If a *timeout* is - provided, is is used in preference to any that was supplied to the class + provided, it is used in preference to any that was supplied to the class constructor. The return value is an integer in the range 0 to *parties* -- 1, different diff --git a/Doc/library/tkinter.ttk.rst b/Doc/library/tkinter.ttk.rst --- a/Doc/library/tkinter.ttk.rst +++ b/Doc/library/tkinter.ttk.rst @@ -1240,7 +1240,7 @@ *layoutspec*, if specified, is expected to be a list or some other sequence type (excluding strings), where each item should be a tuple and the first item is the layout name and the second item should have the - format described described in `Layouts`_. + format described in `Layouts`_. To understand the format, see the following example (it is not intended to do anything useful):: diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -478,7 +478,7 @@ **Default parameter values are evaluated when the function definition is executed.** This means that the expression is evaluated once, when the function -is defined, and that that same "pre-computed" value is used for each call. This +is defined, and that the same "pre-computed" value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. diff --git a/Doc/reference/toplevel_components.rst b/Doc/reference/toplevel_components.rst --- a/Doc/reference/toplevel_components.rst +++ b/Doc/reference/toplevel_components.rst @@ -111,6 +111,6 @@ single: input; raw single: readline() (file method) -Note: to read 'raw' input line without interpretation, you can use the the +Note: to read 'raw' input line without interpretation, you can use the :meth:`readline` method of file objects, including ``sys.stdin``. diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -92,7 +92,7 @@ (although some languages may not *display* the difference by default, or in all output modes). -For more pleasant output, you may may wish to use string formatting to produce a limited number of significant digits:: +For more pleasant output, you may wish to use string formatting to produce a limited number of significant digits:: >>> format(math.pi, '.12g') # give 12 significant digits '3.14159265359' diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -947,7 +947,7 @@ :meth:`__len__` method. (Contributed by Raymond Hettinger.) * The methods :meth:`list.__getitem__`, :meth:`dict.__getitem__`, and - :meth:`dict.__contains__` are are now implemented as :class:`method_descriptor` + :meth:`dict.__contains__` are now implemented as :class:`method_descriptor` objects rather than :class:`wrapper_descriptor` objects. This form of access doubles their performance and makes them more suitable for use as arguments to functionals: ``map(mydict.__getitem__, keylist)``. (Contributed by Raymond diff --git a/Lib/configparser.py b/Lib/configparser.py --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -381,7 +381,7 @@ would resolve the "%(dir)s" to the value of dir. All reference expansions are done late, on demand. If a user needs to use a bare % in - a configuration file, she can escape it by writing %%. Other other % usage + a configuration file, she can escape it by writing %%. Other % usage is considered a user error and raises `InterpolationSyntaxError'.""" _KEYCRE = re.compile(r"%\(([^)]+)\)s") diff --git a/Lib/datetime.py b/Lib/datetime.py --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2057,7 +2057,7 @@ Because we know z.d said z was in daylight time (else [5] would have held and we would have stopped then), and we know z.d != z'.d (else [8] would have held -and we we have stopped then), and there are only 2 possible values dst() can +and we have stopped then), and there are only 2 possible values dst() can return in Eastern, it follows that z'.d must be 0 (which it is in the example, but the reasoning doesn't depend on the example -- it depends on there being two possible dst() outcomes, one zero and the other non-zero). Therefore diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1020,7 +1020,7 @@ (not erhn.startswith(".") and not ("."+erhn).endswith(domain))): _debug(" effective request-host %s (even with added " - "initial dot) does not end end with %s", + "initial dot) does not end with %s", erhn, domain) return False if (cookie.version > 0 or diff --git a/Lib/msilib/schema.py b/Lib/msilib/schema.py --- a/Lib/msilib/schema.py +++ b/Lib/msilib/schema.py @@ -958,7 +958,7 @@ ('ServiceInstall','StartType','N',0,4,None, None, None, None, 'Type of the service',), ('Shortcut','Name','N',None, None, None, None, 'Filename',None, 'The name of the shortcut to be created.',), ('Shortcut','Description','Y',None, None, None, None, 'Text',None, 'The description for the shortcut.',), -('Shortcut','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion.',), +('Shortcut','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table denoting the component whose selection gates the shortcut creation/deletion.',), ('Shortcut','Icon_','Y',None, None, 'Icon',1,'Identifier',None, 'Foreign key into the File table denoting the external icon file for the shortcut.',), ('Shortcut','IconIndex','Y',-32767,32767,None, None, None, None, 'The icon index for the shortcut.',), ('Shortcut','Directory_','N',None, None, 'Directory',1,'Identifier',None, 'Foreign key into the Directory table denoting the directory where the shortcut file is created.',), diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -9,7 +9,7 @@ # wrapper for 'threading'. # # Try calling `multiprocessing.doc.main()` to read the html -# documentation in in a webbrowser. +# documentation in a webbrowser. # # # Copyright (c) 2006-2008, R Oudkerk diff --git a/Lib/sched.py b/Lib/sched.py --- a/Lib/sched.py +++ b/Lib/sched.py @@ -94,7 +94,7 @@ restarted. It is legal for both the delay function and the action - function to to modify the queue or to raise an exception; + function to modify the queue or to raise an exception; exceptions are not caught but the scheduler's state remains well-defined so run() may be called again. diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -878,7 +878,7 @@ def test_http_doubleslash(self): # Checks the presence of any unnecessary double slash in url does not # break anything. Previously, a double slash directly after the host - # could could cause incorrect parsing. + # could cause incorrect parsing. h = urllib.request.AbstractHTTPHandler() o = h.parent = MockOpener() diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -9,7 +9,7 @@ RFC3986_BASE = 'http://a/b/c/d;p?q' SIMPLE_BASE = 'http://a/b/c/d' -# A list of test cases. Each test case is a a two-tuple that contains +# A list of test cases. Each test case is a two-tuple that contains # a string with the query and a dictionary with the expected result. parse_qsl_test_cases = [ diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -295,7 +295,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) @@ -354,7 +354,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -435,7 +435,7 @@ # to be cyclic. Threads are not allowed into it until it has fully drained # since the previous cycle. In addition, a 'resetting' state exists which is # similar to 'draining' except that threads leave with a BrokenBarrierError, -# and a 'broken' state in which all threads get get the exception. +# and a 'broken' state in which all threads get the exception. class Barrier(_Verbose): """ Barrier. Useful for synchronizing a fixed number of threads diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -1554,8 +1554,8 @@ '''This command is used to indicate whether the entry given by entryPath has children entries and whether the children are visible. mode must be one of open, close or none. If mode is set to open, a (+) - indicator is drawn next the the entry. If mode is set to close, a (-) - indicator is drawn next the the entry. If mode is set to none, no + indicator is drawn next the entry. If mode is set to close, a (-) + indicator is drawn next the entry. If mode is set to none, no indicators will be drawn for this entry. The default mode is none. The open mode indicates the entry has hidden children and this entry can be opened by the user. The close mode indicates that all the children of the @@ -1873,13 +1873,13 @@ return self.tk.call(self, 'info', 'bbox', x, y) def move_column(self, from_, to, offset): - """Moves the the range of columns from position FROM through TO by + """Moves the range of columns from position FROM through TO by the distance indicated by OFFSET. For example, move_column(2, 4, 1) moves the columns 2,3,4 to columns 3,4,5.""" self.tk.call(self, 'move', 'column', from_, to, offset) def move_row(self, from_, to, offset): - """Moves the the range of rows from position FROM through TO by + """Moves the range of rows from position FROM through TO by the distance indicated by OFFSET. For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.""" self.tk.call(self, 'move', 'row', from_, to, offset) @@ -1938,7 +1938,7 @@ pad0 pixels Specifies the paddings to the top of a row. pad1 pixels - Specifies the paddings to the the bottom of a row. + Specifies the paddings to the bottom of a row. size val Specifies the height of a row. Val may be: "auto" -- the height of the row is set the diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -37,7 +37,7 @@ import os tilelib = os.environ.get('TILE_LIBRARY') if tilelib: - # append custom tile path to the the list of directories that + # append custom tile path to the list of directories that # Tcl uses when attempting to resolve packages with the package # command master.tk.eval( diff --git a/Lib/turtle.py b/Lib/turtle.py --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -96,7 +96,7 @@ docstrings to disc, so it can serve as a template for translations. Behind the scenes there are some features included with possible -extensions in in mind. These will be commented and documented elsewhere. +extensions in mind. These will be commented and documented elsewhere. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 10:06:49 2011 From: python-checkins at python.org (ezio.melotti) Date: Wed, 19 Oct 2011 10:06:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/bfbe144986d7 changeset: 72986:bfbe144986d7 parent: 72983:5c5c6a28b349 parent: 72985:e19ccbbe70dd user: Ezio Melotti date: Wed Oct 19 11:06:26 2011 +0300 summary: Merge with 3.2. files: Doc/c-api/exceptions.rst | 2 +- Doc/c-api/method.rst | 4 ++-- Doc/distutils/apiref.rst | 2 +- Doc/howto/logging-cookbook.rst | 2 +- Doc/howto/pyporting.rst | 2 +- Doc/howto/webservers.rst | 2 +- Doc/library/argparse.rst | 2 +- Doc/library/collections.rst | 2 +- Doc/library/concurrent.futures.rst | 2 +- Doc/library/ctypes.rst | 2 +- Doc/library/email.message.rst | 2 +- Doc/library/functions.rst | 2 +- Doc/library/http.client.rst | 2 +- Doc/library/mailbox.rst | 2 +- Doc/library/mmap.rst | 2 +- Doc/library/multiprocessing.rst | 4 ++-- Doc/library/os.rst | 2 +- Doc/library/packaging.command.rst | 2 +- Doc/library/packaging.install.rst | 2 +- Doc/library/sqlite3.rst | 2 +- Doc/library/stdtypes.rst | 2 +- Doc/library/string.rst | 2 +- Doc/library/threading.rst | 2 +- Doc/library/tkinter.ttk.rst | 2 +- Doc/reference/compound_stmts.rst | 2 +- Doc/reference/toplevel_components.rst | 2 +- Doc/tutorial/floatingpoint.rst | 2 +- Doc/whatsnew/2.4.rst | 2 +- Lib/configparser.py | 2 +- Lib/datetime.py | 2 +- Lib/http/cookiejar.py | 2 +- Lib/msilib/schema.py | 2 +- Lib/multiprocessing/__init__.py | 2 +- Lib/sched.py | 2 +- Lib/test/test_urllib2.py | 2 +- Lib/test/test_urlparse.py | 2 +- Lib/test/test_xmlrpc.py | 4 ++-- Lib/threading.py | 2 +- Lib/tkinter/tix.py | 10 +++++----- Lib/tkinter/ttk.py | 2 +- Lib/turtle.py | 2 +- 41 files changed, 48 insertions(+), 48 deletions(-) diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -525,7 +525,7 @@ Marks a point where a recursive C-level call is about to be performed. - If :const:`USE_STACKCHECK` is defined, this function checks if the the OS + If :const:`USE_STACKCHECK` is defined, this function checks if the OS stack overflowed using :c:func:`PyOS_CheckStack`. In this is the case, it sets a :exc:`MemoryError` and returns a nonzero value. diff --git a/Doc/c-api/method.rst b/Doc/c-api/method.rst --- a/Doc/c-api/method.rst +++ b/Doc/c-api/method.rst @@ -27,7 +27,7 @@ .. c:function:: PyObject* PyInstanceMethod_New(PyObject *func) Return a new instance method object, with *func* being any callable object - *func* is is the function that will be called when the instance method is + *func* is the function that will be called when the instance method is called. @@ -70,7 +70,7 @@ .. c:function:: PyObject* PyMethod_New(PyObject *func, PyObject *self) Return a new method object, with *func* being any callable object and *self* - the instance the method should be bound. *func* is is the function that will + the instance the method should be bound. *func* is the function that will be called when the method is called. *self* must not be *NULL*. diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1744,7 +1744,7 @@ Set final values for all the options that this command supports. This is always called as late as possible, ie. after any option assignments from the command-line or from other commands have been done. Thus, this is the place - to to code option dependencies: if *foo* depends on *bar*, then it is safe to + to code option dependencies: if *foo* depends on *bar*, then it is safe to set *foo* from *bar* as long as *foo* still has the same value it was assigned in :meth:`initialize_options`. diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -960,7 +960,7 @@ ``.1``. Each of the existing backup files is renamed to increment the suffix (``.1`` becomes ``.2``, etc.) and the ``.6`` file is erased. -Obviously this example sets the log length much much too small as an extreme +Obviously this example sets the log length much too small as an extreme example. You would want to set *maxBytes* to an appropriate value. .. _zeromq-handlers: diff --git a/Doc/howto/pyporting.rst b/Doc/howto/pyporting.rst --- a/Doc/howto/pyporting.rst +++ b/Doc/howto/pyporting.rst @@ -328,7 +328,7 @@ textual data, people have over the years been rather loose in their delineation of what ``str`` instances held text compared to bytes. In Python 3 you cannot be so care-free anymore and need to properly handle the difference. The key -handling this issue to to make sure that **every** string literal in your +handling this issue to make sure that **every** string literal in your Python 2 code is either syntactically of functionally marked as either bytes or text data. After this is done you then need to make sure your APIs are designed to either handle a specific type or made to be properly polymorphic. diff --git a/Doc/howto/webservers.rst b/Doc/howto/webservers.rst --- a/Doc/howto/webservers.rst +++ b/Doc/howto/webservers.rst @@ -264,7 +264,7 @@ * `FastCGI, SCGI, and Apache: Background and Future `_ - is a discussion on why the concept of FastCGI and SCGI is better that that + is a discussion on why the concept of FastCGI and SCGI is better than that of mod_python. diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -443,7 +443,7 @@ --foo FOO FOO! (default: 42) :class:`MetavarTypeHelpFormatter` uses the name of the type_ argument for each -argument as as the display name for its values (rather than using the dest_ +argument as the display name for its values (rather than using the dest_ as the regular formatter does):: >>> parser = argparse.ArgumentParser( diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -317,7 +317,7 @@ * The multiset methods are designed only for use cases with positive values. The inputs may be negative or zero, but only outputs with positive values are created. There are no type restrictions, but the value type needs to - support support addition, subtraction, and comparison. + support addition, subtraction, and comparison. * The :meth:`elements` method requires integer counts. It ignores zero and negative counts. diff --git a/Doc/library/concurrent.futures.rst b/Doc/library/concurrent.futures.rst --- a/Doc/library/concurrent.futures.rst +++ b/Doc/library/concurrent.futures.rst @@ -14,7 +14,7 @@ The :mod:`concurrent.futures` module provides a high-level interface for asynchronously executing callables. -The asynchronous execution can be be performed with threads, using +The asynchronous execution can be performed with threads, using :class:`ThreadPoolExecutor`, or separate processes, using :class:`ProcessPoolExecutor`. Both implement the same interface, which is defined by the abstract :class:`Executor` class. diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -1966,7 +1966,7 @@ .. function:: string_at(address, size=-1) - This function returns the C string starting at memory address address as a bytes + This function returns the C string starting at memory address *address* as a bytes object. If size is specified, it is used as size, otherwise the string is assumed to be zero-terminated. diff --git a/Doc/library/email.message.rst b/Doc/library/email.message.rst --- a/Doc/library/email.message.rst +++ b/Doc/library/email.message.rst @@ -291,7 +291,7 @@ Content-Disposition: attachment; filename="bud.gif" - An example with with non-ASCII characters:: + An example with non-ASCII characters:: msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fu?baller.ppt')) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -828,7 +828,7 @@ .. note:: Python doesn't depend on the underlying operating system's notion of text - files; all the the processing is done by Python itself, and is therefore + files; all the processing is done by Python itself, and is therefore platform-independent. *buffering* is an optional integer used to set the buffering policy. Pass 0 diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst --- a/Doc/library/http.client.rst +++ b/Doc/library/http.client.rst @@ -435,7 +435,7 @@ Set the host and the port for HTTP Connect Tunnelling. Normally used when it is required to a HTTPS Connection through a proxy server. - The headers argument should be a mapping of extra HTTP headers to to sent + The headers argument should be a mapping of extra HTTP headers to sent with the CONNECT request. .. versionadded:: 3.2 diff --git a/Doc/library/mailbox.rst b/Doc/library/mailbox.rst --- a/Doc/library/mailbox.rst +++ b/Doc/library/mailbox.rst @@ -780,7 +780,7 @@ There is no requirement that :class:`Message` instances be used to represent messages retrieved using :class:`Mailbox` instances. In some situations, the time and memory required to generate :class:`Message` representations might - not not acceptable. For such situations, :class:`Mailbox` instances also + not be acceptable. For such situations, :class:`Mailbox` instances also offer string and file-like representations, and a custom message factory may be specified when a :class:`Mailbox` instance is initialized. diff --git a/Doc/library/mmap.rst b/Doc/library/mmap.rst --- a/Doc/library/mmap.rst +++ b/Doc/library/mmap.rst @@ -263,7 +263,7 @@ .. method:: write_byte(byte) - Write the the integer *byte* into memory at the current + Write the integer *byte* into memory at the current position of the file pointer; the file position is advanced by ``1``. If the mmap was created with :const:`ACCESS_READ`, then writing to it will raise a :exc:`TypeError` exception. diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -1518,7 +1518,7 @@ a new shared object -- see documentation for the *method_to_typeid* argument of :meth:`BaseManager.register`. - If an exception is raised by the call, then then is re-raised by + If an exception is raised by the call, then is re-raised by :meth:`_callmethod`. If some other exception is raised in the manager's process then this is converted into a :exc:`RemoteError` exception and is raised by :meth:`_callmethod`. @@ -1655,7 +1655,7 @@ The *chunksize* argument is the same as the one used by the :meth:`.map` method. For very long iterables using a large value for *chunksize* can - make make the job complete **much** faster than using the default value of + make the job complete **much** faster than using the default value of ``1``. Also if *chunksize* is ``1`` then the :meth:`!next` method of the iterator diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1325,7 +1325,7 @@ .. function:: writev(fd, buffers) - Write the the contents of *buffers* to file descriptor *fd*, where *buffers* + Write the contents of *buffers* to file descriptor *fd*, where *buffers* is an arbitrary sequence of buffers. Returns the total number of bytes written. diff --git a/Doc/library/packaging.command.rst b/Doc/library/packaging.command.rst --- a/Doc/library/packaging.command.rst +++ b/Doc/library/packaging.command.rst @@ -74,7 +74,7 @@ Set final values for all the options that this command supports. This is always called as late as possible, i.e. after any option assignments from the command line or from other commands have been done. Thus, this is the place - to to code option dependencies: if *foo* depends on *bar*, then it is safe to + to code option dependencies: if *foo* depends on *bar*, then it is safe to set *foo* from *bar* as long as *foo* still has the same value it was assigned in :meth:`initialize_options`. diff --git a/Doc/library/packaging.install.rst b/Doc/library/packaging.install.rst --- a/Doc/library/packaging.install.rst +++ b/Doc/library/packaging.install.rst @@ -32,7 +32,7 @@ prefer_final=True) Return information about what's going to be installed and upgraded. - *requirements* is a string string containing the requirements for this + *requirements* is a string containing the requirements for this project, for example ``'FooBar 1.1'`` or ``'BarBaz (<1.2)'``. .. XXX are requirements comma-separated? diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -243,7 +243,7 @@ .. method:: Connection.commit() This method commits the current transaction. If you don't call this method, - anything you did since the last call to ``commit()`` is not visible from from + anything you did since the last call to ``commit()`` is not visible from other database connections. If you wonder why you don't see the data you've written to the database, please check you didn't forget to call this method. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1121,7 +1121,7 @@ characters and there is at least one character, false otherwise. Decimal characters are those from general category "Nd". This category includes digit characters, and all characters - that that can be used to form decimal-radix numbers, e.g. U+0660, + that can be used to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO. diff --git a/Doc/library/string.rst b/Doc/library/string.rst --- a/Doc/library/string.rst +++ b/Doc/library/string.rst @@ -211,7 +211,7 @@ See also the :ref:`formatspec` section. -The *field_name* itself begins with an *arg_name* that is either either a number or a +The *field_name* itself begins with an *arg_name* that is either a number or a keyword. If it's a number, it refers to a positional argument, and if it's a keyword, it refers to a named keyword argument. If the numerical arg_names in a format string are 0, 1, 2, ... in sequence, they can all be omitted (not just some) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -886,7 +886,7 @@ Pass the barrier. When all the threads party to the barrier have called this function, they are all released simultaneously. If a *timeout* is - provided, is is used in preference to any that was supplied to the class + provided, it is used in preference to any that was supplied to the class constructor. The return value is an integer in the range 0 to *parties* -- 1, different diff --git a/Doc/library/tkinter.ttk.rst b/Doc/library/tkinter.ttk.rst --- a/Doc/library/tkinter.ttk.rst +++ b/Doc/library/tkinter.ttk.rst @@ -1240,7 +1240,7 @@ *layoutspec*, if specified, is expected to be a list or some other sequence type (excluding strings), where each item should be a tuple and the first item is the layout name and the second item should have the - format described described in `Layouts`_. + format described in `Layouts`_. To understand the format, see the following example (it is not intended to do anything useful):: diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -478,7 +478,7 @@ **Default parameter values are evaluated when the function definition is executed.** This means that the expression is evaluated once, when the function -is defined, and that that same "pre-computed" value is used for each call. This +is defined, and that the same "pre-computed" value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. diff --git a/Doc/reference/toplevel_components.rst b/Doc/reference/toplevel_components.rst --- a/Doc/reference/toplevel_components.rst +++ b/Doc/reference/toplevel_components.rst @@ -111,6 +111,6 @@ single: input; raw single: readline() (file method) -Note: to read 'raw' input line without interpretation, you can use the the +Note: to read 'raw' input line without interpretation, you can use the :meth:`readline` method of file objects, including ``sys.stdin``. diff --git a/Doc/tutorial/floatingpoint.rst b/Doc/tutorial/floatingpoint.rst --- a/Doc/tutorial/floatingpoint.rst +++ b/Doc/tutorial/floatingpoint.rst @@ -92,7 +92,7 @@ (although some languages may not *display* the difference by default, or in all output modes). -For more pleasant output, you may may wish to use string formatting to produce a limited number of significant digits:: +For more pleasant output, you may wish to use string formatting to produce a limited number of significant digits:: >>> format(math.pi, '.12g') # give 12 significant digits '3.14159265359' diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -947,7 +947,7 @@ :meth:`__len__` method. (Contributed by Raymond Hettinger.) * The methods :meth:`list.__getitem__`, :meth:`dict.__getitem__`, and - :meth:`dict.__contains__` are are now implemented as :class:`method_descriptor` + :meth:`dict.__contains__` are now implemented as :class:`method_descriptor` objects rather than :class:`wrapper_descriptor` objects. This form of access doubles their performance and makes them more suitable for use as arguments to functionals: ``map(mydict.__getitem__, keylist)``. (Contributed by Raymond diff --git a/Lib/configparser.py b/Lib/configparser.py --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -382,7 +382,7 @@ would resolve the "%(dir)s" to the value of dir. All reference expansions are done late, on demand. If a user needs to use a bare % in - a configuration file, she can escape it by writing %%. Other other % usage + a configuration file, she can escape it by writing %%. Other % usage is considered a user error and raises `InterpolationSyntaxError'.""" _KEYCRE = re.compile(r"%\(([^)]+)\)s") diff --git a/Lib/datetime.py b/Lib/datetime.py --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -2053,7 +2053,7 @@ Because we know z.d said z was in daylight time (else [5] would have held and we would have stopped then), and we know z.d != z'.d (else [8] would have held -and we we have stopped then), and there are only 2 possible values dst() can +and we have stopped then), and there are only 2 possible values dst() can return in Eastern, it follows that z'.d must be 0 (which it is in the example, but the reasoning doesn't depend on the example -- it depends on there being two possible dst() outcomes, one zero and the other non-zero). Therefore diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -1020,7 +1020,7 @@ (not erhn.startswith(".") and not ("."+erhn).endswith(domain))): _debug(" effective request-host %s (even with added " - "initial dot) does not end end with %s", + "initial dot) does not end with %s", erhn, domain) return False if (cookie.version > 0 or diff --git a/Lib/msilib/schema.py b/Lib/msilib/schema.py --- a/Lib/msilib/schema.py +++ b/Lib/msilib/schema.py @@ -958,7 +958,7 @@ ('ServiceInstall','StartType','N',0,4,None, None, None, None, 'Type of the service',), ('Shortcut','Name','N',None, None, None, None, 'Filename',None, 'The name of the shortcut to be created.',), ('Shortcut','Description','Y',None, None, None, None, 'Text',None, 'The description for the shortcut.',), -('Shortcut','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table denoting the component whose selection gates the the shortcut creation/deletion.',), +('Shortcut','Component_','N',None, None, 'Component',1,'Identifier',None, 'Foreign key into the Component table denoting the component whose selection gates the shortcut creation/deletion.',), ('Shortcut','Icon_','Y',None, None, 'Icon',1,'Identifier',None, 'Foreign key into the File table denoting the external icon file for the shortcut.',), ('Shortcut','IconIndex','Y',-32767,32767,None, None, None, None, 'The icon index for the shortcut.',), ('Shortcut','Directory_','N',None, None, 'Directory',1,'Identifier',None, 'Foreign key into the Directory table denoting the directory where the shortcut file is created.',), diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -9,7 +9,7 @@ # wrapper for 'threading'. # # Try calling `multiprocessing.doc.main()` to read the html -# documentation in in a webbrowser. +# documentation in a webbrowser. # # # Copyright (c) 2006-2008, R Oudkerk diff --git a/Lib/sched.py b/Lib/sched.py --- a/Lib/sched.py +++ b/Lib/sched.py @@ -94,7 +94,7 @@ restarted. It is legal for both the delay function and the action - function to to modify the queue or to raise an exception; + function to modify the queue or to raise an exception; exceptions are not caught but the scheduler's state remains well-defined so run() may be called again. diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -879,7 +879,7 @@ def test_http_doubleslash(self): # Checks the presence of any unnecessary double slash in url does not # break anything. Previously, a double slash directly after the host - # could could cause incorrect parsing. + # could cause incorrect parsing. h = urllib.request.AbstractHTTPHandler() o = h.parent = MockOpener() diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -9,7 +9,7 @@ RFC3986_BASE = 'http://a/b/c/d;p?q' SIMPLE_BASE = 'http://a/b/c/d' -# A list of test cases. Each test case is a a two-tuple that contains +# A list of test cases. Each test case is a two-tuple that contains # a string with the query and a dictionary with the expected result. parse_qsl_test_cases = [ diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -295,7 +295,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) @@ -354,7 +354,7 @@ global ADDR, PORT, URL ADDR, PORT = serv.socket.getsockname() #connect to IP address directly. This avoids socket.create_connection() - #trying to connect to to "localhost" using all address families, which + #trying to connect to "localhost" using all address families, which #causes slowdown e.g. on vista which supports AF_INET6. The server listens #on AF_INET only. URL = "http://%s:%d"%(ADDR, PORT) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -425,7 +425,7 @@ # to be cyclic. Threads are not allowed into it until it has fully drained # since the previous cycle. In addition, a 'resetting' state exists which is # similar to 'draining' except that threads leave with a BrokenBarrierError, -# and a 'broken' state in which all threads get get the exception. +# and a 'broken' state in which all threads get the exception. class Barrier(_Verbose): """ Barrier. Useful for synchronizing a fixed number of threads diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -1554,8 +1554,8 @@ '''This command is used to indicate whether the entry given by entryPath has children entries and whether the children are visible. mode must be one of open, close or none. If mode is set to open, a (+) - indicator is drawn next the the entry. If mode is set to close, a (-) - indicator is drawn next the the entry. If mode is set to none, no + indicator is drawn next the entry. If mode is set to close, a (-) + indicator is drawn next the entry. If mode is set to none, no indicators will be drawn for this entry. The default mode is none. The open mode indicates the entry has hidden children and this entry can be opened by the user. The close mode indicates that all the children of the @@ -1873,13 +1873,13 @@ return self.tk.call(self, 'info', 'bbox', x, y) def move_column(self, from_, to, offset): - """Moves the the range of columns from position FROM through TO by + """Moves the range of columns from position FROM through TO by the distance indicated by OFFSET. For example, move_column(2, 4, 1) moves the columns 2,3,4 to columns 3,4,5.""" self.tk.call(self, 'move', 'column', from_, to, offset) def move_row(self, from_, to, offset): - """Moves the the range of rows from position FROM through TO by + """Moves the range of rows from position FROM through TO by the distance indicated by OFFSET. For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.""" self.tk.call(self, 'move', 'row', from_, to, offset) @@ -1938,7 +1938,7 @@ pad0 pixels Specifies the paddings to the top of a row. pad1 pixels - Specifies the paddings to the the bottom of a row. + Specifies the paddings to the bottom of a row. size val Specifies the height of a row. Val may be: "auto" -- the height of the row is set the diff --git a/Lib/tkinter/ttk.py b/Lib/tkinter/ttk.py --- a/Lib/tkinter/ttk.py +++ b/Lib/tkinter/ttk.py @@ -37,7 +37,7 @@ import os tilelib = os.environ.get('TILE_LIBRARY') if tilelib: - # append custom tile path to the the list of directories that + # append custom tile path to the list of directories that # Tcl uses when attempting to resolve packages with the package # command master.tk.eval( diff --git a/Lib/turtle.py b/Lib/turtle.py --- a/Lib/turtle.py +++ b/Lib/turtle.py @@ -96,7 +96,7 @@ docstrings to disc, so it can serve as a template for translations. Behind the scenes there are some features included with possible -extensions in in mind. These will be commented and documented elsewhere. +extensions in mind. These will be commented and documented elsewhere. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 11:45:15 2011 From: python-checkins at python.org (florent.xicluna) Date: Wed, 19 Oct 2011 11:45:15 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_warning_while_building_?= =?utf8?q?documentation=2E?= Message-ID: http://hg.python.org/cpython/rev/3bed4b7b46a9 changeset: 72987:3bed4b7b46a9 user: Florent Xicluna date: Wed Oct 19 11:44:51 2011 +0200 summary: Fix warning while building documentation. files: Doc/library/urllib.request.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -399,8 +399,8 @@ ``'GET'`` if :attr:`Request.data` is ``None``, or ``'POST'`` if it's not. This is only meaningful for HTTP requests. - .. versionchanged:: 3.3 - get_method now looks at the value of :attr:`Request.method` first. + .. versionchanged:: 3.3 + get_method now looks at the value of :attr:`Request.method` first. .. method:: Request.has_data() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 18:53:06 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 18:53:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_closes_Issu?= =?utf8?q?e12529_-_cgi=2Eparse=5Fheader_failure_on_double_quotes_and?= Message-ID: http://hg.python.org/cpython/rev/489237756488 changeset: 72988:489237756488 branch: 2.7 parent: 72984:86e3943d0d5b user: Senthil Kumaran date: Thu Oct 20 00:52:24 2011 +0800 summary: Fix closes Issue12529 - cgi.parse_header failure on double quotes and semicolons. Patch by Ben Darnell and Petri Lehtinen. files: Lib/cgi.py | 2 +- Lib/test/test_cgi.py | 3 +++ 2 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -293,7 +293,7 @@ while s[:1] == ';': s = s[1:] end = s.find(';') - while end > 0 and s.count('"', 0, end) % 2: + while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: end = s.find(';', end + 1) if end < 0: end = len(s) diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -377,6 +377,9 @@ self.assertEqual( cgi.parse_header('attachment; filename="strange;name";size=123;'), ("attachment", {"filename": "strange;name", "size": "123"})) + self.assertEqual( + cgi.parse_header('form-data; name="files"; filename="fo\\"o;bar"'), + ("form-data", {"name": "files", "filename": 'fo"o;bar'})) def test_main(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 19:07:12 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 19:07:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_3=2E2_-_Fix_clo?= =?utf8?q?ses_Issue12529_-_cgi=2Eparse=5Fheader_failure_on_double_quotes_a?= =?utf8?q?nd?= Message-ID: http://hg.python.org/cpython/rev/f5bd78b11275 changeset: 72989:f5bd78b11275 branch: 3.2 parent: 72985:e19ccbbe70dd user: Senthil Kumaran date: Thu Oct 20 01:05:44 2011 +0800 summary: 3.2 - Fix closes Issue12529 - cgi.parse_header failure on double quotes and semicolons. Patch by Ben Darnell and Petri Lehtinen. files: Lib/cgi.py | 2 +- Lib/test/test_cgi.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -291,7 +291,7 @@ while s[:1] == ';': s = s[1:] end = s.find(';') - while end > 0 and s.count('"', 0, end) % 2: + while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: end = s.find(';', end + 1) if end < 0: end = len(s) diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -348,6 +348,10 @@ self.assertEqual( cgi.parse_header('attachment; filename="strange;name";size=123;'), ("attachment", {"filename": "strange;name", "size": "123"})) + self.assertEqual( + cgi.parse_header('form-data; name="files"; filename="fo\\"o;bar"'), + ("form-data", {"name": "files", "filename": 'fo"o;bar'})) + BOUNDARY = "---------------------------721837373350705526688164684" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 19:07:13 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 19:07:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_default_-_Fix_closes_Issue12529_-_cgi=2Eparse=5Fheader_failu?= =?utf8?q?re_on_double_quotes_and?= Message-ID: http://hg.python.org/cpython/rev/8564d2b240b6 changeset: 72990:8564d2b240b6 parent: 72987:3bed4b7b46a9 parent: 72989:f5bd78b11275 user: Senthil Kumaran date: Thu Oct 20 01:06:59 2011 +0800 summary: default - Fix closes Issue12529 - cgi.parse_header failure on double quotes and semicolons. Patch by Ben Darnell and Petri Lehtinen. files: Lib/cgi.py | 2 +- Lib/test/test_cgi.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git a/Lib/cgi.py b/Lib/cgi.py --- a/Lib/cgi.py +++ b/Lib/cgi.py @@ -300,7 +300,7 @@ while s[:1] == ';': s = s[1:] end = s.find(';') - while end > 0 and s.count('"', 0, end) % 2: + while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: end = s.find(';', end + 1) if end < 0: end = len(s) diff --git a/Lib/test/test_cgi.py b/Lib/test/test_cgi.py --- a/Lib/test/test_cgi.py +++ b/Lib/test/test_cgi.py @@ -342,6 +342,10 @@ self.assertEqual( cgi.parse_header('attachment; filename="strange;name";size=123;'), ("attachment", {"filename": "strange;name", "size": "123"})) + self.assertEqual( + cgi.parse_header('form-data; name="files"; filename="fo\\"o;bar"'), + ("form-data", {"name": "files", "filename": 'fo"o;bar'})) + BOUNDARY = "---------------------------721837373350705526688164684" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 19:52:58 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 19:52:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_closes_Issu?= =?utf8?q?e6090_-_Raise_a_ValueError=2C_instead_of_failing_with_unrelated?= Message-ID: http://hg.python.org/cpython/rev/649ac338203f changeset: 72991:649ac338203f branch: 2.7 parent: 72988:489237756488 user: Senthil Kumaran date: Thu Oct 20 01:38:35 2011 +0800 summary: Fix closes Issue6090 - Raise a ValueError, instead of failing with unrelated exceptions, when a document with timestamp earlier than 1980 is provided to zipfile. Patch contributed by Petri Lehtinen. files: Doc/library/zipfile.rst | 6 +++++- Lib/test/test_zipfile.py | 10 ++++++++++ Lib/zipfile.py | 4 ++++ Misc/NEWS | 3 +++ 4 files changed, 22 insertions(+), 1 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -388,7 +388,7 @@ +-------+--------------------------+ | Index | Value | +=======+==========================+ - | ``0`` | Year | + | ``0`` | Year (>= 1980) | +-------+--------------------------+ | ``1`` | Month (one-based) | +-------+--------------------------+ @@ -401,6 +401,10 @@ | ``5`` | Seconds (zero-based) | +-------+--------------------------+ + .. note:: + + The ZIP file format does not support timestamps before 1980. + .. attribute:: ZipInfo.compress_type diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -477,6 +477,12 @@ except zipfile.BadZipfile: self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') + def test_add_file_before_1980(self): + # Set atime and mtime to 1970-01-01 + os.utime(TESTFN, (0, 0)) + with zipfile.ZipFile(TESTFN2, "w") as zipfp: + self.assertRaises(ValueError, zipfp.write, TESTFN) + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) @@ -990,6 +996,10 @@ pass self.assertRaises(zipfile.BadZipfile, zipfile.ZipFile, TESTFN, 'r') + def test_create_zipinfo_before_1980(self): + self.assertRaises(ValueError, + zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) diff --git a/Lib/zipfile.py b/Lib/zipfile.py --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -290,6 +290,10 @@ self.filename = filename # Normalized file name self.date_time = date_time # year, month, day, hour, min, sec + + if date_time[0] < 1980: + raise ValueError('ZIP does not support timestamps before 1980') + # Standard values: self.compress_type = ZIP_STORED # Type of compression for the file self.comment = "" # Comment for each file diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -63,6 +63,9 @@ Library ------- +- Issue #6090: zipfile raises a ValueError when a document with a timestamp + earlier than 1980 is provided. Patch contributed by Petri Lehtinen. + - Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 19:52:59 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 19:52:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_3=2E2_-_Fix_clo?= =?utf8?q?ses_Issue6090_-_Raise_a_ValueError=2C_instead_of_failing_with?= Message-ID: http://hg.python.org/cpython/rev/12f3e86e9041 changeset: 72992:12f3e86e9041 branch: 3.2 parent: 72989:f5bd78b11275 user: Senthil Kumaran date: Thu Oct 20 01:46:00 2011 +0800 summary: 3.2 - Fix closes Issue6090 - Raise a ValueError, instead of failing with unrelated exceptions, when a document with timestamp earlier than 1980 is provided to zipfile. Patch contributed by Petri Lehtinen. files: Doc/library/zipfile.rst | 6 +++++- Lib/test/test_zipfile.py | 11 +++++++++++ Lib/zipfile.py | 4 ++++ Misc/NEWS | 3 +++ 4 files changed, 23 insertions(+), 1 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -398,7 +398,7 @@ +-------+--------------------------+ | Index | Value | +=======+==========================+ - | ``0`` | Year | + | ``0`` | Year (>= 1980) | +-------+--------------------------+ | ``1`` | Month (one-based) | +-------+--------------------------+ @@ -411,6 +411,10 @@ | ``5`` | Seconds (zero-based) | +-------+--------------------------+ + .. note:: + + The ZIP file format does not support timestamps before 1980. + .. attribute:: ZipInfo.compress_type diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -507,6 +507,13 @@ except zipfile.BadZipFile: self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') + def test_add_file_before_1980(self): + # Set atime and mtime to 1970-01-01 + os.utime(TESTFN, (0, 0)) + with zipfile.ZipFile(TESTFN2, "w") as zipfp: + self.assertRaises(ValueError, zipfp.write, TESTFN) + + @skipUnless(zlib, "requires zlib") def test_unicode_filenames(self): # bug #10801 @@ -1053,6 +1060,10 @@ f.close() self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN, 'r') + def test_create_zipinfo_before_1980(self): + self.assertRaises(ValueError, + zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) diff --git a/Lib/zipfile.py b/Lib/zipfile.py --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -300,6 +300,10 @@ self.filename = filename # Normalized file name self.date_time = date_time # year, month, day, hour, min, sec + + if date_time[0] < 1980: + raise ValueError('ZIP does not support timestamps before 1980') + # Standard values: self.compress_type = ZIP_STORED # Type of compression for the file self.comment = b"" # Comment for each file diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,9 @@ - Issue #12448: smtplib now flushes stdout while running ``python -m smtplib`` in order to display the prompt correctly. +- Issue #6090: zipfile raises a ValueError when a document with a timestamp + earlier than 1980 is provided. Patch contributed by Petri Lehtinen. + - Issue #13194: zlib.compressobj().copy() and zlib.decompressobj().copy() are now available on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 19:53:00 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 19:53:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_default_-_Fix_closes_Issue6090_-_Raise_a_ValueError=2C_inste?= =?utf8?q?ad_of_failing_with?= Message-ID: http://hg.python.org/cpython/rev/55318658e1be changeset: 72993:55318658e1be parent: 72990:8564d2b240b6 parent: 72992:12f3e86e9041 user: Senthil Kumaran date: Thu Oct 20 01:52:41 2011 +0800 summary: default - Fix closes Issue6090 - Raise a ValueError, instead of failing with unrelated exceptions, when a document with timestamp earlier than 1980 is provided to zipfile. Patch contributed by Petri Lehtinen. files: Doc/library/zipfile.rst | 6 +++++- Lib/test/test_zipfile.py | 16 ++++++++++++++++ Lib/zipfile.py | 4 ++++ Misc/NEWS | 3 +++ 4 files changed, 28 insertions(+), 1 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -398,7 +398,7 @@ +-------+--------------------------+ | Index | Value | +=======+==========================+ - | ``0`` | Year | + | ``0`` | Year (>= 1980) | +-------+--------------------------+ | ``1`` | Month (one-based) | +-------+--------------------------+ @@ -411,6 +411,10 @@ | ``5`` | Seconds (zero-based) | +-------+--------------------------+ + .. note:: + + The ZIP file format does not support timestamps before 1980. + .. attribute:: ZipInfo.compress_type diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -500,6 +500,18 @@ except zipfile.BadZipFile: self.assertTrue(zipfp2.fp is None, 'zipfp is not closed') + def test_add_file_before_1980(self): + # Set atime and mtime to 1970-01-01 + os.utime(TESTFN, (0, 0)) + with zipfile.ZipFile(TESTFN2, "w") as zipfp: + self.assertRaises(ValueError, zipfp.write, TESTFN) + + + + + + + @requires_zlib def test_unicode_filenames(self): # bug #10801 @@ -1046,6 +1058,10 @@ f.close() self.assertRaises(zipfile.BadZipFile, zipfile.ZipFile, TESTFN, 'r') + def test_create_zipinfo_before_1980(self): + self.assertRaises(ValueError, + zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0)) + def tearDown(self): unlink(TESTFN) unlink(TESTFN2) diff --git a/Lib/zipfile.py b/Lib/zipfile.py --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -300,6 +300,10 @@ self.filename = filename # Normalized file name self.date_time = date_time # year, month, day, hour, min, sec + + if date_time[0] < 1980: + raise ValueError('ZIP does not support timestamps before 1980') + # Standard values: self.compress_type = ZIP_STORED # Type of compression for the file self.comment = b"" # Comment for each file diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -319,6 +319,9 @@ Library ------- +- Issue #6090: zipfile raises a ValueError when a document with a timestamp + earlier than 1980 is provided. Patch contributed by Petri Lehtinen. + - Issue #13150: sysconfig no longer parses the Makefile and config.h files when imported, instead doing it at build time. This makes importing sysconfig faster and reduces Python startup time by 20%. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:17:16 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:17:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_Issue_12604?= =?utf8?q?_-_Use_a_proper_no-op_macro_expansion_for_VTRACE_macro_in_=5Fsre?= =?utf8?q?=2Ec?= Message-ID: http://hg.python.org/cpython/rev/f35514dfadf8 changeset: 72994:f35514dfadf8 branch: 2.7 parent: 72991:649ac338203f user: Senthil Kumaran date: Thu Oct 20 02:13:23 2011 +0800 summary: Fix Issue 12604 - Use a proper no-op macro expansion for VTRACE macro in _sre.c files: Modules/_sre.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2744,7 +2744,7 @@ #if defined(VVERBOSE) #define VTRACE(v) printf v #else -#define VTRACE(v) +#define VTRACE(v) do {} while(0) /* do nothing */ #endif /* Report failure */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:17:16 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:17:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_3=2E2_-_Fix_Iss?= =?utf8?q?ue_12604_-_Use_a_proper_no-op_macro_expansion_for_VTRACE_macro_i?= =?utf8?q?n?= Message-ID: http://hg.python.org/cpython/rev/ab028084f704 changeset: 72995:ab028084f704 branch: 3.2 parent: 72992:12f3e86e9041 user: Senthil Kumaran date: Thu Oct 20 02:15:36 2011 +0800 summary: 3.2 - Fix Issue 12604 - Use a proper no-op macro expansion for VTRACE macro in _sre.c files: Modules/_sre.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2760,7 +2760,7 @@ #if defined(VVERBOSE) #define VTRACE(v) printf v #else -#define VTRACE(v) +#define VTRACE(v) do {} while(0) /* do nothing */ #endif /* Report failure */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:17:17 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:17:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_default_-_Fix_closes_Issue_12604_-_Use_a_proper_no-op_macro_?= =?utf8?q?expansion_for?= Message-ID: http://hg.python.org/cpython/rev/847afc310190 changeset: 72996:847afc310190 parent: 72993:55318658e1be parent: 72995:ab028084f704 user: Senthil Kumaran date: Thu Oct 20 02:16:59 2011 +0800 summary: default - Fix closes Issue 12604 - Use a proper no-op macro expansion for VTRACE macro in _sre.c Patch by Petri Lehtinen and Josh Triplett. files: Modules/_sre.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_sre.c b/Modules/_sre.c --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -2730,7 +2730,7 @@ #if defined(VVERBOSE) #define VTRACE(v) printf v #else -#define VTRACE(v) +#define VTRACE(v) do {} while(0) /* do nothing */ #endif /* Report failure */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:27:54 2011 From: python-checkins at python.org (martin.v.loewis) Date: Wed, 19 Oct 2011 20:27:54 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Introduce_=2Epyp_directories?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/peps/rev/0a200e493d52 changeset: 3968:0a200e493d52 user: Martin v. Loewis date: Wed Oct 19 20:27:52 2011 +0200 summary: Introduce .pyp directories. files: pep-0382.txt | 121 +++++++++++++++++++------------------- 1 files changed, 62 insertions(+), 59 deletions(-) diff --git a/pep-0382.txt b/pep-0382.txt --- a/pep-0382.txt +++ b/pep-0382.txt @@ -90,51 +90,31 @@ ============= Rather than using an imperative mechanism for importing packages, a -declarative approach is proposed here, as an extension to the existing -``*.pth`` mechanism available on the top-level python path. +declarative approach is proposed here: A directory whose name ends +with ``.pyp`` (for Python package) contains a portion of a package. -The import statement is extended so that it directly considers -``*.pth`` files during import; a directory is considered a package if -it either contains a file named __init__.py, or a file whose name ends -with ".pth". Unlike .pth files on the top level, lines starting with -"import" are not supported in per-package .pth files. - -In addition, the format of the ``*.pth`` file is extended: a line with -the single character ``*`` indicates that the entire sys.path will -be searched for portions of the namespace package at the time the -namespace packages is imported. For a sub-package, the package's -__path__ is searched (instead of sys.path). - -Importing a package will immediately compute the package's __path__; -the ``*.pth`` files are not considered anymore after the initial -import. If a ``*.pth`` package contains an asterisk, this asterisk is -prepended to the package's __path__ to indicate that the package is a -namespace package (and that thus further extensions to sys.path might -also want to extend __path__). At most one such asterisk gets -prepended to the path. In addition, the (possibly dotted) names of all -namespace packages are added to the set sys.namespace_packages. - -If the first directory found on the path only contains an __init__.py -and no \*.pth file, searching the path stops; IOW, namespace packages -must include at least one .pth file. If both \*.pth files and an -__init__.py had been found, search continues looking for further -.pth files. +The import statement is extended so that computes the package's +``__path__`` attribute for a package named ``P`` as consisting of all +directories named ``P.pyp``, plus optionally a single directory named +``P`` containing a file ``__init__.py``. If either of these are +found on the path of the parent package (or sys.path for a top-level +package), search for additional portions of the package continues. No other change to the importing mechanism is made; searching modules (including __init__.py) will continue to stop at the first module encountered. In summary, the process import a package foo works like this: - 1. sys.path is search for a directory foo, or a file foo.. + 1. sys.path is searched for directories foo or foo.pyp, or a file foo.. If a file is found and no directory, it is treated as a module, and imported. - 2. if it is a directory, it checks for both \*.pth and an __init__ file. If it finds - only \*.pth files, a package is created, and its __path__ is extended. - 3. If neither a \*.pth file nor an __init__.py was found, the - directory is skipped, and search for the module/package - continues. If an __init__.py was found, further search only looks - for \*.pth files. + 2. If a directory foo is found, a check is made whether it contains __init__.py. + If so, the location of the __init__.py is remembered. Otherwise, the directory + is skipped. Once an __init__.py is found, further directories called foo are + skipped. + 3. For both directories foo and foo.pyp, the directories are added to the package's + __path__. 4. If an __init__ module was found, it is imported, with __path__ - being initialized to the path computed from the \*.pth files. + being initialized to the path computed all ``.pyp`` directories. Impact on Import Hooks ---------------------- @@ -146,41 +126,63 @@ AttributeError when the functions below get accessed. Finders need to support looking for \*.pth files in step 1 of above -algorithm. To do so, a finder must support a method: +algorithm. To do so, a finder used as a path hook must support a +method: - finder.find_path(fullname, path=None) + finder.is_package_portion(fullname) This method will be called in the same manner as find_module, and it -must return a list of strings, each representing the contents of one -\*.pth file. If fullname is not found, is not a package, or does not -have any \*.pth files, None must be returned. +must return True if there is a package portion with that name; False +if fullname indicates a subpackage/submodule that is not a package +portion; otherwise, it shall raise an ImportError. -If any \*.pth files are found, but no loader was returned from +If any \*.pyp directories are found, but no loader was returned from find_module, a package is created and initialized with the path. -If a loader was return, but no \*.pth files, load_module is called -as defined in PEP 302. +If a loader was return, but no \*.pyp directories, load_module is +called as defined in PEP 302. -If both \*.pth files where found, and a loader was returned, a new -method is called on the loader: +If both \*.pyp directories where found, and a loader was returned, a +new method is called on the loader: loader.load_module_with_path(load_module, path) -where the path parameter is the list of strings containing the -contents of all \*.pth files. +where the path parameter is the list that will become the __path__ +attribute of the new package. Discussion ========== -With the addition of ``*.pth`` files to the import mechanism, namespace -packages can stop filling out the namespace package's __init__.py. -As a consequence, extend_path and declare_namespace become obsolete. +Original versions of this specification proposed the addition of +``*.pth`` files, similar to the way those files are used on sys.path. +With a wildcard marker (``*``), a package could indicate that the +entire path is derived by looking at the parent path, searching for +properly-named subdirectories. -It is recommended that distributions put a file .pth -into their namespace packages, with a single asterisk. This allows -vendor packages to install multiple portions of namespace package -into a single directory, with no risk of overlapping files. +People then observed that the support for the full .pth syntax is +inappropriate, and the .pth files were changed to be mere marker +files, indicating that a directories is a package. Peter Tr?ger +suggested that .pth is an unsuitable file extension, as all file +extensions related to Python should start with ``.py``. Therefore, the +marker file was renamed to be ``.pyp``. + +Dinu Gherman then observed that using a marker file is not necessary, +and that a directoy extension could well serve as a such as a +marker. This is what this PEP currently proposes. + +Phillip Eby designed PEP 402 as an alternative approach to this PEP, +after comparing Python's package syntax with that found in other +languages. PEP 402 proposes not to use a marker file at all. At the +discussion at PyCon DE 2011, people remarked that having an explicit +declaration of a directory as contributing to a package is a desirable +property, rather than an obstactle. In particular, Jython developers +noticed that Jython could easily mistake a directory that is a Java +package as being a Python package, if there is no need to declare +Python packages. + +packages can stop filling out the namespace package's __init__.py. As +a consequence, extend_path and declare_namespace become obsolete. Namespace packages can start providing non-trivial __init__.py implementations; to do so, it is recommended that a single distribution @@ -195,10 +197,11 @@ It has been proposed to also add this feature to Python 2.7. Given that 2.x reaches its end-of-life, it is questionable whether the -addition of the feature would really do more good than harm (in -having users and tools starting to special-case 2.7). Prospective -users of this feature are encouraged to comment on this particular -question. +addition of the feature would really do more good than harm (in having +users and tools starting to special-case 2.7). Prospective users of +this feature are encouraged to comment on this particular question. In +addition, Python 2.7 is in bug-fix mode now, so adding new features to +it would be a violation of the established policies. Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 19 20:37:19 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:37:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Doc_improvements_suggested_?= =?utf8?q?by_=C3=89ric_Araujo_for_the_new_=27HEAD=27_Request_feature=2E?= Message-ID: http://hg.python.org/cpython/rev/554048b22e07 changeset: 72997:554048b22e07 user: Senthil Kumaran date: Thu Oct 20 02:37:08 2011 +0800 summary: Doc improvements suggested by ?ric Araujo for the new 'HEAD' Request feature. files: Doc/library/urllib.request.rst | 12 ++++++------ Doc/whatsnew/3.3.rst | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -177,7 +177,7 @@ *method* should be a string that indicates the HTTP request method that will be used (e.g. ``'HEAD'``). Its value is stored in the - :attr:`Request.method` attribute and is used by :meth:`Request.get_method()`. + :attr:`~Request.method` attribute and is used by :meth:`get_method()`. .. versionchanged:: 3.3 :attr:`Request.method` argument is added to the Request class. @@ -379,11 +379,11 @@ .. attribute:: Request.method The HTTP request method to use. This value is used by - :meth:`Request.get_method` to override the computed HTTP request - method that would otherwise be returned. This attribute is - initialized with the value of the *method* argument passed to the constructor. + :meth:`~Request.get_method` to override the computed HTTP request + method that would otherwise be returned. This attribute is initialized with + the value of the *method* argument passed to the constructor. - ..versionadded:: 3.3 + .. versionadded:: 3.3 .. method:: Request.add_data(data) @@ -400,7 +400,7 @@ This is only meaningful for HTTP requests. .. versionchanged:: 3.3 - get_method now looks at the value of :attr:`Request.method` first. + get_method now looks at the value of :attr:`Request.method`. .. method:: Request.has_data() diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -484,7 +484,7 @@ The :class:`~urllib.request.Request` class, now accepts a *method* argument used by :meth:`~urllib.request.Request.get_method` to determine what HTTP method -should be used. For example, this will send an ``'HEAD'`` request:: +should be used. For example, this will send a ``'HEAD'`` request:: >>> urlopen(Request('http://www.python.org', method='HEAD')) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:50:25 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:50:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_urllib=2Ereques?= =?utf8?q?t_-_syntax_changes_enhancing_readability=2E_By_=C3=89ric_Araujo?= Message-ID: http://hg.python.org/cpython/rev/99a9f0251924 changeset: 72998:99a9f0251924 branch: 3.2 parent: 72995:ab028084f704 user: Senthil Kumaran date: Thu Oct 20 02:48:01 2011 +0800 summary: urllib.request - syntax changes enhancing readability. By ?ric Araujo files: Lib/urllib/request.py | 21 ++++++++++----------- 1 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -552,12 +552,11 @@ # For security reasons we don't allow redirection to anything other # than http, https or ftp. - if not urlparts.scheme in ('http', 'https', 'ftp'): - raise HTTPError(newurl, code, - msg + - " - Redirection to url '%s' is not allowed" % - newurl, - headers, fp) + if urlparts.scheme not in ('http', 'https', 'ftp'): + raise HTTPError( + newurl, code, + "%s - Redirection to url '%s' is not allowed" % (msg, newurl), + headers, fp) if not urlparts.path: urlparts = list(urlparts) @@ -722,7 +721,7 @@ # uri could be a single URI or a sequence if isinstance(uri, str): uri = [uri] - if not realm in self.passwd: + if realm not in self.passwd: self.passwd[realm] = {} for default_port in True, False: reduced_uri = tuple( @@ -1823,7 +1822,7 @@ del self.ftpcache[k] v.close() try: - if not key in self.ftpcache: + if key not in self.ftpcache: self.ftpcache[key] = \ ftpwrapper(user, passwd, host, port, dirs) if not file: type = 'D' @@ -1938,7 +1937,7 @@ # We are using newer HTTPError with older redirect_internal method # This older method will get deprecated in 3.3 - if not urlparts.scheme in ('http', 'https', 'ftp'): + if urlparts.scheme not in ('http', 'https', 'ftp'): raise HTTPError(newurl, errcode, errmsg + " Redirection to url '%s' is not allowed." % newurl, @@ -1965,7 +1964,7 @@ retry=False): """Error 401 -- authentication required. This function supports Basic authentication only.""" - if not 'www-authenticate' in headers: + if 'www-authenticate' not in headers: URLopener.http_error_default(self, url, fp, errcode, errmsg, headers) stuff = headers['www-authenticate'] @@ -1991,7 +1990,7 @@ retry=False): """Error 407 -- proxy authentication required. This function supports Basic authentication only.""" - if not 'proxy-authenticate' in headers: + if 'proxy-authenticate' not in headers: URLopener.http_error_default(self, url, fp, errcode, errmsg, headers) stuff = headers['proxy-authenticate'] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 20:50:26 2011 From: python-checkins at python.org (senthil.kumaran) Date: Wed, 19 Oct 2011 20:50:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_urllib=2Erequest_-_syntax_changes_enhancing_readability=2E_B?= =?utf8?q?y_=C3=89ric_Araujo?= Message-ID: http://hg.python.org/cpython/rev/b083d1039376 changeset: 72999:b083d1039376 parent: 72997:554048b22e07 parent: 72998:99a9f0251924 user: Senthil Kumaran date: Thu Oct 20 02:50:13 2011 +0800 summary: urllib.request - syntax changes enhancing readability. By ?ric Araujo files: Lib/urllib/request.py | 25 ++++++++++++------------- 1 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -557,12 +557,11 @@ # For security reasons we don't allow redirection to anything other # than http, https or ftp. - if not urlparts.scheme in ('http', 'https', 'ftp'): - raise HTTPError(newurl, code, - msg + - " - Redirection to url '%s' is not allowed" % - newurl, - headers, fp) + if urlparts.scheme not in ('http', 'https', 'ftp'): + raise HTTPError( + newurl, code, + "%s - Redirection to url '%s' is not allowed" % (msg, newurl), + headers, fp) if not urlparts.path: urlparts = list(urlparts) @@ -727,7 +726,7 @@ # uri could be a single URI or a sequence if isinstance(uri, str): uri = [uri] - if not realm in self.passwd: + if realm not in self.passwd: self.passwd[realm] = {} for default_port in True, False: reduced_uri = tuple( @@ -831,7 +830,7 @@ if authreq: scheme = authreq.split()[0] - if not scheme.lower() == 'basic': + if scheme.lower() != 'basic': raise ValueError("AbstractBasicAuthHandler does not" " support the following scheme: '%s'" % scheme) @@ -929,7 +928,7 @@ scheme = authreq.split()[0] if scheme.lower() == 'digest': return self.retry_http_digest_auth(req, authreq) - elif not scheme.lower() == 'basic': + elif scheme.lower() != 'basic': raise ValueError("AbstractDigestAuthHandler does not support" " the following scheme: '%s'" % scheme) @@ -1839,7 +1838,7 @@ del self.ftpcache[k] v.close() try: - if not key in self.ftpcache: + if key not in self.ftpcache: self.ftpcache[key] = \ ftpwrapper(user, passwd, host, port, dirs) if not file: type = 'D' @@ -1954,7 +1953,7 @@ # We are using newer HTTPError with older redirect_internal method # This older method will get deprecated in 3.3 - if not urlparts.scheme in ('http', 'https', 'ftp'): + if urlparts.scheme not in ('http', 'https', 'ftp'): raise HTTPError(newurl, errcode, errmsg + " Redirection to url '%s' is not allowed." % newurl, @@ -1981,7 +1980,7 @@ retry=False): """Error 401 -- authentication required. This function supports Basic authentication only.""" - if not 'www-authenticate' in headers: + if 'www-authenticate' not in headers: URLopener.http_error_default(self, url, fp, errcode, errmsg, headers) stuff = headers['www-authenticate'] @@ -2007,7 +2006,7 @@ retry=False): """Error 407 -- proxy authentication required. This function supports Basic authentication only.""" - if not 'proxy-authenticate' in headers: + if 'proxy-authenticate' not in headers: URLopener.http_error_default(self, url, fp, errcode, errmsg, headers) stuff = headers['proxy-authenticate'] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:08:00 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:08:00 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Kludge_around_shlex_not_?= =?utf8?q?supporting_unicode_in_2=2Ex_=28=2313170=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/cda119958db3 changeset: 1214:cda119958db3 parent: 1212:5d858149df06 user: ?ric Araujo date: Wed Oct 19 03:08:13 2011 +0200 summary: Kludge around shlex not supporting unicode in 2.x (#13170). Thanks to David Barnett for the diagnosis. files: distutils2/config.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/distutils2/config.py b/distutils2/config.py --- a/distutils2/config.py +++ b/distutils2/config.py @@ -43,9 +43,11 @@ continue fields.append(tmp_vals[0]) # Get bash options like `gcc -print-file-name=libgcc.a` XXX bash options? - vals = split(' '.join(fields)) + # kludge around shlex not supporting unicode + vals = u' '.join(fields).encode('utf-8') + vals = split(vals) if vals: - return vals + return [val.decode('utf-8') for val in vals] def _rel_path(base, path): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 19 21:08:00 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:08:00 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Null_merge_default?= Message-ID: http://hg.python.org/distutils2/rev/6b57f8917452 changeset: 1215:6b57f8917452 branch: python3 parent: 1213:34f377176773 parent: 1214:cda119958db3 user: ?ric Araujo date: Wed Oct 19 03:08:54 2011 +0200 summary: Null merge default files: -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 19 21:08:00 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:08:00 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Remove_one_overlooked_wi?= =?utf8?q?th_statement?= Message-ID: http://hg.python.org/distutils2/rev/e469b70fc25e changeset: 1217:e469b70fc25e user: ?ric Araujo date: Wed Oct 19 05:58:37 2011 +0200 summary: Remove one overlooked with statement files: distutils2/compiler/msvc9compiler.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/distutils2/compiler/msvc9compiler.py b/distutils2/compiler/msvc9compiler.py --- a/distutils2/compiler/msvc9compiler.py +++ b/distutils2/compiler/msvc9compiler.py @@ -650,8 +650,11 @@ # runtimes are not in WinSxS folder, but in Python's own # folder), the runtimes do not need to be in every folder # with .pyd's. - with open(manifest_file) as manifest_f: + manifest_f = open(manifest_file) + try: manifest_buf = manifest_f.read() + finally: + manifest_f.close() pattern = re.compile( r"""|)""", @@ -659,8 +662,11 @@ manifest_buf = re.sub(pattern, "", manifest_buf) pattern = "\s*" manifest_buf = re.sub(pattern, "", manifest_buf) - with open(manifest_file, 'w') as manifest_f: + manifest_f = open(manifest_file, 'w') + try: manifest_f.write(manifest_buf) + finally: + manifest_f.close() except IOError: pass -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 19 21:08:00 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:08:00 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Update_short_description?= =?utf8?q?_of_Distutils2?= Message-ID: http://hg.python.org/distutils2/rev/4cf68946937d changeset: 1216:4cf68946937d parent: 1214:cda119958db3 user: ?ric Araujo date: Wed Oct 19 05:57:31 2011 +0200 summary: Update short description of Distutils2 files: setup.cfg | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/setup.cfg b/setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = Distutils2 version = 1.0a3 -summary = Python Distribution Utilities +summary = Python Packaging Library description-file = README.txt home-page = http://bitbucket.org/tarek/distutils2/wiki/Home author = The Fellowship of the Packaging -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Oct 19 21:32:52 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_Victor=E2=80=99s_co?= =?utf8?q?mmit_with_cool_new_2=2E5_idiom?= Message-ID: http://hg.python.org/cpython/rev/70a0c602099e changeset: 73000:70a0c602099e parent: 72975:70160b53117f user: ?ric Araujo date: Wed Oct 19 06:01:57 2011 +0200 summary: Improve Victor?s commit with cool new 2.5 idiom files: setup.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1380,8 +1380,7 @@ # End multiprocessing # Platform-specific libraries - if any(platform.startswith(prefix) - for prefix in ("linux", "freebsd", "gnukfreebsd")): + if platform.startswith(('linux', 'freebsd', 'gnukfreebsd')): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:53 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo?= Message-ID: http://hg.python.org/cpython/rev/3f0657befe1f changeset: 73001:3f0657befe1f user: ?ric Araujo date: Wed Oct 19 06:02:24 2011 +0200 summary: Fix typo files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1448,7 +1448,7 @@ the amount of time needed to run the tests. "make test" and "make quicktest" now include some resource-intensive tests, but no longer run the test suite twice to check for bugs in .pyc generation. Tools/scripts/run_test.py provides - as an easy platform-independent way to run test suite with sensible defaults. + an easy platform-independent way to run test suite with sensible defaults. - Issue #12331: The test suite for the packaging module can now run from an installed Python. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:54 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Expand_tests_and_fix_bugs_i?= =?utf8?q?n_packaging=2Eutil=2Eresolve=5Fname=2E?= Message-ID: http://hg.python.org/cpython/rev/1405df4a1535 changeset: 73002:1405df4a1535 user: ?ric Araujo date: Wed Oct 19 06:46:13 2011 +0200 summary: Expand tests and fix bugs in packaging.util.resolve_name. The code is still ugly, but at least it works better now. Patches to make it easier to read are welcome, as well as support in #12915. files: Lib/packaging/tests/test_util.py | 66 ++++++++++++------- Lib/packaging/util.py | 21 +++++- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -4,6 +4,7 @@ import time import logging import tempfile +import textwrap import subprocess from io import StringIO @@ -375,35 +376,48 @@ 'pkg1.pkg3.pkg6'])) def test_resolve_name(self): - self.assertIs(str, resolve_name('builtins.str')) - self.assertEqual( - UtilTestCase.__name__, - resolve_name("packaging.tests.test_util.UtilTestCase").__name__) - self.assertEqual( - UtilTestCase.test_resolve_name.__name__, - resolve_name("packaging.tests.test_util.UtilTestCase." - "test_resolve_name").__name__) + # test raw module name + tmpdir = self.mkdtemp() + sys.path.append(tmpdir) + self.addCleanup(sys.path.remove, tmpdir) + self.write_file((tmpdir, 'hello.py'), '') - self.assertRaises(ImportError, resolve_name, - "packaging.tests.test_util.UtilTestCaseNot") - self.assertRaises(ImportError, resolve_name, - "packaging.tests.test_util.UtilTestCase." - "nonexistent_attribute") + os.makedirs(os.path.join(tmpdir, 'a', 'b')) + self.write_file((tmpdir, 'a', '__init__.py'), '') + self.write_file((tmpdir, 'a', 'b', '__init__.py'), '') + self.write_file((tmpdir, 'a', 'b', 'c.py'), 'class Foo: pass') + self.write_file((tmpdir, 'a', 'b', 'd.py'), textwrap.dedent("""\ + class FooBar: + class Bar: + def baz(self): + pass + """)) - def test_import_nested_first_time(self): - tmp_dir = self.mkdtemp() - os.makedirs(os.path.join(tmp_dir, 'a', 'b')) - self.write_file(os.path.join(tmp_dir, 'a', '__init__.py'), '') - self.write_file(os.path.join(tmp_dir, 'a', 'b', '__init__.py'), '') - self.write_file(os.path.join(tmp_dir, 'a', 'b', 'c.py'), - 'class Foo: pass') + # check Python, C and built-in module + self.assertEqual(resolve_name('hello').__name__, 'hello') + self.assertEqual(resolve_name('_csv').__name__, '_csv') + self.assertEqual(resolve_name('sys').__name__, 'sys') - try: - sys.path.append(tmp_dir) - resolve_name("a.b.c.Foo") - # assert nothing raised - finally: - sys.path.remove(tmp_dir) + # test module.attr + self.assertIs(resolve_name('builtins.str'), str) + self.assertIsNone(resolve_name('hello.__doc__')) + self.assertEqual(resolve_name('a.b.c.Foo').__name__, 'Foo') + self.assertEqual(resolve_name('a.b.d.FooBar.Bar.baz').__name__, 'baz') + + # error if module not found + self.assertRaises(ImportError, resolve_name, 'nonexistent') + self.assertRaises(ImportError, resolve_name, 'non.existent') + self.assertRaises(ImportError, resolve_name, 'a.no') + self.assertRaises(ImportError, resolve_name, 'a.b.no') + self.assertRaises(ImportError, resolve_name, 'a.b.no.no') + self.assertRaises(ImportError, resolve_name, 'inva-lid') + + # looking up built-in names is not supported + self.assertRaises(ImportError, resolve_name, 'str') + + # error if module found but not attr + self.assertRaises(ImportError, resolve_name, 'a.b.Spam') + self.assertRaises(ImportError, resolve_name, 'a.b.c.Spam') def test_run_2to3_on_code(self): content = "print 'test'" diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -630,22 +630,35 @@ def resolve_name(name): """Resolve a name like ``module.object`` to an object and return it. - Raise ImportError if the module or name is not found. + This functions supports packages and attributes without depth limitation: + ``package.package.module.class.class.function.attr`` is valid input. + However, looking up builtins is not directly supported: use + ``builtins.name``. + + Raises ImportError if importing the module fails or if one requested + attribute is not found. """ + if '.' not in name: + # shortcut + __import__(name) + return sys.modules[name] + + # FIXME clean up this code! parts = name.split('.') cursor = len(parts) module_name = parts[:cursor] + ret = '' while cursor > 0: try: ret = __import__('.'.join(module_name)) break except ImportError: - if cursor == 0: - raise cursor -= 1 module_name = parts[:cursor] - ret = '' + + if ret == '': + raise ImportError(parts[0]) for part in parts[1:]: try: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:55 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_fixes_for_PEP_3147_com?= =?utf8?q?pliance_in_packaging_=28=2311254=29?= Message-ID: http://hg.python.org/cpython/rev/1cc4d822123b changeset: 73003:1cc4d822123b user: ?ric Araujo date: Wed Oct 19 08:18:05 2011 +0200 summary: More fixes for PEP 3147 compliance in packaging (#11254) files: Lib/packaging/command/build_py.py | 6 +- Lib/packaging/command/install_lib.py | 6 +- Lib/packaging/tests/test_command_build_py.py | 35 ++++++++++ Lib/packaging/tests/test_command_install_dist.py | 12 ++- 4 files changed, 51 insertions(+), 8 deletions(-) diff --git a/Lib/packaging/command/build_py.py b/Lib/packaging/command/build_py.py --- a/Lib/packaging/command/build_py.py +++ b/Lib/packaging/command/build_py.py @@ -1,6 +1,7 @@ """Build pure Python modules (just copy to build directory).""" import os +import imp import sys from glob import glob @@ -330,9 +331,10 @@ outputs.append(filename) if include_bytecode: if self.compile: - outputs.append(filename + "c") + outputs.append(imp.cache_from_source(filename)) if self.optimize > 0: - outputs.append(filename + "o") + outputs.append(imp.cache_from_source(filename, + debug_override=False)) outputs += [ os.path.join(build_dir, filename) diff --git a/Lib/packaging/command/install_lib.py b/Lib/packaging/command/install_lib.py --- a/Lib/packaging/command/install_lib.py +++ b/Lib/packaging/command/install_lib.py @@ -1,6 +1,7 @@ """Install all modules (extensions and pure Python).""" import os +import imp import sys import logging @@ -172,9 +173,10 @@ if ext != PYTHON_SOURCE_EXTENSION: continue if self.compile: - bytecode_files.append(py_file + "c") + bytecode_files.append(imp.cache_from_source(py_file)) if self.optimize > 0: - bytecode_files.append(py_file + "o") + bytecode_files.append(imp.cache_from_source( + py_file, debug_override=False)) return bytecode_files diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -102,6 +102,40 @@ os.chdir(cwd) sys.stdout = old_stdout + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') + def test_byte_compile(self): + project_dir, dist = self.create_dist(py_modules=['boiledeggs']) + os.chdir(project_dir) + self.write_file('boiledeggs.py', 'import antigravity') + cmd = build_py(dist) + cmd.compile = True + cmd.build_lib = 'here' + cmd.finalize_options() + cmd.run() + + found = os.listdir(cmd.build_lib) + self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) + found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) + self.assertEqual(found, ['boiledeggs.%s.pyc' % imp.get_tag()]) + + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') + def test_byte_compile_optimized(self): + project_dir, dist = self.create_dist(py_modules=['boiledeggs']) + os.chdir(project_dir) + self.write_file('boiledeggs.py', 'import antigravity') + cmd = build_py(dist) + cmd.compile = True + cmd.optimize = 1 + cmd.build_lib = 'here' + cmd.finalize_options() + cmd.run() + + found = os.listdir(cmd.build_lib) + self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) + found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) + self.assertEqual(sorted(found), ['boiledeggs.%s.pyc' % imp.get_tag(), + 'boiledeggs.%s.pyo' % imp.get_tag()]) + def test_dont_write_bytecode(self): # makes sure byte_compile is not used pkg_dir, dist = self.create_dist() @@ -118,6 +152,7 @@ self.assertIn('byte-compiling is disabled', self.get_logs()[0]) + def test_suite(): return unittest.makeSuite(BuildPyTestCase) diff --git a/Lib/packaging/tests/test_command_install_dist.py b/Lib/packaging/tests/test_command_install_dist.py --- a/Lib/packaging/tests/test_command_install_dist.py +++ b/Lib/packaging/tests/test_command_install_dist.py @@ -1,6 +1,7 @@ """Tests for packaging.command.install.""" import os +import imp import sys from sysconfig import (get_scheme_names, get_config_vars, _SCHEMES, get_config_var, get_path) @@ -181,9 +182,11 @@ def test_old_record(self): # test pre-PEP 376 --record option (outside dist-info dir) install_dir = self.mkdtemp() - project_dir, dist = self.create_dist(scripts=['hello']) + project_dir, dist = self.create_dist(py_modules=['hello'], + scripts=['sayhi']) os.chdir(project_dir) - self.write_file('hello', "print('o hai')") + self.write_file('hello.py', "def main(): print('o hai')") + self.write_file('sayhi', 'from hello import main; main()') cmd = install_dist(dist) dist.command_obj['install_dist'] = cmd @@ -196,8 +199,9 @@ content = f.read() found = [os.path.basename(line) for line in content.splitlines()] - expected = ['hello', 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD'] - self.assertEqual(found, expected) + expected = ['hello.py', 'hello.%s.pyc' % imp.get_tag(), 'sayhi', + 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD'] + self.assertEqual(sorted(found), sorted(expected)) # XXX test that fancy_getopt is okay with options named # record and no-record but unrelated -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:56 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Change_signature_of_packagi?= =?utf8?q?ng=2Etests=2Esupport=2ELoggingCatcher=2Eget=5Flogs=2E?= Message-ID: http://hg.python.org/cpython/rev/c78c617a8bef changeset: 73004:c78c617a8bef user: ?ric Araujo date: Wed Oct 19 08:37:22 2011 +0200 summary: Change signature of packaging.tests.support.LoggingCatcher.get_logs. I need this for some tests, and it makes code clearer. This commit also changes some assertEqual calls to use (actual, expected) order and fix some pyflakes warnings. files: Lib/packaging/tests/support.py | 39 ++++---- Lib/packaging/tests/test_command_check.py | 45 ++++----- Lib/packaging/tests/test_command_cmd.py | 3 +- Lib/packaging/tests/test_command_sdist.py | 12 +- Lib/packaging/tests/test_command_test.py | 3 +- Lib/packaging/tests/test_command_upload_docs.py | 10 +- Lib/packaging/tests/test_config.py | 8 +- Lib/packaging/tests/test_dist.py | 5 +- Lib/packaging/tests/test_manifest.py | 7 +- Lib/packaging/tests/test_metadata.py | 5 +- 10 files changed, 65 insertions(+), 72 deletions(-) diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -82,10 +82,13 @@ configured to record all messages logged to the 'packaging' logger. Use get_logs to retrieve messages and self.loghandler.flush to discard - them. get_logs automatically flushes the logs; if you test code that - generates logging messages but don't use get_logs, you have to flush - manually before doing other checks on logging message, otherwise you - will get irrelevant results. See example in test_command_check. + them. get_logs automatically flushes the logs, unless you pass + *flush=False*, for example to make multiple calls to the method with + different level arguments. If your test calls some code that generates + logging message and then you don't call get_logs, you will need to flush + manually before testing other code in the same test_* method, otherwise + get_logs in the next lines will see messages from the previous lines. + See example in test_command_check. """ def setUp(self): @@ -109,25 +112,23 @@ logger2to3.setLevel(self._old_levels[1]) super(LoggingCatcher, self).tearDown() - def get_logs(self, *levels): - """Return all log messages with level in *levels*. + def get_logs(self, level=logging.WARNING, flush=True): + """Return all log messages with given level. - Without explicit levels given, returns all messages. *levels* defaults - to all levels. For log calls with arguments (i.e. - logger.info('bla bla %r', arg)), the messages will be formatted before - being returned (e.g. "bla bla 'thing'"). + *level* defaults to logging.WARNING. + + For log calls with arguments (i.e. logger.info('bla bla %r', arg)), + the messages will be formatted before being returned (e.g. "bla bla + 'thing'"). Returns a list. Automatically flushes the loghandler after being - called. - - Example: self.get_logs(logging.WARN, logging.DEBUG). + called, unless *flush* is False (this is useful to get e.g. all + warnings then all info messages). """ - if not levels: - messages = [log.getMessage() for log in self.loghandler.buffer] - else: - messages = [log.getMessage() for log in self.loghandler.buffer - if log.levelno in levels] - self.loghandler.flush() + messages = [log.getMessage() for log in self.loghandler.buffer + if log.levelno == level] + if flush: + self.loghandler.flush() return messages diff --git a/Lib/packaging/tests/test_command_check.py b/Lib/packaging/tests/test_command_check.py --- a/Lib/packaging/tests/test_command_check.py +++ b/Lib/packaging/tests/test_command_check.py @@ -1,6 +1,5 @@ """Tests for distutils.command.check.""" -import logging from packaging.command.check import check from packaging.metadata import _HAS_DOCUTILS from packaging.errors import PackagingSetupError, MetadataMissingError @@ -27,11 +26,11 @@ # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings - cmd = self._run() + self._run() # trick: using assertNotEqual with an empty list will give us a more # useful error message than assertGreater(.., 0) when the code change # and the test fails - self.assertNotEqual([], self.get_logs(logging.WARNING)) + self.assertNotEqual(self.get_logs(), []) # now let's add the required fields # and run it again, to make sure we don't get @@ -40,8 +39,8 @@ 'author_email': 'xxx', 'name': 'xxx', 'version': '4.2', } - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata @@ -53,8 +52,8 @@ self.loghandler.flush() # and of course, no error when all metadata fields are present - cmd = self._run(metadata, strict=True) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata, strict=True) + self.assertEqual(self.get_logs(), []) # now a test with non-ASCII characters metadata = {'home_page': 'xxx', 'author': '\u00c9ric', @@ -62,15 +61,15 @@ 'version': '1.2', 'summary': 'Something about esszet \u00df', 'description': 'More things about esszet \u00df'} - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings - cmd = self._run() - self.assertNotEqual([], self.get_logs(logging.WARNING)) + self._run() + self.assertNotEqual(self.get_logs(), []) # now let's add the required fields and run it again, to make sure we # don't get any warning anymore let's use requires_python as a marker @@ -80,8 +79,8 @@ 'name': 'xxx', 'version': '4.2', 'requires_python': '2.4', } - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata @@ -99,8 +98,8 @@ # now with correct version format again metadata['version'] = '4.2' - cmd = self._run(metadata, strict=True) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata, strict=True) + self.assertEqual(self.get_logs(), []) @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): @@ -109,9 +108,7 @@ pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() - self.assertEqual(len(self.get_logs(logging.WARNING)), 1) - # clear warnings from the previous call - self.loghandler.flush() + self.assertEqual(len(self.get_logs()), 1) # let's see if we have an error with strict=1 metadata = {'home_page': 'xxx', 'author': 'xxx', @@ -126,7 +123,7 @@ dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) def test_check_all(self): self.assertRaises(PackagingSetupError, self._run, @@ -143,18 +140,18 @@ } cmd = check(dist) cmd.check_hooks_resolvable() - self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + self.assertEqual(len(self.get_logs()), 1) def test_warn(self): _, dist = self.create_dist() cmd = check(dist) - self.assertEqual([], self.get_logs()) + self.assertEqual(self.get_logs(), []) cmd.warn('hello') - self.assertEqual(['check: hello'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello']) cmd.warn('hello %s', 'world') - self.assertEqual(['check: hello world'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello world']) cmd.warn('hello %s %s', 'beautiful', 'world') - self.assertEqual(['check: hello beautiful world'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello beautiful world']) def test_suite(): diff --git a/Lib/packaging/tests/test_command_cmd.py b/Lib/packaging/tests/test_command_cmd.py --- a/Lib/packaging/tests/test_command_cmd.py +++ b/Lib/packaging/tests/test_command_cmd.py @@ -1,5 +1,6 @@ """Tests for distutils.cmd.""" import os +import logging from packaging.command.cmd import Command from packaging.dist import Distribution @@ -43,7 +44,7 @@ wanted = ["command options for 'MyCmd':", ' option1 = 1', ' option2 = 1'] - msgs = self.get_logs() + msgs = self.get_logs(logging.INFO) self.assertEqual(msgs, wanted) def test_ensure_string(self): diff --git a/Lib/packaging/tests/test_command_sdist.py b/Lib/packaging/tests/test_command_sdist.py --- a/Lib/packaging/tests/test_command_sdist.py +++ b/Lib/packaging/tests/test_command_sdist.py @@ -2,7 +2,6 @@ import os import zipfile import tarfile -import logging from packaging.tests.support import requires_zlib @@ -221,7 +220,7 @@ # with the check subcommand cmd.ensure_finalized() cmd.run() - warnings = self.get_logs(logging.WARN) + warnings = self.get_logs() self.assertEqual(len(warnings), 4) # trying with a complete set of metadata @@ -230,13 +229,10 @@ cmd.ensure_finalized() cmd.metadata_check = False cmd.run() - warnings = self.get_logs(logging.WARN) - # removing manifest generated warnings - warnings = [warn for warn in warnings if - not warn.endswith('-- skipping')] - # the remaining warnings are about the use of the default file list and - # the absence of setup.cfg + warnings = self.get_logs() self.assertEqual(len(warnings), 2) + self.assertIn('using default file list', warnings[0]) + self.assertIn("'setup.cfg' file not found", warnings[1]) def test_show_formats(self): __, stdout = captured_stdout(show_formats) diff --git a/Lib/packaging/tests/test_command_test.py b/Lib/packaging/tests/test_command_test.py --- a/Lib/packaging/tests/test_command_test.py +++ b/Lib/packaging/tests/test_command_test.py @@ -2,7 +2,6 @@ import re import sys import shutil -import logging import unittest as ut1 import packaging.database @@ -149,7 +148,7 @@ phony_project = 'ohno_ohno-impossible_1234-name_stop-that!' cmd.tests_require = [phony_project] cmd.ensure_finalized() - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertIn(phony_project, logs[-1]) def prepare_a_module(self): diff --git a/Lib/packaging/tests/test_command_upload_docs.py b/Lib/packaging/tests/test_command_upload_docs.py --- a/Lib/packaging/tests/test_command_upload_docs.py +++ b/Lib/packaging/tests/test_command_upload_docs.py @@ -1,6 +1,7 @@ """Tests for packaging.command.upload_docs.""" import os import shutil +import logging import zipfile try: import _ssl @@ -141,13 +142,16 @@ self.pypi.default_response_status = '403 Forbidden' self.prepare_command() self.cmd.run() - self.assertIn('Upload failed (403): Forbidden', self.get_logs()[-1]) + errors = self.get_logs(logging.ERROR) + self.assertEqual(len(errors), 1) + self.assertIn('Upload failed (403): Forbidden', errors[0]) self.pypi.default_response_status = '301 Moved Permanently' self.pypi.default_response_headers.append( ("Location", "brand_new_location")) self.cmd.run() - self.assertIn('brand_new_location', self.get_logs()[-1]) + lastlog = self.get_logs(logging.INFO)[-1] + self.assertIn('brand_new_location', lastlog) def test_reads_pypirc_data(self): self.write_file(self.rc, PYPIRC % self.pypi.full_address) @@ -171,7 +175,7 @@ self.prepare_command() self.cmd.show_response = True self.cmd.run() - record = self.get_logs()[-1] + record = self.get_logs(logging.INFO)[-1] self.assertTrue(record, "should report the response") self.assertIn(self.pypi.default_response_data, record) diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py --- a/Lib/packaging/tests/test_config.py +++ b/Lib/packaging/tests/test_config.py @@ -1,7 +1,6 @@ """Tests for packaging.config.""" import os import sys -import logging from io import StringIO from packaging import command @@ -375,15 +374,14 @@ self.write_file('README', 'yeah') self.write_file('hooks.py', HOOKS_MODULE) self.get_dist() - logs = self.get_logs(logging.WARNING) - self.assertEqual(['logging_hook called'], logs) + self.assertEqual(['logging_hook called'], self.get_logs()) self.assertIn('hooks', sys.modules) def test_missing_setup_hook_warns(self): self.write_setup({'setup-hooks': 'this.does._not.exist'}) self.write_file('README', 'yeah') self.get_dist() - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('cannot find setup hook', logs[0]) @@ -397,7 +395,7 @@ dist = self.get_dist() self.assertEqual(['haven', 'first', 'third'], dist.py_modules) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('cannot find setup hook', logs[0]) diff --git a/Lib/packaging/tests/test_dist.py b/Lib/packaging/tests/test_dist.py --- a/Lib/packaging/tests/test_dist.py +++ b/Lib/packaging/tests/test_dist.py @@ -1,7 +1,6 @@ """Tests for packaging.dist.""" import os import sys -import logging import textwrap import packaging.dist @@ -74,7 +73,7 @@ 'version': '1.2', 'home_page': 'xxxx', 'badoptname': 'xxx'}) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(len(logs), 1) self.assertIn('unknown argument', logs[0]) @@ -85,7 +84,7 @@ 'version': '1.2', 'home_page': 'xxxx', 'options': {}}) - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) self.assertNotIn('options', dir(dist)) def test_non_empty_options(self): diff --git a/Lib/packaging/tests/test_manifest.py b/Lib/packaging/tests/test_manifest.py --- a/Lib/packaging/tests/test_manifest.py +++ b/Lib/packaging/tests/test_manifest.py @@ -1,7 +1,6 @@ """Tests for packaging.manifest.""" import os import re -import logging from io import StringIO from packaging.errors import PackagingTemplateError from packaging.manifest import Manifest, _translate_pattern, _glob_to_re @@ -37,10 +36,10 @@ super(ManifestTestCase, self).tearDown() def assertNoWarnings(self): - self.assertEqual(self.get_logs(logging.WARNING), []) + self.assertEqual(self.get_logs(), []) def assertWarnings(self): - self.assertGreater(len(self.get_logs(logging.WARNING)), 0) + self.assertNotEqual(self.get_logs(), []) def test_manifest_reader(self): tmpdir = self.mkdtemp() @@ -51,7 +50,7 @@ manifest = Manifest() manifest.read_template(MANIFEST) - warnings = self.get_logs(logging.WARNING) + warnings = self.get_logs() # the manifest should have been read and 3 warnings issued # (we didn't provide the files) self.assertEqual(3, len(warnings)) diff --git a/Lib/packaging/tests/test_metadata.py b/Lib/packaging/tests/test_metadata.py --- a/Lib/packaging/tests/test_metadata.py +++ b/Lib/packaging/tests/test_metadata.py @@ -1,7 +1,6 @@ """Tests for packaging.metadata.""" import os import sys -import logging from textwrap import dedent from io import StringIO @@ -302,7 +301,7 @@ 'name': 'xxx', 'version': 'xxx', 'home_page': 'xxxx'}) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('not a valid version', logs[0]) @@ -418,7 +417,7 @@ # XXX check PEP and see if 3 == 3.0 metadata['Requires-Python'] = '>=2.6, <3.0' metadata['Requires-Dist'] = ['Foo (>=2.6, <3.0)'] - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) @unittest.skip('needs to be implemented') def test_requires_illegal(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:57 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_reST_targets_to_section?= =?utf8?q?s_of_the_setup=2Ecfg_spec=2C_improve_wording?= Message-ID: http://hg.python.org/cpython/rev/8d19cc0857d9 changeset: 73005:8d19cc0857d9 user: ?ric Araujo date: Wed Oct 19 08:41:07 2011 +0200 summary: Add reST targets to sections of the setup.cfg spec, improve wording files: Doc/packaging/setupcfg.rst | 37 ++++++++++++++++++++++--- 1 files changed, 32 insertions(+), 5 deletions(-) diff --git a/Doc/packaging/setupcfg.rst b/Doc/packaging/setupcfg.rst --- a/Doc/packaging/setupcfg.rst +++ b/Doc/packaging/setupcfg.rst @@ -19,6 +19,8 @@ :local: +.. _setupcfg-syntax: + Syntax ====== @@ -117,6 +119,8 @@ file**. This will be useful to let users publish a single file. +.. _setupcfg-sections: + Description of sections and fields ================================== @@ -149,6 +153,8 @@ on the command line. +.. _setupcfg-section-global: + Global options -------------- @@ -194,6 +200,9 @@ setup_hooks = _setuphooks.customize_config + +.. _setupcfg-section-metadata: + Metadata -------- @@ -318,6 +327,8 @@ from the fields present in the file. +.. _setupcfg-section-files: + Files ----- @@ -325,7 +336,8 @@ packages_root the root directory containing all packages and modules - (default: current directory). *optional* + (default: current directory, i.e. the project's top-level + directory where :file:`setup.cfg` lives). *optional* packages a list of packages the project includes *optional*, *multi* @@ -337,8 +349,8 @@ a list of scripts the project includes *optional*, *multi* extra_files - a list of patterns to include extra files *optional*, - *multi* + a list of patterns for additional files to include in source distributions + (see :ref:`packaging-manifest`) *optional*, *multi* Example:: @@ -747,8 +759,10 @@ {scripts} category. -Extension sections ------------------- +.. _setupcfg-section-extensions: + +Extension modules sections +-------------------------- If a project includes extension modules written in C or C++, each one of them needs to have its options defined in a dedicated section. Here's an example:: @@ -779,8 +793,10 @@ ``--``. -Command sections ----------------- +.. _setupcfg-section-commands: + +Commands sections +----------------- To pass options to commands without having to type them on the command line for each invocation, you can write them in the :file:`setup.cfg` file, in a @@ -803,6 +819,11 @@ Option values given in the configuration file can be overriden on the command line. See :ref:`packaging-setup-config` for more information. +These sections are also used to define :ref:`command hooks +`. + + +.. _setupcfg-extensibility: Extensibility ============= @@ -817,6 +838,8 @@ X-Debian-Name = python-distribute +.. _setupcfg-changes: + Changes in the specification ============================ @@ -852,6 +875,8 @@ - May write optional fields. +.. _setupcfg-acks: + Acknowledgments =============== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:57 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Clean_up_some_idioms_in_pac?= =?utf8?q?kaging_tests=2E?= Message-ID: http://hg.python.org/cpython/rev/faab63914eba changeset: 73006:faab63914eba user: ?ric Araujo date: Wed Oct 19 08:49:20 2011 +0200 summary: Clean up some idioms in packaging tests. - Use os.makedirs (I had forgotten about it!) - Let TempdirManager.write_file call os.path.join for us - Remove custom command added by test_dist - Use a skip instead of hiding a method with an underscore - Address pyflakes warnings files: Lib/packaging/tests/__main__.py | 1 - Lib/packaging/tests/test_command_clean.py | 2 +- Lib/packaging/tests/test_command_install_data.py | 5 + Lib/packaging/tests/test_command_install_dist.py | 9 +- Lib/packaging/tests/test_command_test.py | 3 +- Lib/packaging/tests/test_command_upload.py | 2 +- Lib/packaging/tests/test_command_upload_docs.py | 5 +- Lib/packaging/tests/test_create.py | 3 +- Lib/packaging/tests/test_dist.py | 11 +++- Lib/packaging/tests/test_mixin2to3.py | 1 - Lib/packaging/tests/test_uninstall.py | 3 +- Lib/packaging/tests/test_util.py | 28 ++++----- Lib/packaging/tests/test_version.py | 4 +- 13 files changed, 40 insertions(+), 37 deletions(-) diff --git a/Lib/packaging/tests/__main__.py b/Lib/packaging/tests/__main__.py --- a/Lib/packaging/tests/__main__.py +++ b/Lib/packaging/tests/__main__.py @@ -3,7 +3,6 @@ # Ripped from importlib tests, thanks Brett! import os -import sys import unittest from test.support import run_unittest, reap_children, reap_threads diff --git a/Lib/packaging/tests/test_command_clean.py b/Lib/packaging/tests/test_command_clean.py --- a/Lib/packaging/tests/test_command_clean.py +++ b/Lib/packaging/tests/test_command_clean.py @@ -23,7 +23,7 @@ if name == 'build_base': continue for f in ('one', 'two', 'three'): - self.write_file(os.path.join(path, f)) + self.write_file((path, f)) # let's run the command cmd.all = True diff --git a/Lib/packaging/tests/test_command_install_data.py b/Lib/packaging/tests/test_command_install_data.py --- a/Lib/packaging/tests/test_command_install_data.py +++ b/Lib/packaging/tests/test_command_install_data.py @@ -117,6 +117,11 @@ dist.command_obj['install_distinfo'] = cmd cmd.run() + # first a few sanity checks + self.assertEqual(os.listdir(scripts_dir), ['spamd']) + self.assertEqual(os.listdir(install_dir), ['Spamlib-0.1.dist-info']) + + # now the real test fn = os.path.join(install_dir, 'Spamlib-0.1.dist-info', 'RESOURCES') with open(fn, encoding='utf-8') as fp: content = fp.read().strip() diff --git a/Lib/packaging/tests/test_command_install_dist.py b/Lib/packaging/tests/test_command_install_dist.py --- a/Lib/packaging/tests/test_command_install_dist.py +++ b/Lib/packaging/tests/test_command_install_dist.py @@ -93,21 +93,20 @@ self.old_expand = os.path.expanduser os.path.expanduser = _expanduser - try: - # this is the actual test - self._test_user_site() - finally: + def cleanup(): _CONFIG_VARS['userbase'] = self.old_user_base _SCHEMES.set(scheme, 'purelib', self.old_user_site) os.path.expanduser = self.old_expand - def _test_user_site(self): + self.addCleanup(cleanup) + schemes = get_scheme_names() for key in ('nt_user', 'posix_user', 'os2_home'): self.assertIn(key, schemes) dist = Distribution({'name': 'xx'}) cmd = install_dist(dist) + # making sure the user option is there options = [name for name, short, lable in cmd.user_options] diff --git a/Lib/packaging/tests/test_command_test.py b/Lib/packaging/tests/test_command_test.py --- a/Lib/packaging/tests/test_command_test.py +++ b/Lib/packaging/tests/test_command_test.py @@ -139,7 +139,8 @@ cmd.run() self.assertEqual(['build has run'], record) - def _test_works_with_2to3(self): + @unittest.skip('needs to be written') + def test_works_with_2to3(self): pass def test_checks_requires(self): diff --git a/Lib/packaging/tests/test_command_upload.py b/Lib/packaging/tests/test_command_upload.py --- a/Lib/packaging/tests/test_command_upload.py +++ b/Lib/packaging/tests/test_command_upload.py @@ -129,7 +129,7 @@ dist_files = [(command, pyversion, filename)] docs_path = os.path.join(self.tmp_dir, "build", "docs") os.makedirs(docs_path) - self.write_file(os.path.join(docs_path, "index.html"), "yellow") + self.write_file((docs_path, "index.html"), "yellow") self.write_file(self.rc, PYPIRC) # let's run it diff --git a/Lib/packaging/tests/test_command_upload_docs.py b/Lib/packaging/tests/test_command_upload_docs.py --- a/Lib/packaging/tests/test_command_upload_docs.py +++ b/Lib/packaging/tests/test_command_upload_docs.py @@ -71,9 +71,8 @@ if sample_dir is None: sample_dir = self.mkdtemp() os.mkdir(os.path.join(sample_dir, "docs")) - self.write_file(os.path.join(sample_dir, "docs", "index.html"), - "Ce mortel ennui") - self.write_file(os.path.join(sample_dir, "index.html"), "Oh la la") + self.write_file((sample_dir, "docs", "index.html"), "Ce mortel ennui") + self.write_file((sample_dir, "index.html"), "Oh la la") return sample_dir def test_zip_dir(self): diff --git a/Lib/packaging/tests/test_create.py b/Lib/packaging/tests/test_create.py --- a/Lib/packaging/tests/test_create.py +++ b/Lib/packaging/tests/test_create.py @@ -80,8 +80,7 @@ os.mkdir(os.path.join(tempdir, dir_)) for file_ in files: - path = os.path.join(tempdir, file_) - self.write_file(path, 'xxx') + self.write_file((tempdir, file_), 'xxx') mainprogram._find_files() mainprogram.data['packages'].sort() diff --git a/Lib/packaging/tests/test_dist.py b/Lib/packaging/tests/test_dist.py --- a/Lib/packaging/tests/test_dist.py +++ b/Lib/packaging/tests/test_dist.py @@ -6,7 +6,7 @@ import packaging.dist from packaging.dist import Distribution -from packaging.command import set_command +from packaging.command import set_command, _COMMANDS from packaging.command.cmd import Command from packaging.errors import PackagingModuleError, PackagingOptionError from packaging.tests import captured_stdout @@ -28,6 +28,9 @@ def finalize_options(self): pass + def run(self): + pass + class DistributionTestCase(support.TempdirManager, support.LoggingCatcher, @@ -38,12 +41,18 @@ def setUp(self): super(DistributionTestCase, self).setUp() + # XXX this is ugly, we should fix the functions to accept args + # (defaulting to sys.argv) self.argv = sys.argv, sys.argv[:] del sys.argv[1:] + self._commands = _COMMANDS.copy() def tearDown(self): sys.argv = self.argv[0] sys.argv[:] = self.argv[1] + # XXX maybe we need a public API to remove commands + _COMMANDS.clear() + _COMMANDS.update(self._commands) super(DistributionTestCase, self).tearDown() @unittest.skip('needs to be updated') diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -1,4 +1,3 @@ -import sys import textwrap from packaging.tests import unittest, support diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -61,8 +61,7 @@ kw['pkg'] = pkg pkg_dir = os.path.join(project_dir, pkg) - os.mkdir(pkg_dir) - os.mkdir(os.path.join(pkg_dir, 'sub')) + os.makedirs(os.path.join(pkg_dir, 'sub')) self.write_file((project_dir, 'setup.cfg'), SETUP_CFG % kw) self.write_file((pkg_dir, '__init__.py'), '#') diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -356,24 +356,20 @@ # root = self.mkdtemp() pkg1 = os.path.join(root, 'pkg1') - os.mkdir(pkg1) - self.write_file(os.path.join(pkg1, '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg2')) - self.write_file(os.path.join(pkg1, 'pkg2', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg3')) - self.write_file(os.path.join(pkg1, 'pkg3', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg3', 'pkg6')) - self.write_file(os.path.join(pkg1, 'pkg3', 'pkg6', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg4')) - os.mkdir(os.path.join(pkg1, 'pkg4', 'pkg8')) - self.write_file(os.path.join(pkg1, 'pkg4', 'pkg8', '__init__.py')) - pkg5 = os.path.join(root, 'pkg5') - os.mkdir(pkg5) - self.write_file(os.path.join(pkg5, '__init__.py')) + os.makedirs(os.path.join(pkg1, 'pkg2')) + os.makedirs(os.path.join(pkg1, 'pkg3', 'pkg6')) + os.makedirs(os.path.join(pkg1, 'pkg4', 'pkg8')) + os.makedirs(os.path.join(root, 'pkg5')) + self.write_file((pkg1, '__init__.py')) + self.write_file((pkg1, 'pkg2', '__init__.py')) + self.write_file((pkg1, 'pkg3', '__init__.py')) + self.write_file((pkg1, 'pkg3', 'pkg6', '__init__.py')) + self.write_file((pkg1, 'pkg4', 'pkg8', '__init__.py')) + self.write_file((root, 'pkg5', '__init__.py')) res = find_packages([root], ['pkg1.pkg2']) - self.assertEqual(set(res), set(['pkg1', 'pkg5', 'pkg1.pkg3', - 'pkg1.pkg3.pkg6'])) + self.assertEqual(sorted(res), + ['pkg1', 'pkg1.pkg3', 'pkg1.pkg3.pkg6', 'pkg5']) def test_resolve_name(self): # test raw module name diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -1,6 +1,5 @@ """Tests for packaging.version.""" import doctest -import os from packaging.version import NormalizedVersion as V from packaging.version import HugeMajorVersionNumError, IrrationalVersionError @@ -46,7 +45,6 @@ def test_from_parts(self): for v, s in self.versions: - parts = v.parts v2 = V.from_parts(*v.parts) self.assertEqual(v, v2) self.assertEqual(str(v), str(v2)) @@ -192,7 +190,7 @@ 'Hey (>=2.5,<2.7)') for predicate in predicates: - v = VersionPredicate(predicate) + VersionPredicate(predicate) self.assertTrue(VersionPredicate('Hey (>=2.5,<2.7)').match('2.6')) self.assertTrue(VersionPredicate('Ho').match('2.6')) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:32:59 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:32:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_one_function_in_packag?= =?utf8?q?ing=2Emetadata_simpler?= Message-ID: http://hg.python.org/cpython/rev/2e047702df7f changeset: 73007:2e047702df7f user: ?ric Araujo date: Wed Oct 19 08:50:49 2011 +0200 summary: Make one function in packaging.metadata simpler files: Lib/packaging/metadata.py | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/packaging/metadata.py b/Lib/packaging/metadata.py --- a/Lib/packaging/metadata.py +++ b/Lib/packaging/metadata.py @@ -185,6 +185,7 @@ _FILESAFE = re.compile('[^A-Za-z0-9.]+') + class Metadata: """The metadata of a release. @@ -228,10 +229,8 @@ def __delitem__(self, name): field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) + # we let a KeyError propagate + del self._fields[field_name] self._set_best_version() def __contains__(self, name): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 21:33:00 2011 From: python-checkins at python.org (eric.araujo) Date: Wed, 19 Oct 2011 21:33:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/5419bdf37fee changeset: 73008:5419bdf37fee parent: 72999:b083d1039376 parent: 73007:2e047702df7f user: ?ric Araujo date: Wed Oct 19 21:32:39 2011 +0200 summary: Branch merge files: Doc/packaging/setupcfg.rst | 37 +++- Lib/packaging/command/build_py.py | 6 +- Lib/packaging/command/install_lib.py | 6 +- Lib/packaging/metadata.py | 7 +- Lib/packaging/tests/__main__.py | 1 - Lib/packaging/tests/support.py | 39 ++-- Lib/packaging/tests/test_command_build_py.py | 35 +++ Lib/packaging/tests/test_command_check.py | 45 ++-- Lib/packaging/tests/test_command_clean.py | 2 +- Lib/packaging/tests/test_command_cmd.py | 3 +- Lib/packaging/tests/test_command_install_data.py | 5 + Lib/packaging/tests/test_command_install_dist.py | 21 +- Lib/packaging/tests/test_command_sdist.py | 12 +- Lib/packaging/tests/test_command_test.py | 6 +- Lib/packaging/tests/test_command_upload.py | 2 +- Lib/packaging/tests/test_command_upload_docs.py | 15 +- Lib/packaging/tests/test_config.py | 8 +- Lib/packaging/tests/test_create.py | 3 +- Lib/packaging/tests/test_dist.py | 16 +- Lib/packaging/tests/test_manifest.py | 7 +- Lib/packaging/tests/test_metadata.py | 5 +- Lib/packaging/tests/test_mixin2to3.py | 1 - Lib/packaging/tests/test_uninstall.py | 3 +- Lib/packaging/tests/test_util.py | 94 +++++---- Lib/packaging/tests/test_version.py | 4 +- Lib/packaging/util.py | 21 +- Misc/NEWS | 2 +- setup.py | 3 +- 28 files changed, 250 insertions(+), 159 deletions(-) diff --git a/Doc/packaging/setupcfg.rst b/Doc/packaging/setupcfg.rst --- a/Doc/packaging/setupcfg.rst +++ b/Doc/packaging/setupcfg.rst @@ -19,6 +19,8 @@ :local: +.. _setupcfg-syntax: + Syntax ====== @@ -117,6 +119,8 @@ file**. This will be useful to let users publish a single file. +.. _setupcfg-sections: + Description of sections and fields ================================== @@ -149,6 +153,8 @@ on the command line. +.. _setupcfg-section-global: + Global options -------------- @@ -194,6 +200,9 @@ setup_hooks = _setuphooks.customize_config + +.. _setupcfg-section-metadata: + Metadata -------- @@ -318,6 +327,8 @@ from the fields present in the file. +.. _setupcfg-section-files: + Files ----- @@ -325,7 +336,8 @@ packages_root the root directory containing all packages and modules - (default: current directory). *optional* + (default: current directory, i.e. the project's top-level + directory where :file:`setup.cfg` lives). *optional* packages a list of packages the project includes *optional*, *multi* @@ -337,8 +349,8 @@ a list of scripts the project includes *optional*, *multi* extra_files - a list of patterns to include extra files *optional*, - *multi* + a list of patterns for additional files to include in source distributions + (see :ref:`packaging-manifest`) *optional*, *multi* Example:: @@ -747,8 +759,10 @@ {scripts} category. -Extension sections ------------------- +.. _setupcfg-section-extensions: + +Extension modules sections +-------------------------- If a project includes extension modules written in C or C++, each one of them needs to have its options defined in a dedicated section. Here's an example:: @@ -779,8 +793,10 @@ ``--``. -Command sections ----------------- +.. _setupcfg-section-commands: + +Commands sections +----------------- To pass options to commands without having to type them on the command line for each invocation, you can write them in the :file:`setup.cfg` file, in a @@ -803,6 +819,11 @@ Option values given in the configuration file can be overriden on the command line. See :ref:`packaging-setup-config` for more information. +These sections are also used to define :ref:`command hooks +`. + + +.. _setupcfg-extensibility: Extensibility ============= @@ -817,6 +838,8 @@ X-Debian-Name = python-distribute +.. _setupcfg-changes: + Changes in the specification ============================ @@ -852,6 +875,8 @@ - May write optional fields. +.. _setupcfg-acks: + Acknowledgments =============== diff --git a/Lib/packaging/command/build_py.py b/Lib/packaging/command/build_py.py --- a/Lib/packaging/command/build_py.py +++ b/Lib/packaging/command/build_py.py @@ -1,6 +1,7 @@ """Build pure Python modules (just copy to build directory).""" import os +import imp import sys from glob import glob @@ -330,9 +331,10 @@ outputs.append(filename) if include_bytecode: if self.compile: - outputs.append(filename + "c") + outputs.append(imp.cache_from_source(filename)) if self.optimize > 0: - outputs.append(filename + "o") + outputs.append(imp.cache_from_source(filename, + debug_override=False)) outputs += [ os.path.join(build_dir, filename) diff --git a/Lib/packaging/command/install_lib.py b/Lib/packaging/command/install_lib.py --- a/Lib/packaging/command/install_lib.py +++ b/Lib/packaging/command/install_lib.py @@ -1,6 +1,7 @@ """Install all modules (extensions and pure Python).""" import os +import imp import sys import logging @@ -172,9 +173,10 @@ if ext != PYTHON_SOURCE_EXTENSION: continue if self.compile: - bytecode_files.append(py_file + "c") + bytecode_files.append(imp.cache_from_source(py_file)) if self.optimize > 0: - bytecode_files.append(py_file + "o") + bytecode_files.append(imp.cache_from_source( + py_file, debug_override=False)) return bytecode_files diff --git a/Lib/packaging/metadata.py b/Lib/packaging/metadata.py --- a/Lib/packaging/metadata.py +++ b/Lib/packaging/metadata.py @@ -185,6 +185,7 @@ _FILESAFE = re.compile('[^A-Za-z0-9.]+') + class Metadata: """The metadata of a release. @@ -228,10 +229,8 @@ def __delitem__(self, name): field_name = self._convert_name(name) - try: - del self._fields[field_name] - except KeyError: - raise KeyError(name) + # we let a KeyError propagate + del self._fields[field_name] self._set_best_version() def __contains__(self, name): diff --git a/Lib/packaging/tests/__main__.py b/Lib/packaging/tests/__main__.py --- a/Lib/packaging/tests/__main__.py +++ b/Lib/packaging/tests/__main__.py @@ -3,7 +3,6 @@ # Ripped from importlib tests, thanks Brett! import os -import sys import unittest from test.support import run_unittest, reap_children, reap_threads diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -82,10 +82,13 @@ configured to record all messages logged to the 'packaging' logger. Use get_logs to retrieve messages and self.loghandler.flush to discard - them. get_logs automatically flushes the logs; if you test code that - generates logging messages but don't use get_logs, you have to flush - manually before doing other checks on logging message, otherwise you - will get irrelevant results. See example in test_command_check. + them. get_logs automatically flushes the logs, unless you pass + *flush=False*, for example to make multiple calls to the method with + different level arguments. If your test calls some code that generates + logging message and then you don't call get_logs, you will need to flush + manually before testing other code in the same test_* method, otherwise + get_logs in the next lines will see messages from the previous lines. + See example in test_command_check. """ def setUp(self): @@ -109,25 +112,23 @@ logger2to3.setLevel(self._old_levels[1]) super(LoggingCatcher, self).tearDown() - def get_logs(self, *levels): - """Return all log messages with level in *levels*. + def get_logs(self, level=logging.WARNING, flush=True): + """Return all log messages with given level. - Without explicit levels given, returns all messages. *levels* defaults - to all levels. For log calls with arguments (i.e. - logger.info('bla bla %r', arg)), the messages will be formatted before - being returned (e.g. "bla bla 'thing'"). + *level* defaults to logging.WARNING. + + For log calls with arguments (i.e. logger.info('bla bla %r', arg)), + the messages will be formatted before being returned (e.g. "bla bla + 'thing'"). Returns a list. Automatically flushes the loghandler after being - called. - - Example: self.get_logs(logging.WARN, logging.DEBUG). + called, unless *flush* is False (this is useful to get e.g. all + warnings then all info messages). """ - if not levels: - messages = [log.getMessage() for log in self.loghandler.buffer] - else: - messages = [log.getMessage() for log in self.loghandler.buffer - if log.levelno in levels] - self.loghandler.flush() + messages = [log.getMessage() for log in self.loghandler.buffer + if log.levelno == level] + if flush: + self.loghandler.flush() return messages diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -102,6 +102,40 @@ os.chdir(cwd) sys.stdout = old_stdout + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') + def test_byte_compile(self): + project_dir, dist = self.create_dist(py_modules=['boiledeggs']) + os.chdir(project_dir) + self.write_file('boiledeggs.py', 'import antigravity') + cmd = build_py(dist) + cmd.compile = True + cmd.build_lib = 'here' + cmd.finalize_options() + cmd.run() + + found = os.listdir(cmd.build_lib) + self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) + found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) + self.assertEqual(found, ['boiledeggs.%s.pyc' % imp.get_tag()]) + + @unittest.skipIf(sys.dont_write_bytecode, 'byte-compile disabled') + def test_byte_compile_optimized(self): + project_dir, dist = self.create_dist(py_modules=['boiledeggs']) + os.chdir(project_dir) + self.write_file('boiledeggs.py', 'import antigravity') + cmd = build_py(dist) + cmd.compile = True + cmd.optimize = 1 + cmd.build_lib = 'here' + cmd.finalize_options() + cmd.run() + + found = os.listdir(cmd.build_lib) + self.assertEqual(sorted(found), ['__pycache__', 'boiledeggs.py']) + found = os.listdir(os.path.join(cmd.build_lib, '__pycache__')) + self.assertEqual(sorted(found), ['boiledeggs.%s.pyc' % imp.get_tag(), + 'boiledeggs.%s.pyo' % imp.get_tag()]) + def test_dont_write_bytecode(self): # makes sure byte_compile is not used pkg_dir, dist = self.create_dist() @@ -118,6 +152,7 @@ self.assertIn('byte-compiling is disabled', self.get_logs()[0]) + def test_suite(): return unittest.makeSuite(BuildPyTestCase) diff --git a/Lib/packaging/tests/test_command_check.py b/Lib/packaging/tests/test_command_check.py --- a/Lib/packaging/tests/test_command_check.py +++ b/Lib/packaging/tests/test_command_check.py @@ -1,6 +1,5 @@ """Tests for distutils.command.check.""" -import logging from packaging.command.check import check from packaging.metadata import _HAS_DOCUTILS from packaging.errors import PackagingSetupError, MetadataMissingError @@ -27,11 +26,11 @@ # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings - cmd = self._run() + self._run() # trick: using assertNotEqual with an empty list will give us a more # useful error message than assertGreater(.., 0) when the code change # and the test fails - self.assertNotEqual([], self.get_logs(logging.WARNING)) + self.assertNotEqual(self.get_logs(), []) # now let's add the required fields # and run it again, to make sure we don't get @@ -40,8 +39,8 @@ 'author_email': 'xxx', 'name': 'xxx', 'version': '4.2', } - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata @@ -53,8 +52,8 @@ self.loghandler.flush() # and of course, no error when all metadata fields are present - cmd = self._run(metadata, strict=True) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata, strict=True) + self.assertEqual(self.get_logs(), []) # now a test with non-ASCII characters metadata = {'home_page': 'xxx', 'author': '\u00c9ric', @@ -62,15 +61,15 @@ 'version': '1.2', 'summary': 'Something about esszet \u00df', 'description': 'More things about esszet \u00df'} - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) def test_check_metadata_1_2(self): # let's run the command with no metadata at all # by default, check is checking the metadata # should have some warnings - cmd = self._run() - self.assertNotEqual([], self.get_logs(logging.WARNING)) + self._run() + self.assertNotEqual(self.get_logs(), []) # now let's add the required fields and run it again, to make sure we # don't get any warning anymore let's use requires_python as a marker @@ -80,8 +79,8 @@ 'name': 'xxx', 'version': '4.2', 'requires_python': '2.4', } - cmd = self._run(metadata) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata) + self.assertEqual(self.get_logs(), []) # now with the strict mode, we should # get an error if there are missing metadata @@ -99,8 +98,8 @@ # now with correct version format again metadata['version'] = '4.2' - cmd = self._run(metadata, strict=True) - self.assertEqual([], self.get_logs(logging.WARNING)) + self._run(metadata, strict=True) + self.assertEqual(self.get_logs(), []) @unittest.skipUnless(_HAS_DOCUTILS, "requires docutils") def test_check_restructuredtext(self): @@ -109,9 +108,7 @@ pkg_info, dist = self.create_dist(description=broken_rest) cmd = check(dist) cmd.check_restructuredtext() - self.assertEqual(len(self.get_logs(logging.WARNING)), 1) - # clear warnings from the previous call - self.loghandler.flush() + self.assertEqual(len(self.get_logs()), 1) # let's see if we have an error with strict=1 metadata = {'home_page': 'xxx', 'author': 'xxx', @@ -126,7 +123,7 @@ dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1] cmd = check(dist) cmd.check_restructuredtext() - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) def test_check_all(self): self.assertRaises(PackagingSetupError, self._run, @@ -143,18 +140,18 @@ } cmd = check(dist) cmd.check_hooks_resolvable() - self.assertEqual(len(self.get_logs(logging.WARNING)), 1) + self.assertEqual(len(self.get_logs()), 1) def test_warn(self): _, dist = self.create_dist() cmd = check(dist) - self.assertEqual([], self.get_logs()) + self.assertEqual(self.get_logs(), []) cmd.warn('hello') - self.assertEqual(['check: hello'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello']) cmd.warn('hello %s', 'world') - self.assertEqual(['check: hello world'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello world']) cmd.warn('hello %s %s', 'beautiful', 'world') - self.assertEqual(['check: hello beautiful world'], self.get_logs()) + self.assertEqual(self.get_logs(), ['check: hello beautiful world']) def test_suite(): diff --git a/Lib/packaging/tests/test_command_clean.py b/Lib/packaging/tests/test_command_clean.py --- a/Lib/packaging/tests/test_command_clean.py +++ b/Lib/packaging/tests/test_command_clean.py @@ -23,7 +23,7 @@ if name == 'build_base': continue for f in ('one', 'two', 'three'): - self.write_file(os.path.join(path, f)) + self.write_file((path, f)) # let's run the command cmd.all = True diff --git a/Lib/packaging/tests/test_command_cmd.py b/Lib/packaging/tests/test_command_cmd.py --- a/Lib/packaging/tests/test_command_cmd.py +++ b/Lib/packaging/tests/test_command_cmd.py @@ -1,5 +1,6 @@ """Tests for distutils.cmd.""" import os +import logging from packaging.command.cmd import Command from packaging.dist import Distribution @@ -43,7 +44,7 @@ wanted = ["command options for 'MyCmd':", ' option1 = 1', ' option2 = 1'] - msgs = self.get_logs() + msgs = self.get_logs(logging.INFO) self.assertEqual(msgs, wanted) def test_ensure_string(self): diff --git a/Lib/packaging/tests/test_command_install_data.py b/Lib/packaging/tests/test_command_install_data.py --- a/Lib/packaging/tests/test_command_install_data.py +++ b/Lib/packaging/tests/test_command_install_data.py @@ -117,6 +117,11 @@ dist.command_obj['install_distinfo'] = cmd cmd.run() + # first a few sanity checks + self.assertEqual(os.listdir(scripts_dir), ['spamd']) + self.assertEqual(os.listdir(install_dir), ['Spamlib-0.1.dist-info']) + + # now the real test fn = os.path.join(install_dir, 'Spamlib-0.1.dist-info', 'RESOURCES') with open(fn, encoding='utf-8') as fp: content = fp.read().strip() diff --git a/Lib/packaging/tests/test_command_install_dist.py b/Lib/packaging/tests/test_command_install_dist.py --- a/Lib/packaging/tests/test_command_install_dist.py +++ b/Lib/packaging/tests/test_command_install_dist.py @@ -1,6 +1,7 @@ """Tests for packaging.command.install.""" import os +import imp import sys from sysconfig import (get_scheme_names, get_config_vars, _SCHEMES, get_config_var, get_path) @@ -92,21 +93,20 @@ self.old_expand = os.path.expanduser os.path.expanduser = _expanduser - try: - # this is the actual test - self._test_user_site() - finally: + def cleanup(): _CONFIG_VARS['userbase'] = self.old_user_base _SCHEMES.set(scheme, 'purelib', self.old_user_site) os.path.expanduser = self.old_expand - def _test_user_site(self): + self.addCleanup(cleanup) + schemes = get_scheme_names() for key in ('nt_user', 'posix_user', 'os2_home'): self.assertIn(key, schemes) dist = Distribution({'name': 'xx'}) cmd = install_dist(dist) + # making sure the user option is there options = [name for name, short, lable in cmd.user_options] @@ -181,9 +181,11 @@ def test_old_record(self): # test pre-PEP 376 --record option (outside dist-info dir) install_dir = self.mkdtemp() - project_dir, dist = self.create_dist(scripts=['hello']) + project_dir, dist = self.create_dist(py_modules=['hello'], + scripts=['sayhi']) os.chdir(project_dir) - self.write_file('hello', "print('o hai')") + self.write_file('hello.py', "def main(): print('o hai')") + self.write_file('sayhi', 'from hello import main; main()') cmd = install_dist(dist) dist.command_obj['install_dist'] = cmd @@ -196,8 +198,9 @@ content = f.read() found = [os.path.basename(line) for line in content.splitlines()] - expected = ['hello', 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD'] - self.assertEqual(found, expected) + expected = ['hello.py', 'hello.%s.pyc' % imp.get_tag(), 'sayhi', + 'METADATA', 'INSTALLER', 'REQUESTED', 'RECORD'] + self.assertEqual(sorted(found), sorted(expected)) # XXX test that fancy_getopt is okay with options named # record and no-record but unrelated diff --git a/Lib/packaging/tests/test_command_sdist.py b/Lib/packaging/tests/test_command_sdist.py --- a/Lib/packaging/tests/test_command_sdist.py +++ b/Lib/packaging/tests/test_command_sdist.py @@ -2,7 +2,6 @@ import os import zipfile import tarfile -import logging from packaging.tests.support import requires_zlib @@ -221,7 +220,7 @@ # with the check subcommand cmd.ensure_finalized() cmd.run() - warnings = self.get_logs(logging.WARN) + warnings = self.get_logs() self.assertEqual(len(warnings), 4) # trying with a complete set of metadata @@ -230,13 +229,10 @@ cmd.ensure_finalized() cmd.metadata_check = False cmd.run() - warnings = self.get_logs(logging.WARN) - # removing manifest generated warnings - warnings = [warn for warn in warnings if - not warn.endswith('-- skipping')] - # the remaining warnings are about the use of the default file list and - # the absence of setup.cfg + warnings = self.get_logs() self.assertEqual(len(warnings), 2) + self.assertIn('using default file list', warnings[0]) + self.assertIn("'setup.cfg' file not found", warnings[1]) def test_show_formats(self): __, stdout = captured_stdout(show_formats) diff --git a/Lib/packaging/tests/test_command_test.py b/Lib/packaging/tests/test_command_test.py --- a/Lib/packaging/tests/test_command_test.py +++ b/Lib/packaging/tests/test_command_test.py @@ -2,7 +2,6 @@ import re import sys import shutil -import logging import unittest as ut1 import packaging.database @@ -140,7 +139,8 @@ cmd.run() self.assertEqual(['build has run'], record) - def _test_works_with_2to3(self): + @unittest.skip('needs to be written') + def test_works_with_2to3(self): pass def test_checks_requires(self): @@ -149,7 +149,7 @@ phony_project = 'ohno_ohno-impossible_1234-name_stop-that!' cmd.tests_require = [phony_project] cmd.ensure_finalized() - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertIn(phony_project, logs[-1]) def prepare_a_module(self): diff --git a/Lib/packaging/tests/test_command_upload.py b/Lib/packaging/tests/test_command_upload.py --- a/Lib/packaging/tests/test_command_upload.py +++ b/Lib/packaging/tests/test_command_upload.py @@ -129,7 +129,7 @@ dist_files = [(command, pyversion, filename)] docs_path = os.path.join(self.tmp_dir, "build", "docs") os.makedirs(docs_path) - self.write_file(os.path.join(docs_path, "index.html"), "yellow") + self.write_file((docs_path, "index.html"), "yellow") self.write_file(self.rc, PYPIRC) # let's run it diff --git a/Lib/packaging/tests/test_command_upload_docs.py b/Lib/packaging/tests/test_command_upload_docs.py --- a/Lib/packaging/tests/test_command_upload_docs.py +++ b/Lib/packaging/tests/test_command_upload_docs.py @@ -1,6 +1,7 @@ """Tests for packaging.command.upload_docs.""" import os import shutil +import logging import zipfile try: import _ssl @@ -70,9 +71,8 @@ if sample_dir is None: sample_dir = self.mkdtemp() os.mkdir(os.path.join(sample_dir, "docs")) - self.write_file(os.path.join(sample_dir, "docs", "index.html"), - "Ce mortel ennui") - self.write_file(os.path.join(sample_dir, "index.html"), "Oh la la") + self.write_file((sample_dir, "docs", "index.html"), "Ce mortel ennui") + self.write_file((sample_dir, "index.html"), "Oh la la") return sample_dir def test_zip_dir(self): @@ -141,13 +141,16 @@ self.pypi.default_response_status = '403 Forbidden' self.prepare_command() self.cmd.run() - self.assertIn('Upload failed (403): Forbidden', self.get_logs()[-1]) + errors = self.get_logs(logging.ERROR) + self.assertEqual(len(errors), 1) + self.assertIn('Upload failed (403): Forbidden', errors[0]) self.pypi.default_response_status = '301 Moved Permanently' self.pypi.default_response_headers.append( ("Location", "brand_new_location")) self.cmd.run() - self.assertIn('brand_new_location', self.get_logs()[-1]) + lastlog = self.get_logs(logging.INFO)[-1] + self.assertIn('brand_new_location', lastlog) def test_reads_pypirc_data(self): self.write_file(self.rc, PYPIRC % self.pypi.full_address) @@ -171,7 +174,7 @@ self.prepare_command() self.cmd.show_response = True self.cmd.run() - record = self.get_logs()[-1] + record = self.get_logs(logging.INFO)[-1] self.assertTrue(record, "should report the response") self.assertIn(self.pypi.default_response_data, record) diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py --- a/Lib/packaging/tests/test_config.py +++ b/Lib/packaging/tests/test_config.py @@ -1,7 +1,6 @@ """Tests for packaging.config.""" import os import sys -import logging from io import StringIO from packaging import command @@ -375,15 +374,14 @@ self.write_file('README', 'yeah') self.write_file('hooks.py', HOOKS_MODULE) self.get_dist() - logs = self.get_logs(logging.WARNING) - self.assertEqual(['logging_hook called'], logs) + self.assertEqual(['logging_hook called'], self.get_logs()) self.assertIn('hooks', sys.modules) def test_missing_setup_hook_warns(self): self.write_setup({'setup-hooks': 'this.does._not.exist'}) self.write_file('README', 'yeah') self.get_dist() - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('cannot find setup hook', logs[0]) @@ -397,7 +395,7 @@ dist = self.get_dist() self.assertEqual(['haven', 'first', 'third'], dist.py_modules) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('cannot find setup hook', logs[0]) diff --git a/Lib/packaging/tests/test_create.py b/Lib/packaging/tests/test_create.py --- a/Lib/packaging/tests/test_create.py +++ b/Lib/packaging/tests/test_create.py @@ -80,8 +80,7 @@ os.mkdir(os.path.join(tempdir, dir_)) for file_ in files: - path = os.path.join(tempdir, file_) - self.write_file(path, 'xxx') + self.write_file((tempdir, file_), 'xxx') mainprogram._find_files() mainprogram.data['packages'].sort() diff --git a/Lib/packaging/tests/test_dist.py b/Lib/packaging/tests/test_dist.py --- a/Lib/packaging/tests/test_dist.py +++ b/Lib/packaging/tests/test_dist.py @@ -1,13 +1,12 @@ """Tests for packaging.dist.""" import os import sys -import logging import textwrap import packaging.dist from packaging.dist import Distribution -from packaging.command import set_command +from packaging.command import set_command, _COMMANDS from packaging.command.cmd import Command from packaging.errors import PackagingModuleError, PackagingOptionError from packaging.tests import captured_stdout @@ -29,6 +28,9 @@ def finalize_options(self): pass + def run(self): + pass + class DistributionTestCase(support.TempdirManager, support.LoggingCatcher, @@ -39,12 +41,18 @@ def setUp(self): super(DistributionTestCase, self).setUp() + # XXX this is ugly, we should fix the functions to accept args + # (defaulting to sys.argv) self.argv = sys.argv, sys.argv[:] del sys.argv[1:] + self._commands = _COMMANDS.copy() def tearDown(self): sys.argv = self.argv[0] sys.argv[:] = self.argv[1] + # XXX maybe we need a public API to remove commands + _COMMANDS.clear() + _COMMANDS.update(self._commands) super(DistributionTestCase, self).tearDown() @unittest.skip('needs to be updated') @@ -74,7 +82,7 @@ 'version': '1.2', 'home_page': 'xxxx', 'badoptname': 'xxx'}) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(len(logs), 1) self.assertIn('unknown argument', logs[0]) @@ -85,7 +93,7 @@ 'version': '1.2', 'home_page': 'xxxx', 'options': {}}) - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) self.assertNotIn('options', dir(dist)) def test_non_empty_options(self): diff --git a/Lib/packaging/tests/test_manifest.py b/Lib/packaging/tests/test_manifest.py --- a/Lib/packaging/tests/test_manifest.py +++ b/Lib/packaging/tests/test_manifest.py @@ -1,7 +1,6 @@ """Tests for packaging.manifest.""" import os import re -import logging from io import StringIO from packaging.errors import PackagingTemplateError from packaging.manifest import Manifest, _translate_pattern, _glob_to_re @@ -37,10 +36,10 @@ super(ManifestTestCase, self).tearDown() def assertNoWarnings(self): - self.assertEqual(self.get_logs(logging.WARNING), []) + self.assertEqual(self.get_logs(), []) def assertWarnings(self): - self.assertGreater(len(self.get_logs(logging.WARNING)), 0) + self.assertNotEqual(self.get_logs(), []) def test_manifest_reader(self): tmpdir = self.mkdtemp() @@ -51,7 +50,7 @@ manifest = Manifest() manifest.read_template(MANIFEST) - warnings = self.get_logs(logging.WARNING) + warnings = self.get_logs() # the manifest should have been read and 3 warnings issued # (we didn't provide the files) self.assertEqual(3, len(warnings)) diff --git a/Lib/packaging/tests/test_metadata.py b/Lib/packaging/tests/test_metadata.py --- a/Lib/packaging/tests/test_metadata.py +++ b/Lib/packaging/tests/test_metadata.py @@ -1,7 +1,6 @@ """Tests for packaging.metadata.""" import os import sys -import logging from textwrap import dedent from io import StringIO @@ -302,7 +301,7 @@ 'name': 'xxx', 'version': 'xxx', 'home_page': 'xxxx'}) - logs = self.get_logs(logging.WARNING) + logs = self.get_logs() self.assertEqual(1, len(logs)) self.assertIn('not a valid version', logs[0]) @@ -418,7 +417,7 @@ # XXX check PEP and see if 3 == 3.0 metadata['Requires-Python'] = '>=2.6, <3.0' metadata['Requires-Dist'] = ['Foo (>=2.6, <3.0)'] - self.assertEqual([], self.get_logs(logging.WARNING)) + self.assertEqual(self.get_logs(), []) @unittest.skip('needs to be implemented') def test_requires_illegal(self): diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -1,4 +1,3 @@ -import sys import textwrap from packaging.tests import unittest, support diff --git a/Lib/packaging/tests/test_uninstall.py b/Lib/packaging/tests/test_uninstall.py --- a/Lib/packaging/tests/test_uninstall.py +++ b/Lib/packaging/tests/test_uninstall.py @@ -61,8 +61,7 @@ kw['pkg'] = pkg pkg_dir = os.path.join(project_dir, pkg) - os.mkdir(pkg_dir) - os.mkdir(os.path.join(pkg_dir, 'sub')) + os.makedirs(os.path.join(pkg_dir, 'sub')) self.write_file((project_dir, 'setup.cfg'), SETUP_CFG % kw) self.write_file((pkg_dir, '__init__.py'), '#') diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -4,6 +4,7 @@ import time import logging import tempfile +import textwrap import subprocess from io import StringIO @@ -355,55 +356,64 @@ # root = self.mkdtemp() pkg1 = os.path.join(root, 'pkg1') - os.mkdir(pkg1) - self.write_file(os.path.join(pkg1, '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg2')) - self.write_file(os.path.join(pkg1, 'pkg2', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg3')) - self.write_file(os.path.join(pkg1, 'pkg3', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg3', 'pkg6')) - self.write_file(os.path.join(pkg1, 'pkg3', 'pkg6', '__init__.py')) - os.mkdir(os.path.join(pkg1, 'pkg4')) - os.mkdir(os.path.join(pkg1, 'pkg4', 'pkg8')) - self.write_file(os.path.join(pkg1, 'pkg4', 'pkg8', '__init__.py')) - pkg5 = os.path.join(root, 'pkg5') - os.mkdir(pkg5) - self.write_file(os.path.join(pkg5, '__init__.py')) + os.makedirs(os.path.join(pkg1, 'pkg2')) + os.makedirs(os.path.join(pkg1, 'pkg3', 'pkg6')) + os.makedirs(os.path.join(pkg1, 'pkg4', 'pkg8')) + os.makedirs(os.path.join(root, 'pkg5')) + self.write_file((pkg1, '__init__.py')) + self.write_file((pkg1, 'pkg2', '__init__.py')) + self.write_file((pkg1, 'pkg3', '__init__.py')) + self.write_file((pkg1, 'pkg3', 'pkg6', '__init__.py')) + self.write_file((pkg1, 'pkg4', 'pkg8', '__init__.py')) + self.write_file((root, 'pkg5', '__init__.py')) res = find_packages([root], ['pkg1.pkg2']) - self.assertEqual(set(res), set(['pkg1', 'pkg5', 'pkg1.pkg3', - 'pkg1.pkg3.pkg6'])) + self.assertEqual(sorted(res), + ['pkg1', 'pkg1.pkg3', 'pkg1.pkg3.pkg6', 'pkg5']) def test_resolve_name(self): - self.assertIs(str, resolve_name('builtins.str')) - self.assertEqual( - UtilTestCase.__name__, - resolve_name("packaging.tests.test_util.UtilTestCase").__name__) - self.assertEqual( - UtilTestCase.test_resolve_name.__name__, - resolve_name("packaging.tests.test_util.UtilTestCase." - "test_resolve_name").__name__) + # test raw module name + tmpdir = self.mkdtemp() + sys.path.append(tmpdir) + self.addCleanup(sys.path.remove, tmpdir) + self.write_file((tmpdir, 'hello.py'), '') - self.assertRaises(ImportError, resolve_name, - "packaging.tests.test_util.UtilTestCaseNot") - self.assertRaises(ImportError, resolve_name, - "packaging.tests.test_util.UtilTestCase." - "nonexistent_attribute") + os.makedirs(os.path.join(tmpdir, 'a', 'b')) + self.write_file((tmpdir, 'a', '__init__.py'), '') + self.write_file((tmpdir, 'a', 'b', '__init__.py'), '') + self.write_file((tmpdir, 'a', 'b', 'c.py'), 'class Foo: pass') + self.write_file((tmpdir, 'a', 'b', 'd.py'), textwrap.dedent("""\ + class FooBar: + class Bar: + def baz(self): + pass + """)) - def test_import_nested_first_time(self): - tmp_dir = self.mkdtemp() - os.makedirs(os.path.join(tmp_dir, 'a', 'b')) - self.write_file(os.path.join(tmp_dir, 'a', '__init__.py'), '') - self.write_file(os.path.join(tmp_dir, 'a', 'b', '__init__.py'), '') - self.write_file(os.path.join(tmp_dir, 'a', 'b', 'c.py'), - 'class Foo: pass') + # check Python, C and built-in module + self.assertEqual(resolve_name('hello').__name__, 'hello') + self.assertEqual(resolve_name('_csv').__name__, '_csv') + self.assertEqual(resolve_name('sys').__name__, 'sys') - try: - sys.path.append(tmp_dir) - resolve_name("a.b.c.Foo") - # assert nothing raised - finally: - sys.path.remove(tmp_dir) + # test module.attr + self.assertIs(resolve_name('builtins.str'), str) + self.assertIsNone(resolve_name('hello.__doc__')) + self.assertEqual(resolve_name('a.b.c.Foo').__name__, 'Foo') + self.assertEqual(resolve_name('a.b.d.FooBar.Bar.baz').__name__, 'baz') + + # error if module not found + self.assertRaises(ImportError, resolve_name, 'nonexistent') + self.assertRaises(ImportError, resolve_name, 'non.existent') + self.assertRaises(ImportError, resolve_name, 'a.no') + self.assertRaises(ImportError, resolve_name, 'a.b.no') + self.assertRaises(ImportError, resolve_name, 'a.b.no.no') + self.assertRaises(ImportError, resolve_name, 'inva-lid') + + # looking up built-in names is not supported + self.assertRaises(ImportError, resolve_name, 'str') + + # error if module found but not attr + self.assertRaises(ImportError, resolve_name, 'a.b.Spam') + self.assertRaises(ImportError, resolve_name, 'a.b.c.Spam') def test_run_2to3_on_code(self): content = "print 'test'" diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -1,6 +1,5 @@ """Tests for packaging.version.""" import doctest -import os from packaging.version import NormalizedVersion as V from packaging.version import HugeMajorVersionNumError, IrrationalVersionError @@ -46,7 +45,6 @@ def test_from_parts(self): for v, s in self.versions: - parts = v.parts v2 = V.from_parts(*v.parts) self.assertEqual(v, v2) self.assertEqual(str(v), str(v2)) @@ -192,7 +190,7 @@ 'Hey (>=2.5,<2.7)') for predicate in predicates: - v = VersionPredicate(predicate) + VersionPredicate(predicate) self.assertTrue(VersionPredicate('Hey (>=2.5,<2.7)').match('2.6')) self.assertTrue(VersionPredicate('Ho').match('2.6')) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -630,22 +630,35 @@ def resolve_name(name): """Resolve a name like ``module.object`` to an object and return it. - Raise ImportError if the module or name is not found. + This functions supports packages and attributes without depth limitation: + ``package.package.module.class.class.function.attr`` is valid input. + However, looking up builtins is not directly supported: use + ``builtins.name``. + + Raises ImportError if importing the module fails or if one requested + attribute is not found. """ + if '.' not in name: + # shortcut + __import__(name) + return sys.modules[name] + + # FIXME clean up this code! parts = name.split('.') cursor = len(parts) module_name = parts[:cursor] + ret = '' while cursor > 0: try: ret = __import__('.'.join(module_name)) break except ImportError: - if cursor == 0: - raise cursor -= 1 module_name = parts[:cursor] - ret = '' + + if ret == '': + raise ImportError(parts[0]) for part in parts[1:]: try: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1455,7 +1455,7 @@ the amount of time needed to run the tests. "make test" and "make quicktest" now include some resource-intensive tests, but no longer run the test suite twice to check for bugs in .pyc generation. Tools/scripts/run_test.py provides - as an easy platform-independent way to run test suite with sensible defaults. + an easy platform-independent way to run test suite with sensible defaults. - Issue #12331: The test suite for the packaging module can now run from an installed Python. diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -1380,8 +1380,7 @@ # End multiprocessing # Platform-specific libraries - if any(platform.startswith(prefix) - for prefix in ("linux", "freebsd", "gnukfreebsd")): + if platform.startswith(('linux', 'freebsd', 'gnukfreebsd')): exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) else: missing.append('ossaudiodev') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 22:40:46 2011 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 19 Oct 2011 22:40:46 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313121=3A_Support_i?= =?utf8?q?n-place_math_operators_for_collections=2ECounter=28=29=2E?= Message-ID: http://hg.python.org/cpython/rev/5cced40374df changeset: 73009:5cced40374df user: Raymond Hettinger date: Wed Oct 19 13:40:37 2011 -0700 summary: Issue #13121: Support in-place math operators for collections.Counter(). files: Doc/library/collections.rst | 2 +- Lib/collections/__init__.py | 63 ++++++++++++++++++++++++ Lib/test/test_collections.py | 21 ++++++++ Misc/NEWS | 1 + 4 files changed, 86 insertions(+), 1 deletions(-) diff --git a/Doc/library/collections.rst b/Doc/library/collections.rst --- a/Doc/library/collections.rst +++ b/Doc/library/collections.rst @@ -293,7 +293,7 @@ Counter({'b': 4}) .. versionadded:: 3.3 - Added support for unary plus and unary minus. + Added support for unary plus, unary minus, and in-place multiset operations. .. note:: diff --git a/Lib/collections/__init__.py b/Lib/collections/__init__.py --- a/Lib/collections/__init__.py +++ b/Lib/collections/__init__.py @@ -683,6 +683,69 @@ ''' return Counter() - self + def _keep_positive(self): + '''Internal method to strip elements with a negative or zero count''' + nonpositive = [elem for elem, count in self.items() if not count > 0] + for elem in nonpositive: + del self[elem] + return self + + def __iadd__(self, other): + '''Inplace add from another counter, keeping only positive counts. + + >>> c = Counter('abbb') + >>> c += Counter('bcc') + >>> c + Counter({'b': 4, 'c': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] += count + return self._keep_positive() + + def __isub__(self, other): + '''Inplace subtract counter, but keep only results with positive counts. + + >>> c = Counter('abbbc') + >>> c -= Counter('bccd') + >>> c + Counter({'b': 2, 'a': 1}) + + ''' + for elem, count in other.items(): + self[elem] -= count + return self._keep_positive() + + def __ior__(self, other): + '''Inplace union is the maximum of value from either counter. + + >>> c = Counter('abbb') + >>> c |= Counter('bcc') + >>> c + Counter({'b': 3, 'c': 2, 'a': 1}) + + ''' + for elem, other_count in other.items(): + count = self[elem] + if other_count > count: + self[elem] = other_count + return self._keep_positive() + + def __iand__(self, other): + '''Inplace intersection is the minimum of corresponding counts. + + >>> c = Counter('abbb') + >>> c &= Counter('bcc') + >>> c + Counter({'b': 1}) + + ''' + for elem, count in self.items(): + other_count = other[elem] + if other_count < count: + self[elem] = other_count + return self._keep_positive() + ######################################################################## ### ChainMap (helper for configparser and string.Template) diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py --- a/Lib/test/test_collections.py +++ b/Lib/test/test_collections.py @@ -932,6 +932,27 @@ set_result = setop(set(p.elements()), set(q.elements())) self.assertEqual(counter_result, dict.fromkeys(set_result, 1)) + def test_inplace_operations(self): + elements = 'abcd' + for i in range(1000): + # test random pairs of multisets + p = Counter(dict((elem, randrange(-2,4)) for elem in elements)) + p.update(e=1, f=-1, g=0) + q = Counter(dict((elem, randrange(-2,4)) for elem in elements)) + q.update(h=1, i=-1, j=0) + for inplace_op, regular_op in [ + (Counter.__iadd__, Counter.__add__), + (Counter.__isub__, Counter.__sub__), + (Counter.__ior__, Counter.__or__), + (Counter.__iand__, Counter.__and__), + ]: + c = p.copy() + c_id = id(c) + regular_result = regular_op(c, q) + inplace_result = inplace_op(c, q) + self.assertEqual(inplace_result, regular_result) + self.assertEqual(id(inplace_result), c_id) + def test_subtract(self): c = Counter(a=-5, b=0, c=5, d=10, e=15,g=40) c.subtract(a=1, b=2, c=-3, d=10, e=20, f=30, h=-50) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -488,6 +488,7 @@ in os.kill(). - Add support for unary plus and unary minus to collections.Counter(). + Issue #13121: Also an support for inplace math operators. - Issue #12683: urlparse updated to include svn as schemes that uses relative paths. (svn from 1.5 onwards support relative path). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 22:58:19 2011 From: python-checkins at python.org (benjamin.peterson) Date: Wed, 19 Oct 2011 22:58:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_adjust_braces_a?= =?utf8?q?_bit?= Message-ID: http://hg.python.org/cpython/rev/9c79a25f4a8b changeset: 73010:9c79a25f4a8b branch: 3.2 parent: 72998:99a9f0251924 user: Benjamin Peterson date: Wed Oct 19 16:57:40 2011 -0400 summary: adjust braces a bit files: Objects/genobject.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -232,8 +232,9 @@ /* First, check the traceback argument, replacing None with NULL. */ - if (tb == Py_None) + if (tb == Py_None) { tb = NULL; + } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "throw() third argument must be a traceback object"); @@ -244,9 +245,8 @@ Py_XINCREF(val); Py_XINCREF(tb); - if (PyExceptionClass_Check(typ)) { + if (PyExceptionClass_Check(typ)) PyErr_NormalizeException(&typ, &val, &tb); - } else if (PyExceptionInstance_Check(typ)) { /* Raising an instance. The value should be a dummy. */ @@ -262,10 +262,9 @@ typ = PyExceptionInstance_Class(typ); Py_INCREF(typ); - if (tb == NULL) { + if (tb == NULL) /* Returns NULL if there's no traceback */ tb = PyException_GetTraceback(val); - } } } else { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 22:58:20 2011 From: python-checkins at python.org (benjamin.peterson) Date: Wed, 19 Oct 2011 22:58:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/08f8a0fd483f changeset: 73011:08f8a0fd483f parent: 73009:5cced40374df parent: 73010:9c79a25f4a8b user: Benjamin Peterson date: Wed Oct 19 16:58:15 2011 -0400 summary: merge 3.2 files: Objects/genobject.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Objects/genobject.c b/Objects/genobject.c --- a/Objects/genobject.c +++ b/Objects/genobject.c @@ -232,8 +232,9 @@ /* First, check the traceback argument, replacing None with NULL. */ - if (tb == Py_None) + if (tb == Py_None) { tb = NULL; + } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "throw() third argument must be a traceback object"); @@ -244,9 +245,8 @@ Py_XINCREF(val); Py_XINCREF(tb); - if (PyExceptionClass_Check(typ)) { + if (PyExceptionClass_Check(typ)) PyErr_NormalizeException(&typ, &val, &tb); - } else if (PyExceptionInstance_Check(typ)) { /* Raising an instance. The value should be a dummy. */ @@ -262,10 +262,9 @@ typ = PyExceptionInstance_Class(typ); Py_INCREF(typ); - if (tb == NULL) { + if (tb == NULL) /* Returns NULL if there's no traceback */ tb = PyException_GetTraceback(val); - } } } else { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 23:10:57 2011 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 19 Oct 2011 23:10:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_11931=3A_?= =?utf8?q?Minor_punctuation/grammar/wording_fixups_to_the_regex_docs?= Message-ID: http://hg.python.org/cpython/rev/068d89194ffd changeset: 73012:068d89194ffd branch: 3.2 parent: 73010:9c79a25f4a8b user: Raymond Hettinger date: Wed Oct 19 14:10:07 2011 -0700 summary: Issue 11931: Minor punctuation/grammar/wording fixups to the regex docs files: Doc/library/re.rst | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -80,7 +80,7 @@ characters either stand for classes of ordinary characters, or affect how the regular expressions around them are interpreted. Regular expression pattern strings may not contain null bytes, but can specify -the null byte using the ``\number`` notation, e.g., ``'\x00'``. +the null byte using a ``\number`` notation such as ``'\x00'``. The special characters are: @@ -405,7 +405,7 @@ \r \t \v \x \\ -Octal escapes are included in a limited form: If the first digit is a 0, or if +Octal escapes are included in a limited form. If the first digit is a 0, or if there are three octal digits, it is considered an octal escape. Otherwise, it is a group reference. As for string literals, octal escapes are always at most three digits in length. @@ -413,8 +413,8 @@ .. _matching-searching: -Matching vs Searching ---------------------- +Matching vs. Searching +---------------------- .. sectionauthor:: Fred L. Drake, Jr. @@ -595,8 +595,7 @@ ['', '...', 'words', ', ', 'words', '...', ''] That way, separator components are always found at the same relative - indices within the result list (e.g., if there's one capturing group - in the separator, the 0th, the 2nd and so forth). + indices within the result list. Note that *split* will never split a string on an empty pattern match. For example: @@ -713,7 +712,7 @@ -------------------------- Compiled regular expression objects support the following methods and -attributes. +attributes: .. method:: regex.search(string[, pos[, endpos]]) @@ -732,7 +731,7 @@ The optional parameter *endpos* limits how far the string will be searched; it will be as if the string is *endpos* characters long, so only the characters from *pos* to ``endpos - 1`` will be searched for a match. If *endpos* is less - than *pos*, no match will be found, otherwise, if *rx* is a compiled regular + than *pos*, no match will be found; otherwise, if *rx* is a compiled regular expression object, ``rx.search(string, 0, 50)`` is equivalent to ``rx.search(string[:50], 0)``. @@ -820,8 +819,8 @@ Match Objects ------------- -Match objects always have a boolean value of :const:`True`, so that you can test -whether e.g. :func:`match` resulted in a match with a simple if statement. They +Match objects always have a boolean value of :const:`True`. This lets you +use a simple if-statement to test whether a match was found. Match objects support the following methods and attributes: @@ -998,7 +997,7 @@ --------------------------- -Checking For a Pair +Checking for a Pair ^^^^^^^^^^^^^^^^^^^ In this example, we'll use the following helper function to display match @@ -1106,7 +1105,7 @@ If you create regular expressions that require the engine to perform a lot of recursion, you may encounter a :exc:`RuntimeError` exception with the message -``maximum recursion limit`` exceeded. For example, :: +``maximum recursion limit exceeded``. For example, :: >>> s = 'Begin ' + 1000*'a very long string ' + 'end' >>> re.match('Begin (\w| )*? end', s).end() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 23:10:57 2011 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 19 Oct 2011 23:10:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/b875f6c48d04 changeset: 73013:b875f6c48d04 parent: 73011:08f8a0fd483f parent: 73012:068d89194ffd user: Raymond Hettinger date: Wed Oct 19 14:10:37 2011 -0700 summary: Merge files: Doc/library/re.rst | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -80,7 +80,7 @@ characters either stand for classes of ordinary characters, or affect how the regular expressions around them are interpreted. Regular expression pattern strings may not contain null bytes, but can specify -the null byte using the ``\number`` notation, e.g., ``'\x00'``. +the null byte using a ``\number`` notation such as ``'\x00'``. The special characters are: @@ -405,7 +405,7 @@ \r \t \v \x \\ -Octal escapes are included in a limited form: If the first digit is a 0, or if +Octal escapes are included in a limited form. If the first digit is a 0, or if there are three octal digits, it is considered an octal escape. Otherwise, it is a group reference. As for string literals, octal escapes are always at most three digits in length. @@ -413,8 +413,8 @@ .. _matching-searching: -Matching vs Searching ---------------------- +Matching vs. Searching +---------------------- .. sectionauthor:: Fred L. Drake, Jr. @@ -595,8 +595,7 @@ ['', '...', 'words', ', ', 'words', '...', ''] That way, separator components are always found at the same relative - indices within the result list (e.g., if there's one capturing group - in the separator, the 0th, the 2nd and so forth). + indices within the result list. Note that *split* will never split a string on an empty pattern match. For example: @@ -716,7 +715,7 @@ -------------------------- Compiled regular expression objects support the following methods and -attributes. +attributes: .. method:: regex.search(string[, pos[, endpos]]) @@ -735,7 +734,7 @@ The optional parameter *endpos* limits how far the string will be searched; it will be as if the string is *endpos* characters long, so only the characters from *pos* to ``endpos - 1`` will be searched for a match. If *endpos* is less - than *pos*, no match will be found, otherwise, if *rx* is a compiled regular + than *pos*, no match will be found; otherwise, if *rx* is a compiled regular expression object, ``rx.search(string, 0, 50)`` is equivalent to ``rx.search(string[:50], 0)``. @@ -823,8 +822,8 @@ Match Objects ------------- -Match objects always have a boolean value of :const:`True`, so that you can test -whether e.g. :func:`match` resulted in a match with a simple if statement. They +Match objects always have a boolean value of :const:`True`. This lets you +use a simple if-statement to test whether a match was found. Match objects support the following methods and attributes: @@ -1001,7 +1000,7 @@ --------------------------- -Checking For a Pair +Checking for a Pair ^^^^^^^^^^^^^^^^^^^ In this example, we'll use the following helper function to display match @@ -1109,7 +1108,7 @@ If you create regular expressions that require the engine to perform a lot of recursion, you may encounter a :exc:`RuntimeError` exception with the message -``maximum recursion limit`` exceeded. For example, :: +``maximum recursion limit exceeded``. For example, :: >>> s = 'Begin ' + 1000*'a very long string ' + 'end' >>> re.match('Begin (\w| )*? end', s).end() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 23:16:57 2011 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 19 Oct 2011 23:16:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_12668=3A_?= =?utf8?q?Fix_wording_in_Whatsnew3=2E2?= Message-ID: http://hg.python.org/cpython/rev/48e0db1cf7e4 changeset: 73014:48e0db1cf7e4 branch: 3.2 parent: 73012:068d89194ffd user: Raymond Hettinger date: Wed Oct 19 14:16:18 2011 -0700 summary: Issue 12668: Fix wording in Whatsnew3.2 files: Doc/whatsnew/3.2.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -2362,7 +2362,7 @@ (Patch by Florent Xicluna in :issue:`7622` and :issue:`7462`.) -* String to integer conversions now work two "digits" at a time, reducing the +* Integer to string conversions now work two "digits" at a time, reducing the number of division and modulo operations. (:issue:`6713` by Gawain Bolton, Mark Dickinson, and Victor Stinner.) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 19 23:16:57 2011 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 19 Oct 2011 23:16:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/821f5032bbf4 changeset: 73015:821f5032bbf4 parent: 73013:b875f6c48d04 parent: 73014:48e0db1cf7e4 user: Raymond Hettinger date: Wed Oct 19 14:16:47 2011 -0700 summary: merge files: Doc/whatsnew/3.2.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.2.rst b/Doc/whatsnew/3.2.rst --- a/Doc/whatsnew/3.2.rst +++ b/Doc/whatsnew/3.2.rst @@ -2362,7 +2362,7 @@ (Patch by Florent Xicluna in :issue:`7622` and :issue:`7462`.) -* String to integer conversions now work two "digits" at a time, reducing the +* Integer to string conversions now work two "digits" at a time, reducing the number of division and modulo operations. (:issue:`6713` by Gawain Bolton, Mark Dickinson, and Victor Stinner.) -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Wed Oct 19 23:17:10 2011 From: ncoghlan at gmail.com (Nick Coghlan) Date: Thu, 20 Oct 2011 07:17:10 +1000 Subject: [Python-checkins] cpython (2.7): Fix closes Issue12529 - cgi.parse_header failure on double quotes and In-Reply-To: References: Message-ID: On Thu, Oct 20, 2011 at 2:53 AM, senthil.kumaran wrote: > http://hg.python.org/cpython/rev/489237756488 > changeset: ? 72988:489237756488 > branch: ? ? ?2.7 > parent: ? ? ?72984:86e3943d0d5b > user: ? ? ? ?Senthil Kumaran > date: ? ? ? ?Thu Oct 20 00:52:24 2011 +0800 > summary: > ?Fix closes Issue12529 - cgi.parse_header failure on double quotes and > semicolons. Patch by Ben Darnell and Petri Lehtinen. > > files: > ?Lib/cgi.py ? ? ? ? ? | ?2 +- > ?Lib/test/test_cgi.py | ?3 +++ > ?2 files changed, 4 insertions(+), 1 deletions(-) NEWS entry? (same question for the later _sre fix) Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Wed Oct 19 23:32:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 19 Oct 2011 23:32:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Silence_the_FileExistsError?= =?utf8?q?_which_can_be_raised_because_of_the_O=5FEXCL_flag?= Message-ID: http://hg.python.org/cpython/rev/170ed6735d4b changeset: 73016:170ed6735d4b user: Antoine Pitrou date: Wed Oct 19 23:28:40 2011 +0200 summary: Silence the FileExistsError which can be raised because of the O_EXCL flag (as in import.c) files: Lib/importlib/_bootstrap.py | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -81,7 +81,9 @@ def _write_atomic(path, data): - """Best-effort function to write data to a path atomically.""" + """Best-effort function to write data to a path atomically. + Be prepared to handle a FileExistsError if concurrent writing of the + temporary file is attempted.""" if not sys.platform.startswith('win'): # On POSIX-like platforms, renaming is atomic path_tmp = path + '.tmp' @@ -516,12 +518,10 @@ raise try: _write_atomic(path, data) - except OSError as exc: - # Don't worry if you can't write bytecode. - if exc.errno == errno.EACCES: - return - else: - raise + except (PermissionError, FileExistsError): + # Don't worry if you can't write bytecode or someone is writing + # it at the same time. + pass class _SourcelessFileLoader(_FileLoader, _LoaderBasics): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 00:40:53 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 20 Oct 2011 00:40:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313150=3A_Add_a_com?= =?utf8?q?ment_in_=5Fsysconfigdata_to_explain_the_origin_of_this_file?= Message-ID: http://hg.python.org/cpython/rev/677e625e2ef1 changeset: 73017:677e625e2ef1 user: Victor Stinner date: Thu Oct 20 00:41:21 2011 +0200 summary: Issue #13150: Add a comment in _sysconfigdata to explain the origin of this file files: Lib/sysconfig.py | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -323,7 +323,6 @@ """Generate the Python module containing build-time variables.""" import pprint vars = {} - destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py') # load the installed Makefile: makefile = get_makefile_filename() try: @@ -348,7 +347,11 @@ # the scripts are in another directory. if _PYTHON_BUILD: vars['LDSHARED'] = vars['BLDSHARED'] + + destfile = os.path.join(os.path.dirname(__file__), '_sysconfigdata.py') with open(destfile, 'w', encoding='utf8') as f: + f.write('# system configuration generated and used by' + ' the sysconfig module\n') f.write('build_time_vars = ') pprint.pprint(vars, stream=f) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 00:45:19 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 20 Oct 2011 00:45:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Mention_that_os=2EO=5FCLOEX?= =?utf8?q?EC_was_added_to_Python_3=2E3?= Message-ID: http://hg.python.org/cpython/rev/2c9940c7c573 changeset: 73018:2c9940c7c573 user: Victor Stinner date: Thu Oct 20 00:46:21 2011 +0200 summary: Mention that os.O_CLOEXEC was added to Python 3.3 files: Doc/library/os.rst | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1369,6 +1369,8 @@ These constants are only available on Unix. + .. versionchanged:: 3.3 + Add :data:`O_CLOEXEC` constant. .. data:: O_BINARY O_NOINHERIT -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 20 05:31:18 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 20 Oct 2011 05:31:18 +0200 Subject: [Python-checkins] Daily reference leaks (2c9940c7c573): sum=0 Message-ID: results for 2c9940c7c573 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogx5019r', '-x'] From python-checkins at python.org Thu Oct 20 17:57:55 2011 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 20 Oct 2011 17:57:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_13227=3A_Option_to_ma?= =?utf8?q?ke_the_lru=5Fcache=28=29_type_specific_=28suggested_by_Andrew?= Message-ID: http://hg.python.org/cpython/rev/cba503a2c468 changeset: 73019:cba503a2c468 user: Raymond Hettinger date: Thu Oct 20 08:57:45 2011 -0700 summary: Issue 13227: Option to make the lru_cache() type specific (suggested by Andrew Koenig). files: Doc/library/functools.rst | 13 ++++++++++--- Lib/functools.py | 22 ++++++++++++++++++---- Lib/re.py | 7 ++----- Lib/test/test_functools.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/Doc/library/functools.rst b/Doc/library/functools.rst --- a/Doc/library/functools.rst +++ b/Doc/library/functools.rst @@ -40,7 +40,7 @@ .. versionadded:: 3.2 -.. decorator:: lru_cache(maxsize=100) +.. decorator:: lru_cache(maxsize=100, typed=False) Decorator to wrap a function with a memoizing callable that saves up to the *maxsize* most recent calls. It can save time when an expensive or I/O bound @@ -52,6 +52,10 @@ If *maxsize* is set to None, the LRU feature is disabled and the cache can grow without bound. + If *typed* is set to True, function arguments of different types will be + cached separately. For example, ``f(3)`` and ``f(3.0)`` will be treated + as distinct calls with distinct results. + To help measure the effectiveness of the cache and tune the *maxsize* parameter, the wrapped function is instrumented with a :func:`cache_info` function that returns a :term:`named tuple` showing *hits*, *misses*, @@ -67,8 +71,8 @@ An `LRU (least recently used) cache `_ works - best when more recent calls are the best predictors of upcoming calls (for - example, the most popular articles on a news server tend to change daily). + best when the most recent calls are the best predictors of upcoming calls (for + example, the most popular articles on a news server tend to change each day). The cache's size limit assures that the cache does not grow without bound on long-running processes such as web servers. @@ -111,6 +115,9 @@ .. versionadded:: 3.2 + .. versionchanged:: 3.3 + Added the *typed* option. + .. decorator:: total_ordering Given a class defining one or more rich comparison ordering methods, this diff --git a/Lib/functools.py b/Lib/functools.py --- a/Lib/functools.py +++ b/Lib/functools.py @@ -121,12 +121,16 @@ _CacheInfo = namedtuple("CacheInfo", "hits misses maxsize currsize") -def lru_cache(maxsize=100): +def lru_cache(maxsize=100, typed=False): """Least-recently-used cache decorator. If *maxsize* is set to None, the LRU features are disabled and the cache can grow without bound. + If *typed* is True, arguments of different types will be cached separately. + For example, f(3.0) and f(3) will be treated as distinct calls with + distinct results. + Arguments to the cached function must be hashable. View the cache statistics named tuple (hits, misses, maxsize, currsize) with @@ -142,7 +146,7 @@ # to allow the implementation to change (including a possible C version). def decorating_function(user_function, - tuple=tuple, sorted=sorted, len=len, KeyError=KeyError): + *, tuple=tuple, sorted=sorted, map=map, len=len, type=type, KeyError=KeyError): hits = misses = 0 kwd_mark = (object(),) # separates positional and keyword args @@ -156,7 +160,12 @@ nonlocal hits, misses key = args if kwds: - key += kwd_mark + tuple(sorted(kwds.items())) + sorted_items = tuple(sorted(kwds.items())) + key += kwd_mark + sorted_items + if typed: + key += tuple(map(type, args)) + if kwds: + key += tuple(type(v) for k, v in sorted_items) try: result = cache[key] hits += 1 @@ -177,7 +186,12 @@ nonlocal hits, misses key = args if kwds: - key += kwd_mark + tuple(sorted(kwds.items())) + sorted_items = tuple(sorted(kwds.items())) + key += kwd_mark + sorted_items + if typed: + key += tuple(map(type, args)) + if kwds: + key += tuple(type(v) for k, v in sorted_items) with lock: try: result = cache[key] diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -207,7 +207,7 @@ def purge(): "Clear the regular expression caches" - _compile_typed.cache_clear() + _compile.cache_clear() _compile_repl.cache_clear() def template(pattern, flags=0): @@ -253,11 +253,8 @@ _pattern_type = type(sre_compile.compile("", 0)) + at functools.lru_cache(maxsize=500, typed=True) def _compile(pattern, flags): - return _compile_typed(type(pattern), pattern, flags) - - at functools.lru_cache(maxsize=500) -def _compile_typed(text_bytes_type, pattern, flags): # internal: compile pattern if isinstance(pattern, _pattern_type): if flags: diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py --- a/Lib/test/test_functools.py +++ b/Lib/test/test_functools.py @@ -734,6 +734,22 @@ with self.assertRaises(IndexError): func(15) + def test_lru_with_types(self): + for maxsize in (None, 100): + @functools.lru_cache(maxsize=maxsize, typed=True) + def square(x): + return x * x + self.assertEqual(square(3), 9) + self.assertEqual(type(square(3)), type(9)) + self.assertEqual(square(3.0), 9.0) + self.assertEqual(type(square(3.0)), type(9.0)) + self.assertEqual(square(x=3), 9) + self.assertEqual(type(square(x=3)), type(9)) + self.assertEqual(square(x=3.0), 9.0) + self.assertEqual(type(square(x=3.0)), type(9.0)) + self.assertEqual(square.cache_info().hits, 4) + self.assertEqual(square.cache_info().misses, 4) + def test_main(verbose=None): test_classes = ( TestPartial, diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -319,6 +319,9 @@ Library ------- +- Issue #13227: functools.lru_cache() now has a option to distinguish + calls with different argument types. + - Issue #6090: zipfile raises a ValueError when a document with a timestamp earlier than 1980 is provided. Patch contributed by Petri Lehtinen. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:22:19 2011 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 20 Oct 2011 18:22:19 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_calls_in_fnmatch?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/8645f8a567f9 changeset: 73020:8645f8a567f9 user: Raymond Hettinger date: Thu Oct 20 09:22:10 2011 -0700 summary: Simplify calls in fnmatch. files: Lib/fnmatch.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -35,9 +35,9 @@ pat = os.path.normcase(pat) return fnmatchcase(name, pat) - at functools.lru_cache(maxsize=250) -def _compile_pattern(pat, is_bytes=False): - if is_bytes: + at functools.lru_cache(maxsize=250, typed=True) +def _compile_pattern(pat): + if isinstance(pat, bytes): pat_str = str(pat, 'ISO-8859-1') res_str = translate(pat_str) res = bytes(res_str, 'ISO-8859-1') @@ -49,7 +49,7 @@ """Return the subset of the list NAMES that match PAT.""" result = [] pat = os.path.normcase(pat) - match = _compile_pattern(pat, isinstance(pat, bytes)) + match = _compile_pattern(pat) if os.path is posixpath: # normcase on posix is NOP. Optimize it away from the loop. for name in names: @@ -67,7 +67,7 @@ This is a version of fnmatch() which doesn't case-normalize its arguments. """ - match = _compile_pattern(pat, isinstance(pat, bytes)) + match = _compile_pattern(pat) return match(name) is not None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:34:51 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 20 Oct 2011 18:34:51 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_News_entry_for_?= =?utf8?q?Issue12529_and_Issue12604?= Message-ID: http://hg.python.org/cpython/rev/cfc545e028e0 changeset: 73021:cfc545e028e0 branch: 3.2 parent: 73014:48e0db1cf7e4 user: Senthil Kumaran date: Fri Oct 21 00:29:47 2011 +0800 summary: News entry for Issue12529 and Issue12604 files: Misc/NEWS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler + warnings. Patch by Josh Triplett and Petri Lehtinen. + - Issue #13188: When called without an explicit traceback argument, generator.throw() now gets the traceback from the passed exception's ``__traceback__`` attribute. Patch by Petri Lehtinen. @@ -51,6 +54,9 @@ Library ------- +- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and + semicolons together. Patch by Ben Darnell and Petri Lehtinen. + - Issue #12448: smtplib now flushes stdout while running ``python -m smtplib`` in order to display the prompt correctly. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:34:52 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 20 Oct 2011 18:34:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_News_entry_for_Issue12529_and_Issue12604?= Message-ID: http://hg.python.org/cpython/rev/52a4e899966c changeset: 73022:52a4e899966c parent: 73019:cba503a2c468 parent: 73021:cfc545e028e0 user: Senthil Kumaran date: Fri Oct 21 00:31:40 2011 +0800 summary: News entry for Issue12529 and Issue12604 files: Misc/NEWS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler + warnings. Patch by Josh Triplett and Petri Lehtinen. + - Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore error handlers on all Windows versions. The MBCS codec is now supporting all error handlers, instead of only replace to encode and ignore to decode. @@ -319,6 +322,9 @@ Library ------- +- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and + semicolons together. Patch by Ben Darnell and Petri Lehtinen. + - Issue #13227: functools.lru_cache() now has a option to distinguish calls with different argument types. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:34:53 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 20 Oct 2011 18:34:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_News_entry_for_?= =?utf8?q?Issue12529_and_Issue12604?= Message-ID: http://hg.python.org/cpython/rev/6f7ddbfafbb0 changeset: 73023:6f7ddbfafbb0 branch: 2.7 parent: 72994:f35514dfadf8 user: Senthil Kumaran date: Fri Oct 21 00:32:59 2011 +0800 summary: News entry for Issue12529 and Issue12604 files: Misc/NEWS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler + warnings. Patch by Josh Triplett and Petri Lehtinen. + - Issue #7833: Extension modules built using distutils on Windows will no longer include a "manifest" to prevent them failing at import time in some embedded situations. @@ -63,6 +66,9 @@ Library ------- +- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and + semicolons together. Patch by Ben Darnell and Petri Lehtinen. + - Issue #6090: zipfile raises a ValueError when a document with a timestamp earlier than 1980 is provided. Patch contributed by Petri Lehtinen. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:34:54 2011 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 20 Oct 2011 18:34:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/d383af9d62d2 changeset: 73024:d383af9d62d2 parent: 73022:52a4e899966c parent: 73020:8645f8a567f9 user: Senthil Kumaran date: Fri Oct 21 00:34:27 2011 +0800 summary: merge heads files: Lib/fnmatch.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -35,9 +35,9 @@ pat = os.path.normcase(pat) return fnmatchcase(name, pat) - at functools.lru_cache(maxsize=250) -def _compile_pattern(pat, is_bytes=False): - if is_bytes: + at functools.lru_cache(maxsize=250, typed=True) +def _compile_pattern(pat): + if isinstance(pat, bytes): pat_str = str(pat, 'ISO-8859-1') res_str = translate(pat_str) res = bytes(res_str, 'ISO-8859-1') @@ -49,7 +49,7 @@ """Return the subset of the list NAMES that match PAT.""" result = [] pat = os.path.normcase(pat) - match = _compile_pattern(pat, isinstance(pat, bytes)) + match = _compile_pattern(pat) if os.path is posixpath: # normcase on posix is NOP. Optimize it away from the loop. for name in names: @@ -67,7 +67,7 @@ This is a version of fnmatch() which doesn't case-normalize its arguments. """ - match = _compile_pattern(pat, isinstance(pat, bytes)) + match = _compile_pattern(pat) return match(name) is not None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:43:31 2011 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 20 Oct 2011 18:43:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Bytes_are_already_distinct_?= =?utf8?q?from_text=2C_so_typed=3DTrue_isn=27t_necessary=2E?= Message-ID: http://hg.python.org/cpython/rev/5fa0cb61760d changeset: 73025:5fa0cb61760d parent: 73020:8645f8a567f9 user: Raymond Hettinger date: Thu Oct 20 09:42:05 2011 -0700 summary: Bytes are already distinct from text, so typed=True isn't necessary. files: Lib/fnmatch.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py --- a/Lib/fnmatch.py +++ b/Lib/fnmatch.py @@ -35,7 +35,7 @@ pat = os.path.normcase(pat) return fnmatchcase(name, pat) - at functools.lru_cache(maxsize=250, typed=True) + at functools.lru_cache(maxsize=250) def _compile_pattern(pat): if isinstance(pat, bytes): pat_str = str(pat, 'ISO-8859-1') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:43:32 2011 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 20 Oct 2011 18:43:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/6badd5fcdc08 changeset: 73026:6badd5fcdc08 parent: 73025:5fa0cb61760d parent: 73024:d383af9d62d2 user: Raymond Hettinger date: Thu Oct 20 09:43:12 2011 -0700 summary: merge files: Misc/NEWS | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler + warnings. Patch by Josh Triplett and Petri Lehtinen. + - Issue #12281: Rewrite the MBCS codec to handle correctly replace and ignore error handlers on all Windows versions. The MBCS codec is now supporting all error handlers, instead of only replace to encode and ignore to decode. @@ -319,6 +322,9 @@ Library ------- +- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and + semicolons together. Patch by Ben Darnell and Petri Lehtinen. + - Issue #13227: functools.lru_cache() now has a option to distinguish calls with different argument types. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:45:58 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:45:58 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMjE5OiBjbGFy?= =?utf8?q?ify_section_about_character_sets_in_the_re_documentation=2E?= Message-ID: http://hg.python.org/cpython/rev/07eca800cdb4 changeset: 73027:07eca800cdb4 branch: 2.7 parent: 72994:f35514dfadf8 user: Ezio Melotti date: Thu Oct 20 19:31:08 2011 +0300 summary: #13219: clarify section about character sets in the re documentation. files: Doc/library/re.rst | 50 +++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -156,30 +156,36 @@ raw strings for all but the simplest expressions. ``[]`` - Used to indicate a set of characters. Characters can be listed individually, or - a range of characters can be indicated by giving two characters and separating - them by a ``'-'``. Special characters are not active inside sets. For example, - ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, - ``'m'``, or ``'$'``; ``[a-z]`` will match any lowercase letter, and - ``[a-zA-Z0-9]`` matches any letter or digit. Character classes such - as ``\w`` or ``\S`` (defined below) are also acceptable inside a - range, although the characters they match depends on whether :const:`LOCALE` - or :const:`UNICODE` mode is in force. If you want to include a - ``']'`` or a ``'-'`` inside a set, precede it with a backslash, or - place it as the first character. The pattern ``[]]`` will match - ``']'``, for example. + Used to indicate a set of characters. In a set: - You can match the characters not within a range by :dfn:`complementing` the set. - This is indicated by including a ``'^'`` as the first character of the set; - ``'^'`` elsewhere will simply match the ``'^'`` character. For example, - ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any - character except ``'^'``. + * Characters can be listed individually, e.g. ``[amk]`` will match ``'a'``, + ``'m'``, or ``'k'``. - Note that inside ``[]`` the special forms and special characters lose - their meanings and only the syntaxes described here are valid. For - example, ``+``, ``*``, ``(``, ``)``, and so on are treated as - literals inside ``[]``, and backreferences cannot be used inside - ``[]``. + * Ranges of characters can be indicated by giving two characters and separating + them by a ``'-'``, for example ``[a-z]`` will match any lowercase ASCII letter, + ``[0-5][0-9]`` will match all the two-digits numbers from ``00`` to ``59``, and + ``[0-9A-Fa-f]`` will match any hexadecimal digit. If ``-`` is escaped (e.g. + ``[a\-z]``) or if it's placed as the first or last character (e.g. ``[a-]``), + it will match a literal ``'-'``. + + * Special characters lose their special meaning inside sets. For example, + ``[(+*)]`` will match any of the literal characters ``'('``, ``'+'``, + ``'*'``, or ``')'``. + + * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted + inside a set, although the characters they match depends on whether + :const:`LOCALE` or :const:`UNICODE` mode is in force. + + * Characters that are not within a range can be matched by :dfn:`complementing` + the set. If the first character of the set is ``'^'``, all the characters + that are *not* in the set will be matched. For example, ``[^5]`` will match + any character except ``'5'``, and ``[^^]`` will match any character except + ``'^'``. ``^`` has no special meaning if it's not the first character in + the set. + + * To match a literal ``']'`` inside a set, precede it with a backslash, or + place it at the beginning of the set. For example, both ``[()[\]{}]`` and + ``[]()[{}]`` will both match a parenthesis. ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:45:59 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:45:59 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMjE5OiBjbGFy?= =?utf8?q?ify_section_about_character_sets_in_the_re_documentation=2E?= Message-ID: http://hg.python.org/cpython/rev/dc96a89ac192 changeset: 73028:dc96a89ac192 branch: 3.2 parent: 73021:cfc545e028e0 user: Ezio Melotti date: Thu Oct 20 19:38:04 2011 +0300 summary: #13219: clarify section about character sets in the re documentation. files: Doc/library/re.rst | 50 +++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -161,30 +161,36 @@ raw strings for all but the simplest expressions. ``[]`` - Used to indicate a set of characters. Characters can be listed individually, or - a range of characters can be indicated by giving two characters and separating - them by a ``'-'``. Special characters are not active inside sets. For example, - ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, - ``'m'``, or ``'$'``; ``[a-z]`` will match any lowercase letter, and - ``[a-zA-Z0-9]`` matches any letter or digit. Character classes such - as ``\w`` or ``\S`` (defined below) are also acceptable inside a - range, although the characters they match depends on whether - :const:`ASCII` or :const:`LOCALE` mode is in force. If you want to - include a ``']'`` or a ``'-'`` inside a set, precede it with a - backslash, or place it as the first character. The pattern ``[]]`` - will match ``']'``, for example. + Used to indicate a set of characters. In a set: - You can match the characters not within a range by :dfn:`complementing` the set. - This is indicated by including a ``'^'`` as the first character of the set; - ``'^'`` elsewhere will simply match the ``'^'`` character. For example, - ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any - character except ``'^'``. + * Characters can be listed individually, e.g. ``[amk]`` will match ``'a'``, + ``'m'``, or ``'k'``. - Note that inside ``[]`` the special forms and special characters lose - their meanings and only the syntaxes described here are valid. For - example, ``+``, ``*``, ``(``, ``)``, and so on are treated as - literals inside ``[]``, and backreferences cannot be used inside - ``[]``. + * Ranges of characters can be indicated by giving two characters and separating + them by a ``'-'``, for example ``[a-z]`` will match any lowercase ASCII letter, + ``[0-5][0-9]`` will match all the two-digits numbers from ``00`` to ``59``, and + ``[0-9A-Fa-f]`` will match any hexadecimal digit. If ``-`` is escaped (e.g. + ``[a\-z]``) or if it's placed as the first or last character (e.g. ``[a-]``), + it will match a literal ``'-'``. + + * Special characters lose their special meaning inside sets. For example, + ``[(+*)]`` will match any of the literal characters ``'('``, ``'+'``, + ``'*'``, or ``')'``. + + * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted + inside a set, although the characters they match depends on whether + :const:`ASCII` or :const:`LOCALE` mode is in force. + + * Characters that are not within a range can be matched by :dfn:`complementing` + the set. If the first character of the set is ``'^'``, all the characters + that are *not* in the set will be matched. For example, ``[^5]`` will match + any character except ``'5'``, and ``[^^]`` will match any character except + ``'^'``. ``^`` has no special meaning if it's not the first character in + the set. + + * To match a literal ``']'`` inside a set, precede it with a backslash, or + place it at the beginning of the set. For example, both ``[()[\]{}]`` and + ``[]()[{}]`` will both match a parenthesis. ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:46:00 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:46:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313219=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/78540d1264d9 changeset: 73029:78540d1264d9 parent: 73024:d383af9d62d2 parent: 73028:dc96a89ac192 user: Ezio Melotti date: Thu Oct 20 19:40:44 2011 +0300 summary: #13219: merge with 3.2. files: Doc/library/re.rst | 50 +++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -161,30 +161,36 @@ raw strings for all but the simplest expressions. ``[]`` - Used to indicate a set of characters. Characters can be listed individually, or - a range of characters can be indicated by giving two characters and separating - them by a ``'-'``. Special characters are not active inside sets. For example, - ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, - ``'m'``, or ``'$'``; ``[a-z]`` will match any lowercase letter, and - ``[a-zA-Z0-9]`` matches any letter or digit. Character classes such - as ``\w`` or ``\S`` (defined below) are also acceptable inside a - range, although the characters they match depends on whether - :const:`ASCII` or :const:`LOCALE` mode is in force. If you want to - include a ``']'`` or a ``'-'`` inside a set, precede it with a - backslash, or place it as the first character. The pattern ``[]]`` - will match ``']'``, for example. + Used to indicate a set of characters. In a set: - You can match the characters not within a range by :dfn:`complementing` the set. - This is indicated by including a ``'^'`` as the first character of the set; - ``'^'`` elsewhere will simply match the ``'^'`` character. For example, - ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any - character except ``'^'``. + * Characters can be listed individually, e.g. ``[amk]`` will match ``'a'``, + ``'m'``, or ``'k'``. - Note that inside ``[]`` the special forms and special characters lose - their meanings and only the syntaxes described here are valid. For - example, ``+``, ``*``, ``(``, ``)``, and so on are treated as - literals inside ``[]``, and backreferences cannot be used inside - ``[]``. + * Ranges of characters can be indicated by giving two characters and separating + them by a ``'-'``, for example ``[a-z]`` will match any lowercase ASCII letter, + ``[0-5][0-9]`` will match all the two-digits numbers from ``00`` to ``59``, and + ``[0-9A-Fa-f]`` will match any hexadecimal digit. If ``-`` is escaped (e.g. + ``[a\-z]``) or if it's placed as the first or last character (e.g. ``[a-]``), + it will match a literal ``'-'``. + + * Special characters lose their special meaning inside sets. For example, + ``[(+*)]`` will match any of the literal characters ``'('``, ``'+'``, + ``'*'``, or ``')'``. + + * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted + inside a set, although the characters they match depends on whether + :const:`ASCII` or :const:`LOCALE` mode is in force. + + * Characters that are not within a range can be matched by :dfn:`complementing` + the set. If the first character of the set is ``'^'``, all the characters + that are *not* in the set will be matched. For example, ``[^5]`` will match + any character except ``'5'``, and ``[^^]`` will match any character except + ``'^'``. ``^`` has no special meaning if it's not the first character in + the set. + + * To match a literal ``']'`` inside a set, precede it with a backslash, or + place it at the beginning of the set. For example, both ``[()[\]{}]`` and + ``[]()[{}]`` will both match a parenthesis. ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:46:00 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:46:00 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Merge_heads=2E?= Message-ID: http://hg.python.org/cpython/rev/14a84d27eb68 changeset: 73030:14a84d27eb68 branch: 2.7 parent: 73023:6f7ddbfafbb0 parent: 73027:07eca800cdb4 user: Ezio Melotti date: Thu Oct 20 19:43:24 2011 +0300 summary: Merge heads. files: Doc/library/re.rst | 50 +++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -156,30 +156,36 @@ raw strings for all but the simplest expressions. ``[]`` - Used to indicate a set of characters. Characters can be listed individually, or - a range of characters can be indicated by giving two characters and separating - them by a ``'-'``. Special characters are not active inside sets. For example, - ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, - ``'m'``, or ``'$'``; ``[a-z]`` will match any lowercase letter, and - ``[a-zA-Z0-9]`` matches any letter or digit. Character classes such - as ``\w`` or ``\S`` (defined below) are also acceptable inside a - range, although the characters they match depends on whether :const:`LOCALE` - or :const:`UNICODE` mode is in force. If you want to include a - ``']'`` or a ``'-'`` inside a set, precede it with a backslash, or - place it as the first character. The pattern ``[]]`` will match - ``']'``, for example. + Used to indicate a set of characters. In a set: - You can match the characters not within a range by :dfn:`complementing` the set. - This is indicated by including a ``'^'`` as the first character of the set; - ``'^'`` elsewhere will simply match the ``'^'`` character. For example, - ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any - character except ``'^'``. + * Characters can be listed individually, e.g. ``[amk]`` will match ``'a'``, + ``'m'``, or ``'k'``. - Note that inside ``[]`` the special forms and special characters lose - their meanings and only the syntaxes described here are valid. For - example, ``+``, ``*``, ``(``, ``)``, and so on are treated as - literals inside ``[]``, and backreferences cannot be used inside - ``[]``. + * Ranges of characters can be indicated by giving two characters and separating + them by a ``'-'``, for example ``[a-z]`` will match any lowercase ASCII letter, + ``[0-5][0-9]`` will match all the two-digits numbers from ``00`` to ``59``, and + ``[0-9A-Fa-f]`` will match any hexadecimal digit. If ``-`` is escaped (e.g. + ``[a\-z]``) or if it's placed as the first or last character (e.g. ``[a-]``), + it will match a literal ``'-'``. + + * Special characters lose their special meaning inside sets. For example, + ``[(+*)]`` will match any of the literal characters ``'('``, ``'+'``, + ``'*'``, or ``')'``. + + * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted + inside a set, although the characters they match depends on whether + :const:`LOCALE` or :const:`UNICODE` mode is in force. + + * Characters that are not within a range can be matched by :dfn:`complementing` + the set. If the first character of the set is ``'^'``, all the characters + that are *not* in the set will be matched. For example, ``[^5]`` will match + any character except ``'5'``, and ``[^^]`` will match any character except + ``'^'``. ``^`` has no special meaning if it's not the first character in + the set. + + * To match a literal ``']'`` inside a set, precede it with a backslash, or + place it at the beginning of the set. For example, both ``[()[\]{}]`` and + ``[]()[{}]`` will both match a parenthesis. ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:46:01 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:46:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2UgaGVhZHMu?= Message-ID: http://hg.python.org/cpython/rev/058e5027ecac changeset: 73031:058e5027ecac parent: 73026:6badd5fcdc08 parent: 73029:78540d1264d9 user: Ezio Melotti date: Thu Oct 20 19:45:39 2011 +0300 summary: Merge heads. files: Doc/library/re.rst | 50 +++++++++++++++++++-------------- 1 files changed, 28 insertions(+), 22 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -161,30 +161,36 @@ raw strings for all but the simplest expressions. ``[]`` - Used to indicate a set of characters. Characters can be listed individually, or - a range of characters can be indicated by giving two characters and separating - them by a ``'-'``. Special characters are not active inside sets. For example, - ``[akm$]`` will match any of the characters ``'a'``, ``'k'``, - ``'m'``, or ``'$'``; ``[a-z]`` will match any lowercase letter, and - ``[a-zA-Z0-9]`` matches any letter or digit. Character classes such - as ``\w`` or ``\S`` (defined below) are also acceptable inside a - range, although the characters they match depends on whether - :const:`ASCII` or :const:`LOCALE` mode is in force. If you want to - include a ``']'`` or a ``'-'`` inside a set, precede it with a - backslash, or place it as the first character. The pattern ``[]]`` - will match ``']'``, for example. + Used to indicate a set of characters. In a set: - You can match the characters not within a range by :dfn:`complementing` the set. - This is indicated by including a ``'^'`` as the first character of the set; - ``'^'`` elsewhere will simply match the ``'^'`` character. For example, - ``[^5]`` will match any character except ``'5'``, and ``[^^]`` will match any - character except ``'^'``. + * Characters can be listed individually, e.g. ``[amk]`` will match ``'a'``, + ``'m'``, or ``'k'``. - Note that inside ``[]`` the special forms and special characters lose - their meanings and only the syntaxes described here are valid. For - example, ``+``, ``*``, ``(``, ``)``, and so on are treated as - literals inside ``[]``, and backreferences cannot be used inside - ``[]``. + * Ranges of characters can be indicated by giving two characters and separating + them by a ``'-'``, for example ``[a-z]`` will match any lowercase ASCII letter, + ``[0-5][0-9]`` will match all the two-digits numbers from ``00`` to ``59``, and + ``[0-9A-Fa-f]`` will match any hexadecimal digit. If ``-`` is escaped (e.g. + ``[a\-z]``) or if it's placed as the first or last character (e.g. ``[a-]``), + it will match a literal ``'-'``. + + * Special characters lose their special meaning inside sets. For example, + ``[(+*)]`` will match any of the literal characters ``'('``, ``'+'``, + ``'*'``, or ``')'``. + + * Character classes such as ``\w`` or ``\S`` (defined below) are also accepted + inside a set, although the characters they match depends on whether + :const:`ASCII` or :const:`LOCALE` mode is in force. + + * Characters that are not within a range can be matched by :dfn:`complementing` + the set. If the first character of the set is ``'^'``, all the characters + that are *not* in the set will be matched. For example, ``[^5]`` will match + any character except ``'5'``, and ``[^^]`` will match any character except + ``'^'``. ``^`` has no special meaning if it's not the first character in + the set. + + * To match a literal ``']'`` inside a set, precede it with a backslash, or + place it at the beginning of the set. For example, both ``[()[\]{}]`` and + ``[]()[{}]`` will both match a parenthesis. ``'|'`` ``A|B``, where A and B can be arbitrary REs, creates a regular expression that -- Repository URL: http://hg.python.org/cpython From senthil at uthcode.com Thu Oct 20 18:46:28 2011 From: senthil at uthcode.com (Senthil Kumaran) Date: Fri, 21 Oct 2011 00:46:28 +0800 Subject: [Python-checkins] [Python-Dev] cpython (2.7): Fix closes Issue12529 - cgi.parse_header failure on double quotes and In-Reply-To: References: Message-ID: <20111020164628.GB1964@mathmagic> On Thu, Oct 20, 2011 at 07:17:10AM +1000, Nick Coghlan wrote: > NEWS entry? (same question for the later _sre fix) Added. Thanks for catching this. For some reason, I had slight doubt, if those issues were NEWS worthy items. IIRC, devguide recommends that a NEWS entry be added for all fixes made, but still had a suspicion, if we unnecessarily add up too many entries to NEWS. Thanks, Senthil From python-checkins at python.org Thu Oct 20 18:53:55 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:53:55 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMjMzOiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/1d8fad82c32d changeset: 73032:1d8fad82c32d branch: 3.2 parent: 73028:dc96a89ac192 user: Ezio Melotti date: Thu Oct 20 19:51:18 2011 +0300 summary: #13233: fix typo. files: Doc/library/os.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -910,7 +910,7 @@ try: fp = open("myfile") except IOError as e: - if e.errno == errno.EACCESS: + if e.errno == errno.EACCES: return "some default data" # Not a permission error. raise -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:53:56 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:53:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313233=3A_null_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/99c8b93c57cd changeset: 73033:99c8b93c57cd parent: 73031:058e5027ecac parent: 73032:1d8fad82c32d user: Ezio Melotti date: Thu Oct 20 19:53:35 2011 +0300 summary: #13233: null merge with 3.2. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 18:54:49 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 20 Oct 2011 18:54:49 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMjMzOiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/8bf9724dcd49 changeset: 73034:8bf9724dcd49 branch: 2.7 parent: 73030:14a84d27eb68 user: Ezio Melotti date: Thu Oct 20 19:49:29 2011 +0300 summary: #13233: fix typo. files: Doc/library/os.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -936,7 +936,7 @@ try: fp = open("myfile") except IOError as e: - if e.errno == errno.EACCESS: + if e.errno == errno.EACCES: return "some default data" # Not a permission error. raise -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 23:15:40 2011 From: python-checkins at python.org (florent.xicluna) Date: Thu, 20 Oct 2011 23:15:40 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzkxNjg6?= =?utf8?q?_now_smtpd_is_able_to_bind_privileged_port=2E?= Message-ID: http://hg.python.org/cpython/rev/7d92b94b0eec changeset: 73035:7d92b94b0eec branch: 3.2 parent: 73032:1d8fad82c32d user: Florent Xicluna date: Thu Oct 20 23:03:43 2011 +0200 summary: Issue #9168: now smtpd is able to bind privileged port. files: Lib/smtpd.py | 20 ++++++++++---------- Misc/NEWS | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Lib/smtpd.py b/Lib/smtpd.py --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -678,6 +678,16 @@ if __name__ == '__main__': options = parseargs() # Become nobody + classname = options.classname + if "." in classname: + lastdot = classname.rfind(".") + mod = __import__(classname[:lastdot], globals(), locals(), [""]) + classname = classname[lastdot+1:] + else: + import __main__ as mod + class_ = getattr(mod, classname) + proxy = class_((options.localhost, options.localport), + (options.remotehost, options.remoteport)) if options.setuid: try: import pwd @@ -691,16 +701,6 @@ if e.errno != errno.EPERM: raise print('Cannot setuid "nobody"; try running with -n option.', file=sys.stderr) sys.exit(1) - classname = options.classname - if "." in classname: - lastdot = classname.rfind(".") - mod = __import__(classname[:lastdot], globals(), locals(), [""]) - classname = classname[lastdot+1:] - else: - import __main__ as mod - class_ = getattr(mod, classname) - proxy = class_((options.localhost, options.localport), - (options.remotehost, options.remoteport)) try: asyncore.loop() except KeyboardInterrupt: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,8 @@ Library ------- +- Issue #9168: now smtpd is able to bind privileged port. + - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and semicolons together. Patch by Ben Darnell and Petri Lehtinen. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 23:15:41 2011 From: python-checkins at python.org (florent.xicluna) Date: Thu, 20 Oct 2011 23:15:41 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=239168=3A_now_smtpd_is_able_to_bind_privileged_port?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/bbd92b42508e changeset: 73036:bbd92b42508e parent: 73033:99c8b93c57cd parent: 73035:7d92b94b0eec user: Florent Xicluna date: Thu Oct 20 23:14:36 2011 +0200 summary: Issue #9168: now smtpd is able to bind privileged port. files: Lib/smtpd.py | 20 ++++++++++---------- Misc/NEWS | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Lib/smtpd.py b/Lib/smtpd.py --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -678,6 +678,16 @@ if __name__ == '__main__': options = parseargs() # Become nobody + classname = options.classname + if "." in classname: + lastdot = classname.rfind(".") + mod = __import__(classname[:lastdot], globals(), locals(), [""]) + classname = classname[lastdot+1:] + else: + import __main__ as mod + class_ = getattr(mod, classname) + proxy = class_((options.localhost, options.localport), + (options.remotehost, options.remoteport)) if options.setuid: try: import pwd @@ -691,16 +701,6 @@ if e.errno != errno.EPERM: raise print('Cannot setuid "nobody"; try running with -n option.', file=sys.stderr) sys.exit(1) - classname = options.classname - if "." in classname: - lastdot = classname.rfind(".") - mod = __import__(classname[:lastdot], globals(), locals(), [""]) - classname = classname[lastdot+1:] - else: - import __main__ as mod - class_ = getattr(mod, classname) - proxy = class_((options.localhost, options.localport), - (options.remotehost, options.remoteport)) try: asyncore.loop() except KeyboardInterrupt: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -322,6 +322,8 @@ Library ------- +- Issue #9168: now smtpd is able to bind privileged port. + - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and semicolons together. Patch by Ben Darnell and Petri Lehtinen. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 20 23:22:22 2011 From: python-checkins at python.org (florent.xicluna) Date: Thu, 20 Oct 2011 23:22:22 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzkxNjg6?= =?utf8?q?_now_smtpd_is_able_to_bind_privileged_port=2E?= Message-ID: http://hg.python.org/cpython/rev/d2f303861c98 changeset: 73037:d2f303861c98 branch: 2.7 parent: 73034:8bf9724dcd49 user: Florent Xicluna date: Thu Oct 20 23:21:58 2011 +0200 summary: Issue #9168: now smtpd is able to bind privileged port. files: Lib/smtpd.py | 20 ++++++++++---------- Misc/NEWS | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Lib/smtpd.py b/Lib/smtpd.py --- a/Lib/smtpd.py +++ b/Lib/smtpd.py @@ -524,6 +524,16 @@ if __name__ == '__main__': options = parseargs() # Become nobody + classname = options.classname + if "." in classname: + lastdot = classname.rfind(".") + mod = __import__(classname[:lastdot], globals(), locals(), [""]) + classname = classname[lastdot+1:] + else: + import __main__ as mod + class_ = getattr(mod, classname) + proxy = class_((options.localhost, options.localport), + (options.remotehost, options.remoteport)) if options.setuid: try: import pwd @@ -539,16 +549,6 @@ print >> sys.stderr, \ 'Cannot setuid "nobody"; try running with -n option.' sys.exit(1) - classname = options.classname - if "." in classname: - lastdot = classname.rfind(".") - mod = __import__(classname[:lastdot], globals(), locals(), [""]) - classname = classname[lastdot+1:] - else: - import __main__ as mod - class_ = getattr(mod, classname) - proxy = class_((options.localhost, options.localport), - (options.remotehost, options.remoteport)) try: asyncore.loop() except KeyboardInterrupt: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,8 @@ Library ------- +- Issue #9168: now smtpd is able to bind privileged port. + - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and semicolons together. Patch by Ben Darnell and Petri Lehtinen. -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Thu Oct 20 23:57:25 2011 From: ncoghlan at gmail.com (Nick Coghlan) Date: Fri, 21 Oct 2011 07:57:25 +1000 Subject: [Python-checkins] [Python-Dev] cpython (2.7): Fix closes Issue12529 - cgi.parse_header failure on double quotes and In-Reply-To: <20111020164628.GB1964@mathmagic> References: <20111020164628.GB1964@mathmagic> Message-ID: My take is that a further fix or tweak to something that already has a NEWS entry for the current release doesn't get a new entry, but everything else does. "What's New" is the place to get selective. -- Nick Coghlan (via Gmail on Android, so likely to be more terse than usual) On Oct 21, 2011 2:46 AM, "Senthil Kumaran" wrote: > On Thu, Oct 20, 2011 at 07:17:10AM +1000, Nick Coghlan wrote: > > NEWS entry? (same question for the later _sre fix) > > Added. Thanks for catching this. > > For some reason, I had slight doubt, if those issues were NEWS worthy > items. IIRC, devguide recommends that a NEWS entry be added for all fixes > made, but still had a suspicion, if we unnecessarily add up too many > entries to NEWS. > > Thanks, > Senthil > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Thu Oct 20 23:58:17 2011 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 20 Oct 2011 23:58:17 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312170=3A_The_count?= =?utf8?b?KCksIGZpbmQoKSwgcmZpbmQoKSwgaW5kZXgoKSBhbmQgcmluZGV4KCkgbWV0aG9k?= =?utf8?q?s?= Message-ID: http://hg.python.org/cpython/rev/c1effa2cdd20 changeset: 73038:c1effa2cdd20 parent: 73036:bbd92b42508e user: Antoine Pitrou date: Thu Oct 20 23:54:17 2011 +0200 summary: Issue #12170: The count(), find(), rfind(), index() and rindex() methods of bytes and bytearray objects now accept an integer between 0 and 255 as their first argument. Patch by Petri Lehtinen. files: Doc/library/stdtypes.rst | 6 + Lib/test/string_tests.py | 35 +++++++- Lib/test/test_bytes.py | 103 ++++++++++++++++++++++--- Misc/NEWS | 4 + Objects/bytearrayobject.c | 59 +++++++++++--- Objects/bytesobject.c | 64 +++++++++++---- Objects/stringlib/find.h | 43 ++++++++++ 7 files changed, 262 insertions(+), 52 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1805,6 +1805,12 @@ Wherever one of these methods needs to interpret the bytes as characters (e.g. the :func:`is...` methods), the ASCII character set is assumed. +.. versionadded:: 3.3 + The functions :func:`count`, :func:`find`, :func:`index`, + :func:`rfind` and :func:`rindex` have additional semantics compared to + the corresponding string functions: They also accept an integer in + range 0 to 255 (a byte) as their first argument. + .. note:: The methods on bytes and bytearray objects don't accept strings as their diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -28,6 +28,11 @@ # Change in subclasses to change the behaviour of fixtesttype() type2test = None + # Whether the "contained items" of the container are integers in + # range(0, 256) (i.e. bytes, bytearray) or strings of length 1 + # (str) + contains_bytes = False + # All tests pass their arguments to the testing methods # as str objects. fixtesttype() can be used to propagate # these arguments to the appropriate type @@ -117,7 +122,11 @@ self.checkequal(0, '', 'count', 'xx', sys.maxsize, 0) self.checkraises(TypeError, 'hello', 'count') - self.checkraises(TypeError, 'hello', 'count', 42) + + if self.contains_bytes: + self.checkequal(0, 'hello', 'count', 42) + else: + self.checkraises(TypeError, 'hello', 'count', 42) # For a variety of combinations, # verify that str.count() matches an equivalent function @@ -163,7 +172,11 @@ self.checkequal( 2, 'rrarrrrrrrrra', 'find', 'a', None, 6) self.checkraises(TypeError, 'hello', 'find') - self.checkraises(TypeError, 'hello', 'find', 42) + + if self.contains_bytes: + self.checkequal(-1, 'hello', 'find', 42) + else: + self.checkraises(TypeError, 'hello', 'find', 42) self.checkequal(0, '', 'find', '') self.checkequal(-1, '', 'find', '', 1, 1) @@ -217,7 +230,11 @@ self.checkequal( 2, 'rrarrrrrrrrra', 'rfind', 'a', None, 6) self.checkraises(TypeError, 'hello', 'rfind') - self.checkraises(TypeError, 'hello', 'rfind', 42) + + if self.contains_bytes: + self.checkequal(-1, 'hello', 'rfind', 42) + else: + self.checkraises(TypeError, 'hello', 'rfind', 42) # For a variety of combinations, # verify that str.rfind() matches __contains__ @@ -264,7 +281,11 @@ self.checkequal( 2, 'rrarrrrrrrrra', 'index', 'a', None, 6) self.checkraises(TypeError, 'hello', 'index') - self.checkraises(TypeError, 'hello', 'index', 42) + + if self.contains_bytes: + self.checkraises(ValueError, 'hello', 'index', 42) + else: + self.checkraises(TypeError, 'hello', 'index', 42) def test_rindex(self): self.checkequal(12, 'abcdefghiabc', 'rindex', '') @@ -286,7 +307,11 @@ self.checkequal( 2, 'rrarrrrrrrrra', 'rindex', 'a', None, 6) self.checkraises(TypeError, 'hello', 'rindex') - self.checkraises(TypeError, 'hello', 'rindex', 42) + + if self.contains_bytes: + self.checkraises(ValueError, 'hello', 'rindex', 42) + else: + self.checkraises(TypeError, 'hello', 'rindex', 42) def test_lower(self): self.checkequal('hello', 'HeLLo', 'lower') diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -293,10 +293,27 @@ def test_count(self): b = self.type2test(b'mississippi') + i = 105 + p = 112 + w = 119 + self.assertEqual(b.count(b'i'), 4) self.assertEqual(b.count(b'ss'), 2) self.assertEqual(b.count(b'w'), 0) + self.assertEqual(b.count(i), 4) + self.assertEqual(b.count(w), 0) + + self.assertEqual(b.count(b'i', 6), 2) + self.assertEqual(b.count(b'p', 6), 2) + self.assertEqual(b.count(b'i', 1, 3), 1) + self.assertEqual(b.count(b'p', 7, 9), 1) + + self.assertEqual(b.count(i, 6), 2) + self.assertEqual(b.count(p, 6), 2) + self.assertEqual(b.count(i, 1, 3), 1) + self.assertEqual(b.count(p, 7, 9), 1) + def test_startswith(self): b = self.type2test(b'hello') self.assertFalse(self.type2test().startswith(b"anything")) @@ -327,35 +344,81 @@ def test_find(self): b = self.type2test(b'mississippi') + i = 105 + w = 119 + self.assertEqual(b.find(b'ss'), 2) + self.assertEqual(b.find(b'w'), -1) + self.assertEqual(b.find(b'mississippian'), -1) + + self.assertEqual(b.find(i), 1) + self.assertEqual(b.find(w), -1) + self.assertEqual(b.find(b'ss', 3), 5) self.assertEqual(b.find(b'ss', 1, 7), 2) self.assertEqual(b.find(b'ss', 1, 3), -1) - self.assertEqual(b.find(b'w'), -1) - self.assertEqual(b.find(b'mississippian'), -1) + + self.assertEqual(b.find(i, 6), 7) + self.assertEqual(b.find(i, 1, 3), 1) + self.assertEqual(b.find(w, 1, 3), -1) def test_rfind(self): b = self.type2test(b'mississippi') + i = 105 + w = 119 + self.assertEqual(b.rfind(b'ss'), 5) - self.assertEqual(b.rfind(b'ss', 3), 5) - self.assertEqual(b.rfind(b'ss', 0, 6), 2) self.assertEqual(b.rfind(b'w'), -1) self.assertEqual(b.rfind(b'mississippian'), -1) + self.assertEqual(b.rfind(i), 10) + self.assertEqual(b.rfind(w), -1) + + self.assertEqual(b.rfind(b'ss', 3), 5) + self.assertEqual(b.rfind(b'ss', 0, 6), 2) + + self.assertEqual(b.rfind(i, 1, 3), 1) + self.assertEqual(b.rfind(i, 3, 9), 7) + self.assertEqual(b.rfind(w, 1, 3), -1) + def test_index(self): - b = self.type2test(b'world') - self.assertEqual(b.index(b'w'), 0) - self.assertEqual(b.index(b'orl'), 1) - self.assertRaises(ValueError, b.index, b'worm') - self.assertRaises(ValueError, b.index, b'ldo') + b = self.type2test(b'mississippi') + i = 105 + w = 119 + + self.assertEqual(b.index(b'ss'), 2) + self.assertRaises(ValueError, b.index, b'w') + self.assertRaises(ValueError, b.index, b'mississippian') + + self.assertEqual(b.index(i), 1) + self.assertRaises(ValueError, b.index, w) + + self.assertEqual(b.index(b'ss', 3), 5) + self.assertEqual(b.index(b'ss', 1, 7), 2) + self.assertRaises(ValueError, b.index, b'ss', 1, 3) + + self.assertEqual(b.index(i, 6), 7) + self.assertEqual(b.index(i, 1, 3), 1) + self.assertRaises(ValueError, b.index, w, 1, 3) def test_rindex(self): - # XXX could be more rigorous - b = self.type2test(b'world') - self.assertEqual(b.rindex(b'w'), 0) - self.assertEqual(b.rindex(b'orl'), 1) - self.assertRaises(ValueError, b.rindex, b'worm') - self.assertRaises(ValueError, b.rindex, b'ldo') + b = self.type2test(b'mississippi') + i = 105 + w = 119 + + self.assertEqual(b.rindex(b'ss'), 5) + self.assertRaises(ValueError, b.rindex, b'w') + self.assertRaises(ValueError, b.rindex, b'mississippian') + + self.assertEqual(b.rindex(i), 10) + self.assertRaises(ValueError, b.rindex, w) + + self.assertEqual(b.rindex(b'ss', 3), 5) + self.assertEqual(b.rindex(b'ss', 0, 6), 2) + + self.assertEqual(b.rindex(i, 1, 3), 1) + self.assertEqual(b.rindex(i, 3, 9), 7) + self.assertRaises(ValueError, b.rindex, w, 1, 3) def test_replace(self): b = self.type2test(b'mississippi') @@ -552,6 +615,14 @@ self.assertEqual(True, b.startswith(h, None, -2)) self.assertEqual(False, b.startswith(x, None, None)) + def test_integer_arguments_out_of_byte_range(self): + b = self.type2test(b'hello') + + for method in (b.count, b.find, b.index, b.rfind, b.rindex): + self.assertRaises(ValueError, method, -1) + self.assertRaises(ValueError, method, 256) + self.assertRaises(ValueError, method, 9999) + def test_find_etc_raise_correct_error_messages(self): # issue 11828 b = self.type2test(b'hello') @@ -1161,9 +1232,11 @@ class ByteArrayAsStringTest(FixedStringTest): type2test = bytearray + contains_bytes = True class BytesAsStringTest(FixedStringTest): type2test = bytes + contains_bytes = True class SubclassTest(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #12170: The count(), find(), rfind(), index() and rindex() methods + of bytes and bytearray objects now accept an integer between 0 and 255 + as their first argument. Patch by Petri Lehtinen. + - Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler warnings. Patch by Josh Triplett and Petri Lehtinen. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1071,24 +1071,41 @@ bytearray_find_internal(PyByteArrayObject *self, PyObject *args, int dir) { PyObject *subobj; + char byte; Py_buffer subbuf; + const char *sub; + Py_ssize_t sub_len; Py_ssize_t start=0, end=PY_SSIZE_T_MAX; Py_ssize_t res; - if (!stringlib_parse_args_finds("find/rfind/index/rindex", - args, &subobj, &start, &end)) + if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex", + args, &subobj, &byte, &start, &end)) return -2; - if (_getbuffer(subobj, &subbuf) < 0) - return -2; + + if (subobj) { + if (_getbuffer(subobj, &subbuf) < 0) + return -2; + + sub = subbuf.buf; + sub_len = subbuf.len; + } + else { + sub = &byte; + sub_len = 1; + } + if (dir > 0) res = stringlib_find_slice( PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - subbuf.buf, subbuf.len, start, end); + sub, sub_len, start, end); else res = stringlib_rfind_slice( PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), - subbuf.buf, subbuf.len, start, end); - PyBuffer_Release(&subbuf); + sub, sub_len, start, end); + + if (subobj) + PyBuffer_Release(&subbuf); + return res; } @@ -1121,23 +1138,39 @@ bytearray_count(PyByteArrayObject *self, PyObject *args) { PyObject *sub_obj; - const char *str = PyByteArray_AS_STRING(self); + const char *str = PyByteArray_AS_STRING(self), *sub; + Py_ssize_t sub_len; + char byte; Py_ssize_t start = 0, end = PY_SSIZE_T_MAX; + Py_buffer vsub; PyObject *count_obj; - if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end)) + if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte, + &start, &end)) return NULL; - if (_getbuffer(sub_obj, &vsub) < 0) - return NULL; + if (sub_obj) { + if (_getbuffer(sub_obj, &vsub) < 0) + return NULL; + + sub = vsub.buf; + sub_len = vsub.len; + } + else { + sub = &byte; + sub_len = 1; + } ADJUST_INDICES(start, end, PyByteArray_GET_SIZE(self)); count_obj = PyLong_FromSsize_t( - stringlib_count(str + start, end - start, vsub.buf, vsub.len, PY_SSIZE_T_MAX) + stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX) ); - PyBuffer_Release(&vsub); + + if (sub_obj) + PyBuffer_Release(&vsub); + return count_obj; } diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1230,31 +1230,42 @@ bytes_find_internal(PyBytesObject *self, PyObject *args, int dir) { PyObject *subobj; + char byte; + Py_buffer subbuf; const char *sub; Py_ssize_t sub_len; Py_ssize_t start=0, end=PY_SSIZE_T_MAX; - - if (!stringlib_parse_args_finds("find/rfind/index/rindex", - args, &subobj, &start, &end)) + Py_ssize_t res; + + if (!stringlib_parse_args_finds_byte("find/rfind/index/rindex", + args, &subobj, &byte, &start, &end)) return -2; - if (PyBytes_Check(subobj)) { - sub = PyBytes_AS_STRING(subobj); - sub_len = PyBytes_GET_SIZE(subobj); + if (subobj) { + if (_getbuffer(subobj, &subbuf) < 0) + return -2; + + sub = subbuf.buf; + sub_len = subbuf.len; } - else if (PyObject_AsCharBuffer(subobj, &sub, &sub_len)) - /* XXX - the "expected a character buffer object" is pretty - confusing for a non-expert. remap to something else ? */ - return -2; + else { + sub = &byte; + sub_len = 1; + } if (dir > 0) - return stringlib_find_slice( + res = stringlib_find_slice( PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), sub, sub_len, start, end); else - return stringlib_rfind_slice( + res = stringlib_rfind_slice( PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), sub, sub_len, start, end); + + if (subobj) + PyBuffer_Release(&subbuf); + + return res; } @@ -1480,23 +1491,38 @@ PyObject *sub_obj; const char *str = PyBytes_AS_STRING(self), *sub; Py_ssize_t sub_len; + char byte; Py_ssize_t start = 0, end = PY_SSIZE_T_MAX; - if (!stringlib_parse_args_finds("count", args, &sub_obj, &start, &end)) + Py_buffer vsub; + PyObject *count_obj; + + if (!stringlib_parse_args_finds_byte("count", args, &sub_obj, &byte, + &start, &end)) return NULL; - if (PyBytes_Check(sub_obj)) { - sub = PyBytes_AS_STRING(sub_obj); - sub_len = PyBytes_GET_SIZE(sub_obj); + if (sub_obj) { + if (_getbuffer(sub_obj, &vsub) < 0) + return NULL; + + sub = vsub.buf; + sub_len = vsub.len; } - else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len)) - return NULL; + else { + sub = &byte; + sub_len = 1; + } ADJUST_INDICES(start, end, PyBytes_GET_SIZE(self)); - return PyLong_FromSsize_t( + count_obj = PyLong_FromSsize_t( stringlib_count(str + start, end - start, sub, sub_len, PY_SSIZE_T_MAX) ); + + if (sub_obj) + PyBuffer_Release(&vsub); + + return count_obj; } diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h --- a/Objects/stringlib/find.h +++ b/Objects/stringlib/find.h @@ -167,4 +167,47 @@ return 0; } +#else /* !STRINGLIB_IS_UNICODE */ + +/* +Wraps stringlib_parse_args_finds() and additionally checks whether the +first argument is an integer in range(0, 256). + +If this is the case, writes the integer value to the byte parameter +and sets subobj to NULL. Otherwise, sets the first argument to subobj +and doesn't touch byte. The other parameters are similar to those of +stringlib_parse_args_finds(). +*/ + +Py_LOCAL_INLINE(int) +STRINGLIB(parse_args_finds_byte)(const char *function_name, PyObject *args, + PyObject **subobj, char *byte, + Py_ssize_t *start, Py_ssize_t *end) +{ + PyObject *tmp_subobj; + Py_ssize_t ival; + + if(!STRINGLIB(parse_args_finds)(function_name, args, &tmp_subobj, + start, end)) + return 0; + + ival = PyNumber_AsSsize_t(tmp_subobj, PyExc_ValueError); + if (ival == -1 && PyErr_Occurred()) { + PyErr_Clear(); + *subobj = tmp_subobj; + } + else { + /* The first argument was an integer */ + if(ival < 0 || ival > 255) { + PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); + return 0; + } + + *subobj = NULL; + *byte = (char)ival; + } + + return 1; +} + #endif /* STRINGLIB_IS_UNICODE */ -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 21 05:31:08 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 21 Oct 2011 05:31:08 +0200 Subject: [Python-checkins] Daily reference leaks (c1effa2cdd20): sum=0 Message-ID: results for c1effa2cdd20 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogQjhZg1', '-x'] From python-checkins at python.org Fri Oct 21 08:33:48 2011 From: python-checkins at python.org (vinay.sajip) Date: Fri, 21 Oct 2011 08:33:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Closes_=2313235=3A_Added_de?= =?utf8?q?precation_for_warn=28=29_methods_and_function_in_logging=2E?= Message-ID: http://hg.python.org/cpython/rev/37479f0f68bc changeset: 73039:37479f0f68bc user: Vinay Sajip date: Fri Oct 21 07:33:42 2011 +0100 summary: Closes #13235: Added deprecation for warn() methods and function in logging. files: Doc/library/logging.rst | 11 +++++++++-- Lib/logging/__init__.py | 15 ++++++++++++--- Misc/NEWS | 2 ++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -189,6 +189,9 @@ Logs a message with level :const:`WARNING` on this logger. The arguments are interpreted as for :meth:`debug`. + .. note:: There is an obsolete method `warn()` which is functionally + identical to `warning()`. As `warn()` is deprecated, please do not use + it - use `warning()` instead. .. method:: Logger.error(msg, *args, **kwargs) @@ -880,8 +883,12 @@ .. function:: warning(msg, *args, **kwargs) - Logs a message with level :const:`WARNING` on the root logger. The arguments are - interpreted as for :func:`debug`. + Logs a message with level :const:`WARNING` on the root logger. The arguments + are interpreted as for :func:`debug`. + + .. note:: There is an obsolete function `warn()` which is functionally + identical to `warning()`. As `warn()` is deprecated, please do not use + it - use `warning()` instead. .. function:: error(msg, *args, **kwargs) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1243,7 +1243,10 @@ if self.isEnabledFor(WARNING): self._log(WARNING, msg, args, **kwargs) - warn = warning + def warn(self, msg, *args, **kwargs): + warnings.warn("The 'warn' method is deprecated, " + "use 'warning' instead", PendingDeprecationWarning, 2) + self.warning(msg, *args, **kwargs) def error(self, msg, *args, **kwargs): """ @@ -1556,7 +1559,10 @@ """ self.log(WARNING, msg, *args, **kwargs) - warn = warning + def warn(self, msg, *args, **kwargs): + warnings.warn("The 'warn' method is deprecated, " + "use 'warning' instead", PendingDeprecationWarning, 2) + self.warning(msg, *args, **kwargs) def error(self, msg, *args, **kwargs): """ @@ -1766,7 +1772,10 @@ basicConfig() root.warning(msg, *args, **kwargs) -warn = warning +def warn(msg, *args, **kwargs): + warnings.warn("The 'warn' function is deprecated, " + "use 'warning' instead", PendingDeprecationWarning, 2) + warning(msg, *args, **kwargs) def info(msg, *args, **kwargs): """ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -326,6 +326,8 @@ Library ------- +- Issue #13235: Added PendingDeprecationWarning to warn() method and function. + - Issue #9168: now smtpd is able to bind privileged port. - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 15:52:24 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:52:24 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Document_that_packaging_doe?= =?utf8?b?c27igJl0IGNyZWF0ZSBfX2luaXRfXy5weSBmaWxlcyAoIzM5MDIpLg==?= Message-ID: http://hg.python.org/cpython/rev/f84040b11211 changeset: 73041:f84040b11211 user: ?ric Araujo date: Fri Oct 21 07:34:00 2011 +0200 summary: Document that packaging doesn?t create __init__.py files (#3902). The bug reported expected distutils to create an __init__.py file for a project using only C extension modules. IMO, how Python imports packages and submodules is well documented, and it?s never suggested that distutils might create an __init__.py file, so I?m adding this clarification to the packaging docs but won?t backport unless other people tell me they shared the same wrong expectation. Thanks to Mike Hoy for his help with the patch. files: Doc/library/packaging.compiler.rst | 4 ++++ Doc/packaging/setupscript.rst | 4 ++++ 2 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Doc/library/packaging.compiler.rst b/Doc/library/packaging.compiler.rst --- a/Doc/library/packaging.compiler.rst +++ b/Doc/library/packaging.compiler.rst @@ -675,3 +675,7 @@ | | abort the build process, but | | | | simply skip the extension. | | +------------------------+--------------------------------+---------------------------+ + +To distribute extension modules that live in a package (e.g. ``package.ext``), +you need to create you need to create a :file:`{package}/__init__.py` file to +let Python recognize and import your module. diff --git a/Doc/packaging/setupscript.rst b/Doc/packaging/setupscript.rst --- a/Doc/packaging/setupscript.rst +++ b/Doc/packaging/setupscript.rst @@ -177,6 +177,10 @@ in the filesystem (and therefore where in Python's namespace hierarchy) the resulting extension lives. +If your distribution contains only one or more extension modules in a package, +you need to create a :file:`{package}/__init__.py` file anyway, otherwise Python +won't be able to import anything. + If you have a number of extensions all in the same package (or all under the same base package), use the :option:`ext_package` keyword argument to :func:`setup`. For example, :: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 15:52:23 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:52:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_missing_imports_in_setu?= =?utf8?q?p_scripts_generated_by_packaging_=28=2313205=29=2E?= Message-ID: http://hg.python.org/cpython/rev/21c33aa2178b changeset: 73040:21c33aa2178b parent: 73008:5419bdf37fee user: ?ric Araujo date: Fri Oct 21 06:27:06 2011 +0200 summary: Fix missing imports in setup scripts generated by packaging (#13205). I?ve made more edits than the bug report suggested to make sure the generated setup script is compatible with many Python versions; a comment in the source explains that in detail. The cfg_to_args function uses old 2.x idioms like codecs.open and RawConfigParser.readfp because I want the setup.py generated by packaging and distutils2 to be the same. Most users won?t see the deprecation warning and I ignore it in the test suite. Thanks to David Barnett for the report and original patch. files: Lib/packaging/tests/test_util.py | 34 ++++++++++- Lib/packaging/util.py | 56 +++++++++++++++---- Misc/ACKS | 1 + 3 files changed, 74 insertions(+), 17 deletions(-) diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -5,11 +5,10 @@ import logging import tempfile import textwrap +import warnings import subprocess from io import StringIO -from packaging.tests import support, unittest -from packaging.tests.test_config import SETUP_CFG from packaging.errors import ( PackagingPlatformError, PackagingByteCompileError, PackagingFileError, PackagingExecError, InstallationException) @@ -20,7 +19,11 @@ get_compiler_versions, _MAC_OS_X_LD_VERSION, byte_compile, find_packages, spawn, get_pypirc_path, generate_pypirc, read_pypirc, resolve_name, iglob, RICH_GLOB, egginfo_to_distinfo, is_setuptools, is_distutils, is_packaging, - get_install_method, cfg_to_args, encode_multipart) + get_install_method, cfg_to_args, generate_setup_py, encode_multipart) + +from packaging.tests import support, unittest +from packaging.tests.test_config import SETUP_CFG +from test.script_helper import assert_python_ok, assert_python_failure PYPIRC = """\ @@ -513,7 +516,9 @@ self.write_file('setup.cfg', SETUP_CFG % opts, encoding='utf-8') self.write_file('README', 'loooong description') - args = cfg_to_args() + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + args = cfg_to_args() # use Distribution to get the contents of the setup.cfg file dist = Distribution() dist.parse_config_files() @@ -539,6 +544,26 @@ self.assertEqual(args['scripts'], dist.scripts) self.assertEqual(args['py_modules'], dist.py_modules) + def test_generate_setup_py(self): + # undo subprocess.Popen monkey-patching before using assert_python_* + subprocess.Popen = self.old_popen + os.chdir(self.mkdtemp()) + self.write_file('setup.cfg', textwrap.dedent("""\ + [metadata] + name = SPAM + classifier = Programming Language :: Python + """)) + generate_setup_py() + self.assertTrue(os.path.exists('setup.py'), 'setup.py not created') + rc, out, err = assert_python_ok('setup.py', '--name') + self.assertEqual(out, b'SPAM\n') + self.assertEqual(err, b'') + + # a generated setup.py should complain if no setup.cfg is present + os.unlink('setup.cfg') + rc, out, err = assert_python_failure('setup.py', '--name') + self.assertIn(b'setup.cfg', err) + def test_encode_multipart(self): fields = [('username', 'wok'), ('password', 'secret')] files = [('picture', 'wok.png', b'PNG89')] @@ -590,7 +615,6 @@ super(GlobTestCase, self).tearDown() def assertGlobMatch(self, glob, spec): - """""" tempdir = self.build_files_tree(spec) expected = self.clean_tree(spec) os.chdir(tempdir) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -6,6 +6,7 @@ import imp import sys import errno +import codecs import shutil import string import hashlib @@ -417,7 +418,8 @@ # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) if optimize >= 0: - cfile = imp.cache_from_source(file, debug_override=not optimize) + cfile = imp.cache_from_source(file, + debug_override=not optimize) else: cfile = imp.cache_from_source(file) dfile = file @@ -931,6 +933,24 @@ yield file +# HOWTO change cfg_to_args +# +# This function has two major constraints: It is copied by inspect.getsource +# in generate_setup_py; it is used in generated setup.py which may be run by +# any Python version supported by distutils2 (2.4-3.3). +# +# * Keep objects like D1_D2_SETUP_ARGS static, i.e. in the function body +# instead of global. +# * If you use a function from another module, update the imports in +# SETUP_TEMPLATE. Use only modules, classes and functions compatible with +# all versions: codecs.open instead of open, RawConfigParser.readfp instead +# of read, standard exceptions instead of Packaging*Error, etc. +# * If you use a function from this module, update the template and +# generate_setup_py. +# +# test_util tests this function and the generated setup.py, but does not test +# that it's compatible with all Python versions. + def cfg_to_args(path='setup.cfg'): """Compatibility helper to use setup.cfg in setup.py. @@ -941,8 +961,6 @@ *file* is the path to the setup.cfg file. If it doesn't exist, PackagingFileError is raised. """ - # We need to declare the following constants here so that it's easier to - # generate the setup.py afterwards, using inspect.getsource. # XXX ** == needs testing D1_D2_SETUP_ARGS = {"name": ("metadata",), @@ -986,10 +1004,11 @@ # The real code starts here config = RawConfigParser() - if not os.path.exists(path): - raise PackagingFileError("file '%s' does not exist" % - os.path.abspath(path)) - config.read(path, encoding='utf-8') + f = codecs.open(path, encoding='utf-8') + try: + config.readfp(f) + finally: + f.close() kwargs = {} for arg in D1_D2_SETUP_ARGS: @@ -1011,8 +1030,11 @@ filenames = split_multiline(filenames) in_cfg_value = [] for filename in filenames: - with open(filename) as fp: + fp = codecs.open(filename, encoding='utf-8') + try: in_cfg_value.append(fp.read()) + finally: + fp.close() in_cfg_value = '\n\n'.join(in_cfg_value) else: continue @@ -1029,13 +1051,19 @@ return kwargs -_SETUP_TMPL = """\ +SETUP_TEMPLATE = """\ # This script was automatically generated by packaging import os +import codecs from distutils.core import setup -from ConfigParser import RawConfigParser +try: + from ConfigParser import RawConfigParser +except ImportError: + from configparser import RawConfigParser -%(func)s +%(split_multiline)s + +%(cfg_to_args)s setup(**cfg_to_args()) """ @@ -1049,8 +1077,10 @@ if os.path.exists("setup.py"): raise PackagingFileError("a setup.py file already exists") + source = SETUP_TEMPLATE % {'split_multiline': getsource(split_multiline), + 'cfg_to_args': getsource(cfg_to_args)} with open("setup.py", "w", encoding='utf-8') as fp: - fp.write(_SETUP_TMPL % {'func': getsource(cfg_to_args)}) + fp.write(source) # Taken from the pip project @@ -1307,6 +1337,8 @@ def copy_tree(src, dst, preserve_mode=True, preserve_times=True, preserve_symlinks=False, update=False, verbose=True, dry_run=False): + # FIXME use of this function is why we get spurious logging message on + # stdout when tests run; kill and replace by shuil! from distutils.file_util import copy_file if not dry_run and not os.path.isdir(src): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -56,6 +56,7 @@ Chris Barker Nick Barnes Quentin Barnes +David Barnett Richard Barran Cesar Eduardo Barros Des Barry -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 15:52:25 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:52:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_tests_for_packaging=2Et?= =?utf8?q?ests=2Esupport_=28=2312659=29=2E?= Message-ID: http://hg.python.org/cpython/rev/0aad55c8ff26 changeset: 73042:0aad55c8ff26 user: ?ric Araujo date: Fri Oct 21 07:56:32 2011 +0200 summary: Add tests for packaging.tests.support (#12659). Thanks to Francisco Mart?n Brugu? for the patch. files: Lib/packaging/tests/test_support.py | 78 +++++++++++++++++ 1 files changed, 78 insertions(+), 0 deletions(-) diff --git a/Lib/packaging/tests/test_support.py b/Lib/packaging/tests/test_support.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/test_support.py @@ -0,0 +1,78 @@ +import os +import tempfile + +from packaging.dist import Distribution +from packaging.tests import support, unittest + + +class TestingSupportTestCase(unittest.TestCase): + + def test_fake_dec(self): + @support.fake_dec(1, 2, k=3) + def func(arg0, *args, **kargs): + return arg0, args, kargs + self.assertEqual(func(-1, -2, k=-3), (-1, (-2,), {'k': -3})) + + def test_TempdirManager(self): + files = {} + + class Tester(support.TempdirManager, unittest.TestCase): + + def test_mktempfile(self2): + tmpfile = self2.mktempfile() + files['test_mktempfile'] = tmpfile.name + self.assertTrue(os.path.isfile(tmpfile.name)) + + def test_mkdtemp(self2): + tmpdir = self2.mkdtemp() + files['test_mkdtemp'] = tmpdir + self.assertTrue(os.path.isdir(tmpdir)) + + def test_write_file(self2): + tmpdir = self2.mkdtemp() + files['test_write_file'] = tmpdir + self2.write_file((tmpdir, 'file1'), 'me file 1') + file1 = os.path.join(tmpdir, 'file1') + self.assertTrue(os.path.isfile(file1)) + text = '' + with open(file1, 'r') as f: + text = f.read() + self.assertEqual(text, 'me file 1') + + def test_create_dist(self2): + project_dir, dist = self2.create_dist() + files['test_create_dist'] = project_dir + self.assertTrue(os.path.isdir(project_dir)) + self.assertIsInstance(dist, Distribution) + + def test_assertIsFile(self2): + fd, fn = tempfile.mkstemp() + os.close(fd) + self.addCleanup(support.unlink, fn) + self2.assertIsFile(fn) + self.assertRaises(AssertionError, self2.assertIsFile, 'foO') + + def test_assertIsNotFile(self2): + tmpdir = self2.mkdtemp() + self2.assertIsNotFile(tmpdir) + + tester = Tester() + for name in ('test_mktempfile', 'test_mkdtemp', 'test_write_file', + 'test_create_dist', 'test_assertIsFile', + 'test_assertIsNotFile'): + tester.setUp() + try: + getattr(tester, name)() + finally: + tester.tearDown() + + # check clean-up + if name in files: + self.assertFalse(os.path.exists(files[name])) + + +def test_suite(): + return unittest.makeSuite(TestingSupportTestCase) + +if __name__ == "__main__": + unittest.main(defaultTest="test_suite") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 15:52:25 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:52:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Banch_merge?= Message-ID: http://hg.python.org/cpython/rev/cfc042ca551a changeset: 73043:cfc042ca551a parent: 73039:37479f0f68bc parent: 73042:0aad55c8ff26 user: ?ric Araujo date: Fri Oct 21 15:52:10 2011 +0200 summary: Banch merge files: Doc/library/packaging.compiler.rst | 4 + Doc/packaging/setupscript.rst | 4 + Lib/packaging/tests/test_support.py | 78 +++++++++++++++++ Lib/packaging/tests/test_util.py | 34 ++++++- Lib/packaging/util.py | 56 +++++++++-- Misc/ACKS | 1 + Misc/NEWS | 2 +- 7 files changed, 161 insertions(+), 18 deletions(-) diff --git a/Doc/library/packaging.compiler.rst b/Doc/library/packaging.compiler.rst --- a/Doc/library/packaging.compiler.rst +++ b/Doc/library/packaging.compiler.rst @@ -675,3 +675,7 @@ | | abort the build process, but | | | | simply skip the extension. | | +------------------------+--------------------------------+---------------------------+ + +To distribute extension modules that live in a package (e.g. ``package.ext``), +you need to create you need to create a :file:`{package}/__init__.py` file to +let Python recognize and import your module. diff --git a/Doc/packaging/setupscript.rst b/Doc/packaging/setupscript.rst --- a/Doc/packaging/setupscript.rst +++ b/Doc/packaging/setupscript.rst @@ -177,6 +177,10 @@ in the filesystem (and therefore where in Python's namespace hierarchy) the resulting extension lives. +If your distribution contains only one or more extension modules in a package, +you need to create a :file:`{package}/__init__.py` file anyway, otherwise Python +won't be able to import anything. + If you have a number of extensions all in the same package (or all under the same base package), use the :option:`ext_package` keyword argument to :func:`setup`. For example, :: diff --git a/Lib/packaging/tests/test_support.py b/Lib/packaging/tests/test_support.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/test_support.py @@ -0,0 +1,78 @@ +import os +import tempfile + +from packaging.dist import Distribution +from packaging.tests import support, unittest + + +class TestingSupportTestCase(unittest.TestCase): + + def test_fake_dec(self): + @support.fake_dec(1, 2, k=3) + def func(arg0, *args, **kargs): + return arg0, args, kargs + self.assertEqual(func(-1, -2, k=-3), (-1, (-2,), {'k': -3})) + + def test_TempdirManager(self): + files = {} + + class Tester(support.TempdirManager, unittest.TestCase): + + def test_mktempfile(self2): + tmpfile = self2.mktempfile() + files['test_mktempfile'] = tmpfile.name + self.assertTrue(os.path.isfile(tmpfile.name)) + + def test_mkdtemp(self2): + tmpdir = self2.mkdtemp() + files['test_mkdtemp'] = tmpdir + self.assertTrue(os.path.isdir(tmpdir)) + + def test_write_file(self2): + tmpdir = self2.mkdtemp() + files['test_write_file'] = tmpdir + self2.write_file((tmpdir, 'file1'), 'me file 1') + file1 = os.path.join(tmpdir, 'file1') + self.assertTrue(os.path.isfile(file1)) + text = '' + with open(file1, 'r') as f: + text = f.read() + self.assertEqual(text, 'me file 1') + + def test_create_dist(self2): + project_dir, dist = self2.create_dist() + files['test_create_dist'] = project_dir + self.assertTrue(os.path.isdir(project_dir)) + self.assertIsInstance(dist, Distribution) + + def test_assertIsFile(self2): + fd, fn = tempfile.mkstemp() + os.close(fd) + self.addCleanup(support.unlink, fn) + self2.assertIsFile(fn) + self.assertRaises(AssertionError, self2.assertIsFile, 'foO') + + def test_assertIsNotFile(self2): + tmpdir = self2.mkdtemp() + self2.assertIsNotFile(tmpdir) + + tester = Tester() + for name in ('test_mktempfile', 'test_mkdtemp', 'test_write_file', + 'test_create_dist', 'test_assertIsFile', + 'test_assertIsNotFile'): + tester.setUp() + try: + getattr(tester, name)() + finally: + tester.tearDown() + + # check clean-up + if name in files: + self.assertFalse(os.path.exists(files[name])) + + +def test_suite(): + return unittest.makeSuite(TestingSupportTestCase) + +if __name__ == "__main__": + unittest.main(defaultTest="test_suite") diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -5,11 +5,10 @@ import logging import tempfile import textwrap +import warnings import subprocess from io import StringIO -from packaging.tests import support, unittest -from packaging.tests.test_config import SETUP_CFG from packaging.errors import ( PackagingPlatformError, PackagingByteCompileError, PackagingFileError, PackagingExecError, InstallationException) @@ -20,7 +19,11 @@ get_compiler_versions, _MAC_OS_X_LD_VERSION, byte_compile, find_packages, spawn, get_pypirc_path, generate_pypirc, read_pypirc, resolve_name, iglob, RICH_GLOB, egginfo_to_distinfo, is_setuptools, is_distutils, is_packaging, - get_install_method, cfg_to_args, encode_multipart) + get_install_method, cfg_to_args, generate_setup_py, encode_multipart) + +from packaging.tests import support, unittest +from packaging.tests.test_config import SETUP_CFG +from test.script_helper import assert_python_ok, assert_python_failure PYPIRC = """\ @@ -513,7 +516,9 @@ self.write_file('setup.cfg', SETUP_CFG % opts, encoding='utf-8') self.write_file('README', 'loooong description') - args = cfg_to_args() + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + args = cfg_to_args() # use Distribution to get the contents of the setup.cfg file dist = Distribution() dist.parse_config_files() @@ -539,6 +544,26 @@ self.assertEqual(args['scripts'], dist.scripts) self.assertEqual(args['py_modules'], dist.py_modules) + def test_generate_setup_py(self): + # undo subprocess.Popen monkey-patching before using assert_python_* + subprocess.Popen = self.old_popen + os.chdir(self.mkdtemp()) + self.write_file('setup.cfg', textwrap.dedent("""\ + [metadata] + name = SPAM + classifier = Programming Language :: Python + """)) + generate_setup_py() + self.assertTrue(os.path.exists('setup.py'), 'setup.py not created') + rc, out, err = assert_python_ok('setup.py', '--name') + self.assertEqual(out, b'SPAM\n') + self.assertEqual(err, b'') + + # a generated setup.py should complain if no setup.cfg is present + os.unlink('setup.cfg') + rc, out, err = assert_python_failure('setup.py', '--name') + self.assertIn(b'setup.cfg', err) + def test_encode_multipart(self): fields = [('username', 'wok'), ('password', 'secret')] files = [('picture', 'wok.png', b'PNG89')] @@ -590,7 +615,6 @@ super(GlobTestCase, self).tearDown() def assertGlobMatch(self, glob, spec): - """""" tempdir = self.build_files_tree(spec) expected = self.clean_tree(spec) os.chdir(tempdir) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -6,6 +6,7 @@ import imp import sys import errno +import codecs import shutil import string import hashlib @@ -417,7 +418,8 @@ # cfile - byte-compiled file # dfile - purported source filename (same as 'file' by default) if optimize >= 0: - cfile = imp.cache_from_source(file, debug_override=not optimize) + cfile = imp.cache_from_source(file, + debug_override=not optimize) else: cfile = imp.cache_from_source(file) dfile = file @@ -931,6 +933,24 @@ yield file +# HOWTO change cfg_to_args +# +# This function has two major constraints: It is copied by inspect.getsource +# in generate_setup_py; it is used in generated setup.py which may be run by +# any Python version supported by distutils2 (2.4-3.3). +# +# * Keep objects like D1_D2_SETUP_ARGS static, i.e. in the function body +# instead of global. +# * If you use a function from another module, update the imports in +# SETUP_TEMPLATE. Use only modules, classes and functions compatible with +# all versions: codecs.open instead of open, RawConfigParser.readfp instead +# of read, standard exceptions instead of Packaging*Error, etc. +# * If you use a function from this module, update the template and +# generate_setup_py. +# +# test_util tests this function and the generated setup.py, but does not test +# that it's compatible with all Python versions. + def cfg_to_args(path='setup.cfg'): """Compatibility helper to use setup.cfg in setup.py. @@ -941,8 +961,6 @@ *file* is the path to the setup.cfg file. If it doesn't exist, PackagingFileError is raised. """ - # We need to declare the following constants here so that it's easier to - # generate the setup.py afterwards, using inspect.getsource. # XXX ** == needs testing D1_D2_SETUP_ARGS = {"name": ("metadata",), @@ -986,10 +1004,11 @@ # The real code starts here config = RawConfigParser() - if not os.path.exists(path): - raise PackagingFileError("file '%s' does not exist" % - os.path.abspath(path)) - config.read(path, encoding='utf-8') + f = codecs.open(path, encoding='utf-8') + try: + config.readfp(f) + finally: + f.close() kwargs = {} for arg in D1_D2_SETUP_ARGS: @@ -1011,8 +1030,11 @@ filenames = split_multiline(filenames) in_cfg_value = [] for filename in filenames: - with open(filename) as fp: + fp = codecs.open(filename, encoding='utf-8') + try: in_cfg_value.append(fp.read()) + finally: + fp.close() in_cfg_value = '\n\n'.join(in_cfg_value) else: continue @@ -1029,13 +1051,19 @@ return kwargs -_SETUP_TMPL = """\ +SETUP_TEMPLATE = """\ # This script was automatically generated by packaging import os +import codecs from distutils.core import setup -from ConfigParser import RawConfigParser +try: + from ConfigParser import RawConfigParser +except ImportError: + from configparser import RawConfigParser -%(func)s +%(split_multiline)s + +%(cfg_to_args)s setup(**cfg_to_args()) """ @@ -1049,8 +1077,10 @@ if os.path.exists("setup.py"): raise PackagingFileError("a setup.py file already exists") + source = SETUP_TEMPLATE % {'split_multiline': getsource(split_multiline), + 'cfg_to_args': getsource(cfg_to_args)} with open("setup.py", "w", encoding='utf-8') as fp: - fp.write(_SETUP_TMPL % {'func': getsource(cfg_to_args)}) + fp.write(source) # Taken from the pip project @@ -1307,6 +1337,8 @@ def copy_tree(src, dst, preserve_mode=True, preserve_times=True, preserve_symlinks=False, update=False, verbose=True, dry_run=False): + # FIXME use of this function is why we get spurious logging message on + # stdout when tests run; kill and replace by shuil! from distutils.file_util import copy_file if not dry_run and not os.path.isdir(src): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -56,6 +56,7 @@ Chris Barker Nick Barnes Quentin Barnes +David Barnett Richard Barran Cesar Eduardo Barros Des Barry diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -505,7 +505,7 @@ in os.kill(). - Add support for unary plus and unary minus to collections.Counter(). - Issue #13121: Also an support for inplace math operators. + Issue #13121: Also add support for inplace math operators. - Issue #12683: urlparse updated to include svn as schemes that uses relative paths. (svn from 1.5 onwards support relative path). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 15:57:56 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:57:56 +0200 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_missing_imports_in_g?= =?utf8?q?enerated_setup_scripts_=28=2313205=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/5949563b9f1c changeset: 1218:5949563b9f1c user: ?ric Araujo date: Fri Oct 21 06:34:38 2011 +0200 summary: Fix missing imports in generated setup scripts (#13205). I?ve made more edits than the bug report suggested to make sure the generated setup script is compatible with many Python versions; a comment in the source explains that in detail. Thanks to David Barnett for the report and original patch. files: distutils2/tests/support.py | 9 ++++ distutils2/tests/test_util.py | 30 +++++++++++++-- distutils2/util.py | 46 +++++++++++++++++----- 3 files changed, 70 insertions(+), 15 deletions(-) diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -422,6 +422,15 @@ return _assert_python(True, *args, **env_vars) +def assert_python_failure(*args, **env_vars): + """ + Assert that running the interpreter with `args` and optional environment + variables `env_vars` fails and return a (return code, stdout, stderr) + tuple. + """ + return _assert_python(False, *args, **env_vars) + + def unload(name): try: del sys.modules[name] diff --git a/distutils2/tests/test_util.py b/distutils2/tests/test_util.py --- a/distutils2/tests/test_util.py +++ b/distutils2/tests/test_util.py @@ -4,11 +4,10 @@ import time import logging import tempfile +import textwrap import subprocess from StringIO import StringIO -from distutils2.tests import support, unittest -from distutils2.tests.test_config import SETUP_CFG from distutils2.errors import ( PackagingPlatformError, PackagingByteCompileError, PackagingFileError, PackagingExecError, InstallationException) @@ -19,7 +18,11 @@ get_compiler_versions, _MAC_OS_X_LD_VERSION, byte_compile, find_packages, spawn, get_pypirc_path, generate_pypirc, read_pypirc, resolve_name, iglob, RICH_GLOB, egginfo_to_distinfo, is_setuptools, is_distutils, is_packaging, - get_install_method, cfg_to_args, encode_multipart) + get_install_method, cfg_to_args, generate_setup_py, encode_multipart) + +from distutils2.tests import support, unittest +from distutils2.tests.test_config import SETUP_CFG +from distutils2.tests.support import assert_python_ok, assert_python_failure PYPIRC = """\ @@ -536,6 +539,26 @@ self.assertEqual(args['scripts'], dist.scripts) self.assertEqual(args['py_modules'], dist.py_modules) + def test_generate_setup_py(self): + # undo subprocess.Popen monkey-patching before using assert_python_* + subprocess.Popen = self.old_popen + os.chdir(self.mkdtemp()) + self.write_file('setup.cfg', textwrap.dedent("""\ + [metadata] + name = SPAM + classifier = Programming Language :: Python + """)) + generate_setup_py() + self.assertTrue(os.path.exists('setup.py'), 'setup.py not created') + rc, out, err = assert_python_ok('setup.py', '--name') + self.assertEqual(out, 'SPAM\n') + self.assertEqual(err, '') + + # a generated setup.py should complain if no setup.cfg is present + os.unlink('setup.cfg') + rc, out, err = assert_python_failure('setup.py', '--name') + self.assertIn('setup.cfg', err) + def test_encode_multipart(self): fields = [('username', 'wok'), ('password', 'secret')] files = [('picture', 'wok.png', 'PNG89')] @@ -587,7 +610,6 @@ super(GlobTestCase, self).tearDown() def assertGlobMatch(self, glob, spec): - """""" tempdir = self.build_files_tree(spec) expected = self.clean_tree(spec) os.chdir(tempdir) diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -556,6 +556,7 @@ finally: f.close() + def _is_package(path): return os.path.isdir(path) and os.path.isfile( os.path.join(path, '__init__.py')) @@ -928,6 +929,24 @@ yield file +# HOWTO change cfg_to_args +# +# This function has two major constraints: It is copied by inspect.getsource +# in generate_setup_py; it is used in generated setup.py which may be run by +# any Python version supported by distutils2 (2.4-3.3). +# +# * Keep objects like D1_D2_SETUP_ARGS static, i.e. in the function body +# instead of global. +# * If you use a function from another module, update the imports in +# SETUP_TEMPLATE. Use only modules, classes and functions compatible with +# all versions: codecs.open instead of open, RawConfigParser.readfp instead +# of read, standard exceptions instead of Packaging*Error, etc. +# * If you use a function from this module, update the template and +# generate_setup_py. +# +# test_util tests this function and the generated setup.py, but does not test +# that it's compatible with all Python versions. + def cfg_to_args(path='setup.cfg'): """Compatibility helper to use setup.cfg in setup.py. @@ -938,8 +957,6 @@ *file* is the path to the setup.cfg file. If it doesn't exist, PackagingFileError is raised. """ - # We need to declare the following constants here so that it's easier to - # generate the setup.py afterwards, using inspect.getsource. # XXX ** == needs testing D1_D2_SETUP_ARGS = {"name": ("metadata",), @@ -983,9 +1000,6 @@ # The real code starts here config = RawConfigParser() - if not os.path.exists(path): - raise PackagingFileError("file '%s' does not exist" % - os.path.abspath(path)) f = codecs.open(path, encoding='utf-8') try: config.readfp(f) @@ -1012,7 +1026,7 @@ filenames = split_multiline(filenames) in_cfg_value = [] for filename in filenames: - fp = open(filename) + fp = codecs.open(filename, encoding='utf-8') try: in_cfg_value.append(fp.read()) finally: @@ -1033,13 +1047,19 @@ return kwargs -_SETUP_TMPL = """\ +SETUP_TEMPLATE = """\ # This script was automatically generated by distutils2 import os +import codecs from distutils.core import setup -from ConfigParser import RawConfigParser +try: + from ConfigParser import RawConfigParser +except ImportError: + from configparser import RawConfigParser -%(func)s +%(split_multiline)s + +%(cfg_to_args)s setup(**cfg_to_args()) """ @@ -1053,9 +1073,11 @@ if os.path.exists("setup.py"): raise PackagingFileError("a setup.py file already exists") + source = SETUP_TEMPLATE % {'split_multiline': getsource(split_multiline), + 'cfg_to_args': getsource(cfg_to_args)} fp = codecs.open("setup.py", "w", encoding='utf-8') try: - fp.write(_SETUP_TMPL % {'func': getsource(cfg_to_args)}) + fp.write(source) finally: fp.close() @@ -1465,7 +1487,9 @@ l.extend(( '--' + boundary, # XXX should encode to match packaging but it causes bugs - ('Content-Disposition: form-data; name="%s"' % key), '', value)) + ('Content-Disposition: form-data; name="%s"' % key), + '', + value)) for key, filename, value in files: l.extend(( -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Oct 21 15:57:56 2011 From: python-checkins at python.org (eric.araujo) Date: Fri, 21 Oct 2011 15:57:56 +0200 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_fix_for_=2313205_and_other_changes_from_default?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/distutils2/rev/eb845a9a00b7 changeset: 1219:eb845a9a00b7 branch: python3 parent: 1215:6b57f8917452 parent: 1218:5949563b9f1c user: ?ric Araujo date: Fri Oct 21 07:08:31 2011 +0200 summary: Merge fix for #13205 and other changes from default. The deprecation warning emitted by RawConfigParser.readfp (used in util and config, and from config in many places) will be annoying for developers using distutils2 as a library; maybe we should drop 3.1 compat (people are expected to switch from 2.7 to 3.2 directly) and switch to RawConfigParser.read_file. One test in test_pypi_simple fails on 3.3 due to a recent change (see #10680); I didn?t fix it because I can?t open the bug report that the test was written for, and anyway the whole file should be rewritten to use assertRaises. I have to leave some things for Alexis :) files: distutils2/tests/support.py | 9 ++++ distutils2/tests/test_util.py | 43 ++++++++++++++++--- distutils2/util.py | 50 +++++++++++++++++----- setup.cfg | 2 +- 4 files changed, 85 insertions(+), 19 deletions(-) diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -429,6 +429,15 @@ return _assert_python(True, *args, **env_vars) +def assert_python_failure(*args, **env_vars): + """ + Assert that running the interpreter with `args` and optional environment + variables `env_vars` fails and return a (return code, stdout, stderr) + tuple. + """ + return _assert_python(False, *args, **env_vars) + + def unload(name): try: del sys.modules[name] diff --git a/distutils2/tests/test_util.py b/distutils2/tests/test_util.py --- a/distutils2/tests/test_util.py +++ b/distutils2/tests/test_util.py @@ -4,11 +4,11 @@ import time import logging import tempfile +import textwrap +import warnings import subprocess from io import StringIO -from distutils2.tests import support, unittest -from distutils2.tests.test_config import SETUP_CFG from distutils2.errors import ( PackagingPlatformError, PackagingByteCompileError, PackagingFileError, PackagingExecError, InstallationException) @@ -19,7 +19,11 @@ get_compiler_versions, _MAC_OS_X_LD_VERSION, byte_compile, find_packages, spawn, get_pypirc_path, generate_pypirc, read_pypirc, resolve_name, iglob, RICH_GLOB, egginfo_to_distinfo, is_setuptools, is_distutils, is_packaging, - get_install_method, cfg_to_args, encode_multipart) + get_install_method, cfg_to_args, generate_setup_py, encode_multipart) + +from distutils2.tests import support, unittest +from distutils2.tests.test_config import SETUP_CFG +from distutils2.tests.support import assert_python_ok, assert_python_failure PYPIRC = """\ @@ -503,10 +507,14 @@ self.write_file('setup.cfg', SETUP_CFG % opts, encoding='utf-8') self.write_file('README', 'loooong description') - args = cfg_to_args() + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + args = cfg_to_args() # use Distribution to get the contents of the setup.cfg file dist = Distribution() - dist.parse_config_files() + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + dist.parse_config_files() metadata = dist.metadata self.assertEqual(args['name'], metadata['Name']) @@ -529,6 +537,26 @@ self.assertEqual(args['scripts'], dist.scripts) self.assertEqual(args['py_modules'], dist.py_modules) + def test_generate_setup_py(self): + # undo subprocess.Popen monkey-patching before using assert_python_* + subprocess.Popen = self.old_popen + os.chdir(self.mkdtemp()) + self.write_file('setup.cfg', textwrap.dedent("""\ + [metadata] + name = SPAM + classifier = Programming Language :: Python + """)) + generate_setup_py() + self.assertTrue(os.path.exists('setup.py'), 'setup.py not created') + rc, out, err = assert_python_ok('setup.py', '--name') + self.assertEqual(out, b'SPAM\n') + self.assertEqual(err, b'') + + # a generated setup.py should complain if no setup.cfg is present + os.unlink('setup.cfg') + rc, out, err = assert_python_failure('setup.py', '--name') + self.assertIn(b'setup.cfg', err) + def test_encode_multipart(self): fields = [('username', 'wok'), ('password', 'secret')] files = [('picture', 'wok.png', b'PNG89')] @@ -580,7 +608,6 @@ super(GlobTestCase, self).tearDown() def assertGlobMatch(self, glob, spec): - """""" tempdir = self.build_files_tree(spec) expected = self.clean_tree(spec) os.chdir(tempdir) @@ -849,7 +876,9 @@ def test_get_install_method_with_packaging_pkg(self): path = self._valid_setup_cfg_pkg() - self.assertEqual("distutils2", get_install_method(path)) + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + self.assertEqual("distutils2", get_install_method(path)) def test_get_install_method_with_unknown_pkg(self): path = self._invalid_setup_cfg_pkg() diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -6,6 +6,7 @@ import imp import sys import errno +import codecs import shutil import string import hashlib @@ -925,6 +926,24 @@ yield file +# HOWTO change cfg_to_args +# +# This function has two major constraints: It is copied by inspect.getsource +# in generate_setup_py; it is used in generated setup.py which may be run by +# any Python version supported by distutils2 (2.4-3.3). +# +# * Keep objects like D1_D2_SETUP_ARGS static, i.e. in the function body +# instead of global. +# * If you use a function from another module, update the imports in +# SETUP_TEMPLATE. Use only modules, classes and functions compatible with +# all versions: codecs.open instead of open, RawConfigParser.readfp instead +# of read, standard exceptions instead of Packaging*Error, etc. +# * If you use a function from this module, update the template and +# generate_setup_py. +# +# test_util tests this function and the generated setup.py, but does not test +# that it's compatible with all Python versions. + def cfg_to_args(path='setup.cfg'): """Compatibility helper to use setup.cfg in setup.py. @@ -935,8 +954,6 @@ *file* is the path to the setup.cfg file. If it doesn't exist, PackagingFileError is raised. """ - # We need to declare the following constants here so that it's easier to - # generate the setup.py afterwards, using inspect.getsource. # XXX ** == needs testing D1_D2_SETUP_ARGS = {"name": ("metadata",), @@ -980,11 +997,11 @@ # The real code starts here config = RawConfigParser() - if not os.path.exists(path): - raise PackagingFileError("file '%s' does not exist" % - os.path.abspath(path)) - with open(path, encoding='utf-8') as f: + f = codecs.open(path, encoding='utf-8') + try: config.readfp(f) + finally: + f.close() kwargs = {} for arg in D1_D2_SETUP_ARGS: @@ -1006,8 +1023,11 @@ filenames = split_multiline(filenames) in_cfg_value = [] for filename in filenames: - with open(filename) as fp: + fp = codecs.open(filename, encoding='utf-8') + try: in_cfg_value.append(fp.read()) + finally: + fp.close() in_cfg_value = '\n\n'.join(in_cfg_value) else: continue @@ -1024,13 +1044,19 @@ return kwargs -_SETUP_TMPL = """\ +SETUP_TEMPLATE = """\ # This script was automatically generated by distutils2 import os +import codecs from distutils.core import setup -from ConfigParser import RawConfigParser +try: + from ConfigParser import RawConfigParser +except ImportError: + from configparser import RawConfigParser -%(func)s +%(split_multiline)s + +%(cfg_to_args)s setup(**cfg_to_args()) """ @@ -1044,8 +1070,10 @@ if os.path.exists("setup.py"): raise PackagingFileError("a setup.py file already exists") + source = SETUP_TEMPLATE % {'split_multiline': getsource(split_multiline), + 'cfg_to_args': getsource(cfg_to_args)} with open("setup.py", "w", encoding='utf-8') as fp: - fp.write(_SETUP_TMPL % {'func': getsource(cfg_to_args)}) + fp.write(source) # Taken from the pip project diff --git a/setup.cfg b/setup.cfg --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = Distutils2 version = 1.0a3 -summary = Python Distribution Utilities +summary = Python Packaging Library description-file = README.txt home-page = http://bitbucket.org/tarek/distutils2/wiki/Home author = The Fellowship of the Packaging -- Repository URL: http://hg.python.org/distutils2 From eric at trueblade.com Fri Oct 21 17:45:20 2011 From: eric at trueblade.com (Eric V. Smith) Date: Fri, 21 Oct 2011 11:45:20 -0400 Subject: [Python-checkins] cpython (3.2): adjust braces a bit In-Reply-To: References: Message-ID: <4EA19390.9080604@trueblade.com> What's the logic for adding some braces, but removing others? On 10/19/2011 4:58 PM, benjamin.peterson wrote: > http://hg.python.org/cpython/rev/9c79a25f4a8b > changeset: 73010:9c79a25f4a8b > branch: 3.2 > parent: 72998:99a9f0251924 > user: Benjamin Peterson > date: Wed Oct 19 16:57:40 2011 -0400 > summary: > adjust braces a bit > > files: > Objects/genobject.c | 9 ++++----- > 1 files changed, 4 insertions(+), 5 deletions(-) > > > diff --git a/Objects/genobject.c b/Objects/genobject.c > --- a/Objects/genobject.c > +++ b/Objects/genobject.c > @@ -232,8 +232,9 @@ > > /* First, check the traceback argument, replacing None with > NULL. */ > - if (tb == Py_None) > + if (tb == Py_None) { > tb = NULL; > + } > else if (tb != NULL && !PyTraceBack_Check(tb)) { > PyErr_SetString(PyExc_TypeError, > "throw() third argument must be a traceback object"); > @@ -244,9 +245,8 @@ > Py_XINCREF(val); > Py_XINCREF(tb); > > - if (PyExceptionClass_Check(typ)) { > + if (PyExceptionClass_Check(typ)) > PyErr_NormalizeException(&typ, &val, &tb); > - } > > else if (PyExceptionInstance_Check(typ)) { > /* Raising an instance. The value should be a dummy. */ > @@ -262,10 +262,9 @@ > typ = PyExceptionInstance_Class(typ); > Py_INCREF(typ); > > - if (tb == NULL) { > + if (tb == NULL) > /* Returns NULL if there's no traceback */ > tb = PyException_GetTraceback(val); > - } > } > } > else { > > > > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins From benjamin at python.org Fri Oct 21 18:31:04 2011 From: benjamin at python.org (Benjamin Peterson) Date: Fri, 21 Oct 2011 12:31:04 -0400 Subject: [Python-checkins] [Python-Dev] cpython (3.2): adjust braces a bit In-Reply-To: <4EA19390.9080604@trueblade.com> References: <4EA19390.9080604@trueblade.com> Message-ID: 2011/10/21 Eric V. Smith : > What's the logic for adding some braces, but removing others? No braces if everything is a one-liner, otherwise braces everywhere. -- Regards, Benjamin From eric at trueblade.com Fri Oct 21 20:31:48 2011 From: eric at trueblade.com (Eric V. Smith) Date: Fri, 21 Oct 2011 14:31:48 -0400 Subject: [Python-checkins] [Python-Dev] cpython (3.2): adjust braces a bit In-Reply-To: References: <4EA19390.9080604@trueblade.com> Message-ID: <4EA1BA94.6080006@trueblade.com> On 10/21/2011 12:31 PM, Benjamin Peterson wrote: > 2011/10/21 Eric V. Smith : >> What's the logic for adding some braces, but removing others? > > No braces if everything is a one-liner, otherwise braces everywhere. Not sure what "everything" means here. My specific question is why braces were added here: - if (tb == Py_None) + if (tb == Py_None) { tb = NULL; + } And removed here: - if (PyExceptionClass_Check(typ)) { + if (PyExceptionClass_Check(typ)) PyErr_NormalizeException(&typ, &val, &tb); - } I don't have any particular preference, but consistency seems important. From benjamin at python.org Fri Oct 21 20:39:45 2011 From: benjamin at python.org (Benjamin Peterson) Date: Fri, 21 Oct 2011 14:39:45 -0400 Subject: [Python-checkins] [Python-Dev] cpython (3.2): adjust braces a bit In-Reply-To: <4EA1BA94.6080006@trueblade.com> References: <4EA19390.9080604@trueblade.com> <4EA1BA94.6080006@trueblade.com> Message-ID: 2011/10/21 Eric V. Smith : > On 10/21/2011 12:31 PM, Benjamin Peterson wrote: >> 2011/10/21 Eric V. Smith : >>> What's the logic for adding some braces, but removing others? >> >> No braces if everything is a one-liner, otherwise braces everywhere. > > Not sure what "everything" means here. My specific question is why > braces were added here: > - ? ?if (tb == Py_None) > + ? ?if (tb == Py_None) { > ? ? ? ? tb = NULL; > + ? ?} Because an else if follows it. -- Regards, Benjamin From eric at trueblade.com Fri Oct 21 20:45:13 2011 From: eric at trueblade.com (Eric V. Smith) Date: Fri, 21 Oct 2011 14:45:13 -0400 Subject: [Python-checkins] [Python-Dev] cpython (3.2): adjust braces a bit In-Reply-To: References: <4EA19390.9080604@trueblade.com> <4EA1BA94.6080006@trueblade.com> Message-ID: <4EA1BDB9.4020703@trueblade.com> On 10/21/2011 2:39 PM, Benjamin Peterson wrote: > 2011/10/21 Eric V. Smith : >> On 10/21/2011 12:31 PM, Benjamin Peterson wrote: >>> 2011/10/21 Eric V. Smith : >>>> What's the logic for adding some braces, but removing others? >>> >>> No braces if everything is a one-liner, otherwise braces everywhere. >> >> Not sure what "everything" means here. My specific question is why >> braces were added here: >> - if (tb == Py_None) >> + if (tb == Py_None) { >> tb = NULL; >> + } > > Because an else if follows it. Ah. Then nevermind. I glossed over that. From python-checkins at python.org Fri Oct 21 20:45:59 2011 From: python-checkins at python.org (victor.stinner) Date: Fri, 21 Oct 2011 20:45:59 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_400=3A_don=27t_remove_depr?= =?utf8?q?ecated_classes_in_Python_3=2E4_anymore?= Message-ID: http://hg.python.org/peps/rev/b6b1577f9735 changeset: 3969:b6b1577f9735 user: Victor Stinner date: Fri Oct 21 20:47:06 2011 +0200 summary: PEP 400: don't remove deprecated classes in Python 3.4 anymore files: pep-0400.txt | 16 ++++------------ 1 files changed, 4 insertions(+), 12 deletions(-) diff --git a/pep-0400.txt b/pep-0400.txt --- a/pep-0400.txt +++ b/pep-0400.txt @@ -61,7 +61,7 @@ 3.3; * the legacy codecs.Stream* interfaces, including the streamreader and streamwriter attributes of codecs.CodecInfo be deprecated in Python - 3.3 and removed in Python 3.4. + 3.3. Rationale @@ -71,10 +71,6 @@ '''''''''''''''''''''''''''''''''''' * StreamReader is unable to translate newlines. - * StreamReaderWriter handles reads using StreamReader and writes - using StreamWriter (as io.BufferedRWPair). These two classes may be - inconsistent. To stay consistent, flush() must be called after each - write which slows down interlaced read-write. * StreamWriter doesn't support "line buffering" (flush if the input text contains a newline). * StreamReader classes of the CJK encodings (e.g. GB18030) only @@ -198,15 +194,11 @@ Deprecate StreamReader and StreamWriter ''''''''''''''''''''''''''''''''''''''' -Instanciating StreamReader or StreamWriter must raise a -DeprecationWarning in Python 3.3. Implementing a subclass doesn't -raise a DeprecationWarning. +Instanciating StreamReader or StreamWriter must emit a DeprecationWarning in +Python 3.3. Defining a subclass doesn't emit a DeprecationWarning. codecs.open() will be changed to reuse the builtin open() function -(TextIOWrapper). - -EncodedFile(), StreamRandom, StreamReader, StreamReaderWriter and -StreamWriter will be removed in Python 3.4 (or maybe later). +(TextIOWrapper) to read-write text files. .. _Appendix A: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Oct 21 20:57:53 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 21 Oct 2011 20:57:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2312753=3A_Add_support_for?= =?utf8?q?_Unicode_name_aliases_and_named_sequences=2E?= Message-ID: http://hg.python.org/cpython/rev/a985d733b3a3 changeset: 73044:a985d733b3a3 user: Ezio Melotti date: Fri Oct 21 21:57:36 2011 +0300 summary: #12753: Add support for Unicode name aliases and named sequences. files: Doc/library/unicodedata.rst | 9 + Doc/reference/lexical_analysis.rst | 17 +- Doc/whatsnew/3.3.rst | 6 + Include/ucnhash.h | 6 +- Lib/test/test_ucn.py | 88 +- Misc/NEWS | 4 + Modules/unicodedata.c | 72 +- Modules/unicodename_db.h | 35251 +++++++------- Objects/unicodeobject.c | 2 +- Tools/unicode/makeunicodedata.py | 102 +- 10 files changed, 18244 insertions(+), 17313 deletions(-) diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst --- a/Doc/library/unicodedata.rst +++ b/Doc/library/unicodedata.rst @@ -29,6 +29,9 @@ Look up character by name. If a character with the given name is found, return the corresponding character. If not found, :exc:`KeyError` is raised. + .. versionchanged:: 3.3 + Support for name aliases [#]_ and named sequences [#]_ has been added. + .. function:: name(chr[, default]) @@ -160,3 +163,9 @@ >>> unicodedata.bidirectional('\u0660') # 'A'rabic, 'N'umber 'AN' + +.. rubric:: Footnotes + +.. [#] http://www.unicode.org/Public/6.0.0/ucd/NameAliases.txt + +.. [#] http://www.unicode.org/Public/6.0.0/ucd/NamedSequences.txt diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -492,13 +492,13 @@ +-----------------+---------------------------------+-------+ | Escape Sequence | Meaning | Notes | +=================+=================================+=======+ -| ``\N{name}`` | Character named *name* in the | | +| ``\N{name}`` | Character named *name* in the | \(4) | | | Unicode database | | +-----------------+---------------------------------+-------+ -| ``\uxxxx`` | Character with 16-bit hex value | \(4) | +| ``\uxxxx`` | Character with 16-bit hex value | \(5) | | | *xxxx* | | +-----------------+---------------------------------+-------+ -| ``\Uxxxxxxxx`` | Character with 32-bit hex value | \(5) | +| ``\Uxxxxxxxx`` | Character with 32-bit hex value | \(6) | | | *xxxxxxxx* | | +-----------------+---------------------------------+-------+ @@ -516,10 +516,14 @@ with the given value. (4) + .. versionchanged:: 3.3 + Support for name aliases [#]_ has been added. + +(5) Individual code units which form parts of a surrogate pair can be encoded using this escape sequence. Exactly four hex digits are required. -(5) +(6) Any Unicode character can be encoded this way, but characters outside the Basic Multilingual Plane (BMP) will be encoded using a surrogate pair if Python is compiled to use 16-bit code units (the default). Exactly eight hex digits @@ -706,3 +710,8 @@ occurrence outside string literals and comments is an unconditional error:: $ ? ` + + +.. rubric:: Footnotes + +.. [#] http://www.unicode.org/Public/6.0.0/ucd/NameAliases.txt diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -179,6 +179,12 @@ * Stub +Added support for Unicode name aliases and named sequences. +Both :func:`unicodedata.lookup()` and '\N{...}' now resolve name aliases, +and :func:`unicodedata.lookup()` resolves named sequences too. + +(Contributed by Ezio Melotti in :issue:`12753`) + New, Improved, and Deprecated Modules ===================================== diff --git a/Include/ucnhash.h b/Include/ucnhash.h --- a/Include/ucnhash.h +++ b/Include/ucnhash.h @@ -19,11 +19,13 @@ success, zero if not. Does not set Python exceptions. If self is NULL, data come from the default version of the database. If it is not NULL, it should be a unicodedata.ucd_X_Y_Z object */ - int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen); + int (*getname)(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq); /* Get character code for a given name. Same error handling as for getname. */ - int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code); + int (*getcode)(PyObject *self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq); } _PyUnicode_Name_CAPI; diff --git a/Lib/test/test_ucn.py b/Lib/test/test_ucn.py --- a/Lib/test/test_ucn.py +++ b/Lib/test/test_ucn.py @@ -8,8 +8,11 @@ """#" import unittest +import unicodedata from test import support +from http.client import HTTPException +from test.test_normalization import check_version class UnicodeNamesTest(unittest.TestCase): @@ -59,8 +62,6 @@ ) def test_ascii_letters(self): - import unicodedata - for char in "".join(map(chr, range(ord("a"), ord("z")))): name = "LATIN SMALL LETTER %s" % char.upper() code = unicodedata.lookup(name) @@ -81,7 +82,6 @@ self.checkletter("HANGUL SYLLABLE HWEOK", "\ud6f8") self.checkletter("HANGUL SYLLABLE HIH", "\ud7a3") - import unicodedata self.assertRaises(ValueError, unicodedata.name, "\ud7a4") def test_cjk_unified_ideographs(self): @@ -97,14 +97,11 @@ self.checkletter("CJK UNIFIED IDEOGRAPH-2B81D", "\U0002B81D") def test_bmp_characters(self): - import unicodedata - count = 0 for code in range(0x10000): char = chr(code) name = unicodedata.name(char, None) if name is not None: self.assertEqual(unicodedata.lookup(name), char) - count += 1 def test_misc_symbols(self): self.checkletter("PILCROW SIGN", "\u00b6") @@ -112,8 +109,85 @@ self.checkletter("HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK", "\uFF9F") self.checkletter("FULLWIDTH LATIN SMALL LETTER A", "\uFF41") + def test_aliases(self): + # Check that the aliases defined in the NameAliases.txt file work. + # This should be updated when new aliases are added or the file + # should be downloaded and parsed instead. See #12753. + aliases = [ + ('LATIN CAPITAL LETTER GHA', 0x01A2), + ('LATIN SMALL LETTER GHA', 0x01A3), + ('KANNADA LETTER LLLA', 0x0CDE), + ('LAO LETTER FO FON', 0x0E9D), + ('LAO LETTER FO FAY', 0x0E9F), + ('LAO LETTER RO', 0x0EA3), + ('LAO LETTER LO', 0x0EA5), + ('TIBETAN MARK BKA- SHOG GI MGO RGYAN', 0x0FD0), + ('YI SYLLABLE ITERATION MARK', 0xA015), + ('PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET', 0xFE18), + ('BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS', 0x1D0C5) + ] + for alias, codepoint in aliases: + self.checkletter(alias, chr(codepoint)) + name = unicodedata.name(chr(codepoint)) + self.assertNotEqual(name, alias) + self.assertEqual(unicodedata.lookup(alias), + unicodedata.lookup(name)) + with self.assertRaises(KeyError): + unicodedata.ucd_3_2_0.lookup(alias) + + def test_aliases_names_in_pua_range(self): + # We are storing aliases in the PUA 15, but their names shouldn't leak + for cp in range(0xf0000, 0xf0100): + with self.assertRaises(ValueError) as cm: + unicodedata.name(chr(cp)) + self.assertEqual(str(cm.exception), 'no such name') + + def test_named_sequences_names_in_pua_range(self): + # We are storing named seq in the PUA 15, but their names shouldn't leak + for cp in range(0xf0100, 0xf0fff): + with self.assertRaises(ValueError) as cm: + unicodedata.name(chr(cp)) + self.assertEqual(str(cm.exception), 'no such name') + + def test_named_sequences_sample(self): + # Check a few named sequences. See #12753. + sequences = [ + ('LATIN SMALL LETTER R WITH TILDE', '\u0072\u0303'), + ('TAMIL SYLLABLE SAI', '\u0BB8\u0BC8'), + ('TAMIL SYLLABLE MOO', '\u0BAE\u0BCB'), + ('TAMIL SYLLABLE NNOO', '\u0BA3\u0BCB'), + ('TAMIL CONSONANT KSS', '\u0B95\u0BCD\u0BB7\u0BCD'), + ] + for seqname, codepoints in sequences: + self.assertEqual(unicodedata.lookup(seqname), codepoints) + with self.assertRaises(SyntaxError): + self.checkletter(seqname, None) + with self.assertRaises(KeyError): + unicodedata.ucd_3_2_0.lookup(seqname) + + def test_named_sequences_full(self): + # Check all the named sequences + url = ("http://www.unicode.org/Public/%s/ucd/NamedSequences.txt" % + unicodedata.unidata_version) + try: + testdata = support.open_urlresource(url, encoding="utf-8", + check=check_version) + except (IOError, HTTPException): + self.skipTest("Could not retrieve " + url) + self.addCleanup(testdata.close) + for line in testdata: + line = line.strip() + if not line or line.startswith('#'): + continue + seqname, codepoints = line.split(';') + codepoints = ''.join(chr(int(cp, 16)) for cp in codepoints.split()) + self.assertEqual(unicodedata.lookup(seqname), codepoints) + with self.assertRaises(SyntaxError): + self.checkletter(seqname, None) + with self.assertRaises(KeyError): + unicodedata.ucd_3_2_0.lookup(seqname) + def test_errors(self): - import unicodedata self.assertRaises(TypeError, unicodedata.name) self.assertRaises(TypeError, unicodedata.name, 'xx') self.assertRaises(TypeError, unicodedata.lookup) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #12753: Add support for Unicode name aliases and named sequences. + Both :func:`unicodedata.lookup()` and '\N{...}' now resolve aliases, + and :func:`unicodedata.lookup()` resolves named sequences too. + - Issue #12170: The count(), find(), rfind(), index() and rindex() methods of bytes and bytearray objects now accept an integer between 0 and 255 as their first argument. Patch by Petri Lehtinen. diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -926,9 +926,19 @@ (0x2B740 <= code && code <= 0x2B81D); /* CJK Ideograph Extension D */ } +/* macros used to determine if the given codepoint is in the PUA range that + * we are using to store aliases and named sequences */ +#define IS_ALIAS(cp) ((cp >= aliases_start) && (cp < aliases_end)) +#define IS_NAMED_SEQ(cp) ((cp >= named_sequences_start) && \ + (cp < named_sequences_end)) + static int -_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen) +_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen, + int with_alias_and_seq) { + /* Find the name associated with the given codepoint. + * If with_alias_and_seq is 1, check for names in the Private Use Area 15 + * that we are using for aliases and named sequences. */ int offset; int i; int word; @@ -937,7 +947,14 @@ if (code >= 0x110000) return 0; + /* XXX should we just skip all the codepoints in the PUAs here? */ + if (!with_alias_and_seq && (IS_ALIAS(code) || IS_NAMED_SEQ(code))) + return 0; + if (self && UCD_Check(self)) { + /* in 3.2.0 there are no aliases and named sequences */ + if (IS_ALIAS(code) || IS_NAMED_SEQ(code)) + return 0; const change_record *old = get_old_record(self, code); if (old->category_changed == 0) { /* unassigned */ @@ -1022,7 +1039,7 @@ /* check if code corresponds to the given name */ int i; char buffer[NAME_MAXLEN]; - if (!_getucname(self, code, buffer, sizeof(buffer))) + if (!_getucname(self, code, buffer, sizeof(buffer), 1)) return 0; for (i = 0; i < namelen; i++) { if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i]) @@ -1052,8 +1069,28 @@ } static int -_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code) +_check_alias_and_seq(unsigned int cp, Py_UCS4* code, int with_named_seq) { + /* check if named sequences are allowed */ + if (!with_named_seq && IS_NAMED_SEQ(cp)) + return 0; + /* if the codepoint is in the PUA range that we use for aliases, + * convert it to obtain the right codepoint */ + if (IS_ALIAS(cp)) + *code = name_aliases[cp-aliases_start]; + else + *code = cp; + return 1; +} + +static int +_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code, + int with_named_seq) +{ + /* Return the codepoint associated with the given name. + * Named aliases are resolved too (unless self != NULL (i.e. we are using + * 3.2.0)). If with_named_seq is 1, returns the PUA codepoint that we are + * using for the named sequence, and the caller must then convert it. */ unsigned int h, v; unsigned int mask = code_size-1; unsigned int i, incr; @@ -1109,10 +1146,8 @@ v = code_hash[i]; if (!v) return 0; - if (_cmpname(self, v, name, namelen)) { - *code = v; - return 1; - } + if (_cmpname(self, v, name, namelen)) + return _check_alias_and_seq(v, code, with_named_seq); incr = (h ^ (h >> 3)) & mask; if (!incr) incr = mask; @@ -1121,10 +1156,8 @@ v = code_hash[i]; if (!v) return 0; - if (_cmpname(self, v, name, namelen)) { - *code = v; - return 1; - } + if (_cmpname(self, v, name, namelen)) + return _check_alias_and_seq(v, code, with_named_seq); incr = incr << 1; if (incr > mask) incr = incr ^ code_poly; @@ -1162,7 +1195,7 @@ if (c == (Py_UCS4)-1) return NULL; - if (!_getucname(self, c, name, sizeof(name))) { + if (!_getucname(self, c, name, sizeof(name), 0)) { if (defobj == NULL) { PyErr_SetString(PyExc_ValueError, "no such name"); return NULL; @@ -1190,15 +1223,22 @@ char* name; int namelen; + unsigned int index; if (!PyArg_ParseTuple(args, "s#:lookup", &name, &namelen)) return NULL; - if (!_getcode(self, name, namelen, &code)) { - PyErr_Format(PyExc_KeyError, "undefined character name '%s'", - name); + if (!_getcode(self, name, namelen, &code, 1)) { + PyErr_Format(PyExc_KeyError, "undefined character name '%s'", name); return NULL; } - + // check if code is in the PUA range that we use for named sequences + // and convert it + if (IS_NAMED_SEQ(code)) { + index = code-named_sequences_start; + return PyUnicode_FromKindAndData(PyUnicode_2BYTE_KIND, + named_sequences[index].seq, + named_sequences[index].seqlen); + } return PyUnicode_FromOrdinal(code); } diff --git a/Modules/unicodename_db.h b/Modules/unicodename_db.h --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -4,257 +4,258 @@ /* lexicon */ static unsigned char lexicon[] = { - 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 77, 65, 76, 204, 83, 89, - 76, 76, 65, 66, 76, 197, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204, + 76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 89, 76, 76, 65, 66, 76, + 197, 83, 77, 65, 76, 204, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204, 76, 65, 84, 73, 206, 89, 201, 67, 74, 203, 69, 71, 89, 80, 84, 73, 65, 206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 65, 82, 65, 66, 73, 195, 67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 77, 65, 84, 72, 69, 77, 65, 84, 73, 67, 65, 204, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89, 77, 66, 79, 204, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, 83, 89, 76, 76, 65, 66, 73, 67, 211, 66, 65, 77, 85, 205, 68, 73, 71, 73, - 212, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 65, 78, 196, 71, 82, 69, + 212, 65, 78, 196, 66, 79, 76, 196, 72, 65, 78, 71, 85, 204, 71, 82, 69, 69, 203, 76, 73, 71, 65, 84, 85, 82, 197, 77, 85, 83, 73, 67, 65, 204, 69, 84, 72, 73, 79, 80, 73, 195, 84, 73, 77, 69, 211, 86, 79, 87, 69, 204, 70, 79, 210, 73, 84, 65, 76, 73, 195, 67, 89, 82, 73, 76, 76, 73, 195, 82, 65, 68, 73, 67, 65, 204, 83, 65, 78, 83, 45, 83, 69, 82, 73, - 198, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66, 73, 78, 73, 78, 199, - 84, 65, 201, 86, 65, 201, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, 197, - 76, 69, 70, 212, 86, 65, 82, 73, 65, 84, 73, 79, 206, 66, 82, 65, 73, 76, - 76, 197, 80, 65, 84, 84, 69, 82, 206, 82, 73, 71, 72, 212, 66, 89, 90, - 65, 78, 84, 73, 78, 197, 73, 83, 79, 76, 65, 84, 69, 196, 65, 66, 79, 86, - 69, 128, 78, 85, 77, 66, 69, 210, 68, 79, 85, 66, 76, 197, 83, 73, 71, - 78, 128, 194, 66, 69, 76, 79, 87, 128, 75, 65, 84, 65, 75, 65, 78, 193, - 75, 65, 78, 71, 88, 201, 76, 73, 78, 69, 65, 210, 77, 79, 68, 73, 70, 73, - 69, 210, 84, 73, 66, 69, 84, 65, 206, 65, 128, 68, 79, 212, 77, 69, 69, - 205, 77, 89, 65, 78, 77, 65, 210, 79, 198, 67, 65, 82, 82, 73, 69, 210, - 87, 72, 73, 84, 197, 65, 82, 82, 79, 87, 128, 85, 128, 73, 78, 73, 84, - 73, 65, 204, 86, 69, 82, 84, 73, 67, 65, 204, 73, 128, 89, 69, 200, 79, - 128, 65, 82, 82, 79, 215, 77, 65, 82, 75, 128, 65, 66, 79, 86, 197, 67, - 79, 80, 84, 73, 195, 80, 72, 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, - 73, 65, 206, 68, 69, 86, 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, - 203, 75, 72, 77, 69, 210, 84, 73, 76, 197, 80, 65, 82, 69, 78, 84, 72, - 69, 83, 73, 90, 69, 196, 83, 89, 77, 66, 79, 76, 128, 84, 72, 65, 205, - 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, 69, 128, 83, 81, - 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, 66, 82, 69, 215, 80, 76, 85, - 211, 82, 73, 71, 72, 84, 87, 65, 82, 68, 211, 68, 82, 65, 87, 73, 78, 71, - 211, 67, 72, 79, 83, 69, 79, 78, 199, 72, 65, 76, 70, 87, 73, 68, 84, - 200, 66, 65, 76, 73, 78, 69, 83, 197, 71, 69, 79, 82, 71, 73, 65, 206, - 72, 79, 79, 75, 128, 73, 68, 69, 79, 71, 82, 65, 205, 80, 72, 65, 83, 69, - 45, 196, 65, 76, 67, 72, 69, 77, 73, 67, 65, 204, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 73, 195, 65, 76, 69, 198, 72, 69, 65, 86, 217, 84, 79, 128, - 84, 87, 79, 128, 79, 86, 69, 210, 213, 66, 82, 65, 72, 77, 201, 83, 67, - 82, 73, 80, 212, 85, 208, 76, 79, 215, 79, 78, 69, 128, 84, 87, 207, 68, + 198, 84, 65, 77, 73, 204, 67, 73, 82, 67, 76, 69, 196, 67, 79, 77, 66, + 73, 78, 73, 78, 199, 84, 65, 201, 86, 65, 201, 70, 73, 78, 65, 204, 83, + 81, 85, 65, 82, 197, 76, 69, 70, 212, 86, 65, 82, 73, 65, 84, 73, 79, + 206, 66, 82, 65, 73, 76, 76, 197, 80, 65, 84, 84, 69, 82, 206, 82, 73, + 71, 72, 212, 66, 89, 90, 65, 78, 84, 73, 78, 197, 73, 83, 79, 76, 65, 84, + 69, 196, 65, 66, 79, 86, 69, 128, 78, 85, 77, 66, 69, 210, 68, 79, 85, + 66, 76, 197, 83, 73, 71, 78, 128, 66, 69, 76, 79, 87, 128, 75, 65, 84, + 65, 75, 65, 78, 193, 194, 75, 65, 78, 71, 88, 201, 77, 79, 68, 73, 70, + 73, 69, 210, 76, 73, 78, 69, 65, 210, 84, 73, 66, 69, 84, 65, 206, 68, + 79, 212, 65, 128, 77, 69, 69, 205, 77, 89, 65, 78, 77, 65, 210, 86, 69, + 82, 84, 73, 67, 65, 204, 75, 72, 77, 69, 210, 79, 198, 87, 72, 73, 84, + 197, 67, 65, 82, 82, 73, 69, 210, 65, 82, 82, 79, 87, 128, 85, 128, 73, + 78, 73, 84, 73, 65, 204, 65, 66, 79, 86, 197, 73, 128, 89, 69, 200, 79, + 128, 77, 65, 82, 75, 128, 65, 82, 82, 79, 215, 67, 79, 80, 84, 73, 195, + 80, 72, 65, 83, 69, 45, 197, 77, 79, 78, 71, 79, 76, 73, 65, 206, 68, 69, + 86, 65, 78, 65, 71, 65, 82, 201, 66, 76, 65, 67, 203, 84, 73, 76, 197, + 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 90, 69, 196, 83, 89, 77, 66, 79, + 76, 128, 84, 72, 65, 205, 74, 79, 78, 71, 83, 69, 79, 78, 199, 83, 84, + 82, 79, 75, 69, 128, 83, 81, 85, 65, 82, 69, 196, 66, 79, 216, 72, 69, + 66, 82, 69, 215, 80, 76, 85, 211, 82, 73, 71, 72, 84, 87, 65, 82, 68, + 211, 68, 82, 65, 87, 73, 78, 71, 211, 67, 72, 79, 83, 69, 79, 78, 199, + 71, 69, 79, 82, 71, 73, 65, 206, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, + 65, 76, 73, 78, 69, 83, 197, 72, 79, 79, 75, 128, 213, 73, 68, 69, 79, + 71, 82, 65, 205, 80, 72, 65, 83, 69, 45, 196, 65, 76, 67, 72, 69, 77, 73, + 67, 65, 204, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 65, 76, 69, + 198, 84, 79, 128, 72, 69, 65, 86, 217, 84, 87, 79, 128, 79, 86, 69, 210, + 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79, 215, + 79, 78, 69, 128, 84, 87, 207, 67, 79, 78, 83, 79, 78, 65, 78, 212, 68, 79, 87, 206, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, 65, 200, 79, 78, - 197, 69, 81, 85, 65, 204, 72, 73, 71, 200, 66, 82, 65, 67, 75, 69, 84, - 128, 84, 65, 199, 68, 79, 77, 73, 78, 207, 78, 85, 77, 69, 82, 73, 195, + 197, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 72, 73, 71, + 200, 84, 65, 199, 68, 79, 77, 73, 78, 207, 78, 85, 77, 69, 82, 73, 195, 70, 82, 65, 75, 84, 85, 210, 77, 65, 76, 65, 89, 65, 76, 65, 205, 80, 72, - 65, 83, 69, 45, 195, 76, 69, 70, 84, 87, 65, 82, 68, 211, 84, 72, 82, 69, - 197, 66, 65, 82, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 71, 76, 65, - 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, 67, 84, 69, 210, 77, 69, - 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 66, 69, 78, 71, 65, 76, 201, - 65, 82, 77, 69, 78, 73, 65, 206, 72, 73, 82, 65, 71, 65, 78, 193, 73, 68, - 69, 79, 71, 82, 65, 80, 200, 74, 65, 86, 65, 78, 69, 83, 197, 74, 69, 69, - 205, 78, 69, 71, 65, 84, 73, 86, 197, 79, 82, 73, 89, 193, 87, 69, 83, - 84, 45, 67, 82, 69, 197, 72, 65, 76, 198, 77, 65, 82, 203, 80, 72, 65, - 83, 69, 45, 193, 84, 72, 65, 201, 75, 65, 78, 78, 65, 68, 193, 78, 69, - 215, 67, 72, 69, 82, 79, 75, 69, 197, 72, 65, 128, 84, 79, 78, 197, 86, - 79, 67, 65, 76, 73, 195, 67, 72, 65, 205, 70, 79, 85, 82, 128, 71, 85, - 74, 65, 82, 65, 84, 201, 76, 85, 197, 84, 72, 82, 69, 69, 128, 82, 85, - 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 84, 69, 84, 82, 65, - 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, 212, 83, 73, 78, 72, 65, 76, - 193, 71, 85, 82, 77, 85, 75, 72, 201, 78, 79, 84, 65, 84, 73, 79, 206, - 83, 89, 82, 73, 65, 195, 68, 79, 84, 211, 76, 73, 71, 72, 212, 84, 65, - 77, 73, 204, 65, 67, 85, 84, 69, 128, 70, 73, 86, 69, 128, 75, 65, 128, - 76, 69, 80, 67, 72, 193, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, 89, - 65, 128, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 77, 65, + 65, 83, 69, 45, 195, 66, 65, 82, 128, 76, 69, 70, 84, 87, 65, 82, 68, + 211, 72, 73, 82, 65, 71, 65, 78, 193, 84, 72, 82, 69, 197, 65, 67, 85, + 84, 69, 128, 74, 85, 78, 71, 83, 69, 79, 78, 199, 71, 76, 65, 71, 79, 76, + 73, 84, 73, 195, 66, 69, 78, 71, 65, 76, 201, 67, 72, 65, 82, 65, 67, 84, + 69, 210, 77, 69, 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 65, 82, 77, + 69, 78, 73, 65, 206, 73, 68, 69, 79, 71, 82, 65, 80, 200, 74, 65, 86, 65, + 78, 69, 83, 197, 74, 69, 69, 205, 78, 69, 71, 65, 84, 73, 86, 197, 79, + 82, 73, 89, 193, 87, 69, 83, 84, 45, 67, 82, 69, 197, 77, 65, 82, 203, + 72, 65, 76, 198, 75, 65, 78, 78, 65, 68, 193, 80, 72, 65, 83, 69, 45, + 193, 84, 72, 65, 201, 84, 79, 78, 197, 72, 65, 128, 78, 69, 215, 67, 72, + 69, 82, 79, 75, 69, 197, 86, 79, 67, 65, 76, 73, 195, 67, 72, 65, 205, + 70, 79, 85, 82, 128, 71, 85, 74, 65, 82, 65, 84, 201, 76, 85, 197, 84, + 72, 82, 69, 69, 128, 82, 85, 78, 73, 195, 83, 65, 85, 82, 65, 83, 72, 84, + 82, 193, 84, 69, 84, 82, 65, 71, 82, 65, 205, 68, 69, 83, 69, 82, 69, + 212, 83, 73, 78, 72, 65, 76, 193, 84, 73, 76, 68, 69, 128, 71, 85, 82, + 77, 85, 75, 72, 201, 78, 79, 84, 65, 84, 73, 79, 206, 83, 89, 82, 73, 65, + 195, 68, 79, 84, 211, 76, 73, 71, 72, 212, 75, 65, 128, 70, 73, 86, 69, + 128, 76, 69, 80, 67, 72, 193, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, + 89, 65, 128, 68, 79, 85, 66, 76, 69, 45, 83, 84, 82, 85, 67, 203, 77, 65, 128, 83, 73, 88, 128, 86, 73, 69, 212, 72, 65, 77, 90, 193, 80, 65, 128, - 65, 80, 204, 69, 73, 71, 72, 84, 128, 70, 85, 78, 67, 84, 73, 79, 78, 65, - 204, 83, 128, 83, 69, 86, 69, 78, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 204, 78, 73, 78, 69, 128, 84, 69, 76, 69, 71, 82, 65, 80, 200, 66, - 79, 80, 79, 77, 79, 70, 207, 82, 65, 128, 78, 65, 128, 66, 65, 82, 194, - 68, 65, 83, 73, 193, 75, 65, 73, 84, 72, 201, 76, 73, 77, 66, 213, 77, - 65, 75, 83, 85, 82, 193, 84, 207, 90, 90, 89, 88, 128, 90, 90, 89, 84, - 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, 89, 80, 128, - 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, 128, 90, 90, - 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, 79, 88, 128, - 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, 90, 90, 73, - 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, 90, 73, 69, - 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, 90, 73, 128, - 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, 128, 90, 90, - 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, 65, 80, 128, - 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, 128, 90, 87, - 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, 128, 90, 85, - 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, 77, 128, 90, - 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 82, 65, 128, 90, - 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, 79, 65, 128, - 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, 69, 128, 90, - 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, 82, 128, 90, - 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, 128, 90, 73, - 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, 201, 90, 72, - 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, 90, 72, 89, - 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, 69, 128, 90, - 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, 90, 72, 85, - 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, 72, 85, 79, - 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, 72, 85, 128, - 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, 128, 90, 72, - 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, 128, 90, 72, - 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, 69, 80, 128, - 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, 65, 88, 128, - 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, 128, 90, 72, - 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, 72, 128, 90, - 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, 69, 78, 128, - 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, 90, 69, 50, - 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, 90, 65, 89, - 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, 128, 90, - 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, 90, 65, 77, 88, 128, 90, 65, - 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, 65, 72, - 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48, 49, 54, - 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, 48, 49, - 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, 90, 48, - 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, 90, 48, - 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, 128, 90, - 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, 68, 128, - 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, 53, 65, - 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, 128, 90, - 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, 48, 48, - 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, 54, 128, - 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, 65, 128, - 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, 65, 128, - 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, 67, 128, - 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, 50, 128, - 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, 128, 89, - 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, 128, 89, - 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, 89, 87, - 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, 128, 89, - 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, 128, 89, - 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 84, 128, 89, - 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, 85, - 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, - 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, 128, 89, 85, 79, 128, 89, - 85, 78, 128, 89, 85, 77, 128, 89, 85, 69, 81, 128, 89, 85, 69, 128, 89, - 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, 78, 128, 89, 85, 65, 69, - 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, 69, 128, 89, 85, - 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, 89, 85, 45, 69, - 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, 89, 85, 45, 65, - 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, 73, 128, 89, 80, 79, 82, - 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, 89, 80, 79, 75, - 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, - 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 85, 84, 72, 70, 85, 76, - 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, 79, 84, 128, - 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, 89, 79, 80, 128, 89, - 79, 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 72, - 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 69, - 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, - 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, - 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 128, 89, 207, 89, 73, 90, 69, - 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, - 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 199, 89, 73, 69, - 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 69, 128, - 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, - 73, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, - 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, 88, 128, 89, 69, - 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, 77, 128, 89, 69, - 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, 84, 73, 86, 128, - 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, - 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, - 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, - 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, - 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, - 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, - 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, 79, 45, 85, - 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, 89, 69, 78, - 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, 79, 87, 128, - 89, 69, 76, 76, 79, 215, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65, - 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, - 90, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, - 128, 89, 65, 86, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, - 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, - 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 128, 89, 65, 210, 89, - 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, - 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, - 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, - 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, - 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 72, 72, 128, 89, - 65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, - 72, 128, 89, 65, 71, 128, 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, - 77, 77, 65, 69, 128, 89, 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, - 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, - 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, - 65, 65, 68, 79, 128, 89, 65, 65, 128, 89, 65, 45, 89, 79, 128, 89, 65, - 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, - 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, - 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, - 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, - 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, - 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, 128, 88, 89, 69, 128, - 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, - 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, - 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128, - 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79, - 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, 79, 80, 128, 88, 79, 65, - 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, - 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, - 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, 128, 88, 69, 83, 84, 69, - 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, 128, 88, 65, 78, 128, 88, - 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, - 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, - 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, - 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, - 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 128, - 87, 85, 80, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, - 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, - 76, 213, 87, 85, 69, 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, - 128, 87, 85, 128, 87, 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 84, - 73, 78, 199, 87, 82, 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, - 82, 65, 80, 80, 69, 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, - 82, 75, 69, 82, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, - 68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, - 79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, - 197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, - 78, 211, 87, 79, 77, 69, 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, - 78, 128, 87, 79, 77, 65, 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, - 198, 87, 79, 69, 128, 87, 79, 65, 128, 87, 73, 84, 72, 79, 85, 212, 87, - 73, 78, 84, 69, 82, 128, 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 74, 65, - 128, 87, 73, 78, 71, 83, 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87, - 73, 78, 68, 85, 128, 87, 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, - 128, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, - 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71, - 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, 79, 76, 197, 87, - 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, - 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, - 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, - 128, 87, 72, 65, 76, 69, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, - 88, 128, 87, 69, 83, 84, 69, 82, 206, 87, 69, 83, 84, 128, 87, 69, 83, - 212, 87, 69, 80, 128, 87, 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, 76, - 128, 87, 69, 73, 71, 72, 212, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, - 45, 84, 65, 73, 76, 69, 196, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 65, - 82, 217, 87, 69, 65, 80, 79, 78, 128, 87, 67, 128, 87, 66, 128, 87, 65, - 89, 128, 87, 65, 217, 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, - 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, - 215, 87, 65, 86, 217, 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, - 87, 65, 86, 69, 128, 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, - 79, 128, 87, 65, 84, 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, - 128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, - 65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, - 65, 83, 76, 65, 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, - 128, 87, 65, 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87, - 65, 80, 128, 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, 79, 81, - 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, 65, 76, - 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78, - 71, 128, 87, 65, 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, 65, - 65, 86, 85, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, - 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, - 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, - 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, - 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, - 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, - 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, - 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, - 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, - 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, - 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, - 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 65, - 128, 86, 85, 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, + 83, 128, 65, 80, 204, 69, 73, 71, 72, 84, 128, 70, 85, 78, 67, 84, 73, + 79, 78, 65, 204, 83, 69, 86, 69, 78, 128, 72, 79, 82, 73, 90, 79, 78, 84, + 65, 204, 76, 65, 207, 78, 73, 78, 69, 128, 84, 69, 76, 69, 71, 82, 65, + 80, 200, 66, 79, 80, 79, 77, 79, 70, 207, 78, 65, 128, 82, 65, 128, 71, + 82, 65, 86, 69, 128, 79, 80, 69, 206, 86, 128, 90, 90, 89, 88, 128, 90, + 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, 82, 128, 90, 90, + 89, 80, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, 90, 85, 82, 88, + 128, 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, 85, 128, 90, 90, + 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, 90, 73, 88, 128, + 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, 69, 88, 128, 90, + 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, 73, 69, 128, 90, + 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, 90, 90, 69, 69, + 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, 84, 128, 90, 90, + 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, 89, 71, 79, 83, + 128, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, 128, 90, 85, 84, + 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, 79, 128, 90, 85, + 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, 85, 181, 90, 82, + 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, 79, 79, 128, 90, + 79, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, 76, 193, 90, 74, + 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, 90, 73, 78, 79, + 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, 199, 90, 73, 71, + 128, 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, 73, 51, 128, 90, + 201, 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, 89, 82, 88, 128, + 90, 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, 128, 90, 72, 87, + 69, 128, 90, 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, 72, 85, 84, 128, + 90, 72, 85, 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, 85, 80, 128, 90, + 72, 85, 79, 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, 85, 79, 128, 90, + 72, 85, 128, 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, 90, 72, 79, 80, + 128, 90, 72, 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, 86, 69, 84, 69, + 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, 84, 128, 90, 72, + 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, 72, 197, 90, 72, + 65, 88, 128, 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, 90, 72, 65, 80, + 128, 90, 72, 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, 72, 65, 128, 90, + 72, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, 69, 82, 207, 90, + 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, 76, 74, 65, 128, + 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, 89, 73, 78, 128, + 90, 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, 128, 90, 65, 84, 65, + 128, 90, 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, 90, 65, 77, 88, 128, + 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, 90, 65, 73, 128, 90, + 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, 69, 70, 128, 90, 48, + 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, 49, 54, 70, 128, 90, + 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, 48, 49, 54, 67, 128, + 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, 90, 48, 49, 54, 128, + 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, 90, 48, 49, 53, 71, + 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, 128, 90, 48, 49, 53, + 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, 66, 128, 90, 48, 49, + 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, 128, 90, 48, 49, 51, + 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, 48, 49, 48, 128, 90, + 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, 55, 128, 90, 48, 48, + 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, 128, 90, 48, 48, 52, + 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, 128, 90, 48, 48, 51, + 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, 128, 90, 48, 48, 50, + 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, 65, 128, 90, 48, 48, + 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, 88, 128, 89, 89, 84, + 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, 80, 128, 89, 89, 69, + 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, 128, 89, 87, 79, 128, + 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, 128, 89, 87, 65, 65, + 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, 89, 85, 87, 79, 81, + 128, 89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 85, + 128, 89, 85, 84, 128, 89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, + 89, 85, 82, 128, 89, 85, 81, 128, 89, 85, 209, 89, 85, 80, 128, 89, 85, + 79, 88, 128, 89, 85, 79, 84, 128, 89, 85, 79, 80, 128, 89, 85, 79, 77, + 128, 89, 85, 79, 128, 89, 85, 78, 128, 89, 85, 77, 128, 89, 85, 69, 81, + 128, 89, 85, 69, 128, 89, 85, 68, 72, 128, 89, 85, 68, 200, 89, 85, 65, + 78, 128, 89, 85, 65, 69, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, + 45, 89, 69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, + 73, 128, 89, 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, + 69, 128, 89, 85, 45, 65, 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, + 73, 128, 89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, + 83, 128, 89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, + 65, 77, 77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, + 85, 84, 72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, + 204, 89, 79, 84, 128, 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 209, + 89, 79, 80, 128, 89, 79, 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, + 128, 89, 79, 68, 72, 128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, + 89, 79, 45, 89, 69, 79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, + 65, 128, 89, 79, 45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, + 128, 89, 79, 45, 65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 128, 89, 207, + 89, 73, 90, 69, 84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, + 84, 128, 89, 73, 80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, + 199, 89, 73, 69, 88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, + 73, 69, 69, 128, 89, 73, 69, 128, 89, 73, 68, 68, 73, 83, 200, 89, 73, + 45, 85, 128, 89, 73, 128, 89, 70, 69, 83, 73, 83, 128, 89, 70, 69, 83, + 73, 211, 89, 70, 69, 206, 89, 69, 89, 128, 89, 69, 87, 128, 89, 69, 85, + 88, 128, 89, 69, 85, 82, 65, 69, 128, 89, 69, 85, 81, 128, 89, 69, 85, + 77, 128, 89, 69, 85, 65, 69, 84, 128, 89, 69, 85, 65, 69, 128, 89, 69, + 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, 89, 69, 83, 73, 69, 85, 78, 71, + 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 80, 65, 78, + 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 77, 73, 69, 85, + 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, 45, 72, 73, 69, 85, 72, 128, 89, + 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, 82, 85, 128, 89, 69, 82, 213, + 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, 89, 69, 82, 128, 89, 69, 79, + 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, 79, 45, 89, 65, 128, 89, 69, + 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, 89, 69, 78, 73, 83, 69, 201, + 89, 69, 78, 65, 80, 128, 89, 69, 78, 128, 89, 69, 206, 89, 69, 76, 76, + 79, 87, 128, 89, 69, 76, 76, 79, 215, 89, 69, 72, 128, 89, 69, 69, 128, + 89, 69, 65, 210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, + 128, 89, 65, 90, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, + 89, 65, 87, 128, 89, 65, 86, 128, 89, 65, 85, 128, 89, 65, 84, 84, 128, + 89, 65, 84, 73, 128, 89, 65, 84, 72, 128, 89, 65, 84, 128, 89, 65, 83, + 83, 128, 89, 65, 83, 72, 128, 89, 65, 83, 128, 89, 65, 82, 82, 128, 89, + 65, 82, 128, 89, 65, 210, 89, 65, 81, 128, 89, 65, 80, 128, 89, 65, 78, + 71, 128, 89, 65, 78, 199, 89, 65, 78, 128, 89, 65, 77, 79, 75, 128, 89, + 65, 77, 65, 75, 75, 65, 78, 128, 89, 65, 77, 128, 89, 65, 76, 128, 89, + 65, 75, 72, 72, 128, 89, 65, 75, 72, 128, 89, 65, 75, 65, 83, 72, 128, + 89, 65, 75, 128, 89, 65, 74, 85, 82, 86, 69, 68, 73, 195, 89, 65, 74, + 128, 89, 65, 73, 128, 89, 65, 72, 72, 128, 89, 65, 72, 128, 89, 65, 71, + 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, 72, 128, 89, 65, 71, 128, + 89, 65, 70, 213, 89, 65, 70, 128, 89, 65, 69, 77, 77, 65, 69, 128, 89, + 65, 68, 72, 128, 89, 65, 68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, + 68, 128, 89, 65, 67, 72, 128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, + 65, 65, 82, 85, 128, 89, 65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, + 65, 65, 128, 89, 65, 45, 89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, + 79, 128, 89, 48, 48, 56, 128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, + 89, 48, 48, 53, 128, 89, 48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, + 48, 50, 128, 89, 48, 48, 49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, + 82, 69, 197, 88, 89, 88, 128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, + 82, 88, 128, 88, 89, 82, 128, 88, 89, 80, 128, 88, 89, 79, 128, 88, 89, + 73, 128, 88, 89, 69, 69, 128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, + 89, 65, 128, 88, 89, 128, 88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, + 69, 128, 88, 87, 65, 65, 128, 88, 87, 65, 128, 88, 86, 69, 128, 88, 86, + 65, 128, 88, 85, 79, 88, 128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, + 65, 65, 89, 65, 84, 72, 73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, + 128, 88, 79, 82, 128, 88, 79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, + 73, 88, 128, 88, 73, 84, 128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, + 73, 69, 88, 128, 88, 73, 69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, + 128, 88, 73, 128, 88, 71, 128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, + 88, 69, 69, 128, 88, 69, 128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, + 128, 88, 48, 48, 56, 65, 128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, + 88, 48, 48, 54, 65, 128, 88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, + 48, 48, 52, 66, 128, 88, 48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, + 48, 48, 51, 128, 88, 48, 48, 50, 128, 88, 48, 48, 49, 128, 87, 90, 128, + 87, 89, 78, 78, 128, 87, 89, 78, 206, 87, 86, 128, 87, 85, 80, 128, 87, + 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, 85, 79, 128, 87, 85, 78, 74, + 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, 87, 85, 76, 213, 87, 85, 69, + 128, 87, 85, 65, 69, 84, 128, 87, 85, 65, 69, 78, 128, 87, 85, 128, 87, + 82, 217, 87, 82, 79, 78, 71, 128, 87, 82, 73, 84, 73, 78, 199, 87, 82, + 69, 78, 67, 72, 128, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, 80, 69, + 196, 87, 82, 65, 80, 128, 87, 79, 88, 128, 87, 79, 82, 75, 69, 82, 128, + 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, 68, 83, 80, 65, 67, 69, + 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, 79, 78, 128, 87, 79, 79, + 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, 197, 87, 79, 79, 68, 128, + 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 69, 78, 211, 87, 79, 77, 69, + 206, 87, 79, 77, 65, 78, 211, 87, 79, 77, 65, 78, 128, 87, 79, 77, 65, + 206, 87, 79, 76, 79, 83, 79, 128, 87, 79, 76, 198, 87, 79, 69, 128, 87, + 79, 65, 128, 87, 73, 84, 72, 79, 85, 212, 87, 73, 78, 84, 69, 82, 128, + 87, 73, 78, 75, 73, 78, 199, 87, 73, 78, 74, 65, 128, 87, 73, 78, 71, 83, + 128, 87, 73, 78, 69, 128, 87, 73, 78, 197, 87, 73, 78, 68, 85, 128, 87, + 73, 78, 68, 128, 87, 73, 78, 196, 87, 73, 78, 128, 87, 73, 71, 78, 89, + 65, 78, 128, 87, 73, 71, 71, 76, 217, 87, 73, 68, 69, 45, 72, 69, 65, 68, + 69, 196, 87, 73, 68, 197, 87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, + 73, 65, 78, 71, 128, 87, 72, 79, 76, 197, 87, 72, 73, 84, 69, 45, 70, 69, + 65, 84, 72, 69, 82, 69, 196, 87, 72, 73, 84, 69, 128, 87, 72, 69, 69, 76, + 69, 196, 87, 72, 69, 69, 76, 67, 72, 65, 73, 210, 87, 72, 69, 69, 76, + 128, 87, 72, 69, 69, 204, 87, 72, 69, 65, 84, 128, 87, 72, 65, 76, 69, + 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 85, 88, 128, 87, 69, 83, 84, + 69, 82, 206, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, + 69, 79, 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, + 212, 87, 69, 69, 78, 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, + 196, 87, 69, 68, 68, 73, 78, 71, 128, 87, 69, 65, 82, 217, 87, 69, 65, + 80, 79, 78, 128, 87, 67, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, + 87, 65, 88, 73, 78, 199, 87, 65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, + 45, 82, 69, 83, 72, 128, 87, 65, 87, 128, 87, 65, 215, 87, 65, 86, 217, + 87, 65, 86, 73, 78, 199, 87, 65, 86, 69, 83, 128, 87, 65, 86, 69, 128, + 87, 65, 86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, + 69, 82, 77, 69, 76, 79, 78, 128, 87, 65, 84, 69, 82, 128, 87, 65, 84, 69, + 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, 65, 83, 84, 73, 78, + 71, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, 65, 83, 76, 65, + 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, 128, 87, 65, + 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87, 65, 80, 128, + 87, 65, 78, 73, 78, 199, 87, 65, 78, 71, 75, 85, 79, 81, 128, 87, 65, 78, + 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, 65, 76, 76, 128, 87, 65, + 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, 73, 78, 71, 128, 87, 65, + 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, 87, 65, 65, 86, 85, 128, + 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, 87, 48, 50, 52, 128, 87, + 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, 50, 49, 128, 87, 48, 50, + 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, 65, 128, 87, 48, 49, 56, + 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, 128, 87, 48, 49, 54, 128, + 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, 87, 48, 49, 52, 128, 87, + 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, 49, 49, 128, 87, 48, 49, + 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, 57, 65, 128, 87, 48, 48, + 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, 128, 87, 48, 48, 54, 128, + 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, 48, 48, 51, 65, 128, 87, + 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, 48, 49, 128, 86, 90, 77, + 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, 86, 89, 82, 88, 128, 86, + 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, 87, 65, 128, 86, 85, 88, + 128, 86, 85, 85, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, 85, 82, 128, 86, 85, 80, 128, 86, 85, 76, 71, 65, 210, 86, 85, 69, 81, 128, 86, 83, 128, 86, 82, 65, 67, 72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, 69, 210, 86, 79, 87, 128, 86, 79, 85, 128, @@ -272,213 +273,216 @@ 76, 73, 78, 128, 86, 73, 78, 69, 71, 65, 82, 45, 51, 128, 86, 73, 78, 69, 71, 65, 82, 45, 50, 128, 86, 73, 78, 69, 71, 65, 82, 128, 86, 73, 78, 69, 71, 65, 210, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, 76, 65, - 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, 78, 199, 86, 73, - 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86, - 73, 69, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, 84, 69, 128, 86, - 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, - 73, 66, 82, 65, 84, 73, 79, 206, 86, 73, 128, 86, 69, 88, 128, 86, 69, - 87, 128, 86, 69, 215, 86, 69, 85, 88, 128, 86, 69, 85, 77, 128, 86, 69, - 85, 65, 69, 80, 69, 78, 128, 86, 69, 85, 65, 69, 128, 86, 69, 83, 84, 65, - 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, - 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, - 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, - 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, - 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, - 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, - 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, - 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, - 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, - 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, - 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, - 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, - 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, - 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, - 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, 83, 128, 86, 69, - 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86, 69, 72, 73, 67, - 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, 128, 86, 69, 197, - 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, 89, 65, 78, 78, 65, - 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, 86, 65, 84, 72, 89, - 128, 86, 65, 84, 128, 86, 65, 83, 84, 78, 69, 83, 211, 86, 65, 83, 73, - 83, 128, 86, 65, 82, 89, 211, 86, 65, 82, 73, 75, 65, 128, 86, 65, 82, - 73, 65, 78, 212, 86, 65, 82, 73, 65, 128, 86, 65, 82, 73, 193, 86, 65, - 82, 69, 73, 65, 201, 86, 65, 82, 69, 73, 193, 86, 65, 80, 79, 85, 82, 83, - 128, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 65, 71, 79, 77, - 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, 65, - 76, 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 48, - 52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51, - 56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54, - 128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128, - 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, - 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, - 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, - 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, - 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, - 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, - 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, - 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, - 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, - 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, - 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, - 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, - 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, - 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, - 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, - 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, - 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, - 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, - 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, - 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, - 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, - 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, - 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, - 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, 128, - 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, 83, - 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, 72, - 85, 77, 88, 128, 85, 83, 72, 69, 78, 78, 65, 128, 85, 83, 72, 50, 128, - 85, 83, 72, 128, 85, 83, 200, 85, 83, 69, 196, 85, 83, 69, 128, 85, 82, - 85, 218, 85, 82, 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, 85, 68, - 193, 85, 82, 85, 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, 78, 69, - 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, 83, 128, - 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, 85, 80, - 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, - 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, - 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71, - 72, 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, 65, - 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, 85, - 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, 78, 75, 78, 79, 87, - 78, 128, 85, 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, - 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, - 73, 79, 206, 85, 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, - 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, - 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, - 69, 210, 85, 78, 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, - 128, 85, 78, 65, 80, 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, - 128, 85, 206, 85, 77, 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, - 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, - 128, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, - 82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, - 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, 84, 73, 195, - 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, 85, 71, 128, - 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, 68, 65, 65, 84, - 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, 73, 76, 73, 128, - 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, 65, 128, 85, 66, - 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, - 48, 52, 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, - 56, 128, 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, - 85, 48, 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, - 48, 51, 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, - 57, 65, 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, - 128, 85, 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, - 48, 50, 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, - 50, 49, 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, - 128, 85, 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, - 48, 49, 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, - 49, 128, 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, - 85, 48, 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, - 85, 48, 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, - 48, 51, 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 73, 45, - 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 84, 90, 85, 128, 84, 90, 79, - 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, 128, 84, 90, 69, - 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, 65, 128, 84, 90, - 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, 69, 45, 182, 84, - 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, 80, 69, 45, 179, - 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, 89, 80, 197, 84, - 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, 65, 128, 84, 87, - 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, 45, 84, 72, 73, 82, - 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65, - 68, 69, 196, 84, 87, 73, 83, 84, 69, 196, 84, 87, 73, 73, 128, 84, 87, - 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, 84, 87, 69, 78, 84, - 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, 89, 45, 83, 73, 88, - 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, 128, 84, 87, 69, 78, - 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 78, 73, 78, 69, - 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, 84, 87, 69, 78, 84, - 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, - 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, 84, 128, 84, 87, 69, - 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, 69, 76, 86, 69, 45, 84, - 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, 69, 128, 84, 87, 69, 76, 86, - 197, 84, 87, 69, 128, 84, 87, 65, 65, 128, 84, 87, 65, 128, 84, 86, 82, - 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, 210, 84, 85, 88, 128, 84, - 85, 85, 77, 85, 128, 84, 85, 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, - 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, - 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, - 84, 73, 76, 69, 128, 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, - 82, 66, 65, 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, - 128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, - 78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 65, 69, - 128, 84, 85, 77, 128, 84, 85, 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, - 84, 73, 83, 128, 84, 85, 75, 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, - 50, 128, 84, 85, 71, 178, 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, - 128, 84, 85, 65, 69, 128, 84, 213, 84, 84, 85, 68, 68, 65, 71, 128, 84, - 84, 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, - 128, 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, - 84, 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, - 83, 65, 128, 84, 84, 73, 128, 84, 84, 72, 87, 69, 128, 84, 84, 72, 85, - 128, 84, 84, 72, 79, 79, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 128, - 84, 84, 72, 69, 69, 128, 84, 84, 72, 69, 128, 84, 84, 72, 65, 65, 128, - 84, 84, 72, 128, 84, 84, 69, 72, 69, 72, 128, 84, 84, 69, 72, 69, 200, - 84, 84, 69, 72, 128, 84, 84, 69, 200, 84, 84, 69, 69, 128, 84, 84, 65, - 89, 65, 78, 78, 65, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, - 87, 69, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, 83, 69, 128, - 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79, - 79, 203, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, - 69, 199, 84, 83, 72, 69, 128, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69, - 128, 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 65, 68, - 73, 89, 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 82, 89, 66, 76, 73, - 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, - 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, 82, 85, 69, - 128, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, 73, 67, 65, 204, 84, 82, - 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, 65, 71, 77, - 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, 84, 79, 78, - 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, - 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, - 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, 128, 84, 82, - 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, - 201, 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, 77, 80, 72, - 128, 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, 73, 79, 78, - 128, 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, 77, 69, - 128, 84, 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, 84, 82, - 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 73, 83, 65, 80, 128, - 84, 82, 73, 71, 82, 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, 205, 84, - 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, 65, 83, - 128, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, 78, 84, - 128, 84, 82, 73, 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, 128, - 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, 69, - 45, 82, 79, 85, 78, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, 65, - 68, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, 71, - 76, 197, 84, 82, 73, 65, 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, 76, - 76, 79, 128, 84, 82, 69, 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, 69, - 77, 79, 76, 79, 45, 51, 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, - 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, + 71, 69, 128, 86, 73, 73, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 73, + 78, 199, 86, 73, 69, 87, 68, 65, 84, 193, 86, 73, 69, 84, 128, 86, 73, + 69, 80, 128, 86, 73, 69, 128, 86, 73, 68, 69, 79, 67, 65, 83, 83, 69, 84, + 84, 69, 128, 86, 73, 68, 69, 207, 86, 73, 68, 65, 128, 86, 73, 67, 84, + 79, 82, 217, 86, 73, 66, 82, 65, 84, 73, 79, 206, 86, 73, 128, 86, 69, + 88, 128, 86, 69, 87, 128, 86, 69, 215, 86, 69, 85, 88, 128, 86, 69, 85, + 77, 128, 86, 69, 85, 65, 69, 80, 69, 78, 128, 86, 69, 85, 65, 69, 128, + 86, 69, 83, 84, 65, 128, 86, 69, 83, 83, 69, 204, 86, 69, 82, 217, 86, + 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, 86, 69, 82, 84, 73, 67, 65, 76, + 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 54, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 53, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 54, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 54, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 54, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, + 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 48, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 54, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 53, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 53, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 53, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, + 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 49, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 48, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 52, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 52, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 52, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, + 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 50, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 49, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 52, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 51, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 51, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, + 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 51, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 50, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 51, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 51, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 50, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, + 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 52, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 51, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 50, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 50, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 50, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, + 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 53, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 52, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 49, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 49, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 49, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, + 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 54, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 53, 128, 86, 69, 82, 84, + 73, 67, 65, 76, 45, 48, 48, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, + 76, 45, 48, 48, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, + 48, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, + 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 48, 128, 86, + 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, 82, 83, 73, 67, 76, 69, 128, 86, + 69, 82, 83, 197, 86, 69, 82, 71, 69, 128, 86, 69, 82, 68, 73, 71, 82, 73, + 83, 128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 73, 76, 128, 86, + 69, 72, 73, 67, 76, 69, 128, 86, 69, 72, 128, 86, 69, 200, 86, 69, 69, + 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, 210, 86, 65, + 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, 86, 65, 214, + 86, 65, 85, 128, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, 65, 83, + 84, 78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, 211, 86, + 65, 82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, + 128, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, + 73, 193, 86, 65, 80, 79, 85, 82, 83, 128, 86, 65, 80, 128, 86, 65, 78, + 69, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 65, 128, 86, 65, 77, 65, + 71, 79, 77, 85, 75, 72, 193, 86, 65, 76, 76, 69, 89, 128, 86, 65, 73, + 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, 48, 52, 48, 65, 128, + 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, 51, 56, 128, 86, 48, + 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, 54, 128, 86, 48, 51, + 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, 128, 86, 48, 51, 51, + 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, 128, + 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, 128, + 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, 86, + 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, 50, + 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, 50, + 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, 75, + 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, 48, + 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, 50, + 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, 48, + 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, 48, + 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, 54, + 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, 86, + 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, 86, + 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, 128, + 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, 48, + 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, 48, + 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, 52, + 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, 128, + 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, 71, + 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, 49, + 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, 48, + 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 51, 128, 85, + 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, 85, 89, 65, 78, + 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, 128, 85, 85, 85, 50, + 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, 83, 83, 85, 51, 128, + 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, 72, 85, 77, 88, 128, + 85, 83, 72, 69, 78, 78, 65, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, + 85, 83, 200, 85, 83, 69, 196, 85, 83, 69, 128, 85, 82, 85, 218, 85, 82, + 85, 83, 128, 85, 82, 85, 68, 65, 128, 85, 82, 85, 68, 193, 85, 82, 85, + 128, 85, 82, 213, 85, 82, 78, 128, 85, 82, 73, 78, 69, 128, 85, 82, 73, + 51, 128, 85, 82, 73, 128, 85, 82, 65, 78, 85, 83, 128, 85, 82, 65, 128, + 85, 82, 52, 128, 85, 82, 50, 128, 85, 82, 178, 85, 80, 87, 65, 82, 68, + 83, 128, 85, 80, 87, 65, 82, 68, 211, 85, 80, 87, 65, 82, 68, 128, 85, + 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, 78, 128, 85, 80, 83, 73, 76, 79, + 78, 128, 85, 80, 83, 73, 76, 79, 206, 85, 80, 82, 73, 71, 72, 212, 85, + 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, 65, 78, 73, 89, 65, 128, 85, 80, + 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, 79, 78, 128, 85, 78, 78, 128, + 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, 78, 75, 78, 79, 87, 78, 128, 85, + 78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, + 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, 206, 85, + 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, 69, 82, 84, 73, 69, + 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, 69, 82, 68, 79, 84, + 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, 69, 210, 85, 78, + 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, + 80, 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, + 77, 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, + 85, 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 128, 85, 75, 85, + 128, 85, 75, 82, 65, 73, 78, 73, 65, 206, 85, 75, 65, 82, 65, 128, 85, + 75, 65, 82, 193, 85, 75, 128, 85, 73, 76, 76, 69, 65, 78, 78, 128, 85, + 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, 84, 73, 195, 85, 69, 89, 128, + 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, 85, 71, 128, 85, 68, 65, 84, + 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, 68, 65, 65, 84, 128, 85, 68, + 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, 73, 76, 73, 128, 85, 66, 72, + 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, 65, 128, 85, 66, 128, 85, + 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, 52, 50, 128, 85, 48, 52, + 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, 128, 85, 48, 51, 56, 128, + 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, 48, 51, 53, 128, 85, 48, + 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, 50, 65, 128, 85, 48, 51, + 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, 128, 85, 48, 50, 57, 65, + 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, 85, 48, 50, 55, 128, 85, + 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, 50, 52, 128, 85, 48, 50, + 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, 50, 128, 85, 48, 50, 49, + 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, 85, 48, 49, 56, 128, 85, + 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, 49, 53, 128, 85, 48, 49, + 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, 128, 85, 48, 49, 49, 128, + 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, 48, 48, 56, 128, 85, 48, + 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, 48, 54, 65, 128, 85, 48, + 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, 52, 128, 85, 48, 48, 51, + 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, 85, 45, 73, 45, 73, 128, + 85, 45, 69, 79, 45, 69, 85, 128, 85, 45, 66, 82, 74, 71, 85, 128, 84, 90, + 85, 128, 84, 90, 79, 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, + 73, 128, 84, 90, 69, 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, + 90, 65, 128, 84, 90, 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, + 80, 69, 45, 182, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, + 89, 80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, + 84, 89, 80, 197, 84, 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, + 89, 65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, + 79, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 79, 45, 76, 73, 78, 197, 84, + 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 73, 83, 84, 69, 196, 84, 87, + 73, 73, 128, 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, + 128, 84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, + 84, 89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, + 78, 128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, + 128, 84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, + 89, 45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, + 72, 84, 128, 84, 87, 69, 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, + 87, 69, 76, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, 87, 69, 76, 86, + 69, 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 128, 84, 87, 65, 65, 128, + 84, 87, 65, 128, 84, 86, 82, 73, 68, 79, 128, 84, 86, 73, 77, 65, 68, 85, + 210, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, 85, 128, 84, 85, + 84, 84, 89, 128, 84, 85, 84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, + 128, 84, 85, 82, 88, 128, 84, 85, 82, 85, 128, 84, 85, 82, 84, 76, 69, + 128, 84, 85, 82, 79, 50, 128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, + 84, 85, 82, 78, 69, 196, 84, 85, 82, 206, 84, 85, 82, 66, 65, 78, 128, + 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, 128, 84, 85, 79, 84, + 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, 78, 78, 89, 128, 84, + 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 65, 69, 128, 84, 85, 77, 128, + 84, 85, 76, 73, 80, 128, 84, 85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, + 75, 128, 84, 85, 71, 82, 73, 203, 84, 85, 71, 50, 128, 84, 85, 71, 178, + 84, 85, 65, 82, 69, 199, 84, 85, 65, 69, 80, 128, 84, 85, 65, 69, 128, + 84, 213, 84, 84, 85, 85, 128, 84, 84, 85, 68, 68, 65, 71, 128, 84, 84, + 85, 68, 68, 65, 65, 71, 128, 84, 84, 85, 128, 84, 84, 84, 72, 65, 128, + 84, 84, 84, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, 128, 84, 84, + 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, 84, 84, 83, + 65, 128, 84, 84, 79, 79, 128, 84, 84, 73, 73, 128, 84, 84, 73, 128, 84, + 84, 72, 87, 69, 128, 84, 84, 72, 85, 128, 84, 84, 72, 79, 79, 128, 84, + 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, 69, 69, 128, 84, 84, + 72, 69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, + 69, 72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, + 200, 84, 84, 69, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, 128, 84, 84, + 65, 85, 128, 84, 84, 65, 73, 128, 84, 84, 65, 65, 128, 84, 84, 50, 128, + 84, 83, 87, 69, 128, 84, 83, 87, 65, 128, 84, 83, 86, 128, 84, 83, 83, + 69, 128, 84, 83, 72, 85, 71, 83, 128, 84, 83, 72, 79, 79, 75, 128, 84, + 83, 72, 79, 79, 203, 84, 83, 72, 69, 83, 128, 84, 83, 72, 69, 71, 128, + 84, 83, 72, 69, 199, 84, 83, 72, 69, 128, 84, 83, 72, 65, 128, 84, 83, + 69, 82, 69, 128, 84, 83, 65, 68, 73, 128, 84, 83, 65, 68, 201, 84, 83, + 65, 65, 68, 73, 89, 128, 84, 83, 65, 65, 128, 84, 83, 193, 84, 82, 89, + 66, 76, 73, 79, 206, 84, 82, 85, 84, 72, 128, 84, 82, 85, 78, 75, 128, + 84, 82, 85, 78, 67, 65, 84, 69, 196, 84, 82, 85, 77, 80, 69, 84, 128, 84, + 82, 85, 69, 128, 84, 82, 85, 67, 75, 128, 84, 82, 79, 80, 73, 67, 65, + 204, 84, 82, 79, 80, 72, 89, 128, 84, 82, 79, 77, 73, 75, 79, 83, 89, 78, + 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, 83, 73, 70, 73, 83, + 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, 82, 65, 75, 65, 76, + 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, 128, 84, 82, 79, 77, + 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, 71, 73, 83, 77, 65, + 128, 84, 82, 79, 76, 76, 69, 89, 66, 85, 83, 128, 84, 82, 79, 75, 85, 84, + 65, 83, 84, 201, 84, 82, 79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 85, + 77, 80, 72, 128, 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, 73, 77, 79, 82, + 73, 79, 78, 128, 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, 82, 73, 83, 69, + 77, 69, 128, 84, 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, 76, 73, 128, + 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, 73, 83, 65, 80, + 128, 84, 82, 73, 71, 82, 65, 77, 77, 79, 211, 84, 82, 73, 71, 82, 65, + 205, 84, 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 82, 73, 70, 79, 78, 73, + 65, 83, 128, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, 73, 68, 69, + 78, 84, 128, 84, 82, 73, 68, 69, 78, 212, 84, 82, 73, 67, 79, 76, 79, 78, + 128, 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 84, 82, 73, 65, 78, 71, 76, + 69, 45, 82, 79, 85, 78, 196, 84, 82, 73, 65, 78, 71, 76, 69, 45, 72, 69, + 65, 68, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, 128, 84, 82, 73, 65, 78, + 71, 76, 197, 84, 82, 73, 65, 128, 84, 82, 73, 128, 84, 82, 69, 83, 73, + 76, 76, 79, 128, 84, 82, 69, 78, 68, 128, 84, 82, 69, 78, 196, 84, 82, + 69, 77, 79, 76, 79, 45, 51, 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, + 84, 82, 69, 77, 79, 76, 79, 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, 68, 73, 78, 71, 128, 84, 82, 65, 89, 128, 84, 82, 65, 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, 78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, 73, 79, 206, 84, 82, 65, 78, @@ -493,57 +497,56 @@ 79, 82, 67, 85, 76, 85, 211, 84, 79, 82, 67, 72, 128, 84, 79, 81, 128, 84, 79, 80, 66, 65, 82, 128, 84, 79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, 128, 84, 79, 208, 84, 79, 79, 84, 72, 128, 84, 79, 79, 78, - 128, 84, 79, 79, 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, - 128, 84, 79, 78, 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, - 54, 128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, - 79, 78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, - 49, 128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, - 128, 84, 79, 77, 65, 84, 79, 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, - 75, 89, 207, 84, 79, 73, 76, 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, - 128, 84, 79, 68, 207, 84, 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, - 84, 79, 65, 128, 84, 78, 128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76, - 79, 128, 84, 76, 73, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, - 84, 76, 72, 79, 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, - 76, 72, 69, 69, 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, - 69, 69, 128, 84, 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, - 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, - 73, 84, 76, 79, 128, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, - 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, - 73, 82, 69, 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, - 84, 73, 80, 69, 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, - 89, 128, 84, 73, 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, - 85, 82, 69, 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, - 128, 84, 73, 77, 69, 210, 84, 73, 77, 69, 128, 84, 73, 76, 68, 69, 128, - 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, - 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, - 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, - 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, - 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, - 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, - 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, - 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, - 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, 73, 128, 84, 73, 71, 72, - 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, 73, 71, - 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, 200, 84, - 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, 75, 69, - 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, 82, 65, 128, - 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, 128, 84, - 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, 84, 72, - 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, 84, 72, - 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, 128, - 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, 68, - 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, 84, - 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, - 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, 84, - 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, - 73, 78, 197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, - 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128, - 84, 72, 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, 72, 79, - 85, 128, 84, 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, 79, 78, - 71, 128, 84, 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, 72, 128, - 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, 79, 78, - 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, 84, - 217, 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, + 128, 84, 79, 78, 79, 83, 128, 84, 79, 78, 71, 85, 69, 128, 84, 79, 78, + 71, 85, 197, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 54, 128, 84, 79, + 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, 78, 69, 45, 51, + 128, 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, 128, 84, 79, + 78, 69, 128, 84, 79, 78, 65, 204, 84, 79, 77, 80, 73, 128, 84, 79, 77, + 65, 84, 79, 128, 84, 79, 76, 79, 78, 71, 128, 84, 79, 75, 89, 207, 84, + 79, 73, 76, 69, 84, 128, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, + 207, 84, 79, 65, 78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, + 84, 78, 128, 84, 76, 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, + 73, 128, 84, 76, 72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, 79, + 79, 128, 84, 76, 72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, + 128, 84, 76, 72, 69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, + 76, 65, 128, 84, 74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 78, 128, 84, + 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, 73, 84, 76, 79, + 128, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, 84, + 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, 73, 82, 69, 196, + 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, + 72, 65, 128, 84, 73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, + 78, 217, 84, 73, 78, 78, 69, 128, 84, 73, 78, 67, 84, 85, 82, 69, 128, + 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, 128, 84, 73, 77, 69, + 210, 84, 73, 77, 69, 128, 84, 73, 76, 68, 197, 84, 73, 76, 128, 84, 73, + 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, 85, 84, 72, 128, 84, 73, + 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 84, + 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, 73, 75, 69, 85, 84, 45, + 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, + 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, 77, 128, 84, 73, 75, 69, + 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 67, + 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, 67, 72, 73, 69, 85, 67, + 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, 69, 85, 212, 84, 73, + 71, 72, 84, 76, 89, 45, 67, 76, 79, 83, 69, 196, 84, 73, 71, 72, 212, 84, + 73, 71, 69, 82, 128, 84, 73, 71, 69, 210, 84, 73, 70, 73, 78, 65, 71, + 200, 84, 73, 69, 88, 128, 84, 73, 69, 80, 128, 84, 73, 197, 84, 73, 67, + 75, 69, 84, 128, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, 82, + 65, 128, 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, 79, + 128, 84, 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, 128, + 84, 72, 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, 128, + 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, 78, 71, + 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, 85, 78, + 68, 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 77, 66, 211, + 84, 72, 82, 79, 87, 73, 78, 199, 84, 72, 82, 79, 85, 71, 72, 128, 84, 72, + 82, 79, 85, 71, 200, 84, 72, 82, 69, 69, 45, 84, 72, 73, 82, 84, 89, 128, + 84, 72, 82, 69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, + 76, 73, 78, 197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, + 128, 84, 72, 79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, + 128, 84, 72, 79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 71, 72, 212, 84, + 72, 79, 85, 128, 84, 72, 79, 82, 78, 128, 84, 72, 79, 82, 206, 84, 72, + 79, 78, 71, 128, 84, 72, 79, 65, 128, 84, 72, 207, 84, 72, 73, 85, 84, + 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, 73, 82, 84, 89, 45, 83, 69, 67, + 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, 79, 78, 69, 128, 84, 72, 73, 82, + 84, 217, 84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, 72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, 128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128, 84, 72, 73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, @@ -587,83 +590,83 @@ 84, 65, 88, 73, 128, 84, 65, 88, 128, 84, 65, 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, 128, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, 84, 65, 85, 82, 85, 83, 128, 84, - 65, 85, 128, 84, 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, - 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84, - 65, 82, 85, 78, 71, 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, - 84, 65, 82, 128, 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80, - 197, 84, 65, 80, 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65, - 78, 71, 69, 82, 73, 78, 69, 128, 84, 65, 78, 199, 84, 65, 78, 65, 66, 65, - 84, 193, 84, 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 128, - 84, 65, 76, 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, - 65, 76, 73, 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, - 212, 84, 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 128, 84, - 65, 75, 52, 128, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, - 65, 73, 76, 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, - 65, 72, 128, 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, 193, 84, 65, 71, - 65, 76, 79, 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, 65, 67, 75, 128, - 84, 65, 67, 203, 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, - 83, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, 65, 194, 84, 65, - 65, 83, 72, 65, 69, 128, 84, 65, 65, 81, 128, 84, 65, 65, 77, 128, 84, - 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, 70, 128, 84, - 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, 128, 84, 48, - 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, - 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, - 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, - 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, - 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, - 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, - 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, - 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, - 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, - 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, - 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, - 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, - 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, - 84, 45, 83, 72, 73, 82, 84, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, - 83, 90, 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, - 83, 90, 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, - 128, 83, 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, - 83, 89, 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, - 82, 73, 78, 71, 69, 128, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, - 85, 87, 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, - 77, 79, 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, - 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 77, 77, 69, 84, 82, 89, - 128, 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, 89, 77, 66, 79, 76, 83, - 128, 83, 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, - 128, 83, 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, - 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, - 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, - 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, - 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, - 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, - 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, - 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, - 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, - 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, - 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, - 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, - 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, - 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, - 66, 79, 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 128, 83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87, - 90, 128, 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, - 82, 68, 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, - 83, 87, 73, 77, 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83, - 87, 73, 73, 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, - 128, 83, 87, 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212, - 83, 87, 65, 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, - 128, 83, 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, - 128, 83, 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, - 85, 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, + 65, 213, 84, 65, 84, 87, 69, 69, 76, 128, 84, 65, 84, 87, 69, 69, 204, + 84, 65, 84, 84, 79, 79, 69, 196, 84, 65, 84, 128, 84, 65, 82, 85, 78, 71, + 128, 84, 65, 82, 84, 65, 82, 45, 50, 128, 84, 65, 82, 84, 65, 82, 128, + 84, 65, 81, 128, 84, 65, 80, 69, 82, 128, 84, 65, 80, 197, 84, 65, 80, + 128, 84, 65, 79, 128, 84, 65, 78, 78, 69, 196, 84, 65, 78, 71, 69, 82, + 73, 78, 69, 128, 84, 65, 78, 199, 84, 65, 78, 65, 66, 65, 84, 193, 84, + 65, 78, 128, 84, 65, 77, 73, 78, 71, 128, 84, 65, 77, 128, 84, 65, 76, + 76, 128, 84, 65, 76, 204, 84, 65, 76, 73, 78, 71, 128, 84, 65, 76, 73, + 78, 199, 84, 65, 76, 69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, 84, + 65, 75, 72, 65, 76, 76, 85, 83, 128, 84, 65, 75, 69, 128, 84, 65, 75, 52, + 128, 84, 65, 75, 128, 84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, + 76, 69, 83, 211, 84, 65, 73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 128, + 84, 65, 200, 84, 65, 71, 66, 65, 78, 87, 193, 84, 65, 71, 65, 76, 79, + 199, 84, 65, 71, 128, 84, 65, 69, 206, 84, 65, 67, 75, 128, 84, 65, 67, + 203, 84, 65, 66, 85, 76, 65, 84, 73, 79, 78, 128, 84, 65, 66, 83, 128, + 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, 65, 194, 84, 65, 65, 83, + 72, 65, 69, 128, 84, 65, 65, 81, 128, 84, 65, 65, 77, 128, 84, 65, 65, + 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, 70, 128, 84, 65, 50, + 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, 128, 84, 48, 51, 53, + 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, 84, 48, 51, 51, 128, + 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, 48, 51, 49, 128, 84, + 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, 56, 128, 84, 48, 50, + 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, 84, 48, 50, 52, 128, + 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, 50, 49, 128, 84, 48, + 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, 128, 84, 48, 49, 55, + 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, 84, 48, 49, 53, 128, + 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, 49, 50, 128, 84, 48, + 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, 48, 128, 84, 48, 48, + 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, 65, 128, 84, 48, 48, + 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, 128, 84, 48, 48, 54, + 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, 48, 48, 51, 65, 128, + 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, 48, 49, 128, 84, 45, + 83, 72, 73, 82, 84, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, 83, 90, + 87, 65, 128, 83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, 83, 90, + 69, 69, 128, 83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, 128, 83, + 90, 128, 83, 89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, 83, 89, + 82, 77, 65, 84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, 82, 73, + 78, 71, 69, 128, 83, 89, 82, 128, 83, 89, 80, 128, 83, 89, 79, 85, 87, + 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, 83, 89, 78, 68, 69, 83, 77, 79, + 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, 85, 211, 83, 89, 78, 65, 71, 77, + 193, 83, 89, 78, 65, 70, 73, 128, 83, 89, 77, 77, 69, 84, 82, 89, 128, + 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, 89, 77, 66, 79, 76, 83, 128, 83, + 89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, + 89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, + 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, + 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, + 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, + 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, + 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, + 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, + 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, + 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, + 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, + 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, + 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, + 76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, + 66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, + 89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, 49, 128, + 83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87, 90, 128, + 83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, + 128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 82, 204, 83, 87, + 73, 77, 77, 73, 78, 71, 128, 83, 87, 73, 77, 77, 69, 82, 128, 83, 87, 73, + 73, 128, 83, 87, 73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, + 87, 69, 69, 212, 83, 87, 69, 65, 84, 128, 83, 87, 69, 65, 212, 83, 87, + 65, 83, 200, 83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, 128, + 83, 87, 128, 83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, + 83, 86, 65, 82, 73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, + 84, 128, 83, 85, 83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 83, 72, 73, 128, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, 85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 69, 82, 128, 83, 85, 82, 70, 65, 67, 197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, @@ -731,162 +734,164 @@ 128, 83, 84, 65, 67, 67, 65, 84, 73, 83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, 89, 88, 128, 83, 83, 89, 84, 128, 83, 83, 89, 82, 88, 128, 83, 83, 89, 82, 128, 83, 83, 89, 80, 128, 83, 83, 89, 128, 83, 83, 85, - 88, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, 83, 83, 79, 88, 128, - 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, 79, 128, 83, 83, 73, - 88, 128, 83, 83, 73, 84, 128, 83, 83, 73, 80, 128, 83, 83, 73, 69, 88, - 128, 83, 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 73, 128, 83, - 83, 72, 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, - 69, 128, 83, 83, 65, 88, 128, 83, 83, 65, 84, 128, 83, 83, 65, 80, 128, - 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 83, - 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, 80, 128, 83, - 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 84, 72, - 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 84, 73, - 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 80, 73, 69, - 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, - 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, 78, 71, 82, - 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, 65, 78, 71, - 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 83, - 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, 77, 73, 69, - 85, 77, 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, - 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, 73, 69, 85, 72, - 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, 69, 85, 72, 128, - 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, 78, 71, 65, 82, - 65, 69, 65, 128, 83, 83, 65, 65, 128, 83, 83, 65, 128, 83, 82, 128, 83, - 81, 85, 73, 83, 200, 83, 81, 85, 73, 82, 82, 69, 204, 83, 81, 85, 73, 71, - 71, 76, 197, 83, 81, 85, 65, 212, 83, 81, 85, 65, 82, 69, 83, 128, 83, - 81, 85, 65, 82, 69, 68, 128, 83, 81, 85, 65, 82, 69, 128, 83, 80, 87, 65, - 128, 83, 80, 85, 78, 71, 211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, - 73, 78, 71, 83, 128, 83, 80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, - 71, 69, 83, 65, 78, 199, 83, 80, 79, 85, 84, 73, 78, 199, 83, 80, 79, 84, - 128, 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, 78, 199, 83, - 80, 76, 65, 83, 72, 73, 78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, - 73, 82, 73, 84, 128, 83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, - 128, 83, 80, 73, 82, 65, 76, 128, 83, 80, 73, 82, 65, 204, 83, 80, 73, - 68, 69, 82, 217, 83, 80, 73, 67, 69, 128, 83, 80, 72, 69, 82, 73, 67, 65, - 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, - 128, 83, 80, 69, 69, 67, 72, 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, - 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, - 128, 83, 80, 69, 65, 75, 69, 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, - 86, 73, 204, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, - 199, 83, 80, 65, 82, 75, 76, 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, - 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, - 128, 83, 80, 65, 68, 69, 83, 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, - 73, 78, 199, 83, 80, 65, 67, 197, 83, 80, 128, 83, 79, 89, 128, 83, 79, - 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, - 79, 85, 84, 72, 45, 83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, - 85, 82, 67, 69, 128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, - 79, 85, 78, 65, 80, 128, 83, 79, 85, 128, 83, 79, 83, 128, 83, 79, 81, - 128, 83, 79, 79, 206, 83, 79, 79, 128, 83, 79, 78, 74, 65, 77, 128, 83, - 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, 128, 83, 79, 76, 73, 68, - 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, 79, 71, 68, 73, 65, 206, - 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, 67, 84, 73, 79, 206, 83, - 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, 212, 83, 79, 198, 83, 79, - 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 80, 128, - 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, 65, 78, 128, 83, 78, 79, - 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, 69, 128, 83, 78, 79, 87, - 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, 128, 83, 78, 79, 85, 84, - 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, - 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83, 78, 193, 83, 77, 79, 75, - 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, 83, 77, 73, 76, 73, 78, - 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83, - 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85, - 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, 215, 83, 76, 79, 86, - 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, 199, 83, 76, 79, 80, - 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68, 73, 78, 71, 128, 83, - 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, 69, 69, 80, 217, 83, - 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78, 73, 195, 83, 76, 65, - 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, 83, 200, 83, 76, 65, - 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, 128, 83, 75, 85, 76, - 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, - 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, 75, 69, 87, 69, 196, - 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84, - 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, - 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, - 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, - 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88, - 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 84, 72, - 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, 73, 78, 199, 83, 73, 88, - 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, 78, 197, 83, 73, - 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, 73, 82, 73, 78, 71, - 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, - 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, - 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, - 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, - 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, - 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, - 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, - 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45, - 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, - 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73, - 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, 73, 78, 71, 128, - 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, - 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, - 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, - 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, - 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, 78, 71, 85, - 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, 73, 76, 75, - 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, 84, 84, 69, - 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, 51, 128, - 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 73, - 128, 83, 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, - 193, 83, 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, - 71, 128, 83, 73, 69, 69, 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, - 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66, - 197, 83, 201, 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82, - 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, 72, 89, 69, 128, - 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, 89, 128, 83, 72, - 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72, - 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, 87, 65, 65, 128, 83, 72, 87, - 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, 84, 128, 83, 72, 85, 82, 88, - 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, 88, 128, - 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, 128, 83, - 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, 69, 78, 83, - 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, 50, 128, - 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, 80, 73, - 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, 72, 82, - 73, 77, 80, 128, 83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, - 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, 69, 82, 69, 196, 83, 72, 79, 84, - 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, 82, 84, 211, 83, 72, 79, - 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, 67, 65, 75, 69, 128, 83, - 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, - 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, - 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, - 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, - 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, - 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, - 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, - 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, 83, 72, 79, 80, 128, 83, 72, - 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, - 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, 79, 69, 128, 83, 72, 79, - 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, 72, 73, 89, 89, 65, 65, - 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, 73, 84, 193, 83, 72, - 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, 73, 82, 128, 83, 72, - 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, 83, 72, 73, 78, 84, - 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, 193, 83, 72, 73, - 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, 77, 193, - 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, 83, 72, - 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, 83, 72, - 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, 72, 72, 193, 83, - 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, 128, 83, - 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, 85, 128, 83, 72, - 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, 83, 72, 69, 84, - 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, 69, - 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, 50, - 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, 80, - 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, - 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, - 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, - 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, 71, 79, - 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, 89, 128, - 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, 83, 72, 65, - 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, 83, 72, 65, 84, 128, 83, 72, - 65, 82, 85, 128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, - 65, 82, 208, 83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72, - 65, 82, 178, 83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, - 128, 83, 72, 65, 80, 197, 83, 72, 65, 80, 128, 83, 72, 65, 78, 71, 128, - 83, 72, 65, 78, 128, 83, 72, 65, 206, 83, 72, 65, 77, 82, 79, 67, 75, - 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, 84, 128, 83, 72, 65, 75, 84, 73, + 88, 128, 83, 83, 85, 85, 128, 83, 83, 85, 84, 128, 83, 83, 85, 80, 128, + 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, 80, 128, 83, 83, + 79, 79, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, + 83, 83, 73, 80, 128, 83, 83, 73, 73, 128, 83, 83, 73, 69, 88, 128, 83, + 83, 73, 69, 80, 128, 83, 83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 72, + 69, 128, 83, 83, 69, 88, 128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, + 83, 83, 65, 88, 128, 83, 83, 65, 85, 128, 83, 83, 65, 84, 128, 83, 83, + 65, 80, 128, 83, 83, 65, 78, 71, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, + 72, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 45, 80, 73, 69, 85, + 80, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, + 71, 84, 72, 73, 69, 85, 84, 72, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, + 45, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, + 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 45, 75, 73, + 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 83, 65, + 78, 71, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 83, + 65, 78, 71, 82, 73, 69, 85, 76, 128, 83, 83, 65, 78, 71, 80, 73, 69, 85, + 80, 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 83, 83, 65, 78, 71, + 77, 73, 69, 85, 77, 128, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, + 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, 83, 65, 78, 71, 72, 73, + 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 45, 72, 73, 69, + 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 83, 83, 65, 78, + 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 73, 128, 83, 83, 65, 65, 128, + 83, 83, 65, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, 73, + 82, 82, 69, 204, 83, 81, 85, 73, 71, 71, 76, 197, 83, 81, 85, 65, 212, + 83, 81, 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, 128, 83, 81, + 85, 65, 82, 69, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, 211, 83, + 80, 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, 80, 82, 73, + 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, 83, 80, 79, + 85, 84, 73, 78, 199, 83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, + 80, 76, 73, 84, 84, 73, 78, 199, 83, 80, 76, 65, 83, 72, 73, 78, 199, 83, + 80, 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, 128, 83, 80, 73, 82, + 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 82, 65, 76, 128, + 83, 80, 73, 82, 65, 204, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 67, 69, + 128, 83, 80, 72, 69, 82, 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76, + 207, 83, 80, 69, 69, 68, 66, 79, 65, 84, 128, 83, 80, 69, 69, 67, 72, + 128, 83, 80, 69, 69, 67, 200, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, + 69, 65, 82, 128, 83, 80, 69, 65, 75, 69, 82, 128, 83, 80, 69, 65, 75, 69, + 210, 83, 80, 69, 65, 75, 45, 78, 79, 45, 69, 86, 73, 204, 83, 80, 65, 84, + 72, 73, 128, 83, 80, 65, 82, 75, 76, 73, 78, 199, 83, 80, 65, 82, 75, 76, + 69, 83, 128, 83, 80, 65, 82, 75, 76, 69, 82, 128, 83, 80, 65, 82, 75, 76, + 69, 128, 83, 80, 65, 71, 72, 69, 84, 84, 73, 128, 83, 80, 65, 68, 69, 83, + 128, 83, 80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 65, 67, + 197, 83, 80, 128, 83, 79, 89, 128, 83, 79, 87, 73, 76, 207, 83, 79, 87, + 128, 83, 79, 85, 84, 72, 69, 82, 206, 83, 79, 85, 84, 72, 45, 83, 76, 65, + 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, 69, 128, 83, 79, + 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, 65, 80, 128, 83, + 79, 85, 128, 83, 79, 83, 128, 83, 79, 81, 128, 83, 79, 79, 206, 83, 79, + 78, 74, 65, 77, 128, 83, 79, 78, 71, 128, 83, 79, 78, 128, 83, 79, 77, + 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, 83, + 79, 71, 68, 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, 78, + 67, 84, 73, 79, 206, 83, 79, 70, 84, 78, 69, 83, 83, 128, 83, 79, 70, + 212, 83, 79, 198, 83, 79, 67, 73, 69, 84, 89, 128, 83, 79, 67, 67, 69, + 210, 83, 79, 65, 80, 128, 83, 79, 65, 128, 83, 207, 83, 78, 79, 87, 77, + 65, 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, 70, 76, 65, 75, + 69, 128, 83, 78, 79, 87, 66, 79, 65, 82, 68, 69, 82, 128, 83, 78, 79, 87, + 128, 83, 78, 79, 85, 84, 128, 83, 78, 79, 85, 212, 83, 78, 65, 208, 83, + 78, 65, 75, 69, 128, 83, 78, 65, 75, 197, 83, 78, 65, 73, 76, 128, 83, + 78, 193, 83, 77, 79, 75, 73, 78, 199, 83, 77, 73, 82, 75, 73, 78, 199, + 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, 76, 69, 128, 83, 77, 69, 65, 82, + 128, 83, 77, 65, 83, 200, 83, 77, 65, 76, 76, 69, 210, 83, 77, 65, 76, + 76, 128, 83, 76, 85, 82, 128, 83, 76, 79, 87, 76, 89, 128, 83, 76, 79, + 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, 212, 83, 76, 79, 80, 73, 78, + 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 78, 71, 128, 83, 76, 73, 68, + 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, 83, 76, 73, 67, 197, 83, 76, + 69, 69, 80, 217, 83, 76, 69, 69, 80, 73, 78, 199, 83, 76, 65, 86, 79, 78, + 73, 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, 65, + 83, 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, 87, + 128, 83, 75, 85, 76, 76, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, + 79, 206, 83, 75, 73, 78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 201, 83, + 75, 69, 87, 69, 196, 83, 75, 65, 84, 69, 128, 83, 75, 128, 83, 74, 69, + 128, 83, 73, 88, 84, 89, 45, 70, 79, 85, 82, 84, 200, 83, 73, 88, 84, 89, + 128, 83, 73, 88, 84, 217, 83, 73, 88, 84, 72, 83, 128, 83, 73, 88, 84, + 72, 211, 83, 73, 88, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, + 128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, + 84, 200, 83, 73, 88, 84, 69, 69, 78, 128, 83, 73, 88, 84, 69, 69, 206, + 83, 73, 88, 45, 84, 72, 73, 82, 84, 89, 128, 83, 73, 88, 45, 83, 84, 82, + 73, 78, 199, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, + 73, 78, 197, 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 83, 65, 128, 83, + 73, 82, 73, 78, 71, 85, 128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, + 72, 128, 83, 73, 79, 83, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, + 73, 79, 83, 45, 82, 73, 69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, + 85, 80, 45, 75, 73, 89, 69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, + 69, 85, 80, 72, 128, 83, 73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, + 83, 73, 79, 83, 45, 78, 73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, + 69, 85, 77, 128, 83, 73, 79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, + 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, + 83, 73, 79, 83, 45, 73, 69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, + 69, 85, 72, 128, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, + 83, 45, 67, 72, 73, 69, 85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, + 73, 78, 71, 128, 83, 73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, + 71, 76, 69, 128, 83, 73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, + 128, 83, 73, 78, 197, 83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, + 80, 76, 73, 70, 73, 69, 196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, + 73, 76, 65, 210, 83, 73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 76, 85, + 78, 71, 85, 206, 83, 73, 77, 65, 128, 83, 73, 76, 86, 69, 82, 128, 83, + 73, 76, 75, 128, 83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 72, 79, 85, 69, + 84, 84, 69, 128, 83, 73, 76, 72, 79, 85, 69, 84, 84, 197, 83, 73, 76, 65, + 51, 128, 83, 73, 75, 73, 128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, + 73, 71, 78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, + 73, 71, 69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, + 83, 73, 69, 69, 128, 83, 73, 68, 69, 87, 65, 89, 211, 83, 73, 67, 75, 78, + 69, 83, 83, 128, 83, 73, 67, 75, 76, 69, 128, 83, 73, 66, 197, 83, 201, + 83, 72, 89, 88, 128, 83, 72, 89, 84, 128, 83, 72, 89, 82, 88, 128, 83, + 72, 89, 82, 128, 83, 72, 89, 80, 128, 83, 72, 89, 69, 128, 83, 72, 89, + 65, 128, 83, 72, 89, 128, 83, 72, 87, 79, 89, 128, 83, 72, 87, 79, 79, + 128, 83, 72, 87, 79, 128, 83, 72, 87, 73, 73, 128, 83, 72, 87, 73, 128, + 83, 72, 87, 69, 128, 83, 72, 87, 65, 65, 128, 83, 72, 87, 65, 128, 83, + 72, 85, 88, 128, 83, 72, 85, 85, 128, 83, 72, 85, 84, 128, 83, 72, 85, + 82, 88, 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, 128, 83, 72, 85, 79, + 88, 128, 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, 128, 83, 72, 85, 77, + 128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 69, 81, 128, 83, 72, 85, + 69, 78, 83, 72, 85, 69, 84, 128, 83, 72, 85, 66, 85, 82, 128, 83, 72, 85, + 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, 65, + 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, 83, + 72, 82, 73, 77, 80, 128, 83, 72, 82, 73, 73, 128, 83, 72, 79, 89, 128, + 83, 72, 79, 88, 128, 83, 72, 79, 87, 69, 82, 128, 83, 72, 79, 85, 76, 68, + 69, 82, 69, 196, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, + 72, 79, 82, 84, 211, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, + 82, 84, 67, 65, 75, 69, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, + 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 84, 89, 210, 83, + 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, 204, 83, 72, 79, 82, 84, + 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, 82, 84, 45, 84, 87, 73, + 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 77, + 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 72, 65, 71, 65, + 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 66, 74, 65, 82, 75, + 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 65, 210, 83, 72, 79, + 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, 81, 128, 83, 72, 79, 209, + 83, 72, 79, 80, 128, 83, 72, 79, 79, 84, 73, 78, 199, 83, 72, 79, 79, 84, + 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, 201, 83, 72, 79, 199, 83, 72, + 79, 69, 128, 83, 72, 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, 128, 83, + 72, 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, 128, 83, 72, + 73, 84, 193, 83, 72, 73, 82, 212, 83, 72, 73, 82, 65, 69, 128, 83, 72, + 73, 82, 128, 83, 72, 73, 210, 83, 72, 73, 81, 128, 83, 72, 73, 80, 128, + 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, 72, 73, 78, 68, + 193, 83, 72, 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, + 72, 73, 77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, + 78, 128, 83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, + 68, 128, 83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 72, 65, 128, 83, + 72, 72, 193, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, + 85, 88, 128, 83, 72, 69, 85, 79, 81, 128, 83, 72, 69, 85, 65, 69, 81, 84, + 85, 128, 83, 72, 69, 85, 65, 69, 81, 128, 83, 72, 69, 85, 65, 69, 128, + 83, 72, 69, 84, 128, 83, 72, 69, 212, 83, 72, 69, 83, 72, 76, 65, 77, + 128, 83, 72, 69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, + 72, 69, 83, 72, 50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, + 204, 83, 72, 69, 80, 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, + 83, 72, 69, 76, 204, 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, + 72, 69, 71, 57, 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, + 128, 83, 72, 69, 69, 78, 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, + 83, 72, 69, 45, 71, 79, 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, + 128, 83, 72, 65, 89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, + 65, 78, 73, 128, 83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 86, 69, 196, + 83, 72, 65, 85, 128, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, 128, 83, + 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, 83, 72, + 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, 83, 72, + 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, 80, + 197, 83, 72, 65, 80, 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, + 83, 72, 65, 206, 83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, + 72, 69, 76, 69, 84, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 73, 128, 83, 72, 65, 68, 79, 87, 69, 196, 83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, 193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, 72, 65, 65, 128, 83, 72, 65, @@ -1156,125 +1161,127 @@ 82, 89, 65, 128, 82, 87, 79, 79, 128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, 69, 69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, 128, 82, 87, 65, 128, 82, 85, 88, 128, 82, - 85, 85, 66, 85, 82, 85, 128, 82, 85, 84, 128, 82, 85, 83, 73, 128, 82, - 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, 128, 82, 85, 80, - 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, 79, 80, 128, 82, - 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, 78, 73, 78, 199, - 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85, - 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, 69, 82, 128, 82, - 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, 76, 69, 128, 82, - 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, 82, 85, 71, 66, - 217, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82, 84, 65, - 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, 89, 84, - 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, 80, 128, - 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, 82, 82, 85, 82, 88, 128, 82, - 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, 85, 79, 88, 128, 82, 82, - 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, 88, 128, 82, 82, 79, 84, 128, - 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, 82, 69, 88, 128, 82, 82, 69, - 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, 128, 82, 82, 69, 200, 82, - 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, 128, 82, 79, 87, 66, 79, - 65, 84, 128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, - 80, 80, 69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 69, - 196, 82, 79, 83, 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 83, - 69, 128, 82, 79, 79, 84, 128, 82, 79, 79, 83, 84, 69, 82, 128, 82, 79, - 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, 77, 65, 206, - 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, 196, 82, 79, 67, 75, - 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, - 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, 128, 82, 79, 65, 128, 82, - 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, 78, 79, 79, 206, 82, - 78, 65, 205, 82, 74, 69, 211, 82, 74, 69, 128, 82, 74, 197, 82, 73, 86, - 69, 82, 128, 82, 73, 84, 85, 65, 76, 128, 82, 73, 84, 84, 79, 82, 85, - 128, 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, 199, 82, 73, 83, 72, - 128, 82, 73, 82, 65, 128, 82, 73, 80, 128, 82, 73, 78, 71, 211, 82, 73, - 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, 206, 82, 73, 77, 71, 66, - 65, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, 73, 128, 82, 73, 71, 86, - 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, 73, 71, - 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, 69, 70, - 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, 45, 83, - 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, 68, 69, - 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, 73, 71, - 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, 65, 78, - 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, 72, 84, - 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, 82, 73, - 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, 72, 73, - 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, - 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 45, 72, - 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, 128, - 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, 69, 85, - 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, - 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, - 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 83, - 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 83, - 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 84, 73, - 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 83, - 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, 80, 72, - 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, - 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 128, - 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, - 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 78, 73, - 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 83, 73, - 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, 73, 89, - 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 72, 73, - 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, 82, 73, - 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, 82, 73, - 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, 128, 82, - 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, - 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, - 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, 69, 85, - 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, 69, 128, - 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, 67, 197, 82, 73, - 66, 66, 79, 78, 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72, - 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, 83, 128, - 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 86, 73, 78, - 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, 77, 65, - 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, 128, 82, - 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, - 128, 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, - 82, 79, 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 84, 79, - 82, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, 83, 84, 82, - 79, 79, 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, - 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, - 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, - 65, 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, - 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, - 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, - 77, 69, 78, 212, 82, 69, 80, 72, 128, 82, 69, 80, 69, 65, 84, 69, 196, - 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, - 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, - 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, 69, 68, 89, 128, 82, - 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, 196, 82, 69, - 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, - 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, - 199, 82, 69, 73, 196, 82, 69, 71, 85, 76, 85, 83, 45, 52, 128, 82, 69, - 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, 45, 50, 128, - 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, 211, 82, 69, 71, - 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, 204, 82, 69, 71, - 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, 69, 70, 69, 82, 69, 78, - 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, - 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, - 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, - 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, - 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, - 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, - 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, - 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, - 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, - 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, - 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, - 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, - 83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, - 128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, - 197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, - 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 73, 83, 73, 78, - 199, 82, 65, 73, 83, 69, 196, 82, 65, 73, 78, 66, 79, 87, 128, 82, 65, - 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, 65, 217, 82, 65, 73, 76, - 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, 128, 82, 65, 73, 128, 82, - 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 70, 69, 128, 82, 65, 69, - 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, 68, 73, 79, - 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, - 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, 82, 65, 66, 66, - 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, 82, 65, 65, 73, - 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, 48, 50, 57, + 85, 85, 66, 85, 82, 85, 128, 82, 85, 85, 128, 82, 85, 84, 128, 82, 85, + 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, 82, 85, 80, 73, 73, + 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, 79, 88, 128, 82, 85, + 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, 84, 128, 82, 85, 78, + 78, 73, 78, 199, 82, 85, 78, 78, 69, 82, 128, 82, 85, 78, 128, 82, 85, + 77, 201, 82, 85, 77, 65, 201, 82, 85, 77, 128, 82, 85, 205, 82, 85, 76, + 69, 82, 128, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, 128, 82, 85, + 76, 69, 128, 82, 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, 73, 83, 128, + 82, 85, 71, 66, 217, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, + 199, 82, 84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, + 82, 82, 89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, + 82, 89, 80, 128, 82, 82, 85, 88, 128, 82, 82, 85, 85, 128, 82, 82, 85, + 84, 128, 82, 82, 85, 82, 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, + 128, 82, 82, 85, 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, + 82, 79, 88, 128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, + 79, 128, 82, 82, 79, 128, 82, 82, 73, 73, 128, 82, 82, 73, 128, 82, 82, + 69, 88, 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, + 128, 82, 82, 69, 200, 82, 82, 69, 69, 128, 82, 82, 69, 128, 82, 82, 65, + 88, 128, 82, 82, 65, 85, 128, 82, 82, 65, 73, 128, 82, 82, 65, 65, 128, + 82, 82, 65, 128, 82, 79, 87, 66, 79, 65, 84, 128, 82, 79, 85, 78, 68, 69, + 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, 69, 196, 82, 79, 84, 85, 78, + 68, 65, 128, 82, 79, 84, 65, 84, 69, 196, 82, 79, 83, 72, 128, 82, 79, + 83, 69, 84, 84, 69, 128, 82, 79, 83, 69, 128, 82, 79, 79, 84, 128, 82, + 79, 79, 83, 84, 69, 82, 128, 82, 79, 79, 75, 128, 82, 79, 79, 70, 128, + 82, 79, 77, 65, 206, 82, 79, 77, 128, 82, 79, 76, 76, 69, 210, 82, 79, + 196, 82, 79, 67, 75, 69, 84, 128, 82, 79, 67, 203, 82, 79, 67, 128, 82, + 79, 66, 65, 84, 128, 82, 79, 65, 83, 84, 69, 196, 82, 79, 65, 82, 128, + 82, 79, 65, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, 79, 78, 128, 82, + 78, 79, 79, 206, 82, 78, 65, 205, 82, 74, 69, 211, 82, 74, 69, 128, 82, + 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, 76, 128, 82, 73, + 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, 73, 83, 73, 78, + 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, 80, 128, 82, 73, + 78, 71, 211, 82, 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, 128, 82, 73, + 206, 82, 73, 77, 71, 66, 65, 128, 82, 73, 75, 82, 73, 75, 128, 82, 73, + 71, 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, + 73, 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, + 69, 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, + 45, 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, + 68, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, + 73, 71, 72, 84, 45, 72, 65, 78, 68, 69, 196, 82, 73, 71, 72, 84, 45, 72, + 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, 73, 78, 199, 82, 73, 71, + 72, 84, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, 73, 69, 85, 78, 71, 128, + 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, 84, + 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 84, 73, 75, 69, 85, + 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, 85, 84, 72, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, 84, 128, 82, 73, + 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 82, 73, 69, 85, + 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, + 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, + 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, 80, 45, + 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 80, 73, 69, 85, + 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, + 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, + 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, 75, + 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 45, + 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 77, 73, 69, 85, 77, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 128, + 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 45, 72, 73, 69, 85, 72, + 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, + 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 82, 73, + 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 67, 73, + 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, 76, 128, 82, 73, 69, + 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, 128, 82, 73, 67, 197, + 82, 73, 66, 66, 79, 78, 128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, + 82, 72, 79, 128, 82, 72, 207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, + 83, 128, 82, 71, 89, 65, 78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, + 86, 73, 78, 199, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 86, + 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, 69, 68, + 128, 82, 69, 86, 69, 82, 83, 69, 196, 82, 69, 86, 69, 82, 83, 197, 82, + 69, 85, 88, 128, 82, 69, 84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, + 82, 69, 84, 82, 79, 70, 76, 69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, + 69, 84, 79, 82, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, 83, 128, 82, 69, + 83, 84, 82, 79, 79, 77, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, + 69, 83, 84, 128, 82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, + 82, 67, 69, 128, 82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, + 73, 83, 84, 65, 78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, + 82, 69, 83, 200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, + 75, 65, 78, 128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, + 65, 67, 69, 77, 69, 78, 212, 82, 69, 80, 72, 128, 82, 69, 80, 69, 65, 84, + 69, 196, 82, 69, 80, 69, 65, 84, 128, 82, 69, 80, 69, 65, 212, 82, 69, + 80, 65, 128, 82, 69, 80, 193, 82, 69, 78, 84, 79, 71, 69, 78, 128, 82, + 69, 78, 128, 82, 69, 206, 82, 69, 77, 85, 128, 82, 69, 77, 69, 68, 89, + 128, 82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 73, 69, 86, 69, + 196, 82, 69, 76, 69, 65, 83, 69, 128, 82, 69, 76, 65, 84, 73, 79, 78, 65, + 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, 82, 69, 76, 65, 65, 128, 82, + 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, 69, 71, 85, 76, 85, 83, 45, 52, + 128, 82, 69, 71, 85, 76, 85, 83, 45, 51, 128, 82, 69, 71, 85, 76, 85, 83, + 45, 50, 128, 82, 69, 71, 85, 76, 85, 83, 128, 82, 69, 71, 85, 76, 85, + 211, 82, 69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 71, 73, 79, 78, 65, + 204, 82, 69, 71, 73, 65, 45, 50, 128, 82, 69, 71, 73, 65, 128, 82, 69, + 70, 69, 82, 69, 78, 67, 197, 82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, + 79, 78, 128, 82, 69, 67, 89, 67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, + 69, 196, 82, 69, 67, 84, 73, 76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, + 78, 71, 85, 76, 65, 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, + 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, + 204, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, + 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, + 69, 67, 69, 73, 86, 69, 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, + 82, 69, 65, 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, + 65, 67, 72, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, + 65, 89, 83, 128, 82, 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, + 128, 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, + 82, 65, 84, 128, 82, 65, 83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, + 204, 82, 65, 83, 72, 65, 128, 82, 65, 81, 128, 82, 65, 80, 73, 83, 77, + 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, 65, 128, 82, 65, 78, 128, 82, + 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, 82, 65, 75, 72, 65, 78, 71, + 128, 82, 65, 73, 83, 73, 78, 199, 82, 65, 73, 83, 69, 196, 82, 65, 73, + 78, 66, 79, 87, 128, 82, 65, 73, 76, 87, 65, 89, 128, 82, 65, 73, 76, 87, + 65, 217, 82, 65, 73, 76, 128, 82, 65, 73, 68, 207, 82, 65, 73, 68, 65, + 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, 200, 82, 65, 70, 69, 128, + 82, 65, 69, 77, 128, 82, 65, 68, 73, 79, 65, 67, 84, 73, 86, 197, 82, 65, + 68, 73, 79, 128, 82, 65, 68, 73, 207, 82, 65, 68, 201, 82, 65, 68, 128, + 82, 65, 196, 82, 65, 67, 81, 85, 69, 212, 82, 65, 67, 73, 78, 71, 128, + 82, 65, 66, 66, 73, 84, 128, 82, 65, 66, 66, 73, 212, 82, 65, 66, 128, + 82, 65, 65, 73, 128, 82, 65, 51, 128, 82, 65, 50, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, 82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, 50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, 128, 82, 48, 49, 57, 128, @@ -1328,129 +1335,129 @@ 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, 73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, 65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 88, 128, 80, 85, 85, 84, 128, 80, 85, - 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, 128, 80, 85, - 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, 73, 75, 65, - 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, 85, 82, 83, - 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 73, 84, 89, 128, 80, 85, - 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, 85, 80, 128, - 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, 78, - 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84, - 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, - 80, 128, 80, 85, 77, 128, 80, 85, 69, 128, 80, 85, 66, 76, 73, 195, 80, - 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, 85, 128, 80, - 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, 80, 83, 73, - 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, 73, 70, 73, - 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 80, 83, 73, - 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, 89, 71, 73, - 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, 79, 86, 69, 128, - 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, 211, 80, 82, - 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, 79, 80, 79, - 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 128, - 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, 69, 210, 80, - 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, 80, 82, 79, 76, - 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 73, 86, 69, 128, 80, - 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 71, 82, 69, 83, 83, - 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, 85, 67, 84, - 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, 86, 65, 84, 69, 128, 80, - 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, 84, 83, - 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 78, 67, - 69, 83, 83, 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, 80, 82, - 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, 79, 206, - 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, 79, 78, - 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, 80, 82, - 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, 128, 80, - 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, - 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, - 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, - 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, - 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, - 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, - 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, - 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80, - 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, - 79, 87, 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, 87, 68, 69, - 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, 80, 79, 85, - 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, 76, 197, - 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, 80, 79, 83, - 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, 128, 80, - 79, 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, 79, 82, 82, - 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, 80, 79, 80, - 80, 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 68, 76, 69, - 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, 80, 79, 76, - 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, 80, 79, 76, - 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, 128, 80, 79, - 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, 78, 84, 79, - 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, - 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, - 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128, - 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, - 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, - 128, 80, 76, 85, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, 85, - 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 79, 87, 128, - 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, 80, 76, - 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, - 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75, - 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, - 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, - 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, 87, 82, - 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, 70, 79, - 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, 83, 69, - 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, 128, - 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, 73, 78, - 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, 80, 65, - 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, 204, - 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, 78, 65, - 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76, 197, 80, - 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73, 75, 79, - 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, 128, 80, 73, 69, 85, - 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 83, - 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, - 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, - 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, - 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, - 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, - 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, 85, 76, - 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, - 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80, 73, 69, - 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75, 72, 73, - 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67, 128, 80, - 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69, 85, 208, - 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84, 128, 80, - 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, 80, 73, - 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, - 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, - 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, - 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 78, 69, 83, - 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, 128, 80, - 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, 78, 84, - 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, 72, 73, - 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, - 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, - 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, - 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, - 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, - 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, 89, 78, - 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, 72, 65, - 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, 80, - 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, 72, - 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, 84, - 65, 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, 85, - 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, 65, - 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, 128, - 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 69, 84, 193, 80, - 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, 86, - 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, 82, 83, 79, 78, 128, - 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 83, 69, - 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, - 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, 69, 82, - 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 73, 128, - 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 79, 82, 77, - 73, 78, 199, 80, 69, 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, - 84, 65, 128, 80, 69, 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, - 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, 128, - 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, 69, - 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, 82, - 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, + 85, 128, 80, 85, 84, 82, 69, 70, 65, 67, 84, 73, 79, 78, 128, 80, 85, 84, + 128, 80, 85, 212, 80, 85, 83, 72, 80, 73, 78, 128, 80, 85, 83, 72, 80, + 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, 82, 88, 128, 80, + 85, 82, 83, 69, 128, 80, 85, 82, 80, 76, 197, 80, 85, 82, 73, 84, 89, + 128, 80, 85, 82, 73, 70, 89, 128, 80, 85, 82, 128, 80, 85, 81, 128, 80, + 85, 80, 128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, + 80, 85, 78, 71, 65, 65, 77, 128, 80, 85, 78, 71, 128, 80, 85, 78, 67, 84, + 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 206, + 80, 85, 77, 80, 128, 80, 85, 77, 128, 80, 85, 69, 128, 80, 85, 66, 76, + 73, 195, 80, 85, 65, 81, 128, 80, 85, 65, 69, 128, 80, 85, 50, 128, 80, + 85, 128, 80, 84, 72, 65, 72, 193, 80, 84, 69, 128, 80, 83, 73, 76, 201, + 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, 77, 65, 128, 80, 83, + 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 65, 128, + 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, 73, 83, 84, 79, 76, + 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, 128, 80, 82, 79, + 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, 80, 82, 79, 84, 79, + 211, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, 78, 73, 128, 80, 82, + 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, 80, 79, 82, 84, 73, + 79, 78, 128, 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, 79, 80, 69, 76, 76, + 69, 210, 80, 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, 78, 71, 69, 196, + 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, 69, 67, 84, 73, + 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, 80, 82, 79, 71, + 82, 69, 83, 83, 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, 80, 82, 79, 68, + 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, 86, 65, 84, 69, + 128, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, 80, 82, 73, 78, + 84, 83, 128, 80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, + 78, 67, 69, 83, 83, 128, 80, 82, 73, 77, 69, 128, 80, 82, 73, 77, 197, + 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, 78, 84, 65, 84, 73, + 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 80, 82, 69, 80, + 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, 78, 75, 72, 65, 128, + 80, 82, 69, 70, 65, 67, 197, 80, 82, 69, 67, 73, 80, 73, 84, 65, 84, 69, + 128, 80, 82, 69, 67, 69, 68, 73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, + 128, 80, 82, 69, 67, 69, 68, 69, 211, 80, 82, 69, 67, 69, 68, 69, 196, + 80, 82, 69, 67, 69, 68, 69, 128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, + 77, 45, 80, 73, 73, 128, 80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, + 45, 77, 85, 79, 89, 128, 80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, + 77, 45, 66, 85, 79, 78, 128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, + 65, 77, 45, 66, 69, 73, 128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, + 77, 128, 80, 82, 65, 205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, + 80, 80, 65, 128, 80, 79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, + 211, 80, 79, 87, 69, 82, 128, 80, 79, 87, 68, 69, 82, 69, 196, 80, 79, + 87, 68, 69, 82, 128, 80, 79, 85, 78, 196, 80, 79, 85, 76, 84, 82, 217, + 80, 79, 85, 67, 72, 128, 80, 79, 84, 65, 84, 79, 128, 80, 79, 84, 65, 66, + 76, 197, 80, 79, 212, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, 206, + 80, 79, 83, 84, 66, 79, 88, 128, 80, 79, 83, 84, 65, 204, 80, 79, 83, 84, + 128, 80, 79, 83, 212, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, 128, 80, + 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, 85, 211, + 80, 79, 80, 80, 69, 82, 128, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, + 68, 76, 69, 128, 80, 79, 79, 128, 80, 79, 78, 68, 79, 128, 80, 79, 206, + 80, 79, 76, 73, 83, 72, 128, 80, 79, 76, 73, 67, 197, 80, 79, 76, 201, + 80, 79, 76, 69, 128, 80, 79, 76, 197, 80, 79, 75, 82, 89, 84, 73, 69, + 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 211, 80, 79, 73, + 78, 84, 79, 128, 80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, + 196, 80, 79, 73, 78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, + 217, 80, 79, 69, 84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, + 65, 128, 80, 79, 128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, + 76, 85, 84, 79, 128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, + 83, 128, 80, 76, 85, 82, 65, 76, 128, 80, 76, 85, 77, 69, 196, 80, 76, + 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, 85, 71, 128, 80, 76, 79, 87, + 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, 128, + 80, 76, 65, 89, 73, 78, 199, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, + 65, 78, 69, 128, 80, 76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, + 65, 75, 128, 80, 76, 65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, + 68, 69, 210, 80, 76, 65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, + 67, 65, 84, 79, 128, 80, 73, 90, 90, 65, 128, 80, 73, 88, 128, 80, 73, + 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, 128, 80, 73, 84, 67, 72, + 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, 84, 79, 76, 128, 80, 73, + 83, 69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, + 128, 80, 73, 82, 73, 199, 80, 73, 82, 73, 69, 69, 78, 128, 80, 73, 80, + 73, 78, 71, 128, 80, 73, 80, 65, 69, 77, 71, 66, 73, 69, 69, 128, 80, 73, + 80, 65, 69, 77, 66, 65, 128, 80, 73, 80, 128, 80, 73, 78, 87, 72, 69, 69, + 204, 80, 73, 78, 69, 65, 80, 80, 76, 69, 128, 80, 73, 78, 197, 80, 73, + 78, 65, 82, 66, 79, 82, 65, 83, 128, 80, 73, 76, 76, 128, 80, 73, 76, + 197, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, 85, 82, 85, 128, 80, 73, + 75, 79, 128, 80, 73, 71, 128, 80, 73, 199, 80, 73, 69, 88, 128, 80, 73, + 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, + 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, 45, 83, 73, + 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, 45, 83, 73, + 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, 80, 45, 83, + 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, 45, 83, 73, + 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, 45, 83, 73, + 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 82, 73, 69, + 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, 80, 45, 82, + 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, 78, 128, 80, + 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, 80, 45, 75, + 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, 69, 85, 67, + 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, 80, 73, 69, + 85, 208, 80, 73, 69, 84, 128, 80, 73, 69, 80, 128, 80, 73, 69, 69, 84, + 128, 80, 73, 69, 69, 81, 128, 80, 73, 69, 67, 69, 128, 80, 73, 69, 128, + 80, 73, 67, 75, 69, 84, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, + 79, 82, 85, 128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, + 201, 80, 72, 87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, + 210, 80, 72, 85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, + 78, 69, 83, 128, 80, 72, 79, 69, 78, 73, 67, 73, 65, 206, 80, 72, 79, 65, + 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, 78, 65, 69, 203, 80, 72, 73, + 78, 84, 72, 85, 128, 80, 72, 73, 76, 79, 83, 79, 80, 72, 69, 82, 211, 80, + 72, 73, 76, 73, 80, 80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, + 72, 73, 69, 85, 84, 72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, + 83, 128, 80, 72, 73, 69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, + 73, 69, 85, 80, 72, 45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, + 200, 80, 72, 73, 128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, + 80, 72, 65, 83, 69, 45, 198, 80, 72, 65, 83, 69, 45, 194, 80, 72, 65, 82, + 89, 78, 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, + 72, 65, 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, + 80, 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, + 72, 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 85, + 84, 65, 69, 128, 80, 69, 85, 84, 128, 80, 69, 84, 65, 83, 84, 79, 75, 79, + 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, 84, 73, 128, 80, 69, 84, + 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, 196, 80, 69, 83, 79, + 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, 69, 83, 69, 84, 193, + 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, 83, 80, 69, 67, 84, 73, + 86, 69, 128, 80, 69, 82, 83, 79, 78, 65, 204, 80, 69, 82, 83, 79, 78, + 128, 80, 69, 82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, + 83, 69, 86, 69, 82, 73, 78, 199, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, + 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, 65, 210, 80, + 69, 82, 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, + 73, 128, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, 82, 70, 79, + 82, 77, 73, 78, 199, 80, 69, 82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, + 69, 67, 84, 65, 128, 80, 69, 82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, + 83, 83, 73, 86, 69, 128, 80, 69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, + 128, 80, 69, 80, 69, 212, 80, 69, 79, 82, 84, 200, 80, 69, 79, 80, 76, + 69, 128, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, 78, 84, 65, 71, + 82, 65, 77, 128, 80, 69, 78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 83, 73, 86, 197, 80, 69, 78, 78, 217, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 85, 73, 78, 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, 69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73, @@ -1464,84 +1471,84 @@ 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 128, 80, 67, 128, 80, 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, 89, 65, 78, 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, 78, 128, 80, - 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 84, 84, 69, 82, 78, - 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, 84, 200, 80, - 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, 128, 80, 65, - 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, 65, 83, 83, 73, 86, - 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65, - 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, - 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, 83, 72, 65, 69, - 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 85, 77, 128, 80, 65, 82, 84, - 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 65, 82, 84, 73, 65, - 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 80, 65, 82, 84, 73, 65, - 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, 212, 80, 65, 82, 73, - 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, - 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, - 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, 65, 82, 65, 80, - 72, 82, 65, 83, 197, 80, 65, 82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, - 128, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 65, 82, 65, 76, 76, 69, - 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, 128, 80, 65, 82, 65, 75, - 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75, 65, 76, 69, 83, 77, 193, 80, - 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, 71, 82, 65, - 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, 65, 128, - 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, 69, 82, 67, - 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, - 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, - 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, - 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, - 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, - 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, - 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, 79, 78, - 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, 82, 65, - 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, 65, 78, - 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, - 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, - 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, 193, - 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, - 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, - 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, 80, 65, - 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, 80, 65, - 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, 77, 65, - 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, 72, 75, - 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, 65, 76, - 76, 65, 83, 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, 85, 78, - 199, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, - 76, 73, 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, - 75, 80, 65, 203, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, 73, 82, - 84, 72, 82, 65, 128, 80, 65, 73, 82, 69, 196, 80, 65, 72, 76, 65, 86, - 201, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, 80, 65, 68, 77, 193, 80, - 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, - 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, 128, 80, 65, 65, 83, 69, 78, - 84, 79, 128, 80, 65, 65, 82, 65, 69, 128, 80, 65, 65, 77, 128, 80, 65, - 65, 73, 128, 80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, - 80, 50, 128, 80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, - 128, 80, 48, 48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, - 48, 48, 53, 128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, - 48, 51, 128, 80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, - 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, - 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, - 88, 69, 73, 193, 79, 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76, - 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, - 89, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, - 65, 73, 68, 128, 79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79, - 86, 128, 79, 85, 84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, - 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, 216, 79, 85, 78, 75, 73, - 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, - 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79, - 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 82, 84, 72, 79, 71, - 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, - 197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, - 212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, - 73, 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, 82, 68, 73, 78, 65, - 204, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, 197, 79, 80, 84, - 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, 82, 69, 83, 83, 73, - 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, - 83, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 72, 73, 85, 67, 72, - 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, 79, 80, 69, 82, 65, 84, - 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, 78, 45, 80, 128, 79, - 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, 80, 69, 78, 45, 72, - 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, 67, 85, 73, 84, 45, - 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, 79, 90, 69, 128, 79, 79, + 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 85, 128, 80, 65, + 84, 84, 69, 82, 78, 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, + 65, 84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, + 84, 128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 80, 79, 82, 212, 80, + 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 85, 80, 45, 79, 85, 84, + 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, 76, 45, 68, 79, + 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 72, 84, 65, 128, 80, 65, + 83, 72, 65, 69, 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 85, 77, 128, + 80, 65, 82, 84, 217, 80, 65, 82, 84, 78, 69, 82, 83, 72, 73, 208, 80, 65, + 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, 89, 67, 76, 69, 196, 80, 65, + 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, 65, 206, 80, 65, 82, 212, + 80, 65, 82, 73, 67, 72, 79, 78, 128, 80, 65, 82, 69, 83, 84, 73, 71, 77, + 69, 78, 79, 206, 80, 65, 82, 69, 82, 69, 78, 128, 80, 65, 82, 69, 78, 84, + 72, 69, 83, 73, 83, 128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 211, 80, + 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, 82, 65, 76, 76, 69, 76, 79, + 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, 69, 76, 128, 80, 65, 82, 65, + 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 73, 128, 80, 65, + 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, 82, 65, 75, 65, 76, 69, 83, + 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, 79, 83, 128, 80, 65, 82, 65, + 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, 82, 65, 80, 200, 80, 65, 82, + 65, 128, 80, 65, 82, 128, 80, 65, 80, 89, 82, 85, 83, 128, 80, 65, 80, + 69, 82, 67, 76, 73, 80, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, + 65, 208, 80, 65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, + 73, 75, 85, 128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, + 78, 71, 71, 65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, + 73, 128, 80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, + 78, 83, 73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, + 80, 128, 80, 65, 78, 79, 78, 71, 79, 78, 65, 78, 128, 80, 65, 78, 79, 76, + 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, 128, 80, 65, 78, 71, + 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 79, 76, 65, 84, 128, 80, + 65, 78, 71, 76, 65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, + 65, 78, 71, 75, 65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, + 78, 71, 128, 80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 68, + 193, 80, 65, 78, 65, 69, 76, 65, 69, 78, 71, 128, 80, 65, 78, 128, 80, + 65, 77, 85, 78, 71, 75, 65, 72, 128, 80, 65, 77, 85, 68, 80, 79, 68, 128, + 80, 65, 77, 83, 72, 65, 69, 128, 80, 65, 77, 80, 72, 89, 76, 73, 65, 206, + 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, 84, 128, + 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, 128, 80, 65, + 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, 65, 76, 79, 67, + 72, 75, 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, 65, 128, 80, + 65, 76, 76, 65, 83, 128, 80, 65, 76, 69, 84, 84, 69, 128, 80, 65, 76, 65, + 85, 78, 199, 80, 65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, + 84, 65, 76, 73, 90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, + 80, 65, 75, 80, 65, 203, 80, 65, 73, 89, 65, 78, 78, 79, 73, 128, 80, 65, + 73, 82, 84, 72, 82, 65, 128, 80, 65, 73, 82, 69, 196, 80, 65, 73, 128, + 80, 65, 72, 76, 65, 86, 201, 80, 65, 71, 69, 82, 128, 80, 65, 71, 197, + 80, 65, 68, 77, 193, 80, 65, 68, 193, 80, 65, 68, 128, 80, 65, 67, 75, + 73, 78, 71, 128, 80, 65, 67, 75, 65, 71, 69, 128, 80, 65, 65, 84, 85, + 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 82, 65, 69, 128, + 80, 65, 65, 77, 128, 80, 65, 65, 73, 128, 80, 65, 65, 45, 80, 73, 76, 76, + 65, 128, 80, 65, 65, 128, 80, 50, 128, 80, 48, 49, 49, 128, 80, 48, 49, + 48, 128, 80, 48, 48, 57, 128, 80, 48, 48, 56, 128, 80, 48, 48, 55, 128, + 80, 48, 48, 54, 128, 80, 48, 48, 53, 128, 80, 48, 48, 52, 128, 80, 48, + 48, 51, 65, 128, 80, 48, 48, 51, 128, 80, 48, 48, 50, 128, 80, 48, 48, + 49, 65, 128, 80, 48, 48, 49, 128, 79, 89, 82, 65, 78, 73, 83, 77, 193, + 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, 65, 128, 79, 88, 73, 193, 79, + 88, 69, 73, 65, 201, 79, 88, 69, 73, 193, 79, 86, 69, 82, 82, 73, 68, 69, + 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, 86, 69, 82, 76, 73, 78, 69, + 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, 69, 82, 76, 65, 80, 80, 73, + 78, 199, 79, 86, 69, 82, 76, 65, 73, 68, 128, 79, 86, 69, 82, 66, 65, 82, + 128, 79, 86, 65, 204, 79, 86, 128, 79, 85, 84, 76, 73, 78, 69, 196, 79, + 85, 84, 76, 73, 78, 69, 128, 79, 85, 84, 69, 210, 79, 85, 84, 66, 79, + 216, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 69, 128, 79, 85, 78, 67, + 197, 79, 84, 85, 128, 79, 84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, + 72, 65, 76, 65, 206, 79, 84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, + 193, 79, 82, 84, 72, 79, 71, 79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, + 216, 79, 82, 78, 65, 84, 197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, + 82, 78, 65, 77, 69, 78, 212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, + 78, 65, 204, 79, 82, 73, 71, 73, 78, 128, 79, 82, 69, 45, 50, 128, 79, + 82, 68, 73, 78, 65, 204, 79, 82, 67, 72, 73, 68, 128, 79, 82, 65, 78, 71, + 197, 79, 80, 84, 73, 79, 206, 79, 80, 84, 73, 67, 65, 204, 79, 80, 80, + 82, 69, 83, 83, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, + 128, 79, 80, 80, 79, 83, 73, 78, 199, 79, 80, 80, 79, 83, 69, 128, 79, + 80, 72, 73, 85, 67, 72, 85, 83, 128, 79, 80, 69, 82, 65, 84, 79, 82, 128, + 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, 80, 69, + 78, 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, 196, 79, + 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, 73, 82, + 67, 85, 73, 84, 45, 79, 85, 84, 80, 85, 212, 79, 79, 90, 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, 79, 77, 85, 128, 79, 79, 69, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, 128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, 78, 69, @@ -1598,317 +1605,324 @@ 69, 88, 128, 78, 90, 69, 85, 77, 128, 78, 90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, 90, 65, 81, 128, 78, 90, 65, 80, 128, 78, 90, 65, 128, 78, 90, 193, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, - 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, - 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 69, 128, 78, 89, 85, - 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, - 89, 79, 79, 128, 78, 89, 79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, - 128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, 89, 73, 212, 78, 89, - 73, 211, 78, 89, 73, 210, 78, 89, 73, 80, 128, 78, 89, 73, 78, 45, 68, - 79, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, 78, 89, 73, - 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, 201, 78, 89, - 69, 84, 128, 78, 89, 69, 212, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, - 89, 69, 69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, - 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, 128, 78, 87, 79, 79, 128, - 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, 73, 128, 78, 87, 69, 128, - 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, 128, 78, 86, 128, 78, 85, - 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, 73, 76, 76, 85, 128, 78, 85, - 84, 128, 78, 85, 212, 78, 85, 82, 88, 128, 78, 85, 82, 128, 78, 85, 80, - 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, 78, 85, 79, 128, 78, 85, - 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, 85, 78, 71, 128, 78, 85, 78, - 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, 203, 78, 85, 78, 128, 78, 85, - 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, 69, 82, 65, 84, 79, 210, 78, - 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, 82, 83, 128, 78, 85, 77, 66, - 69, 82, 128, 78, 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, - 85, 75, 84, 65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, - 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48, - 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, - 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, - 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, - 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, - 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, - 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, - 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, - 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, - 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, - 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 213, - 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, 69, 197, 78, 84, 69, 85, 78, - 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, - 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, - 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, - 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, - 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, - 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, - 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, - 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, - 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, - 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, - 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, - 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, - 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, - 128, 78, 82, 69, 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, - 65, 84, 128, 78, 82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 89, 128, 78, - 79, 88, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, - 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, - 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, 128, 78, 79, - 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, - 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, - 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, - 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, 200, 78, 79, 82, 77, 65, 204, - 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, - 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, - 65, 66, 76, 197, 78, 79, 78, 45, 74, 79, 73, 78, 69, 82, 128, 78, 79, 78, - 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, 79, 77, 73, 78, 65, 204, 78, 79, - 75, 72, 85, 75, 128, 78, 79, 68, 69, 128, 78, 79, 65, 128, 78, 79, 45, - 66, 82, 69, 65, 203, 78, 78, 79, 128, 78, 78, 78, 65, 128, 78, 78, 71, - 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, 78, 78, 71, - 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, 78, 71, 128, - 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, 128, 78, 76, - 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, 49, 55, 128, - 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, 48, 49, 52, - 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, 76, 48, 49, - 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, 78, 76, 48, - 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, 128, 78, 76, - 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, 48, 52, 128, - 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, 48, 48, 49, - 128, 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, 73, 128, 78, - 75, 65, 65, 82, 65, 69, 128, 78, 74, 89, 88, 128, 78, 74, 89, 84, 128, - 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, 89, 80, 128, 78, - 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, 128, 78, 74, 85, - 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79, - 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 69, 81, 128, 78, 74, 85, 65, - 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, 128, 78, 74, 79, 84, 128, 78, - 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, 74, 79, 128, 78, 74, 73, 88, - 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, 69, 88, 128, - 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, 73, 69, 69, - 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 201, 78, 74, 69, 85, - 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, 69, 85, 65, 69, 78, 65, 128, - 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, 69, 69, 69, 128, 78, 74, 69, - 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, 78, 74, 65, 81, 128, 78, 74, - 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, 77, 128, - 78, 74, 65, 65, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, 84, 82, 69, - 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, 128, 78, 73, 80, - 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, 128, 78, 73, 78, - 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, 73, 78, 69, 84, 69, - 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 78, 73, 78, - 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, 73, 77, - 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, - 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 73, 128, 78, 73, 72, 83, - 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, 73, - 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, 72, - 212, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, 78, - 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, 45, - 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, 83, - 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, 78, - 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, 73, - 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, 73, - 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, 73, - 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, 128, - 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66, - 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, 72, 74, - 65, 128, 78, 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, - 69, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, 71, 85, - 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, 78, 71, - 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, 84, 128, - 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, 71, - 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, - 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, 78, 71, 75, - 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, 128, 78, 71, - 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, 78, 71, 75, 73, - 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, 85, 88, 128, - 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, 81, 128, 78, - 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, 78, 71, 75, 65, - 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, 128, 78, 71, - 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, - 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, 78, 71, 71, 85, - 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, 209, 78, 71, - 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, 71, 85, 77, - 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, 83, 72, 65, - 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 128, 78, 71, 71, 79, - 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, 85, - 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, 71, 69, 85, 65, 69, - 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, 78, 71, 71, 69, 69, - 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, 69, 69, 128, 78, - 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, 65, 65, 77, 65, 69, - 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 128, 78, 71, 69, 88, 128, - 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, - 128, 78, 71, 69, 65, 68, 65, 76, 128, 78, 71, 65, 88, 128, 78, 71, 65, - 84, 128, 78, 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, - 71, 65, 78, 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, - 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, - 88, 128, 78, 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, - 69, 128, 78, 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, - 69, 82, 128, 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, - 69, 81, 85, 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, - 128, 78, 69, 79, 128, 78, 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, - 78, 128, 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206, - 78, 69, 71, 65, 84, 69, 196, 78, 69, 69, 128, 78, 69, 67, 75, 84, 73, 69, - 128, 78, 69, 66, 69, 78, 83, 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, - 128, 78, 68, 85, 84, 128, 78, 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, - 78, 68, 85, 80, 128, 78, 68, 85, 78, 128, 78, 68, 213, 78, 68, 79, 88, - 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, 79, 128, 78, - 68, 79, 78, 128, 78, 68, 79, 77, 66, 85, 128, 78, 68, 79, 76, 197, 78, - 68, 73, 88, 128, 78, 68, 73, 84, 128, 78, 68, 73, 81, 128, 78, 68, 73, - 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, 68, 73, 68, - 65, 128, 78, 68, 73, 65, 81, 128, 78, 68, 69, 88, 128, 78, 68, 69, 85, - 88, 128, 78, 68, 69, 85, 84, 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, - 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, - 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, - 128, 78, 68, 65, 65, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, - 128, 78, 68, 65, 193, 78, 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, - 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, - 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, - 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, - 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, - 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, - 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, - 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, - 66, 65, 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65, - 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, - 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, - 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, - 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82, - 128, 78, 65, 81, 128, 78, 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, - 128, 78, 65, 78, 71, 77, 79, 78, 84, 72, 79, 128, 78, 65, 78, 68, 128, - 78, 65, 78, 65, 128, 78, 65, 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, - 50, 128, 78, 65, 77, 128, 78, 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, - 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, - 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, - 128, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, - 75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 65, 128, 78, 65, - 193, 78, 65, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, - 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, - 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, - 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, - 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, - 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, - 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, - 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, - 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, - 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, - 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, - 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, - 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, - 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, - 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, - 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, - 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, - 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 217, 77, 87, 79, 79, 128, 77, - 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, - 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, - 215, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, 86, 69, 85, 65, 69, 78, - 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, 83, - 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, - 85, 84, 128, 77, 85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, - 72, 82, 79, 79, 77, 128, 77, 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, - 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 82, 88, 128, 77, 85, 82, - 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, - 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, - 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, - 85, 79, 77, 65, 69, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, - 77, 85, 78, 65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, - 84, 73, 83, 69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, - 78, 128, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, - 76, 84, 73, 80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, - 85, 76, 84, 73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, - 82, 69, 78, 71, 128, 77, 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, - 71, 128, 77, 85, 199, 77, 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, - 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 78, 128, 77, 85, 65, 69, - 128, 77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, - 80, 65, 128, 77, 79, 89, 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, - 197, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, 128, 77, 79, 85, 84, 200, - 77, 79, 85, 83, 69, 128, 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, - 78, 83, 128, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, - 73, 206, 77, 79, 85, 78, 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, - 196, 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, 128, 77, 79, 82, 84, 85, - 85, 77, 128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, - 71, 73, 67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, - 77, 79, 79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, - 206, 77, 79, 79, 77, 80, 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, - 77, 79, 79, 128, 77, 79, 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, - 128, 77, 79, 78, 84, 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, - 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, - 78, 79, 82, 65, 73, 76, 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79, - 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, - 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65, - 210, 77, 79, 78, 75, 69, 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, - 73, 128, 77, 79, 78, 71, 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, - 217, 77, 79, 78, 128, 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, - 77, 65, 196, 77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, - 77, 79, 68, 69, 76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69, - 128, 77, 79, 66, 73, 76, 197, 77, 79, 65, 128, 77, 207, 77, 78, 89, 65, - 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, - 128, 77, 75, 80, 65, 82, 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, - 73, 212, 77, 73, 83, 82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, - 128, 77, 73, 82, 73, 128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, - 73, 78, 89, 128, 77, 73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, - 73, 78, 85, 83, 128, 77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, - 77, 65, 128, 77, 73, 78, 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, - 83, 128, 77, 73, 77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, - 78, 211, 77, 73, 76, 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, - 204, 77, 73, 76, 75, 217, 77, 73, 76, 128, 77, 73, 75, 85, 82, 79, 78, - 128, 77, 73, 75, 82, 79, 206, 77, 73, 75, 82, 73, 128, 77, 73, 73, 78, - 128, 77, 73, 73, 128, 77, 73, 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, - 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, - 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, - 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, - 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, - 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, - 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, - 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, - 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, - 128, 77, 73, 69, 69, 128, 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, - 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 197, - 77, 73, 196, 77, 73, 67, 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, 67, 82, - 79, 80, 72, 79, 78, 69, 128, 77, 73, 67, 82, 207, 77, 72, 90, 128, 77, - 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, 88, - 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, 128, - 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, 71, - 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, 128, - 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, 69, - 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, 77, - 71, 66, 79, 79, 128, 77, 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, - 128, 77, 71, 66, 73, 128, 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, - 78, 128, 77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, - 83, 65, 81, 128, 77, 71, 66, 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, - 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, - 70, 79, 78, 128, 77, 70, 79, 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, - 81, 128, 77, 70, 73, 69, 69, 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, - 85, 81, 128, 77, 70, 69, 85, 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, - 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, - 77, 69, 85, 78, 74, 79, 77, 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, - 77, 69, 84, 82, 79, 128, 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, - 73, 65, 128, 77, 69, 84, 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, - 85, 83, 128, 77, 69, 84, 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, - 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, - 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, - 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, - 78, 83, 128, 77, 69, 82, 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, - 67, 85, 82, 89, 128, 77, 69, 82, 67, 85, 82, 217, 77, 69, 78, 68, 85, 84, - 128, 77, 69, 78, 128, 77, 69, 77, 79, 128, 77, 69, 77, 66, 69, 82, 83, - 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, 69, 210, - 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, 69, 205, 77, - 69, 76, 79, 68, 73, 195, 77, 69, 76, 73, 75, 128, 77, 69, 73, 90, 73, - 128, 77, 69, 71, 65, 84, 79, 78, 128, 77, 69, 71, 65, 80, 72, 79, 78, 69, - 128, 77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, - 69, 69, 84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, - 69, 69, 77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 69, 128, 77, 69, 68, - 73, 85, 77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, - 128, 77, 69, 68, 73, 67, 65, 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, - 77, 69, 65, 83, 85, 82, 69, 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, - 65, 83, 85, 82, 197, 77, 68, 85, 206, 77, 67, 72, 213, 77, 67, 72, 65, - 206, 77, 66, 85, 79, 81, 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, - 77, 66, 85, 65, 69, 77, 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, - 128, 77, 66, 79, 128, 77, 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, - 82, 73, 69, 69, 78, 128, 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, - 66, 69, 85, 82, 73, 128, 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, - 128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, - 69, 69, 128, 77, 66, 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, - 73, 128, 77, 66, 65, 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, - 128, 77, 66, 65, 65, 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, - 77, 66, 51, 128, 77, 66, 50, 128, 77, 66, 128, 77, 194, 77, 65, 89, 69, - 203, 77, 65, 89, 65, 78, 78, 65, 128, 77, 65, 89, 128, 77, 65, 88, 73, - 77, 65, 128, 77, 65, 88, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, - 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, + 89, 85, 85, 128, 78, 89, 85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, + 79, 88, 128, 78, 89, 85, 79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, + 69, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, 78, 89, 79, 84, 128, 78, + 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, 79, 65, 128, 78, 89, 79, + 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, 78, 89, 73, 84, 128, 78, + 89, 73, 212, 78, 89, 73, 211, 78, 89, 73, 210, 78, 89, 73, 80, 128, 78, + 89, 73, 78, 45, 68, 79, 128, 78, 89, 73, 73, 128, 78, 89, 73, 69, 88, + 128, 78, 89, 73, 69, 84, 128, 78, 89, 73, 69, 80, 128, 78, 89, 73, 69, + 128, 78, 89, 73, 128, 78, 89, 201, 78, 89, 69, 84, 128, 78, 89, 69, 212, + 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, 69, 128, 78, 89, 69, + 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, 85, 128, 78, 89, 65, + 73, 128, 78, 89, 65, 69, 77, 65, 69, 128, 78, 89, 65, 65, 128, 78, 87, + 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, 87, 73, 128, 78, + 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, 87, 128, 78, 86, + 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 85, 128, 78, 85, 84, + 73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 212, 78, 85, 82, 88, 128, + 78, 85, 82, 128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, + 128, 78, 85, 79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, + 85, 78, 71, 128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, + 203, 78, 85, 78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, + 69, 82, 65, 84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, + 82, 83, 128, 78, 85, 77, 66, 69, 82, 128, 78, 85, 77, 128, 78, 85, 76, + 76, 128, 78, 85, 76, 204, 78, 85, 75, 84, 65, 128, 78, 85, 69, 78, 71, + 128, 78, 85, 69, 128, 78, 85, 66, 73, 65, 206, 78, 85, 65, 69, 128, 78, + 85, 49, 49, 128, 78, 85, 48, 50, 50, 65, 128, 78, 85, 48, 50, 50, 128, + 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, + 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, + 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, + 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, + 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, + 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, + 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, + 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, + 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, + 85, 77, 128, 78, 84, 213, 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, + 69, 197, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, + 78, 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, + 65, 208, 78, 84, 65, 65, 128, 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, + 78, 83, 85, 77, 128, 78, 83, 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, + 78, 83, 73, 69, 69, 80, 128, 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, + 128, 78, 83, 72, 85, 212, 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, + 69, 128, 78, 83, 72, 73, 69, 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, + 72, 65, 81, 128, 78, 83, 72, 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, + 78, 83, 69, 78, 128, 78, 83, 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, + 84, 128, 78, 82, 89, 82, 88, 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, + 128, 78, 82, 89, 128, 78, 82, 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, + 85, 82, 88, 128, 78, 82, 85, 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, + 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, + 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, 80, 128, 78, 82, 69, 128, + 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, 80, 128, 78, 82, + 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, 86, 69, 77, 66, 69, + 82, 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, + 69, 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, + 66, 79, 79, 75, 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, + 128, 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, + 128, 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, + 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, + 200, 78, 79, 82, 77, 65, 204, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, + 78, 85, 128, 78, 79, 79, 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, + 128, 78, 79, 78, 45, 80, 79, 84, 65, 66, 76, 197, 78, 79, 78, 45, 74, 79, + 73, 78, 69, 82, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, + 79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, 68, 69, + 128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 78, 85, 85, + 128, 78, 78, 85, 128, 78, 78, 79, 79, 128, 78, 78, 79, 128, 78, 78, 78, + 85, 85, 128, 78, 78, 78, 85, 128, 78, 78, 78, 79, 79, 128, 78, 78, 78, + 79, 128, 78, 78, 78, 73, 73, 128, 78, 78, 78, 73, 128, 78, 78, 78, 69, + 69, 128, 78, 78, 78, 69, 128, 78, 78, 78, 65, 85, 128, 78, 78, 78, 65, + 73, 128, 78, 78, 78, 65, 65, 128, 78, 78, 78, 65, 128, 78, 78, 78, 128, + 78, 78, 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, 78, 71, 73, 73, 128, + 78, 78, 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, 78, 71, 65, 128, 78, + 78, 71, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, 78, 76, 48, 49, 57, + 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, 128, 78, 76, 48, + 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, 53, 128, 78, 76, + 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, 49, 50, 128, 78, + 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, 48, 48, 57, 128, + 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, 76, 48, 48, 54, + 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, 128, 78, 76, 48, + 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, 50, 128, 78, 76, + 48, 48, 49, 128, 78, 75, 79, 77, 128, 78, 75, 207, 78, 75, 73, 78, 68, + 73, 128, 78, 75, 65, 65, 82, 65, 69, 128, 78, 74, 89, 88, 128, 78, 74, + 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, 89, + 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, 128, + 78, 74, 85, 82, 128, 78, 74, 85, 81, 65, 128, 78, 74, 85, 80, 128, 78, + 74, 85, 79, 88, 128, 78, 74, 85, 79, 128, 78, 74, 85, 69, 81, 128, 78, + 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, 79, 88, 128, 78, 74, 79, + 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, 128, 78, 74, 79, 128, 78, + 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, 73, 80, 128, 78, 74, 73, + 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, 73, 69, 80, 128, 78, 74, + 73, 69, 69, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 201, 78, + 74, 69, 85, 88, 128, 78, 74, 69, 85, 84, 128, 78, 74, 69, 85, 65, 69, 78, + 65, 128, 78, 74, 69, 85, 65, 69, 77, 128, 78, 74, 69, 69, 69, 69, 128, + 78, 74, 69, 69, 128, 78, 74, 69, 197, 78, 74, 69, 128, 78, 74, 65, 81, + 128, 78, 74, 65, 80, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, + 69, 77, 128, 78, 74, 65, 65, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, + 84, 82, 69, 128, 78, 73, 83, 65, 71, 128, 78, 73, 82, 85, 71, 85, 128, + 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, 78, 69, 84, 89, 128, + 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, 78, 128, 78, 73, 78, + 69, 84, 69, 69, 206, 78, 73, 78, 69, 45, 84, 72, 73, 82, 84, 89, 128, 78, + 73, 78, 197, 78, 73, 78, 68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, + 73, 77, 128, 78, 73, 205, 78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, + 75, 65, 72, 73, 84, 128, 78, 73, 75, 65, 128, 78, 73, 72, 83, 72, 86, 65, + 83, 65, 128, 78, 73, 71, 73, 68, 65, 77, 73, 78, 128, 78, 73, 71, 73, 68, + 65, 69, 83, 72, 128, 78, 73, 71, 72, 84, 128, 78, 73, 71, 72, 212, 78, + 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, 128, 78, 73, 69, 85, + 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, 78, 45, 84, 72, 73, + 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, 79, 83, 128, 78, 73, + 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, 85, 78, 45, 80, 73, + 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, 83, 73, 79, 83, 128, + 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, 78, 73, 69, 85, 78, + 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, 67, 73, 69, 85, 67, + 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, 72, 128, 78, 73, 69, + 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, 73, 66, 128, 78, 73, + 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, 72, 74, 65, 128, 78, + 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, 71, 86, 69, 128, 78, + 71, 85, 85, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, + 71, 85, 79, 128, 78, 71, 85, 65, 69, 84, 128, 78, 71, 85, 65, 69, 128, + 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, 213, 78, 71, 79, + 84, 128, 78, 71, 79, 81, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, + 78, 71, 79, 77, 128, 78, 71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, + 71, 207, 78, 71, 75, 89, 69, 69, 128, 78, 71, 75, 87, 65, 69, 78, 128, + 78, 71, 75, 85, 80, 128, 78, 71, 75, 85, 78, 128, 78, 71, 75, 85, 77, + 128, 78, 71, 75, 85, 69, 78, 90, 69, 85, 77, 128, 78, 71, 75, 85, 197, + 78, 71, 75, 73, 78, 68, 201, 78, 71, 75, 73, 69, 69, 128, 78, 71, 75, 69, + 85, 88, 128, 78, 71, 75, 69, 85, 82, 73, 128, 78, 71, 75, 69, 85, 65, 69, + 81, 128, 78, 71, 75, 69, 85, 65, 69, 77, 128, 78, 71, 75, 65, 81, 128, + 78, 71, 75, 65, 80, 128, 78, 71, 75, 65, 65, 77, 73, 128, 78, 71, 75, 65, + 128, 78, 71, 73, 69, 88, 128, 78, 71, 73, 69, 80, 128, 78, 71, 73, 69, + 128, 78, 71, 71, 87, 65, 69, 78, 128, 78, 71, 71, 85, 82, 65, 69, 128, + 78, 71, 71, 85, 80, 128, 78, 71, 71, 85, 79, 81, 128, 78, 71, 71, 85, 79, + 209, 78, 71, 71, 85, 79, 78, 128, 78, 71, 71, 85, 79, 77, 128, 78, 71, + 71, 85, 77, 128, 78, 71, 71, 85, 69, 69, 84, 128, 78, 71, 71, 85, 65, 69, + 83, 72, 65, 197, 78, 71, 71, 85, 65, 69, 206, 78, 71, 71, 85, 128, 78, + 71, 71, 79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, + 71, 69, 85, 88, 128, 78, 71, 71, 69, 85, 65, 69, 84, 128, 78, 71, 71, 69, + 85, 65, 69, 128, 78, 71, 71, 69, 213, 78, 71, 71, 69, 78, 128, 78, 71, + 71, 69, 69, 84, 128, 78, 71, 71, 69, 69, 69, 69, 128, 78, 71, 71, 69, 69, + 128, 78, 71, 71, 69, 128, 78, 71, 71, 65, 80, 128, 78, 71, 71, 65, 65, + 77, 65, 69, 128, 78, 71, 71, 65, 65, 77, 128, 78, 71, 71, 128, 78, 71, + 69, 88, 128, 78, 71, 69, 85, 82, 69, 85, 84, 128, 78, 71, 69, 80, 128, + 78, 71, 69, 78, 128, 78, 71, 69, 69, 128, 78, 71, 69, 65, 68, 65, 76, + 128, 78, 71, 65, 88, 128, 78, 71, 65, 85, 128, 78, 71, 65, 84, 128, 78, + 71, 65, 211, 78, 71, 65, 81, 128, 78, 71, 65, 80, 128, 78, 71, 65, 78, + 71, 85, 128, 78, 71, 65, 78, 128, 78, 71, 65, 73, 128, 78, 71, 65, 65, + 73, 128, 78, 71, 193, 78, 70, 128, 78, 69, 88, 212, 78, 69, 88, 128, 78, + 69, 87, 83, 80, 65, 80, 69, 82, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, + 69, 87, 128, 78, 69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, + 78, 69, 84, 128, 78, 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 81, 85, + 68, 65, 65, 128, 78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 128, 78, + 69, 79, 128, 78, 69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, + 78, 69, 73, 84, 72, 69, 210, 78, 69, 71, 65, 84, 73, 79, 206, 78, 69, 71, + 65, 84, 69, 196, 78, 69, 67, 75, 84, 73, 69, 128, 78, 69, 66, 69, 78, 83, + 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, 78, + 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, 68, + 85, 78, 128, 78, 68, 213, 78, 68, 79, 88, 128, 78, 68, 79, 84, 128, 78, + 68, 79, 80, 128, 78, 68, 79, 79, 128, 78, 68, 79, 78, 128, 78, 68, 79, + 77, 66, 85, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, + 84, 128, 78, 68, 73, 81, 128, 78, 68, 73, 80, 128, 78, 68, 73, 69, 88, + 128, 78, 68, 73, 69, 128, 78, 68, 73, 68, 65, 128, 78, 68, 73, 65, 81, + 128, 78, 68, 69, 88, 128, 78, 68, 69, 85, 88, 128, 78, 68, 69, 85, 84, + 128, 78, 68, 69, 85, 65, 69, 82, 69, 69, 128, 78, 68, 69, 80, 128, 78, + 68, 69, 69, 128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, + 128, 78, 68, 65, 80, 128, 78, 68, 65, 77, 128, 78, 68, 65, 65, 78, 71, + 71, 69, 85, 65, 69, 84, 128, 78, 68, 65, 65, 128, 78, 68, 65, 193, 78, + 66, 89, 88, 128, 78, 66, 89, 84, 128, 78, 66, 89, 82, 88, 128, 78, 66, + 89, 82, 128, 78, 66, 89, 80, 128, 78, 66, 89, 128, 78, 66, 85, 88, 128, + 78, 66, 85, 84, 128, 78, 66, 85, 82, 88, 128, 78, 66, 85, 82, 128, 78, + 66, 85, 80, 128, 78, 66, 85, 128, 78, 66, 79, 88, 128, 78, 66, 79, 84, + 128, 78, 66, 79, 80, 128, 78, 66, 79, 128, 78, 66, 73, 88, 128, 78, 66, + 73, 84, 128, 78, 66, 73, 80, 128, 78, 66, 73, 69, 88, 128, 78, 66, 73, + 69, 80, 128, 78, 66, 73, 69, 128, 78, 66, 73, 128, 78, 66, 65, 88, 128, + 78, 66, 65, 84, 128, 78, 66, 65, 80, 128, 78, 66, 65, 128, 78, 65, 89, + 65, 78, 78, 65, 128, 78, 65, 89, 128, 78, 65, 88, 73, 65, 206, 78, 65, + 88, 128, 78, 65, 85, 84, 72, 83, 128, 78, 65, 85, 68, 73, 218, 78, 65, + 84, 85, 82, 65, 204, 78, 65, 84, 73, 79, 78, 65, 204, 78, 65, 83, 75, 65, + 80, 201, 78, 65, 83, 72, 73, 128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, + 79, 206, 78, 65, 82, 82, 79, 215, 78, 65, 82, 128, 78, 65, 81, 128, 78, + 65, 79, 211, 78, 65, 78, 83, 65, 78, 65, 81, 128, 78, 65, 78, 71, 77, 79, + 78, 84, 72, 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65, + 77, 69, 128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 77, 128, 78, + 65, 73, 82, 193, 78, 65, 73, 204, 78, 65, 71, 82, 201, 78, 65, 71, 65, + 82, 128, 78, 65, 71, 65, 128, 78, 65, 71, 193, 78, 65, 71, 128, 78, 65, + 199, 78, 65, 69, 128, 78, 65, 66, 76, 65, 128, 78, 65, 65, 83, 73, 75, + 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, 75, 89, 65, 89, 65, 128, 78, + 65, 65, 73, 128, 78, 65, 193, 78, 65, 50, 128, 78, 48, 52, 50, 128, 78, + 48, 52, 49, 128, 78, 48, 52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, + 56, 128, 78, 48, 51, 55, 65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, + 128, 78, 48, 51, 53, 65, 128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, + 128, 78, 48, 51, 52, 128, 78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, + 78, 48, 51, 50, 128, 78, 48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, + 50, 57, 128, 78, 48, 50, 56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, + 128, 78, 48, 50, 53, 65, 128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, + 78, 48, 50, 51, 128, 78, 48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, + 50, 48, 128, 78, 48, 49, 57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, + 56, 65, 128, 78, 48, 49, 56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, + 128, 78, 48, 49, 53, 128, 78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, + 48, 49, 50, 128, 78, 48, 49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, + 57, 128, 78, 48, 48, 56, 128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, + 78, 48, 48, 53, 128, 78, 48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, + 48, 50, 128, 78, 48, 48, 49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, + 82, 217, 77, 89, 88, 128, 77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, + 128, 77, 89, 80, 128, 77, 89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 217, + 77, 87, 79, 79, 128, 77, 87, 79, 128, 77, 87, 73, 73, 128, 77, 87, 73, + 128, 77, 87, 69, 69, 128, 77, 87, 69, 128, 77, 87, 65, 65, 128, 77, 87, + 65, 128, 77, 87, 128, 77, 215, 77, 86, 79, 80, 128, 77, 86, 73, 128, 77, + 86, 69, 85, 65, 69, 78, 71, 65, 77, 128, 77, 86, 128, 77, 214, 77, 85, + 88, 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, 65, 78, 128, 77, 85, 85, 82, + 68, 72, 65, 74, 193, 77, 85, 85, 128, 77, 85, 84, 128, 77, 85, 83, 73, + 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 82, 79, 79, 77, 128, 77, + 85, 83, 72, 51, 128, 77, 85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, + 83, 200, 77, 85, 82, 88, 128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, + 69, 128, 77, 85, 82, 68, 65, 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, + 77, 85, 81, 68, 65, 77, 128, 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, + 85, 79, 84, 128, 77, 85, 79, 80, 128, 77, 85, 79, 77, 65, 69, 128, 77, + 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, 65, 72, 128, 77, + 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, 69, 212, 77, 85, + 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, 85, 76, 84, 73, + 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, 80, 76, 197, 77, + 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, 76, 84, 73, 77, 65, 80, + 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, 82, 69, 78, 71, 128, 77, + 85, 73, 78, 128, 77, 85, 71, 83, 128, 77, 85, 71, 128, 77, 85, 199, 77, + 85, 69, 128, 77, 85, 67, 72, 128, 77, 85, 67, 200, 77, 85, 67, 65, 65, + 68, 128, 77, 85, 65, 78, 128, 77, 85, 65, 69, 128, 77, 85, 45, 71, 65, + 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, 80, 65, 128, 77, 79, 89, + 65, 73, 128, 77, 79, 88, 128, 77, 79, 86, 73, 197, 77, 79, 86, 69, 196, + 77, 79, 85, 84, 72, 128, 77, 79, 85, 84, 200, 77, 79, 85, 83, 69, 128, + 77, 79, 85, 83, 197, 77, 79, 85, 78, 84, 65, 73, 78, 83, 128, 77, 79, 85, + 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, 84, 65, 73, 206, 77, 79, 85, 78, + 212, 77, 79, 85, 78, 68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 72, 69, + 82, 128, 77, 79, 84, 128, 77, 79, 82, 84, 85, 85, 77, 128, 77, 79, 82, + 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, 67, 65, 204, 77, + 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, 79, 83, 69, 45, 67, + 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, 77, 79, 79, 77, 80, + 85, 81, 128, 77, 79, 79, 77, 69, 85, 84, 128, 77, 79, 79, 128, 77, 79, + 78, 84, 73, 69, 69, 78, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, + 200, 77, 79, 78, 83, 84, 69, 82, 128, 77, 79, 78, 79, 83, 84, 65, 66, 76, + 197, 77, 79, 78, 79, 83, 80, 65, 67, 197, 77, 79, 78, 79, 82, 65, 73, 76, + 128, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, 79, 78, 79, 71, 82, 65, 77, + 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, 77, 79, 78, 79, 70, 79, 78, + 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, 65, 210, 77, 79, 78, 75, 69, + 89, 128, 77, 79, 78, 75, 69, 217, 77, 79, 78, 73, 128, 77, 79, 78, 71, + 75, 69, 85, 65, 69, 81, 128, 77, 79, 78, 69, 217, 77, 79, 78, 128, 77, + 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, 77, 79, 68, + 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, 76, 83, + 128, 77, 79, 68, 69, 76, 128, 77, 79, 68, 69, 128, 77, 79, 66, 73, 76, + 197, 77, 79, 65, 128, 77, 207, 77, 78, 89, 65, 205, 77, 78, 65, 83, 128, + 77, 77, 128, 77, 205, 77, 76, 65, 128, 77, 76, 128, 77, 75, 80, 65, 82, + 65, 209, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 212, 77, 73, 83, 82, + 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, 128, + 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, 73, + 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, 77, + 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 65, 128, 77, 73, 78, + 73, 68, 73, 83, 67, 128, 77, 73, 78, 73, 66, 85, 83, 128, 77, 73, 77, 69, + 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, 76, 76, + 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, 75, 217, + 77, 73, 76, 128, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, + 206, 77, 73, 75, 82, 73, 128, 77, 73, 73, 78, 128, 77, 73, 73, 128, 77, + 73, 199, 77, 73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, + 84, 128, 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, + 77, 73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, + 73, 69, 85, 77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, + 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, + 69, 85, 80, 128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, + 77, 73, 69, 85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, + 67, 73, 69, 85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, + 72, 128, 77, 73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 69, 128, + 77, 73, 69, 128, 77, 73, 68, 76, 73, 78, 197, 77, 73, 68, 68, 76, 69, 45, + 87, 69, 76, 83, 200, 77, 73, 68, 68, 76, 197, 77, 73, 196, 77, 73, 67, + 82, 79, 83, 67, 79, 80, 69, 128, 77, 73, 67, 82, 79, 80, 72, 79, 78, 69, + 128, 77, 73, 67, 82, 207, 77, 72, 90, 128, 77, 72, 128, 77, 71, 85, 88, + 128, 77, 71, 85, 84, 128, 77, 71, 85, 82, 88, 128, 77, 71, 85, 82, 128, + 77, 71, 85, 80, 128, 77, 71, 85, 79, 88, 128, 77, 71, 85, 79, 80, 128, + 77, 71, 85, 79, 128, 77, 71, 85, 128, 77, 71, 79, 88, 128, 77, 71, 79, + 84, 128, 77, 71, 79, 80, 128, 77, 71, 79, 128, 77, 71, 207, 77, 71, 73, + 69, 88, 128, 77, 71, 73, 69, 128, 77, 71, 69, 88, 128, 77, 71, 69, 80, + 128, 77, 71, 69, 128, 77, 71, 66, 85, 128, 77, 71, 66, 79, 79, 128, 77, + 71, 66, 79, 70, 85, 77, 128, 77, 71, 66, 79, 128, 77, 71, 66, 73, 128, + 77, 71, 66, 69, 85, 78, 128, 77, 71, 66, 69, 78, 128, 77, 71, 66, 69, 69, + 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, 83, 65, 81, 128, 77, 71, 66, + 65, 83, 65, 128, 77, 71, 65, 88, 128, 77, 71, 65, 84, 128, 77, 71, 65, + 80, 128, 77, 71, 65, 128, 77, 71, 128, 77, 70, 79, 78, 128, 77, 70, 79, + 206, 77, 70, 79, 128, 77, 70, 73, 89, 65, 81, 128, 77, 70, 73, 69, 69, + 128, 77, 70, 69, 85, 84, 128, 77, 70, 69, 85, 81, 128, 77, 70, 69, 85, + 65, 69, 128, 77, 70, 65, 65, 128, 77, 69, 90, 90, 79, 128, 77, 69, 88, + 128, 77, 69, 85, 212, 77, 69, 85, 81, 128, 77, 69, 85, 78, 74, 79, 77, + 78, 68, 69, 85, 81, 128, 77, 69, 85, 78, 128, 77, 69, 84, 82, 79, 128, + 77, 69, 84, 82, 73, 67, 65, 204, 77, 69, 84, 82, 73, 65, 128, 77, 69, 84, + 82, 69, 84, 69, 211, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 69, 84, + 69, 75, 128, 77, 69, 84, 69, 71, 128, 77, 69, 84, 65, 76, 128, 77, 69, + 84, 193, 77, 69, 83, 83, 69, 78, 73, 65, 206, 77, 69, 83, 79, 128, 77, + 69, 83, 73, 128, 77, 69, 83, 72, 128, 77, 69, 82, 75, 72, 65, 128, 77, + 69, 82, 75, 72, 193, 77, 69, 82, 73, 68, 73, 65, 78, 83, 128, 77, 69, 82, + 73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, + 69, 82, 67, 85, 82, 217, 77, 69, 78, 68, 85, 84, 128, 77, 69, 78, 128, + 77, 69, 77, 79, 128, 77, 69, 77, 66, 69, 82, 83, 72, 73, 80, 128, 77, 69, + 77, 66, 69, 82, 128, 77, 69, 77, 66, 69, 210, 77, 69, 77, 45, 81, 79, 80, + 72, 128, 77, 69, 77, 128, 77, 69, 205, 77, 69, 76, 79, 68, 73, 195, 77, + 69, 76, 73, 75, 128, 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, + 128, 77, 69, 71, 65, 80, 72, 79, 78, 69, 128, 77, 69, 71, 65, 76, 73, + 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, 69, 69, 84, 69, 201, 77, 69, + 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, 69, 69, 77, 128, 77, 69, 69, + 69, 69, 128, 77, 69, 69, 128, 77, 69, 68, 73, 85, 77, 128, 77, 69, 68, + 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, 128, 77, 69, 68, 73, 67, 65, + 204, 77, 69, 65, 84, 128, 77, 69, 65, 212, 77, 69, 65, 83, 85, 82, 69, + 196, 77, 69, 65, 83, 85, 82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, + 68, 85, 206, 77, 67, 72, 213, 77, 67, 72, 65, 206, 77, 66, 85, 79, 81, + 128, 77, 66, 85, 79, 128, 77, 66, 85, 69, 128, 77, 66, 85, 65, 69, 77, + 128, 77, 66, 85, 65, 69, 128, 77, 66, 79, 79, 128, 77, 66, 79, 128, 77, + 66, 73, 84, 128, 77, 66, 73, 212, 77, 66, 73, 82, 73, 69, 69, 78, 128, + 77, 66, 73, 128, 77, 66, 69, 85, 88, 128, 77, 66, 69, 85, 82, 73, 128, + 77, 66, 69, 85, 77, 128, 77, 66, 69, 82, 65, 69, 128, 77, 66, 69, 78, + 128, 77, 66, 69, 69, 75, 69, 69, 84, 128, 77, 66, 69, 69, 128, 77, 66, + 69, 128, 77, 66, 65, 81, 128, 77, 66, 65, 78, 89, 73, 128, 77, 66, 65, + 65, 82, 65, 69, 128, 77, 66, 65, 65, 75, 69, 84, 128, 77, 66, 65, 65, + 128, 77, 66, 65, 193, 77, 66, 193, 77, 66, 52, 128, 77, 66, 51, 128, 77, + 66, 50, 128, 77, 66, 128, 77, 194, 77, 65, 89, 69, 203, 77, 65, 89, 65, + 78, 78, 65, 128, 77, 65, 89, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, + 88, 128, 77, 65, 85, 128, 77, 65, 84, 84, 79, 67, 75, 128, 77, 65, 84, + 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, 65, 76, 83, 128, 77, 65, 84, 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, 78, 71, 128, 77, 65, 83, 83, 65, 71, 69, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 75, 128, 77, 65, 83, 72, 70, 65, 65, 84, 128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, @@ -1927,137 +1941,142 @@ 65, 73, 76, 73, 78, 199, 77, 65, 78, 68, 65, 73, 195, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, 67, 76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 69, 82, 73, 128, 77, 65, 76, 69, 128, 77, 65, 76, 197, - 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 73, - 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, - 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, - 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 76, 66, 79, 216, - 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, 69, 78, 128, 77, 65, 72, - 74, 79, 78, 199, 77, 65, 72, 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, 78, - 65, 128, 77, 65, 72, 65, 80, 65, 75, 72, 128, 77, 65, 72, 65, 65, 80, 82, - 65, 65, 78, 193, 77, 65, 72, 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, - 199, 77, 65, 69, 83, 73, 128, 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, - 78, 74, 69, 84, 128, 77, 65, 69, 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, - 75, 80, 69, 78, 128, 77, 65, 69, 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, - 77, 66, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, - 77, 128, 77, 65, 69, 76, 69, 69, 128, 77, 65, 69, 75, 69, 85, 80, 128, - 77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 200, - 77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, - 71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, - 128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, - 79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 67, 72, 73, 78, 69, 128, - 77, 65, 65, 73, 128, 77, 65, 65, 128, 77, 65, 50, 128, 77, 48, 52, 52, - 128, 77, 48, 52, 51, 128, 77, 48, 52, 50, 128, 77, 48, 52, 49, 128, 77, - 48, 52, 48, 65, 128, 77, 48, 52, 48, 128, 77, 48, 51, 57, 128, 77, 48, - 51, 56, 128, 77, 48, 51, 55, 128, 77, 48, 51, 54, 128, 77, 48, 51, 53, - 128, 77, 48, 51, 52, 128, 77, 48, 51, 51, 66, 128, 77, 48, 51, 51, 65, - 128, 77, 48, 51, 51, 128, 77, 48, 51, 50, 128, 77, 48, 51, 49, 65, 128, - 77, 48, 51, 49, 128, 77, 48, 51, 48, 128, 77, 48, 50, 57, 128, 77, 48, - 50, 56, 65, 128, 77, 48, 50, 56, 128, 77, 48, 50, 55, 128, 77, 48, 50, - 54, 128, 77, 48, 50, 53, 128, 77, 48, 50, 52, 65, 128, 77, 48, 50, 52, - 128, 77, 48, 50, 51, 128, 77, 48, 50, 50, 65, 128, 77, 48, 50, 50, 128, - 77, 48, 50, 49, 128, 77, 48, 50, 48, 128, 77, 48, 49, 57, 128, 77, 48, - 49, 56, 128, 77, 48, 49, 55, 65, 128, 77, 48, 49, 55, 128, 77, 48, 49, - 54, 65, 128, 77, 48, 49, 54, 128, 77, 48, 49, 53, 65, 128, 77, 48, 49, - 53, 128, 77, 48, 49, 52, 128, 77, 48, 49, 51, 128, 77, 48, 49, 50, 72, - 128, 77, 48, 49, 50, 71, 128, 77, 48, 49, 50, 70, 128, 77, 48, 49, 50, - 69, 128, 77, 48, 49, 50, 68, 128, 77, 48, 49, 50, 67, 128, 77, 48, 49, - 50, 66, 128, 77, 48, 49, 50, 65, 128, 77, 48, 49, 50, 128, 77, 48, 49, - 49, 128, 77, 48, 49, 48, 65, 128, 77, 48, 49, 48, 128, 77, 48, 48, 57, - 128, 77, 48, 48, 56, 128, 77, 48, 48, 55, 128, 77, 48, 48, 54, 128, 77, - 48, 48, 53, 128, 77, 48, 48, 52, 128, 77, 48, 48, 51, 65, 128, 77, 48, - 48, 51, 128, 77, 48, 48, 50, 128, 77, 48, 48, 49, 66, 128, 77, 48, 48, - 49, 65, 128, 77, 48, 48, 49, 128, 76, 218, 76, 89, 89, 128, 76, 89, 88, - 128, 76, 89, 84, 128, 76, 89, 82, 88, 128, 76, 89, 82, 128, 76, 89, 80, - 128, 76, 89, 68, 73, 65, 206, 76, 89, 67, 73, 65, 206, 76, 88, 128, 76, - 87, 79, 79, 128, 76, 87, 79, 128, 76, 87, 73, 73, 128, 76, 87, 73, 128, - 76, 87, 69, 128, 76, 87, 65, 65, 128, 76, 87, 65, 128, 76, 85, 88, 128, - 76, 85, 84, 128, 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88, - 128, 76, 85, 79, 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85, - 78, 71, 83, 73, 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76, 85, 76, - 128, 76, 85, 73, 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72, 128, 76, - 85, 71, 71, 65, 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, 65, - 204, 76, 85, 69, 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, - 50, 128, 76, 85, 178, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, - 78, 71, 197, 76, 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, - 69, 210, 76, 79, 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, - 76, 79, 85, 68, 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, - 76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76, - 79, 82, 82, 65, 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, - 79, 79, 84, 128, 76, 79, 79, 80, 128, 76, 79, 79, 78, 128, 76, 79, 79, - 203, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65, - 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, - 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, - 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, - 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, - 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, - 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, - 77, 128, 76, 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, - 76, 128, 76, 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, - 79, 71, 82, 65, 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, - 128, 76, 79, 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 203, 76, - 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, - 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, 128, 76, 74, 85, 68, - 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, 73, 88, 128, 76, 73, - 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, 76, 197, 76, 73, 84, - 84, 69, 210, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76, - 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, 128, 76, 73, 80, 83, - 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, - 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, - 76, 73, 78, 69, 45, 57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, - 45, 51, 128, 76, 73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, - 76, 73, 77, 77, 85, 50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, - 213, 76, 73, 77, 73, 84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, - 128, 76, 73, 77, 73, 84, 128, 76, 73, 77, 69, 128, 76, 73, 76, 89, 128, - 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, 128, 76, 73, 73, 128, 76, 73, - 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, 71, 72, 84, 72, 79, 85, 83, 69, - 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, 69, 128, 76, 73, 69, 88, 128, - 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, 76, 73, 69, 69, 128, 76, 73, - 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 66, 69, 82, - 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, - 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, - 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69, - 204, 76, 69, 85, 77, 128, 76, 69, 85, 65, 69, 80, 128, 76, 69, 85, 65, - 69, 77, 128, 76, 69, 84, 84, 69, 82, 83, 128, 76, 69, 84, 84, 69, 82, - 128, 76, 69, 212, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, - 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76, - 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, 76, 69, 78, 84, 73, 67, 85, - 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, 78, 71, 84, 72, 69, 78, 69, - 82, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, 71, 65, 128, 76, 69, 78, - 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, 79, 73, 128, 76, 69, 76, - 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, 77, 65, - 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, 73, 79, - 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, 70, 84, - 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, 71, 72, - 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, 73, 68, - 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, 45, 80, - 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 68, 69, 196, - 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, 84, 45, 70, 65, 67, 73, - 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, 69, 87, 65, 128, 76, - 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 68, 71, 69, 82, 128, - 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, 128, 76, 69, 65, 198, - 76, 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, 82, 128, 76, 69, 65, - 196, 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, - 65, 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, - 87, 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, 65, 85, 75, 65, 218, - 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, 128, 76, 65, 84, 69, - 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, - 69, 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, 69, 128, 76, 65, - 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, 76, 65, 80, 128, - 76, 65, 207, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, 71, - 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, 77, - 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, 197, - 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, 193, - 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, 75, - 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, 65, - 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 71, 85, 83, - 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, 76, - 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, 65, - 69, 128, 76, 65, 68, 217, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, 76, - 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, 66, - 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, 65, - 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, 76, - 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, 65, 128, 76, 48, - 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, + 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, 128, 77, 65, 75, + 83, 85, 82, 193, 77, 65, 73, 90, 69, 128, 77, 65, 73, 89, 65, 77, 79, 75, + 128, 77, 65, 73, 84, 65, 73, 75, 72, 85, 128, 77, 65, 73, 82, 85, 128, + 77, 65, 73, 77, 85, 65, 78, 128, 77, 65, 73, 77, 65, 76, 65, 73, 128, 77, + 65, 73, 76, 66, 79, 216, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, 73, 68, + 69, 78, 128, 77, 65, 73, 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, + 72, 65, 128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, + 65, 75, 72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, + 128, 77, 65, 71, 78, 73, 70, 89, 73, 78, 199, 77, 65, 69, 83, 73, 128, + 77, 65, 69, 78, 89, 73, 128, 77, 65, 69, 78, 74, 69, 84, 128, 77, 65, 69, + 77, 86, 69, 85, 88, 128, 77, 65, 69, 77, 75, 80, 69, 78, 128, 77, 65, 69, + 77, 71, 66, 73, 69, 69, 128, 77, 65, 69, 77, 66, 71, 66, 73, 69, 69, 128, + 77, 65, 69, 77, 66, 65, 128, 77, 65, 69, 77, 128, 77, 65, 69, 76, 69, 69, + 128, 77, 65, 69, 75, 69, 85, 80, 128, 77, 65, 68, 89, 65, 128, 77, 65, + 68, 85, 128, 77, 65, 68, 68, 65, 200, 77, 65, 68, 68, 65, 128, 77, 65, + 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, 71, 82, 65, 86, 69, 128, 77, 65, + 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, + 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, 79, 78, 128, 77, 65, 67, 82, 79, + 206, 77, 65, 67, 72, 73, 78, 69, 128, 77, 65, 65, 73, 128, 77, 65, 65, + 128, 77, 65, 50, 128, 77, 48, 52, 52, 128, 77, 48, 52, 51, 128, 77, 48, + 52, 50, 128, 77, 48, 52, 49, 128, 77, 48, 52, 48, 65, 128, 77, 48, 52, + 48, 128, 77, 48, 51, 57, 128, 77, 48, 51, 56, 128, 77, 48, 51, 55, 128, + 77, 48, 51, 54, 128, 77, 48, 51, 53, 128, 77, 48, 51, 52, 128, 77, 48, + 51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, + 51, 50, 128, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, + 48, 128, 77, 48, 50, 57, 128, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, + 128, 77, 48, 50, 55, 128, 77, 48, 50, 54, 128, 77, 48, 50, 53, 128, 77, + 48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, 51, 128, 77, 48, + 50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, 49, 128, 77, 48, 50, + 48, 128, 77, 48, 49, 57, 128, 77, 48, 49, 56, 128, 77, 48, 49, 55, 65, + 128, 77, 48, 49, 55, 128, 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, + 77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 52, 128, 77, + 48, 49, 51, 128, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, + 48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, + 77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, + 128, 77, 48, 49, 50, 128, 77, 48, 49, 49, 128, 77, 48, 49, 48, 65, 128, + 77, 48, 49, 48, 128, 77, 48, 48, 57, 128, 77, 48, 48, 56, 128, 77, 48, + 48, 55, 128, 77, 48, 48, 54, 128, 77, 48, 48, 53, 128, 77, 48, 48, 52, + 128, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 50, 128, + 77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, + 76, 218, 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, + 88, 128, 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 68, 73, 65, 206, 76, + 89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, 128, + 76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, 65, + 128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85, 85, 128, 76, 85, 84, 128, + 76, 85, 82, 88, 128, 76, 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, 79, + 84, 128, 76, 85, 79, 80, 128, 76, 85, 79, 128, 76, 85, 78, 71, 83, 73, + 128, 76, 85, 78, 65, 84, 197, 76, 85, 205, 76, 85, 76, 128, 76, 85, 73, + 83, 128, 76, 85, 72, 85, 82, 128, 76, 85, 72, 128, 76, 85, 71, 71, 65, + 71, 69, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, 65, 204, 76, 85, 69, + 128, 76, 85, 65, 69, 80, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, + 178, 76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, + 79, 88, 128, 76, 79, 87, 69, 82, 69, 196, 76, 79, 87, 69, 210, 76, 79, + 87, 45, 185, 76, 79, 86, 197, 76, 79, 85, 82, 69, 128, 76, 79, 85, 68, + 83, 80, 69, 65, 75, 69, 82, 128, 76, 79, 85, 68, 76, 217, 76, 79, 84, 85, + 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 89, 128, 76, 79, 82, 82, 65, + 73, 78, 69, 128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, + 76, 79, 79, 80, 128, 76, 79, 79, 78, 128, 76, 79, 79, 203, 76, 79, 79, + 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, 65, 128, 76, 79, 78, + 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 89, 82, 128, 76, + 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, 204, 76, 79, 78, 71, + 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, 78, 71, 45, 66, 82, + 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, 45, 66, 82, 65, 78, + 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, 45, 66, 82, 65, 78, + 67, 72, 45, 65, 210, 76, 79, 77, 77, 65, 69, 128, 76, 79, 77, 128, 76, + 79, 205, 76, 79, 76, 76, 73, 80, 79, 80, 128, 76, 79, 76, 76, 128, 76, + 79, 71, 210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, + 205, 76, 79, 71, 128, 76, 79, 68, 69, 83, 84, 79, 78, 69, 128, 76, 79, + 67, 79, 77, 79, 84, 73, 86, 69, 128, 76, 79, 67, 203, 76, 79, 67, 65, 84, + 73, 86, 69, 128, 76, 79, 67, 65, 84, 73, 79, 206, 76, 79, 65, 128, 76, + 78, 128, 76, 77, 128, 76, 76, 85, 85, 128, 76, 76, 79, 79, 128, 76, 76, + 76, 85, 85, 128, 76, 76, 76, 85, 128, 76, 76, 76, 79, 79, 128, 76, 76, + 76, 79, 128, 76, 76, 76, 73, 73, 128, 76, 76, 76, 73, 128, 76, 76, 76, + 69, 69, 128, 76, 76, 76, 69, 128, 76, 76, 76, 65, 85, 128, 76, 76, 76, + 65, 73, 128, 76, 76, 76, 65, 65, 128, 76, 76, 76, 65, 128, 76, 76, 76, + 128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, + 73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, + 76, 197, 76, 73, 84, 84, 69, 210, 76, 73, 84, 82, 193, 76, 73, 84, 128, + 76, 73, 83, 213, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 81, + 128, 76, 73, 80, 83, 84, 73, 67, 75, 128, 76, 73, 78, 75, 73, 78, 199, + 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, 128, 76, 73, 78, 69, 83, 128, + 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, 57, 128, 76, 73, 78, 69, 45, 55, + 128, 76, 73, 78, 69, 45, 51, 128, 76, 73, 78, 69, 45, 49, 128, 76, 73, + 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, 50, 128, 76, 73, 77, 77, 85, + 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, 84, 69, 196, 76, 73, 77, 73, + 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, 84, 128, 76, 73, 77, 69, + 128, 76, 73, 77, 66, 213, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, + 128, 76, 73, 76, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, + 71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, + 69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, + 76, 73, 69, 69, 128, 76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, + 65, 128, 76, 73, 66, 69, 82, 84, 89, 128, 76, 73, 65, 66, 73, 76, 73, 84, + 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, 89, 65, 78, 73, 128, 76, + 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, 76, 69, 90, 72, 128, 76, + 69, 88, 128, 76, 69, 86, 69, 204, 76, 69, 85, 77, 128, 76, 69, 85, 65, + 69, 80, 128, 76, 69, 85, 65, 69, 77, 128, 76, 69, 84, 84, 69, 82, 83, + 128, 76, 69, 84, 84, 69, 82, 128, 76, 69, 212, 76, 69, 83, 83, 69, 210, + 76, 69, 83, 83, 45, 84, 72, 65, 78, 128, 76, 69, 83, 83, 45, 84, 72, 65, + 206, 76, 69, 80, 128, 76, 69, 79, 80, 65, 82, 68, 128, 76, 69, 79, 128, + 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, 76, 69, + 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 200, 76, 69, 78, + 71, 65, 128, 76, 69, 78, 71, 193, 76, 69, 77, 79, 78, 128, 76, 69, 77, + 79, 73, 128, 76, 69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, + 76, 69, 73, 77, 77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, + 128, 76, 69, 71, 73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, + 71, 128, 76, 69, 70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, + 79, 45, 82, 73, 71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, + 70, 84, 45, 83, 73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, + 76, 69, 70, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, + 72, 65, 78, 68, 69, 196, 76, 69, 70, 84, 45, 72, 65, 78, 196, 76, 69, 70, + 84, 45, 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, 69, 82, 65, + 69, 87, 65, 128, 76, 69, 69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, + 68, 71, 69, 82, 128, 76, 69, 65, 84, 72, 69, 82, 128, 76, 69, 65, 70, + 128, 76, 69, 65, 198, 76, 69, 65, 68, 73, 78, 199, 76, 69, 65, 68, 69, + 82, 128, 76, 69, 65, 196, 76, 68, 65, 78, 128, 76, 68, 50, 128, 76, 67, + 201, 76, 67, 197, 76, 65, 90, 217, 76, 65, 89, 65, 78, 78, 65, 128, 76, + 65, 88, 128, 76, 65, 87, 128, 76, 65, 215, 76, 65, 85, 76, 65, 128, 76, + 65, 85, 75, 65, 218, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, 84, 73, 75, + 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, 76, 65, 83, 212, 76, + 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, 82, 71, 69, 210, 76, 65, 82, 71, + 69, 128, 76, 65, 82, 71, 197, 76, 65, 81, 128, 76, 65, 80, 65, 81, 128, + 76, 65, 80, 128, 76, 65, 78, 84, 69, 82, 78, 128, 76, 65, 78, 71, 85, 65, + 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, 76, 65, + 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, 65, 77, + 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, 66, 68, + 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, 76, 65, + 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, 65, 76, + 65, 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, 71, 85, + 83, 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, 65, 210, + 76, 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, 128, 76, + 65, 69, 128, 76, 65, 68, 217, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, + 76, 65, 66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, + 66, 73, 65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, + 65, 65, 78, 65, 69, 128, 76, 65, 65, 78, 128, 76, 65, 65, 77, 85, 128, + 76, 65, 65, 77, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, 65, 128, 76, + 48, 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, 72, 65, 80, 69, 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, 89, 79, 128, 75, 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, 69, 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 65, 65, 128, 75, 89, 65, 128, 75, 88, 87, @@ -2075,1102 +2094,1107 @@ 85, 79, 208, 75, 85, 79, 77, 128, 75, 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, 73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 69, 84, 128, 75, 85, 55, 128, 75, 85, 52, 128, 75, 85, 180, - 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, 65, 128, 75, 83, - 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, 79, - 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79, - 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, - 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80, - 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128, - 75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75, - 80, 65, 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, - 128, 75, 79, 84, 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79, 82, 79, - 78, 73, 83, 128, 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73, 195, - 75, 79, 81, 78, 68, 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79, 80, - 128, 75, 79, 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, - 79, 128, 75, 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, 77, - 193, 75, 79, 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, 66, - 85, 86, 193, 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75, 128, - 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71, - 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, 79, - 65, 128, 75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, - 73, 70, 69, 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76, 73, - 84, 79, 78, 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, - 75, 76, 65, 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, 75, - 73, 128, 75, 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, 75, - 128, 75, 74, 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85, 84, - 128, 75, 73, 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, - 75, 128, 75, 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, 89, - 69, 79, 75, 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, 78, - 73, 69, 85, 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, 75, - 72, 128, 75, 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, 75, - 73, 89, 69, 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, 83, - 73, 78, 199, 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, - 53, 128, 75, 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, - 76, 128, 75, 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, - 69, 84, 79, 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, - 73, 82, 79, 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, - 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 68, - 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, - 73, 128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, - 73, 69, 69, 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, - 73, 67, 75, 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, 85, - 69, 78, 45, 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 65, 84, 128, - 75, 72, 79, 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 128, 75, 72, 79, - 77, 85, 84, 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, 73, 84, 128, 75, - 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, 79, 128, 75, 72, - 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, 128, 75, 72, 69, - 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 75, - 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, - 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, 84, 201, 75, 72, - 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, - 128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, - 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, 65, 82, 68, - 128, 75, 69, 88, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, 69, 85, 83, - 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, - 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, - 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, - 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, - 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, - 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, - 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, - 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, - 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, - 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, - 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, - 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 83, 85, 128, 75, - 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, 75, 67, 65, 76, 128, - 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, 65, 128, - 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, 65, 86, - 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, 65, 84, - 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, 75, 65, 84, 72, 65, 75, - 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, 65, 84, 65, 86, 193, - 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, 71, 65, 78, 193, 75, - 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, 84, 65, 206, 75, 65, - 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, 75, 65, 76, 128, 75, - 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, 201, 75, 65, 82, 83, 72, - 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, 128, 75, 65, 82, 207, 75, - 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, 75, 65, 82, 65, 78, - 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, 71, 80, 73, 69, 85, - 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, 85, 76, 128, 75, 65, - 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, 128, 75, 65, 80, 89, - 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, 80, 65, 128, 75, 65, - 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, 128, 75, 65, 80, 65, - 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, 65, 74, 193, 75, 65, 78, - 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, 79, 128, 75, 65, 77, 52, - 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, 65, 75, 79, 128, 75, 65, - 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, 203, 75, 65, 73, 82, - 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70, - 128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, - 128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, - 68, 128, 75, 65, 66, 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65, - 65, 70, 85, 128, 75, 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75, - 48, 48, 56, 128, 75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, - 53, 128, 75, 48, 48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, - 75, 48, 48, 49, 128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, - 74, 85, 80, 73, 84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, - 128, 74, 85, 78, 79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, - 85, 69, 85, 73, 128, 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, - 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 79, 85, - 211, 74, 79, 89, 128, 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, - 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 69, 68, - 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, 74, 74, - 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, - 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, - 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, - 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, - 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, - 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, - 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, - 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, - 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, 128, - 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, 65, - 77, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, - 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, - 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, - 69, 77, 128, 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128, - 74, 65, 86, 73, 89, 65, 78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, - 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, 89, 128, - 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, 74, 65, - 68, 69, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, 78, 84, 69, 82, 78, 128, - 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 202, - 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, 84, 83, 193, 73, 90, 72, - 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, 69, 75, 128, 73, 89, 65, - 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, 211, 73, 84, - 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, - 128, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 69, 78, 45, 73, 83, - 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, 76, 65, - 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, 78, 78, - 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, 210, 73, 82, 79, 78, - 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, 196, 73, - 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, 72, 65, - 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, 82, 84, - 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, 83, - 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, 73, - 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, 69, - 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, - 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, 69, - 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, - 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, 82, - 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, 78, 84, 69, 82, - 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, - 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, - 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, 69, 71, 82, 65, - 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, - 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 69, 82, 84, 73, 79, - 206, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, - 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, - 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, - 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 73, 128, 73, 78, - 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 71, 87, 65, - 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, - 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, - 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, - 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, - 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, - 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, - 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, - 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, - 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, - 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, 73, 78, 45, - 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, - 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, - 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 73, 83, 69, 79, 211, 73, 77, - 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, - 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, - 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, - 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, - 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, - 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, - 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, - 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, - 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, - 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, - 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, - 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, - 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, - 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, - 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, - 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, - 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, - 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, - 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, - 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, - 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, - 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, - 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, - 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, - 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, - 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, - 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, - 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, - 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, 68, 69, - 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, - 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 67, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, - 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 51, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, - 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 65, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, - 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 49, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, - 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 56, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, - 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 70, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, - 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 54, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, - 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 68, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, - 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 52, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, - 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 66, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, - 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 50, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, - 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 57, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, - 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 48, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, - 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 55, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, - 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 69, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, - 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, - 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, - 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 53, 128, - 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, 73, 68, - 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, 69, 79, - 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, 71, 82, - 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, - 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, 67, 65, - 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, 72, 79, - 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, 83, - 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, 67, - 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, + 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, 83, 85, 85, 128, 75, + 83, 83, 85, 128, 75, 83, 83, 79, 79, 128, 75, 83, 83, 79, 128, 75, 83, + 83, 73, 73, 128, 75, 83, 83, 73, 128, 75, 83, 83, 69, 69, 128, 75, 83, + 83, 69, 128, 75, 83, 83, 65, 85, 128, 75, 83, 83, 65, 73, 128, 75, 83, + 83, 65, 65, 128, 75, 83, 83, 65, 128, 75, 83, 83, 128, 75, 83, 73, 128, + 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, 82, 65, 84, 73, 77, 79, 89, 80, + 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, 84, 73, 77, 79, 75, 79, 85, 70, + 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, 77, 65, 84, 65, 128, 75, 82, 65, + 84, 73, 77, 193, 75, 80, 85, 128, 75, 80, 79, 81, 128, 75, 80, 79, 79, + 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 85, 88, 128, 75, 80, + 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 82, 65, 81, 128, 75, 80, 65, + 78, 128, 75, 80, 65, 128, 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, + 79, 84, 79, 128, 75, 79, 82, 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, + 128, 75, 79, 82, 69, 65, 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 81, + 78, 68, 79, 78, 128, 75, 79, 80, 80, 65, 128, 75, 79, 80, 128, 75, 79, + 79, 80, 79, 128, 75, 79, 79, 77, 85, 85, 84, 128, 75, 79, 79, 128, 75, + 79, 78, 84, 69, 86, 77, 65, 128, 75, 79, 78, 84, 69, 86, 77, 193, 75, 79, + 77, 201, 75, 79, 77, 66, 85, 86, 65, 128, 75, 79, 77, 66, 85, 86, 193, + 75, 79, 77, 66, 213, 75, 79, 75, 79, 128, 75, 79, 75, 128, 75, 79, 203, + 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, 128, 75, 79, 71, 72, 79, 77, + 128, 75, 79, 69, 84, 128, 75, 79, 65, 76, 65, 128, 75, 79, 65, 128, 75, + 78, 73, 71, 72, 84, 128, 75, 78, 73, 71, 72, 212, 75, 78, 73, 70, 69, + 128, 75, 78, 73, 70, 197, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, + 128, 75, 76, 65, 83, 77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, + 128, 75, 76, 128, 75, 75, 85, 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, + 75, 69, 69, 128, 75, 75, 69, 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, + 69, 128, 75, 73, 89, 69, 79, 75, 45, 84, 73, 75, 69, 85, 84, 128, 75, 73, + 89, 69, 79, 75, 45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 75, + 73, 89, 69, 79, 75, 45, 82, 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, 75, + 45, 80, 73, 69, 85, 80, 128, 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, + 78, 128, 75, 73, 89, 69, 79, 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, + 73, 89, 69, 79, 75, 45, 67, 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, + 79, 203, 75, 73, 88, 128, 75, 73, 84, 128, 75, 73, 83, 83, 73, 78, 199, + 75, 73, 83, 83, 128, 75, 73, 83, 211, 75, 73, 83, 73, 77, 53, 128, 75, + 73, 83, 73, 77, 181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, + 73, 82, 79, 87, 65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, + 82, 85, 128, 75, 73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, + 128, 75, 73, 82, 71, 72, 73, 218, 75, 73, 81, 128, 75, 73, 80, 128, 75, + 73, 208, 75, 73, 78, 83, 72, 73, 80, 128, 75, 73, 78, 68, 69, 82, 71, 65, + 82, 84, 69, 78, 128, 75, 73, 77, 79, 78, 79, 128, 75, 73, 73, 128, 75, + 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, 73, 69, 69, + 77, 128, 75, 73, 69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, 67, 75, + 128, 75, 72, 90, 128, 75, 72, 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, + 76, 85, 197, 75, 72, 85, 69, 206, 75, 72, 85, 65, 84, 128, 75, 72, 79, + 85, 128, 75, 72, 79, 212, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, + 128, 75, 72, 79, 128, 75, 72, 207, 75, 72, 73, 84, 128, 75, 72, 73, 78, + 89, 65, 128, 75, 72, 73, 69, 85, 75, 200, 75, 72, 73, 128, 75, 72, 72, + 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, 72, 128, 75, 72, 69, 73, + 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, 72, 65, 82, 79, 83, 72, + 84, 72, 201, 75, 72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, + 78, 199, 75, 72, 65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, + 84, 201, 75, 72, 65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, + 75, 72, 65, 72, 128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, + 75, 69, 89, 67, 65, 80, 128, 75, 69, 89, 67, 65, 208, 75, 69, 89, 66, 79, + 65, 82, 68, 128, 75, 69, 88, 128, 75, 69, 85, 89, 69, 85, 88, 128, 75, + 69, 85, 83, 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, + 75, 69, 85, 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, + 75, 69, 85, 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, + 75, 69, 85, 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, + 128, 75, 69, 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, + 128, 75, 69, 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, + 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, + 65, 84, 128, 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, + 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, + 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, + 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, + 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 83, 85, + 128, 75, 69, 69, 80, 73, 78, 199, 75, 69, 69, 78, 71, 128, 75, 67, 65, + 76, 128, 75, 66, 128, 75, 65, 90, 65, 75, 200, 75, 65, 89, 65, 78, 78, + 65, 128, 75, 65, 89, 65, 200, 75, 65, 88, 128, 75, 65, 87, 73, 128, 75, + 65, 86, 89, 75, 65, 128, 75, 65, 85, 78, 65, 128, 75, 65, 85, 206, 75, + 65, 85, 128, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, 83, 84, 73, 128, + 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, 77, 65, 128, 75, + 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, 72, 73, 82, 65, + 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, 65, 83, 82, 65, + 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, 193, 75, 65, 83, + 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, 72, 77, 73, 82, + 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, 82, 73, 73, + 128, 75, 65, 82, 207, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, + 128, 75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, + 78, 71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, + 69, 85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, + 72, 128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, + 80, 80, 65, 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, + 72, 128, 75, 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 78, 84, + 65, 74, 193, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, 78, 65, 75, + 79, 128, 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, 77, 128, 75, + 65, 75, 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, + 65, 203, 75, 65, 73, 84, 72, 201, 75, 65, 73, 82, 73, 128, 75, 65, 73, + 128, 75, 65, 201, 75, 65, 70, 65, 128, 75, 65, 70, 128, 75, 65, 198, 75, + 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, 128, 75, 65, 68, 51, + 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, 68, 128, 75, 65, 66, + 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, 75, + 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75, 48, 48, 56, 128, 75, + 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, 48, + 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, 128, + 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 80, 73, 84, + 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, 79, + 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, 85, 69, 85, 73, 128, + 74, 85, 68, 85, 76, 128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, + 83, 80, 65, 78, 73, 83, 200, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, + 74, 79, 86, 69, 128, 74, 79, 212, 74, 79, 78, 71, 128, 74, 79, 78, 193, + 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, 69, 68, 128, 74, 79, 73, 78, + 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, 74, 74, 89, 84, 128, 74, 74, + 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, 88, 128, 74, 74, 85, 84, 128, + 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, 128, 74, 74, 85, 80, 128, 74, + 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, 128, 74, 74, 85, 79, 128, 74, + 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, 79, 84, 128, 74, 74, 79, 80, + 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, 74, 74, 73, 84, 128, 74, 74, + 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, 74, 73, 69, 84, 128, 74, 74, + 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, 74, 73, 128, 74, 74, 69, 69, + 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, 73, 76, 128, 74, 73, 73, 128, + 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, 128, 74, 72, + 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, 65, 77, 128, + 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, 76, 69, 77, + 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, 128, 74, 69, + 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, 69, 69, 77, + 128, 74, 69, 65, 78, 83, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, + 86, 73, 89, 65, 78, 73, 128, 74, 65, 85, 128, 74, 65, 82, 128, 74, 65, + 80, 65, 78, 69, 83, 197, 74, 65, 80, 65, 78, 128, 74, 65, 78, 85, 65, 82, + 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, 72, 79, 85, 128, + 74, 65, 73, 128, 74, 65, 68, 69, 128, 74, 65, 67, 75, 45, 79, 45, 76, 65, + 78, 84, 69, 82, 78, 128, 74, 65, 67, 203, 74, 45, 83, 73, 77, 80, 76, 73, + 70, 73, 69, 196, 202, 73, 90, 72, 73, 84, 83, 65, 128, 73, 90, 72, 73, + 84, 83, 193, 73, 90, 72, 69, 128, 73, 90, 65, 75, 65, 89, 193, 73, 89, + 69, 75, 128, 73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, + 128, 73, 84, 211, 73, 84, 69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, + 128, 73, 83, 83, 72, 65, 82, 128, 73, 83, 79, 78, 128, 73, 83, 79, 206, + 73, 83, 69, 78, 45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, + 45, 80, 73, 76, 76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, + 85, 85, 89, 65, 78, 78, 65, 128, 73, 82, 79, 78, 45, 67, 79, 80, 80, 69, + 210, 73, 82, 79, 78, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, + 65, 84, 69, 196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, + 73, 79, 68, 72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, + 78, 86, 69, 82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, + 86, 69, 82, 83, 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, + 76, 65, 66, 73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, + 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, + 69, 67, 84, 73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, + 73, 78, 84, 69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, + 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, + 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, + 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, + 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, + 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, + 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, + 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 69, 82, + 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, + 84, 73, 79, 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, + 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, + 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 73, 128, + 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 71, + 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, + 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, + 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, + 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, + 68, 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, + 206, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, + 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, + 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, 77, 80, 76, + 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, + 78, 199, 73, 78, 67, 72, 128, 73, 78, 66, 79, 216, 73, 78, 65, 80, 128, + 73, 78, 45, 65, 76, 65, 70, 128, 73, 77, 80, 69, 82, 73, 65, 204, 73, 77, + 80, 69, 82, 70, 69, 67, 84, 85, 205, 73, 77, 80, 69, 82, 70, 69, 67, 84, + 65, 128, 73, 77, 80, 69, 82, 70, 69, 67, 84, 193, 73, 77, 73, 83, 69, 79, + 211, 73, 77, 73, 78, 51, 128, 73, 77, 73, 78, 128, 73, 77, 73, 206, 73, + 77, 73, 70, 84, 72, 79, 82, 79, 78, 128, 73, 77, 73, 70, 84, 72, 79, 82, + 65, 128, 73, 77, 73, 70, 79, 78, 79, 78, 128, 73, 77, 73, 68, 73, 65, 82, + 71, 79, 78, 128, 73, 77, 65, 71, 197, 73, 76, 85, 89, 65, 78, 78, 65, + 128, 73, 76, 85, 89, 128, 73, 76, 85, 85, 89, 65, 78, 78, 65, 128, 73, + 76, 85, 84, 128, 73, 76, 73, 77, 77, 85, 52, 128, 73, 76, 73, 77, 77, 85, + 51, 128, 73, 76, 73, 77, 77, 85, 128, 73, 76, 73, 77, 77, 213, 73, 76, + 50, 128, 73, 75, 65, 82, 65, 128, 73, 75, 65, 82, 193, 73, 74, 128, 73, + 73, 89, 65, 78, 78, 65, 128, 73, 71, 73, 128, 73, 71, 201, 73, 71, 71, + 87, 83, 128, 73, 70, 73, 78, 128, 73, 69, 85, 78, 71, 45, 84, 73, 75, 69, + 85, 84, 128, 73, 69, 85, 78, 71, 45, 84, 72, 73, 69, 85, 84, 72, 128, 73, + 69, 85, 78, 71, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, 128, 73, + 69, 85, 78, 71, 45, 82, 73, 69, 85, 76, 128, 73, 69, 85, 78, 71, 45, 80, + 73, 69, 85, 80, 128, 73, 69, 85, 78, 71, 45, 80, 72, 73, 69, 85, 80, 72, + 128, 73, 69, 85, 78, 71, 45, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, + 71, 45, 75, 72, 73, 69, 85, 75, 72, 128, 73, 69, 85, 78, 71, 45, 67, 73, + 69, 85, 67, 128, 73, 69, 85, 78, 71, 45, 67, 72, 73, 69, 85, 67, 72, 128, + 73, 69, 85, 78, 199, 73, 68, 76, 69, 128, 73, 68, 73, 77, 128, 73, 68, + 73, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 65, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 66, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 53, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 70, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 51, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 57, 48, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 56, 68, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 56, 67, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 57, 69, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 68, 52, 50, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 65, 55, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 55, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 55, 53, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, 49, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 69, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 55, 48, 56, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 54, 50, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 53, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 53, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 54, 53, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 53, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 51, 48, 55, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 57, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 54, 50, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 54, 50, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 70, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 68, 69, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 56, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 66, 53, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 53, 66, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 52, 48, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 53, 50, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 55, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, + 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 50, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, 73, + 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, + 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, + 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, + 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, + 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, + 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, + 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, + 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, + 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, + 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, + 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, + 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, + 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, + 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, + 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, + 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, + 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, + 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, + 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, + 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, 128, + 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, 68, + 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, 79, + 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, 82, + 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, 73, + 67, 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, 67, + 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, 79, + 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, 73, + 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, 65, 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, 73, 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, 48, 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, 48, @@ -3253,801 +3277,802 @@ 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, 193, 72, 79, 79, 82, 85, 128, 72, 79, 79, 80, - 128, 72, 79, 79, 78, 128, 72, 79, 78, 69, 89, 66, 69, 69, 128, 72, 79, - 78, 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, 67, 128, 72, 79, 77, 79, - 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, 72, 79, 76, 68, 73, 78, - 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, 205, 72, 79, 75, 65, 128, - 72, 79, 73, 128, 72, 79, 67, 72, 79, 128, 72, 78, 85, 84, 128, 72, 78, - 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 79, 88, 128, 72, 78, 79, - 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, 72, 78, 73, 84, 128, - 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, 78, 73, 69, 84, 128, - 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, 78, 73, 128, 72, 78, - 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, 72, 78, 65, 88, 128, - 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, 78, 65, 128, 72, 77, 89, - 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, 82, 128, 72, 77, 89, 80, - 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, 77, 85, 84, 128, 72, 77, - 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, 85, 80, 128, 72, 77, 85, - 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, 85, 79, 128, 72, 77, 85, - 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, 72, 77, 79, 80, 128, 72, - 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, 84, 128, 72, 77, 73, 80, - 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, 80, 128, 72, 77, 73, 69, - 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, 65, 88, 128, 72, 77, 65, - 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, 76, 89, 88, 128, 72, - 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, 89, 82, 128, 72, 76, - 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, 72, 76, 85, 84, 128, - 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, 76, 85, 80, 128, 72, - 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, 85, 79, 128, 72, - 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, 128, 72, 76, 79, 128, - 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, 73, 80, 128, 72, 76, - 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, 73, 69, 128, 72, 76, - 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, 72, 76, 69, 128, 72, - 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, 128, 72, 76, 65, - 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 83, 84, 79, 82, 73, 195, - 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 83, 80, 69, 69, 196, 72, 73, - 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, 185, 72, 73, 71, 72, 45, - 72, 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, 83, - 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, 73, - 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, 73, - 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, 73, - 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, 69, - 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, 73, 83, 67, 85, 83, 128, 72, - 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, 73, 128, 72, 72, 69, 69, 128, - 72, 72, 69, 128, 72, 72, 65, 65, 128, 72, 71, 128, 72, 69, 88, 73, 70, - 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, 205, 72, 69, 88, 65, 71, 79, 78, - 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, 82, 77, - 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, 69, 82, - 77, 69, 83, 128, 72, 69, 82, 66, 128, 72, 69, 82, 65, 69, 85, 205, 72, - 69, 78, 71, 128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, - 69, 84, 128, 72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 76, 73, - 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, 85, 84, 65, 65, 82, 85, 128, 72, - 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, 65, 86, 69, 78, - 76, 217, 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, 206, 72, 69, - 65, 82, 84, 83, 128, 72, 69, 65, 82, 84, 45, 83, 72, 65, 80, 69, 196, 72, - 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 82, 45, 78, 79, 45, - 69, 86, 73, 204, 72, 69, 65, 68, 83, 84, 82, 79, 75, 69, 128, 72, 69, 65, - 68, 83, 84, 79, 78, 197, 72, 69, 65, 68, 80, 72, 79, 78, 69, 128, 72, 69, - 65, 68, 73, 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, - 66, 65, 83, 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128, - 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128, - 72, 65, 84, 69, 128, 72, 65, 84, 67, 72, 73, 78, 199, 72, 65, 84, 65, - 198, 72, 65, 83, 69, 210, 72, 65, 83, 65, 78, 84, 65, 128, 72, 65, 82, - 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, 79, 206, 72, 65, 82, 77, 79, 78, - 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, 206, 72, 65, 82, 68, 78, 69, 83, - 83, 128, 72, 65, 82, 196, 72, 65, 80, 80, 217, 72, 65, 78, 85, 78, 79, - 207, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, 128, 72, 65, - 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 76, 69, - 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, 65, 78, 68, 128, 72, 65, 78, - 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 83, 84, 69, - 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, 77, 77, 69, 210, 72, 65, 77, - 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, 65, 128, 72, 65, 76, 79, - 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, - 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 67, 85, 84, - 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65, 218, 72, 65, 71, 76, 128, - 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, - 71, 204, 72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, - 65, 45, 72, 65, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, - 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, - 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, - 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, - 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, - 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, - 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, - 65, 65, 128, 71, 87, 65, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, - 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, - 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 205, 71, 85, - 76, 128, 71, 85, 73, 84, 65, 82, 128, 71, 85, 199, 71, 85, 69, 72, 128, - 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 83, - 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, 128, 71, 85, - 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, 178, 71, 84, 69, 210, 71, 83, - 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 87, 73, 78, 199, - 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, - 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, 82, 69, 71, 79, 82, 73, 65, - 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, 128, 71, - 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, 84, 69, - 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, 65, - 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, 65, - 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, 71, - 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, 128, - 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, 69, 77, - 197, 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 77, 77, 193, 71, 82, 65, - 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, 206, 71, 82, 65, 67, 69, - 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, 72, 77, 73, - 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, 79, 84, 69, 82, 73, - 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 71, 79, - 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, 71, 79, - 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, - 79, 73, 78, 199, 71, 79, 66, 76, 73, 78, 128, 71, 79, 65, 76, 128, 71, - 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, 128, 71, 78, 65, 86, - 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, 199, 71, 76, 79, 84, 84, - 65, 204, 71, 76, 79, 66, 197, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, - 76, 69, 73, 67, 200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, - 71, 74, 69, 128, 71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, - 71, 73, 83, 200, 71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, - 128, 71, 73, 82, 76, 128, 71, 73, 82, 51, 128, 71, 73, 82, 179, 71, 73, - 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, 128, 71, 73, 78, 73, 73, 128, - 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, 204, 71, 73, 77, 128, 71, 73, - 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, 68, 73, 77, 128, 71, 73, 66, - 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, - 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, - 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, - 84, 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72, - 69, 85, 88, 128, 71, 72, 69, 85, 78, 128, 71, 72, 69, 85, 71, 72, 69, 85, - 65, 69, 77, 128, 71, 72, 69, 85, 71, 72, 69, 78, 128, 71, 72, 69, 85, 65, - 69, 82, 65, 69, 128, 71, 72, 69, 85, 65, 69, 71, 72, 69, 85, 65, 69, 128, - 71, 72, 69, 84, 128, 71, 72, 69, 69, 128, 71, 72, 69, 128, 71, 72, 197, - 71, 72, 65, 89, 78, 128, 71, 72, 65, 82, 65, 69, 128, 71, 72, 65, 80, - 128, 71, 72, 65, 78, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, - 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, - 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, 72, 65, 65, 128, 71, 72, - 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, 87, 69, - 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, 88, 128, - 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, 128, 71, - 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, 71, 71, 85, 79, 80, 128, - 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, 71, 79, 84, 128, 71, 71, - 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, 84, 128, 71, 71, 73, 69, - 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, 69, 128, 71, 71, 69, 88, - 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, 71, 71, 65, 88, 128, 71, - 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, 84, 193, 71, 69, 83, 84, - 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, 69, 83, 72, 84, 73, 78, - 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, 128, 71, 69, 82, - 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, 71, 69, 82, 69, 83, - 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, 84, 82, 73, 67, 65, - 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, 69, 78, 84, 76, - 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, 75, 201, 71, - 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, 69, 77, 73, 78, - 65, 84, 73, 79, 206, 71, 69, 205, 71, 69, 68, 79, 76, 65, 128, 71, 69, - 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, 71, - 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, 67, 65, 206, - 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, 66, 69, 85, 88, 128, 71, - 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, 66, 65, 75, 85, 82, 85, 78, - 69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65, - 128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, 128, 71, 65, 85, 78, - 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 65, 84, - 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72, 65, 78, - 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, 79, 78, 128, 71, - 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, 128, 71, 65, 82, 51, - 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71, - 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71, - 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65, - 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, 71, 65, 77, 65, 78, - 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65, 71, 128, 71, - 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, 45, 80, 73, 76, 76, 65, - 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, 71, 65, 196, 71, 65, 66, - 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, 128, 71, 65, 178, 71, 48, - 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, 50, 128, 71, 48, 53, 49, - 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, 71, 48, 52, 56, 128, 71, - 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, 52, 53, 65, 128, 71, 48, - 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, 51, 65, 128, 71, 48, 52, - 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, 128, 71, 48, 52, 48, 128, - 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, 48, 51, 55, 65, 128, 71, - 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, 48, 51, 54, 128, 71, 48, - 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, 51, 128, 71, 48, 51, 50, - 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, 71, 48, 50, 57, 128, 71, - 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, 50, 54, 65, 128, 71, 48, - 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, 52, 128, 71, 48, 50, 51, - 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, 71, 48, 50, 48, 65, 128, - 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, 48, 49, 56, 128, 71, 48, - 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, 53, 128, 71, 48, 49, 52, - 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, 71, 48, 49, 49, 65, 128, - 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, 48, 48, 57, 128, 71, 48, - 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, 48, 55, 65, 128, 71, 48, - 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, 48, 54, 128, 71, 48, 48, - 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, 128, 71, 48, 48, 50, 128, - 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, 84, 128, 70, 89, 80, 128, - 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, 69, 128, 70, 87, 69, 128, - 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 85, 88, 128, 70, 85, 84, 128, - 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, 82, 88, 128, 70, 85, 80, - 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, - 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 74, 73, - 128, 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, 85, 69, 128, 70, 84, 72, - 79, 82, 193, 70, 82, 79, 87, 78, 73, 78, 71, 128, 70, 82, 79, 87, 78, 73, - 78, 199, 70, 82, 79, 87, 78, 128, 70, 82, 79, 78, 84, 45, 84, 73, 76, 84, - 69, 196, 70, 82, 79, 78, 84, 45, 70, 65, 67, 73, 78, 199, 70, 82, 79, - 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, 73, 84, 85, 128, 70, - 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 70, 82, 73, 67, 65, 84, 73, 86, - 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, - 200, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, - 65, 77, 69, 128, 70, 82, 65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, - 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, - 79, 85, 82, 84, 69, 69, 78, 128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, - 85, 82, 45, 84, 72, 73, 82, 84, 89, 128, 70, 79, 85, 82, 45, 83, 84, 82, - 73, 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, - 45, 76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, - 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128, - 70, 79, 82, 84, 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, - 79, 82, 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 75, 69, 196, 70, 79, - 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79, - 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 80, 82, 73, 78, 84, 83, - 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, - 128, 70, 79, 79, 84, 128, 70, 79, 79, 68, 128, 70, 79, 79, 128, 70, 79, - 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, 70, 79, 76, 76, 89, 128, 70, - 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, 69, 82, 128, 70, 79, - 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 77, 128, 70, 76, 89, 128, - 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, 85, 84, 69, 128, 70, 76, - 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, 199, 70, 76, 79, 87, 69, - 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, 76, 79, 82, 69, 84, 84, 69, - 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, 80, 217, 70, 76, 79, 79, - 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, 70, 76, 69, - 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, 76, 69, 85, 82, 45, 68, 69, - 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, - 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, - 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, 70, 76, 65, 71, 45, 52, 128, - 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, 45, 50, 128, 70, 76, 65, 71, - 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, 65, 199, 70, 76, 65, 128, 70, - 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, 82, 205, 70, 73, 88, 128, 70, - 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, 128, 70, 73, 86, 69, 45, 76, 73, - 78, 197, 70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, - 83, 84, 69, 196, 70, 73, 83, 84, 128, 70, 73, 83, 72, 73, 78, 199, 70, - 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, - 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, - 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, 82, 69, 87, 79, 82, 75, 83, - 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, 82, 69, 128, 70, 73, 82, - 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, 78, 71, 69, 82, - 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, 70, 73, 78, 65, - 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, 73, 76, 76, 69, - 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, 197, 70, 73, 73, - 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, 85, 82, 69, 45, 50, - 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, 85, 82, 197, 70, - 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, 70, 84, 217, 70, - 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, 73, 70, 84, 69, 69, - 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, 68, 128, 70, 72, - 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, 69, 85, 88, 128, - 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, 70, 69, 83, 84, 73, 86, 65, 76, - 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 82, 73, 211, 70, 69, 82, 77, - 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, - 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, 78, 197, 70, - 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, 76, 76, 79, 87, - 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213, 70, 69, 72, 128, - 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 68, 128, 70, 69, 69, - 196, 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, - 84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, - 128, 70, 69, 65, 82, 70, 85, 204, 70, 69, 65, 82, 128, 70, 65, 89, 65, - 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, - 69, 128, 70, 65, 84, 72, 69, 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, - 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, - 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, 70, 65, 82, 83, 201, - 70, 65, 81, 128, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, 69, - 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, 70, - 65, 76, 76, 73, 78, 199, 70, 65, 76, 76, 69, 206, 70, 65, 73, 76, 85, 82, - 69, 128, 70, 65, 73, 72, 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, - 128, 70, 65, 67, 84, 79, 82, 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, - 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, - 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, - 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, - 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, - 51, 128, 70, 48, 53, 50, 128, 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, - 66, 128, 70, 48, 53, 49, 65, 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, - 128, 70, 48, 52, 57, 128, 70, 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, - 70, 48, 52, 55, 128, 70, 48, 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, - 48, 52, 53, 65, 128, 70, 48, 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, - 52, 51, 128, 70, 48, 52, 50, 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, - 128, 70, 48, 51, 57, 128, 70, 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, - 70, 48, 51, 55, 65, 128, 70, 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, - 48, 51, 53, 128, 70, 48, 51, 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, - 50, 128, 70, 48, 51, 49, 65, 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, - 128, 70, 48, 50, 57, 128, 70, 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, - 48, 50, 54, 128, 70, 48, 50, 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, - 51, 128, 70, 48, 50, 50, 128, 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, - 128, 70, 48, 50, 48, 128, 70, 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, - 48, 49, 55, 128, 70, 48, 49, 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, - 52, 128, 70, 48, 49, 51, 65, 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, - 128, 70, 48, 49, 49, 128, 70, 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, - 48, 48, 56, 128, 70, 48, 48, 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, - 53, 128, 70, 48, 48, 52, 128, 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, - 70, 48, 48, 49, 65, 128, 70, 48, 48, 49, 128, 69, 90, 200, 69, 90, 69, - 78, 128, 69, 90, 69, 206, 69, 90, 128, 69, 89, 69, 83, 128, 69, 89, 69, - 71, 76, 65, 83, 83, 69, 83, 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, - 69, 89, 65, 78, 78, 65, 128, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, - 84, 82, 73, 65, 204, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, - 65, 45, 72, 73, 71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, - 84, 69, 78, 68, 69, 196, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79, - 128, 69, 88, 207, 69, 88, 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, - 69, 88, 72, 65, 85, 83, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, - 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, - 67, 72, 65, 78, 71, 69, 128, 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, - 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 82, 71, 82, 69, 69, - 206, 69, 86, 69, 78, 73, 78, 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, - 69, 85, 82, 79, 80, 69, 45, 65, 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, - 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, 85, 82, 207, 69, 85, 76, 69, - 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, 128, 69, 85, 45, 69, 85, 128, - 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, 128, 69, 85, 45, 65, 128, 69, - 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, 69, 204, 69, 84, 69, 82, 79, - 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, 69, 83, 85, 75, 85, 85, 68, 79, - 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, 128, 69, 83, 84, 73, 77, 65, 84, - 69, 196, 69, 83, 72, 69, 51, 128, 69, 83, 72, 50, 49, 128, 69, 83, 72, - 178, 69, 83, 72, 49, 54, 128, 69, 83, 67, 65, 80, 69, 128, 69, 83, 45, - 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, 65, 82, 82, 69, 196, 69, 82, 82, - 128, 69, 82, 73, 78, 50, 128, 69, 82, 71, 128, 69, 82, 65, 83, 197, 69, - 81, 85, 73, 86, 65, 76, 69, 78, 212, 69, 81, 85, 73, 68, 128, 69, 81, 85, - 73, 65, 78, 71, 85, 76, 65, 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, - 65, 76, 211, 69, 81, 85, 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, - 69, 80, 83, 73, 76, 79, 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, - 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, - 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 79, - 76, 72, 88, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, - 79, 80, 69, 128, 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, - 65, 84, 73, 79, 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, - 45, 49, 128, 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, - 72, 85, 83, 73, 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, - 128, 69, 78, 84, 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, - 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, 128, 69, 78, 79, 211, 69, 78, - 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, - 78, 69, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, - 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, - 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, - 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, 128, 69, - 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77, - 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73, - 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, - 128, 69, 77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, - 69, 68, 68, 73, 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73, - 83, 128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, - 76, 69, 86, 69, 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, - 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128, - 69, 76, 69, 77, 69, 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, - 76, 69, 67, 84, 82, 73, 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, - 84, 82, 69, 80, 84, 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, - 84, 73, 75, 79, 78, 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, - 69, 73, 83, 128, 69, 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, - 69, 73, 71, 72, 84, 72, 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, - 72, 84, 72, 128, 69, 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, - 69, 69, 206, 69, 73, 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, - 69, 128, 69, 72, 87, 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, - 65, 204, 69, 71, 73, 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, - 65, 128, 69, 69, 75, 65, 65, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, - 128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, - 68, 128, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206, - 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, - 69, 65, 82, 84, 200, 69, 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65, - 77, 72, 65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, - 68, 72, 65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, - 48, 51, 56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, - 52, 65, 128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, - 128, 69, 48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, - 48, 50, 56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, - 50, 54, 128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, - 128, 69, 48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, - 69, 48, 50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, - 49, 55, 65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, - 49, 54, 128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, - 128, 69, 48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, - 48, 48, 57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, - 48, 48, 56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, - 53, 128, 69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, - 69, 48, 48, 49, 128, 69, 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68, - 90, 87, 69, 128, 68, 90, 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128, - 68, 90, 73, 128, 68, 90, 72, 69, 128, 68, 90, 72, 65, 128, 68, 90, 69, - 76, 79, 128, 68, 90, 69, 69, 128, 68, 90, 69, 128, 68, 90, 65, 65, 128, - 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, 68, 89, 207, 68, - 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, 87, 69, 128, 68, - 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, 86, 68, 128, 68, - 86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83, - 72, 69, 78, 78, 65, 128, 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, - 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68, - 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179, - 68, 85, 77, 128, 68, 85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, - 68, 85, 66, 50, 128, 68, 85, 66, 128, 68, 85, 194, 68, 82, 89, 128, 68, - 82, 217, 68, 82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128, - 68, 82, 79, 80, 76, 69, 84, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, - 87, 69, 196, 68, 82, 79, 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, 69, - 128, 68, 82, 73, 86, 197, 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, 68, - 82, 69, 83, 83, 128, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77, - 128, 68, 82, 65, 71, 79, 78, 128, 68, 82, 65, 71, 79, 206, 68, 82, 65, - 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67, - 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82, - 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, 68, 211, 68, 79, 87, 78, 45, 80, - 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, - 68, 79, 85, 71, 72, 78, 85, 84, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, - 66, 76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85, - 66, 76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79, - 84, 84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, - 84, 84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84, - 69, 196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, - 68, 79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, - 83, 45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, - 45, 54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, - 55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 128, - 68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, - 79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, 128, 68, 79, - 84, 83, 45, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, - 79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 53, 56, 128, 68, 79, - 84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, - 79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, - 53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, 45, 52, - 128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 51, 55, 56, - 128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, 84, 83, 45, 51, 54, 56, - 128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 54, - 55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 53, 56, - 128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, - 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, - 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, 68, 79, 84, - 83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 128, 68, 79, 84, 83, - 45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, - 83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, 68, 79, - 84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, - 128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, 68, 79, - 84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, - 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, - 51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, - 128, 68, 79, 84, 83, 45, 50, 56, 128, 68, 79, 84, 83, 45, 50, 55, 56, - 128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, - 128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54, - 55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 53, 56, - 128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, - 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, - 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, - 83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, - 45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, 84, - 83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, - 84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, - 128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79, - 84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, - 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, - 50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, - 51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, - 50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, 68, 79, 84, 83, - 45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, - 79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128, - 68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, - 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, - 45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, - 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, - 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, - 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, - 83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, - 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, - 84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, - 53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, - 83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, - 83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, - 84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45, 50, 128, 68, 79, 84, 83, 45, - 49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 54, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49, - 54, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 53, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49, - 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, - 84, 83, 45, 49, 53, 128, 68, 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84, - 83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, - 84, 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56, - 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, - 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, - 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, - 83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, - 49, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, - 45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45, - 49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, - 45, 49, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, - 79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 128, - 68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, - 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, - 49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, - 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, - 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, - 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, - 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, 68, 79, 84, - 83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, - 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, - 49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, - 45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, - 79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 128, 68, 79, - 84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68, - 79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, - 50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 128, 68, 79, 84, - 83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68, - 79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, - 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, - 45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, - 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, - 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, - 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, - 83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, - 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, - 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, - 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, - 79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, - 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, - 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, - 49, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, - 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, - 84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, - 128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, - 128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 76, - 69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79, 82, 128, 68, 79, 79, 78, - 71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 80, - 72, 73, 78, 128, 68, 79, 76, 76, 83, 128, 68, 79, 76, 76, 65, 210, 68, - 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, 79, 73, 84, - 128, 68, 79, 71, 128, 68, 79, 199, 68, 79, 69, 211, 68, 79, 68, 69, 75, - 65, 84, 65, 128, 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, - 77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, - 128, 68, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, - 79, 128, 68, 76, 73, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, - 128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, - 68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 74, 128, - 68, 73, 90, 90, 217, 68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, - 79, 78, 128, 68, 73, 86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, - 73, 79, 78, 128, 68, 73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, - 82, 128, 68, 73, 86, 73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, - 73, 86, 73, 68, 197, 68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, - 84, 84, 207, 68, 73, 83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, - 73, 78, 71, 85, 73, 83, 72, 128, 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, - 83, 83, 79, 76, 86, 69, 45, 50, 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, - 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, - 83, 73, 77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, - 73, 78, 85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, - 78, 84, 69, 196, 68, 73, 83, 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, - 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, - 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, 80, - 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, 68, - 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, 128, - 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, 78, - 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, - 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, 73, - 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, - 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, 73, 76, 128, 68, - 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, 200, 68, 73, 71, 82, - 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, 193, 68, 73, 71, 82, 65, - 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, 73, 71, 79, 82, 71, 79, - 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, 193, 68, 73, 70, 84, - 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, - 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, - 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, - 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, - 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, 128, 68, 73, 197, 68, 73, - 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, 73, 65, 84, 79, 78, 73, 75, - 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, 65, 77, 79, 78, 68, 83, - 128, 68, 73, 65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, - 73, 65, 77, 69, 84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, - 73, 65, 76, 89, 84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, - 73, 65, 71, 79, 78, 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, - 65, 69, 82, 69, 83, 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, - 128, 68, 73, 65, 69, 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, - 79, 79, 128, 68, 72, 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, - 72, 72, 79, 79, 128, 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, - 72, 69, 69, 128, 68, 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, - 69, 128, 68, 72, 65, 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, - 68, 72, 65, 76, 65, 84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, - 69, 128, 68, 72, 65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200, - 68, 69, 89, 84, 69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, - 88, 73, 65, 128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, - 69, 78, 84, 128, 68, 69, 85, 78, 71, 128, 68, 69, 83, 203, 68, 69, 83, - 73, 71, 78, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, - 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, - 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, - 82, 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, - 82, 84, 77, 69, 78, 212, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, - 84, 73, 83, 84, 82, 217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, - 78, 65, 84, 79, 82, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, - 69, 78, 78, 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, - 78, 65, 82, 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, - 68, 69, 76, 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, - 82, 217, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, - 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, - 73, 67, 73, 79, 85, 211, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, - 197, 68, 69, 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, - 73, 128, 68, 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, - 128, 68, 69, 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, - 128, 68, 69, 69, 80, 76, 89, 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, - 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, - 69, 67, 79, 82, 65, 84, 73, 86, 197, 68, 69, 67, 79, 82, 65, 84, 73, 79, - 78, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, 128, 68, 69, 67, - 73, 77, 65, 204, 68, 69, 67, 73, 68, 85, 79, 85, 211, 68, 69, 67, 69, 77, - 66, 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, - 68, 69, 65, 84, 72, 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, - 68, 85, 88, 128, 68, 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, - 85, 82, 128, 68, 68, 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, - 79, 80, 128, 68, 68, 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, - 68, 68, 79, 84, 128, 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, - 73, 88, 128, 68, 68, 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, - 88, 128, 68, 68, 73, 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, - 68, 68, 72, 85, 128, 68, 68, 72, 79, 128, 68, 68, 72, 73, 128, 68, 68, - 72, 69, 69, 128, 68, 68, 72, 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, - 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, - 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, - 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, 65, 84, - 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, 68, 68, - 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, 128, 68, - 194, 68, 65, 89, 45, 78, 73, 71, 72, 84, 128, 68, 65, 217, 68, 65, 86, - 73, 89, 65, 78, 73, 128, 68, 65, 86, 73, 68, 128, 68, 65, 84, 197, 68, - 65, 83, 73, 65, 128, 68, 65, 83, 72, 69, 196, 68, 65, 83, 72, 128, 68, - 65, 83, 200, 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, 84, 128, 68, 65, - 82, 75, 69, 78, 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, 73, 78, 199, 68, - 65, 82, 203, 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, 52, 128, 68, 65, - 82, 65, 51, 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, 82, 65, 205, 68, - 65, 80, 45, 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, - 66, 85, 79, 206, 68, 65, 80, 45, 66, 69, 201, 68, 65, 208, 68, 65, 78, - 84, 65, 74, 193, 68, 65, 78, 71, 79, 128, 68, 65, 78, 71, 128, 68, 65, - 78, 199, 68, 65, 78, 68, 65, 128, 68, 65, 78, 67, 69, 82, 128, 68, 65, - 77, 80, 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, - 65, 77, 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, - 193, 68, 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65, - 76, 69, 84, 128, 68, 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, - 76, 65, 84, 72, 128, 68, 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128, - 68, 65, 73, 82, 128, 68, 65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85, - 83, 72, 45, 50, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, - 83, 128, 68, 65, 71, 71, 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, - 65, 71, 69, 83, 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, - 71, 65, 218, 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, - 78, 71, 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, - 83, 85, 128, 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, - 48, 54, 55, 71, 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, - 68, 48, 54, 55, 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, - 128, 68, 48, 54, 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, - 68, 48, 54, 53, 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, - 54, 50, 128, 68, 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, - 128, 68, 48, 53, 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, - 48, 53, 53, 128, 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, - 53, 51, 128, 68, 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, - 49, 128, 68, 48, 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, - 48, 71, 128, 68, 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, - 53, 48, 68, 128, 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, - 48, 53, 48, 65, 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, - 52, 56, 65, 128, 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, - 54, 65, 128, 68, 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, - 128, 68, 48, 52, 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, - 48, 52, 48, 128, 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, - 55, 128, 68, 48, 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, - 128, 68, 48, 51, 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, - 48, 51, 49, 65, 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, - 50, 57, 128, 68, 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, - 55, 128, 68, 48, 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, - 68, 48, 50, 51, 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, - 50, 48, 128, 68, 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, - 128, 68, 48, 49, 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, - 48, 49, 51, 128, 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, - 48, 128, 68, 48, 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, - 128, 68, 48, 48, 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, - 48, 48, 52, 128, 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, - 49, 128, 67, 89, 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, - 82, 69, 78, 65, 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, - 67, 89, 80, 69, 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, - 82, 73, 67, 73, 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65, - 128, 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73, - 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128, - 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 212, 67, 85, 83, 84, 79, - 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, 65, 82, 68, - 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, 85, 82, 86, - 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, 85, 82, 82, - 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, 212, 67, - 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, 80, 128, - 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, 85, 205, - 67, 85, 66, 69, 68, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, 73, 76, 76, - 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 128, 67, 82, 89, - 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, 195, 67, - 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 85, 67, 73, - 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 52, 128, 67, - 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, 73, 66, 76, 69, - 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, 79, 87, 78, - 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, 73, 78, - 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, - 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, - 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, - 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 67, 85, 211, - 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 69, 83, 67, 69, 78, 84, - 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, - 69, 65, 84, 73, 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 67, 75, 69, - 82, 128, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, 69, - 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, 67, - 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, - 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67, - 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, - 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, - 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128, - 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82, - 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, - 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, 82, 45, - 50, 128, 67, 79, 80, 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, 79, 76, - 128, 67, 79, 79, 75, 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, 128, 67, - 79, 79, 75, 69, 196, 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, 71, 73, 78, - 199, 67, 79, 78, 86, 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, 84, 82, 79, - 76, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, 82, 73, 69, - 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, 67, 79, 78, - 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, 78, 84, 69, - 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, 84, 73, 79, - 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, 73, 78, 73, - 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, 84, 128, - 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, 84, 65, - 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, - 67, 89, 128, 67, 79, 78, 83, 79, 78, 65, 78, 212, 67, 79, 78, 83, 69, 67, - 85, 84, 73, 86, 197, 67, 79, 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, - 79, 78, 74, 85, 71, 65, 84, 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, - 67, 79, 78, 73, 67, 65, 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, - 78, 71, 82, 65, 84, 85, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 79, - 85, 78, 68, 69, 196, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 70, - 69, 84, 84, 201, 67, 79, 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, - 79, 78, 67, 65, 86, 69, 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, - 67, 79, 77, 80, 85, 84, 69, 82, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, - 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, - 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, - 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, - 78, 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, - 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, 128, 67, 79, - 77, 77, 193, 67, 79, 77, 69, 84, 128, 67, 79, 77, 66, 128, 67, 79, 76, - 85, 77, 78, 128, 67, 79, 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, - 206, 67, 79, 76, 76, 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, - 67, 79, 69, 78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 67, 75, 84, 65, 73, - 204, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 79, 128, 67, - 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 83, 128, - 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76, - 85, 194, 67, 76, 79, 86, 69, 82, 128, 67, 76, 79, 85, 68, 128, 67, 76, - 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, 79, 84, 72, 128, - 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, - 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197, 67, 76, 79, 67, 75, 87, 73, - 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86, 73, 83, 128, 67, 76, 73, - 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75, 73, 78, 199, 67, 76, 73, - 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70, - 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76, - 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69, - 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67, 76, 65, 87, 128, 67, 76, - 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, 67, 76, 65, 78, - 128, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, 67, 73, 86, - 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 197, 67, 73, 84, - 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, 70, 76, 69, 88, - 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, 85, 76, 65, - 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, 76, 69, - 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, 73, 78, - 69, 77, 65, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, 69, 85, - 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, - 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, 78, 71, - 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, 128, 67, - 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, 128, 67, - 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, 67, 72, - 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, 128, 67, - 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, 67, 72, - 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, 67, 72, - 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, 72, 69, - 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, 78, 79, - 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, 82, 73, - 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, 73, 83, - 84, 77, 65, 211, 67, 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, 72, 79, - 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, 128, 67, - 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, 79, 65, - 128, 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, - 73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, - 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, - 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, - 85, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, - 128, 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, 72, 73, - 78, 69, 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, - 73, 76, 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, - 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, - 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, - 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, - 69, 78, 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, - 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, - 72, 69, 84, 128, 67, 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, + 128, 72, 79, 79, 78, 128, 72, 79, 79, 75, 69, 196, 72, 79, 78, 69, 89, + 66, 69, 69, 128, 72, 79, 78, 69, 217, 72, 79, 77, 79, 84, 72, 69, 84, 73, + 67, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, + 72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, + 205, 72, 79, 75, 65, 128, 72, 79, 73, 128, 72, 79, 67, 72, 79, 128, 72, + 78, 85, 84, 128, 72, 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, + 79, 88, 128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, + 128, 72, 78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, + 72, 78, 73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, + 72, 78, 73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, + 128, 72, 78, 65, 88, 128, 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, + 78, 65, 128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, + 82, 128, 72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, + 77, 85, 84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, + 85, 80, 128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, + 85, 79, 128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, + 72, 77, 79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, + 84, 128, 72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, + 80, 128, 72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, + 65, 88, 128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, + 72, 76, 89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, + 76, 89, 82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, + 128, 72, 76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, + 72, 76, 85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, + 72, 76, 85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, + 80, 128, 72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, + 76, 73, 80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, + 76, 73, 69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, + 128, 72, 76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, + 65, 80, 128, 72, 76, 65, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, + 83, 84, 79, 82, 73, 195, 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 83, + 80, 69, 69, 196, 72, 73, 71, 72, 45, 82, 69, 86, 69, 82, 83, 69, 68, 45, + 185, 72, 73, 71, 72, 45, 72, 69, 69, 76, 69, 196, 72, 73, 69, 88, 128, + 72, 73, 69, 85, 72, 45, 83, 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, + 73, 69, 85, 76, 128, 72, 73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, + 73, 69, 85, 72, 45, 78, 73, 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, + 73, 69, 85, 77, 128, 72, 73, 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, + 73, 78, 199, 72, 73, 68, 69, 84, 128, 72, 73, 68, 69, 128, 72, 73, 66, + 73, 83, 67, 85, 83, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, 72, 72, + 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, 128, 72, + 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, 65, 71, 82, 65, + 205, 72, 69, 88, 65, 71, 79, 78, 128, 72, 69, 82, 85, 84, 85, 128, 72, + 69, 82, 85, 128, 72, 69, 82, 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, + 79, 78, 73, 65, 206, 72, 69, 82, 77, 69, 83, 128, 72, 69, 82, 66, 128, + 72, 69, 82, 65, 69, 85, 205, 72, 69, 78, 71, 128, 72, 69, 78, 199, 72, + 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, 72, 69, 76, 77, 69, 212, + 72, 69, 76, 205, 72, 69, 76, 73, 67, 79, 80, 84, 69, 82, 128, 72, 69, 75, + 85, 84, 65, 65, 82, 85, 128, 72, 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, + 89, 128, 72, 69, 65, 86, 69, 78, 76, 217, 72, 69, 65, 86, 69, 78, 128, + 72, 69, 65, 86, 69, 206, 72, 69, 65, 82, 84, 83, 128, 72, 69, 65, 82, 84, + 45, 83, 72, 65, 80, 69, 196, 72, 69, 65, 82, 84, 128, 72, 69, 65, 82, + 212, 72, 69, 65, 82, 45, 78, 79, 45, 69, 86, 73, 204, 72, 69, 65, 68, 83, + 84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, 72, 69, 65, + 68, 80, 72, 79, 78, 69, 128, 72, 69, 65, 68, 73, 78, 71, 128, 72, 66, 65, + 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, 65, 83, 193, 72, 65, 89, 65, 78, + 78, 65, 128, 72, 65, 86, 69, 128, 72, 65, 85, 80, 84, 83, 84, 73, 77, 77, + 69, 128, 72, 65, 84, 72, 73, 128, 72, 65, 84, 69, 128, 72, 65, 84, 67, + 72, 73, 78, 199, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, + 65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, + 79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, + 206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 80, + 80, 217, 72, 65, 78, 85, 78, 79, 207, 72, 65, 78, 71, 90, 72, 79, 213, + 72, 65, 78, 68, 83, 128, 72, 65, 78, 68, 211, 72, 65, 78, 68, 76, 69, 83, + 128, 72, 65, 78, 68, 76, 69, 128, 72, 65, 78, 68, 66, 65, 71, 128, 72, + 65, 78, 68, 128, 72, 65, 78, 45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, + 128, 72, 65, 77, 83, 84, 69, 210, 72, 65, 77, 77, 69, 82, 128, 72, 65, + 77, 77, 69, 210, 72, 65, 77, 66, 85, 82, 71, 69, 82, 128, 72, 65, 76, 81, + 65, 128, 72, 65, 76, 79, 128, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, + 82, 68, 128, 72, 65, 76, 65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, + 72, 65, 73, 82, 67, 85, 84, 128, 72, 65, 73, 82, 128, 72, 65, 71, 76, 65, + 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, 128, 72, 65, 70, + 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 65, 82, 85, 128, 72, 65, + 65, 77, 128, 72, 65, 193, 72, 65, 45, 72, 65, 128, 72, 48, 48, 56, 128, + 72, 48, 48, 55, 128, 72, 48, 48, 54, 65, 128, 72, 48, 48, 54, 128, 72, + 48, 48, 53, 128, 72, 48, 48, 52, 128, 72, 48, 48, 51, 128, 72, 48, 48, + 50, 128, 72, 48, 48, 49, 128, 72, 45, 84, 89, 80, 197, 71, 89, 85, 128, + 71, 89, 79, 78, 128, 71, 89, 79, 128, 71, 89, 73, 128, 71, 89, 70, 213, + 71, 89, 69, 69, 128, 71, 89, 65, 83, 128, 71, 89, 65, 65, 128, 71, 89, + 65, 128, 71, 89, 128, 71, 87, 85, 128, 71, 87, 73, 128, 71, 87, 69, 69, + 128, 71, 87, 69, 128, 71, 87, 65, 65, 128, 71, 87, 65, 128, 71, 86, 128, + 71, 85, 82, 85, 83, 72, 128, 71, 85, 82, 85, 78, 128, 71, 85, 82, 65, 77, + 85, 84, 79, 78, 128, 71, 85, 82, 55, 128, 71, 85, 78, 85, 128, 71, 85, + 78, 213, 71, 85, 205, 71, 85, 76, 128, 71, 85, 73, 84, 65, 82, 128, 71, + 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, 85, 68, 128, 71, 85, + 196, 71, 85, 65, 82, 68, 83, 77, 65, 78, 128, 71, 85, 65, 82, 68, 69, 68, + 78, 69, 83, 83, 128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 193, 71, 85, + 178, 71, 84, 69, 210, 71, 83, 85, 77, 128, 71, 83, 85, 205, 71, 82, 213, + 71, 82, 79, 87, 73, 78, 199, 71, 82, 79, 85, 78, 68, 128, 71, 82, 79, 78, + 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 73, 78, 78, 73, 78, 199, 71, + 82, 69, 71, 79, 82, 73, 65, 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, + 78, 69, 83, 83, 128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, + 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, + 210, 71, 82, 69, 65, 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, + 65, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, + 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, + 65, 84, 69, 82, 128, 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, + 82, 65, 80, 72, 69, 77, 197, 71, 82, 65, 80, 69, 83, 128, 71, 82, 65, 77, + 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, 65, 68, 85, 65, 84, 73, 79, + 206, 71, 82, 65, 67, 69, 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, + 79, 82, 84, 72, 77, 73, 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, + 79, 84, 69, 82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, + 79, 78, 128, 71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, + 82, 65, 128, 71, 79, 79, 196, 71, 79, 78, 71, 128, 71, 79, 76, 68, 128, + 71, 79, 75, 128, 71, 79, 73, 78, 199, 71, 79, 66, 76, 73, 78, 128, 71, + 79, 65, 76, 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, 89, 73, 83, + 128, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 87, 73, 78, + 199, 71, 76, 79, 84, 84, 65, 204, 71, 76, 79, 66, 197, 71, 76, 73, 83, + 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, 200, 71, 76, 65, 71, 79, 76, 73, + 128, 71, 76, 65, 128, 71, 74, 69, 128, 71, 73, 88, 128, 71, 73, 84, 128, + 71, 73, 83, 72, 128, 71, 73, 83, 200, 71, 73, 83, 65, 76, 128, 71, 73, + 82, 85, 68, 65, 65, 128, 71, 73, 82, 76, 128, 71, 73, 82, 51, 128, 71, + 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, 128, 71, + 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, 204, 71, + 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, 68, 73, + 77, 128, 71, 73, 66, 66, 79, 85, 211, 71, 73, 66, 65, 128, 71, 73, 52, + 128, 71, 73, 180, 71, 72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, + 78, 65, 128, 71, 72, 85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, + 128, 71, 72, 79, 83, 84, 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, + 72, 65, 128, 71, 72, 69, 85, 88, 128, 71, 72, 69, 85, 78, 128, 71, 72, + 69, 85, 71, 72, 69, 85, 65, 69, 77, 128, 71, 72, 69, 85, 71, 72, 69, 78, + 128, 71, 72, 69, 85, 65, 69, 82, 65, 69, 128, 71, 72, 69, 85, 65, 69, 71, + 72, 69, 85, 65, 69, 128, 71, 72, 69, 84, 128, 71, 72, 69, 69, 128, 71, + 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, 71, 72, 65, 82, 65, + 69, 128, 71, 72, 65, 80, 128, 71, 72, 65, 78, 128, 71, 72, 65, 77, 65, + 76, 128, 71, 72, 65, 73, 78, 85, 128, 71, 72, 65, 73, 78, 128, 71, 72, + 65, 73, 206, 71, 72, 65, 68, 128, 71, 72, 65, 65, 77, 65, 69, 128, 71, + 72, 65, 65, 128, 71, 72, 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, + 69, 128, 71, 71, 87, 69, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, + 128, 71, 71, 85, 88, 128, 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, + 71, 71, 85, 82, 128, 71, 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, 128, + 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, 71, + 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, 73, + 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, 73, + 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, 128, + 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 65, 128, 71, 69, + 84, 193, 71, 69, 83, 84, 85, 82, 69, 128, 71, 69, 83, 72, 85, 128, 71, + 69, 83, 72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, + 50, 128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, + 206, 71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, + 77, 69, 84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, + 195, 71, 69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, + 69, 78, 73, 75, 201, 71, 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, + 128, 71, 69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 205, 71, 69, 68, + 79, 76, 65, 128, 71, 69, 68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, + 71, 69, 65, 82, 128, 71, 69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, + 71, 128, 71, 67, 65, 206, 71, 66, 79, 78, 128, 71, 66, 73, 69, 197, 71, + 66, 69, 85, 88, 128, 71, 66, 69, 84, 128, 71, 66, 65, 89, 73, 128, 71, + 66, 65, 75, 85, 82, 85, 78, 69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, + 85, 75, 73, 84, 84, 65, 128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, + 128, 71, 65, 85, 78, 84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, + 71, 128, 71, 65, 84, 72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, + 65, 83, 72, 65, 78, 128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, + 79, 78, 128, 71, 65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 68, 69, 78, + 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, 69, 196, 71, 65, 208, 71, 65, + 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, 128, 71, 65, 78, 68, 193, 71, + 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, 77, 77, 65, 128, 71, 65, 77, + 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, 77, 69, 128, 71, 65, 77, 197, + 71, 65, 77, 65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, + 71, 65, 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, 65, + 45, 80, 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, 128, + 71, 65, 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, 85, + 128, 71, 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, 53, + 50, 128, 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, 128, + 71, 48, 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, 48, + 52, 53, 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, 52, + 51, 65, 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, 49, + 128, 71, 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, 71, + 48, 51, 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, 71, + 48, 51, 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, 51, + 51, 128, 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, 128, + 71, 48, 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, 48, + 50, 54, 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, 50, + 52, 128, 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, 128, + 71, 48, 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, 71, + 48, 49, 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, 49, + 53, 128, 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, 128, + 71, 48, 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, 71, + 48, 48, 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, 48, + 48, 55, 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, 48, + 48, 54, 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, 51, + 128, 71, 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, 89, + 84, 128, 70, 89, 80, 128, 70, 89, 65, 128, 70, 87, 73, 128, 70, 87, 69, + 69, 128, 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, 65, 128, 70, 85, + 88, 128, 70, 85, 84, 128, 70, 85, 83, 69, 128, 70, 85, 83, 193, 70, 85, + 82, 88, 128, 70, 85, 80, 128, 70, 85, 78, 69, 82, 65, 204, 70, 85, 78, + 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, 78, 69, 83, 83, 128, 70, 85, 76, + 204, 70, 85, 74, 73, 128, 70, 85, 69, 84, 128, 70, 85, 69, 204, 70, 85, + 69, 128, 70, 84, 72, 79, 82, 193, 70, 82, 79, 87, 78, 73, 78, 71, 128, + 70, 82, 79, 87, 78, 73, 78, 199, 70, 82, 79, 87, 78, 128, 70, 82, 79, 78, + 84, 45, 84, 73, 76, 84, 69, 196, 70, 82, 79, 78, 84, 45, 70, 65, 67, 73, + 78, 199, 70, 82, 79, 205, 70, 82, 79, 71, 128, 70, 82, 79, 199, 70, 82, + 73, 84, 85, 128, 70, 82, 73, 69, 83, 128, 70, 82, 73, 69, 196, 70, 82, + 73, 67, 65, 84, 73, 86, 69, 128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, + 70, 82, 69, 78, 67, 200, 70, 82, 69, 69, 128, 70, 82, 69, 197, 70, 82, + 65, 78, 195, 70, 82, 65, 77, 69, 128, 70, 82, 65, 71, 82, 65, 78, 84, + 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, 65, 67, 84, 73, 79, + 206, 70, 79, 88, 128, 70, 79, 85, 82, 84, 69, 69, 78, 128, 70, 79, 85, + 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 84, 72, 73, 82, 84, 89, 128, 70, + 79, 85, 82, 45, 83, 84, 82, 73, 78, 199, 70, 79, 85, 82, 45, 80, 69, 82, + 45, 69, 205, 70, 79, 85, 82, 45, 76, 73, 78, 197, 70, 79, 85, 210, 70, + 79, 85, 78, 84, 65, 73, 78, 128, 70, 79, 83, 84, 69, 82, 73, 78, 71, 128, + 70, 79, 82, 84, 89, 128, 70, 79, 82, 84, 217, 70, 79, 82, 84, 69, 128, + 70, 79, 82, 77, 211, 70, 79, 82, 77, 65, 84, 84, 73, 78, 71, 128, 70, 79, + 82, 75, 69, 196, 70, 79, 82, 67, 69, 83, 128, 70, 79, 82, 67, 69, 128, + 70, 79, 80, 128, 70, 79, 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, + 80, 82, 73, 78, 84, 83, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, + 84, 66, 65, 76, 76, 128, 70, 79, 79, 84, 128, 70, 79, 79, 68, 128, 70, + 79, 79, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, 70, 79, + 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, 76, 68, + 69, 82, 128, 70, 79, 76, 68, 69, 196, 70, 79, 71, 71, 89, 128, 70, 77, + 128, 70, 76, 89, 128, 70, 76, 85, 84, 84, 69, 82, 73, 78, 199, 70, 76, + 85, 84, 69, 128, 70, 76, 85, 83, 72, 69, 196, 70, 76, 79, 87, 73, 78, + 199, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, 128, 70, + 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, 76, 79, 80, + 80, 217, 70, 76, 79, 79, 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, + 72, 84, 128, 70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 88, 69, 196, 70, + 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, 83, 128, 70, 76, 65, 84, 84, 69, + 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, 83, 128, 70, 76, 65, 84, 128, + 70, 76, 65, 212, 70, 76, 65, 71, 83, 128, 70, 76, 65, 71, 45, 53, 128, + 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, 65, 71, + 45, 50, 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, 70, 76, + 65, 199, 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, 70, 79, + 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, 45, 84, 72, 73, 82, 84, 89, + 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, 70, 73, 86, 197, 70, 73, 84, + 65, 128, 70, 73, 84, 128, 70, 73, 83, 84, 69, 196, 70, 73, 83, 84, 128, + 70, 73, 83, 72, 73, 78, 199, 70, 73, 83, 72, 72, 79, 79, 75, 128, 70, 73, + 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, 69, 89, 69, 128, 70, 73, 83, 72, + 128, 70, 73, 83, 200, 70, 73, 82, 83, 212, 70, 73, 82, 73, 128, 70, 73, + 82, 69, 87, 79, 82, 75, 83, 128, 70, 73, 82, 69, 87, 79, 82, 203, 70, 73, + 82, 69, 128, 70, 73, 82, 197, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, + 70, 73, 78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, + 69, 196, 70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, + 128, 70, 73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, + 73, 76, 197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, + 73, 71, 85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, + 73, 71, 85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, + 70, 73, 70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, + 128, 70, 73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, + 73, 69, 76, 68, 128, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, + 73, 128, 70, 69, 85, 88, 128, 70, 69, 85, 70, 69, 85, 65, 69, 84, 128, + 70, 69, 83, 84, 73, 86, 65, 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, + 82, 73, 211, 70, 69, 82, 77, 65, 84, 65, 128, 70, 69, 82, 77, 65, 84, + 193, 70, 69, 79, 200, 70, 69, 78, 199, 70, 69, 78, 67, 69, 128, 70, 69, + 77, 73, 78, 73, 78, 197, 70, 69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, + 197, 70, 69, 76, 76, 79, 87, 83, 72, 73, 80, 128, 70, 69, 73, 128, 70, + 69, 72, 213, 70, 69, 72, 128, 70, 69, 200, 70, 69, 69, 78, 71, 128, 70, + 69, 69, 68, 128, 70, 69, 69, 196, 70, 69, 69, 128, 70, 69, 66, 82, 85, + 65, 82, 89, 128, 70, 69, 65, 84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, + 210, 70, 69, 65, 82, 78, 128, 70, 69, 65, 82, 70, 85, 204, 70, 69, 65, + 82, 128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 89, 128, 70, 65, 88, + 128, 70, 65, 216, 70, 65, 84, 73, 71, 85, 69, 128, 70, 65, 84, 72, 69, + 82, 128, 70, 65, 84, 72, 69, 210, 70, 65, 84, 72, 65, 84, 65, 78, 128, + 70, 65, 84, 72, 65, 84, 65, 206, 70, 65, 84, 72, 65, 128, 70, 65, 84, 72, + 193, 70, 65, 84, 128, 70, 65, 82, 83, 201, 70, 65, 81, 128, 70, 65, 80, + 128, 70, 65, 78, 71, 128, 70, 65, 78, 69, 82, 79, 83, 73, 211, 70, 65, + 78, 128, 70, 65, 77, 73, 76, 89, 128, 70, 65, 76, 76, 73, 78, 199, 70, + 65, 76, 76, 69, 206, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, 72, 85, + 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, 79, 82, + 89, 128, 70, 65, 67, 84, 79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, + 70, 65, 67, 69, 45, 54, 128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, + 45, 52, 128, 70, 65, 67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 50, 128, + 70, 65, 67, 69, 45, 49, 128, 70, 65, 65, 77, 65, 69, 128, 70, 65, 65, 73, + 128, 70, 65, 65, 70, 85, 128, 70, 48, 53, 51, 128, 70, 48, 53, 50, 128, + 70, 48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, 53, 49, 65, + 128, 70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, 57, 128, 70, + 48, 52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, 128, 70, 48, + 52, 54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, 128, 70, 48, + 52, 53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, 48, 52, 50, + 128, 70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, 57, 128, 70, + 48, 51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, 65, 128, 70, + 48, 51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, 70, 48, 51, + 52, 128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, 51, 49, 65, + 128, 70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, 57, 128, 70, + 48, 50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, 70, 48, 50, + 53, 128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, 50, 50, 128, + 70, 48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, 48, 128, 70, + 48, 49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, 70, 48, 49, + 54, 128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, 49, 51, 65, + 128, 70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, 49, 128, 70, + 48, 49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, 70, 48, 48, + 55, 128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, 48, 52, 128, + 70, 48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, 65, 128, 70, + 48, 48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, + 90, 128, 69, 89, 69, 83, 128, 69, 89, 69, 71, 76, 65, 83, 83, 69, 83, + 128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, + 128, 69, 88, 84, 82, 65, 84, 69, 82, 82, 69, 83, 84, 82, 73, 65, 204, 69, + 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, 71, 200, + 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, 69, 196, + 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79, 128, 69, 88, 207, 69, 88, + 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, 83, 84, + 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 78, 128, 69, 88, + 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 72, 65, 78, 71, 69, 128, + 69, 88, 67, 69, 83, 83, 128, 69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, + 87, 69, 128, 69, 86, 69, 82, 71, 82, 69, 69, 206, 69, 86, 69, 78, 73, 78, + 71, 128, 69, 85, 82, 79, 80, 69, 65, 206, 69, 85, 82, 79, 80, 69, 45, 65, + 70, 82, 73, 67, 65, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, + 217, 69, 85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, 85, + 45, 79, 128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, + 45, 69, 128, 69, 85, 45, 65, 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, + 84, 72, 69, 204, 69, 84, 69, 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, + 128, 69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, + 83, 128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, 83, 72, 69, 51, 128, + 69, 83, 72, 50, 49, 128, 69, 83, 72, 178, 69, 83, 72, 49, 54, 128, 69, + 83, 67, 65, 80, 69, 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, + 66, 65, 82, 82, 69, 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 128, 69, + 82, 71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, 69, 78, + 212, 69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, + 210, 69, 81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, + 65, 76, 128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, + 206, 69, 80, 79, 67, 72, 128, 69, 80, 73, 71, 82, 65, 80, 72, 73, 195, + 69, 80, 73, 68, 65, 85, 82, 69, 65, 206, 69, 80, 69, 78, 84, 72, 69, 84, + 73, 195, 69, 80, 69, 71, 69, 82, 77, 65, 128, 69, 79, 76, 72, 88, 128, + 69, 79, 72, 128, 69, 78, 89, 128, 69, 78, 86, 69, 76, 79, 80, 69, 128, + 69, 78, 86, 69, 76, 79, 80, 197, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, + 206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, + 69, 78, 84, 82, 89, 128, 69, 78, 84, 82, 217, 69, 78, 84, 72, 85, 83, 73, + 65, 83, 77, 128, 69, 78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, + 69, 82, 73, 78, 199, 69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, + 78, 81, 85, 73, 82, 89, 128, 69, 78, 79, 211, 69, 78, 78, 128, 69, 78, + 76, 65, 82, 71, 69, 77, 69, 78, 84, 128, 69, 78, 71, 73, 78, 69, 128, 69, + 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, 78, 199, 69, 78, 68, + 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, 128, 69, 78, 67, 79, 85, + 78, 84, 69, 82, 83, 128, 69, 78, 67, 76, 79, 83, 85, 82, 69, 128, 69, 78, + 67, 76, 79, 83, 73, 78, 199, 69, 78, 67, 128, 69, 78, 65, 82, 88, 73, + 211, 69, 78, 65, 82, 77, 79, 78, 73, 79, 211, 69, 77, 80, 84, 217, 69, + 77, 80, 72, 65, 84, 73, 195, 69, 77, 80, 72, 65, 83, 73, 211, 69, 77, 66, + 82, 79, 73, 68, 69, 82, 89, 128, 69, 77, 66, 76, 69, 77, 128, 69, 77, 66, + 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, 68, 73, + 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73, 83, 128, 69, + 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, 69, 86, 69, + 78, 45, 84, 72, 73, 82, 84, 89, 128, 69, 76, 69, 86, 69, 78, 128, 69, 76, + 69, 86, 69, 206, 69, 76, 69, 80, 72, 65, 78, 84, 128, 69, 76, 69, 77, 69, + 78, 212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, + 73, 195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, + 79, 78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, + 128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, 69, 73, 83, 128, 69, + 73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, 69, 73, 71, 72, 84, 72, + 83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, 72, 84, 72, 128, 69, + 73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 73, + 71, 72, 84, 45, 84, 72, 73, 82, 84, 89, 128, 69, 73, 69, 128, 69, 72, 87, + 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, 65, 204, 69, 71, 73, + 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, 65, 128, 69, 69, 75, + 65, 65, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, 128, 69, 68, 73, 84, 79, + 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, 68, 128, 69, 66, 69, 70, + 73, 76, 73, 128, 69, 65, 83, 84, 69, 82, 206, 69, 65, 83, 212, 69, 65, + 82, 84, 72, 76, 217, 69, 65, 82, 84, 72, 128, 69, 65, 82, 84, 200, 69, + 65, 82, 83, 128, 69, 65, 82, 76, 217, 69, 65, 77, 72, 65, 78, 67, 72, 79, + 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, 68, 72, 65, 68, 72, 128, + 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, 48, 51, 56, 128, 69, 48, + 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, 52, 65, 128, 69, 48, 51, + 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, 128, 69, 48, 51, 49, 128, + 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, 48, 50, 56, 65, 128, 69, + 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, 50, 54, 128, 69, 48, 50, + 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, 128, 69, 48, 50, 50, 128, + 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, 69, 48, 50, 48, 128, 69, + 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, 49, 55, 65, 128, 69, 48, + 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, 49, 54, 128, 69, 48, 49, + 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, 128, 69, 48, 49, 50, 128, + 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, 48, 48, 57, 65, 128, 69, + 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, 48, 48, 56, 128, 69, 48, + 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53, 128, 69, 48, 48, 52, + 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69, 48, 48, 49, 128, 69, + 45, 77, 65, 73, 204, 68, 90, 90, 69, 128, 68, 90, 87, 69, 128, 68, 90, + 85, 128, 68, 90, 79, 128, 68, 90, 74, 69, 128, 68, 90, 73, 128, 68, 90, + 72, 69, 128, 68, 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, + 69, 128, 68, 90, 69, 128, 68, 90, 65, 65, 128, 68, 90, 65, 128, 68, 90, + 128, 68, 218, 68, 89, 79, 128, 68, 89, 207, 68, 89, 69, 72, 128, 68, 89, + 69, 200, 68, 87, 79, 128, 68, 87, 69, 128, 68, 87, 65, 128, 68, 86, 73, + 83, 86, 65, 82, 65, 128, 68, 86, 68, 128, 68, 86, 128, 68, 85, 84, 73, + 69, 83, 128, 68, 85, 83, 75, 128, 68, 85, 83, 72, 69, 78, 78, 65, 128, + 68, 85, 82, 65, 84, 73, 79, 78, 128, 68, 85, 82, 50, 128, 68, 85, 80, 79, + 78, 68, 73, 85, 211, 68, 85, 79, 88, 128, 68, 85, 79, 128, 68, 85, 78, + 52, 128, 68, 85, 78, 51, 128, 68, 85, 78, 179, 68, 85, 77, 128, 68, 85, + 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, 68, 85, 66, 50, 128, 68, + 85, 66, 128, 68, 85, 194, 68, 82, 89, 128, 68, 82, 217, 68, 82, 85, 77, + 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128, 68, 82, 79, 80, 76, 69, + 84, 128, 68, 82, 79, 80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 79, + 77, 69, 68, 65, 82, 217, 68, 82, 73, 86, 69, 128, 68, 82, 73, 86, 197, + 68, 82, 73, 78, 75, 128, 68, 82, 73, 204, 68, 82, 69, 83, 83, 128, 68, + 82, 65, 85, 71, 72, 84, 211, 68, 82, 65, 77, 128, 68, 82, 65, 71, 79, 78, + 128, 68, 82, 65, 71, 79, 206, 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, + 65, 67, 72, 77, 65, 83, 128, 68, 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, + 67, 72, 77, 193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, + 87, 65, 82, 68, 211, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, + 68, 79, 87, 78, 128, 68, 79, 86, 69, 128, 68, 79, 85, 71, 72, 78, 85, 84, + 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, 66, 76, 69, 196, 68, 79, 85, + 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85, 66, 76, 69, 45, 69, 78, 68, + 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79, 84, 84, 69, 68, 45, 80, + 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, 84, 69, 68, 45, 76, + 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84, 69, 196, 68, 79, 84, + 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, 79, 84, 83, 45, 55, + 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, 45, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, 45, 54, 128, 68, + 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, 128, 68, 79, + 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, 55, 128, 68, 79, + 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 128, 68, 79, 84, 83, 45, + 52, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, 79, 84, 83, 45, 52, + 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, 128, 68, 79, 84, 83, 45, 52, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, 79, 84, 83, 45, 52, + 54, 128, 68, 79, 84, 83, 45, 52, 53, 56, 128, 68, 79, 84, 83, 45, 52, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, 79, 84, 83, 45, 52, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, 53, 54, 128, 68, 79, + 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, 45, 52, 128, 68, 79, 84, 83, 45, + 51, 56, 128, 68, 79, 84, 83, 45, 51, 55, 56, 128, 68, 79, 84, 83, 45, 51, + 55, 128, 68, 79, 84, 83, 45, 51, 54, 56, 128, 68, 79, 84, 83, 45, 51, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 51, 54, 55, 128, 68, 79, 84, 83, 45, 51, + 54, 128, 68, 79, 84, 83, 45, 51, 53, 56, 128, 68, 79, 84, 83, 45, 51, 53, + 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 55, 128, 68, 79, 84, 83, 45, 51, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 128, 68, 79, + 84, 83, 45, 51, 53, 128, 68, 79, 84, 83, 45, 51, 52, 56, 128, 68, 79, 84, + 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 128, 68, 79, + 84, 83, 45, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 51, 52, + 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 51, + 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 128, 68, 79, 84, + 83, 45, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, 128, 68, 79, 84, 83, + 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, 128, 68, 79, 84, 83, 45, 50, 56, + 128, 68, 79, 84, 83, 45, 50, 55, 56, 128, 68, 79, 84, 83, 45, 50, 55, + 128, 68, 79, 84, 83, 45, 50, 54, 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 54, 55, 128, 68, 79, 84, 83, 45, 50, 54, + 128, 68, 79, 84, 83, 45, 50, 53, 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 53, 55, 128, 68, 79, 84, 83, 45, 50, 53, + 54, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, + 45, 50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 128, 68, 79, 84, + 83, 45, 50, 53, 128, 68, 79, 84, 83, 45, 50, 52, 56, 128, 68, 79, 84, 83, + 45, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 128, 68, 79, 84, + 83, 45, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, 56, 128, + 68, 79, 84, 83, 45, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, + 128, 68, 79, 84, 83, 45, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 52, + 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 128, 68, 79, 84, 83, + 45, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, + 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, 128, 68, 79, 84, 83, 45, + 50, 52, 128, 68, 79, 84, 83, 45, 50, 51, 56, 128, 68, 79, 84, 83, 45, 50, + 51, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 128, 68, 79, 84, 83, 45, + 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 56, 128, 68, 79, + 84, 83, 45, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 128, 68, + 79, 84, 83, 45, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, + 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 50, + 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, 56, 128, 68, + 79, 84, 83, 45, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, + 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 128, 68, 79, 84, 83, 45, 50, 51, + 52, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, + 45, 50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 56, 128, 68, + 79, 84, 83, 45, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, + 52, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 128, 68, 79, 84, 83, + 45, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, + 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 128, 68, 79, + 84, 83, 45, 50, 51, 52, 128, 68, 79, 84, 83, 45, 50, 51, 128, 68, 79, 84, + 83, 45, 50, 128, 68, 79, 84, 83, 45, 49, 56, 128, 68, 79, 84, 83, 45, 49, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 55, 128, 68, 79, 84, 83, 45, 49, 54, + 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 54, 55, 128, 68, 79, 84, 83, 45, 49, 54, 128, 68, 79, 84, 83, 45, 49, 53, + 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 53, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 56, 128, 68, 79, 84, 83, 45, + 49, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 128, 68, 79, + 84, 83, 45, 49, 53, 54, 128, 68, 79, 84, 83, 45, 49, 53, 128, 68, 79, 84, + 83, 45, 49, 52, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 56, 128, 68, 79, + 84, 83, 45, 49, 52, 55, 128, 68, 79, 84, 83, 45, 49, 52, 54, 56, 128, 68, + 79, 84, 83, 45, 49, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, + 55, 128, 68, 79, 84, 83, 45, 49, 52, 54, 128, 68, 79, 84, 83, 45, 49, 52, + 53, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 56, 128, 68, + 79, 84, 83, 45, 49, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, + 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 128, 68, 79, 84, 83, + 45, 49, 52, 53, 128, 68, 79, 84, 83, 45, 49, 52, 128, 68, 79, 84, 83, 45, + 49, 51, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 51, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 56, 128, 68, 79, 84, + 83, 45, 49, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 128, + 68, 79, 84, 83, 45, 49, 51, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 56, + 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, + 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 56, 128, 68, 79, 84, + 83, 45, 49, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, + 55, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, + 51, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 56, 128, 68, 79, 84, 83, 45, + 49, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 128, 68, 79, + 84, 83, 45, 49, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 128, 68, 79, 84, 83, + 45, 49, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 56, 128, 68, + 79, 84, 83, 45, 49, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, + 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 56, 128, 68, 79, + 84, 83, 45, 49, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, + 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 128, 68, 79, + 84, 83, 45, 49, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 51, 52, 128, 68, + 79, 84, 83, 45, 49, 51, 128, 68, 79, 84, 83, 45, 49, 50, 56, 128, 68, 79, + 84, 83, 45, 49, 50, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 54, 55, 128, 68, 79, 84, 83, 45, 49, + 50, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 56, 128, 68, 79, 84, 83, 45, + 49, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 128, 68, 79, + 84, 83, 45, 49, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 128, 68, 79, 84, 83, + 45, 49, 50, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 53, 128, 68, 79, 84, + 83, 45, 49, 50, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, + 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 128, + 68, 79, 84, 83, 45, 49, 50, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 128, 68, 79, + 84, 83, 45, 49, 50, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, + 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 128, 68, + 79, 84, 83, 45, 49, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, + 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 56, 128, 68, 79, 84, 83, + 45, 49, 50, 51, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 56, 128, 68, + 79, 84, 83, 45, 49, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, + 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 128, 68, 79, 84, 83, + 45, 49, 50, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 55, 128, 68, 79, 84, 83, 45, 49, + 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 56, + 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 128, 68, 79, + 84, 83, 45, 49, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 128, 68, 79, 84, 83, + 45, 49, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, + 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, + 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, + 83, 45, 49, 50, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, + 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 56, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, + 49, 50, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 128, + 68, 79, 84, 83, 45, 49, 50, 51, 52, 128, 68, 79, 84, 83, 45, 49, 50, 51, + 128, 68, 79, 84, 83, 45, 49, 50, 128, 68, 79, 84, 83, 45, 49, 128, 68, + 79, 84, 83, 128, 68, 79, 84, 76, 69, 83, 211, 68, 79, 82, 85, 128, 68, + 79, 79, 82, 128, 68, 79, 79, 78, 71, 128, 68, 79, 78, 71, 128, 68, 79, + 77, 65, 73, 206, 68, 79, 76, 80, 72, 73, 78, 128, 68, 79, 76, 76, 83, + 128, 68, 79, 76, 76, 65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, + 77, 65, 73, 128, 68, 79, 73, 84, 128, 68, 79, 71, 128, 68, 79, 199, 68, + 79, 69, 211, 68, 79, 68, 69, 75, 65, 84, 65, 128, 68, 79, 66, 82, 79, + 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 69, 128, 68, 79, 65, 67, 72, + 65, 83, 72, 77, 69, 197, 68, 79, 65, 128, 68, 79, 45, 79, 128, 68, 77, + 128, 68, 205, 68, 76, 85, 128, 68, 76, 79, 128, 68, 76, 73, 128, 68, 76, + 69, 69, 128, 68, 76, 65, 128, 68, 76, 128, 68, 75, 65, 82, 128, 68, 75, + 65, 210, 68, 74, 69, 82, 86, 73, 128, 68, 74, 69, 82, 86, 128, 68, 74, + 69, 128, 68, 74, 65, 128, 68, 74, 128, 68, 73, 90, 90, 217, 68, 73, 86, + 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, 86, 73, 83, + 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, 73, 86, 73, + 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 128, 68, 73, 86, 73, 68, 69, + 196, 68, 73, 86, 73, 68, 69, 128, 68, 73, 86, 73, 68, 197, 68, 73, 86, + 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84, 207, 68, 73, 83, 84, 79, + 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, 83, 72, 128, + 68, 73, 83, 84, 73, 76, 76, 128, 68, 73, 83, 83, 79, 76, 86, 69, 45, 50, + 128, 68, 73, 83, 83, 79, 76, 86, 69, 128, 68, 73, 83, 80, 69, 82, 83, 73, + 79, 78, 128, 68, 73, 83, 75, 128, 68, 73, 83, 73, 77, 79, 85, 128, 68, + 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, 85, 79, 85, 211, 68, + 73, 83, 195, 68, 73, 83, 65, 80, 80, 79, 73, 78, 84, 69, 196, 68, 73, 83, + 65, 66, 76, 69, 196, 68, 73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, + 217, 68, 73, 82, 69, 67, 84, 73, 79, 78, 65, 204, 68, 73, 80, 84, 69, + 128, 68, 73, 80, 80, 69, 82, 128, 68, 73, 80, 76, 79, 85, 78, 128, 68, + 73, 80, 76, 73, 128, 68, 73, 80, 76, 201, 68, 73, 78, 71, 66, 65, 212, + 68, 73, 206, 68, 73, 77, 77, 73, 78, 71, 128, 68, 73, 77, 73, 78, 85, 84, + 73, 79, 78, 45, 51, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, + 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 49, 128, 68, 73, 77, 73, + 78, 73, 83, 72, 77, 69, 78, 84, 128, 68, 73, 77, 73, 68, 73, 193, 68, 73, + 77, 69, 78, 83, 73, 79, 78, 65, 204, 68, 73, 77, 69, 78, 83, 73, 79, 206, + 68, 73, 77, 50, 128, 68, 73, 76, 128, 68, 73, 71, 82, 65, 80, 72, 128, + 68, 73, 71, 82, 65, 80, 200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, + 71, 82, 65, 77, 77, 193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, + 79, 78, 128, 68, 73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 65, 77, 77, 65, + 128, 68, 73, 71, 193, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 70, + 79, 78, 73, 65, 83, 128, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 73, + 70, 70, 73, 67, 85, 76, 84, 73, 69, 83, 128, 68, 73, 70, 70, 69, 82, 69, + 78, 84, 73, 65, 76, 128, 68, 73, 70, 70, 69, 82, 69, 78, 67, 197, 68, 73, + 70, 65, 84, 128, 68, 73, 69, 83, 73, 83, 128, 68, 73, 69, 83, 73, 211, + 68, 73, 69, 80, 128, 68, 73, 197, 68, 73, 66, 128, 68, 73, 65, 84, 79, + 78, 79, 206, 68, 73, 65, 84, 79, 78, 73, 75, 201, 68, 73, 65, 83, 84, 79, + 76, 201, 68, 73, 65, 77, 79, 78, 68, 83, 128, 68, 73, 65, 77, 79, 78, 68, + 128, 68, 73, 65, 77, 79, 78, 196, 68, 73, 65, 77, 69, 84, 69, 210, 68, + 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, 73, 65, 76, 89, 84, 73, 75, 193, + 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 73, 65, 71, 79, 78, 65, 76, 128, + 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, 65, 69, 82, 69, 83, 73, 90, 69, + 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, 69, 82, 69, 83, + 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, 72, 79, 128, 68, + 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, 128, 68, 72, 72, + 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, 68, 72, 72, 69, + 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, 65, 82, 77, 65, + 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, 84, 72, 128, + 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, 65, 65, 76, 85, + 128, 68, 72, 65, 128, 68, 69, 90, 200, 68, 69, 89, 84, 69, 82, 79, 213, + 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, 88, 73, 65, 128, 68, 69, 86, 73, + 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, 128, 68, 69, 85, 78, + 71, 128, 68, 69, 83, 203, 68, 69, 83, 73, 71, 78, 128, 68, 69, 83, 73, + 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 68, 69, 83, 67, 69, 78, + 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, 68, 69, 82, 128, 68, 69, 82, 69, + 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, 82, 69, 84, 128, 68, 69, 80, 65, + 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, 82, 84, 77, 69, 78, 212, 68, 69, + 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, 217, 68, 69, + 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, 68, 69, + 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, 69, 78, 128, 68, 69, + 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, 73, 85, 211, 68, 69, + 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, 84, 128, 68, 69, 76, + 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 217, 68, 69, 76, 73, 86, 69, + 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, + 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, 73, 67, 73, 79, 85, 211, 68, 69, + 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, 197, 68, 69, 75, 65, 128, 68, + 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, 73, 128, 68, 69, 71, 82, 69, + 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, 70, 69, 67, 84, + 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, 69, 80, 76, 89, + 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, + 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 67, 79, 82, 65, 84, 73, + 86, 197, 68, 69, 67, 79, 82, 65, 84, 73, 79, 78, 128, 68, 69, 67, 73, 83, + 73, 86, 69, 78, 69, 83, 83, 128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, + 73, 68, 85, 79, 85, 211, 68, 69, 67, 69, 77, 66, 69, 82, 128, 68, 69, 67, + 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, 68, 69, 65, 84, 72, 128, 68, + 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, 68, 85, 88, 128, 68, 68, 85, + 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, 85, 82, 128, 68, 68, 85, 80, + 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, + 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, 68, 68, 79, 84, 128, 68, 68, + 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, 73, 88, 128, 68, 68, 73, 84, + 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, 88, 128, 68, 68, 73, 69, 80, + 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, 68, 68, 72, 85, 128, 68, 68, + 72, 79, 128, 68, 68, 72, 73, 128, 68, 68, 72, 69, 69, 128, 68, 68, 72, + 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, 72, 65, 128, 68, 68, 69, 88, + 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, 128, 68, 68, 69, 128, 68, 68, + 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, 68, 65, 89, 65, 78, 78, 65, + 128, 68, 68, 65, 88, 128, 68, 68, 65, 84, 128, 68, 68, 65, 80, 128, 68, + 68, 65, 76, 128, 68, 68, 65, 204, 68, 68, 65, 72, 65, 76, 128, 68, 68, + 65, 72, 65, 204, 68, 68, 65, 65, 128, 68, 194, 68, 65, 89, 45, 78, 73, + 71, 72, 84, 128, 68, 65, 217, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, + 65, 86, 73, 68, 128, 68, 65, 84, 197, 68, 65, 83, 73, 65, 128, 68, 65, + 83, 73, 193, 68, 65, 83, 72, 69, 196, 68, 65, 83, 72, 128, 68, 65, 83, + 200, 68, 65, 83, 69, 73, 65, 128, 68, 65, 82, 84, 128, 68, 65, 82, 75, + 69, 78, 73, 78, 71, 128, 68, 65, 82, 75, 69, 78, 73, 78, 199, 68, 65, 82, + 203, 68, 65, 82, 71, 65, 128, 68, 65, 82, 65, 52, 128, 68, 65, 82, 65, + 51, 128, 68, 65, 82, 128, 68, 65, 80, 45, 80, 82, 65, 205, 68, 65, 80, + 45, 80, 73, 201, 68, 65, 80, 45, 77, 85, 79, 217, 68, 65, 80, 45, 66, 85, + 79, 206, 68, 65, 80, 45, 66, 69, 201, 68, 65, 208, 68, 65, 78, 84, 65, + 74, 193, 68, 65, 78, 71, 79, 128, 68, 65, 78, 71, 128, 68, 65, 78, 199, + 68, 65, 78, 68, 65, 128, 68, 65, 78, 67, 69, 82, 128, 68, 65, 77, 80, + 128, 68, 65, 77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 77, + 77, 65, 84, 65, 206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, 193, 68, + 65, 77, 65, 82, 85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65, 76, 69, 84, + 128, 68, 65, 76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, 76, 65, 84, + 72, 128, 68, 65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128, 68, 65, 73, + 82, 128, 68, 65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 45, + 50, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, 83, 128, + 68, 65, 71, 71, 69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, 65, 71, 69, + 83, 200, 68, 65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, 71, 65, + 218, 68, 65, 71, 65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, 78, 71, + 128, 68, 65, 69, 199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, + 128, 68, 65, 65, 68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, 48, 54, + 55, 71, 128, 68, 48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, 68, 48, + 54, 55, 68, 128, 68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, 128, 68, + 48, 54, 55, 65, 128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, 68, 48, + 54, 53, 128, 68, 48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, 54, 50, + 128, 68, 48, 54, 49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, 128, 68, + 48, 53, 56, 128, 68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, 48, 53, + 53, 128, 68, 48, 53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, 53, 51, + 128, 68, 48, 53, 50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, 49, 128, + 68, 48, 53, 48, 73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, 48, 71, + 128, 68, 48, 53, 48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, 53, 48, + 68, 128, 68, 48, 53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, 48, 53, + 48, 65, 128, 68, 48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, 52, 56, + 65, 128, 68, 48, 52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, 54, 65, + 128, 68, 48, 52, 54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, 128, 68, + 48, 52, 51, 128, 68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, 48, 52, + 48, 128, 68, 48, 51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, 55, 128, + 68, 48, 51, 54, 128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, 128, 68, + 48, 51, 52, 128, 68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, 48, 51, + 49, 65, 128, 68, 48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, 50, 57, + 128, 68, 48, 50, 56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, 55, 128, + 68, 48, 50, 54, 128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, 68, 48, + 50, 51, 128, 68, 48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, 50, 48, + 128, 68, 48, 49, 57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, 128, 68, + 48, 49, 54, 128, 68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, 48, 49, + 51, 128, 68, 48, 49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, 48, 128, + 68, 48, 48, 57, 128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, 128, 68, + 48, 48, 55, 128, 68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, 48, 48, + 52, 128, 68, 48, 48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, 49, 128, + 67, 89, 88, 128, 67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, 82, 69, + 78, 65, 73, 195, 67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, 67, 89, + 80, 69, 82, 85, 83, 128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, 73, + 67, 73, 84, 89, 128, 67, 89, 67, 76, 79, 78, 69, 128, 67, 89, 65, 128, + 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, 67, 87, 73, 73, 128, + 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, 67, 87, 69, 128, 67, + 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 85, 128, 67, 85, 212, 67, 85, + 83, 84, 79, 77, 83, 128, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 83, 84, + 65, 82, 68, 128, 67, 85, 82, 88, 128, 67, 85, 82, 86, 73, 78, 199, 67, + 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, 128, 67, 85, 82, 86, 197, 67, + 85, 82, 82, 217, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, 82, 69, 78, + 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, 128, 67, 85, + 80, 128, 67, 85, 79, 88, 128, 67, 85, 79, 80, 128, 67, 85, 79, 128, 67, + 85, 205, 67, 85, 66, 69, 68, 128, 67, 85, 66, 197, 67, 85, 65, 84, 82, + 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, 76, 207, 67, 85, 128, + 67, 82, 89, 83, 84, 65, 204, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, + 73, 195, 67, 82, 89, 73, 78, 199, 67, 82, 85, 90, 69, 73, 82, 207, 67, + 82, 85, 67, 73, 66, 76, 69, 45, 53, 128, 67, 82, 85, 67, 73, 66, 76, 69, + 45, 52, 128, 67, 82, 85, 67, 73, 66, 76, 69, 45, 51, 128, 67, 82, 85, 67, + 73, 66, 76, 69, 45, 50, 128, 67, 82, 85, 67, 73, 66, 76, 69, 128, 67, 82, + 79, 87, 78, 128, 67, 82, 79, 83, 83, 73, 78, 71, 128, 67, 82, 79, 83, 83, + 73, 78, 199, 67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, + 69, 68, 45, 84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, + 83, 83, 66, 79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, + 211, 67, 82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 79, 67, 85, + 211, 67, 82, 79, 67, 79, 68, 73, 76, 69, 128, 67, 82, 69, 83, 67, 69, 78, + 84, 128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, + 82, 69, 65, 84, 73, 86, 197, 67, 82, 69, 65, 77, 128, 67, 82, 65, 67, 75, + 69, 82, 128, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 215, 67, 79, 86, + 69, 82, 128, 67, 79, 85, 80, 76, 197, 67, 79, 85, 78, 84, 73, 78, 199, + 67, 79, 85, 78, 84, 69, 82, 83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, + 82, 66, 79, 82, 69, 128, 67, 79, 85, 78, 67, 73, 204, 67, 79, 84, 128, + 67, 79, 82, 82, 69, 83, 80, 79, 78, 68, 211, 67, 79, 82, 82, 69, 67, 84, + 128, 67, 79, 82, 80, 83, 69, 128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, + 78, 128, 67, 79, 82, 79, 78, 73, 83, 128, 67, 79, 82, 78, 69, 82, 83, + 128, 67, 79, 82, 78, 69, 82, 128, 67, 79, 82, 78, 69, 210, 67, 79, 80, + 89, 82, 73, 71, 72, 84, 128, 67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, + 80, 89, 128, 67, 79, 80, 82, 79, 68, 85, 67, 84, 128, 67, 79, 80, 80, 69, + 82, 45, 50, 128, 67, 79, 80, 80, 69, 82, 128, 67, 79, 80, 128, 67, 79, + 79, 76, 128, 67, 79, 79, 75, 73, 78, 71, 128, 67, 79, 79, 75, 73, 69, + 128, 67, 79, 79, 75, 69, 196, 67, 79, 79, 128, 67, 79, 78, 86, 69, 82, + 71, 73, 78, 199, 67, 79, 78, 86, 69, 78, 73, 69, 78, 67, 197, 67, 79, 78, + 84, 82, 79, 76, 128, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, 82, 65, + 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, 78, 128, + 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, 210, 67, 79, + 78, 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, 80, 76, 65, + 84, 73, 79, 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, 78, 84, 65, + 73, 78, 73, 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, 84, 65, 67, + 84, 128, 67, 79, 78, 83, 84, 82, 85, 67, 84, 73, 79, 206, 67, 79, 78, 83, + 84, 65, 78, 84, 128, 67, 79, 78, 83, 84, 65, 78, 212, 67, 79, 78, 83, 84, + 65, 78, 67, 89, 128, 67, 79, 78, 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, + 78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, + 197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, 67, 79, 78, 73, 67, 65, + 204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 71, 82, 65, 84, 85, + 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 79, 85, 78, 68, 69, 196, 67, + 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, 78, 70, 69, 84, 84, 201, 67, 79, + 78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, + 45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, 67, 79, 77, 80, 85, 84, + 69, 82, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 78, 128, 67, 79, 77, + 80, 79, 83, 73, 84, 73, 79, 206, 67, 79, 77, 80, 76, 73, 65, 78, 67, 69, + 128, 67, 79, 77, 80, 76, 69, 84, 73, 79, 78, 128, 67, 79, 77, 80, 76, 69, + 84, 69, 68, 128, 67, 79, 77, 80, 76, 69, 77, 69, 78, 84, 128, 67, 79, 77, + 80, 65, 82, 69, 128, 67, 79, 77, 77, 79, 206, 67, 79, 77, 77, 69, 82, 67, + 73, 65, 204, 67, 79, 77, 77, 65, 128, 67, 79, 77, 77, 193, 67, 79, 77, + 69, 84, 128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, 67, 79, + 76, 79, 82, 128, 67, 79, 76, 76, 73, 83, 73, 79, 206, 67, 79, 76, 76, + 128, 67, 79, 76, 196, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, 78, 71, + 128, 67, 79, 69, 78, 199, 67, 79, 68, 65, 128, 67, 79, 67, 75, 84, 65, + 73, 204, 67, 79, 65, 83, 84, 69, 82, 128, 67, 79, 65, 128, 67, 79, 128, + 67, 77, 128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 83, + 128, 67, 76, 85, 66, 45, 83, 80, 79, 75, 69, 196, 67, 76, 85, 66, 128, + 67, 76, 85, 194, 67, 76, 79, 86, 69, 82, 128, 67, 76, 79, 85, 68, 128, + 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, 79, 84, 72, + 128, 67, 76, 79, 83, 69, 84, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, + 128, 67, 76, 79, 83, 69, 68, 128, 67, 76, 79, 83, 197, 67, 76, 79, 67, + 75, 87, 73, 83, 197, 67, 76, 79, 67, 203, 67, 76, 73, 86, 73, 83, 128, + 67, 76, 73, 80, 66, 79, 65, 82, 68, 128, 67, 76, 73, 78, 75, 73, 78, 199, + 67, 76, 73, 78, 71, 73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, + 76, 73, 70, 70, 128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, + 128, 67, 76, 69, 70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, + 67, 76, 69, 65, 86, 69, 82, 128, 67, 76, 69, 65, 210, 67, 76, 65, 87, + 128, 67, 76, 65, 80, 80, 73, 78, 199, 67, 76, 65, 80, 80, 69, 210, 67, + 76, 65, 78, 128, 67, 76, 65, 73, 77, 128, 67, 76, 128, 67, 73, 88, 128, + 67, 73, 86, 73, 76, 73, 65, 78, 128, 67, 73, 84, 89, 83, 67, 65, 80, 197, + 67, 73, 84, 128, 67, 73, 82, 67, 85, 211, 67, 73, 82, 67, 85, 77, 70, 76, + 69, 88, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, 85, + 76, 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, 67, + 76, 69, 128, 67, 73, 80, 128, 67, 73, 78, 78, 65, 66, 65, 82, 128, 67, + 73, 78, 69, 77, 65, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, 67, 73, + 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, 73, 69, + 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, 69, 85, + 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, 69, 80, + 128, 67, 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, 89, 84, + 128, 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, 80, 128, + 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, 67, 72, + 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, 88, 128, + 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, 79, 128, + 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, 65, 78, 84, + 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, 72, 82, 79, + 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, 193, 67, 72, + 82, 73, 86, 73, 128, 67, 72, 82, 73, 83, 84, 77, 65, 83, 128, 67, 72, 82, + 73, 83, 84, 77, 65, 211, 67, 72, 79, 88, 128, 67, 72, 79, 84, 128, 67, + 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, 75, 69, + 128, 67, 72, 79, 69, 128, 67, 72, 79, 67, 79, 76, 65, 84, 197, 67, 72, + 79, 65, 128, 67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, + 71, 83, 73, 79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, + 71, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, + 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, + 73, 84, 85, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, + 79, 78, 128, 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, + 72, 73, 78, 69, 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, + 67, 72, 73, 76, 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, + 68, 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, + 67, 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, + 45, 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, + 75, 69, 78, 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, + 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, + 67, 72, 69, 84, 128, 67, 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 211, 67, 72, 69, 82, 82, 217, 67, 72, 69, 82, 82, 73, 69, 83, 128, 67, 72, 69, 81, 85, 69, 82, 69, 196, 67, 72, 69, 80, 128, 67, 72, 69, 206, 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, 73, 75, 72, 69, 73, 128, 67, @@ -4084,290 +4109,291 @@ 67, 67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, 67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, 67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76, - 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65, - 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, 69, 128, 67, 65, - 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 128, 67, 65, 82, 211, 67, - 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, 82, 217, 67, 65, - 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, 79, 78, 128, 67, - 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, - 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 68, - 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, 82, 128, 67, 65, - 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, 128, 67, 65, 80, - 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79, 128, 67, 65, 80, 73, 84, 65, - 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, - 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 85, - 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, 68, 82, 65, - 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, 128, 67, 65, 78, - 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, 128, 67, 65, - 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, 195, 67, 65, 77, - 69, 82, 65, 128, 67, 65, 77, 69, 76, 128, 67, 65, 76, 89, 65, 128, 67, - 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, 128, 67, 65, 76, - 69, 78, 68, 65, 82, 128, 67, 65, 76, 67, 128, 67, 65, 75, 82, 65, 128, - 67, 65, 75, 197, 67, 65, 69, 83, 85, 82, 65, 128, 67, 65, 68, 85, 67, 69, - 85, 83, 128, 67, 65, 68, 193, 67, 65, 67, 84, 85, 83, 128, 67, 65, 66, - 76, 69, 87, 65, 89, 128, 67, 65, 66, 66, 65, 71, 69, 45, 84, 82, 69, 69, - 128, 67, 65, 65, 78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, - 52, 128, 67, 48, 50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, - 67, 48, 50, 48, 128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, - 49, 55, 128, 67, 48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, - 128, 67, 48, 49, 51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, - 48, 49, 48, 65, 128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, - 48, 56, 128, 67, 48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, - 128, 67, 48, 48, 52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, - 67, 48, 48, 50, 66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, - 67, 48, 48, 49, 128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, - 45, 51, 57, 128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, - 201, 66, 89, 69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, - 73, 78, 73, 65, 206, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, - 128, 66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, - 66, 85, 84, 84, 79, 78, 128, 66, 85, 212, 66, 85, 83, 84, 211, 66, 85, - 83, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 211, 66, 85, 82, - 213, 66, 85, 82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, - 80, 128, 66, 85, 78, 78, 217, 66, 85, 78, 71, 128, 66, 85, 77, 80, 217, - 66, 85, 76, 85, 71, 128, 66, 85, 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, - 69, 128, 66, 85, 76, 76, 211, 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, - 76, 69, 212, 66, 85, 76, 76, 128, 66, 85, 76, 66, 128, 66, 85, 75, 89, - 128, 66, 85, 73, 76, 68, 73, 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78, - 71, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, - 71, 128, 66, 85, 70, 70, 65, 76, 79, 128, 66, 85, 67, 75, 76, 69, 128, - 66, 83, 84, 65, 82, 128, 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, 66, - 83, 68, 85, 211, 66, 82, 85, 83, 72, 128, 66, 82, 85, 83, 200, 66, 82, - 79, 78, 90, 69, 128, 66, 82, 79, 75, 69, 206, 66, 82, 79, 65, 196, 66, - 82, 73, 83, 84, 76, 69, 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, - 82, 73, 69, 70, 67, 65, 83, 69, 128, 66, 82, 73, 68, 71, 197, 66, 82, 73, - 68, 197, 66, 82, 73, 67, 75, 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, - 69, 86, 69, 45, 77, 65, 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, - 69, 65, 84, 200, 66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66, - 82, 69, 65, 68, 128, 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, - 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, - 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, - 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, 128, 66, 79, 89, 128, 66, - 79, 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, - 71, 128, 66, 79, 87, 76, 128, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, - 79, 85, 81, 85, 69, 84, 128, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, - 84, 79, 77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, - 66, 79, 84, 84, 79, 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, 84, 84, 76, - 197, 66, 79, 84, 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, 82, 65, 88, - 45, 51, 128, 66, 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, 88, 128, - 66, 79, 79, 84, 83, 128, 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, - 78, 71, 128, 66, 79, 79, 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, - 128, 66, 79, 79, 75, 77, 65, 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, - 66, 128, 66, 79, 76, 84, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, 66, - 79, 65, 82, 128, 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 85, 197, - 66, 76, 79, 87, 70, 73, 83, 72, 128, 66, 76, 79, 83, 83, 79, 77, 128, 66, - 76, 79, 79, 68, 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 128, 66, - 76, 69, 78, 68, 69, 196, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, - 66, 76, 65, 68, 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, - 75, 45, 76, 69, 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, - 72, 69, 82, 69, 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, - 84, 84, 69, 82, 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 85, 84, - 200, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, 80, 128, - 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, 66, 73, 82, - 85, 128, 66, 73, 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, 128, 66, - 73, 82, 68, 128, 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, - 85, 76, 65, 210, 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, - 66, 73, 78, 65, 82, 217, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, - 76, 65, 66, 73, 65, 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, - 66, 73, 199, 66, 73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, - 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, 69, 83, 128, - 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, 128, 66, 73, 66, - 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, 72, 85, 128, - 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, 72, 69, 84, - 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, 84, 84, 73, - 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 128, 66, 69, 89, - 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, 69, 128, - 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, 66, 69, 84, - 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, 66, 69, 83, - 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, 69, 210, - 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, 197, 66, - 69, 78, 84, 207, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, 66, 69, - 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, 66, 69, - 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, 66, 69, - 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, 128, 66, - 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, 78, 78, - 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, 73, - 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, 69, - 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, - 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, - 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, 66, - 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, 65, - 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, 66, - 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, 84, - 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, 128, - 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, 128, - 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, 79, - 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, 66, - 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, 128, - 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, 69, - 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, 66, - 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 66, 65, - 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 84, - 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, 77, - 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, 66, 65, 84, 200, 66, 65, 84, - 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, 83, 75, 69, 84, 66, 65, 76, + 68, 82, 79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 85, 128, 67, 65, + 84, 65, 87, 65, 128, 67, 65, 84, 128, 67, 65, 212, 67, 65, 83, 84, 76, + 69, 128, 67, 65, 82, 89, 83, 84, 73, 65, 206, 67, 65, 82, 84, 128, 67, + 65, 82, 211, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, 80, 69, 78, 84, + 82, 217, 67, 65, 82, 208, 67, 65, 82, 79, 85, 83, 69, 204, 67, 65, 82, + 79, 78, 128, 67, 65, 82, 79, 206, 67, 65, 82, 73, 203, 67, 65, 82, 73, + 65, 206, 67, 65, 82, 69, 84, 128, 67, 65, 82, 69, 212, 67, 65, 82, 197, + 67, 65, 82, 68, 83, 128, 67, 65, 82, 68, 128, 67, 65, 82, 196, 67, 65, + 82, 128, 67, 65, 210, 67, 65, 80, 85, 212, 67, 65, 80, 84, 73, 86, 69, + 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, 65, 80, 79, 128, 67, + 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, 76, 65, 84, 73, 79, + 206, 67, 65, 78, 199, 67, 65, 78, 68, 89, 128, 67, 65, 78, 68, 82, 65, + 66, 73, 78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, + 65, 78, 68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, + 128, 67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, + 76, 128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, + 195, 67, 65, 77, 69, 82, 65, 128, 67, 65, 77, 69, 76, 128, 67, 65, 76, + 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, 76, 88, 128, 67, 65, 76, 76, + 128, 67, 65, 76, 69, 78, 68, 65, 82, 128, 67, 65, 76, 67, 128, 67, 65, + 75, 82, 65, 128, 67, 65, 75, 197, 67, 65, 73, 128, 67, 65, 69, 83, 85, + 82, 65, 128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, + 65, 67, 84, 85, 83, 128, 67, 65, 66, 76, 69, 87, 65, 89, 128, 67, 65, 66, + 66, 65, 71, 69, 45, 84, 82, 69, 69, 128, 67, 65, 65, 78, 71, 128, 67, 65, + 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, 50, 51, 128, 67, 48, + 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, 128, 67, 48, 49, 57, + 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, 48, 49, 54, 128, 67, + 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, 51, 128, 67, 48, 49, + 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, 128, 67, 48, 49, 48, + 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, 48, 48, 55, 128, 67, + 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, 52, 128, 67, 48, 48, + 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, 66, 128, 67, 48, 48, + 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, 128, 67, 45, 83, 73, + 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, 128, 67, 45, 49, 56, + 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, 69, 76, 79, 82, 85, + 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, 65, 206, 66, 88, 71, + 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, 66, 87, 69, 128, 66, 87, 65, + 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, 85, 84, 84, 79, 78, 128, 66, + 85, 212, 66, 85, 83, 84, 211, 66, 85, 83, 212, 66, 85, 83, 83, 89, 69, + 82, 85, 128, 66, 85, 211, 66, 85, 82, 213, 66, 85, 82, 50, 128, 66, 85, + 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, 85, 78, 78, 217, 66, + 85, 78, 71, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, + 76, 85, 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, + 66, 85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, + 128, 66, 85, 76, 66, 128, 66, 85, 75, 89, 128, 66, 85, 73, 76, 68, 73, + 78, 71, 83, 128, 66, 85, 73, 76, 68, 73, 78, 71, 128, 66, 85, 72, 73, + 196, 66, 85, 71, 73, 78, 69, 83, 197, 66, 85, 71, 128, 66, 85, 70, 70, + 65, 76, 79, 128, 66, 85, 67, 75, 76, 69, 128, 66, 83, 84, 65, 82, 128, + 66, 83, 75, 85, 210, 66, 83, 75, 65, 173, 66, 83, 68, 85, 211, 66, 82, + 85, 83, 72, 128, 66, 82, 85, 83, 200, 66, 82, 79, 78, 90, 69, 128, 66, + 82, 79, 75, 69, 206, 66, 82, 79, 65, 196, 66, 82, 73, 83, 84, 76, 69, + 128, 66, 82, 73, 71, 72, 84, 78, 69, 83, 211, 66, 82, 73, 69, 70, 67, 65, + 83, 69, 128, 66, 82, 73, 68, 71, 197, 66, 82, 73, 68, 197, 66, 82, 73, + 67, 75, 128, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, 65, + 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, 66, + 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66, 82, 69, 65, 68, 128, + 66, 82, 68, 193, 66, 82, 65, 78, 67, 72, 73, 78, 199, 66, 82, 65, 78, 67, + 72, 128, 66, 82, 65, 78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, + 82, 65, 67, 75, 69, 84, 69, 196, 66, 82, 65, 67, 75, 69, 212, 66, 82, 65, + 67, 69, 128, 66, 81, 128, 66, 79, 89, 128, 66, 79, 87, 84, 73, 69, 128, + 66, 79, 87, 84, 73, 197, 66, 79, 87, 76, 73, 78, 71, 128, 66, 79, 87, 76, + 128, 66, 79, 87, 73, 78, 199, 66, 79, 215, 66, 79, 85, 81, 85, 69, 84, + 128, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, 77, 45, 76, 73, + 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, 66, 79, 84, 84, 79, + 205, 66, 79, 84, 84, 76, 69, 128, 66, 79, 84, 84, 76, 197, 66, 79, 84, + 200, 66, 79, 82, 85, 84, 79, 128, 66, 79, 82, 65, 88, 45, 51, 128, 66, + 79, 82, 65, 88, 45, 50, 128, 66, 79, 82, 65, 88, 128, 66, 79, 79, 84, 83, + 128, 66, 79, 79, 84, 128, 66, 79, 79, 77, 69, 82, 65, 78, 71, 128, 66, + 79, 79, 75, 83, 128, 66, 79, 79, 75, 77, 65, 82, 75, 128, 66, 79, 79, 75, + 77, 65, 82, 203, 66, 79, 78, 69, 128, 66, 79, 77, 66, 128, 66, 79, 76, + 84, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, 66, 79, 65, 82, 128, 66, + 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 85, 197, 66, 76, 79, 87, 70, + 73, 83, 72, 128, 66, 76, 79, 83, 83, 79, 77, 128, 66, 76, 79, 79, 68, + 128, 66, 76, 79, 78, 196, 66, 76, 79, 67, 75, 128, 66, 76, 69, 78, 68, + 69, 196, 66, 76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, + 197, 66, 76, 65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, + 84, 84, 69, 210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, + 196, 66, 76, 65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, + 128, 66, 73, 84, 73, 78, 199, 66, 73, 83, 77, 85, 84, 200, 66, 73, 83, + 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, 80, 128, 66, 73, 83, 69, 67, + 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, 66, 73, 82, 85, 128, 66, 73, + 82, 84, 72, 68, 65, 217, 66, 73, 82, 71, 65, 128, 66, 73, 82, 68, 128, + 66, 73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, 85, 76, 65, 210, + 66, 73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, 73, 78, 65, 82, + 217, 66, 73, 76, 76, 73, 65, 82, 68, 83, 128, 66, 73, 76, 65, 66, 73, 65, + 204, 66, 73, 75, 73, 78, 73, 128, 66, 73, 71, 128, 66, 73, 199, 66, 73, + 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 68, 65, 75, 85, 79, + 206, 66, 73, 67, 89, 67, 76, 73, 83, 84, 128, 66, 73, 67, 89, 67, 76, 69, + 83, 128, 66, 73, 67, 89, 67, 76, 69, 128, 66, 73, 67, 69, 80, 83, 128, + 66, 73, 66, 76, 69, 45, 67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, + 72, 85, 128, 66, 72, 79, 79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, + 72, 69, 84, 72, 128, 66, 72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, + 84, 84, 73, 80, 82, 79, 76, 213, 66, 72, 65, 77, 128, 66, 72, 65, 128, + 66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, + 69, 128, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, + 66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 212, + 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, 206, 66, 69, 82, 66, + 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, 69, 78, 90, 69, 78, + 197, 66, 69, 78, 84, 207, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, + 66, 69, 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, + 66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, + 66, 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, + 128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, + 78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 78, 78, 69, 82, 128, 66, 69, 71, + 73, 206, 66, 69, 70, 79, 82, 197, 66, 69, 69, 84, 76, 69, 128, 66, 69, + 69, 84, 65, 128, 66, 69, 69, 210, 66, 69, 69, 72, 73, 86, 69, 128, 66, + 69, 69, 72, 128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, + 69, 65, 86, 69, 210, 66, 69, 65, 84, 73, 78, 199, 66, 69, 65, 84, 128, + 66, 69, 65, 210, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, 196, 66, 67, + 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, 89, 84, 128, + 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, 66, 66, 85, + 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, 66, 85, 80, + 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, 66, 85, 79, + 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, 128, 66, 66, + 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, 73, 80, 128, + 66, 66, 73, 69, 88, 128, 66, 66, 73, 69, 84, 128, 66, 66, 73, 69, 80, + 128, 66, 66, 73, 69, 128, 66, 66, 73, 128, 66, 66, 69, 88, 128, 66, 66, + 69, 80, 128, 66, 66, 69, 69, 128, 66, 66, 69, 128, 66, 66, 65, 88, 128, + 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 65, 128, 66, 66, + 65, 128, 66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, + 84, 69, 82, 89, 128, 66, 65, 84, 72, 84, 85, 66, 128, 66, 65, 84, 72, 65, + 77, 65, 83, 65, 84, 128, 66, 65, 84, 72, 128, 66, 65, 84, 200, 66, 65, + 84, 65, 203, 66, 65, 83, 83, 65, 128, 66, 65, 83, 75, 69, 84, 66, 65, 76, 204, 66, 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, 66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, 83, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, 72, 128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, 69, 197, 66, 65, 82, 76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79, - 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, 65, 82, 65, 50, 128, - 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, 75, 78, 79, 84, - 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65, - 78, 65, 78, 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, 178, 66, 65, 77, - 66, 79, 79, 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, 65, 76, 85, 68, 65, - 128, 66, 65, 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, 78, 45, 83, 80, 79, - 75, 69, 196, 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, 76, 65, 71, 128, - 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, 65, - 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, 77, - 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 71, 71, 65, 71, - 197, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, - 71, 69, 82, 128, 66, 65, 68, 71, 69, 128, 66, 65, 68, 128, 66, 65, 67, - 84, 82, 73, 65, 206, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, - 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, - 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, 76, 84, 69, 196, 66, - 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, 128, 66, 65, 66, 217, - 66, 65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57, - 128, 66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66, - 50, 53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50, - 128, 66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66, - 50, 52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53, - 128, 66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, - 66, 50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51, - 50, 128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50, - 50, 56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181, - 66, 50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49, - 57, 128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128, - 66, 50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50, - 49, 50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57, - 128, 66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66, - 50, 48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48, - 50, 128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66, - 49, 57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56, - 52, 128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128, - 66, 49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49, - 55, 55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66, - 49, 55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54, - 57, 128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, - 66, 49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, - 178, 66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, - 53, 56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, - 66, 49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, - 53, 177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, - 49, 52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, - 49, 51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, - 49, 50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, - 50, 178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, - 48, 57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, - 205, 66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, - 49, 48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, - 66, 49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, - 48, 56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, - 66, 48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, - 176, 66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, - 182, 66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, - 66, 48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, - 48, 54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, - 48, 54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, - 48, 53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, - 48, 53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, - 53, 177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, - 52, 55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, - 52, 179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, - 185, 66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, - 128, 66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, - 66, 48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, - 48, 50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, - 48, 50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, - 66, 48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, - 48, 49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, - 48, 57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, - 48, 48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, - 66, 48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, - 48, 52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, - 48, 48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, - 65, 90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128, - 65, 88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86, - 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, - 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, - 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, 66, 73, 76, 69, - 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, 82, 65, 204, - 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, 65, 77, 65, - 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 45, - 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, - 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, - 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, 128, 65, - 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, 84, 69, 78, - 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 79, 205, 65, 84, 78, - 65, 200, 65, 84, 77, 65, 65, 85, 128, 65, 84, 73, 89, 65, 128, 65, 84, - 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195, - 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 90, 128, 65, 83, 89, 85, - 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, - 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, 79, 76, 79, 71, - 73, 67, 65, 204, 65, 83, 84, 79, 78, 73, 83, 72, 69, 196, 65, 83, 84, 69, - 82, 73, 83, 77, 128, 65, 83, 84, 69, 82, 73, 83, 75, 211, 65, 83, 84, 69, - 82, 73, 83, 75, 128, 65, 83, 84, 69, 82, 73, 83, 203, 65, 83, 84, 69, 82, - 73, 83, 67, 85, 83, 128, 65, 83, 83, 89, 82, 73, 65, 206, 65, 83, 83, 69, - 82, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, 196, 65, 83, 80, - 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, 76, 73, 65, 128, - 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, 65, 83, 72, 57, - 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, 128, 65, 83, 67, 69, 78, - 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, 82, 85, 72, 85, 65, 128, - 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, 84, 69, 196, 65, - 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, 128, 65, 82, 83, 69, 79, - 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, 128, 65, - 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, 65, 82, 82, - 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, 76, 128, 65, - 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, 80, 69, 71, 71, - 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, 79, 85, 82, - 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, 128, 65, 82, - 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, 77, 79, 85, 82, 128, 65, - 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, 207, 65, 82, - 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, 73, 83, 84, 69, - 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, 69, 83, 128, - 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, 78, 84, 72, - 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, 128, 65, - 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 67, 72, 65, 73, - 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, 73, - 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, 65, - 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, 128, - 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 69, 79, 128, 65, - 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, 128, 65, 82, 65, - 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, 68, 73, - 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 65, 72, 77, 65, 206, - 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, 83, - 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, 65, - 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, 65, - 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, 80, - 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, 65, - 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 79, 84, 72, 69, 83, - 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, 80, - 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, 83, - 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, 80, - 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, 76, - 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 73, 78, 128, 65, 80, 69, 83, - 207, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, 85, - 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, 65, - 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, 78, - 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, 84, - 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, 84, - 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, 73, - 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, 65, - 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, 65, - 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, 75, - 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, 76, - 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, 84, - 69, 78, 78, 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, 65, - 78, 83, 85, 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, 65, - 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, 79, - 206, 65, 78, 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 72, 85, - 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 83, 84, 82, 79, 205, - 65, 78, 71, 82, 217, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, 65, 78, - 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, 65, 78, - 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, 82, - 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, 80, - 128, 65, 77, 80, 83, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, 65, - 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, 65, 77, 69, 82, - 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, 65, 77, 66, + 79, 83, 65, 78, 128, 66, 65, 82, 66, 69, 210, 66, 65, 82, 194, 66, 65, + 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, 84, 79, 67, 128, 66, 65, 78, + 75, 78, 79, 84, 197, 66, 65, 78, 75, 128, 66, 65, 78, 203, 66, 65, 78, + 68, 128, 66, 65, 78, 65, 78, 65, 128, 66, 65, 78, 50, 128, 66, 65, 78, + 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, 65, 77, 66, 79, 79, 128, 66, + 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 79, 212, 66, 65, 76, 76, 79, 79, + 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 76, 79, 79, 78, 128, 66, 65, + 76, 65, 71, 128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, + 78, 128, 66, 65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, + 73, 82, 71, 79, 77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, + 65, 71, 71, 65, 71, 197, 66, 65, 71, 65, 128, 66, 65, 71, 51, 128, 66, + 65, 199, 66, 65, 68, 71, 69, 82, 128, 66, 65, 68, 71, 69, 128, 66, 65, + 68, 128, 66, 65, 67, 84, 82, 73, 65, 206, 66, 65, 67, 75, 83, 80, 65, 67, + 69, 128, 66, 65, 67, 75, 83, 76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, + 65, 83, 200, 66, 65, 67, 75, 72, 65, 78, 196, 66, 65, 67, 75, 45, 84, 73, + 76, 84, 69, 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, 65, 66, 89, + 128, 66, 65, 66, 217, 66, 65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, + 128, 66, 50, 53, 57, 128, 66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, + 50, 53, 54, 128, 66, 50, 53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, + 128, 66, 50, 53, 50, 128, 66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, + 50, 52, 57, 128, 66, 50, 52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, + 128, 66, 50, 52, 53, 128, 66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, + 177, 66, 50, 52, 176, 66, 50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, + 51, 179, 66, 50, 51, 50, 128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, + 50, 57, 128, 66, 50, 50, 56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, + 128, 66, 50, 50, 181, 66, 50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, + 50, 176, 66, 50, 49, 57, 128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, + 66, 50, 49, 54, 128, 66, 50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, + 49, 51, 128, 66, 50, 49, 50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, + 128, 66, 50, 48, 57, 128, 66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, + 50, 48, 54, 128, 66, 50, 48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, + 51, 128, 66, 50, 48, 50, 128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, + 66, 49, 57, 177, 66, 49, 57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, + 53, 128, 66, 49, 56, 52, 128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, + 66, 49, 56, 49, 128, 66, 49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, + 55, 56, 128, 66, 49, 55, 55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, + 66, 49, 55, 179, 66, 49, 55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, + 48, 128, 66, 49, 54, 57, 128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, + 66, 49, 54, 54, 128, 66, 49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, + 54, 179, 66, 49, 54, 178, 66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, + 49, 53, 185, 66, 49, 53, 56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, + 66, 49, 53, 53, 128, 66, 49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, + 53, 50, 128, 66, 49, 53, 177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, + 66, 49, 52, 181, 66, 49, 52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, + 66, 49, 51, 181, 66, 49, 51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, + 66, 49, 51, 176, 66, 49, 50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, + 49, 50, 179, 66, 49, 50, 178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, + 48, 57, 205, 66, 49, 48, 57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, + 198, 66, 49, 48, 55, 205, 66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, + 49, 48, 54, 198, 66, 49, 48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, + 181, 66, 49, 48, 180, 66, 49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, + 66, 48, 57, 176, 66, 48, 56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, + 128, 66, 48, 56, 181, 66, 48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, + 56, 177, 66, 48, 56, 176, 66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, + 55, 183, 66, 48, 55, 182, 66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, + 179, 66, 48, 55, 178, 66, 48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, + 66, 48, 54, 184, 66, 48, 54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, + 48, 54, 52, 128, 66, 48, 54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, + 66, 48, 54, 176, 66, 48, 53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, + 48, 53, 54, 128, 66, 48, 53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, + 48, 53, 178, 66, 48, 53, 177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, + 48, 52, 184, 66, 48, 52, 55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, + 48, 52, 180, 66, 48, 52, 179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, + 52, 176, 66, 48, 51, 185, 66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, + 182, 66, 48, 51, 52, 128, 66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, + 177, 66, 48, 51, 176, 66, 48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, + 66, 48, 50, 182, 66, 48, 50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, + 48, 50, 50, 128, 66, 48, 50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, + 66, 48, 49, 56, 128, 66, 48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, + 66, 48, 49, 180, 66, 48, 49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, + 48, 49, 176, 66, 48, 48, 57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, + 66, 48, 48, 184, 66, 48, 48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, + 128, 66, 48, 48, 182, 66, 48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, + 48, 48, 181, 66, 48, 48, 52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, + 66, 48, 48, 179, 66, 48, 48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, + 128, 66, 48, 48, 177, 65, 90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, + 65, 89, 65, 72, 128, 65, 88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, + 84, 65, 206, 65, 86, 69, 82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, + 83, 65, 78, 89, 65, 128, 65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, + 65, 78, 78, 65, 128, 65, 85, 84, 85, 77, 78, 128, 65, 85, 84, 79, 77, 79, + 66, 73, 76, 69, 128, 65, 85, 84, 79, 77, 65, 84, 69, 196, 65, 85, 83, 84, + 82, 65, 204, 65, 85, 82, 73, 80, 73, 71, 77, 69, 78, 84, 128, 65, 85, 82, + 65, 77, 65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, + 65, 65, 45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, + 78, 78, 128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, + 84, 73, 79, 206, 65, 85, 69, 128, 65, 85, 66, 69, 82, 71, 73, 78, 69, + 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, 65, 78, 128, 65, 84, + 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, 203, 65, 84, 79, 205, + 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, 85, 128, 65, 84, 73, 89, 65, + 128, 65, 84, 72, 76, 69, 84, 73, 195, 65, 84, 72, 65, 82, 86, 65, 86, 69, + 68, 73, 195, 65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 90, 128, + 65, 83, 89, 85, 82, 193, 65, 83, 89, 77, 80, 84, 79, 84, 73, 67, 65, 76, + 76, 217, 65, 83, 84, 82, 79, 78, 79, 77, 73, 67, 65, 204, 65, 83, 84, 82, + 79, 76, 79, 71, 73, 67, 65, 204, 65, 83, 84, 79, 78, 73, 83, 72, 69, 196, + 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, 69, 82, 73, 83, 75, 211, + 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, 69, 82, 73, 83, 203, 65, + 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, 83, 89, 82, 73, 65, 206, + 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, 80, 73, 82, 65, 84, 69, + 196, 65, 83, 80, 69, 82, 128, 65, 83, 73, 65, 45, 65, 85, 83, 84, 82, 65, + 76, 73, 65, 128, 65, 83, 72, 71, 65, 66, 128, 65, 83, 72, 69, 83, 128, + 65, 83, 72, 57, 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, 128, 65, + 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, 82, 85, 72, + 85, 65, 128, 65, 82, 84, 73, 83, 212, 65, 82, 84, 73, 67, 85, 76, 65, 84, + 69, 196, 65, 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, 128, 65, 82, + 83, 69, 79, 211, 65, 82, 83, 69, 78, 73, 67, 128, 65, 82, 82, 79, 87, 83, + 128, 65, 82, 82, 79, 87, 211, 65, 82, 82, 79, 87, 72, 69, 65, 68, 128, + 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, 82, 79, 87, 45, 84, 65, 73, + 76, 128, 65, 82, 82, 73, 86, 69, 128, 65, 82, 82, 65, 89, 128, 65, 82, + 80, 69, 71, 71, 73, 65, 84, 207, 65, 82, 79, 85, 83, 73, 78, 199, 65, 82, + 79, 85, 82, 193, 65, 82, 79, 85, 78, 68, 45, 80, 82, 79, 70, 73, 76, 69, + 128, 65, 82, 79, 85, 78, 196, 65, 82, 77, 89, 128, 65, 82, 77, 79, 85, + 82, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, 65, 82, 75, 84, 73, 75, + 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, 78, 85, 128, 65, 82, + 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, 82, 193, 65, 82, 73, + 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, 65, 82, 71, 79, 83, 89, + 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, 128, 65, 82, 69, 80, 65, + 128, 65, 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, 65, 128, 65, 82, 67, 72, + 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, 206, 65, 82, 67, 72, 65, + 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, 82, 195, 65, 82, 65, 77, + 65, 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, 82, 65, 69, 65, 45, 85, + 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, 69, 65, 45, 69, 79, + 128, 65, 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, 65, 45, 65, 128, + 65, 82, 65, 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, 73, 67, 45, 73, 78, + 68, 73, 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, 82, 65, 72, 77, 65, + 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, 85, 65, 82, 73, 85, + 83, 128, 65, 81, 85, 65, 70, 79, 82, 84, 73, 83, 128, 65, 81, 85, 193, + 65, 80, 85, 206, 65, 80, 82, 73, 76, 128, 65, 80, 80, 82, 79, 88, 73, 77, + 65, 84, 69, 76, 217, 65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 128, 65, + 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, 80, 80, 82, 79, 65, 67, 72, 128, + 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 65, 80, 79, 84, 72, 69, + 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, 128, 65, 80, 79, 83, 84, 82, 79, + 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 83, 128, 65, 80, 79, + 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, 83, 84, 82, 79, 70, 79, 201, 65, + 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, 79, 68, 69, 82, 77, 193, 65, 80, + 76, 79, 85, 78, 128, 65, 80, 76, 201, 65, 80, 73, 78, 128, 65, 80, 69, + 83, 207, 65, 80, 65, 82, 84, 128, 65, 80, 65, 65, 84, 79, 128, 65, 78, + 85, 83, 86, 65, 82, 65, 89, 65, 128, 65, 78, 85, 83, 86, 65, 82, 65, 128, + 65, 78, 85, 83, 86, 65, 82, 193, 65, 78, 85, 68, 65, 84, 84, 65, 128, 65, + 78, 85, 68, 65, 84, 84, 193, 65, 78, 84, 73, 82, 69, 83, 84, 82, 73, 67, + 84, 73, 79, 78, 128, 65, 78, 84, 73, 77, 79, 78, 89, 45, 50, 128, 65, 78, + 84, 73, 77, 79, 78, 89, 128, 65, 78, 84, 73, 77, 79, 78, 217, 65, 78, 84, + 73, 77, 79, 78, 73, 65, 84, 69, 128, 65, 78, 84, 73, 75, 69, 78, 79, 77, + 65, 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, 83, 77, 65, 128, + 65, 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, 67, 76, 79, 67, + 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, 78, 84, 73, 67, + 76, 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 69, 78, 78, 65, 128, 65, 78, + 84, 69, 78, 78, 193, 65, 78, 84, 65, 82, 71, 79, 77, 85, 75, 72, 65, 128, + 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, 128, 65, 78, 80, 69, 65, 128, + 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, 65, 78, 78, 79, 84, 65, 84, 73, + 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, 78, 75, 72, 128, 65, 78, 72, + 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, 65, 78, 71, 83, 84, 82, 79, + 205, 65, 78, 71, 82, 217, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, 128, + 65, 78, 71, 69, 210, 65, 78, 71, 69, 76, 128, 65, 78, 71, 69, 68, 128, + 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, 82, 65, 128, 65, 78, 67, 72, 79, + 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, 73, 83, 77, 65, 128, 65, 78, 65, + 80, 128, 65, 77, 80, 83, 128, 65, 77, 80, 69, 82, 83, 65, 78, 68, 128, + 65, 77, 79, 85, 78, 212, 65, 77, 69, 82, 73, 67, 65, 83, 128, 65, 77, 69, + 82, 73, 67, 65, 206, 65, 77, 66, 85, 76, 65, 78, 67, 69, 128, 65, 77, 66, 193, 65, 77, 65, 82, 128, 65, 77, 65, 210, 65, 77, 65, 76, 71, 65, 77, 65, 84, 73, 79, 206, 65, 77, 65, 76, 71, 65, 77, 128, 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 85, 77, 128, 65, 76, 84, 69, 82, 78, 65, 84, 73, 86, @@ -4386,7289 +4412,7306 @@ 75, 65, 66, 128, 65, 75, 83, 65, 128, 65, 75, 72, 77, 73, 77, 73, 195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, 65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, 79, - 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, 73, - 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, 128, - 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 71, 71, 65, - 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, 201, - 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, 86, - 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, 70, - 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, 77, - 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, 70, - 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69, 89, 65, 78, 78, 65, 128, 65, - 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, - 67, 128, 65, 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, 69, 82, 128, 65, - 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, 128, 65, 69, 75, - 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, 69, 89, 65, 78, - 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, 76, 76, 65, - 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, 84, 65, 71, - 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, 128, 65, 68, - 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 82, 69, 83, - 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, 84, 69, 45, - 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, 65, 86, 69, - 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, 85, 65, 76, - 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, 72, 79, 78, - 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, 67, 67, 85, - 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, 212, 65, 67, - 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, 65, - 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, 212, 65, - 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, 85, 78, 68, - 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, 66, 66, 82, - 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, 128, 65, 66, - 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, 128, - 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, 73, - 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, 51, - 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, 48, - 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, 65, - 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, 65, - 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, 128, - 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, 54, - 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, 49, - 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, 48, - 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, 65, - 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55, - 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, 65, 48, 48, - 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, 65, 65, 48, - 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, - 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, - 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, - 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, - 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, - 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, - 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, - 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52, 53, 65, 128, 65, 48, - 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51, 65, 128, 65, 48, 52, - 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50, 128, 65, 48, 52, 49, - 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 128, - 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, 128, 65, 48, - 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, 48, 51, 50, - 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 48, - 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, 128, 65, 45, - 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, 72, 89, 85, - 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, 67, 72, 65, - 210, 45, 67, 72, 65, 76, 128, + 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 213, 65, 73, 78, + 78, 128, 65, 73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, + 86, 85, 83, 128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, + 65, 71, 71, 65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, + 71, 79, 71, 201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, + 71, 82, 65, 86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, + 210, 65, 70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, + 79, 82, 69, 77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, + 78, 201, 65, 70, 70, 82, 73, 67, 65, 84, 73, 79, 206, 65, 69, 89, 65, 78, + 78, 65, 128, 65, 69, 89, 128, 65, 69, 83, 67, 85, 76, 65, 80, 73, 85, 83, + 128, 65, 69, 83, 67, 128, 65, 69, 83, 128, 65, 69, 82, 73, 65, 204, 65, + 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, 69, 76, + 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, 65, 69, + 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, 80, 73, + 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 68, 86, 65, 78, + 84, 65, 71, 69, 128, 65, 68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, + 128, 65, 68, 69, 199, 65, 68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, + 82, 69, 83, 211, 65, 68, 68, 65, 75, 128, 65, 68, 65, 203, 65, 67, 85, + 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, 69, 45, 71, 82, + 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, 197, 65, 67, 84, + 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, 65, 67, 82, 79, 80, + 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, 68, 71, 69, 128, 65, + 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, 67, 67, 79, 85, 78, + 212, 65, 67, 67, 69, 80, 84, 128, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, + 67, 67, 65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, + 212, 65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, + 85, 78, 68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, + 66, 66, 82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, + 128, 65, 66, 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, + 65, 87, 128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, + 73, 76, 73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, + 65, 48, 51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, + 65, 65, 48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, + 128, 65, 65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, + 50, 128, 65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, + 49, 57, 128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, + 48, 49, 54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, + 65, 48, 49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, + 65, 65, 48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, + 128, 65, 65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, + 48, 48, 55, 128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, + 65, 48, 48, 52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, + 65, 65, 48, 48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, + 48, 54, 56, 128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65, 48, 54, + 53, 128, 65, 48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, + 65, 48, 54, 49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, + 53, 56, 128, 65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, + 128, 65, 48, 53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, + 48, 53, 49, 128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, + 56, 128, 65, 48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52, 53, 65, + 128, 65, 48, 52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51, 65, 128, + 65, 48, 52, 51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50, 128, 65, + 48, 52, 49, 128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, + 51, 57, 128, 65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, + 128, 65, 48, 51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, + 48, 51, 50, 65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, + 65, 48, 48, 54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, + 128, 65, 45, 69, 85, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, + 72, 89, 85, 196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, + 67, 72, 65, 210, 45, 67, 72, 65, 76, 128, }; static unsigned int lexicon_offset[] = { - 0, 0, 6, 10, 15, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108, - 113, 121, 130, 135, 140, 144, 150, 153, 158, 166, 173, 181, 186, 191, - 194, 200, 208, 215, 225, 232, 241, 244, 247, 252, 258, 262, 271, 278, - 285, 290, 299, 307, 313, 319, 325, 141, 330, 331, 337, 345, 351, 357, - 365, 372, 374, 377, 381, 388, 390, 397, 402, 408, 410, 417, 425, 427, - 311, 430, 432, 437, 442, 447, 453, 460, 469, 479, 484, 489, 493, 506, - 513, 517, 526, 533, 540, 543, 549, 553, 563, 571, 579, 588, 596, 604, - 609, 617, 624, 634, 645, 649, 654, 657, 661, 665, 666, 672, 678, 680, - 683, 687, 344, 690, 694, 703, 706, 709, 714, 718, 726, 729, 735, 742, - 749, 758, 765, 774, 779, 783, 792, 802, 811, 817, 823, 830, 838, 846, - 855, 863, 867, 875, 880, 781, 511, 889, 893, 897, 904, 908, 915, 689, - 918, 926, 929, 933, 940, 944, 949, 957, 960, 192, 966, 971, 981, 990, - 997, 1004, 1012, 1020, 1026, 1030, 1035, 1040, 1046, 1051, 1054, 111, - 1060, 1064, 1070, 1073, 1086, 1089, 1093, 22, 1097, 1102, 1105, 1108, - 1114, 1124, 1126, 1132, 1142, 1147, 1156, 1164, 328, 1167, 1170, 1174, - 1179, 1185, 1190, 1197, 1199, 1204, 1209, 1215, 1220, 1225, 1229, 1234, - 1240, 1245, 1250, 1254, 1259, 1264, 1268, 1273, 1278, 1283, 1289, 1295, - 1301, 1306, 1310, 1315, 1320, 1325, 1329, 1334, 1339, 1344, 1349, 1200, - 1205, 1210, 1216, 1221, 1353, 1226, 1359, 1368, 1230, 1372, 1235, 1241, - 1246, 1376, 1381, 1386, 1390, 1394, 1400, 1404, 1251, 1407, 1411, 1255, - 1417, 1260, 1421, 1425, 1265, 1429, 1434, 1438, 1441, 1445, 1269, 1274, - 1450, 1279, 1456, 1462, 1468, 1474, 1284, 1296, 1302, 1478, 1482, 1486, - 1489, 1307, 1493, 1495, 1500, 1505, 1511, 1516, 1521, 1525, 1530, 1535, - 1540, 1545, 1551, 1556, 1561, 1567, 1573, 1578, 1582, 1587, 1592, 1597, - 1602, 1606, 1614, 1618, 1623, 1628, 1633, 1638, 1642, 1645, 1650, 1655, - 1660, 1665, 1671, 1676, 1680, 1311, 1683, 1688, 1693, 1316, 1697, 1701, - 1708, 1321, 1715, 1326, 1719, 1721, 1726, 1732, 1330, 1737, 1746, 1335, - 1751, 1757, 1340, 1762, 1767, 1770, 1775, 1779, 1783, 1787, 1790, 1794, - 1345, 1350, 1100, 1799, 1805, 1811, 1817, 1823, 1829, 1835, 1841, 1847, - 1852, 1858, 1864, 1870, 1876, 1882, 1888, 1894, 1900, 1906, 1911, 1916, - 1921, 1926, 1931, 1936, 1941, 1946, 1951, 1956, 1962, 1967, 1973, 1978, - 1984, 1990, 1995, 2001, 2007, 2013, 2019, 2024, 2029, 2031, 2032, 2036, - 2040, 2045, 2049, 2053, 2057, 2061, 2064, 2069, 2073, 2078, 2082, 2086, - 2091, 2095, 2098, 2102, 2108, 2122, 2126, 2130, 2133, 2138, 2142, 2146, - 2149, 2153, 2158, 2163, 2168, 2173, 2177, 2181, 2185, 2190, 2194, 2199, - 2203, 2208, 2214, 2221, 2227, 2232, 2237, 2242, 2248, 2253, 2259, 2264, - 2267, 1217, 2269, 2276, 2284, 2294, 2303, 2317, 2321, 2325, 2338, 2346, - 2350, 2355, 2359, 2362, 2366, 2370, 2375, 2380, 2385, 2389, 2392, 2396, - 2403, 2410, 2416, 2421, 2426, 2432, 2438, 2443, 2446, 1723, 2448, 2454, - 2458, 2463, 2467, 2471, 1728, 1734, 2476, 2480, 2483, 2488, 2493, 2498, - 2503, 2507, 2514, 2519, 2522, 2529, 2535, 2539, 2543, 2547, 2552, 2559, - 2564, 2569, 2576, 2582, 2588, 2594, 2608, 2625, 2640, 2655, 2664, 2669, - 2673, 2678, 2683, 2687, 2699, 2706, 2712, 2217, 2718, 2725, 2731, 2735, - 2738, 2745, 2751, 2755, 2759, 2763, 2054, 2767, 2772, 2777, 2781, 2789, - 2793, 2797, 2801, 2806, 2811, 2816, 2820, 2825, 2830, 2834, 2839, 2843, - 2846, 2850, 2854, 2859, 2863, 2867, 2873, 2882, 2886, 2890, 2896, 2901, - 2908, 2912, 2922, 2926, 2931, 2935, 2940, 2946, 2951, 2955, 2959, 2963, - 2406, 2971, 2976, 2982, 2987, 2991, 2996, 3001, 3005, 3011, 3016, 3022, - 3026, 3032, 3037, 3042, 3047, 3052, 3057, 3062, 3067, 3072, 3077, 3083, - 3088, 1227, 80, 3094, 3098, 3102, 3106, 3111, 3115, 3119, 3123, 3127, - 3132, 3136, 3141, 3145, 3148, 3152, 3157, 3161, 3166, 3170, 3174, 3178, - 3183, 3187, 3190, 3203, 3207, 3211, 3215, 3219, 3223, 3226, 3230, 3234, - 3239, 3243, 3248, 3253, 3258, 3262, 3265, 3268, 3274, 3278, 3282, 3285, - 3289, 3293, 3296, 3302, 3307, 3312, 3318, 3323, 3328, 3334, 3340, 3345, - 3350, 3355, 1091, 542, 3360, 3363, 3368, 3372, 3375, 3379, 3384, 3389, - 3393, 3398, 3402, 3407, 3411, 3415, 3421, 3427, 3430, 3433, 3439, 3446, - 3453, 3459, 3466, 3471, 3475, 3482, 3487, 3491, 3501, 3505, 3509, 3514, - 3519, 3529, 2065, 3534, 3538, 3541, 3547, 3552, 3558, 3564, 3569, 3576, - 3580, 3584, 658, 688, 3588, 3595, 3602, 3609, 3615, 3621, 3626, 3630, - 3636, 3641, 3645, 2074, 3649, 3657, 583, 3663, 3674, 3678, 3688, 2079, - 3694, 3699, 3714, 3720, 3727, 3737, 3743, 3748, 3754, 3760, 3763, 3767, - 3772, 3779, 3784, 3788, 3792, 3796, 3800, 3805, 3811, 3153, 3816, 3828, - 3836, 3841, 1527, 3848, 3851, 3854, 3858, 3861, 3867, 3871, 3885, 3889, - 3892, 3896, 3902, 3908, 3913, 3917, 3921, 3927, 3938, 3944, 3949, 3955, - 3959, 3967, 3977, 3983, 3988, 3997, 4005, 4012, 4016, 4022, 4031, 4040, - 4044, 4049, 4054, 4058, 4066, 4070, 4075, 4079, 2087, 1369, 4085, 4090, - 4096, 4101, 4106, 4111, 4116, 4121, 4126, 4132, 4137, 4143, 4148, 4153, - 4158, 4164, 4169, 4174, 4179, 4184, 4190, 4195, 4201, 4206, 4211, 4216, - 4221, 4226, 4231, 4237, 4242, 4247, 335, 436, 4252, 4258, 4262, 4266, - 4271, 4275, 4279, 4282, 4286, 4290, 4294, 4299, 4303, 4307, 4313, 4082, - 4318, 4321, 4328, 4332, 4345, 4349, 4353, 4357, 4361, 4365, 4369, 4375, - 4382, 4390, 4394, 4402, 4411, 4417, 4429, 4434, 4437, 4441, 4451, 4459, - 4467, 4473, 4477, 4487, 4497, 4505, 4512, 4519, 4525, 4531, 4538, 4542, - 4549, 4559, 4569, 4577, 4584, 4589, 4593, 4601, 4606, 4613, 4621, 4626, - 4631, 4635, 4649, 4654, 4659, 4666, 4675, 4678, 4682, 4686, 4689, 4694, - 4699, 4708, 4714, 4720, 4726, 4730, 4741, 4751, 4766, 4781, 4796, 4811, - 4826, 4841, 4856, 4871, 4886, 4901, 4916, 4931, 4946, 4961, 4976, 4991, - 5006, 5021, 5036, 5051, 5066, 5081, 5096, 5111, 5126, 5141, 5156, 5171, - 5186, 5201, 5216, 5231, 5246, 5261, 5276, 5291, 5306, 5321, 5336, 5351, - 5366, 5381, 5396, 5411, 5426, 5441, 5456, 5471, 5486, 5495, 5504, 5509, - 5515, 5525, 5529, 5534, 5539, 5547, 5551, 5554, 5558, 2917, 5561, 5566, - 310, 445, 5572, 5580, 5584, 5588, 5591, 5597, 5601, 5609, 5615, 5620, - 5627, 5634, 5640, 5645, 5652, 5658, 5666, 5670, 5675, 5687, 5698, 5705, - 5711, 3175, 5715, 5721, 5726, 5731, 5736, 5742, 5747, 5752, 5757, 5762, - 5768, 5773, 5778, 5784, 5789, 5795, 5800, 5806, 5811, 5817, 5822, 5827, - 5832, 5837, 5842, 5848, 5853, 5858, 5863, 5869, 5875, 5881, 5887, 5893, - 5899, 5905, 5911, 5917, 5923, 5929, 5935, 5940, 5945, 5950, 5955, 5960, - 5965, 5970, 5975, 5981, 5987, 5992, 5998, 6004, 6010, 6015, 6020, 6025, - 6030, 6036, 6042, 6047, 6052, 6057, 6062, 6067, 6073, 6078, 6084, 6090, - 6096, 6102, 6108, 6114, 6120, 6126, 6132, 2096, 5590, 6137, 6141, 6145, - 6148, 6155, 6158, 6166, 6171, 6176, 6167, 6181, 6168, 6185, 6191, 6197, - 6202, 6207, 6214, 6222, 6227, 6231, 6234, 6238, 2127, 551, 6242, 6246, - 6251, 6257, 6262, 6266, 6269, 6273, 6279, 6284, 6288, 6295, 6299, 6303, - 6307, 946, 747, 6310, 6318, 6325, 6332, 6338, 6345, 6353, 6360, 6367, - 6372, 6384, 1247, 1377, 1382, 6395, 1387, 6399, 6403, 6412, 6420, 6429, - 6435, 6440, 6444, 6450, 6455, 6462, 6466, 6475, 6484, 6493, 6502, 6507, - 6512, 6524, 6529, 6537, 2178, 6541, 6543, 6548, 6552, 6561, 6569, 1391, - 133, 3403, 3408, 6575, 6579, 6588, 6594, 6599, 6602, 6611, 2652, 6617, - 6625, 6629, 6633, 2191, 6637, 6642, 6649, 6655, 6661, 6664, 6666, 6669, - 6677, 6685, 6693, 6696, 6701, 6178, 6704, 6706, 6711, 6716, 6721, 6726, - 6731, 6736, 6741, 6746, 6751, 6756, 6762, 6767, 6772, 6777, 6783, 6788, - 6793, 6798, 6803, 6808, 6813, 6819, 6824, 6829, 6834, 6839, 6844, 6849, - 6854, 6859, 6864, 6869, 6874, 6879, 6884, 6889, 6894, 6899, 6904, 6910, - 6916, 6921, 6926, 6931, 6936, 6941, 2215, 2222, 2228, 6946, 6952, 2254, - 2260, 6960, 6964, 6969, 6973, 6977, 6981, 6986, 6990, 6995, 6999, 7002, - 7005, 7011, 7017, 7023, 7029, 7035, 7041, 7047, 7051, 7055, 7059, 7063, - 7067, 7072, 7079, 7090, 7098, 7108, 7115, 7120, 7124, 7135, 7148, 7159, - 7172, 7183, 7195, 7207, 7219, 7232, 7245, 7252, 7258, 7272, 7279, 7285, - 7289, 7294, 7298, 7305, 7313, 7317, 7323, 7329, 7339, 7343, 7348, 7353, - 7360, 7366, 7376, 6340, 7382, 7386, 7393, 746, 7397, 7401, 7406, 7411, - 7416, 7420, 7426, 7434, 7440, 7444, 7450, 7460, 7464, 7470, 7475, 7479, - 7485, 7491, 2119, 7496, 7498, 7506, 7515, 7519, 7525, 7530, 7535, 7540, - 7545, 7551, 7556, 3923, 7561, 7565, 7571, 7576, 7582, 7587, 7592, 7598, - 7603, 7520, 7609, 7613, 7620, 7626, 7631, 7635, 4645, 7640, 7649, 6645, - 6652, 7654, 2803, 7658, 7663, 7668, 7531, 7672, 7536, 7541, 7677, 7684, - 7691, 7697, 7703, 7709, 7714, 7719, 7724, 7546, 7552, 7730, 7736, 7741, - 7749, 7557, 7754, 1028, 7757, 7765, 7771, 7777, 7786, 7794, 7799, 7805, - 7813, 7820, 7835, 7852, 7871, 7880, 7888, 7903, 7914, 7924, 7934, 7942, - 7948, 7960, 7969, 7977, 7984, 7991, 7997, 8002, 8010, 8020, 8027, 8037, - 8047, 8057, 8065, 8072, 8081, 8091, 8105, 8120, 8129, 8137, 8142, 8146, - 8155, 8161, 8166, 8176, 8186, 8196, 8201, 8205, 8214, 8219, 8229, 8240, - 8253, 8266, 8278, 8286, 8291, 8295, 8301, 8306, 8314, 8322, 8329, 8334, - 8342, 8348, 8351, 8355, 8361, 8369, 8374, 8378, 8386, 8395, 8403, 8409, - 8413, 8420, 8431, 8435, 8438, 8444, 8449, 8453, 8459, 8466, 8472, 8477, - 8484, 8491, 8498, 8505, 8512, 8519, 8524, 7848, 8529, 8535, 8542, 8549, - 8554, 8561, 8570, 8574, 8586, 8590, 8593, 8597, 8601, 8605, 8609, 8615, - 8620, 8626, 8631, 8636, 8642, 8647, 8652, 7356, 8657, 8661, 8665, 8669, - 8674, 8679, 8687, 8693, 8697, 8701, 8708, 8713, 8721, 8726, 8730, 8733, - 8739, 8746, 8750, 8753, 8758, 8762, 3962, 8768, 8777, 36, 8785, 8791, - 8796, 7371, 8801, 8807, 8812, 8816, 8819, 8834, 8853, 8865, 8878, 8891, - 8904, 8918, 8931, 8946, 8953, 8959, 8963, 8977, 8982, 8988, 8993, 9001, - 9006, 6471, 9011, 9014, 9021, 9026, 9030, 2808, 955, 9036, 9040, 9046, - 9052, 9057, 9063, 9068, 7566, 9074, 9080, 9085, 9090, 9098, 9104, 9117, - 9125, 9132, 7572, 9138, 9146, 9154, 9161, 9174, 9186, 9196, 9203, 9210, - 9219, 9228, 9236, 9243, 9248, 9254, 7577, 9259, 9265, 7583, 9270, 9273, - 9280, 9286, 9299, 7083, 9310, 9316, 9325, 9333, 9340, 9346, 9352, 9357, - 9361, 9366, 8826, 9372, 7588, 9379, 9384, 9391, 9397, 9403, 9408, 9416, - 9424, 9431, 9435, 9449, 9459, 9464, 9468, 9479, 9485, 9490, 9495, 7593, - 7599, 9499, 9502, 9507, 9519, 9526, 9531, 9535, 9540, 9544, 9551, 9557, - 7604, 7521, 9564, 2813, 8, 9571, 9576, 9580, 9586, 9594, 9604, 9609, - 9614, 9621, 9628, 9632, 9643, 9653, 9662, 9674, 9679, 9683, 9691, 9705, - 9709, 9712, 9720, 9727, 9735, 9739, 9750, 9754, 9761, 9766, 9770, 9776, - 9781, 9785, 9791, 9796, 9807, 9811, 9814, 9820, 9825, 9831, 9837, 9844, - 9855, 9865, 9875, 9884, 9891, 7614, 7621, 7627, 7632, 9897, 9903, 7636, - 9909, 9912, 9919, 9924, 9939, 9955, 9970, 9978, 9984, 1043, 400, 9989, - 9997, 10004, 10010, 10015, 10020, 7641, 10022, 10026, 10031, 10035, - 10045, 10050, 10054, 10063, 10067, 10070, 10077, 10081, 10084, 10092, - 10099, 10107, 10111, 10118, 10127, 10130, 10134, 10138, 10144, 10148, - 10152, 10156, 10162, 10172, 10176, 10184, 10188, 10195, 10199, 10204, - 10208, 10215, 10221, 10229, 10235, 10245, 10250, 10255, 10259, 10267, - 3822, 10275, 10280, 10284, 10288, 10291, 10299, 10306, 10310, 4469, - 10314, 10319, 10323, 10334, 10339, 10345, 10349, 10352, 10360, 10365, - 10370, 10377, 10382, 7650, 10387, 10391, 1685, 4619, 10398, 10403, 10408, - 10413, 10419, 10424, 10430, 10435, 10440, 10445, 10450, 10455, 10460, - 10465, 10470, 10475, 10480, 10485, 10490, 10495, 10500, 10505, 10510, - 10516, 10521, 10526, 10531, 10536, 10541, 10547, 10552, 10557, 10563, - 10568, 10574, 10579, 10585, 10590, 10595, 10600, 10605, 10611, 10616, - 10621, 10626, 724, 139, 10634, 10638, 10643, 10648, 10652, 10656, 10660, - 10665, 10669, 10674, 10678, 10681, 10685, 10689, 10694, 10704, 10710, - 10718, 10722, 10726, 10733, 10741, 10750, 10761, 10768, 10775, 10784, - 10793, 10801, 10810, 10819, 10828, 10837, 10847, 10857, 10867, 10877, - 10887, 10896, 10906, 10916, 10926, 10936, 10946, 10956, 10966, 10975, - 10985, 10995, 11005, 11015, 11025, 11035, 11044, 11054, 11064, 11074, - 11084, 11094, 11104, 11114, 11124, 11134, 11143, 11153, 11163, 11173, - 11183, 11193, 11203, 11213, 11223, 11233, 11243, 11252, 11258, 11262, - 11265, 11269, 11274, 11281, 11287, 11292, 11296, 11301, 11310, 11318, - 11323, 11327, 11331, 11337, 11342, 11348, 7659, 11353, 11358, 11367, - 7664, 11372, 11375, 11381, 11389, 7669, 11396, 11400, 11404, 11408, - 11418, 11424, 11429, 11438, 11446, 11453, 11460, 11465, 11472, 11477, - 11481, 11484, 11495, 11505, 11514, 11522, 11533, 11545, 11555, 11560, - 11564, 11569, 11574, 11578, 11584, 11592, 11599, 11610, 11615, 11625, - 11634, 11638, 11641, 11648, 11658, 11667, 11674, 11678, 11685, 11691, - 11696, 11701, 11705, 11714, 11719, 11725, 11729, 11734, 11738, 11747, - 11755, 11763, 11770, 11778, 11790, 11801, 11811, 11818, 11824, 11833, - 11844, 11853, 11865, 11877, 11889, 11899, 11908, 11917, 11925, 11932, - 11941, 11949, 11955, 11961, 11966, 6199, 11970, 11972, 11977, 11983, - 11992, 12000, 12007, 12016, 12025, 12034, 12043, 12052, 12061, 12070, - 12079, 12089, 12099, 12108, 12114, 12121, 12135, 12142, 12150, 12159, - 12165, 12174, 12183, 12194, 12204, 12212, 12219, 12227, 12236, 12249, - 12257, 12264, 12277, 12283, 12289, 12299, 12308, 12317, 12322, 12326, - 12332, 12338, 12345, 7370, 12350, 12355, 12362, 12367, 12372, 12376, - 12384, 12390, 12395, 12403, 12411, 12418, 12426, 12432, 12440, 12448, - 12453, 12459, 12466, 12472, 12477, 12481, 12492, 12500, 12506, 12511, - 12520, 12526, 12531, 12540, 12554, 3781, 12558, 12563, 12568, 12574, - 12579, 12584, 12588, 12593, 12598, 6198, 12603, 12608, 12613, 12618, - 12622, 12627, 12632, 12637, 12643, 12649, 12654, 12658, 12663, 12668, - 12673, 7673, 12678, 12683, 12688, 12693, 12710, 12728, 12740, 12753, - 12770, 12786, 12803, 12813, 12832, 12843, 12854, 12865, 12876, 12888, - 12899, 12910, 12927, 12938, 12949, 12954, 2335, 12958, 12961, 12967, - 12975, 12983, 12988, 12996, 13004, 13011, 13016, 13022, 13029, 13037, - 13044, 13056, 13064, 13069, 9933, 13075, 13084, 13093, 13101, 13108, - 13114, 13122, 13129, 13135, 13142, 13148, 13157, 13165, 13175, 13182, - 13188, 13196, 13202, 13210, 13217, 13230, 13237, 13246, 13255, 13264, - 13272, 13282, 13289, 13294, 3495, 13301, 13306, 13309, 12604, 13313, - 13319, 13323, 13331, 13343, 13348, 13355, 13361, 13366, 13373, 12609, - 13377, 13381, 12614, 13385, 13389, 13393, 13400, 13405, 13409, 13413, - 13421, 13428, 13435, 13452, 13461, 13465, 13468, 13476, 13482, 13487, - 3573, 13491, 13493, 13501, 13508, 13518, 13530, 13535, 13541, 13546, - 13550, 13556, 13561, 13567, 13570, 13577, 13585, 13592, 13598, 13604, - 13609, 13616, 13622, 13627, 13634, 13638, 13644, 13648, 13655, 13661, - 13667, 13675, 13681, 13686, 13692, 13700, 13708, 13714, 13720, 13725, - 13732, 13737, 13741, 13747, 13752, 13759, 13764, 13770, 13773, 13779, - 13785, 13788, 13792, 13804, 13810, 13815, 13822, 13828, 13834, 13845, - 13855, 13864, 13872, 13879, 13890, 13900, 13910, 13918, 13921, 12628, - 13926, 13931, 12633, 12758, 13939, 13952, 13967, 13978, 12775, 13996, - 14009, 14022, 14033, 8841, 14044, 14057, 14076, 14087, 14098, 14109, - 2603, 14122, 14126, 14134, 14145, 14152, 14158, 14166, 14170, 14176, - 14179, 14189, 14197, 14204, 14212, 14222, 14227, 14234, 14239, 14246, - 14257, 14267, 14273, 14278, 14283, 14287, 14291, 14297, 14303, 14308, - 14313, 14318, 14322, 12638, 12644, 14326, 12650, 14331, 14339, 14348, - 14355, 7542, 14359, 14361, 14366, 14371, 14377, 14382, 14387, 14392, - 14397, 14401, 14407, 14413, 14418, 14424, 14429, 14434, 14440, 14445, - 14450, 14455, 14461, 14466, 14471, 14477, 14483, 14488, 14493, 14500, - 14506, 14517, 14524, 14529, 14533, 14537, 14540, 14548, 14553, 14560, - 14567, 14572, 14577, 14584, 14594, 14599, 14606, 14612, 14622, 14632, - 14646, 14660, 14674, 14688, 14703, 14718, 14735, 14753, 14766, 14772, - 14777, 14782, 14786, 14791, 14799, 14805, 14810, 14815, 14819, 14824, - 14828, 14833, 14837, 14848, 14854, 14859, 14864, 14871, 14876, 14880, - 14885, 14890, 14896, 14903, 14909, 14914, 14918, 14924, 14929, 14934, - 14938, 14944, 14949, 14954, 14961, 14966, 11420, 14970, 14975, 14979, - 14984, 14990, 14996, 15003, 15013, 15021, 15028, 15033, 15037, 15046, - 15054, 15061, 15068, 15074, 15080, 15085, 15090, 15096, 15101, 15107, - 15112, 15118, 15124, 15131, 15137, 15142, 15147, 7715, 15156, 15159, - 15165, 15170, 15175, 15185, 15192, 15198, 15203, 15209, 15214, 15220, - 15225, 15231, 15237, 15242, 15250, 15257, 15262, 15267, 15273, 15278, - 15282, 15291, 15302, 15309, 15317, 15323, 15330, 15336, 15341, 15345, - 15351, 15356, 15361, 15366, 7720, 6223, 2827, 15370, 15374, 15378, 15382, - 15386, 15389, 15396, 15404, 12664, 15411, 15421, 15429, 15436, 15444, - 15454, 15463, 15476, 15481, 15486, 15494, 15501, 11510, 11519, 15508, - 15518, 15533, 15539, 15546, 15553, 15559, 15569, 15579, 12669, 15588, - 15594, 15600, 15608, 15616, 15621, 15630, 15638, 15650, 15660, 15670, - 15680, 15689, 15701, 15711, 15721, 15732, 15737, 15749, 15761, 15773, - 15785, 15797, 15809, 15821, 15833, 15845, 15857, 15868, 15880, 15892, - 15904, 15916, 15928, 15940, 15952, 15964, 15976, 15988, 15999, 16011, - 16023, 16035, 16047, 16059, 16071, 16083, 16095, 16107, 16119, 16130, - 16142, 16154, 16166, 16178, 16190, 16202, 16214, 16226, 16238, 16250, - 16261, 16273, 16285, 16297, 16309, 16321, 16333, 16345, 16357, 16369, - 16381, 16392, 16404, 16416, 16428, 16440, 16452, 16464, 16476, 16488, - 16500, 16512, 16523, 16535, 16547, 16559, 16571, 16583, 16595, 16607, - 16619, 16631, 16643, 16654, 16666, 16678, 16690, 16702, 16715, 16728, - 16741, 16754, 16767, 16780, 16793, 16805, 16818, 16831, 16844, 16857, - 16870, 16883, 16896, 16909, 16922, 16935, 16947, 16960, 16973, 16986, - 16999, 17012, 17025, 17038, 17051, 17064, 17077, 17089, 17102, 17115, - 17128, 17141, 17154, 17167, 17180, 17193, 17206, 17219, 17231, 17244, - 17257, 17270, 17283, 17296, 17309, 17322, 17335, 17348, 17361, 17373, - 17386, 17399, 17412, 17425, 17438, 17451, 17464, 17477, 17490, 17503, - 17515, 17526, 17539, 17552, 17565, 17578, 17591, 17604, 17617, 17630, - 17643, 17656, 17668, 17681, 17694, 17707, 17720, 17733, 17746, 17759, - 17772, 17785, 17798, 17810, 17823, 17836, 17849, 17862, 17875, 17888, - 17901, 17914, 17927, 17940, 17952, 17965, 17978, 17991, 18004, 18017, - 18030, 18043, 18056, 18069, 18082, 18094, 18107, 18120, 18133, 18146, - 18159, 18172, 18185, 18198, 18211, 18224, 18236, 18249, 18262, 18275, - 18288, 18301, 18314, 18327, 18340, 18353, 18366, 18378, 18391, 18404, - 18417, 18430, 18443, 18456, 18469, 18482, 18495, 18508, 18520, 18533, - 18546, 18559, 18572, 18585, 18598, 18611, 18624, 18637, 18650, 18662, - 18675, 18688, 18701, 18714, 18727, 18740, 18753, 18766, 18779, 18792, - 18804, 18817, 18830, 18843, 18856, 18869, 18882, 18895, 18908, 18921, - 18934, 18946, 18957, 18965, 18972, 18978, 18982, 18988, 18994, 19002, - 19008, 19013, 19017, 19026, 7547, 19037, 19044, 19052, 19059, 19066, - 9293, 19073, 19082, 19087, 19092, 6239, 19099, 19104, 19107, 19112, - 19120, 19127, 19134, 19141, 19147, 19156, 19165, 19171, 19180, 19186, - 19191, 19201, 19208, 19214, 19222, 19228, 19235, 19245, 19254, 19258, - 19265, 19269, 19274, 19280, 19288, 19292, 19302, 12679, 19311, 19317, - 19321, 19330, 19336, 19343, 19354, 19362, 19371, 7335, 19379, 19384, - 19390, 19395, 19399, 19403, 19407, 8006, 19412, 19420, 19427, 19436, - 19443, 19450, 9223, 19457, 19463, 19467, 19473, 19479, 19487, 19493, - 19500, 19506, 19512, 19521, 19525, 19533, 19542, 19549, 19554, 19558, - 19569, 19574, 19579, 19584, 19597, 6426, 19601, 19607, 19615, 19619, - 19626, 19635, 19640, 19648, 19660, 19665, 19669, 19672, 19678, 19684, - 19689, 19693, 19696, 19707, 19712, 7750, 19719, 7558, 7755, 19724, 19729, - 19734, 19739, 19744, 19749, 19754, 19759, 19764, 19769, 19774, 19779, - 19785, 19790, 19795, 19800, 19805, 19810, 19815, 19820, 19825, 19830, - 19836, 19842, 19847, 19852, 19857, 19862, 19867, 19872, 19877, 19882, - 19887, 19893, 19898, 19903, 19908, 19914, 19920, 19925, 19930, 19935, - 19940, 19945, 19950, 19955, 19960, 19966, 19971, 19976, 19981, 19986, - 19992, 19997, 20002, 20006, 129, 20014, 20018, 20022, 20026, 20031, - 20035, 20039, 10781, 20043, 20048, 20052, 20057, 20061, 20066, 20070, - 20076, 20081, 20085, 20089, 20097, 20101, 20106, 20111, 20115, 20121, - 20126, 20130, 20135, 20140, 20144, 20151, 20158, 20165, 20169, 20173, - 20178, 20182, 20185, 20191, 20204, 20209, 20218, 20223, 7795, 20228, - 20231, 2666, 2671, 20235, 20241, 20247, 20252, 20257, 20262, 20268, - 20273, 12190, 20278, 20283, 20288, 20294, 20299, 20304, 20310, 20315, - 20319, 20324, 20329, 20334, 20338, 20343, 20348, 20353, 20358, 20362, - 20366, 20371, 2836, 20320, 20375, 20383, 20390, 8100, 20402, 20410, - 20325, 20417, 20422, 20430, 20330, 20435, 20440, 20448, 20453, 20458, - 20462, 20467, 20471, 20477, 20480, 20487, 20491, 20495, 20501, 20508, - 20513, 7362, 1690, 1695, 20517, 20523, 20529, 20534, 20538, 20542, 20546, - 20549, 20555, 20562, 20570, 20576, 20582, 20587, 20592, 20596, 13039, - 13896, 20601, 20613, 20616, 20623, 20630, 20634, 20642, 20653, 20662, - 20675, 20685, 20699, 20711, 20725, 20737, 20747, 20759, 20765, 20780, - 20804, 20822, 20841, 20854, 20868, 20886, 20902, 20919, 20937, 20948, - 20967, 20984, 21004, 21022, 21034, 21048, 21062, 21074, 21091, 21110, - 21128, 21140, 21158, 21177, 12818, 21190, 21210, 21222, 8872, 21234, - 21239, 21244, 21249, 21255, 21260, 21264, 21271, 2352, 21275, 21281, - 21285, 21288, 21292, 21300, 21306, 20339, 21310, 21319, 21330, 21336, - 21342, 21351, 21359, 21366, 21371, 21378, 21384, 21393, 21401, 21408, - 21418, 21427, 21437, 21442, 21451, 21460, 21471, 21482, 3880, 21492, - 21496, 21506, 21514, 21524, 21535, 21540, 21548, 21555, 21561, 21566, - 20349, 21570, 21579, 21583, 21586, 21591, 21598, 21607, 21615, 21623, - 21633, 21642, 21648, 21654, 20354, 20359, 21658, 21668, 21678, 21688, - 21696, 21703, 21713, 21721, 21729, 21735, 962, 21744, 13000, 537, 21758, - 21767, 21775, 21786, 21797, 21807, 21816, 21828, 21837, 21846, 21852, - 21861, 21870, 21880, 21888, 21896, 7727, 21902, 21905, 21909, 21914, - 21919, 8215, 20367, 21927, 21933, 21939, 21944, 21949, 21953, 21961, - 21967, 21973, 21977, 3467, 21985, 21990, 21995, 21999, 22003, 8287, - 22010, 22018, 22025, 22031, 8296, 8302, 22039, 22047, 22054, 22059, - 22064, 22070, 22074, 22085, 22090, 2555, 22095, 22106, 22112, 22117, - 22121, 22125, 22128, 22135, 22142, 22149, 22155, 22159, 22164, 22168, - 22172, 979, 22176, 22181, 22186, 22191, 22196, 22201, 22206, 22211, - 22216, 22221, 22226, 22231, 22236, 22241, 22247, 22252, 22257, 22262, - 22267, 22272, 22277, 22283, 22288, 22293, 22298, 22303, 22308, 22313, - 22318, 22324, 22330, 22335, 22341, 22346, 22351, 5, 22357, 22361, 22365, - 22369, 22374, 22378, 22382, 22386, 22390, 22395, 22399, 22404, 22408, - 22411, 22415, 22420, 22424, 22429, 22433, 22437, 22441, 22446, 22450, - 22454, 22464, 22469, 22473, 22477, 22482, 22487, 22496, 22501, 22506, - 22510, 22514, 22527, 22539, 22548, 22557, 22563, 22568, 22572, 22576, - 22586, 22595, 22603, 22609, 22614, 22618, 22625, 22635, 22644, 22652, - 22660, 22667, 22675, 22684, 22693, 22701, 22706, 22710, 22714, 22717, - 22719, 22723, 22727, 22732, 22737, 22741, 22745, 22748, 22752, 22755, - 22759, 22762, 22765, 22769, 22775, 22779, 22783, 22787, 22792, 22797, - 22802, 22806, 22809, 22814, 22820, 22825, 22831, 22836, 22840, 22844, - 22848, 22853, 22857, 22862, 22866, 22873, 22877, 22880, 22884, 22890, - 22896, 22900, 22904, 22909, 22916, 22922, 22926, 22935, 22939, 22943, - 22946, 22952, 22957, 22963, 1452, 1754, 22968, 22973, 22978, 22983, - 22988, 22993, 22998, 2106, 2148, 23003, 23006, 23010, 23014, 23019, - 23023, 23027, 23030, 23035, 23040, 23044, 23047, 23052, 23056, 23061, - 23065, 13012, 23070, 23073, 23076, 23080, 23085, 23098, 23102, 23105, - 23113, 23122, 23129, 23134, 23140, 23146, 23153, 23160, 23164, 23168, - 23172, 23177, 23182, 23186, 23194, 23199, 23211, 23222, 23227, 23231, - 23235, 23241, 23246, 23251, 23255, 23258, 23264, 6346, 2270, 23268, - 23273, 23289, 7842, 23309, 23318, 23334, 23338, 23341, 23347, 23357, - 23363, 23378, 23390, 23401, 23409, 23418, 23424, 23433, 23443, 23454, - 23465, 23474, 23483, 23491, 23498, 23506, 23519, 23526, 23532, 23537, - 23546, 23552, 23557, 23565, 21516, 23577, 23589, 23603, 23611, 23618, - 23630, 23639, 23648, 23656, 23664, 23672, 23679, 23688, 23696, 23706, - 23715, 23725, 23734, 23743, 23751, 23756, 23760, 23763, 23767, 23771, - 23775, 23779, 23783, 23789, 23795, 23803, 13057, 23810, 23815, 23822, - 23828, 23835, 13065, 23842, 23845, 23857, 23865, 23871, 23876, 23880, - 8245, 23891, 23901, 23910, 23917, 23921, 13070, 23924, 23931, 23935, - 23941, 23944, 23951, 23957, 23961, 23966, 23970, 23979, 23986, 23992, - 6387, 23999, 24007, 24014, 24020, 24025, 24031, 24037, 24045, 24049, - 24052, 24054, 23768, 24063, 24069, 24079, 24084, 24091, 24097, 24102, - 24107, 24112, 24117, 24124, 24133, 24140, 24149, 24155, 24160, 24166, - 24171, 24178, 24189, 24194, 24198, 24208, 24214, 24218, 24223, 24233, - 24242, 24246, 24253, 24261, 24268, 24274, 24279, 24287, 24294, 24306, - 24315, 24319, 11362, 24327, 24337, 24341, 23109, 24352, 24357, 24361, - 24368, 24375, 20117, 23693, 24380, 24384, 24387, 20954, 24392, 24406, - 24422, 24440, 24459, 24476, 24494, 20973, 24511, 24531, 20990, 24543, - 24555, 13983, 24567, 21010, 24581, 24593, 8885, 24607, 24612, 24617, - 24622, 24628, 24634, 24640, 24644, 24651, 24656, 24666, 24672, 8532, - 24678, 24680, 24685, 24693, 24697, 24120, 24703, 24710, 9869, 9879, - 24717, 24727, 24732, 24736, 24739, 24745, 24753, 24765, 24775, 24791, - 24804, 24818, 14001, 24832, 24839, 24843, 24846, 24851, 24855, 24862, - 24869, 24879, 24884, 24889, 24894, 24902, 24910, 24919, 24924, 7939, - 24928, 24931, 24934, 24939, 24946, 24951, 24967, 24975, 24983, 7790, - 24991, 24996, 25000, 25006, 25012, 25015, 25021, 25033, 25041, 25048, - 25054, 25061, 25072, 25086, 25099, 25108, 25120, 25131, 25141, 25150, - 25159, 25167, 25178, 6369, 25185, 25191, 25196, 25202, 25209, 25219, - 25229, 25238, 25244, 25251, 25256, 25263, 25271, 25279, 25291, 4704, - 25298, 25307, 25315, 25321, 25327, 25332, 25336, 25339, 25345, 25352, - 25357, 25362, 25366, 25378, 25389, 25398, 25406, 13197, 25411, 25417, - 25423, 9862, 7049, 25428, 25431, 25434, 25440, 25448, 25456, 25460, - 25464, 25469, 25472, 25481, 25489, 25500, 25504, 25510, 25516, 25520, - 25526, 25534, 25556, 25580, 25587, 25594, 25600, 25606, 25611, 25622, - 25640, 25647, 25655, 25659, 25668, 25681, 25689, 25701, 25712, 25722, - 25736, 25745, 25753, 25765, 7859, 25776, 25787, 25799, 25809, 25818, - 25823, 25827, 25835, 25845, 25850, 25854, 25857, 25860, 25868, 25876, - 25885, 25895, 25904, 25910, 25924, 2617, 25946, 25957, 25966, 25976, - 25988, 25997, 26007, 26015, 26023, 26032, 26037, 26048, 26053, 26064, - 26068, 26078, 26087, 26095, 26105, 26115, 26123, 26132, 26139, 26147, - 26154, 26163, 26167, 26175, 26182, 26190, 26197, 26208, 26223, 26230, - 26236, 26246, 26255, 26261, 26268, 12312, 26274, 26278, 26283, 26287, - 26291, 26299, 26307, 26313, 26322, 26329, 26334, 26339, 26349, 21568, - 26353, 26356, 26361, 26366, 26371, 26376, 26381, 26386, 26391, 26396, - 26402, 26407, 26412, 26418, 1223, 679, 26423, 26432, 2318, 26439, 26444, - 26448, 26454, 1256, 541, 334, 26459, 26468, 26476, 26485, 26493, 26504, - 26513, 26521, 26525, 26528, 26536, 26544, 26549, 13025, 26555, 26561, - 26567, 4350, 26572, 26576, 26582, 26586, 26593, 1418, 26599, 7946, 26606, - 26616, 26624, 26630, 26639, 26647, 26653, 26661, 26668, 9455, 26674, - 26681, 26688, 1459, 2105, 26694, 26700, 26707, 26718, 26729, 26737, - 26744, 26754, 26763, 26771, 26778, 26785, 26798, 26809, 26828, 1261, - 26832, 26837, 26845, 3510, 26849, 26854, 26858, 1422, 22746, 26868, - 26872, 26877, 26881, 3435, 26887, 26895, 26902, 26913, 26921, 26929, - 3511, 269, 26934, 26942, 26950, 26957, 26963, 26968, 2170, 26975, 26981, - 23962, 24184, 26987, 106, 26991, 26995, 27001, 606, 7695, 27006, 27013, - 27019, 2281, 27023, 27027, 27030, 27033, 27038, 27045, 27051, 27056, - 27064, 27071, 27077, 20455, 27081, 3581, 14826, 27085, 27090, 27093, - 27101, 27109, 27112, 27119, 27129, 27141, 27146, 27150, 27158, 27165, - 27171, 27178, 27185, 27188, 27192, 27196, 1426, 27206, 27208, 27213, - 27219, 27225, 27230, 27235, 27240, 27245, 27250, 27255, 27260, 27265, - 27270, 27275, 27280, 27285, 27290, 27295, 27301, 27307, 27313, 27319, - 27324, 27329, 27334, 27340, 27345, 27350, 27355, 27361, 27366, 27372, - 27377, 27382, 27387, 27392, 27398, 27403, 27409, 27414, 27419, 27424, - 27429, 27435, 27440, 27446, 27451, 27456, 27461, 27466, 27471, 27476, - 27481, 27486, 27491, 27497, 27503, 27509, 27514, 27519, 27524, 27529, - 27535, 27541, 27547, 27553, 27559, 27565, 27570, 27576, 27581, 27586, - 27591, 27596, 27602, 2397, 27607, 2404, 2411, 2708, 27612, 2417, 2427, - 27618, 27622, 27627, 27632, 27638, 27643, 27648, 27652, 27657, 27663, - 27668, 27673, 27678, 27684, 27689, 27693, 27697, 27702, 27707, 27712, - 27717, 27722, 27728, 27734, 27739, 27743, 27748, 27754, 27758, 27763, - 27768, 27773, 27778, 27782, 27785, 27790, 27795, 27800, 27805, 27811, - 27817, 27822, 27827, 27831, 27836, 27841, 27846, 27851, 27856, 27860, - 27865, 27870, 27875, 27879, 27883, 27887, 27892, 27900, 27906, 27912, - 27918, 27923, 27927, 27930, 27935, 27939, 27944, 27948, 27953, 27957, - 27960, 15489, 27965, 27973, 19439, 26603, 27978, 27983, 27987, 27992, - 27996, 28000, 28005, 28009, 28012, 28015, 28019, 28024, 28032, 28036, - 28039, 28044, 28048, 28052, 28057, 28062, 28066, 28072, 28077, 28082, - 28089, 28096, 28100, 28103, 28109, 28118, 28125, 28133, 28140, 28144, - 28149, 28153, 28159, 28165, 28169, 28175, 28180, 28185, 28192, 28198, - 28204, 28210, 28216, 28223, 28229, 28235, 28241, 28247, 28253, 28259, - 28265, 28272, 28278, 28285, 28291, 28297, 28303, 28309, 28315, 28321, - 28327, 28333, 28339, 9763, 28345, 28350, 28355, 28358, 28366, 28371, - 28380, 28386, 28391, 28396, 28401, 28405, 28410, 28415, 28420, 28425, - 28430, 28437, 28444, 28450, 28456, 28461, 14510, 28468, 28474, 28481, - 28487, 28493, 28498, 28506, 28511, 14294, 28515, 28520, 28525, 28531, - 28536, 28541, 28545, 28550, 28555, 28561, 28566, 28571, 28575, 28580, - 28585, 28589, 28594, 28599, 28604, 28608, 28613, 28618, 28623, 28627, - 28631, 13531, 28635, 28644, 28650, 28656, 28665, 28673, 28682, 28690, - 28695, 28699, 28706, 28712, 28716, 28719, 28724, 28733, 28741, 28746, - 1458, 28752, 28755, 28759, 20524, 20530, 28765, 28769, 28780, 28791, - 28802, 28814, 28821, 28828, 28833, 28837, 4387, 733, 19438, 28845, 28849, - 28854, 28860, 28865, 28871, 28876, 28882, 28887, 8764, 2785, 3365, 28891, - 28894, 28900, 28906, 28912, 28919, 28925, 28931, 28937, 28943, 28949, - 28955, 28961, 28967, 28973, 28979, 28985, 28991, 28998, 29004, 29010, - 29016, 29022, 29028, 29033, 29036, 29043, 29051, 29056, 29061, 29067, - 29072, 29077, 29081, 29086, 29092, 29097, 29103, 29108, 29114, 29119, - 29125, 29131, 29135, 29140, 29145, 29150, 29155, 29159, 29164, 29169, - 29174, 29180, 29186, 29192, 29198, 29203, 29207, 29210, 29216, 29222, - 29231, 29239, 29246, 29251, 29255, 29259, 29264, 13395, 29269, 29277, - 29283, 3611, 29288, 29291, 29295, 6436, 29301, 29307, 29314, 6445, 29318, - 29324, 29331, 29337, 29346, 29354, 29366, 29370, 29377, 29383, 29387, - 29390, 29399, 29407, 29412, 29416, 29426, 29436, 29446, 29452, 29457, - 29467, 29472, 29485, 29499, 29510, 29522, 29534, 29548, 29561, 29573, - 29585, 12859, 29599, 29604, 29609, 29613, 29617, 29621, 1743, 25129, - 29625, 29630, 29635, 29639, 29642, 29647, 29652, 29658, 29664, 8461, - 29669, 29676, 13935, 29682, 29687, 29692, 29696, 29701, 29706, 28855, - 29711, 29716, 29721, 29727, 28861, 29732, 29735, 29742, 29750, 29756, - 29762, 29768, 29779, 29784, 29791, 29798, 29805, 29813, 29822, 29831, - 29837, 29843, 29851, 28866, 29856, 29862, 29868, 28872, 29873, 29881, - 29889, 29895, 29902, 29908, 29915, 29922, 29928, 29936, 29946, 29953, - 29958, 29964, 29969, 29974, 29981, 29990, 29998, 30003, 30009, 30016, - 30024, 30030, 30035, 30041, 30050, 25890, 30057, 30061, 30066, 30075, - 30080, 30085, 10714, 30093, 30098, 30103, 30107, 30112, 30117, 30124, - 30129, 30134, 28877, 28883, 30140, 2473, 239, 30143, 30146, 30150, 30154, - 30164, 30172, 30176, 30183, 30190, 30194, 30197, 30203, 30211, 30219, - 30223, 30227, 30230, 30237, 30241, 30248, 30256, 30263, 30267, 30275, - 684, 297, 30287, 30292, 30297, 30303, 30308, 30313, 3632, 30318, 30321, - 30326, 30331, 30336, 30341, 30346, 30353, 20609, 30358, 30363, 30368, - 30373, 30378, 30384, 30389, 30395, 29039, 30401, 30406, 30412, 30418, - 30428, 30433, 30438, 30442, 30447, 30452, 30457, 30462, 30475, 30480, - 20406, 14906, 3638, 30484, 30489, 30494, 30500, 30505, 30510, 30514, - 30519, 30524, 30530, 30535, 30540, 30544, 30549, 30554, 30559, 30563, - 30568, 30573, 30578, 30584, 30590, 30595, 30599, 30604, 30609, 30614, - 30618, 30626, 30630, 30636, 30640, 30647, 14699, 30653, 30660, 30668, - 30675, 30681, 30693, 30699, 30703, 2727, 30707, 30711, 30232, 30720, - 30731, 30736, 30741, 30746, 30750, 30755, 20535, 30759, 30764, 19459, - 30768, 30773, 30779, 30784, 30788, 30792, 30795, 30799, 30805, 30816, - 30828, 30833, 30837, 30840, 343, 30844, 30849, 30854, 30859, 30864, - 30869, 30875, 30880, 30885, 30891, 30896, 30902, 30907, 30913, 30918, - 30923, 30928, 30933, 30938, 30943, 30948, 30953, 30959, 30964, 30969, - 30974, 30979, 30984, 30989, 30994, 31000, 31006, 31011, 31016, 31021, - 31026, 31031, 31036, 31041, 31046, 31051, 31056, 31061, 31066, 31071, - 31076, 31081, 31086, 31091, 31096, 31102, 26, 31107, 31111, 31115, 31123, - 31127, 31131, 31134, 31137, 31139, 31144, 31148, 31153, 31157, 31162, - 31166, 31171, 31175, 31178, 31180, 31185, 31189, 31200, 31203, 31205, - 31209, 31221, 31230, 31234, 31240, 31245, 31254, 31260, 31265, 31270, - 31274, 31279, 31286, 31291, 31297, 31302, 31306, 31313, 23701, 23711, - 31317, 31322, 31327, 31332, 31339, 31343, 31350, 6544, 31356, 31365, - 31373, 31388, 31402, 31410, 31421, 31430, 31435, 5681, 31445, 31450, - 31455, 31459, 31462, 31466, 31471, 31475, 31482, 31487, 31492, 7320, - 31502, 31504, 31507, 31511, 31517, 31521, 31526, 31531, 31537, 31542, - 31548, 31553, 31563, 31572, 31580, 31585, 31591, 31596, 31603, 31607, - 31615, 31622, 31635, 31643, 31647, 31657, 31662, 31666, 31674, 31682, - 31686, 31695, 31701, 31706, 31714, 31724, 31733, 31742, 31751, 31762, - 31770, 31781, 31790, 31797, 31803, 31808, 31819, 31824, 31828, 31831, - 31835, 31843, 31849, 31857, 31864, 31870, 31875, 31881, 2372, 31885, - 31887, 31892, 31897, 31900, 31902, 31906, 31909, 31916, 31920, 31924, - 31927, 31933, 31943, 31948, 31954, 31958, 31963, 31976, 24074, 31982, - 31991, 15654, 31998, 32007, 29432, 32015, 32020, 32024, 32032, 32039, - 32044, 32048, 32053, 32057, 32065, 32071, 32077, 32082, 32086, 32089, - 32094, 32107, 32123, 21080, 32140, 32152, 32169, 32181, 32195, 21097, - 21116, 32207, 32219, 2634, 32233, 32238, 32243, 32248, 32252, 32259, - 32271, 32277, 32280, 32291, 32302, 29848, 670, 32307, 32311, 32314, - 32319, 32324, 32330, 32335, 32340, 32346, 32352, 32357, 32361, 32366, - 32371, 32376, 32380, 32383, 32389, 32394, 32399, 32404, 32408, 32413, - 32419, 32427, 24299, 32432, 32437, 32444, 32450, 32456, 32461, 32469, - 20618, 32476, 32481, 32486, 32491, 32495, 32498, 32503, 32507, 32511, - 32518, 32524, 32530, 32536, 32543, 32548, 32554, 31677, 32558, 32562, - 32567, 32580, 32585, 32591, 32599, 32606, 32614, 32624, 32630, 32636, - 32642, 32646, 32655, 32660, 32665, 8787, 32670, 32677, 32683, 32693, - 32698, 32704, 32712, 3543, 32719, 32726, 3549, 32730, 32735, 32746, - 32753, 32759, 32768, 32772, 3932, 32775, 32782, 32788, 32794, 32802, - 32812, 26958, 32819, 32827, 32833, 32838, 32844, 32849, 32855, 32859, - 32866, 32872, 32881, 24094, 32888, 32893, 32897, 32905, 32913, 7974, - 4373, 32920, 32924, 32928, 32933, 32939, 32944, 32949, 32956, 30349, - 32962, 32967, 32971, 32976, 32980, 32989, 32993, 32999, 33006, 33012, - 33019, 33024, 33033, 33038, 33042, 33047, 33054, 33062, 33070, 33075, - 19508, 33079, 33082, 33086, 33090, 33094, 33097, 33099, 33104, 33112, - 33116, 33123, 33127, 33135, 33142, 33152, 33156, 33160, 33168, 33176, - 33182, 33187, 33196, 11669, 33202, 33211, 33216, 33223, 33231, 33239, - 33247, 33254, 33261, 33268, 33275, 33282, 33287, 33293, 33310, 33318, - 33328, 33336, 33343, 385, 33347, 33353, 33357, 33362, 31426, 33368, - 33371, 33375, 33383, 3554, 33391, 33397, 33403, 33412, 33422, 33429, - 33435, 3560, 3566, 33444, 33451, 33459, 33464, 33468, 33475, 33483, - 33489, 33498, 33508, 33514, 33522, 33531, 33538, 33546, 20175, 33553, - 33560, 33566, 33576, 33585, 33596, 33600, 33610, 33616, 33623, 33631, - 33640, 33649, 33659, 33670, 33677, 33682, 33689, 2967, 33697, 33703, - 33708, 33714, 33720, 33725, 33738, 33751, 33764, 33771, 33777, 33785, - 33790, 33794, 1432, 33798, 33803, 33808, 33813, 33818, 33824, 33829, - 33834, 33839, 33844, 33849, 33854, 33859, 33865, 33871, 33876, 33881, - 33887, 33892, 33897, 33902, 33908, 33913, 33918, 33923, 33928, 33934, - 33939, 33944, 33950, 33955, 33960, 33965, 33970, 33975, 33981, 33986, - 33992, 33997, 34003, 34008, 34013, 34018, 34024, 34030, 34036, 34042, - 34048, 34054, 34060, 34066, 34071, 34076, 34082, 34087, 34092, 34097, - 34102, 34107, 34112, 34117, 34123, 34128, 34133, 34139, 34145, 101, - 34150, 34152, 34156, 34160, 34164, 34169, 34173, 7895, 34177, 34183, - 4738, 34189, 34192, 34197, 34201, 34206, 34210, 34214, 34219, 8594, - 34223, 34227, 34231, 13623, 34236, 34240, 34245, 34250, 34255, 34259, - 34266, 24098, 34272, 34275, 34279, 34284, 34290, 34294, 34302, 34308, - 34313, 34317, 34323, 34327, 34331, 3404, 3409, 27144, 34334, 34342, - 34349, 34353, 34360, 34365, 333, 34370, 34374, 34380, 34392, 34398, - 34404, 34408, 34414, 34423, 34427, 34431, 34436, 34441, 34446, 34450, - 34454, 34461, 34467, 34472, 34487, 34502, 34517, 34533, 34551, 8544, - 34565, 34572, 34576, 34579, 34588, 34593, 34597, 34605, 31628, 34613, - 34617, 34627, 27114, 34638, 34642, 34651, 34659, 8152, 13163, 34663, - 34666, 34669, 6557, 3802, 34674, 34682, 34686, 34689, 34693, 34698, - 34703, 34709, 34715, 34720, 34724, 23946, 34728, 34732, 34738, 34742, - 7446, 34751, 34758, 34762, 10210, 34769, 34775, 34780, 34787, 34794, - 34801, 26480, 6480, 34808, 34815, 34822, 34828, 34833, 34840, 34851, - 34857, 34862, 34867, 34874, 34878, 34882, 34892, 34903, 34909, 34914, - 34919, 34924, 34929, 34934, 34938, 34942, 34948, 34956, 2273, 828, 8616, - 8621, 8627, 34965, 8632, 8637, 8643, 34970, 34980, 34984, 8648, 34989, - 34992, 34997, 35001, 35006, 35011, 35018, 35025, 35033, 8557, 35040, - 35043, 35049, 35059, 4407, 35068, 35072, 35080, 35084, 35094, 35100, - 35111, 35117, 35123, 35128, 35134, 35140, 35146, 35151, 35154, 35161, - 35167, 35172, 35179, 35186, 35190, 35200, 35213, 35222, 35231, 35242, - 35255, 35266, 35275, 35286, 35291, 35300, 35305, 8653, 35311, 35318, - 35326, 35331, 35335, 35342, 35349, 3757, 21, 35353, 35358, 14958, 35362, - 35365, 35368, 26001, 35372, 26489, 35380, 35384, 35388, 35391, 35397, - 35403, 35411, 35417, 35424, 25993, 35428, 26178, 35432, 35441, 35447, - 35453, 35458, 35462, 35468, 35472, 35475, 35483, 35491, 24156, 35497, - 35504, 35510, 35515, 35520, 35524, 35530, 35535, 35541, 3973, 755, 35548, - 35552, 35555, 13513, 35567, 33527, 35578, 35581, 35588, 35594, 35598, - 35604, 35609, 35615, 35620, 35625, 35629, 35633, 35638, 35643, 35653, - 35659, 35672, 35678, 35685, 35690, 35696, 35701, 14844, 1435, 1002, - 28974, 28980, 35706, 28986, 28999, 29005, 29011, 35712, 29017, 29023, - 35718, 35724, 14, 35732, 35739, 35743, 35747, 35755, 29737, 35759, 35763, - 35770, 35775, 35779, 35784, 35790, 35795, 35801, 35806, 35810, 35814, - 35818, 35823, 35827, 35832, 35836, 35843, 35848, 35852, 35857, 35861, - 35866, 35870, 35875, 35881, 13733, 13738, 35886, 35890, 35893, 35897, - 35902, 35906, 35912, 35919, 35924, 35934, 35939, 35947, 35951, 35954, - 29752, 35958, 4026, 35963, 35968, 35972, 35977, 35981, 35986, 11687, - 35997, 36001, 36004, 36009, 36013, 36017, 36020, 36024, 6576, 11703, - 36027, 36030, 36035, 36039, 36048, 36064, 36080, 36090, 25900, 36097, - 36101, 36106, 36111, 36115, 36119, 33644, 36125, 36130, 36134, 36141, - 36146, 36150, 36154, 24958, 36160, 19603, 36165, 36172, 36180, 36186, - 36193, 36201, 36207, 36211, 36217, 36225, 36229, 36238, 7876, 36246, - 36250, 36258, 36265, 36270, 36275, 36279, 36282, 36286, 36289, 36293, - 36300, 36305, 36311, 24377, 29034, 36315, 36322, 36328, 36334, 36339, - 36342, 36344, 36351, 36358, 36364, 36368, 36371, 36375, 36379, 36383, - 36388, 36392, 36396, 36399, 36403, 36417, 21146, 36436, 36449, 36462, - 36475, 21164, 36490, 8846, 36505, 36511, 36515, 36519, 36526, 36531, - 36535, 36542, 36548, 36553, 36559, 36569, 36581, 36592, 36597, 36604, - 36608, 36612, 36615, 14129, 3605, 36623, 13760, 36636, 36643, 36647, - 36651, 36656, 36661, 36667, 36671, 36675, 36678, 6188, 13771, 36683, - 36687, 36693, 36702, 36707, 33504, 36713, 36718, 36722, 36727, 36734, - 36738, 36741, 12824, 36746, 36753, 1009, 36757, 36762, 36767, 36773, - 36778, 36783, 36787, 36797, 36802, 36808, 36813, 36819, 36824, 36830, - 36840, 36845, 36850, 36854, 5683, 5695, 36859, 36862, 36869, 36875, - 31793, 31800, 36884, 36888, 29800, 36896, 36907, 36915, 33692, 36922, - 36927, 36932, 36943, 36950, 36961, 29824, 19609, 36969, 722, 36974, - 36980, 25984, 36986, 36991, 37001, 37010, 37017, 37023, 37027, 37030, - 37037, 37043, 37050, 37056, 37066, 37074, 37080, 37086, 37091, 37095, - 37102, 37108, 37115, 36384, 530, 12112, 37121, 37126, 37129, 37135, - 37143, 1364, 37148, 37152, 37157, 37164, 37170, 37174, 37179, 37188, - 37195, 37205, 37211, 26019, 37228, 37237, 37245, 37251, 37256, 37263, - 37269, 37277, 37286, 37294, 37298, 37303, 37311, 29833, 37317, 37336, - 14062, 37350, 37366, 37380, 37386, 37391, 37396, 37401, 37407, 29839, - 37412, 37419, 37424, 37428, 341, 2878, 37435, 37440, 37445, 25275, 37266, - 37449, 37454, 37462, 37466, 37469, 37475, 37479, 26074, 37482, 37487, - 37491, 37494, 37499, 37503, 37508, 37513, 37517, 37522, 37526, 37530, - 19346, 19357, 37534, 37539, 37545, 24915, 37550, 37554, 19425, 14280, - 37557, 37562, 37567, 37572, 37577, 37582, 37587, 37592, 440, 43, 29052, - 29057, 29062, 29068, 29073, 29078, 37597, 29082, 37601, 37605, 29087, - 29093, 37609, 29104, 29109, 37617, 37622, 29115, 37627, 37632, 37637, - 37642, 37648, 37654, 37660, 29132, 37673, 37679, 29136, 37683, 29141, - 37688, 29146, 29151, 37691, 37696, 37700, 28795, 37706, 11911, 37713, - 37718, 29156, 37722, 37727, 37732, 37737, 37741, 37746, 37751, 37757, - 37762, 37767, 37773, 37779, 37784, 37788, 37793, 37798, 37803, 37807, - 37812, 37817, 37822, 37828, 37834, 37840, 37845, 37849, 37854, 37858, - 29160, 29165, 29170, 37862, 37866, 29175, 29181, 29187, 29199, 37878, - 23983, 37882, 37886, 37891, 37896, 37901, 37905, 37909, 37919, 37924, - 37929, 37933, 37937, 37940, 37948, 29247, 37953, 1442, 37959, 37967, - 37976, 37980, 37988, 37994, 38002, 38018, 38023, 38038, 29284, 1712, - 10375, 38042, 2924, 38054, 38055, 38063, 38070, 38075, 38082, 38087, - 7746, 1090, 8675, 38094, 38099, 38102, 38105, 38114, 1275, 38119, 36532, - 38126, 38131, 20583, 2511, 38135, 9094, 38145, 38151, 2291, 2301, 38160, - 38169, 38179, 38190, 3235, 31944, 8727, 3735, 14882, 1280, 38195, 38203, - 38210, 38215, 38219, 38223, 21930, 8754, 38231, 38240, 38249, 38257, - 38264, 38269, 38282, 38295, 38307, 38319, 38331, 38344, 38355, 38366, - 38376, 38384, 38392, 38404, 38416, 38427, 38436, 38444, 38451, 38463, - 38470, 38479, 38486, 38499, 38504, 38514, 38519, 38525, 38530, 34759, - 38534, 38541, 38545, 38552, 38560, 2472, 38567, 38578, 38588, 38597, - 38605, 38615, 38623, 38633, 38642, 38647, 38653, 38659, 38670, 38680, - 38689, 38698, 38708, 38716, 38725, 38730, 38735, 38740, 1668, 37, 38748, - 38756, 38767, 38778, 14563, 38788, 38795, 38801, 38806, 38810, 38821, - 38831, 38840, 38851, 14931, 14936, 38856, 38865, 38870, 38880, 38885, - 38893, 38901, 38908, 38914, 5536, 1038, 38918, 38924, 38929, 38932, 2075, - 36648, 38940, 38944, 38947, 1475, 38953, 12261, 1285, 38958, 38971, - 38985, 2597, 39003, 39015, 39027, 2611, 2628, 39041, 39054, 2643, 39068, - 39080, 2658, 39094, 1291, 1297, 1303, 9012, 39099, 39104, 39109, 39113, - 39128, 39143, 39158, 39173, 39188, 39203, 39218, 39233, 39248, 39263, - 39278, 39293, 39308, 39323, 39338, 39353, 39368, 39383, 39398, 39413, - 39428, 39443, 39458, 39473, 39488, 39503, 39518, 39533, 39548, 39563, - 39578, 39593, 39608, 39623, 39638, 39653, 39668, 39683, 39698, 39713, - 39728, 39743, 39758, 39773, 39788, 39803, 39818, 39833, 39848, 39863, - 39878, 39893, 39908, 39923, 39938, 39953, 39968, 39983, 39998, 40013, - 40028, 40043, 40058, 40073, 40088, 40103, 40118, 40133, 40148, 40163, - 40178, 40193, 40208, 40223, 40238, 40253, 40268, 40283, 40298, 40313, - 40328, 40343, 40358, 40373, 40388, 40403, 40418, 40433, 40448, 40463, - 40478, 40493, 40508, 40523, 40538, 40553, 40568, 40583, 40598, 40613, - 40628, 40643, 40658, 40673, 40688, 40703, 40718, 40733, 40748, 40763, - 40778, 40793, 40808, 40823, 40838, 40853, 40868, 40883, 40898, 40913, - 40928, 40943, 40958, 40973, 40988, 41003, 41018, 41033, 41048, 41063, - 41078, 41093, 41108, 41123, 41138, 41153, 41168, 41183, 41198, 41213, - 41228, 41243, 41258, 41273, 41288, 41303, 41318, 41333, 41348, 41363, - 41378, 41393, 41408, 41423, 41438, 41453, 41468, 41483, 41498, 41513, - 41528, 41543, 41558, 41573, 41588, 41603, 41618, 41633, 41648, 41663, - 41678, 41693, 41708, 41723, 41738, 41753, 41768, 41783, 41798, 41813, - 41828, 41843, 41858, 41873, 41888, 41903, 41918, 41933, 41948, 41963, - 41978, 41993, 42008, 42023, 42038, 42053, 42068, 42083, 42098, 42113, - 42128, 42143, 42158, 42173, 42188, 42203, 42218, 42233, 42248, 42263, - 42278, 42293, 42308, 42323, 42338, 42353, 42368, 42383, 42398, 42413, - 42428, 42443, 42458, 42473, 42488, 42503, 42518, 42533, 42548, 42563, - 42578, 42593, 42608, 42623, 42638, 42653, 42668, 42683, 42698, 42713, - 42728, 42743, 42758, 42773, 42788, 42803, 42818, 42833, 42848, 42863, - 42878, 42893, 42908, 42923, 42938, 42953, 42968, 42983, 42998, 43013, - 43028, 43043, 43058, 43073, 43088, 43103, 43118, 43133, 43148, 43163, - 43178, 43193, 43208, 43223, 43238, 43253, 43268, 43283, 43298, 43313, - 43328, 43343, 43358, 43373, 43388, 43403, 43418, 43433, 43448, 43463, - 43478, 43493, 43508, 43523, 43538, 43553, 43568, 43583, 43598, 43613, - 43628, 43643, 43658, 43673, 43688, 43703, 43718, 43733, 43748, 43763, - 43778, 43793, 43808, 43823, 43838, 43853, 43868, 43883, 43898, 43913, - 43928, 43943, 43958, 43973, 43988, 44003, 44018, 44033, 44048, 44063, - 44078, 44093, 44108, 44123, 44138, 44153, 44168, 44183, 44198, 44213, - 44228, 44243, 44258, 44273, 44288, 44303, 44318, 44333, 44348, 44363, - 44378, 44393, 44408, 44423, 44438, 44453, 44468, 44483, 44498, 44513, - 44528, 44543, 44558, 44573, 44588, 44603, 44618, 44633, 44648, 44663, - 44678, 44693, 44708, 44723, 44738, 44753, 44768, 44783, 44798, 44813, - 44828, 44843, 44858, 44873, 44888, 44903, 44918, 44933, 44948, 44963, - 44978, 44993, 45008, 45023, 45038, 45053, 45068, 45083, 45098, 45113, - 45128, 45143, 45158, 45173, 45188, 45203, 45218, 45233, 45248, 45263, - 45278, 45293, 45308, 45323, 45338, 45353, 45368, 45383, 45398, 45413, - 45428, 45443, 45458, 45473, 45488, 45503, 45518, 45533, 45548, 45563, - 45578, 45593, 45608, 45623, 45638, 45653, 45668, 45683, 45698, 45713, - 45728, 45743, 45758, 45773, 45788, 45803, 45818, 45833, 45848, 45863, - 45878, 45893, 45908, 45923, 45938, 45953, 45968, 45983, 45998, 46013, - 46028, 46043, 46058, 46073, 46088, 46103, 46118, 46133, 46148, 46163, - 46178, 46193, 46208, 46223, 46238, 46253, 46268, 46283, 46298, 46313, - 46328, 46343, 46358, 46373, 46388, 46403, 46418, 46433, 46448, 46463, - 46478, 46493, 46508, 46523, 46538, 46553, 46568, 46583, 46598, 46613, - 46628, 46643, 46658, 46673, 46688, 46703, 46718, 46733, 46748, 46763, - 46778, 46793, 46808, 46823, 46838, 46853, 46868, 46883, 46899, 46915, - 46931, 46947, 46963, 46979, 46995, 47011, 47027, 47043, 47059, 47075, - 47091, 47107, 47123, 47139, 47155, 47171, 47187, 47203, 47219, 47235, - 47251, 47267, 47283, 47299, 47315, 47331, 47347, 47363, 47379, 47395, - 47411, 47427, 47443, 47459, 47475, 47491, 47507, 47523, 47539, 47555, - 47571, 47587, 47603, 47619, 47635, 47651, 47667, 47683, 47699, 47715, - 47731, 47747, 47763, 47779, 47795, 47811, 47827, 47843, 47859, 47875, - 47891, 47907, 47923, 47939, 47955, 47971, 47987, 48003, 48019, 48035, - 48051, 48067, 48083, 48099, 48115, 48131, 48147, 48163, 48179, 48195, - 48211, 48227, 48243, 48259, 48275, 48291, 48307, 48323, 48339, 48355, - 48371, 48387, 48403, 48419, 48435, 48451, 48467, 48483, 48499, 48515, - 48531, 48547, 48563, 48579, 48595, 48611, 48627, 48643, 48659, 48675, - 48691, 48707, 48723, 48739, 48755, 48771, 48787, 48803, 48819, 48835, - 48851, 48867, 48883, 48899, 48915, 48931, 48947, 48963, 48979, 48995, - 49011, 49027, 49043, 49059, 49075, 49091, 49107, 49123, 49139, 49155, - 49171, 49187, 49203, 49219, 49235, 49251, 49267, 49283, 49299, 49315, - 49331, 49347, 49363, 49379, 49395, 49411, 49427, 49443, 49459, 49475, - 49491, 49507, 49523, 49539, 49555, 49571, 49587, 49603, 49619, 49635, - 49651, 49667, 49683, 49699, 49715, 49731, 49747, 49763, 49779, 49795, - 49811, 49827, 49843, 49859, 49875, 49891, 49907, 49923, 49939, 49955, - 49971, 49987, 50003, 50019, 50035, 50051, 50067, 50083, 50099, 50115, - 50131, 50147, 50163, 50179, 50195, 50211, 50227, 50243, 50259, 50275, - 50291, 50307, 50323, 50339, 50355, 50371, 50387, 50403, 50419, 50435, - 50451, 50467, 50483, 50499, 50515, 50531, 50547, 50563, 50579, 50595, - 50611, 50627, 50643, 50659, 50675, 50691, 50707, 50723, 50739, 50755, - 50771, 50787, 50803, 50819, 50835, 50851, 50867, 50883, 50899, 50915, - 50931, 50947, 50963, 50979, 50995, 51011, 51027, 51043, 51059, 51075, - 51091, 51107, 51123, 51139, 51155, 51171, 51187, 51203, 51219, 51235, - 51251, 51267, 51283, 51299, 51315, 51331, 51347, 51363, 51379, 51395, - 51411, 51427, 51443, 51459, 51475, 51491, 51507, 51523, 51539, 51555, - 51571, 51587, 51603, 51619, 51635, 51651, 51667, 51683, 51699, 51715, - 51731, 51747, 51763, 51779, 51795, 51811, 51827, 51843, 51859, 51875, - 51891, 51907, 51923, 51939, 51955, 51971, 51987, 52003, 52019, 52035, - 52051, 52067, 52083, 52099, 52115, 52131, 52147, 52163, 52179, 52195, - 52211, 52227, 52243, 52259, 52275, 52291, 52307, 52323, 52339, 52355, - 52371, 52387, 52403, 52419, 52435, 52451, 52467, 52483, 52499, 52515, - 52531, 52547, 52563, 52579, 52595, 52611, 52627, 52643, 52659, 52675, - 52691, 52707, 52723, 52739, 52755, 52771, 52787, 52803, 52819, 52835, - 52851, 52867, 52883, 52899, 52915, 52931, 52947, 52963, 52979, 52995, - 53011, 53027, 53043, 53059, 53075, 53091, 53107, 53123, 53139, 53155, - 53171, 53187, 53203, 53219, 53235, 53251, 53267, 53283, 53299, 53315, - 53331, 53347, 53363, 53379, 53395, 53411, 53427, 53443, 53459, 53475, - 53491, 53507, 53523, 53539, 53555, 53571, 53587, 53603, 53619, 53635, - 53651, 53667, 53683, 53699, 53715, 53731, 53747, 53763, 53779, 53795, - 53811, 53827, 53843, 53859, 53875, 53891, 53907, 53923, 53939, 53955, - 53971, 53987, 54003, 54019, 54035, 54051, 54067, 54083, 54099, 54115, - 54131, 54147, 54163, 54179, 54195, 54211, 54227, 54243, 54259, 54275, - 54291, 54307, 54323, 54339, 54355, 54371, 54387, 54403, 54419, 54435, - 54451, 54467, 54483, 54499, 54515, 54531, 54547, 54563, 54579, 54595, - 54611, 54627, 54643, 54659, 54675, 54691, 54707, 54723, 54739, 54755, - 54771, 54787, 54803, 54819, 54835, 54851, 54867, 54883, 54899, 54915, - 54931, 54947, 54963, 54979, 54995, 55011, 55027, 55043, 55059, 55075, - 55091, 55107, 55123, 55139, 55155, 55171, 55187, 55203, 55219, 55235, - 55251, 55267, 55283, 55299, 55315, 55331, 55347, 55363, 55379, 55395, - 55411, 55427, 55443, 55459, 55475, 55491, 55507, 55523, 55539, 55555, - 55570, 14963, 55579, 55585, 55591, 55601, 55609, 13144, 13683, 8319, - 55622, 1483, 55630, 25385, 5637, 55636, 55641, 55646, 55651, 55656, - 55662, 55667, 55673, 55678, 55684, 55689, 55694, 55699, 55704, 55710, - 55715, 55720, 55725, 55730, 55735, 55740, 55745, 55751, 55756, 55762, - 55769, 2515, 55774, 55780, 6948, 55784, 55789, 55796, 55804, 40, 55808, - 55814, 55819, 55824, 55828, 55833, 55837, 55841, 9037, 55845, 55855, - 55868, 55879, 55892, 55899, 55905, 55910, 55916, 55922, 55928, 55933, - 55938, 55943, 55948, 55952, 55957, 55962, 55967, 55973, 55979, 55985, - 55990, 55994, 55999, 56004, 56008, 56013, 56018, 56023, 56027, 9053, - 9064, 9069, 1526, 56031, 1531, 56037, 56040, 1562, 56046, 1568, 1574, - 9099, 56051, 56059, 56066, 56070, 56076, 56081, 28824, 56086, 56093, - 56098, 56102, 56106, 1579, 14538, 14549, 56115, 56122, 56127, 56131, - 14568, 1583, 34897, 56134, 56139, 56149, 56158, 56163, 56167, 56173, - 1588, 36719, 56178, 56187, 56193, 56198, 9249, 9255, 56204, 56216, 56233, - 56250, 56267, 56284, 56301, 56318, 56335, 56352, 56369, 56386, 56403, - 56420, 56437, 56454, 56471, 56488, 56505, 56522, 56539, 56556, 56573, - 56590, 56607, 56624, 56641, 56658, 56675, 56692, 56709, 56726, 56743, - 56760, 56777, 56794, 56811, 56828, 56845, 56862, 56879, 56896, 56913, - 56930, 56947, 56964, 56981, 56998, 57015, 57032, 57049, 57060, 57065, - 1593, 57069, 57075, 57080, 7693, 1598, 57085, 57094, 25664, 57099, 57110, - 57120, 57125, 57132, 57138, 57143, 57148, 14820, 57152, 9266, 1603, 9271, - 57158, 57163, 57169, 57174, 57179, 57184, 57189, 57194, 57199, 57204, - 57210, 57216, 57222, 57227, 57231, 57236, 57241, 57245, 57250, 57255, - 57260, 57264, 57269, 57275, 57280, 57285, 57289, 57294, 57299, 57305, - 57310, 57315, 57321, 57327, 57332, 57336, 57341, 57346, 57351, 57355, - 57360, 57365, 57370, 57376, 57382, 57387, 57391, 57395, 57400, 57405, - 57410, 27024, 57414, 57419, 57424, 57430, 57435, 57440, 57444, 57449, - 57454, 57460, 57465, 57470, 57476, 57482, 57487, 57491, 57496, 57501, - 57505, 57510, 57515, 57520, 57526, 57532, 57537, 57541, 57546, 57551, - 57555, 57560, 57565, 57570, 57574, 57577, 29395, 57582, 57590, 14886, - 14910, 9362, 57596, 57606, 57621, 9367, 57632, 57637, 57648, 57660, - 57672, 57684, 2649, 57696, 57701, 57705, 57711, 57717, 57722, 1615, 1010, - 57731, 57736, 36758, 57740, 57744, 57749, 57753, 14971, 57758, 57761, - 57769, 57777, 1619, 9392, 9398, 1624, 57785, 57792, 57797, 57806, 57816, - 57823, 57828, 1629, 57835, 57840, 15086, 57844, 57849, 57856, 57862, - 57866, 57877, 57887, 15108, 7616, 7623, 1634, 57894, 57900, 57908, 57915, - 57921, 57928, 57940, 57946, 57951, 57963, 57974, 57983, 57993, 3668, - 28660, 28669, 15148, 1639, 1643, 58001, 58012, 58017, 1646, 58025, 58030, - 58042, 58048, 58053, 58061, 1651, 58066, 58071, 58079, 58087, 58094, - 58103, 58111, 58120, 1656, 58124, 1661, 58129, 58136, 15268, 58144, - 58150, 58155, 58163, 58170, 58178, 20658, 58183, 9527, 58192, 58198, - 58205, 58212, 58218, 58228, 58234, 58239, 58244, 58252, 9536, 9541, - 58260, 58266, 58274, 3733, 36846, 58279, 58285, 58290, 58298, 58305, - 10356, 58310, 58316, 1672, 58321, 58324, 1058, 58330, 58335, 58340, - 58346, 58351, 58356, 58361, 58366, 58371, 58376, 1681, 9, 58382, 58386, - 58391, 58395, 58399, 58403, 29643, 58408, 58413, 58418, 58422, 58425, - 58429, 58433, 58438, 58442, 58447, 58451, 32315, 32320, 32325, 58454, - 58461, 58467, 36585, 58477, 32331, 29891, 29653, 29659, 32347, 29665, - 58482, 58487, 29924, 58491, 58494, 58498, 58505, 58508, 58513, 58517, - 58521, 58524, 58534, 58546, 58553, 31282, 58556, 13936, 821, 58559, - 58563, 58568, 58572, 58575, 11944, 58582, 58589, 58602, 58610, 58619, - 58624, 58634, 58647, 58659, 58666, 58671, 58680, 58693, 33732, 58711, - 58716, 58723, 58729, 58734, 58742, 58749, 25224, 613, 58755, 58761, - 58771, 58777, 58782, 29683, 4481, 29697, 58786, 58796, 58801, 58811, - 58826, 58832, 58838, 29707, 58843, 28856, 58847, 58852, 58857, 58861, - 58866, 15151, 58873, 58878, 58882, 4522, 29733, 58886, 58892, 327, 58902, - 58909, 58916, 58921, 58930, 56143, 58936, 58944, 58948, 58952, 58956, - 58960, 58965, 58969, 58975, 58983, 58988, 58993, 58997, 59002, 59006, - 59010, 59016, 59022, 59027, 59031, 29857, 59036, 29863, 29869, 59041, - 59047, 59054, 59059, 59063, 28873, 14813, 59066, 59070, 59075, 59082, - 59088, 59092, 59097, 36295, 59103, 59107, 59111, 59116, 59122, 59128, - 59140, 59149, 59159, 59165, 59172, 59177, 59182, 59186, 59189, 59195, - 59202, 59207, 59212, 59219, 59226, 59232, 59237, 59242, 59250, 59255, - 2377, 59259, 59264, 59270, 59275, 59281, 59286, 59291, 59296, 59302, - 29890, 59307, 59313, 59319, 59325, 29954, 59330, 59335, 59340, 29965, - 59345, 59350, 59355, 59361, 59367, 29970, 59372, 59377, 59382, 30025, - 30031, 59387, 59392, 30036, 59397, 25891, 30058, 30062, 59402, 59378, - 59406, 59414, 59420, 59428, 59435, 59441, 59451, 59457, 59464, 8984, - 30076, 59470, 59483, 59492, 59498, 59507, 59513, 21575, 59520, 59527, - 59537, 30026, 59540, 59547, 59552, 59556, 59560, 59565, 4598, 59569, - 59574, 59579, 32409, 32414, 59583, 32428, 59588, 32433, 59593, 59599, - 32445, 32451, 32457, 59604, 59610, 20619, 59621, 59624, 59636, 59644, - 30094, 59648, 59657, 59667, 59676, 30099, 59681, 59688, 59697, 59703, - 59711, 59718, 4573, 4310, 59723, 30037, 59729, 59732, 59738, 59745, - 59750, 59755, 21502, 59759, 59765, 59771, 59776, 59781, 59785, 59791, - 59797, 31196, 826, 33406, 34304, 34310, 59802, 59806, 59810, 59813, - 59826, 59832, 59836, 59839, 59844, 31495, 59848, 28878, 19446, 59854, - 4502, 4510, 7472, 59857, 59862, 59867, 59872, 59877, 59882, 59887, 59892, - 59897, 59902, 59908, 59913, 59918, 59924, 59929, 59934, 59939, 59944, - 59949, 59954, 59960, 59965, 59971, 59976, 59981, 59986, 59991, 59996, - 60001, 60006, 60011, 60016, 60021, 60027, 60032, 60037, 60042, 60047, - 60052, 60057, 60063, 60068, 60073, 60078, 60083, 60088, 60093, 60098, - 60103, 60108, 60114, 60119, 60124, 60129, 60134, 60140, 60146, 60151, - 60157, 60162, 60167, 60172, 60177, 60182, 1476, 240, 60187, 60191, 60195, - 60199, 23157, 60203, 60207, 60212, 60216, 60221, 60225, 60229, 60233, - 60238, 60242, 11681, 60247, 60251, 60258, 13444, 60267, 60276, 60280, - 60285, 60290, 60294, 22960, 2957, 60298, 60304, 60313, 60321, 60327, - 60339, 60351, 60355, 60360, 60364, 60370, 60376, 60381, 60391, 60401, - 60407, 60412, 60416, 60421, 60427, 60436, 60445, 60453, 13798, 60457, - 60466, 60474, 60486, 60497, 60508, 60517, 60521, 60530, 60540, 60546, - 60551, 60557, 60562, 98, 28772, 60573, 24228, 24238, 60579, 60586, 60592, - 60596, 60606, 60617, 60625, 60634, 60639, 60644, 60648, 15504, 60656, - 60660, 60666, 60676, 60683, 60689, 32508, 1162, 60695, 60698, 60702, - 60712, 60718, 60725, 11618, 60732, 60738, 60747, 60756, 60762, 60768, - 60774, 60779, 60786, 60793, 60799, 60812, 60821, 60830, 60835, 60839, - 60845, 60852, 60859, 60866, 60873, 60880, 60885, 60889, 60893, 60896, - 60906, 60910, 60922, 60931, 60935, 60940, 60944, 60950, 60955, 60962, - 60971, 60979, 60987, 60992, 60996, 61001, 61006, 61016, 61024, 61029, - 61033, 61037, 61043, 61055, 61063, 61073, 61080, 61086, 61091, 61095, - 61099, 61103, 61112, 61121, 61130, 61136, 61142, 61148, 61153, 61160, - 61166, 61174, 61181, 10772, 61187, 61193, 61197, 12523, 61201, 61206, - 61216, 61225, 61231, 61237, 61245, 61252, 61256, 61260, 61266, 61274, - 61281, 61287, 61298, 61302, 61306, 61310, 61313, 61319, 61324, 61328, - 61332, 61341, 61349, 61356, 61362, 61369, 22087, 36337, 61374, 61382, - 61386, 61389, 61397, 61404, 61410, 61419, 61427, 61433, 61438, 61442, - 61447, 61451, 61455, 61460, 61469, 61473, 61480, 61487, 61493, 61501, - 61507, 61518, 61526, 61532, 20753, 61541, 61548, 61555, 61562, 61569, - 61576, 39288, 11456, 61583, 61590, 61595, 32544, 37484, 61601, 61606, - 61611, 61617, 61623, 61629, 61634, 61639, 61644, 61649, 61655, 61660, - 61666, 61671, 61677, 61682, 61687, 61692, 61697, 61702, 61707, 61712, - 61718, 61723, 61729, 61734, 61739, 61744, 61749, 61754, 61759, 61765, - 61770, 61775, 61780, 61785, 61790, 61795, 61800, 61805, 61810, 61815, - 61821, 61826, 61831, 61836, 61841, 61846, 61851, 61856, 61861, 61867, - 61872, 61877, 61882, 61887, 61892, 61897, 61902, 61907, 61912, 61917, - 61922, 61927, 61933, 1797, 224, 34993, 61938, 61941, 61946, 61950, 61953, - 61958, 60983, 61969, 61979, 61986, 62002, 62011, 62021, 62031, 62039, - 62047, 62051, 62054, 62061, 62067, 62078, 62090, 62101, 62110, 62117, - 1286, 21391, 62127, 2544, 62131, 62140, 1127, 15477, 35622, 62148, 62156, - 62170, 62183, 62187, 62192, 62197, 62202, 62208, 62214, 62219, 6957, - 62224, 62232, 9393, 62237, 62243, 1684, 9405, 723, 62252, 62261, 62271, - 24992, 62280, 62286, 15063, 62292, 62296, 3881, 9736, 62302, 58007, - 62309, 3905, 184, 12444, 62315, 62327, 62331, 62337, 25684, 62341, 9724, - 2684, 4, 62346, 62356, 62362, 62373, 62380, 62386, 62392, 62400, 62407, - 62413, 62423, 62433, 62443, 1298, 62452, 62458, 2707, 2713, 6954, 2218, - 62462, 62466, 62475, 62483, 62494, 62502, 62510, 62516, 62521, 62532, - 62543, 62551, 62557, 8061, 62562, 62570, 62574, 62578, 62590, 26060, - 62597, 62607, 62613, 62619, 8163, 62629, 62640, 62650, 62659, 62663, - 62670, 1129, 2537, 62680, 62685, 62693, 62701, 62712, 62719, 62733, - 12369, 379, 62743, 62747, 62756, 62764, 62770, 62784, 62791, 62797, - 62806, 62813, 62823, 62831, 3740, 189, 62839, 62850, 62854, 62866, 25882, - 156, 62872, 62877, 62881, 62888, 62894, 62902, 62909, 7226, 62916, 62925, - 62933, 3806, 62946, 15109, 62950, 2752, 428, 62955, 62968, 62973, 1796, - 647, 62977, 3812, 62985, 62991, 963, 63001, 63010, 63015, 13178, 13185, - 42620, 63019, 3750, 11350, 63027, 63034, 21618, 63038, 63045, 63051, - 63056, 63061, 13198, 354, 63066, 63078, 63084, 63092, 2764, 1716, 63100, - 63102, 63107, 63112, 63117, 63123, 63128, 63133, 63138, 63143, 63148, - 63153, 63159, 63164, 63169, 63174, 63179, 63184, 63189, 63194, 63199, - 63205, 63210, 63215, 63220, 63226, 63231, 63237, 63242, 63247, 63252, - 63257, 63262, 63267, 63272, 63278, 63283, 63289, 63294, 63299, 63304, - 63309, 63314, 63319, 63324, 63329, 63335, 63340, 63345, 63349, 63353, - 63358, 63362, 63367, 63372, 63378, 63383, 63387, 63392, 63396, 63399, - 63401, 63405, 63408, 63413, 63417, 63421, 63425, 63429, 63438, 63442, - 30288, 63445, 30293, 63452, 63457, 30298, 63466, 63475, 30304, 63480, - 30309, 63489, 63494, 9914, 63498, 63503, 63508, 30314, 63512, 37650, - 63516, 63519, 63523, 6638, 63529, 63534, 63538, 3633, 30319, 63541, - 63545, 63548, 63553, 63557, 63563, 63571, 63584, 63593, 63599, 63604, - 63610, 63614, 63620, 63628, 63633, 63640, 63646, 63654, 63663, 63671, - 30322, 63678, 63688, 63697, 63710, 63715, 63720, 63729, 63735, 63742, - 63753, 63765, 63772, 63781, 63790, 63799, 63806, 63812, 63819, 63827, - 63834, 63842, 63851, 63859, 63866, 63874, 63883, 63891, 63900, 63910, - 63919, 63927, 63934, 63942, 63951, 63959, 63968, 63978, 63987, 63995, - 64004, 64014, 64023, 64033, 64044, 64054, 64063, 64071, 64078, 64086, - 64095, 64103, 64112, 64122, 64131, 64139, 64148, 64158, 64167, 64177, - 64188, 64198, 64207, 64215, 64224, 64234, 64243, 64253, 64264, 64274, - 64283, 64293, 64304, 64314, 64325, 64337, 64348, 64358, 64367, 64375, - 64382, 64390, 64399, 64407, 64416, 64426, 64435, 64443, 64452, 64462, - 64471, 64481, 64492, 64502, 64511, 64519, 64528, 64538, 64547, 64557, - 64568, 64578, 64587, 64597, 64608, 64618, 64629, 64641, 64652, 64662, - 64671, 64679, 64688, 64698, 64707, 64717, 64728, 64738, 64747, 64757, - 64768, 64778, 64789, 64801, 64812, 64822, 64831, 64841, 64852, 64862, - 64873, 64885, 64896, 64906, 64917, 64929, 64940, 64952, 64965, 64977, - 64988, 64998, 65007, 65015, 65022, 65030, 65039, 65047, 65056, 65066, - 65075, 65083, 65092, 65102, 65111, 65121, 65132, 65142, 65151, 65159, - 65168, 65178, 65187, 65197, 65208, 65218, 65227, 65237, 65248, 65258, - 65269, 65281, 65292, 65302, 65311, 65319, 65328, 65338, 65347, 65357, - 65368, 65378, 65387, 65397, 65408, 65418, 65429, 65441, 65452, 65462, - 65471, 65481, 65492, 65502, 65513, 65525, 65536, 65546, 65557, 65569, - 65580, 65592, 65605, 65617, 65628, 65638, 65647, 65655, 65664, 65674, - 65683, 65693, 65704, 65714, 65723, 65733, 65744, 65754, 65765, 65777, - 65788, 65798, 65807, 65817, 65828, 65838, 65849, 65861, 65872, 65882, - 65893, 65905, 65916, 65928, 65941, 65953, 65964, 65974, 65983, 65993, - 66004, 66014, 66025, 66037, 66048, 66058, 66069, 66081, 66092, 66104, - 66117, 66129, 66140, 66150, 66161, 66173, 66184, 66196, 66209, 66221, - 66232, 66244, 66257, 66269, 66282, 66296, 66309, 66321, 66332, 66342, - 66351, 66359, 66366, 66371, 6489, 66378, 30332, 66383, 66388, 30337, - 66394, 19100, 30342, 66399, 66405, 66413, 66419, 66425, 66432, 66439, - 66444, 66448, 66451, 66455, 66464, 66470, 66482, 66493, 66497, 3019, - 6464, 66502, 66505, 66507, 66511, 66515, 66519, 23927, 66524, 66528, - 66531, 66536, 66540, 66547, 66553, 66557, 66561, 66564, 30359, 66569, - 66576, 66585, 66593, 66604, 66612, 66620, 66627, 66634, 66640, 66651, - 30364, 66656, 66667, 66679, 66687, 66698, 66707, 66718, 66723, 66731, - 2510, 66736, 32002, 66749, 66753, 66765, 66773, 66778, 66786, 15664, - 66797, 66803, 66810, 66818, 66824, 30374, 66829, 3831, 55605, 66836, - 66839, 66847, 66860, 66873, 66886, 66899, 66906, 66917, 66926, 39105, - 39110, 66931, 66935, 66943, 66950, 66959, 66967, 66973, 66982, 66990, - 66998, 67002, 67011, 67020, 67030, 67043, 67056, 67066, 30379, 67072, - 67079, 67085, 30385, 67090, 67093, 67097, 67105, 67114, 38843, 67122, - 67131, 67139, 67146, 67154, 67164, 67173, 67182, 67191, 67199, 67210, - 67220, 7733, 19715, 67229, 67234, 67239, 67243, 67247, 67252, 67258, - 67263, 67268, 67274, 67279, 67284, 19680, 67289, 67296, 67304, 67312, - 67317, 67324, 67331, 67335, 67339, 67347, 67355, 30402, 67361, 67367, - 67379, 67385, 67389, 67396, 67401, 67412, 67422, 67432, 67444, 67450, - 67460, 67470, 30429, 67479, 67488, 67494, 67506, 67517, 67524, 67529, - 67533, 67541, 67547, 67552, 67557, 67564, 67572, 67584, 67594, 67603, - 67612, 67619, 31866, 21906, 67625, 67630, 67634, 67638, 67643, 67649, - 67660, 67673, 67678, 67685, 30434, 67690, 67702, 67711, 67721, 67732, - 67745, 67752, 67761, 67770, 67778, 67783, 67789, 1465, 67794, 67799, - 67804, 67809, 67815, 67820, 67825, 67831, 67837, 67842, 67846, 67851, - 67856, 67861, 56111, 67866, 67871, 67876, 67881, 67887, 67893, 67898, - 67902, 67907, 67912, 67917, 67923, 67928, 67934, 67939, 67944, 67949, - 67954, 67958, 67964, 67969, 67978, 67983, 67988, 67993, 67998, 68002, - 68009, 68015, 15326, 15333, 42875, 68020, 67970, 68022, 68032, 30443, - 68035, 68044, 68050, 4617, 30448, 68054, 68060, 68066, 68071, 68075, - 68082, 68087, 68097, 68106, 68110, 68116, 68122, 68128, 68132, 68140, - 68147, 68155, 68163, 30453, 68170, 68173, 68180, 68186, 68191, 68195, - 68201, 68208, 68213, 68217, 68226, 68234, 68240, 68245, 30458, 68252, - 68259, 68265, 68270, 68276, 68283, 68289, 19453, 25408, 68295, 68300, - 68306, 68318, 68003, 68010, 68328, 68333, 68340, 68347, 68353, 68364, - 68369, 7502, 68377, 68380, 68386, 68390, 68394, 68397, 68403, 30207, - 4656, 913, 11731, 68410, 68416, 68422, 68428, 68434, 68440, 68446, 68452, - 68458, 68463, 68468, 68473, 68478, 68483, 68488, 68493, 68498, 68503, - 68508, 68513, 68518, 68523, 68529, 68534, 68539, 68545, 68550, 68555, - 68561, 68567, 68573, 68579, 68585, 68591, 68597, 68603, 68609, 68614, - 68619, 68625, 68630, 68635, 68641, 68646, 68651, 68656, 68661, 68666, - 68671, 68676, 68681, 68686, 68691, 68696, 68701, 68707, 68712, 68717, - 68722, 68728, 68733, 68738, 68743, 68748, 68754, 68759, 68764, 68769, - 68774, 68779, 68784, 68789, 68794, 68799, 68804, 68809, 68814, 68819, - 68824, 68829, 68834, 68839, 68844, 68849, 68855, 68860, 68865, 68870, - 68875, 68880, 68885, 68890, 1827, 143, 68895, 68899, 68903, 68908, 68916, - 68920, 68927, 68935, 68939, 68952, 68960, 68964, 68967, 68972, 68976, - 68981, 68985, 68993, 68997, 19108, 69002, 58270, 69006, 69009, 69017, - 69025, 69033, 69038, 69045, 69051, 69057, 69062, 69067, 69075, 62175, - 69082, 69087, 69092, 69096, 9981, 69100, 69105, 69110, 69114, 69117, - 69123, 69127, 69137, 69146, 69149, 69156, 69169, 69175, 69183, 69194, - 69205, 69216, 69227, 69236, 69242, 69251, 69259, 69269, 69282, 69289, - 69300, 69306, 69311, 69316, 69322, 69328, 69338, 69347, 67692, 69355, - 69361, 69369, 69375, 69383, 69387, 69391, 69394, 69400, 69406, 69414, - 69426, 69438, 69445, 69449, 69460, 69468, 69475, 69487, 69495, 69503, - 69510, 69516, 69526, 69535, 69540, 69550, 69559, 38184, 69566, 69570, - 69575, 69583, 69590, 69596, 69600, 69610, 69621, 69629, 69636, 69648, - 69660, 69669, 66739, 69676, 69687, 69701, 69709, 69719, 69726, 69734, - 69746, 69755, 69763, 69773, 69782, 69793, 69805, 69814, 69824, 69831, - 69840, 69855, 69865, 69874, 69882, 69895, 69910, 69914, 69923, 69935, - 69946, 69957, 69968, 69978, 69989, 69997, 70003, 70013, 70019, 26923, - 70024, 70030, 70035, 70042, 8075, 15684, 70048, 70057, 70062, 70066, - 70073, 70079, 70084, 70092, 70100, 70104, 70107, 70110, 70112, 70119, - 70125, 70136, 70141, 70145, 70152, 70158, 70163, 70171, 62642, 62652, - 70177, 70184, 70194, 8971, 70201, 70206, 27113, 70215, 70220, 70227, - 70237, 70245, 70253, 70262, 70268, 70274, 70281, 70288, 70293, 70297, - 70305, 70310, 70315, 70323, 70330, 70335, 70341, 70344, 70348, 70357, - 68947, 70366, 70370, 70376, 70387, 70397, 15693, 70408, 70416, 15705, - 70423, 70427, 70436, 25294, 70443, 70447, 70452, 70469, 70481, 8925, - 70493, 70498, 70503, 70508, 70512, 70515, 70520, 70525, 70531, 70536, - 4324, 19181, 70541, 70546, 70552, 70559, 70564, 70569, 70575, 70581, - 70587, 70592, 70598, 70602, 70616, 70624, 70632, 70638, 70643, 70650, - 70660, 70669, 70674, 70679, 70687, 70692, 70698, 70703, 70712, 57154, - 70717, 70720, 70738, 70757, 70770, 70784, 70800, 70807, 70814, 70820, - 70827, 70832, 70838, 70844, 70852, 70858, 70863, 70868, 70884, 8938, - 70898, 70905, 70913, 70919, 70923, 70926, 70931, 70936, 70943, 70948, - 70957, 70962, 70968, 70977, 70986, 70991, 70995, 71003, 10005, 71012, - 71020, 71025, 71031, 10016, 71036, 71039, 71044, 71054, 71063, 71068, - 71074, 71079, 71087, 71094, 71105, 71115, 71120, 62103, 71125, 71131, - 71136, 71143, 71152, 71160, 71166, 71173, 71179, 71183, 15161, 2993, - 71188, 71192, 71198, 71207, 71213, 71220, 71224, 71245, 71267, 71283, - 71300, 71319, 71328, 71338, 71345, 71352, 25181, 71358, 71362, 71370, - 71382, 71388, 71396, 71400, 71408, 71415, 71419, 71425, 71431, 71436, - 3498, 39305, 71442, 71446, 71450, 71454, 71459, 71464, 71469, 71475, - 71481, 71487, 71494, 71500, 71507, 71513, 71519, 71524, 71530, 71535, - 71540, 71544, 71549, 39320, 71553, 71558, 71566, 71570, 71575, 71582, - 71591, 71597, 71604, 71608, 71611, 71618, 71627, 71632, 71636, 71644, - 71653, 71657, 71665, 71671, 71676, 71681, 71687, 71693, 71698, 71702, - 71708, 71713, 71717, 71721, 71724, 71729, 71737, 71747, 71752, 36865, - 71760, 71772, 71776, 71782, 71794, 71805, 71812, 71818, 71825, 71837, - 71844, 71850, 19255, 71854, 71860, 71867, 71873, 71879, 71884, 71889, - 71894, 71903, 5491, 71908, 14627, 71914, 71918, 71926, 71935, 71939, - 71946, 71955, 71968, 71974, 71545, 27962, 71979, 71981, 71986, 71991, - 71996, 72001, 72006, 72011, 72016, 72021, 72026, 72031, 72036, 72041, - 72046, 72051, 72057, 72062, 72067, 72072, 72077, 72082, 72087, 72092, - 72097, 72103, 72109, 72115, 72120, 72125, 72137, 72142, 1833, 67, 72147, - 72152, 30485, 30490, 30495, 30501, 30506, 72156, 30511, 20226, 72178, - 72182, 72186, 72191, 72195, 30515, 72199, 72207, 30520, 72214, 72217, - 72222, 72226, 7910, 72235, 30525, 20092, 72238, 72242, 1396, 72247, - 30536, 72250, 72255, 23720, 23730, 32940, 72260, 72265, 72270, 72275, - 72281, 72286, 72295, 72300, 72307, 72313, 72318, 72323, 72328, 72338, - 72347, 72352, 72360, 72364, 72372, 30350, 1188, 72379, 72385, 72390, - 72395, 72400, 72406, 72411, 72418, 72424, 72429, 72437, 72447, 72457, - 72463, 72468, 72474, 15715, 72481, 33745, 72494, 72499, 72505, 72518, - 72524, 72528, 72537, 72544, 72550, 72558, 72567, 72574, 72580, 72583, - 23861, 72587, 72594, 72600, 72608, 72613, 22035, 72619, 72622, 72630, - 72638, 72652, 72659, 72665, 72672, 72678, 30550, 72682, 72689, 72697, - 72705, 30555, 72711, 72717, 72722, 72732, 72738, 72747, 28677, 32415, - 72755, 72760, 72765, 72770, 72774, 13170, 36878, 72779, 72784, 30560, - 59554, 72788, 72793, 72797, 72806, 72814, 72820, 72825, 72831, 72838, - 72844, 72849, 72854, 72863, 72875, 72890, 30801, 72896, 14746, 30564, - 72900, 72907, 22145, 72913, 72920, 72929, 72936, 72945, 72951, 72956, - 72964, 72970, 30574, 72975, 72984, 71800, 72993, 73000, 73006, 73012, - 73022, 73030, 73037, 73041, 30579, 73044, 30585, 30591, 73049, 73057, - 73067, 73076, 73084, 73091, 73101, 30596, 73105, 73107, 73111, 73116, - 73120, 73124, 73130, 73135, 73139, 73150, 73155, 2998, 73159, 73166, - 73170, 73179, 73187, 73194, 73199, 73204, 59600, 73208, 73211, 73217, - 73225, 73231, 73235, 73240, 73247, 73252, 73258, 32446, 73263, 73266, - 73271, 73275, 73280, 73285, 73289, 73297, 23739, 23748, 73303, 73309, - 73315, 73320, 73324, 73327, 73337, 73346, 73351, 73357, 73364, 73370, - 73374, 73382, 73387, 32452, 73391, 73399, 73405, 73412, 73417, 73421, - 73426, 55791, 32458, 73432, 73437, 73441, 73446, 73451, 73456, 73460, - 73465, 73470, 73476, 73481, 73486, 73492, 73498, 73503, 73507, 73512, - 73517, 73522, 73526, 22144, 73531, 73536, 73542, 73548, 73554, 73559, - 73563, 73568, 73573, 73578, 73582, 73587, 73592, 73597, 73602, 73606, - 30600, 73614, 73618, 73626, 73634, 73645, 73650, 73654, 20497, 73659, - 73665, 73675, 73682, 73687, 73696, 73701, 73705, 73710, 73718, 73726, - 73733, 62321, 73739, 73747, 73754, 73765, 73771, 73777, 30610, 73780, - 73787, 73795, 73800, 37069, 73804, 73809, 73816, 73821, 7389, 73825, - 73833, 73840, 73847, 73853, 73867, 60629, 73875, 73881, 73885, 73888, - 73896, 73903, 73908, 73921, 73928, 73935, 73940, 58174, 73945, 73948, - 73955, 73961, 73965, 73973, 73983, 73993, 74002, 74010, 74021, 74026, - 74030, 74035, 74039, 33071, 19509, 33080, 74047, 74052, 74057, 74062, - 74067, 74072, 74077, 74081, 74086, 74091, 74096, 74101, 74106, 74111, - 74115, 74120, 74125, 74129, 74133, 74137, 74141, 74146, 74151, 74155, - 74160, 74164, 74168, 74173, 74178, 74183, 74188, 74192, 74197, 74202, - 74206, 74211, 74216, 74221, 74226, 74231, 74236, 74241, 74246, 74251, - 74256, 74261, 74266, 74271, 74276, 74281, 74286, 74291, 74296, 74301, - 74306, 74310, 74315, 74320, 74325, 74330, 74335, 74340, 74345, 74350, - 74355, 74360, 74365, 74369, 74374, 74378, 74383, 74388, 74393, 74398, - 74403, 74408, 74413, 74418, 74423, 74427, 74431, 74436, 74441, 74445, - 74450, 74455, 74459, 74464, 74469, 74474, 74479, 74483, 74488, 74493, - 74497, 74502, 74506, 74510, 74514, 74518, 74523, 74527, 74531, 74535, - 74539, 74543, 74547, 74551, 74555, 74559, 74564, 74569, 74574, 74579, - 74584, 74589, 74594, 74599, 74604, 74609, 74613, 74617, 74621, 74625, - 74629, 74633, 74638, 74642, 74647, 74651, 74656, 74661, 74665, 74669, - 74674, 74678, 74682, 74686, 74690, 74694, 74698, 74702, 74706, 74710, - 74714, 74718, 74722, 74726, 74730, 74735, 74740, 74744, 74748, 74752, - 74756, 74760, 74764, 74769, 74773, 74777, 74781, 74785, 74789, 74793, - 74798, 74802, 74807, 74811, 74815, 74819, 74823, 74827, 74831, 74835, - 74839, 74843, 74847, 74851, 74856, 74860, 74864, 74868, 74872, 74876, - 74880, 74884, 74888, 74892, 74896, 74900, 74905, 74909, 74913, 74918, - 74923, 74927, 74931, 74935, 74939, 74943, 74947, 74951, 74955, 74960, - 74964, 74969, 74973, 74978, 74982, 74987, 74991, 74997, 75002, 75006, - 75011, 75015, 75020, 75024, 75029, 75033, 75038, 1484, 75042, 2778, 1722, - 1727, 75046, 75050, 2782, 75054, 1365, 75059, 1331, 75063, 2794, 75067, - 75074, 75081, 75095, 2798, 5589, 75104, 75112, 75119, 75130, 75139, - 75146, 75158, 75171, 75184, 75195, 75200, 75207, 75219, 75223, 3918, - 10082, 75233, 75238, 75247, 75257, 2802, 75262, 75266, 75271, 75278, - 75284, 75292, 75304, 1336, 11351, 75314, 75318, 75324, 75338, 75350, - 75362, 75372, 75381, 75390, 75399, 75407, 75418, 75426, 3968, 75436, - 75445, 75451, 75466, 75473, 75479, 33197, 75484, 2826, 11355, 75488, - 75495, 7334, 75504, 2831, 30105, 75510, 57923, 75517, 75523, 75534, - 75540, 75547, 75553, 75561, 75568, 75574, 75584, 75593, 75604, 75611, - 75617, 75627, 75635, 75641, 75656, 75662, 75667, 75674, 75677, 75683, - 75690, 75696, 75704, 75713, 75721, 75727, 75736, 38845, 75750, 75755, - 13007, 75761, 75774, 75783, 75791, 75798, 75802, 75806, 75809, 75816, - 75823, 75831, 75839, 75848, 75856, 12943, 75864, 75869, 75873, 75885, - 75892, 75901, 780, 75911, 75920, 75931, 2847, 75935, 75939, 75945, 75958, - 75970, 75980, 75989, 24331, 76001, 76009, 76018, 76029, 76040, 76050, - 76060, 76069, 76077, 9657, 76084, 76088, 76093, 76098, 76104, 1341, - 10153, 76111, 76122, 76131, 76139, 76148, 76156, 76172, 76183, 76192, - 76200, 76212, 76223, 76239, 76249, 76270, 76283, 76291, 76298, 13118, - 76311, 76316, 76322, 4386, 76328, 76331, 76338, 76348, 6607, 76355, - 76360, 76365, 76373, 76381, 8123, 8132, 76386, 76397, 76402, 76408, 2855, - 2860, 76414, 9224, 76420, 76427, 76434, 76447, 2205, 50, 76452, 76457, - 76467, 76473, 76482, 76490, 76500, 76504, 76509, 76513, 76525, 2883, - 76533, 76541, 76546, 76557, 76568, 76577, 76582, 76588, 76593, 76603, - 76613, 76618, 76624, 76629, 76638, 19562, 76642, 4045, 12, 76647, 76656, - 76663, 76670, 76676, 76682, 827, 76687, 76692, 58240, 76697, 76702, - 76708, 76716, 76721, 76728, 76734, 76739, 35573, 38743, 76745, 2887, 32, - 76755, 76768, 76773, 76781, 76786, 76792, 2909, 26234, 76797, 76805, - 76812, 76817, 56033, 59221, 76826, 1667, 1776, 76831, 76836, 76843, 1780, - 242, 76850, 76856, 76861, 76868, 1784, 76873, 76879, 76884, 76896, 4597, - 76906, 1791, 76912, 76917, 76924, 76931, 76946, 76953, 76964, 76972, - 2572, 76976, 76988, 76993, 76997, 77003, 26059, 2210, 77007, 77018, - 77022, 77026, 77032, 77036, 77045, 77049, 77060, 77064, 2256, 29944, - 77068, 77078, 3018, 7738, 77086, 77091, 77095, 77104, 77111, 77117, 2988, - 15343, 77121, 77134, 77152, 77157, 77165, 77173, 77183, 11457, 77195, - 77208, 77215, 77222, 77238, 77245, 77251, 1024, 77258, 77265, 77275, - 77284, 77296, 39709, 77304, 3002, 10350, 77307, 77315, 77319, 3006, - 77323, 19358, 10366, 3684, 77327, 3012, 77331, 77341, 77347, 77353, - 77359, 77365, 77371, 77377, 77383, 77389, 77395, 77401, 77407, 77413, - 77419, 77425, 77431, 77437, 77443, 77449, 77455, 77461, 77467, 77473, - 77479, 77485, 77491, 77498, 77505, 77511, 77517, 77523, 77529, 77535, - 77541, 1346, 14270, 10388, 77547, 77552, 77557, 77562, 77567, 77572, - 77577, 77582, 77587, 77592, 77597, 77602, 77607, 77612, 77617, 77622, - 77627, 77632, 77637, 77642, 77647, 77652, 77657, 77662, 77667, 77672, - 77678, 77683, 77688, 77694, 77699, 77705, 77710, 77715, 77721, 77726, - 77731, 77736, 77741, 77746, 77751, 77756, 77761, 77342, 77348, 77354, - 77360, 77366, 77372, 77378, 77384, 77390, 77396, 77402, 77408, 77414, - 77420, 77426, 77767, 77432, 77438, 77444, 77773, 77450, 77456, 77462, - 77468, 77474, 77480, 77486, 77506, 77779, 77785, 77512, 77791, 77518, - 77524, 77530, 77536, 77542, 3033, 3038, 77797, 77802, 77805, 77811, - 77817, 77824, 77829, 77834, 2261, + 0, 0, 6, 10, 18, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108, + 113, 121, 130, 135, 140, 143, 147, 153, 158, 166, 173, 181, 186, 191, + 194, 200, 208, 215, 225, 230, 237, 246, 249, 252, 257, 263, 267, 276, + 283, 290, 295, 304, 312, 318, 324, 330, 144, 335, 341, 349, 350, 356, + 364, 370, 377, 380, 382, 386, 393, 401, 406, 408, 413, 420, 426, 428, + 435, 440, 442, 316, 445, 447, 452, 457, 463, 470, 479, 489, 494, 498, + 511, 518, 522, 531, 538, 545, 548, 554, 558, 568, 576, 584, 592, 601, + 609, 614, 615, 623, 630, 640, 651, 655, 658, 348, 663, 667, 671, 677, + 683, 685, 688, 692, 695, 704, 708, 717, 720, 723, 731, 736, 740, 743, + 749, 756, 763, 772, 779, 783, 792, 800, 805, 811, 820, 694, 830, 837, + 846, 852, 858, 866, 875, 883, 887, 895, 781, 900, 17, 516, 909, 913, 917, + 924, 931, 935, 939, 942, 945, 953, 960, 964, 969, 977, 980, 192, 986, + 991, 1001, 1010, 1017, 1024, 1030, 1038, 1046, 1052, 1056, 1061, 111, + 1064, 1069, 1075, 1079, 1085, 1088, 1101, 1104, 1108, 1112, 1117, 1120, + 1122, 1125, 1131, 1141, 1147, 1157, 1160, 1165, 1174, 333, 1182, 1185, + 1188, 1194, 1198, 1200, 1205, 1210, 1216, 1221, 1226, 1230, 1235, 1241, + 1246, 1251, 1255, 1260, 1265, 1269, 1274, 1279, 1284, 1290, 1296, 1302, + 1307, 1311, 1316, 1321, 1326, 1330, 1335, 1340, 1345, 1350, 1201, 1206, + 1211, 1217, 1222, 1354, 1227, 1360, 1369, 1231, 1373, 1236, 1242, 1247, + 1377, 1382, 1387, 1391, 1395, 1401, 1405, 1252, 1408, 1412, 1256, 1418, + 1261, 1422, 1426, 1266, 1430, 1435, 1439, 1442, 1446, 1270, 1275, 1451, + 1280, 1457, 1463, 1469, 1475, 1285, 1297, 1303, 1479, 1483, 1487, 1490, + 1308, 1494, 1496, 1501, 1506, 1512, 1517, 1522, 1526, 1531, 1536, 1541, + 1546, 1552, 1557, 1562, 1568, 1574, 1579, 1583, 1588, 1593, 1598, 1603, + 1607, 1615, 1619, 1624, 1629, 1634, 1639, 1643, 1646, 1651, 1656, 1661, + 1666, 1672, 1677, 1681, 1312, 1684, 1689, 1694, 1317, 1698, 1702, 1709, + 1322, 1716, 1327, 1720, 1722, 1727, 1733, 1331, 1738, 1747, 1336, 1752, + 1758, 1341, 1763, 1768, 1771, 1776, 1780, 1784, 1788, 1791, 1795, 1346, + 1351, 1115, 1800, 1806, 1812, 1818, 1824, 1830, 1836, 1842, 1848, 1853, + 1859, 1865, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1912, 1917, 1922, + 1927, 1932, 1937, 1942, 1947, 1952, 1957, 1963, 1968, 1974, 1979, 1985, + 1991, 1996, 2002, 2008, 2014, 2020, 2025, 2030, 2032, 2033, 2037, 2041, + 2046, 2050, 2054, 2058, 2062, 2065, 2070, 2074, 2079, 2083, 2087, 2092, + 2096, 2099, 2103, 2109, 2123, 2127, 2131, 2135, 2138, 2143, 2147, 2151, + 2154, 2158, 2163, 2168, 2173, 2178, 2182, 2186, 2190, 2195, 2199, 2204, + 2208, 2213, 2219, 2226, 2232, 2237, 2242, 2247, 2253, 2258, 2264, 2269, + 2272, 1218, 2274, 2281, 2289, 2299, 2308, 2322, 2326, 2330, 2343, 2351, + 2355, 2360, 2364, 2367, 2371, 2375, 2380, 2385, 2390, 2394, 2397, 2401, + 2408, 2415, 2421, 2426, 2431, 2437, 2443, 2448, 2451, 1724, 2453, 2459, + 2463, 2468, 2472, 2476, 1729, 1735, 2481, 2485, 2488, 2493, 2498, 2503, + 2508, 2512, 2519, 2524, 2527, 2534, 2540, 2544, 2548, 2552, 2557, 2564, + 2569, 2574, 2581, 2587, 2593, 2599, 2613, 2630, 2645, 2660, 2669, 2674, + 2678, 2683, 2688, 2692, 2704, 2711, 2717, 2222, 2723, 2730, 2736, 2740, + 2743, 2750, 2756, 2760, 2764, 2768, 2055, 2772, 2777, 2782, 2786, 2794, + 2798, 2802, 2806, 2810, 2815, 2820, 2825, 2829, 2834, 2839, 2843, 2848, + 2852, 2855, 2859, 2863, 2868, 2872, 2876, 2882, 2891, 2895, 2899, 2905, + 2910, 2917, 2921, 2931, 2935, 2939, 2944, 2948, 2953, 2959, 2964, 2968, + 2972, 2976, 2411, 2984, 2989, 2995, 3000, 3004, 3009, 3014, 3018, 3024, + 3029, 3035, 3039, 3045, 3050, 3055, 3060, 3065, 3070, 3075, 3080, 3085, + 3090, 3096, 3101, 1228, 80, 3107, 3111, 3115, 3119, 3124, 3128, 3132, + 3136, 3140, 3145, 3149, 3154, 3158, 3161, 3165, 3170, 3174, 3179, 3183, + 3187, 3191, 3196, 3200, 3203, 3216, 3220, 3224, 3228, 3232, 3236, 3239, + 3243, 3247, 3252, 3256, 3261, 3266, 3271, 3275, 3278, 3281, 3287, 3291, + 3295, 3298, 3302, 3306, 3309, 3315, 3320, 3325, 3331, 3336, 3341, 3347, + 3353, 3358, 3363, 3368, 1106, 547, 3373, 3376, 3381, 3385, 3388, 3392, + 3397, 3402, 3406, 3411, 3415, 3420, 3424, 3428, 3434, 3440, 3443, 3446, + 3452, 3459, 3466, 3472, 3479, 3484, 3488, 3495, 3500, 3504, 3514, 3518, + 3522, 3527, 3532, 3542, 2066, 3547, 3551, 3554, 3560, 3565, 3571, 3577, + 3582, 3589, 3593, 3597, 664, 693, 3601, 3608, 3615, 3622, 3628, 3634, + 3639, 3643, 3649, 3654, 3658, 2075, 3662, 3670, 596, 3676, 3687, 3691, + 3701, 2080, 3707, 3712, 3727, 3733, 3740, 3750, 3756, 3761, 3767, 3773, + 3776, 3780, 3785, 3792, 3797, 3801, 3805, 3809, 3813, 3818, 3824, 3166, + 3829, 3841, 3849, 3854, 1528, 3861, 3864, 3867, 3871, 3874, 3880, 3884, + 3898, 3902, 3905, 3909, 3915, 3921, 3926, 3930, 3934, 3940, 3951, 3957, + 3962, 3968, 3972, 3980, 3990, 3996, 4001, 4010, 4018, 4025, 4029, 4035, + 4044, 4053, 4057, 4062, 4067, 4071, 4079, 4083, 4088, 4092, 2088, 1370, + 4098, 4103, 4109, 4114, 4119, 4124, 4129, 4134, 4139, 4145, 4150, 4156, + 4161, 4166, 4171, 4177, 4182, 4187, 4192, 4197, 4203, 4208, 4214, 4219, + 4224, 4229, 4234, 4239, 4244, 4250, 4255, 4260, 339, 456, 4265, 4271, + 4275, 4279, 4284, 4288, 4292, 4295, 4299, 4303, 4307, 4311, 4316, 4320, + 4324, 4330, 4095, 4335, 4338, 4345, 4349, 4362, 4366, 4370, 4374, 4378, + 4382, 4386, 4392, 4399, 4407, 4411, 4419, 4428, 4434, 4446, 4451, 4454, + 4458, 4468, 4476, 4484, 4490, 4494, 4504, 4514, 4522, 4529, 4536, 4542, + 4548, 4555, 4559, 4566, 4576, 4586, 4594, 4601, 4606, 4610, 4618, 4622, + 4627, 4634, 4642, 4647, 4652, 4656, 4670, 4675, 4680, 4687, 4696, 4699, + 4703, 4707, 4710, 4715, 4720, 4729, 4735, 4741, 4747, 4751, 4762, 4772, + 4787, 4802, 4817, 4832, 4847, 4862, 4877, 4892, 4907, 4922, 4937, 4952, + 4967, 4982, 4997, 5012, 5027, 5042, 5057, 5072, 5087, 5102, 5117, 5132, + 5147, 5162, 5177, 5192, 5207, 5222, 5237, 5252, 5267, 5282, 5297, 5312, + 5327, 5342, 5357, 5372, 5387, 5402, 5417, 5432, 5447, 5462, 5477, 5492, + 5507, 5516, 5525, 5530, 5536, 5546, 5550, 5555, 5560, 5568, 5572, 5575, + 5579, 2926, 5582, 5587, 315, 438, 5593, 5601, 5605, 5609, 5612, 5616, + 5622, 5626, 5634, 5640, 5645, 5652, 5659, 5665, 5670, 5677, 5683, 5691, + 5695, 5700, 5712, 5723, 5730, 5734, 5740, 3188, 5744, 5750, 5755, 5760, + 5765, 5771, 5776, 5781, 5786, 5791, 5797, 5802, 5807, 5813, 5818, 5824, + 5829, 5835, 5840, 5846, 5851, 5856, 5861, 5866, 5871, 5877, 5882, 5887, + 5892, 5898, 5904, 5910, 5916, 5922, 5928, 5934, 5940, 5946, 5952, 5958, + 5964, 5969, 5974, 5979, 5984, 5989, 5994, 5999, 6004, 6010, 6016, 6021, + 6027, 6033, 6039, 6044, 6049, 6054, 6059, 6065, 6071, 6076, 6081, 6086, + 6091, 6096, 6102, 6107, 6113, 6119, 6125, 6131, 6137, 6143, 6149, 6155, + 6161, 5611, 6166, 6170, 6174, 6177, 6184, 6187, 6195, 6200, 6205, 6196, + 6210, 2124, 6214, 6220, 6226, 6231, 6236, 6243, 6251, 6256, 6260, 6263, + 6267, 2132, 556, 6271, 6275, 6280, 6286, 6291, 6295, 6298, 6302, 6308, + 6313, 6317, 6324, 6328, 6332, 6336, 966, 761, 6339, 6347, 6354, 6361, + 6367, 6374, 6382, 6389, 6396, 6401, 6413, 1248, 1378, 1383, 6424, 1388, + 6428, 6432, 6441, 6449, 6458, 6464, 6469, 6473, 6479, 6484, 6491, 6495, + 6504, 6513, 6522, 6531, 6536, 6541, 6553, 6558, 6566, 2183, 6570, 6572, + 6577, 6581, 6590, 6598, 1392, 133, 3416, 3421, 6604, 6608, 6617, 6623, + 6628, 6631, 6640, 2657, 6646, 6654, 6658, 6662, 2196, 6666, 6671, 6678, + 6684, 6690, 6693, 6695, 6698, 6706, 6714, 6722, 6725, 6730, 6207, 6733, + 6735, 6740, 6745, 6750, 6755, 6760, 6765, 6770, 6775, 6780, 6785, 6791, + 6796, 6801, 6806, 6812, 6817, 6822, 6827, 6832, 6837, 6842, 6848, 6853, + 6858, 6863, 6868, 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, + 6918, 6923, 6928, 6933, 6939, 6945, 6950, 6955, 6960, 6965, 6970, 2220, + 2227, 2233, 6975, 6981, 6989, 2259, 2265, 6997, 7001, 7006, 7010, 7014, + 7018, 7023, 7027, 7032, 7036, 7039, 7042, 7048, 7054, 7060, 7066, 7072, + 7078, 7084, 7088, 7092, 7096, 7100, 7104, 7109, 7116, 7127, 7135, 7145, + 7152, 7157, 7161, 7172, 7185, 7196, 7209, 7220, 7232, 7244, 7256, 7269, + 7282, 7289, 7295, 7309, 7316, 7322, 7326, 7331, 7335, 7342, 7350, 7354, + 7360, 7364, 7370, 7380, 7384, 7389, 7394, 7401, 7407, 7417, 6369, 7423, + 7427, 7434, 760, 7438, 7442, 7447, 7452, 7457, 7461, 7467, 7475, 7481, + 7485, 7491, 7501, 7505, 7511, 7516, 7520, 7526, 7532, 2120, 7537, 7539, + 7544, 7552, 7561, 7565, 7571, 7576, 7581, 7586, 7591, 7597, 7602, 7607, + 3936, 7612, 7617, 7621, 7627, 7632, 7638, 7643, 7648, 7654, 7659, 7566, + 7665, 7669, 7676, 7682, 7687, 7691, 4666, 7696, 7705, 7710, 7715, 6674, + 6681, 7720, 2812, 7724, 7729, 7734, 7577, 7738, 7582, 7587, 7743, 7750, + 7757, 7763, 7769, 7775, 7780, 7785, 7790, 7592, 7598, 7796, 7802, 7807, + 7815, 7603, 7820, 1054, 7823, 7831, 7837, 7843, 7852, 7860, 7865, 7871, + 7879, 7886, 7901, 7918, 7937, 7946, 7954, 7969, 7980, 7990, 8000, 8008, + 8014, 8026, 8035, 8043, 8050, 8057, 8063, 8068, 8076, 8086, 8093, 8103, + 8113, 8123, 8131, 8138, 8147, 8157, 8171, 8186, 8195, 8203, 8208, 8212, + 8221, 8227, 8232, 8242, 8252, 8262, 8267, 8271, 8280, 8285, 8295, 8306, + 8319, 8332, 8344, 8352, 8357, 8361, 8367, 8372, 8380, 8388, 8395, 8400, + 8408, 8414, 8417, 8421, 8427, 8435, 8440, 8444, 8452, 8461, 8469, 8475, + 8479, 8486, 8497, 8501, 8504, 8510, 7608, 8515, 8521, 8528, 8534, 8539, + 8546, 8553, 8560, 8567, 8574, 8581, 8586, 7914, 8591, 8597, 8604, 8611, + 8616, 8623, 8632, 8636, 8648, 6712, 8652, 8655, 8659, 8663, 8667, 8671, + 8677, 8682, 8688, 8693, 8698, 8704, 8709, 8714, 7397, 8719, 8723, 8727, + 8731, 8736, 8741, 8749, 8755, 8759, 8763, 8770, 8775, 8783, 8788, 8792, + 8795, 8801, 8808, 8812, 8815, 8820, 8824, 3975, 8830, 8839, 36, 8847, + 8853, 8858, 7412, 8863, 8868, 8872, 8875, 8890, 8909, 8921, 8934, 8947, + 8960, 8974, 8987, 9002, 9009, 7613, 9015, 9029, 9034, 9040, 9045, 9053, + 9058, 6500, 9063, 9066, 9073, 9078, 9082, 2817, 975, 9088, 9092, 9098, + 9104, 9109, 9115, 9120, 7622, 9126, 9132, 9137, 9142, 9150, 9156, 9169, + 9177, 9184, 7628, 9190, 9198, 9206, 9213, 9226, 9238, 9248, 9255, 9262, + 9271, 9280, 9288, 9295, 9300, 9306, 7633, 9311, 9317, 7639, 9322, 9325, + 9332, 9338, 9351, 7120, 9362, 9368, 9377, 9385, 9392, 9398, 9404, 9409, + 9413, 9418, 8882, 9424, 7644, 9431, 9436, 9443, 9449, 9455, 9460, 9468, + 9476, 9483, 9487, 9501, 9511, 9516, 9520, 9531, 9537, 9542, 9547, 7649, + 7655, 9551, 9554, 9559, 9571, 9578, 9583, 9587, 9592, 9596, 9603, 9609, + 7660, 7567, 9616, 2822, 8, 9623, 9628, 9632, 9638, 9646, 9656, 9661, + 9666, 9673, 9680, 9684, 9695, 9705, 9714, 9726, 9731, 9735, 9743, 9757, + 9761, 9764, 9772, 9779, 9787, 9791, 9802, 9806, 9813, 9818, 9822, 9828, + 9833, 9837, 9843, 9848, 9859, 9863, 9866, 9872, 9877, 9883, 9889, 9896, + 9907, 9917, 9927, 9936, 9943, 7670, 7677, 7683, 7688, 9949, 9955, 7692, + 9961, 9964, 9971, 9976, 9991, 10007, 10022, 10030, 10036, 808, 411, + 10041, 10049, 10056, 10062, 10067, 10072, 7697, 10074, 10078, 10083, + 10087, 10097, 10102, 10106, 10115, 10119, 10122, 7706, 10129, 10132, + 10140, 10147, 10155, 10159, 10166, 10175, 10178, 10182, 10186, 10192, + 10196, 10200, 10204, 10210, 10220, 10224, 10232, 10236, 10243, 10247, + 10252, 10256, 10263, 10269, 10277, 10283, 10293, 10298, 10303, 10307, + 10315, 3835, 10323, 10328, 7711, 10332, 10336, 10339, 10347, 10354, + 10358, 4486, 10362, 10367, 10371, 10382, 10387, 10393, 10397, 10400, + 10408, 10413, 10418, 10425, 10430, 7716, 10435, 10439, 1686, 4640, 10446, + 10451, 10456, 10461, 10467, 10472, 10478, 10483, 10488, 10493, 10498, + 10503, 10508, 10513, 10518, 10523, 10528, 10533, 10538, 10543, 10548, + 10553, 10558, 10564, 10569, 10574, 10579, 10584, 10589, 10595, 10600, + 10605, 10611, 10616, 10622, 10627, 10633, 10638, 10643, 10648, 10653, + 10659, 10664, 10669, 10674, 729, 139, 10682, 10686, 10691, 10696, 10700, + 10704, 10708, 10713, 10717, 10722, 10726, 10729, 10733, 10737, 10742, + 10752, 10758, 10766, 10770, 10774, 10781, 10789, 10798, 10809, 10816, + 10823, 10832, 10841, 10849, 10858, 10867, 10876, 10885, 10895, 10905, + 10915, 10925, 10935, 10944, 10954, 10964, 10974, 10984, 10994, 11004, + 11014, 11023, 11033, 11043, 11053, 11063, 11073, 11083, 11092, 11102, + 11112, 11122, 11132, 11142, 11152, 11162, 11172, 11182, 11191, 11201, + 11211, 11221, 11231, 11241, 11251, 11261, 11271, 11281, 11291, 11300, + 11306, 11310, 11313, 11317, 11322, 11329, 11335, 11340, 11344, 11349, + 11358, 11366, 11371, 11375, 11379, 11385, 11390, 11396, 7725, 11401, + 11406, 11415, 7730, 11420, 11423, 11429, 11437, 7735, 11444, 11448, + 11452, 11456, 11466, 11472, 11477, 11486, 11494, 11501, 11508, 11513, + 11520, 11525, 11529, 11532, 11543, 11553, 11562, 11570, 11581, 11593, + 11603, 11608, 11612, 11617, 11622, 11626, 11632, 11640, 11647, 11658, + 11663, 11673, 11682, 11686, 11689, 11696, 11706, 11715, 11722, 11726, + 11733, 11739, 11744, 11749, 11753, 11762, 11767, 11773, 11777, 11782, + 11786, 11795, 11803, 11811, 11818, 11826, 11838, 11849, 11859, 11866, + 11872, 11881, 11892, 11901, 11913, 11925, 11937, 11947, 11956, 11965, + 11973, 11980, 11989, 11997, 12003, 12009, 12014, 6228, 12018, 12020, + 12025, 12031, 12040, 12048, 12055, 12064, 12073, 12082, 12091, 12100, + 12109, 12118, 12127, 12137, 12147, 12156, 12162, 12169, 12183, 12190, + 12198, 12207, 12213, 12222, 12231, 12242, 12252, 12260, 12267, 12275, + 12284, 12297, 12305, 12312, 12325, 12331, 12337, 12347, 12356, 12365, + 12370, 12374, 12380, 12386, 12393, 7411, 12398, 12403, 12410, 12415, + 12420, 12424, 12432, 12438, 12443, 12451, 12459, 12466, 12474, 12480, + 12488, 12496, 12501, 12507, 12514, 12520, 12525, 12529, 12540, 12548, + 12554, 12559, 12568, 12574, 12579, 12588, 12602, 3794, 12606, 12611, + 12616, 12622, 12627, 12632, 12636, 12641, 12646, 12651, 6227, 12656, + 12661, 12666, 12671, 12676, 12680, 12685, 12690, 12695, 12700, 12706, + 12712, 12717, 12721, 12726, 12731, 12736, 7739, 12741, 12746, 12751, + 12756, 12761, 12778, 12796, 12808, 12821, 12838, 12854, 12871, 12881, + 12900, 12911, 12922, 12933, 12944, 12956, 12967, 12978, 12995, 13006, + 13017, 13022, 13027, 2340, 13031, 13034, 13040, 13048, 13056, 13061, + 13069, 13077, 13084, 13089, 13095, 13102, 13110, 13117, 13129, 13137, + 13142, 9985, 13148, 13157, 13166, 13174, 13181, 13187, 13195, 13202, + 13208, 13215, 13221, 13230, 13238, 13248, 13255, 13261, 13269, 13275, + 13283, 13290, 13303, 13310, 13319, 13328, 13337, 13345, 13355, 13362, + 13367, 3508, 13374, 13379, 13382, 12657, 13386, 13392, 13396, 13404, + 13416, 13421, 13428, 13434, 13439, 13446, 12662, 13450, 13454, 12667, + 13458, 12672, 13462, 13469, 13474, 13478, 13482, 13490, 13497, 13504, + 13521, 13530, 13534, 13537, 13545, 13551, 13556, 3586, 13560, 13562, + 13570, 13577, 13587, 13599, 13604, 13610, 13615, 13619, 13625, 13630, + 13636, 13639, 13646, 13654, 13661, 13667, 13673, 13678, 13685, 13691, + 13696, 13703, 13707, 13713, 13717, 13724, 13730, 13736, 13744, 13750, + 13755, 13761, 13769, 13777, 13783, 13789, 13794, 13801, 13806, 13810, + 13816, 13821, 13828, 13833, 13839, 13842, 13848, 13854, 13857, 13861, + 13873, 13879, 13884, 13891, 13897, 13903, 13914, 13924, 13933, 13941, + 13948, 13959, 13969, 13979, 13987, 13990, 12686, 13995, 14000, 12691, + 12826, 14008, 14021, 14036, 14047, 12843, 14065, 14078, 14091, 14102, + 8897, 14113, 14126, 14145, 14156, 14167, 14178, 2608, 14191, 14195, + 14203, 14214, 14221, 14227, 14235, 14239, 14245, 14248, 14258, 14266, + 14273, 14281, 14291, 14296, 14303, 14308, 14315, 14326, 14336, 14342, + 14347, 14352, 12696, 14356, 14362, 14368, 14373, 14378, 14383, 14387, + 12701, 12707, 14391, 12713, 14396, 14404, 14413, 14420, 7588, 14424, + 14426, 14431, 14436, 14442, 14447, 14452, 14457, 14462, 14466, 14472, + 14478, 14483, 14489, 14494, 14499, 14505, 14510, 14515, 14520, 14525, + 14531, 14536, 14541, 14547, 14553, 14558, 14563, 14570, 14576, 14587, + 14594, 14599, 14603, 14607, 14610, 14618, 14623, 14630, 14637, 14643, + 14648, 14653, 14660, 14670, 14675, 14682, 14688, 14698, 14708, 14722, + 14736, 14750, 14764, 14779, 14794, 14811, 14829, 14842, 14848, 14853, + 14858, 14862, 14867, 14875, 14881, 14886, 14891, 14895, 14900, 14904, + 14909, 14913, 14924, 14930, 14935, 14940, 14947, 14952, 14956, 14961, + 14966, 14972, 14979, 14985, 14990, 14994, 15000, 15005, 15010, 15014, + 15020, 15025, 15030, 15037, 15042, 11468, 15046, 15051, 15055, 15060, + 15066, 15072, 15079, 15089, 15097, 15104, 15109, 15113, 15122, 15130, + 15137, 15144, 15150, 15156, 15161, 15166, 15172, 15177, 15183, 15188, + 15194, 15200, 15207, 15213, 15218, 15223, 7781, 15232, 15235, 15241, + 15246, 15251, 15261, 15268, 15274, 15279, 15284, 15290, 15295, 15301, + 15306, 15312, 15318, 15323, 15331, 15338, 15343, 15348, 15354, 15359, + 15363, 15372, 15383, 15390, 15395, 15403, 15409, 15416, 15422, 15427, + 15431, 15437, 15442, 15447, 15452, 7786, 6252, 2836, 15456, 15460, 15464, + 15468, 15472, 15475, 15482, 15490, 12727, 15497, 15507, 15515, 15522, + 15530, 15540, 15549, 15562, 15567, 15572, 15580, 15587, 11558, 11567, + 15594, 15604, 15619, 15625, 15632, 15639, 15645, 15655, 15665, 12732, + 15674, 15680, 15686, 15694, 15702, 15707, 15716, 15724, 15736, 15746, + 15756, 15766, 15775, 15787, 15797, 15807, 15818, 15823, 15835, 15847, + 15859, 15871, 15883, 15895, 15907, 15919, 15931, 15943, 15954, 15966, + 15978, 15990, 16002, 16014, 16026, 16038, 16050, 16062, 16074, 16085, + 16097, 16109, 16121, 16133, 16145, 16157, 16169, 16181, 16193, 16205, + 16216, 16228, 16240, 16252, 16264, 16276, 16288, 16300, 16312, 16324, + 16336, 16347, 16359, 16371, 16383, 16395, 16407, 16419, 16431, 16443, + 16455, 16467, 16478, 16490, 16502, 16514, 16526, 16538, 16550, 16562, + 16574, 16586, 16598, 16609, 16621, 16633, 16645, 16657, 16669, 16681, + 16693, 16705, 16717, 16729, 16740, 16752, 16764, 16776, 16788, 16801, + 16814, 16827, 16840, 16853, 16866, 16879, 16891, 16904, 16917, 16930, + 16943, 16956, 16969, 16982, 16995, 17008, 17021, 17033, 17046, 17059, + 17072, 17085, 17098, 17111, 17124, 17137, 17150, 17163, 17175, 17188, + 17201, 17214, 17227, 17240, 17253, 17266, 17279, 17292, 17305, 17317, + 17330, 17343, 17356, 17369, 17382, 17395, 17408, 17421, 17434, 17447, + 17459, 17472, 17485, 17498, 17511, 17524, 17537, 17550, 17563, 17576, + 17589, 17601, 17612, 17625, 17638, 17651, 17664, 17677, 17690, 17703, + 17716, 17729, 17742, 17754, 17767, 17780, 17793, 17806, 17819, 17832, + 17845, 17858, 17871, 17884, 17896, 17909, 17922, 17935, 17948, 17961, + 17974, 17987, 18000, 18013, 18026, 18038, 18051, 18064, 18077, 18090, + 18103, 18116, 18129, 18142, 18155, 18168, 18180, 18193, 18206, 18219, + 18232, 18245, 18258, 18271, 18284, 18297, 18310, 18322, 18335, 18348, + 18361, 18374, 18387, 18400, 18413, 18426, 18439, 18452, 18464, 18477, + 18490, 18503, 18516, 18529, 18542, 18555, 18568, 18581, 18594, 18606, + 18619, 18632, 18645, 18658, 18671, 18684, 18697, 18710, 18723, 18736, + 18748, 18761, 18774, 18787, 18800, 18813, 18826, 18839, 18852, 18865, + 18878, 18890, 18903, 18916, 18929, 18942, 18955, 18968, 18981, 18994, + 19007, 19020, 19032, 19043, 19051, 19058, 19064, 19068, 19074, 19080, + 19088, 19094, 19099, 19103, 19112, 7593, 19123, 19130, 19138, 19145, + 19152, 9345, 19159, 19168, 19173, 19178, 6268, 19185, 19190, 19193, + 19198, 19206, 19213, 19220, 19227, 19233, 19242, 19251, 19257, 19266, + 19272, 19277, 19287, 19294, 19300, 19308, 19314, 19321, 19331, 19340, + 19344, 19351, 19355, 19360, 19366, 19374, 19378, 19388, 12742, 19397, + 19403, 19407, 19416, 12747, 19422, 19429, 19440, 19448, 19457, 7376, + 19465, 19470, 19476, 19481, 19485, 19489, 19493, 8072, 19498, 19506, + 19513, 19522, 19529, 19536, 9275, 19543, 19549, 19553, 19559, 19565, + 19573, 19579, 19586, 19592, 19598, 19607, 19611, 19619, 19628, 19635, + 19640, 19644, 19655, 19660, 19665, 19670, 19683, 6455, 19687, 19693, + 19701, 19705, 19712, 19721, 19726, 13018, 19734, 19746, 19751, 19755, + 19758, 19764, 19770, 19775, 19779, 19782, 19793, 19798, 7816, 19805, + 7604, 7821, 19810, 19815, 19820, 19825, 19830, 19835, 19840, 19845, + 19850, 19855, 19860, 19865, 19871, 19876, 19881, 19886, 19891, 19896, + 19901, 19906, 19911, 19916, 19922, 19928, 19933, 19938, 19943, 19948, + 19953, 19958, 19963, 19968, 19973, 19979, 19984, 19989, 19994, 20000, + 20006, 20011, 20016, 20021, 20026, 20031, 20036, 20041, 20046, 20052, + 20057, 20062, 20067, 20072, 20078, 20083, 20088, 20092, 129, 20100, + 20104, 20108, 20112, 20117, 20121, 20125, 10829, 20129, 20134, 20138, + 20143, 20147, 20152, 20156, 20162, 20167, 20171, 20175, 20183, 20187, + 20191, 20196, 20201, 20205, 20211, 20216, 20220, 20225, 20230, 20234, + 20241, 20248, 20255, 20259, 20263, 20268, 20272, 20275, 20281, 20294, + 20299, 20308, 20313, 7861, 20318, 20321, 2671, 2676, 20325, 20331, 20337, + 20342, 20347, 20352, 20358, 20363, 12238, 20368, 20373, 20378, 20383, + 20389, 20394, 20399, 20405, 20410, 20414, 20419, 20424, 20429, 20434, + 20438, 20443, 20447, 20452, 20457, 20462, 20467, 20471, 20476, 20480, + 20485, 20490, 20495, 20500, 2845, 20415, 20504, 20512, 20519, 8166, + 20531, 20539, 20420, 20546, 20551, 20559, 20425, 20564, 20569, 20577, + 20582, 20430, 20587, 20592, 20596, 20602, 20605, 20612, 20616, 20620, + 20626, 20633, 20638, 7403, 1691, 1696, 20642, 20648, 20654, 20659, 20663, + 20667, 20671, 20674, 20680, 20687, 20695, 20701, 20707, 20712, 20717, + 20721, 13112, 13965, 20726, 20738, 20741, 20748, 14639, 20755, 20763, + 20774, 20783, 20796, 20806, 20820, 20832, 20846, 20858, 20868, 20880, + 20886, 20901, 20925, 20943, 20962, 20975, 20989, 21007, 21023, 21040, + 21058, 21069, 21088, 21105, 21125, 21143, 21155, 21169, 21183, 21195, + 21212, 21231, 21249, 21261, 21279, 21298, 12886, 21311, 21331, 21343, + 8928, 21355, 21360, 21365, 21370, 21376, 21381, 21385, 21392, 2357, + 21396, 21402, 21406, 21409, 21413, 21421, 21427, 20448, 21431, 21440, + 21451, 21457, 21463, 21472, 21480, 21487, 21492, 21499, 21505, 21514, + 21522, 21529, 21539, 21548, 21558, 21563, 21572, 21581, 21592, 21603, + 3893, 21613, 21617, 21627, 21635, 21645, 21656, 21661, 21669, 21676, + 21682, 21687, 20458, 21691, 21700, 21704, 21707, 21712, 21719, 21728, + 21736, 21744, 21754, 21763, 21769, 21775, 20463, 20468, 21779, 21789, + 21799, 21809, 21817, 21824, 21834, 21842, 21850, 21856, 982, 21865, + 13073, 542, 21879, 21888, 21896, 21907, 21918, 21928, 21937, 21949, + 21958, 21967, 21973, 21982, 21991, 22001, 22009, 22017, 7793, 22023, + 22026, 22030, 22035, 22040, 8281, 20481, 20486, 22048, 22054, 22060, + 22065, 22070, 22074, 22082, 22088, 22094, 22098, 3480, 22106, 22111, + 22116, 22120, 22124, 8353, 22131, 22139, 22146, 22152, 8362, 8368, 22160, + 22168, 22175, 22180, 22185, 20491, 22191, 22202, 22207, 2560, 22212, + 22223, 22229, 22234, 22238, 22242, 22245, 22252, 22259, 22266, 22272, + 22276, 20496, 22281, 22285, 999, 22289, 22294, 22299, 22304, 22309, + 22314, 22319, 22324, 22329, 22334, 22339, 22344, 22349, 22354, 22360, + 22365, 22370, 22375, 22380, 22385, 22390, 22396, 22401, 22406, 22411, + 22416, 22421, 22426, 22431, 22437, 22443, 22448, 22454, 22459, 22464, 5, + 22470, 22474, 22478, 22482, 22487, 22491, 22495, 22499, 22503, 22508, + 22512, 22517, 22521, 22524, 22528, 22533, 22537, 22542, 22546, 22550, + 22554, 22559, 22563, 22567, 22577, 22582, 22586, 22590, 22595, 22600, + 22609, 22614, 22619, 22623, 22627, 22640, 22652, 22661, 22670, 22676, + 22681, 22685, 22689, 22699, 22708, 22716, 22722, 22727, 22731, 22738, + 22748, 22757, 22765, 22773, 22780, 22788, 22797, 22806, 22814, 22819, + 22823, 22827, 22830, 22832, 22836, 22840, 22845, 22850, 22854, 22858, + 22861, 22865, 22868, 22872, 22875, 22878, 22882, 22888, 22892, 22896, + 22900, 22905, 22910, 22915, 22919, 22922, 22927, 22933, 22938, 22944, + 22949, 22953, 22957, 22961, 22966, 22970, 22975, 22979, 22986, 22990, + 22993, 22997, 23003, 23009, 23013, 23017, 23022, 23029, 23035, 23039, + 23048, 23052, 23056, 23059, 23065, 23070, 23076, 1453, 1755, 23081, + 23086, 23091, 23096, 23101, 23106, 23111, 2107, 2153, 23116, 23119, + 23123, 23127, 23132, 23136, 23140, 23143, 23148, 23153, 23157, 23160, + 23165, 23169, 23174, 23178, 13085, 23183, 23186, 23189, 23193, 23198, + 23202, 23215, 23219, 23222, 23230, 23239, 23246, 23251, 23257, 23263, + 23270, 23277, 23281, 23285, 23289, 23294, 23299, 23303, 23311, 23316, + 23328, 23339, 23344, 23348, 23352, 23358, 23363, 23368, 23372, 23375, + 23381, 6375, 2275, 23385, 23390, 23406, 7908, 23426, 23435, 23451, 23455, + 23458, 23464, 23474, 23480, 23495, 23507, 23518, 23526, 23535, 23541, + 23550, 23560, 23571, 23582, 23591, 23600, 23608, 23615, 23623, 23636, + 23643, 23649, 23654, 23663, 23669, 23674, 23682, 21637, 23694, 23706, + 23720, 23728, 23735, 23747, 23756, 23765, 23773, 23781, 23789, 23796, + 23805, 23813, 23823, 23832, 23842, 23851, 23860, 23868, 23873, 23877, + 23880, 23884, 23888, 23892, 23896, 23900, 23906, 23912, 23920, 13130, + 23927, 23932, 23939, 23945, 23952, 13138, 23959, 23962, 23974, 23982, + 23988, 23993, 23997, 8311, 24008, 24018, 24027, 24034, 24038, 13143, + 24041, 24048, 24052, 24058, 24061, 24068, 24074, 24078, 24083, 24087, + 24096, 24103, 24109, 6416, 24116, 24124, 24131, 24137, 24142, 24148, + 24154, 24162, 24166, 24169, 24171, 23885, 24180, 24186, 24196, 24201, + 24208, 24214, 24219, 24224, 24229, 24234, 24241, 24250, 24257, 24266, + 24272, 24277, 24283, 24288, 24295, 24306, 24311, 24315, 24325, 24331, + 24335, 24340, 24350, 24359, 24363, 24370, 24378, 24385, 24391, 24396, + 24404, 24411, 24423, 24432, 24436, 11410, 24444, 24454, 24458, 23226, + 24469, 24474, 24478, 24485, 24492, 20207, 23810, 24497, 24501, 24504, + 21075, 24509, 24523, 24539, 24557, 24576, 24593, 24611, 21094, 24628, + 24648, 21111, 24660, 24672, 14052, 24684, 21131, 24698, 24710, 8941, + 24724, 24729, 24734, 24739, 24745, 24751, 24757, 24761, 24768, 24773, + 24783, 24789, 8594, 24795, 24797, 24802, 24810, 24814, 24237, 24820, + 24827, 9921, 9931, 24834, 24844, 24849, 24853, 24856, 24862, 24870, + 24882, 24892, 24908, 24921, 24935, 14070, 24949, 24956, 24960, 24963, + 24968, 24972, 24979, 24986, 24996, 25001, 25006, 25011, 25019, 25027, + 25036, 25041, 8005, 25045, 25048, 25051, 25056, 25063, 25068, 25084, + 25092, 25100, 7856, 25108, 25113, 25117, 25123, 25129, 25132, 25138, + 25150, 25158, 25165, 25171, 25178, 25189, 25203, 25216, 25225, 25237, + 25248, 25258, 25267, 25276, 25284, 25295, 6398, 25302, 25308, 25313, + 25319, 25326, 25336, 25346, 25355, 25361, 25368, 25373, 25380, 25388, + 25396, 25408, 4725, 25415, 25424, 25432, 25438, 25444, 25449, 25453, + 25456, 25462, 25469, 25474, 25479, 25483, 25495, 25506, 25515, 25523, + 13270, 25528, 25534, 25540, 9914, 7086, 25545, 25548, 25551, 25557, + 25565, 25573, 25577, 25581, 25586, 25589, 25598, 25602, 25610, 25621, + 25625, 25631, 25637, 25641, 25647, 25655, 25677, 25701, 25708, 25715, + 25721, 25727, 25732, 25743, 25761, 25768, 25776, 25780, 25789, 25802, + 25810, 25822, 25833, 25843, 25857, 25866, 25874, 25886, 7925, 25897, + 25908, 25920, 25930, 25939, 25944, 25948, 25956, 25966, 25971, 25975, + 25978, 25981, 25989, 25997, 26006, 26016, 26025, 26031, 26045, 2622, + 26067, 26078, 26087, 26097, 26109, 26118, 26128, 26136, 26144, 26153, + 26158, 26169, 26174, 26185, 26189, 26199, 26208, 26216, 26226, 26236, + 26244, 26253, 26260, 26268, 26275, 26284, 26288, 26296, 26303, 26311, + 26318, 26329, 26344, 26351, 26357, 26367, 26376, 26382, 26386, 26393, + 12360, 26399, 26403, 26408, 26412, 26416, 26424, 26432, 26438, 26447, + 26454, 26459, 26464, 26474, 21689, 26478, 26481, 26486, 26491, 26496, + 26501, 26506, 26511, 26516, 26521, 26527, 26532, 26537, 26543, 1224, 684, + 26548, 26557, 2323, 26564, 26569, 26573, 26579, 1257, 546, 338, 26584, + 26593, 26601, 26610, 26618, 26629, 26638, 26646, 26650, 26653, 26661, + 26669, 26674, 13098, 26680, 26686, 26692, 4367, 26697, 26701, 26707, + 26711, 26718, 1419, 26724, 8012, 26731, 26741, 26749, 26755, 26764, + 26772, 26778, 26786, 26793, 9507, 26799, 26806, 26813, 1460, 2106, 26819, + 26825, 26832, 26843, 26854, 26862, 26869, 26879, 26888, 26896, 26903, + 26910, 26923, 26934, 1262, 26953, 26958, 26966, 3523, 26970, 26975, + 26979, 1423, 22859, 26989, 26993, 26998, 27002, 3448, 27008, 27016, + 27023, 27034, 27042, 27050, 3524, 274, 27055, 27063, 27071, 27078, 27084, + 27089, 2175, 27096, 27102, 24079, 24301, 27108, 106, 27112, 27116, 27122, + 611, 7761, 27127, 27134, 27140, 2286, 27144, 27148, 27151, 27154, 27159, + 27166, 27172, 27177, 27185, 27192, 27198, 20584, 27202, 3594, 14902, + 27206, 27211, 27214, 27222, 27230, 27233, 27240, 27250, 27262, 27267, + 27271, 27279, 27286, 27292, 27299, 27306, 27309, 27313, 27317, 1427, + 27327, 27329, 27334, 27340, 27346, 27351, 27356, 27361, 27366, 27371, + 27376, 27381, 27386, 27391, 27396, 27401, 27406, 27411, 27416, 27422, + 27428, 27434, 27440, 27445, 27450, 27455, 27461, 27466, 27471, 27476, + 27482, 27487, 27493, 27498, 27503, 27508, 27513, 27519, 27524, 27530, + 27535, 27540, 27545, 27550, 27556, 27561, 27567, 27572, 27577, 27582, + 27587, 27592, 27597, 27602, 27607, 27612, 27618, 27624, 27630, 27635, + 27640, 27645, 27650, 27656, 27662, 27668, 27674, 27680, 27686, 27691, + 27697, 27702, 27707, 27712, 27717, 27723, 2402, 27728, 2409, 2416, 2713, + 27733, 2422, 2432, 27739, 27743, 27748, 27753, 27759, 27764, 27769, + 27773, 27778, 27784, 27789, 27794, 27799, 27805, 27810, 27814, 27818, + 27823, 27828, 27833, 27838, 27843, 27849, 27855, 27860, 27864, 27869, + 27875, 27879, 27884, 27889, 27894, 27899, 27903, 27906, 27911, 27916, + 27921, 27926, 27931, 27937, 27943, 27948, 27953, 27957, 27962, 27967, + 27972, 27977, 27982, 27986, 27991, 27996, 28001, 28005, 28009, 28013, + 28018, 28026, 28031, 28037, 28043, 28049, 28054, 28058, 28061, 28066, + 28070, 28075, 28079, 28084, 28088, 28091, 28096, 15575, 28101, 28106, + 28114, 19525, 26728, 7464, 28119, 28124, 28128, 28133, 28137, 28141, + 28146, 28150, 28153, 28156, 28160, 28165, 28169, 28177, 28181, 28184, + 28189, 28193, 28197, 28202, 28207, 28211, 28217, 28222, 28227, 28234, + 28241, 28245, 28248, 28254, 28263, 28270, 28278, 28285, 28289, 28294, + 28298, 28304, 28310, 28314, 28320, 28325, 28330, 28337, 28343, 28349, + 28355, 28361, 28368, 28374, 28380, 28386, 28392, 28398, 28404, 28410, + 28417, 28423, 28430, 28436, 28442, 28448, 28454, 28460, 28466, 28472, + 28478, 28484, 9815, 28490, 28495, 28500, 28503, 28511, 28516, 28525, + 28531, 28536, 28541, 28546, 28550, 28555, 28560, 28565, 28570, 28575, + 28582, 28589, 28595, 28601, 28606, 14580, 28613, 28619, 28626, 28632, + 28638, 28643, 28651, 28656, 14359, 28660, 28665, 28670, 28676, 28681, + 28686, 28690, 28695, 28700, 28706, 28711, 28716, 28720, 28725, 28730, + 28734, 28739, 28744, 28749, 28753, 28758, 28763, 28768, 28772, 28776, + 13600, 28780, 28789, 28795, 28801, 28810, 28818, 28827, 28835, 28840, + 28844, 28851, 28857, 28861, 28864, 28869, 28878, 28886, 28891, 1459, + 28897, 28900, 28904, 20649, 20655, 28910, 28914, 28925, 28936, 28947, + 28959, 28966, 28973, 28978, 28982, 4404, 747, 19524, 28990, 28995, 28999, + 29004, 29008, 29014, 29019, 29025, 29030, 29036, 29041, 29047, 29052, + 29058, 29064, 29070, 29075, 29031, 29037, 29079, 29085, 29090, 29096, + 29101, 29107, 29112, 29042, 8826, 29053, 29059, 29065, 2790, 3378, 29116, + 29119, 29125, 29131, 29137, 29144, 29150, 29156, 29162, 29168, 29174, + 29180, 29186, 29192, 29198, 29204, 29210, 29216, 29223, 29229, 29235, + 29241, 29247, 29253, 29258, 29261, 29268, 29276, 29281, 29286, 29292, + 29297, 29302, 29306, 29311, 29317, 29322, 29328, 29333, 29339, 29344, + 29350, 29356, 29360, 29365, 29370, 29375, 29380, 29384, 29389, 29394, + 29399, 29405, 29411, 29417, 29423, 29428, 29432, 29435, 29441, 29447, + 29456, 29464, 29471, 29476, 29480, 29484, 29489, 13464, 29494, 29502, + 29508, 3624, 29513, 29516, 29520, 6465, 29526, 29532, 29539, 6474, 29543, + 29549, 29556, 29562, 29571, 29579, 29591, 29595, 29602, 29608, 29612, + 29615, 29624, 29632, 29032, 29637, 29647, 29657, 29667, 29673, 29678, + 29688, 29693, 29706, 29720, 29731, 29743, 29755, 29769, 29782, 29794, + 29806, 12927, 29820, 29825, 29830, 29834, 29838, 29842, 1744, 25246, + 29846, 29851, 29856, 29860, 29863, 29868, 29873, 29878, 29884, 29890, + 8523, 29895, 29902, 14004, 29908, 29913, 29918, 29922, 29927, 29932, + 29080, 29937, 29942, 29947, 29953, 29086, 29958, 29961, 29968, 29976, + 29982, 29988, 29994, 30005, 30010, 30017, 30024, 30031, 30039, 30048, + 30057, 30063, 30069, 30077, 29091, 30082, 30088, 30094, 29097, 30099, + 30107, 30115, 30121, 30128, 30134, 30141, 30148, 30154, 30162, 30172, + 30179, 30184, 30190, 30195, 30200, 30207, 30216, 30224, 30229, 30235, + 30242, 30250, 30256, 30261, 30267, 30276, 26011, 30283, 30287, 30292, + 30301, 30306, 30311, 30316, 10762, 30324, 30329, 30334, 30339, 30343, + 30348, 30353, 30360, 30365, 30370, 29102, 29108, 30376, 2478, 244, 30379, + 30382, 30386, 30390, 30400, 30408, 30412, 30419, 30426, 30430, 30433, + 30439, 30447, 30455, 30459, 30463, 30466, 30473, 30477, 30484, 30492, + 29043, 30499, 30507, 689, 302, 30519, 30524, 30529, 30535, 30540, 30545, + 3645, 30550, 30553, 30558, 30563, 30568, 30573, 30578, 30585, 20734, + 30590, 30595, 30600, 30605, 30610, 30616, 30621, 30627, 29264, 30633, + 30638, 30644, 30650, 30660, 30665, 30670, 30674, 30679, 30684, 30689, + 30694, 30707, 30712, 20535, 14982, 3651, 30716, 30721, 30726, 30732, + 30737, 30742, 30746, 30751, 30756, 30762, 30767, 30772, 30776, 30781, + 30786, 30791, 30795, 30800, 30805, 30810, 30816, 30822, 30827, 30831, + 30836, 30841, 30846, 30850, 30858, 30862, 30868, 30872, 30879, 14775, + 29054, 30885, 30892, 30900, 30907, 30913, 30925, 30931, 30935, 2732, + 30939, 30943, 30468, 30952, 30963, 30968, 30973, 30978, 30982, 30987, + 20660, 30991, 30996, 29060, 19545, 31000, 31005, 31011, 31016, 31020, + 31024, 31027, 31031, 31037, 31048, 31060, 29066, 31065, 31068, 347, + 31072, 31077, 31082, 31087, 31092, 31097, 31103, 31108, 31113, 31119, + 31124, 31130, 31135, 31141, 31146, 31151, 31156, 31161, 31166, 31171, + 31176, 31181, 31187, 31192, 31197, 31202, 31207, 31212, 31217, 31222, + 31228, 31234, 31239, 31244, 31249, 31254, 31259, 31264, 31269, 31274, + 31279, 31284, 31289, 31294, 31299, 31304, 31309, 31314, 31319, 31324, + 31330, 26, 31335, 31339, 31343, 31351, 31355, 31359, 31362, 31365, 31367, + 31372, 31376, 31381, 31385, 31390, 31394, 31399, 31403, 31406, 31408, + 31413, 31417, 31428, 31431, 31433, 31437, 31449, 31458, 31462, 31466, + 31472, 31477, 31486, 31492, 31497, 31502, 31506, 31511, 31518, 31523, + 31529, 31534, 31538, 31545, 23818, 23828, 31549, 31554, 31559, 31564, + 31571, 31575, 31582, 6573, 31588, 31597, 31605, 31620, 31634, 31642, + 31653, 31662, 31667, 5706, 31677, 31682, 31687, 31691, 31694, 31698, + 31703, 31707, 31714, 31719, 31724, 7357, 31734, 31736, 31739, 31743, + 31749, 31753, 31758, 31763, 31769, 31774, 31780, 31785, 31795, 31804, + 31812, 31817, 31823, 31828, 31835, 31839, 31847, 31854, 31867, 31875, + 31879, 31889, 31894, 31898, 31906, 31914, 31918, 31927, 31933, 31938, + 31946, 31956, 31965, 31974, 31983, 31994, 32002, 32013, 32022, 32029, + 32035, 32040, 32051, 32056, 32060, 32063, 32067, 32075, 32081, 32089, + 32096, 32102, 32107, 32113, 2377, 32117, 32119, 32124, 32129, 32132, + 32134, 32138, 32141, 32148, 32152, 32156, 32159, 32165, 32175, 32180, + 32186, 32190, 32195, 32208, 24191, 32214, 32223, 15740, 32230, 32239, + 29653, 32247, 32252, 32256, 32264, 32271, 32276, 32280, 32285, 32289, + 32297, 32303, 32309, 32314, 32318, 32321, 32326, 32339, 32355, 21201, + 32372, 32384, 32401, 32413, 32427, 21218, 21237, 32439, 32451, 2639, + 32465, 32470, 32475, 32480, 32484, 32491, 32503, 32509, 32512, 32523, + 32534, 30074, 675, 32539, 32543, 32546, 32551, 32556, 32562, 32567, + 32572, 32578, 32584, 32589, 32593, 32598, 32603, 32608, 32612, 32615, + 32621, 32626, 32631, 32636, 32640, 32645, 32651, 32659, 24416, 32664, + 32669, 32676, 32682, 32688, 32693, 32701, 20743, 32708, 32713, 32718, + 32723, 32727, 32730, 32735, 32739, 32743, 32750, 32756, 32762, 32768, + 32775, 32780, 32786, 31909, 32790, 32794, 32799, 32812, 32817, 32823, + 32831, 32838, 32846, 32856, 32862, 32868, 32874, 32878, 32887, 32892, + 32897, 8849, 32902, 32909, 32915, 32925, 32930, 32936, 32944, 3556, + 32951, 32958, 3562, 32962, 32967, 32978, 32985, 32991, 33000, 33004, + 3945, 33007, 33014, 33020, 33026, 33034, 33044, 27079, 33051, 33059, + 33065, 33070, 33076, 33081, 33087, 33091, 33098, 33104, 33113, 24211, + 33120, 33125, 33129, 33137, 33145, 8040, 4390, 33152, 33156, 33160, + 33165, 33171, 33176, 33181, 33188, 30581, 33194, 33199, 33203, 33208, + 33212, 33221, 33225, 33231, 33238, 33244, 33251, 33256, 33265, 33270, + 33274, 33279, 33286, 33294, 33302, 33307, 19594, 33311, 33314, 33318, + 33322, 33326, 33329, 33331, 33336, 33344, 33348, 33355, 33359, 33363, + 33371, 33378, 33388, 33392, 33396, 33404, 33412, 33418, 33423, 33432, + 11717, 33438, 33447, 33452, 33459, 33467, 33475, 33483, 33490, 33497, + 33504, 33511, 33518, 33523, 33529, 33546, 33554, 33564, 33572, 33579, + 390, 33583, 33589, 33593, 33598, 31658, 33604, 33607, 33611, 33619, 3567, + 33627, 33633, 33639, 33648, 33658, 33665, 33671, 3573, 3579, 33680, + 33687, 33695, 33700, 33704, 33711, 33719, 33726, 33732, 33741, 33751, + 33757, 33765, 33774, 33781, 33789, 33796, 20265, 33800, 33807, 33813, + 33823, 33832, 33843, 33847, 33857, 33863, 33870, 33878, 33887, 33896, + 33906, 33917, 33924, 33929, 33936, 2980, 33944, 33950, 33955, 33961, + 33967, 33972, 33985, 33998, 34011, 34018, 34024, 34032, 34037, 34041, + 1433, 34045, 34050, 34055, 34060, 34065, 34071, 34076, 34081, 34086, + 34091, 34096, 34101, 34106, 34112, 34118, 34123, 34128, 34134, 34139, + 34144, 34149, 34155, 34160, 34165, 34170, 34175, 34181, 34186, 34191, + 34197, 34202, 34207, 34212, 34217, 34222, 34228, 34233, 34239, 34244, + 34250, 34255, 34260, 34265, 34271, 34277, 34283, 34289, 34295, 34301, + 34307, 34313, 34318, 34323, 34329, 34334, 34339, 34344, 34349, 34354, + 34359, 34364, 34370, 34375, 34380, 34386, 34392, 101, 34397, 34399, + 34403, 34407, 34411, 34416, 34420, 7961, 34424, 34430, 4759, 34436, + 34439, 34444, 34448, 34453, 34457, 34461, 34466, 8656, 34470, 34474, + 34478, 34482, 13692, 34487, 34491, 34496, 34501, 34506, 34510, 34517, + 24215, 34523, 34526, 34530, 34535, 34541, 34545, 34553, 34559, 34564, + 34568, 34574, 34578, 34582, 3417, 3422, 27265, 34585, 34593, 34600, + 34604, 34611, 34616, 337, 34621, 34625, 34631, 34643, 34649, 34655, + 34659, 34665, 34674, 34678, 34682, 34687, 34692, 34697, 34701, 34705, + 34712, 34718, 34723, 34738, 34753, 34768, 34784, 34802, 8606, 34816, + 34823, 34827, 34830, 34839, 34844, 34848, 34856, 31860, 34864, 34868, + 34878, 27235, 34889, 34893, 34902, 34910, 8218, 13236, 34914, 34917, + 34920, 28173, 34925, 8217, 34930, 34936, 34941, 34947, 34952, 34958, + 34963, 34969, 34974, 34980, 34986, 34992, 34997, 34953, 34959, 34964, + 34970, 34975, 34981, 34987, 6586, 3815, 35001, 35009, 35013, 35016, + 35020, 35025, 35030, 35036, 35042, 35047, 35051, 24063, 35055, 35059, + 35065, 35069, 7487, 35078, 35085, 35089, 10258, 35096, 35102, 35107, + 35114, 35121, 35128, 26605, 6509, 35135, 35142, 35149, 35155, 35160, + 35167, 35178, 35184, 35189, 35194, 35199, 35206, 34954, 35210, 35220, + 35231, 35237, 35242, 35247, 35252, 35257, 35262, 35266, 35270, 35276, + 35284, 2278, 835, 8678, 8683, 8689, 35293, 8694, 8699, 8705, 35298, + 35308, 35312, 8710, 35317, 35320, 35325, 35329, 35334, 35339, 35346, + 35353, 35361, 8619, 35368, 35371, 35377, 35387, 4424, 35396, 35400, + 35408, 35412, 35422, 35428, 35439, 35445, 35451, 35456, 35462, 35468, + 35474, 35479, 35482, 35489, 35495, 35500, 35507, 35514, 35518, 35528, + 35541, 35550, 35559, 35570, 35583, 35594, 35603, 35614, 35619, 35628, + 35633, 8715, 35639, 35646, 35654, 35659, 35663, 35670, 35677, 3770, 16, + 35681, 35686, 15034, 35690, 35693, 35696, 26122, 35700, 26614, 35708, + 35712, 35716, 35719, 35725, 34976, 35731, 35739, 35745, 35752, 26114, + 35756, 26299, 35760, 35769, 35775, 35781, 35786, 35790, 35796, 35800, + 35808, 35816, 24273, 35822, 35829, 35835, 35840, 35845, 35849, 35855, + 35860, 35866, 3986, 769, 35873, 35877, 35880, 13582, 35892, 33770, 35903, + 35906, 35913, 35919, 35923, 35929, 35934, 35940, 35945, 35950, 35954, + 35958, 35963, 35968, 35978, 35984, 35997, 36003, 36010, 36015, 36021, + 36026, 14920, 1436, 1022, 29199, 29205, 36031, 29211, 29224, 29230, + 29236, 36037, 29242, 29248, 36043, 36049, 22, 36057, 36064, 36068, 36072, + 36080, 29963, 36084, 36088, 36095, 36100, 36104, 36109, 36115, 36120, + 36126, 36131, 36135, 36139, 36143, 36148, 36152, 36157, 36161, 36168, + 36173, 36177, 36182, 36186, 36191, 36195, 36200, 36206, 13802, 13807, + 36211, 36215, 36218, 36222, 19436, 36227, 36231, 36237, 36244, 36249, + 36259, 36264, 36272, 36276, 36279, 29978, 36283, 4039, 36288, 36293, + 36297, 36302, 36306, 36311, 11735, 36322, 36326, 36329, 36334, 36338, + 36342, 36345, 36349, 6605, 11751, 36352, 36355, 36361, 36366, 36372, + 36377, 36383, 36388, 36394, 36399, 36405, 36411, 36417, 36422, 36426, + 36430, 36439, 36455, 36471, 36481, 26021, 36488, 36492, 36497, 36502, + 36506, 36510, 33891, 36516, 36521, 36525, 36532, 36537, 36541, 36545, + 25075, 36551, 19689, 36556, 36563, 36571, 36577, 36584, 36592, 36598, + 36602, 36608, 36616, 36620, 36629, 7942, 36637, 36641, 36649, 36656, + 36661, 36666, 36670, 36673, 36677, 36680, 36684, 36691, 36696, 36702, + 24494, 29259, 36706, 36713, 36719, 36725, 36730, 36733, 36735, 36742, + 36749, 36755, 36759, 36762, 36766, 36770, 36774, 36779, 36783, 36787, + 36790, 36794, 36808, 21267, 36827, 36840, 36853, 36866, 21285, 36881, + 8902, 36896, 36902, 36906, 36910, 36917, 36922, 36926, 36933, 36939, + 36944, 36950, 36960, 36972, 36983, 36988, 36995, 36999, 37003, 37006, + 14198, 3618, 37014, 13829, 37027, 37034, 37038, 37042, 37047, 37052, + 37058, 37062, 37066, 37069, 6217, 13840, 37074, 37078, 37084, 37093, + 37098, 33747, 37104, 37109, 37113, 37118, 37125, 37129, 37132, 37137, + 12892, 37144, 37151, 1035, 37155, 37160, 37165, 37171, 37176, 37181, + 37185, 37195, 37200, 37206, 37211, 37217, 37222, 37228, 37238, 37243, + 37248, 37252, 5708, 5720, 37257, 37260, 37267, 37273, 32025, 32032, + 37282, 37286, 30026, 37294, 37305, 37313, 33939, 37320, 37325, 37330, + 37341, 37348, 37359, 30050, 19695, 37367, 727, 37372, 37378, 26105, + 37384, 37389, 37399, 37408, 37415, 37421, 37425, 37428, 37435, 37441, + 37448, 37454, 37464, 37472, 37478, 37484, 37489, 37493, 37500, 37506, + 37513, 36775, 535, 12160, 37519, 37524, 37527, 37533, 37541, 1365, 37546, + 37550, 37555, 37562, 37568, 37572, 37576, 37581, 37590, 37597, 37607, + 37613, 26140, 37630, 37639, 37647, 37653, 37658, 37665, 37671, 37679, + 37688, 37696, 37700, 37705, 37713, 30059, 37719, 37738, 14131, 37752, + 37768, 37782, 37788, 37793, 37798, 37803, 37809, 30065, 37814, 37821, + 37826, 37830, 345, 2887, 37837, 37842, 37847, 25392, 37668, 37851, 37856, + 37864, 37868, 37871, 37877, 37883, 37887, 26195, 37890, 37895, 37899, + 37902, 37907, 37911, 37916, 37921, 37925, 37930, 37934, 37938, 19432, + 19443, 37942, 37947, 37953, 25032, 37958, 37962, 19511, 14349, 37965, + 37970, 37975, 37980, 37985, 37990, 37995, 38000, 450, 43, 29277, 29282, + 29287, 29293, 29298, 29303, 38005, 29307, 38009, 38013, 29312, 29318, + 38017, 29329, 29334, 38025, 38030, 29340, 38035, 38040, 38045, 38050, + 38056, 38062, 38068, 29357, 38081, 38087, 29361, 38091, 29366, 38096, + 29371, 29376, 38099, 38104, 38108, 28940, 38114, 11959, 38121, 38126, + 29381, 38130, 38135, 38140, 38145, 38149, 38154, 38159, 38165, 38170, + 38175, 38181, 38187, 38192, 38196, 38201, 38206, 38211, 38215, 38220, + 38225, 38230, 38236, 38242, 38248, 38253, 38257, 38262, 38266, 29385, + 29390, 29395, 38270, 38274, 38278, 29400, 29406, 29412, 29424, 38290, + 24100, 38294, 38298, 38303, 38308, 38313, 38317, 38321, 38331, 38336, + 38341, 38345, 38349, 38352, 38360, 29472, 38365, 1443, 38371, 38379, + 38388, 38392, 38396, 38404, 38410, 38418, 38434, 38438, 38443, 38458, + 29509, 1713, 10423, 38462, 2933, 38474, 38475, 38483, 38490, 38495, + 38502, 38507, 7812, 1105, 8737, 38514, 38519, 38522, 38525, 38534, 1276, + 38539, 36923, 38546, 38551, 20708, 2516, 38555, 9146, 38565, 38571, 2296, + 2306, 38580, 38589, 38599, 38610, 3248, 32176, 8789, 3748, 14958, 1281, + 38615, 38623, 38630, 38635, 38639, 38643, 22051, 8816, 38651, 38660, + 38669, 38677, 38684, 38689, 38702, 38715, 38727, 38739, 38751, 38764, + 38775, 38786, 38796, 38804, 38812, 38824, 38836, 38847, 38856, 38864, + 38871, 38883, 38890, 38899, 38906, 38919, 38924, 38934, 38939, 38945, + 38950, 35086, 38954, 38961, 38965, 38972, 38980, 2477, 38987, 38998, + 39008, 39017, 39025, 39035, 39043, 39053, 39062, 39067, 39073, 39079, + 39090, 39100, 39109, 39118, 39128, 39136, 39145, 39150, 39155, 39160, + 1669, 37, 39168, 39176, 39187, 39198, 14633, 39208, 39215, 39221, 39226, + 39230, 39241, 39251, 39260, 39271, 15007, 15012, 39276, 39285, 39290, + 39300, 39305, 39313, 39321, 39328, 39334, 5557, 228, 39338, 39344, 39349, + 39352, 2076, 37039, 39360, 39364, 39367, 1476, 39373, 12309, 1286, 39378, + 39391, 39405, 2602, 39423, 39435, 39447, 2616, 2633, 39461, 39474, 2648, + 39488, 39500, 2663, 39514, 1292, 1298, 1304, 9064, 39519, 39524, 39529, + 39533, 39548, 39563, 39578, 39593, 39608, 39623, 39638, 39653, 39668, + 39683, 39698, 39713, 39728, 39743, 39758, 39773, 39788, 39803, 39818, + 39833, 39848, 39863, 39878, 39893, 39908, 39923, 39938, 39953, 39968, + 39983, 39998, 40013, 40028, 40043, 40058, 40073, 40088, 40103, 40118, + 40133, 40148, 40163, 40178, 40193, 40208, 40223, 40238, 40253, 40268, + 40283, 40298, 40313, 40328, 40343, 40358, 40373, 40388, 40403, 40418, + 40433, 40448, 40463, 40478, 40493, 40508, 40523, 40538, 40553, 40568, + 40583, 40598, 40613, 40628, 40643, 40658, 40673, 40688, 40703, 40718, + 40733, 40748, 40763, 40778, 40793, 40808, 40823, 40838, 40853, 40868, + 40883, 40898, 40913, 40928, 40943, 40958, 40973, 40988, 41003, 41018, + 41033, 41048, 41063, 41078, 41093, 41108, 41123, 41138, 41153, 41168, + 41183, 41198, 41213, 41228, 41243, 41258, 41273, 41288, 41303, 41318, + 41333, 41348, 41363, 41378, 41393, 41408, 41423, 41438, 41453, 41468, + 41483, 41498, 41513, 41528, 41543, 41558, 41573, 41588, 41603, 41618, + 41633, 41648, 41663, 41678, 41693, 41708, 41723, 41738, 41753, 41768, + 41783, 41798, 41813, 41828, 41843, 41858, 41873, 41888, 41903, 41918, + 41933, 41948, 41963, 41978, 41993, 42008, 42023, 42038, 42053, 42068, + 42083, 42098, 42113, 42128, 42143, 42158, 42173, 42188, 42203, 42218, + 42233, 42248, 42263, 42278, 42293, 42308, 42323, 42338, 42353, 42368, + 42383, 42398, 42413, 42428, 42443, 42458, 42473, 42488, 42503, 42518, + 42533, 42548, 42563, 42578, 42593, 42608, 42623, 42638, 42653, 42668, + 42683, 42698, 42713, 42728, 42743, 42758, 42773, 42788, 42803, 42818, + 42833, 42848, 42863, 42878, 42893, 42908, 42923, 42938, 42953, 42968, + 42983, 42998, 43013, 43028, 43043, 43058, 43073, 43088, 43103, 43118, + 43133, 43148, 43163, 43178, 43193, 43208, 43223, 43238, 43253, 43268, + 43283, 43298, 43313, 43328, 43343, 43358, 43373, 43388, 43403, 43418, + 43433, 43448, 43463, 43478, 43493, 43508, 43523, 43538, 43553, 43568, + 43583, 43598, 43613, 43628, 43643, 43658, 43673, 43688, 43703, 43718, + 43733, 43748, 43763, 43778, 43793, 43808, 43823, 43838, 43853, 43868, + 43883, 43898, 43913, 43928, 43943, 43958, 43973, 43988, 44003, 44018, + 44033, 44048, 44063, 44078, 44093, 44108, 44123, 44138, 44153, 44168, + 44183, 44198, 44213, 44228, 44243, 44258, 44273, 44288, 44303, 44318, + 44333, 44348, 44363, 44378, 44393, 44408, 44423, 44438, 44453, 44468, + 44483, 44498, 44513, 44528, 44543, 44558, 44573, 44588, 44603, 44618, + 44633, 44648, 44663, 44678, 44693, 44708, 44723, 44738, 44753, 44768, + 44783, 44798, 44813, 44828, 44843, 44858, 44873, 44888, 44903, 44918, + 44933, 44948, 44963, 44978, 44993, 45008, 45023, 45038, 45053, 45068, + 45083, 45098, 45113, 45128, 45143, 45158, 45173, 45188, 45203, 45218, + 45233, 45248, 45263, 45278, 45293, 45308, 45323, 45338, 45353, 45368, + 45383, 45398, 45413, 45428, 45443, 45458, 45473, 45488, 45503, 45518, + 45533, 45548, 45563, 45578, 45593, 45608, 45623, 45638, 45653, 45668, + 45683, 45698, 45713, 45728, 45743, 45758, 45773, 45788, 45803, 45818, + 45833, 45848, 45863, 45878, 45893, 45908, 45923, 45938, 45953, 45968, + 45983, 45998, 46013, 46028, 46043, 46058, 46073, 46088, 46103, 46118, + 46133, 46148, 46163, 46178, 46193, 46208, 46223, 46238, 46253, 46268, + 46283, 46298, 46313, 46328, 46343, 46358, 46373, 46388, 46403, 46418, + 46433, 46448, 46463, 46478, 46493, 46508, 46523, 46538, 46553, 46568, + 46583, 46598, 46613, 46628, 46643, 46658, 46673, 46688, 46703, 46718, + 46733, 46748, 46763, 46778, 46793, 46808, 46823, 46838, 46853, 46868, + 46883, 46898, 46913, 46928, 46943, 46958, 46973, 46988, 47003, 47018, + 47033, 47048, 47063, 47078, 47093, 47108, 47123, 47138, 47153, 47168, + 47183, 47198, 47213, 47228, 47243, 47258, 47273, 47288, 47303, 47319, + 47335, 47351, 47367, 47383, 47399, 47415, 47431, 47447, 47463, 47479, + 47495, 47511, 47527, 47543, 47559, 47575, 47591, 47607, 47623, 47639, + 47655, 47671, 47687, 47703, 47719, 47735, 47751, 47767, 47783, 47799, + 47815, 47831, 47847, 47863, 47879, 47895, 47911, 47927, 47943, 47959, + 47975, 47991, 48007, 48023, 48039, 48055, 48071, 48087, 48103, 48119, + 48135, 48151, 48167, 48183, 48199, 48215, 48231, 48247, 48263, 48279, + 48295, 48311, 48327, 48343, 48359, 48375, 48391, 48407, 48423, 48439, + 48455, 48471, 48487, 48503, 48519, 48535, 48551, 48567, 48583, 48599, + 48615, 48631, 48647, 48663, 48679, 48695, 48711, 48727, 48743, 48759, + 48775, 48791, 48807, 48823, 48839, 48855, 48871, 48887, 48903, 48919, + 48935, 48951, 48967, 48983, 48999, 49015, 49031, 49047, 49063, 49079, + 49095, 49111, 49127, 49143, 49159, 49175, 49191, 49207, 49223, 49239, + 49255, 49271, 49287, 49303, 49319, 49335, 49351, 49367, 49383, 49399, + 49415, 49431, 49447, 49463, 49479, 49495, 49511, 49527, 49543, 49559, + 49575, 49591, 49607, 49623, 49639, 49655, 49671, 49687, 49703, 49719, + 49735, 49751, 49767, 49783, 49799, 49815, 49831, 49847, 49863, 49879, + 49895, 49911, 49927, 49943, 49959, 49975, 49991, 50007, 50023, 50039, + 50055, 50071, 50087, 50103, 50119, 50135, 50151, 50167, 50183, 50199, + 50215, 50231, 50247, 50263, 50279, 50295, 50311, 50327, 50343, 50359, + 50375, 50391, 50407, 50423, 50439, 50455, 50471, 50487, 50503, 50519, + 50535, 50551, 50567, 50583, 50599, 50615, 50631, 50647, 50663, 50679, + 50695, 50711, 50727, 50743, 50759, 50775, 50791, 50807, 50823, 50839, + 50855, 50871, 50887, 50903, 50919, 50935, 50951, 50967, 50983, 50999, + 51015, 51031, 51047, 51063, 51079, 51095, 51111, 51127, 51143, 51159, + 51175, 51191, 51207, 51223, 51239, 51255, 51271, 51287, 51303, 51319, + 51335, 51351, 51367, 51383, 51399, 51415, 51431, 51447, 51463, 51479, + 51495, 51511, 51527, 51543, 51559, 51575, 51591, 51607, 51623, 51639, + 51655, 51671, 51687, 51703, 51719, 51735, 51751, 51767, 51783, 51799, + 51815, 51831, 51847, 51863, 51879, 51895, 51911, 51927, 51943, 51959, + 51975, 51991, 52007, 52023, 52039, 52055, 52071, 52087, 52103, 52119, + 52135, 52151, 52167, 52183, 52199, 52215, 52231, 52247, 52263, 52279, + 52295, 52311, 52327, 52343, 52359, 52375, 52391, 52407, 52423, 52439, + 52455, 52471, 52487, 52503, 52519, 52535, 52551, 52567, 52583, 52599, + 52615, 52631, 52647, 52663, 52679, 52695, 52711, 52727, 52743, 52759, + 52775, 52791, 52807, 52823, 52839, 52855, 52871, 52887, 52903, 52919, + 52935, 52951, 52967, 52983, 52999, 53015, 53031, 53047, 53063, 53079, + 53095, 53111, 53127, 53143, 53159, 53175, 53191, 53207, 53223, 53239, + 53255, 53271, 53287, 53303, 53319, 53335, 53351, 53367, 53383, 53399, + 53415, 53431, 53447, 53463, 53479, 53495, 53511, 53527, 53543, 53559, + 53575, 53591, 53607, 53623, 53639, 53655, 53671, 53687, 53703, 53719, + 53735, 53751, 53767, 53783, 53799, 53815, 53831, 53847, 53863, 53879, + 53895, 53911, 53927, 53943, 53959, 53975, 53991, 54007, 54023, 54039, + 54055, 54071, 54087, 54103, 54119, 54135, 54151, 54167, 54183, 54199, + 54215, 54231, 54247, 54263, 54279, 54295, 54311, 54327, 54343, 54359, + 54375, 54391, 54407, 54423, 54439, 54455, 54471, 54487, 54503, 54519, + 54535, 54551, 54567, 54583, 54599, 54615, 54631, 54647, 54663, 54679, + 54695, 54711, 54727, 54743, 54759, 54775, 54791, 54807, 54823, 54839, + 54855, 54871, 54887, 54903, 54919, 54935, 54951, 54967, 54983, 54999, + 55015, 55031, 55047, 55063, 55079, 55095, 55111, 55127, 55143, 55159, + 55175, 55191, 55207, 55223, 55239, 55255, 55271, 55287, 55303, 55319, + 55335, 55351, 55367, 55383, 55399, 55415, 55431, 55447, 55463, 55479, + 55495, 55511, 55527, 55543, 55559, 55575, 55591, 55607, 55623, 55639, + 55655, 55671, 55687, 55703, 55719, 55735, 55751, 55767, 55783, 55799, + 55815, 55831, 55847, 55863, 55879, 55895, 55911, 55927, 55943, 55959, + 55975, 55990, 15039, 55999, 56005, 56011, 56021, 56029, 13217, 13752, + 8385, 56042, 1484, 56050, 25502, 5662, 56056, 56061, 56066, 56071, 56076, + 56082, 56087, 56093, 56098, 56104, 56109, 56114, 56119, 56124, 56130, + 56135, 56140, 56145, 56150, 56155, 56160, 56165, 56171, 56176, 56182, + 56189, 2520, 56194, 56200, 6977, 56204, 56209, 56216, 56224, 40, 56228, + 56234, 56239, 56244, 56248, 56253, 56257, 56261, 9089, 56265, 56275, + 56288, 56299, 56312, 56319, 56325, 56330, 56336, 56342, 56348, 56353, + 56358, 56363, 56368, 56372, 56377, 56382, 56387, 56393, 56399, 56405, + 56410, 56414, 56419, 56424, 56428, 56433, 56438, 56443, 56447, 9105, + 9116, 9121, 1527, 56451, 1532, 56457, 14516, 56460, 1563, 56466, 1569, + 1575, 9151, 56471, 56479, 56486, 56490, 56496, 56501, 28969, 56506, + 56513, 56518, 56522, 56526, 1580, 14608, 14619, 56535, 56542, 56547, + 56551, 14644, 1584, 35225, 56554, 56559, 56569, 56578, 56583, 56587, + 56593, 1589, 37110, 56598, 56607, 56613, 56618, 9301, 9307, 56624, 56636, + 56653, 56670, 56687, 56704, 56721, 56738, 56755, 56772, 56789, 56806, + 56823, 56840, 56857, 56874, 56891, 56908, 56925, 56942, 56959, 56976, + 56993, 57010, 57027, 57044, 57061, 57078, 57095, 57112, 57129, 57146, + 57163, 57180, 57197, 57214, 57231, 57248, 57265, 57282, 57299, 57316, + 57333, 57350, 57367, 57384, 57401, 57418, 57435, 57452, 57469, 57480, + 57485, 1594, 57489, 57495, 57500, 57505, 7759, 1599, 57511, 57520, 25785, + 57525, 57536, 57546, 57551, 57558, 57564, 57569, 57574, 14896, 57578, + 9318, 1604, 9323, 57584, 57589, 57595, 57600, 57605, 57610, 57615, 57620, + 57625, 57630, 57636, 57642, 57648, 57653, 57657, 57662, 57667, 57671, + 57676, 57681, 57686, 57690, 57695, 57701, 57706, 57711, 57715, 57720, + 57725, 57731, 57736, 57741, 57747, 57753, 57758, 57762, 57767, 57772, + 57777, 57781, 57786, 57791, 57796, 57802, 57808, 57813, 57817, 57821, + 57826, 57831, 57836, 27145, 57840, 57845, 57850, 57856, 57861, 57866, + 57870, 57875, 57880, 57886, 57891, 57896, 57902, 57908, 57913, 57917, + 57922, 57927, 57931, 57936, 57941, 57946, 57952, 57958, 57963, 57967, + 57972, 57977, 57981, 57986, 57991, 57996, 58000, 58003, 29620, 58008, + 58016, 14962, 14986, 9414, 58022, 58032, 58047, 9419, 58058, 58063, + 58074, 58086, 58098, 58110, 2654, 58122, 58127, 58131, 58137, 58143, + 58148, 1616, 1036, 58157, 58162, 37156, 58166, 58170, 58175, 58179, + 15047, 58184, 58187, 58195, 58203, 1620, 9444, 9450, 1625, 58211, 58218, + 58223, 58232, 58242, 58249, 58254, 1630, 58261, 58266, 15162, 58270, + 58275, 58282, 58288, 58292, 58303, 58313, 15184, 7672, 7679, 1635, 58320, + 58326, 58334, 58341, 58347, 58354, 58366, 58372, 58377, 58389, 58400, + 58409, 58419, 3681, 28805, 28814, 15224, 1640, 1644, 58427, 58438, 58443, + 1647, 58451, 58456, 15275, 58468, 58474, 58479, 58487, 1652, 58492, + 58497, 58505, 58513, 58520, 58529, 58537, 58546, 1657, 58550, 1662, + 58555, 58562, 15349, 58570, 58576, 58581, 58589, 58596, 58604, 20779, + 58609, 9579, 58618, 58624, 58631, 58638, 58644, 58654, 58660, 58665, + 58670, 58678, 9588, 9593, 58686, 58692, 58700, 3746, 15391, 37244, 58705, + 58711, 58716, 58724, 58731, 10404, 58736, 58742, 1673, 58747, 58750, + 1073, 58756, 58761, 58766, 58772, 58777, 58782, 58787, 58792, 58797, + 58802, 1682, 9, 58808, 58812, 58817, 58821, 58825, 58829, 29864, 58834, + 58839, 58844, 58848, 58851, 58855, 58859, 58864, 58868, 58873, 58877, + 32547, 32552, 32557, 58880, 58887, 58893, 36976, 58903, 32563, 30117, + 29879, 29885, 32579, 29891, 58908, 58913, 30150, 58917, 58920, 58924, + 58931, 58934, 58939, 58943, 58947, 58950, 58960, 58972, 58979, 31514, + 58982, 6994, 856, 58985, 58989, 58994, 58998, 59001, 11992, 59008, 59015, + 59028, 59036, 59045, 59050, 59060, 59073, 59085, 59092, 59097, 59106, + 59119, 59137, 59142, 59149, 59155, 59160, 59168, 59175, 25341, 619, + 59181, 59187, 59197, 59203, 59208, 29909, 4498, 29923, 59212, 59222, + 59227, 59237, 59252, 59258, 59264, 29933, 59269, 29081, 59273, 59278, + 59283, 59287, 59292, 15227, 59299, 59304, 59308, 4539, 29959, 59312, + 59318, 332, 59328, 59335, 59342, 59347, 59356, 56563, 59362, 59370, + 59374, 59378, 59382, 59386, 59391, 59395, 59401, 59409, 59414, 59419, + 59423, 59428, 59432, 59436, 59442, 59448, 59453, 59457, 30083, 59462, + 30089, 30095, 59467, 59473, 59480, 59485, 59489, 29098, 14889, 59492, + 59496, 59501, 59508, 59514, 59518, 59523, 36686, 59529, 59533, 59537, + 59542, 59548, 59554, 59566, 59575, 59585, 59591, 59598, 59603, 59608, + 59612, 59615, 59621, 59628, 59633, 59638, 59645, 59652, 59658, 59663, + 59668, 59676, 59681, 2382, 59685, 59690, 59696, 59701, 59707, 59712, + 59717, 59722, 59728, 30116, 59733, 59739, 59745, 59751, 30180, 59756, + 59761, 59766, 30191, 59771, 59776, 59781, 59787, 59793, 30196, 59798, + 59803, 59808, 30251, 30257, 59813, 59818, 30262, 59823, 26012, 30284, + 30288, 59828, 59804, 59832, 59840, 59846, 59854, 59861, 59867, 59877, + 59883, 59890, 9036, 30302, 59896, 59909, 59918, 59924, 59933, 59939, + 21696, 59946, 59953, 59963, 30252, 59966, 59973, 59978, 59982, 59986, + 59991, 4615, 59995, 60000, 60005, 32641, 32646, 60009, 32660, 60014, + 32665, 60019, 60025, 32677, 32683, 32689, 60030, 60036, 20744, 60047, + 60050, 60062, 60070, 30325, 60074, 60083, 60093, 60102, 30335, 60107, + 60114, 60123, 60129, 60137, 60144, 4590, 4327, 60149, 30263, 60155, + 60158, 60164, 60171, 60176, 60181, 21623, 60185, 60191, 60197, 60202, + 60207, 60211, 60217, 60223, 31424, 833, 33642, 34555, 34561, 60228, + 60232, 60236, 60239, 60252, 60258, 60262, 60265, 60270, 31727, 60274, + 29103, 19532, 60280, 4519, 4527, 7513, 60283, 60288, 60293, 60298, 60303, + 60308, 60313, 60318, 60323, 60328, 60334, 60339, 60344, 60350, 60355, + 60360, 60365, 60370, 60375, 60380, 60386, 60391, 60397, 60402, 60407, + 60412, 60417, 60422, 60427, 60432, 60437, 60442, 60447, 60453, 60458, + 60463, 60468, 60473, 60478, 60483, 60489, 60494, 60499, 60504, 60509, + 60514, 60519, 60524, 60529, 60534, 60540, 60545, 60550, 60555, 60560, + 60566, 60572, 60577, 60583, 60588, 60593, 60598, 60603, 60608, 1477, 245, + 60613, 60617, 60621, 60625, 23274, 60629, 60633, 60638, 60642, 60647, + 60651, 60655, 60659, 60664, 60668, 11729, 60673, 60677, 60684, 13513, + 60693, 60702, 60706, 60711, 60716, 60720, 23073, 2970, 60724, 60730, + 60739, 60747, 60753, 60765, 60777, 60781, 60786, 60790, 60796, 60802, + 60807, 60817, 60827, 60833, 60838, 60842, 60847, 60853, 60862, 60871, + 60879, 13867, 60883, 60892, 60900, 60912, 60923, 60934, 60943, 60947, + 60956, 60966, 60972, 60977, 60983, 60988, 98, 28917, 60999, 24345, 24355, + 61005, 61012, 61018, 61022, 61032, 61043, 61051, 61060, 61065, 61070, + 61074, 15590, 61082, 61086, 61092, 61102, 61109, 61115, 32740, 1180, + 61121, 61124, 61128, 61138, 61144, 61151, 11666, 61158, 61164, 61173, + 61182, 61188, 61194, 61200, 61205, 61212, 61219, 61225, 61238, 61247, + 61256, 61261, 61265, 61271, 61278, 61285, 61292, 61299, 61306, 61311, + 61315, 61319, 61322, 61332, 61336, 61348, 61357, 61361, 61366, 61370, + 61376, 61381, 61388, 61397, 61405, 61413, 61418, 61422, 61427, 61432, + 61442, 61450, 61455, 61459, 61463, 61469, 61481, 61489, 61499, 61506, + 61512, 61517, 61521, 61525, 61529, 61538, 61547, 61556, 61562, 61568, + 61574, 61579, 61586, 61592, 61600, 61607, 10820, 61613, 61619, 61623, + 12571, 61627, 61632, 61642, 61651, 61657, 61663, 61671, 61678, 61682, + 61686, 61692, 61700, 61707, 61713, 61724, 61728, 61732, 61736, 61739, + 61745, 61750, 61754, 61758, 61767, 61775, 61782, 61788, 61795, 22204, + 36728, 61800, 61808, 61812, 61816, 61819, 61827, 61834, 61840, 61849, + 61857, 61863, 61868, 61872, 61877, 61881, 61885, 61890, 61899, 61903, + 61910, 61917, 61923, 61931, 61937, 61948, 61956, 61962, 20874, 61971, + 61978, 61985, 61992, 61999, 62006, 39708, 11504, 62013, 62020, 62025, + 32776, 37892, 62031, 62036, 62041, 62047, 62053, 62059, 62064, 62069, + 62074, 62079, 62085, 62090, 62096, 62101, 62107, 62112, 62117, 62122, + 62127, 62132, 62137, 62142, 62148, 62153, 62159, 62164, 62169, 62174, + 62179, 62184, 62189, 62195, 62200, 62205, 62210, 62215, 62220, 62225, + 62230, 62235, 62240, 62245, 62251, 62256, 62261, 62266, 62271, 62276, + 62281, 62286, 62291, 62297, 62302, 62307, 62312, 62317, 62322, 62327, + 62332, 62337, 62342, 62347, 62352, 62357, 62363, 1798, 224, 35321, 62368, + 62371, 62376, 62380, 62383, 62388, 61409, 62399, 62409, 62416, 62432, + 62441, 62451, 62461, 62469, 62477, 62481, 62484, 62491, 62497, 62508, + 62520, 62531, 62540, 62547, 1287, 21512, 62557, 2549, 62561, 62570, 1142, + 15563, 35947, 62578, 62586, 62600, 62613, 62617, 62622, 62627, 62632, + 62638, 62644, 62649, 6986, 62654, 62662, 9445, 62667, 62673, 1685, 9457, + 728, 62682, 62691, 62701, 25109, 62710, 62716, 15139, 62722, 62726, 3894, + 9788, 62732, 58433, 62739, 3918, 184, 12492, 62745, 62757, 62761, 62767, + 25805, 62771, 9776, 2689, 4, 62776, 62786, 62792, 62803, 62810, 62816, + 62822, 62830, 62837, 62843, 62853, 62863, 62873, 1299, 62882, 62888, + 2712, 2718, 6983, 2223, 62892, 62896, 62905, 62913, 62924, 62932, 62940, + 62946, 62951, 62962, 62973, 62981, 62987, 8127, 62992, 63000, 63004, + 63008, 63020, 26181, 63027, 63037, 63043, 63049, 8229, 63059, 63070, + 63080, 63089, 63093, 63100, 1144, 1196, 63110, 63115, 63123, 63131, + 63142, 63149, 63163, 12417, 384, 63173, 63177, 63186, 63194, 63200, + 63214, 63221, 63227, 63236, 63243, 63253, 63261, 3753, 189, 63269, 63280, + 63284, 63296, 26003, 156, 63302, 63307, 63311, 63318, 63324, 63332, + 63339, 7263, 63346, 63355, 63363, 3819, 63376, 15185, 63380, 2757, 443, + 63385, 63398, 63403, 1797, 653, 63407, 3825, 63415, 63421, 983, 63431, + 63440, 63445, 13251, 13258, 43040, 63449, 3763, 11398, 63457, 63464, + 21739, 63468, 63475, 63481, 63486, 63491, 13271, 367, 63496, 63508, + 63514, 63522, 2769, 1717, 63530, 63532, 63537, 63542, 63547, 63553, + 63558, 63563, 63568, 63573, 63578, 63583, 63589, 63594, 63599, 63604, + 63609, 63614, 63619, 63624, 63629, 63635, 63640, 63645, 63650, 63656, + 63661, 63667, 63672, 63677, 63682, 63687, 63692, 63697, 63702, 63708, + 63713, 63719, 63724, 63729, 63734, 63739, 63744, 63749, 63754, 63759, + 63765, 63770, 63775, 63779, 63783, 63788, 63792, 63797, 63802, 63808, + 63813, 63817, 63822, 63826, 63829, 63831, 63835, 63838, 63843, 63847, + 63851, 63855, 63859, 63868, 63872, 30520, 63875, 30525, 63882, 63887, + 30530, 63896, 63905, 30536, 63910, 30541, 63919, 63924, 9966, 63928, + 63933, 63938, 30546, 63942, 38058, 63946, 63949, 63953, 6667, 63959, + 63964, 63968, 3646, 30551, 63971, 63975, 63978, 63983, 63987, 63993, + 64001, 64014, 64023, 64029, 64034, 64040, 64044, 64050, 64058, 64063, + 64070, 64076, 64084, 64093, 64101, 30554, 64108, 64118, 64127, 64140, + 64145, 64150, 64159, 64165, 64172, 64183, 64195, 64202, 64211, 64220, + 64229, 64236, 64242, 64249, 64257, 64264, 64272, 64281, 64289, 64296, + 64304, 64313, 64321, 64330, 64340, 64349, 64357, 64364, 64372, 64381, + 64389, 64398, 64408, 64417, 64425, 64434, 64444, 64453, 64463, 64474, + 64484, 64493, 64501, 64508, 64516, 64525, 64533, 64542, 64552, 64561, + 64569, 64578, 64588, 64597, 64607, 64618, 64628, 64637, 64645, 64654, + 64664, 64673, 64683, 64694, 64704, 64713, 64723, 64734, 64744, 64755, + 64767, 64778, 64788, 64797, 64805, 64812, 64820, 64829, 64837, 64846, + 64856, 64865, 64873, 64882, 64892, 64901, 64911, 64922, 64932, 64941, + 64949, 64958, 64968, 64977, 64987, 64998, 65008, 65017, 65027, 65038, + 65048, 65059, 65071, 65082, 65092, 65101, 65109, 65118, 65128, 65137, + 65147, 65158, 65168, 65177, 65187, 65198, 65208, 65219, 65231, 65242, + 65252, 65261, 65271, 65282, 65292, 65303, 65315, 65326, 65336, 65347, + 65359, 65370, 65382, 65395, 65407, 65418, 65428, 65437, 65445, 65452, + 65460, 65469, 65477, 65486, 65496, 65505, 65513, 65522, 65532, 65541, + 65551, 65562, 65572, 65581, 65589, 65598, 65608, 65617, 65627, 65638, + 65648, 65657, 65667, 65678, 65688, 65699, 65711, 65722, 65732, 65741, + 65749, 65758, 65768, 65777, 65787, 65798, 65808, 65817, 65827, 65838, + 65848, 65859, 65871, 65882, 65892, 65901, 65911, 65922, 65932, 65943, + 65955, 65966, 65976, 65987, 65999, 66010, 66022, 66035, 66047, 66058, + 66068, 66077, 66085, 66094, 66104, 66113, 66123, 66134, 66144, 66153, + 66163, 66174, 66184, 66195, 66207, 66218, 66228, 66237, 66247, 66258, + 66268, 66279, 66291, 66302, 66312, 66323, 66335, 66346, 66358, 66371, + 66383, 66394, 66404, 66413, 66423, 66434, 66444, 66455, 66467, 66478, + 66488, 66499, 66511, 66522, 66534, 66547, 66559, 66570, 66580, 66591, + 66603, 66614, 66626, 66639, 66651, 66662, 66674, 66687, 66699, 66712, + 66726, 66739, 66751, 66762, 66772, 66781, 66789, 66796, 66801, 6518, + 66808, 30564, 66813, 66818, 30569, 66824, 19186, 30574, 66829, 66835, + 66843, 66849, 66855, 66862, 66869, 66874, 66878, 66881, 66885, 66894, + 66900, 66912, 66923, 66927, 3032, 6493, 66932, 66935, 66937, 66941, + 66945, 66949, 24044, 66954, 66958, 66961, 66966, 66970, 66977, 66983, + 66987, 66991, 66994, 30591, 66999, 67006, 67015, 67023, 67034, 67042, + 67050, 67057, 67064, 67070, 67081, 30596, 67086, 67097, 67109, 67117, + 67128, 67137, 67148, 67153, 67161, 2515, 67166, 32234, 67179, 67183, + 67195, 67203, 67208, 67216, 15750, 67227, 67233, 67240, 67248, 67254, + 30606, 67259, 3844, 56025, 67266, 67269, 67277, 67290, 67303, 67316, + 67329, 67336, 67347, 67356, 39525, 39530, 67361, 67365, 67373, 67380, + 67389, 67397, 67403, 67412, 67420, 67428, 67432, 67441, 67450, 67460, + 67473, 67486, 67496, 30611, 67502, 67509, 67515, 30617, 67520, 67523, + 67527, 67535, 67544, 39263, 67552, 67561, 67569, 67576, 67584, 67594, + 67603, 67612, 67621, 67629, 67640, 67650, 7799, 19801, 67659, 67664, + 67669, 67673, 67677, 67682, 67688, 67693, 67698, 67704, 67709, 67714, + 19766, 67719, 67726, 67734, 67742, 67747, 67754, 67761, 67765, 67769, + 67777, 67785, 30634, 67791, 67797, 67809, 67815, 67819, 67826, 67831, + 67842, 67852, 67862, 67874, 67880, 67890, 67900, 30661, 67909, 67918, + 67924, 67936, 67947, 67954, 67959, 67963, 67971, 67977, 67982, 67987, + 67994, 68002, 68014, 68024, 68033, 68042, 68049, 32098, 22027, 68055, + 68060, 68064, 68068, 68073, 68079, 68090, 68103, 68108, 68115, 30666, + 68120, 68132, 68141, 68151, 68162, 68175, 68182, 68191, 68200, 68208, + 68213, 68219, 1027, 68224, 68229, 68234, 68239, 68245, 68250, 68255, + 68261, 68267, 68272, 68276, 68281, 68286, 68291, 56531, 68296, 68301, + 68306, 68311, 68317, 68323, 68328, 68332, 68337, 68342, 68347, 68353, + 68358, 68364, 68369, 68374, 68379, 68384, 68388, 68394, 68399, 68408, + 68413, 68418, 68423, 68428, 68432, 68439, 68445, 15412, 15419, 43295, + 68450, 68400, 68452, 68462, 30675, 68465, 68474, 68480, 4638, 30680, + 68484, 68490, 68495, 68501, 68506, 68510, 68517, 68522, 68532, 68541, + 68545, 68551, 68557, 68563, 68567, 68575, 68582, 68590, 68598, 30685, + 68605, 68608, 68615, 68621, 68626, 68630, 68636, 68643, 68648, 68652, + 68661, 68669, 68675, 68680, 30690, 68687, 68694, 68700, 68705, 68711, + 68718, 68724, 19539, 25525, 68730, 68735, 68741, 68753, 68433, 68440, + 68763, 68768, 68775, 68782, 68788, 68799, 68804, 7548, 68812, 68815, + 68821, 68825, 68829, 68832, 68838, 30443, 4677, 922, 11779, 68845, 68851, + 68857, 68863, 68869, 68875, 68881, 68887, 68893, 68898, 68903, 68908, + 68913, 68918, 68923, 68928, 68933, 68938, 68943, 68948, 68953, 68958, + 68964, 68969, 68974, 68980, 68985, 68990, 68996, 69002, 69008, 69014, + 69020, 69026, 69032, 69038, 69044, 69049, 69054, 69060, 69065, 69070, + 69076, 69081, 69086, 69091, 69096, 69101, 69106, 69111, 69116, 69121, + 69126, 69131, 69136, 69142, 69147, 69152, 69157, 69163, 69168, 69173, + 69178, 69183, 69189, 69194, 69199, 69204, 69209, 69214, 69219, 69224, + 69229, 69234, 69239, 69244, 69249, 69254, 69259, 69264, 69269, 69274, + 69279, 69284, 69290, 69295, 69300, 69305, 69310, 69315, 69320, 69325, + 1828, 142, 69330, 69334, 69338, 69343, 69351, 69355, 69362, 69370, 69374, + 69387, 69395, 69399, 69402, 69407, 69411, 69416, 69420, 69428, 69432, + 19194, 69437, 69441, 58696, 69445, 69448, 69456, 69464, 69472, 69477, + 69484, 69490, 69496, 69501, 69506, 69514, 62605, 69521, 69526, 69531, + 69535, 10033, 69539, 69544, 69549, 69553, 69556, 69562, 69566, 69576, + 69585, 69588, 69595, 69608, 69614, 69622, 69633, 69644, 69655, 69666, + 69675, 69681, 69690, 69698, 69708, 69721, 69728, 69739, 69745, 69750, + 69755, 69761, 69767, 69777, 69786, 68122, 69794, 69800, 69808, 69814, + 69822, 69826, 69830, 69833, 69839, 69845, 69853, 69865, 69877, 69884, + 69888, 69899, 69907, 69914, 69926, 69934, 69942, 69949, 69955, 69965, + 69974, 69979, 69989, 69998, 38604, 70005, 70009, 70014, 70022, 70029, + 70035, 70039, 70049, 70060, 70068, 70075, 70087, 70099, 70108, 67169, + 70115, 70126, 70140, 70148, 70158, 70165, 70173, 70185, 70194, 70202, + 70212, 70223, 70235, 70244, 70254, 70261, 70270, 70285, 70295, 70304, + 70312, 70325, 70340, 70344, 70353, 70365, 70376, 70387, 70398, 70408, + 70419, 70427, 70433, 70443, 70449, 27044, 70454, 70460, 70465, 70472, + 8141, 15770, 70478, 70487, 70492, 70496, 70503, 70509, 70514, 70519, + 70527, 70535, 70539, 70542, 70545, 70547, 70554, 70560, 70571, 70576, + 70580, 70587, 70593, 70598, 70606, 63072, 63082, 70612, 70619, 70629, + 9023, 70636, 70641, 27234, 70650, 70655, 70662, 70672, 70680, 70688, + 70697, 70703, 70709, 70716, 70723, 70728, 70732, 70740, 70745, 70750, + 70758, 70765, 70770, 70776, 70779, 70783, 70792, 69382, 70801, 70805, + 70811, 70822, 70832, 15779, 70843, 70851, 15791, 70858, 70862, 70871, + 25411, 70878, 70882, 70887, 70904, 70916, 8981, 70928, 70933, 70938, + 70943, 70947, 70950, 70955, 70960, 70966, 70971, 4341, 19267, 70976, + 70981, 70987, 70994, 70999, 71004, 71010, 71016, 71022, 71027, 71033, + 71037, 71051, 71059, 71067, 71073, 71078, 71085, 71095, 71104, 71109, + 71114, 71122, 71127, 71133, 71138, 71147, 57580, 71152, 71155, 71173, + 71192, 71205, 71219, 71235, 71242, 71249, 71255, 71262, 71267, 71273, + 71279, 71287, 71293, 71298, 71303, 71319, 8994, 71333, 71340, 71348, + 71354, 71358, 71361, 71366, 71371, 71378, 71383, 71392, 71397, 71403, + 71412, 71421, 71426, 71430, 71438, 10057, 71447, 71455, 71460, 71466, + 10068, 71471, 71474, 71479, 71489, 71498, 71503, 71509, 71514, 71522, + 71529, 71540, 71550, 71555, 62533, 71560, 71566, 71571, 71578, 71587, + 71595, 71601, 71608, 71614, 71618, 15237, 3006, 71623, 71627, 71633, + 71642, 71648, 71655, 71659, 71680, 71702, 71718, 71735, 71754, 71763, + 71773, 71780, 71787, 25298, 71793, 71797, 71805, 71817, 71823, 71831, + 71835, 71843, 71850, 71854, 71860, 71866, 71871, 3511, 39725, 71877, + 71881, 71885, 71889, 71894, 71899, 71904, 71910, 71916, 71922, 71929, + 71935, 71942, 71948, 71954, 71959, 71965, 71970, 71975, 71979, 71984, + 39740, 71988, 71993, 72001, 72005, 72010, 72017, 72026, 72032, 72036, + 72043, 72047, 72050, 72057, 72066, 72071, 72075, 72083, 72092, 72096, + 72104, 72110, 72115, 72120, 72126, 72132, 72137, 72141, 72147, 72152, + 72156, 72160, 72163, 72168, 72176, 72186, 72191, 37263, 72199, 72211, + 72215, 72221, 72233, 72244, 72251, 72257, 72264, 72276, 72283, 72289, + 19341, 72293, 72299, 72306, 72312, 72318, 72323, 72328, 72333, 72342, + 5512, 72347, 14703, 72353, 72357, 72361, 72369, 72378, 72382, 72389, + 72398, 72411, 72417, 71980, 28093, 72422, 72424, 72429, 72434, 72439, + 72444, 72449, 72454, 72459, 72464, 72469, 72474, 72479, 72484, 72489, + 72494, 72500, 72505, 72510, 72515, 72520, 72525, 72530, 72535, 72540, + 72546, 72552, 72558, 72563, 72568, 72580, 72585, 1834, 67, 72590, 72595, + 30717, 30722, 30727, 30733, 30738, 72599, 30743, 20316, 72621, 72625, + 72629, 72634, 72638, 30747, 72642, 72650, 30752, 72657, 72660, 72665, + 72669, 7976, 72678, 30757, 20178, 72681, 72685, 1397, 72690, 30768, + 72693, 72698, 23837, 23847, 33172, 72703, 72708, 72713, 72718, 72724, + 72729, 72738, 72743, 72750, 72756, 72761, 72766, 72771, 72781, 72790, + 72795, 72803, 72807, 72815, 30582, 35192, 72822, 72828, 72833, 72838, + 72843, 72849, 72854, 72861, 72867, 72872, 72880, 72890, 72900, 72906, + 72911, 72917, 15801, 72924, 33992, 72937, 72942, 72948, 72961, 72967, + 72971, 72980, 72987, 72993, 73001, 73010, 73017, 73023, 73026, 23978, + 73030, 73037, 73043, 73051, 73056, 22156, 73062, 73065, 73073, 73081, + 73095, 73102, 73108, 73115, 73121, 30782, 73125, 73132, 73140, 73148, + 30787, 73154, 73160, 73165, 73175, 73181, 73190, 28822, 32647, 73198, + 73203, 73208, 73213, 73217, 13243, 37276, 73222, 73227, 30792, 59980, + 73231, 73236, 73240, 73249, 73257, 73263, 73268, 73274, 73281, 73287, + 73292, 73297, 73306, 73318, 73333, 31033, 73339, 14822, 30796, 73343, + 73350, 22262, 73356, 73363, 73372, 73379, 73388, 73394, 73399, 73407, + 73413, 30806, 73418, 73427, 72239, 73436, 73443, 73449, 73455, 73465, + 73473, 73480, 73484, 30811, 73487, 30817, 30823, 73492, 73500, 73508, + 73518, 73527, 73535, 73542, 73552, 30828, 73556, 73558, 73562, 73567, + 73571, 73575, 73581, 73586, 73590, 73601, 73606, 3011, 73610, 73617, + 73621, 73630, 73638, 73645, 73650, 73655, 60026, 73659, 73662, 73668, + 73676, 73682, 73686, 73691, 73698, 73703, 73709, 32678, 73714, 73717, + 73722, 73726, 73731, 73736, 73740, 73748, 23856, 23865, 73754, 73760, + 73766, 73771, 73775, 73778, 73788, 73797, 73802, 73808, 73815, 73821, + 73825, 73833, 73838, 32684, 73842, 73850, 73856, 73863, 73868, 73872, + 73877, 56211, 32690, 73883, 73888, 73892, 73897, 73902, 73907, 73911, + 73916, 73921, 73927, 73932, 73937, 73943, 73949, 73954, 73958, 73963, + 73968, 73973, 73977, 22261, 73982, 73987, 73993, 73999, 74005, 74010, + 74014, 74019, 74024, 74029, 74033, 74038, 74043, 74048, 74053, 74057, + 30832, 74065, 74069, 74077, 74085, 74096, 74101, 74105, 20622, 74110, + 74116, 74126, 74133, 74138, 74147, 74152, 74156, 74161, 74169, 74177, + 74184, 62751, 74190, 74198, 74205, 74216, 74222, 74226, 74232, 30842, + 74235, 74242, 74250, 74255, 37467, 74259, 74264, 74271, 74276, 7430, + 74280, 74288, 74295, 74302, 74308, 74322, 61055, 74330, 74336, 74340, + 74343, 74351, 74358, 74363, 74376, 74383, 74390, 74395, 58600, 74400, + 74403, 74410, 74416, 74420, 74428, 74438, 74448, 74457, 74465, 74476, + 74481, 74485, 74490, 74494, 33303, 19595, 33312, 74502, 74507, 74512, + 74517, 74522, 74527, 74532, 74536, 74541, 74546, 74551, 74556, 74561, + 74566, 74570, 74575, 74580, 74584, 74588, 74592, 74596, 74601, 74606, + 74610, 74615, 74619, 74623, 74628, 74633, 74638, 74643, 74647, 74652, + 74657, 74661, 74666, 74671, 74676, 74681, 74686, 74691, 74696, 74701, + 74706, 74711, 74716, 74721, 74726, 74731, 74736, 74741, 74746, 74751, + 74756, 74761, 74765, 74770, 74775, 74780, 74785, 74790, 74795, 74800, + 74805, 74810, 74815, 74820, 74824, 74829, 74833, 74838, 74843, 74848, + 74853, 74858, 74863, 74868, 74873, 74878, 74882, 74886, 74891, 74896, + 74900, 74905, 74910, 74914, 74919, 74924, 74929, 74934, 74938, 74943, + 74948, 74952, 74957, 74961, 74965, 74969, 74973, 74978, 74982, 74986, + 74990, 74994, 74998, 75002, 75006, 75010, 75014, 75019, 75024, 75029, + 75034, 75039, 75044, 75049, 75054, 75059, 75064, 75068, 75072, 75076, + 75080, 75084, 75088, 75093, 75097, 75102, 75106, 75111, 75116, 75120, + 75124, 75129, 75133, 75137, 75141, 75145, 75149, 75153, 75157, 75161, + 75165, 75169, 75173, 75177, 75181, 75185, 75190, 75195, 75199, 75203, + 75207, 75211, 75215, 75219, 75224, 75228, 75232, 75236, 75240, 75244, + 75248, 75253, 75257, 75262, 75266, 75270, 75274, 75278, 75282, 75286, + 75290, 75294, 75298, 75302, 75306, 75311, 75315, 75319, 75323, 75327, + 75331, 75335, 75339, 75343, 75347, 75351, 75355, 75360, 75364, 75368, + 75373, 75378, 75382, 75386, 75390, 75394, 75398, 75402, 75406, 75410, + 75415, 75419, 75424, 75428, 75433, 75437, 75442, 75446, 75452, 75457, + 75461, 75466, 75470, 75475, 75479, 75484, 75488, 75493, 1485, 75497, + 2783, 1723, 1728, 75501, 75505, 2787, 75509, 1366, 75514, 1332, 75518, + 2799, 75522, 75529, 75536, 75550, 2803, 5610, 75559, 75567, 75574, 75585, + 75594, 75601, 75613, 75626, 75639, 75650, 75655, 75662, 75674, 75678, + 2807, 10130, 75688, 75693, 75702, 75712, 2811, 75717, 75721, 75726, + 75733, 75739, 75747, 75759, 1337, 11399, 75769, 75773, 75779, 75793, + 75805, 75817, 75827, 75836, 75845, 75854, 75862, 75873, 75881, 3981, + 75891, 75900, 75906, 75921, 75928, 75934, 33433, 75939, 2835, 11403, + 75943, 75950, 7375, 75959, 2840, 30341, 75965, 58349, 75972, 75978, + 75989, 75995, 76002, 76008, 76016, 76023, 76029, 76039, 76048, 76059, + 76066, 76072, 76082, 76090, 76096, 76111, 76117, 76122, 76129, 76132, + 76138, 76145, 76151, 76159, 76168, 76176, 76182, 76191, 39265, 76205, + 76210, 13080, 76216, 76229, 76238, 76246, 76253, 76257, 76261, 76264, + 76271, 76278, 76286, 76294, 76303, 76311, 13011, 76319, 76324, 76328, + 76340, 76347, 76356, 780, 76366, 76375, 76386, 2856, 76390, 76394, 76400, + 76413, 76425, 76435, 76444, 24448, 76456, 76464, 76473, 76484, 76495, + 76505, 76515, 76524, 76532, 9709, 76539, 76543, 76548, 76553, 76559, + 1342, 10201, 76566, 76577, 76586, 76594, 76603, 76611, 76627, 76638, + 76647, 76655, 76667, 76678, 76694, 76704, 76725, 76738, 76746, 76753, + 13191, 76766, 76771, 76777, 4403, 76783, 76786, 76793, 76803, 6636, + 76810, 76815, 76820, 76828, 76836, 8189, 8198, 76841, 76852, 76857, + 76863, 2864, 2869, 76869, 9276, 76875, 76882, 76889, 76902, 2210, 50, + 76907, 76912, 76922, 76928, 76937, 76945, 76955, 76959, 76964, 76968, + 76980, 2892, 76988, 76996, 77001, 77012, 77023, 77032, 77037, 77043, + 77048, 77058, 77068, 77073, 77079, 77084, 77093, 19648, 77097, 4058, 20, + 77102, 77111, 77118, 77125, 77131, 77137, 834, 77142, 77147, 58666, + 77152, 77157, 77163, 77171, 77176, 77183, 77189, 77194, 35898, 39163, + 77200, 2896, 32, 77210, 77223, 77228, 77236, 77241, 77247, 2918, 26355, + 77252, 77260, 77267, 77272, 56453, 59647, 77281, 77285, 1668, 1777, + 77290, 77295, 77302, 1781, 247, 77309, 77315, 77320, 77327, 1785, 77332, + 77338, 77343, 77355, 4614, 77365, 1792, 77371, 77376, 77383, 77390, + 77405, 77412, 77423, 77431, 2577, 77435, 77447, 77452, 77456, 77462, + 26180, 2215, 77466, 77477, 77481, 77485, 77491, 77495, 77504, 77508, + 77519, 77523, 2261, 30170, 77527, 77537, 3031, 7804, 77545, 77550, 77554, + 77563, 77570, 77576, 3001, 15429, 77580, 77593, 77611, 77616, 77624, + 77632, 77642, 11505, 77654, 77667, 77674, 77681, 77697, 77704, 77710, + 1050, 77717, 77724, 77734, 77743, 77755, 40129, 77763, 3015, 10398, + 77766, 77774, 77778, 3019, 77782, 19444, 10414, 3697, 77786, 3025, 77790, + 77800, 77806, 77812, 77818, 77824, 77830, 77836, 77842, 77848, 77854, + 77860, 77866, 77872, 77878, 77884, 77890, 77896, 77902, 77908, 77914, + 77920, 77926, 77932, 77938, 77944, 77950, 77957, 77964, 77970, 77976, + 77982, 77988, 77994, 78000, 1347, 14339, 10436, 78006, 78011, 78016, + 78021, 78026, 78031, 78036, 78041, 78046, 78051, 78056, 78061, 78066, + 78071, 78076, 78081, 78086, 78091, 78096, 78101, 78106, 78111, 78116, + 78121, 78126, 78131, 78137, 78142, 78147, 78153, 78158, 78164, 78169, + 78174, 78180, 78185, 78190, 78195, 78200, 78205, 78210, 78215, 78220, + 77801, 77807, 77813, 77819, 77825, 77831, 77837, 77843, 77849, 77855, + 77861, 77867, 77873, 77879, 77885, 78226, 77891, 77897, 77903, 78232, + 77909, 77915, 77921, 77927, 77933, 77939, 77945, 77965, 78238, 78244, + 77971, 78250, 77977, 77983, 77989, 77995, 78001, 3046, 3051, 78256, + 78261, 78264, 78270, 78276, 78283, 78288, 78293, 2266, }; /* code->name phrasebook */ #define phrasebook_shift 7 #define phrasebook_short 211 static unsigned char phrasebook[] = { - 0, 219, 206, 244, 254, 77, 224, 143, 77, 50, 52, 247, 86, 52, 226, 57, - 52, 254, 35, 253, 226, 42, 226, 131, 46, 226, 131, 253, 132, 94, 52, 249, - 157, 240, 159, 243, 200, 219, 69, 219, 231, 21, 212, 79, 21, 116, 21, - 109, 21, 166, 21, 163, 21, 180, 21, 189, 21, 198, 21, 195, 21, 200, 249, - 164, 221, 70, 233, 39, 52, 245, 61, 52, 242, 107, 52, 224, 158, 77, 249, - 156, 253, 122, 7, 6, 1, 61, 7, 6, 1, 253, 74, 7, 6, 1, 250, 252, 7, 6, 1, - 249, 3, 7, 6, 1, 74, 7, 6, 1, 244, 230, 7, 6, 1, 243, 177, 7, 6, 1, 242, - 41, 7, 6, 1, 72, 7, 6, 1, 235, 142, 7, 6, 1, 235, 27, 7, 6, 1, 150, 7, 6, - 1, 183, 7, 6, 1, 204, 7, 6, 1, 75, 7, 6, 1, 226, 229, 7, 6, 1, 224, 240, - 7, 6, 1, 149, 7, 6, 1, 197, 7, 6, 1, 218, 99, 7, 6, 1, 69, 7, 6, 1, 215, - 79, 7, 6, 1, 214, 82, 7, 6, 1, 213, 166, 7, 6, 1, 213, 105, 7, 6, 1, 212, - 152, 42, 41, 125, 223, 203, 219, 231, 46, 41, 125, 249, 224, 254, 174, - 115, 232, 242, 242, 114, 254, 174, 7, 3, 1, 61, 7, 3, 1, 253, 74, 7, 3, - 1, 250, 252, 7, 3, 1, 249, 3, 7, 3, 1, 74, 7, 3, 1, 244, 230, 7, 3, 1, - 243, 177, 7, 3, 1, 242, 41, 7, 3, 1, 72, 7, 3, 1, 235, 142, 7, 3, 1, 235, - 27, 7, 3, 1, 150, 7, 3, 1, 183, 7, 3, 1, 204, 7, 3, 1, 75, 7, 3, 1, 226, - 229, 7, 3, 1, 224, 240, 7, 3, 1, 149, 7, 3, 1, 197, 7, 3, 1, 218, 99, 7, - 3, 1, 69, 7, 3, 1, 215, 79, 7, 3, 1, 214, 82, 7, 3, 1, 213, 166, 7, 3, 1, - 213, 105, 7, 3, 1, 212, 152, 42, 249, 40, 125, 71, 232, 242, 46, 249, 40, - 125, 217, 42, 228, 184, 219, 206, 235, 191, 244, 254, 77, 250, 110, 52, - 225, 108, 52, 249, 39, 52, 213, 31, 52, 251, 63, 134, 222, 92, 52, 247, - 209, 249, 102, 52, 244, 105, 227, 21, 235, 235, 233, 66, 51, 254, 19, - 224, 143, 77, 228, 163, 52, 219, 236, 240, 160, 223, 252, 52, 232, 37, - 248, 22, 52, 225, 155, 52, 218, 223, 109, 218, 223, 166, 254, 164, 254, - 174, 231, 41, 52, 225, 200, 52, 231, 37, 247, 74, 250, 117, 218, 223, - 116, 231, 211, 227, 21, 235, 235, 223, 144, 51, 254, 19, 224, 143, 77, - 214, 97, 243, 228, 122, 224, 166, 214, 97, 243, 228, 122, 242, 9, 214, - 97, 243, 228, 133, 224, 164, 235, 191, 224, 158, 77, 7, 6, 1, 118, 2, - 242, 113, 7, 6, 1, 118, 2, 179, 7, 6, 1, 118, 2, 249, 223, 7, 6, 1, 118, - 2, 217, 42, 7, 6, 1, 118, 2, 247, 209, 7, 6, 1, 118, 2, 223, 131, 49, 7, - 6, 1, 254, 148, 7, 6, 1, 250, 253, 2, 250, 117, 7, 6, 1, 191, 2, 242, - 113, 7, 6, 1, 191, 2, 179, 7, 6, 1, 191, 2, 249, 223, 7, 6, 1, 191, 2, - 247, 209, 7, 6, 1, 240, 146, 2, 242, 113, 7, 6, 1, 240, 146, 2, 179, 7, - 6, 1, 240, 146, 2, 249, 223, 7, 6, 1, 240, 146, 2, 247, 209, 7, 6, 1, - 245, 25, 7, 6, 1, 230, 98, 2, 217, 42, 7, 6, 1, 157, 2, 242, 113, 7, 6, - 1, 157, 2, 179, 7, 6, 1, 157, 2, 249, 223, 7, 6, 1, 157, 2, 217, 42, 7, - 6, 1, 157, 2, 247, 209, 230, 154, 52, 7, 6, 1, 157, 2, 90, 7, 6, 1, 111, - 2, 242, 113, 7, 6, 1, 111, 2, 179, 7, 6, 1, 111, 2, 249, 223, 7, 6, 1, - 111, 2, 247, 209, 7, 6, 1, 213, 106, 2, 179, 7, 6, 1, 217, 104, 7, 3, 1, - 220, 255, 197, 7, 3, 1, 118, 2, 242, 113, 7, 3, 1, 118, 2, 179, 7, 3, 1, - 118, 2, 249, 223, 7, 3, 1, 118, 2, 217, 42, 7, 3, 1, 118, 2, 247, 209, 7, - 3, 1, 118, 2, 223, 131, 49, 7, 3, 1, 254, 148, 7, 3, 1, 250, 253, 2, 250, - 117, 7, 3, 1, 191, 2, 242, 113, 7, 3, 1, 191, 2, 179, 7, 3, 1, 191, 2, - 249, 223, 7, 3, 1, 191, 2, 247, 209, 7, 3, 1, 240, 146, 2, 242, 113, 7, - 3, 1, 240, 146, 2, 179, 7, 3, 1, 240, 146, 2, 249, 223, 7, 3, 1, 240, - 146, 2, 247, 209, 7, 3, 1, 245, 25, 7, 3, 1, 230, 98, 2, 217, 42, 7, 3, - 1, 157, 2, 242, 113, 7, 3, 1, 157, 2, 179, 7, 3, 1, 157, 2, 249, 223, 7, - 3, 1, 157, 2, 217, 42, 7, 3, 1, 157, 2, 247, 209, 247, 121, 52, 7, 3, 1, - 157, 2, 90, 7, 3, 1, 111, 2, 242, 113, 7, 3, 1, 111, 2, 179, 7, 3, 1, - 111, 2, 249, 223, 7, 3, 1, 111, 2, 247, 209, 7, 3, 1, 213, 106, 2, 179, - 7, 3, 1, 217, 104, 7, 3, 1, 213, 106, 2, 247, 209, 7, 6, 1, 118, 2, 232, - 37, 7, 3, 1, 118, 2, 232, 37, 7, 6, 1, 118, 2, 251, 74, 7, 3, 1, 118, 2, - 251, 74, 7, 6, 1, 118, 2, 227, 90, 7, 3, 1, 118, 2, 227, 90, 7, 6, 1, - 250, 253, 2, 179, 7, 3, 1, 250, 253, 2, 179, 7, 6, 1, 250, 253, 2, 249, - 223, 7, 3, 1, 250, 253, 2, 249, 223, 7, 6, 1, 250, 253, 2, 62, 49, 7, 3, - 1, 250, 253, 2, 62, 49, 7, 6, 1, 250, 253, 2, 250, 166, 7, 3, 1, 250, - 253, 2, 250, 166, 7, 6, 1, 249, 4, 2, 250, 166, 7, 3, 1, 249, 4, 2, 250, - 166, 7, 6, 1, 249, 4, 2, 90, 7, 3, 1, 249, 4, 2, 90, 7, 6, 1, 191, 2, - 232, 37, 7, 3, 1, 191, 2, 232, 37, 7, 6, 1, 191, 2, 251, 74, 7, 3, 1, - 191, 2, 251, 74, 7, 6, 1, 191, 2, 62, 49, 7, 3, 1, 191, 2, 62, 49, 7, 6, - 1, 191, 2, 227, 90, 7, 3, 1, 191, 2, 227, 90, 7, 6, 1, 191, 2, 250, 166, - 7, 3, 1, 191, 2, 250, 166, 7, 6, 1, 243, 178, 2, 249, 223, 7, 3, 1, 243, - 178, 2, 249, 223, 7, 6, 1, 243, 178, 2, 251, 74, 7, 3, 1, 243, 178, 2, - 251, 74, 7, 6, 1, 243, 178, 2, 62, 49, 7, 3, 1, 243, 178, 2, 62, 49, 7, - 6, 1, 243, 178, 2, 250, 117, 7, 3, 1, 243, 178, 2, 250, 117, 7, 6, 1, - 242, 42, 2, 249, 223, 7, 3, 1, 242, 42, 2, 249, 223, 7, 6, 1, 242, 42, 2, - 90, 7, 3, 1, 242, 42, 2, 90, 7, 6, 1, 240, 146, 2, 217, 42, 7, 3, 1, 240, - 146, 2, 217, 42, 7, 6, 1, 240, 146, 2, 232, 37, 7, 3, 1, 240, 146, 2, - 232, 37, 7, 6, 1, 240, 146, 2, 251, 74, 7, 3, 1, 240, 146, 2, 251, 74, 7, - 6, 1, 240, 146, 2, 227, 90, 7, 3, 1, 240, 146, 2, 227, 90, 7, 6, 1, 240, - 146, 2, 62, 49, 7, 3, 1, 247, 73, 72, 7, 6, 26, 236, 26, 7, 3, 26, 236, - 26, 7, 6, 1, 235, 143, 2, 249, 223, 7, 3, 1, 235, 143, 2, 249, 223, 7, 6, - 1, 235, 28, 2, 250, 117, 7, 3, 1, 235, 28, 2, 250, 117, 7, 3, 1, 233, - 248, 7, 6, 1, 233, 171, 2, 179, 7, 3, 1, 233, 171, 2, 179, 7, 6, 1, 233, - 171, 2, 250, 117, 7, 3, 1, 233, 171, 2, 250, 117, 7, 6, 1, 233, 171, 2, - 250, 166, 7, 3, 1, 233, 171, 2, 250, 166, 7, 6, 1, 233, 171, 2, 231, 37, - 247, 74, 7, 3, 1, 233, 171, 2, 231, 37, 247, 74, 7, 6, 1, 233, 171, 2, - 90, 7, 3, 1, 233, 171, 2, 90, 7, 6, 1, 230, 98, 2, 179, 7, 3, 1, 230, 98, - 2, 179, 7, 6, 1, 230, 98, 2, 250, 117, 7, 3, 1, 230, 98, 2, 250, 117, 7, - 6, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230, 98, 2, 250, 166, 7, 3, 1, 230, - 98, 225, 84, 251, 7, 253, 226, 7, 6, 1, 245, 96, 7, 3, 1, 245, 96, 7, 6, - 1, 157, 2, 232, 37, 7, 3, 1, 157, 2, 232, 37, 7, 6, 1, 157, 2, 251, 74, - 7, 3, 1, 157, 2, 251, 74, 7, 6, 1, 157, 2, 51, 179, 7, 3, 1, 157, 2, 51, - 179, 7, 6, 26, 227, 99, 7, 3, 26, 227, 99, 7, 6, 1, 224, 113, 2, 179, 7, - 3, 1, 224, 113, 2, 179, 7, 6, 1, 224, 113, 2, 250, 117, 7, 3, 1, 224, - 113, 2, 250, 117, 7, 6, 1, 224, 113, 2, 250, 166, 7, 3, 1, 224, 113, 2, - 250, 166, 7, 6, 1, 223, 4, 2, 179, 7, 3, 1, 223, 4, 2, 179, 7, 6, 1, 223, - 4, 2, 249, 223, 7, 3, 1, 223, 4, 2, 249, 223, 7, 6, 1, 223, 4, 2, 250, - 117, 7, 3, 1, 223, 4, 2, 250, 117, 7, 6, 1, 223, 4, 2, 250, 166, 7, 3, 1, - 223, 4, 2, 250, 166, 7, 6, 1, 218, 100, 2, 250, 117, 7, 3, 1, 218, 100, - 2, 250, 117, 7, 6, 1, 218, 100, 2, 250, 166, 7, 3, 1, 218, 100, 2, 250, - 166, 7, 6, 1, 218, 100, 2, 90, 7, 3, 1, 218, 100, 2, 90, 7, 6, 1, 111, 2, - 217, 42, 7, 3, 1, 111, 2, 217, 42, 7, 6, 1, 111, 2, 232, 37, 7, 3, 1, - 111, 2, 232, 37, 7, 6, 1, 111, 2, 251, 74, 7, 3, 1, 111, 2, 251, 74, 7, - 6, 1, 111, 2, 223, 131, 49, 7, 3, 1, 111, 2, 223, 131, 49, 7, 6, 1, 111, - 2, 51, 179, 7, 3, 1, 111, 2, 51, 179, 7, 6, 1, 111, 2, 227, 90, 7, 3, 1, - 111, 2, 227, 90, 7, 6, 1, 214, 83, 2, 249, 223, 7, 3, 1, 214, 83, 2, 249, - 223, 7, 6, 1, 213, 106, 2, 249, 223, 7, 3, 1, 213, 106, 2, 249, 223, 7, - 6, 1, 213, 106, 2, 247, 209, 7, 6, 1, 212, 153, 2, 179, 7, 3, 1, 212, - 153, 2, 179, 7, 6, 1, 212, 153, 2, 62, 49, 7, 3, 1, 212, 153, 2, 62, 49, - 7, 6, 1, 212, 153, 2, 250, 166, 7, 3, 1, 212, 153, 2, 250, 166, 7, 3, 1, - 184, 197, 7, 3, 1, 54, 2, 90, 7, 6, 1, 54, 2, 101, 7, 6, 1, 54, 2, 216, - 224, 7, 3, 1, 54, 2, 216, 224, 7, 6, 1, 160, 189, 7, 3, 1, 160, 189, 7, - 6, 1, 227, 40, 75, 7, 6, 1, 250, 253, 2, 101, 7, 3, 1, 250, 253, 2, 101, - 7, 6, 1, 254, 124, 249, 3, 7, 6, 1, 249, 4, 2, 101, 7, 6, 1, 249, 4, 2, - 216, 224, 7, 3, 1, 249, 4, 2, 216, 224, 7, 3, 1, 216, 58, 248, 5, 7, 6, - 1, 223, 202, 74, 7, 6, 1, 222, 113, 7, 6, 1, 227, 40, 74, 7, 6, 1, 244, - 231, 2, 101, 7, 3, 1, 244, 231, 2, 101, 7, 6, 1, 243, 178, 2, 101, 7, 6, - 1, 243, 83, 7, 3, 1, 240, 193, 7, 6, 1, 235, 183, 7, 6, 1, 240, 146, 2, - 90, 7, 6, 1, 235, 28, 2, 101, 7, 3, 1, 235, 28, 2, 101, 7, 3, 1, 233, - 171, 2, 134, 7, 3, 1, 233, 124, 2, 90, 7, 6, 1, 216, 58, 183, 7, 6, 1, - 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 184, 46, 233, 60, 7, 6, 1, 157, - 2, 231, 37, 217, 42, 7, 6, 1, 157, 2, 240, 235, 7, 3, 1, 157, 2, 240, - 235, 7, 6, 1, 227, 85, 7, 3, 1, 227, 85, 7, 6, 1, 226, 230, 2, 101, 7, 3, - 1, 226, 230, 2, 101, 7, 1, 212, 205, 7, 6, 1, 160, 109, 7, 3, 1, 160, - 109, 7, 6, 1, 245, 40, 7, 1, 223, 202, 245, 41, 232, 177, 7, 3, 1, 218, - 100, 2, 226, 193, 101, 7, 6, 1, 218, 100, 2, 101, 7, 3, 1, 218, 100, 2, - 101, 7, 6, 1, 218, 100, 2, 223, 207, 101, 7, 6, 1, 111, 2, 240, 235, 7, - 3, 1, 111, 2, 240, 235, 7, 6, 1, 215, 128, 7, 6, 1, 215, 80, 2, 101, 7, - 6, 1, 213, 106, 2, 101, 7, 3, 1, 213, 106, 2, 101, 7, 6, 1, 212, 153, 2, - 90, 7, 3, 1, 212, 153, 2, 90, 7, 6, 1, 244, 232, 7, 6, 1, 244, 233, 223, - 201, 7, 3, 1, 244, 233, 223, 201, 7, 3, 1, 244, 233, 2, 218, 27, 7, 1, - 117, 2, 90, 7, 6, 1, 160, 180, 7, 3, 1, 160, 180, 7, 1, 235, 191, 242, - 156, 219, 70, 2, 90, 7, 1, 213, 169, 7, 1, 247, 254, 249, 204, 7, 1, 233, - 100, 249, 204, 7, 1, 254, 46, 249, 204, 7, 1, 223, 207, 249, 204, 7, 6, - 1, 245, 251, 2, 250, 166, 7, 6, 1, 249, 4, 2, 3, 1, 212, 153, 2, 250, - 166, 7, 3, 1, 245, 251, 2, 250, 166, 7, 6, 1, 232, 217, 7, 6, 1, 233, - 171, 2, 3, 1, 235, 142, 7, 3, 1, 232, 217, 7, 6, 1, 229, 17, 7, 6, 1, - 230, 98, 2, 3, 1, 235, 142, 7, 3, 1, 229, 17, 7, 6, 1, 118, 2, 250, 166, - 7, 3, 1, 118, 2, 250, 166, 7, 6, 1, 240, 146, 2, 250, 166, 7, 3, 1, 240, - 146, 2, 250, 166, 7, 6, 1, 157, 2, 250, 166, 7, 3, 1, 157, 2, 250, 166, - 7, 6, 1, 111, 2, 250, 166, 7, 3, 1, 111, 2, 250, 166, 7, 6, 1, 111, 2, - 247, 210, 24, 232, 37, 7, 3, 1, 111, 2, 247, 210, 24, 232, 37, 7, 6, 1, - 111, 2, 247, 210, 24, 179, 7, 3, 1, 111, 2, 247, 210, 24, 179, 7, 6, 1, - 111, 2, 247, 210, 24, 250, 166, 7, 3, 1, 111, 2, 247, 210, 24, 250, 166, - 7, 6, 1, 111, 2, 247, 210, 24, 242, 113, 7, 3, 1, 111, 2, 247, 210, 24, - 242, 113, 7, 3, 1, 216, 58, 74, 7, 6, 1, 118, 2, 247, 210, 24, 232, 37, - 7, 3, 1, 118, 2, 247, 210, 24, 232, 37, 7, 6, 1, 118, 2, 62, 78, 24, 232, - 37, 7, 3, 1, 118, 2, 62, 78, 24, 232, 37, 7, 6, 1, 254, 149, 2, 232, 37, - 7, 3, 1, 254, 149, 2, 232, 37, 7, 6, 1, 243, 178, 2, 90, 7, 3, 1, 243, - 178, 2, 90, 7, 6, 1, 243, 178, 2, 250, 166, 7, 3, 1, 243, 178, 2, 250, - 166, 7, 6, 1, 235, 28, 2, 250, 166, 7, 3, 1, 235, 28, 2, 250, 166, 7, 6, - 1, 157, 2, 227, 90, 7, 3, 1, 157, 2, 227, 90, 7, 6, 1, 157, 2, 227, 91, - 24, 232, 37, 7, 3, 1, 157, 2, 227, 91, 24, 232, 37, 7, 6, 1, 244, 233, 2, - 250, 166, 7, 3, 1, 244, 233, 2, 250, 166, 7, 3, 1, 235, 143, 2, 250, 166, - 7, 6, 1, 245, 250, 7, 6, 1, 249, 4, 2, 3, 1, 212, 152, 7, 3, 1, 245, 250, - 7, 6, 1, 243, 178, 2, 179, 7, 3, 1, 243, 178, 2, 179, 7, 6, 1, 240, 191, - 7, 6, 1, 213, 169, 7, 6, 1, 230, 98, 2, 242, 113, 7, 3, 1, 230, 98, 2, - 242, 113, 7, 6, 1, 118, 2, 223, 131, 78, 24, 179, 7, 3, 1, 118, 2, 223, - 131, 78, 24, 179, 7, 6, 1, 254, 149, 2, 179, 7, 3, 1, 254, 149, 2, 179, - 7, 6, 1, 157, 2, 219, 45, 24, 179, 7, 3, 1, 157, 2, 219, 45, 24, 179, 7, - 6, 1, 118, 2, 51, 242, 113, 7, 3, 1, 118, 2, 51, 242, 113, 7, 6, 1, 118, - 2, 235, 191, 251, 74, 7, 3, 1, 118, 2, 235, 191, 251, 74, 7, 6, 1, 191, - 2, 51, 242, 113, 7, 3, 1, 191, 2, 51, 242, 113, 7, 6, 1, 191, 2, 235, - 191, 251, 74, 7, 3, 1, 191, 2, 235, 191, 251, 74, 7, 6, 1, 240, 146, 2, - 51, 242, 113, 7, 3, 1, 240, 146, 2, 51, 242, 113, 7, 6, 1, 240, 146, 2, - 235, 191, 251, 74, 7, 3, 1, 240, 146, 2, 235, 191, 251, 74, 7, 6, 1, 157, - 2, 51, 242, 113, 7, 3, 1, 157, 2, 51, 242, 113, 7, 6, 1, 157, 2, 235, - 191, 251, 74, 7, 3, 1, 157, 2, 235, 191, 251, 74, 7, 6, 1, 224, 113, 2, - 51, 242, 113, 7, 3, 1, 224, 113, 2, 51, 242, 113, 7, 6, 1, 224, 113, 2, - 235, 191, 251, 74, 7, 3, 1, 224, 113, 2, 235, 191, 251, 74, 7, 6, 1, 111, - 2, 51, 242, 113, 7, 3, 1, 111, 2, 51, 242, 113, 7, 6, 1, 111, 2, 235, - 191, 251, 74, 7, 3, 1, 111, 2, 235, 191, 251, 74, 7, 6, 1, 223, 4, 2, - 249, 158, 55, 7, 3, 1, 223, 4, 2, 249, 158, 55, 7, 6, 1, 218, 100, 2, - 249, 158, 55, 7, 3, 1, 218, 100, 2, 249, 158, 55, 7, 6, 1, 212, 222, 7, - 3, 1, 212, 222, 7, 6, 1, 242, 42, 2, 250, 166, 7, 3, 1, 242, 42, 2, 250, - 166, 7, 6, 1, 230, 98, 2, 184, 46, 233, 60, 7, 3, 1, 249, 4, 2, 249, 41, - 7, 6, 1, 227, 2, 7, 3, 1, 227, 2, 7, 6, 1, 212, 153, 2, 101, 7, 3, 1, - 212, 153, 2, 101, 7, 6, 1, 118, 2, 62, 49, 7, 3, 1, 118, 2, 62, 49, 7, 6, - 1, 191, 2, 250, 117, 7, 3, 1, 191, 2, 250, 117, 7, 6, 1, 157, 2, 247, - 210, 24, 232, 37, 7, 3, 1, 157, 2, 247, 210, 24, 232, 37, 7, 6, 1, 157, - 2, 217, 43, 24, 232, 37, 7, 3, 1, 157, 2, 217, 43, 24, 232, 37, 7, 6, 1, - 157, 2, 62, 49, 7, 3, 1, 157, 2, 62, 49, 7, 6, 1, 157, 2, 62, 78, 24, - 232, 37, 7, 3, 1, 157, 2, 62, 78, 24, 232, 37, 7, 6, 1, 213, 106, 2, 232, - 37, 7, 3, 1, 213, 106, 2, 232, 37, 7, 3, 1, 233, 171, 2, 249, 41, 7, 3, - 1, 230, 98, 2, 249, 41, 7, 3, 1, 218, 100, 2, 249, 41, 7, 3, 1, 247, 73, - 235, 142, 7, 3, 1, 248, 89, 247, 172, 7, 3, 1, 224, 176, 247, 172, 7, 6, - 1, 118, 2, 90, 7, 6, 1, 250, 253, 2, 90, 7, 3, 1, 250, 253, 2, 90, 7, 6, - 1, 233, 171, 2, 134, 7, 6, 1, 218, 100, 2, 247, 207, 90, 7, 3, 1, 223, 4, - 2, 218, 195, 218, 27, 7, 3, 1, 212, 153, 2, 218, 195, 218, 27, 7, 6, 1, - 242, 156, 219, 69, 7, 3, 1, 242, 156, 219, 69, 7, 6, 1, 54, 2, 90, 7, 6, - 1, 111, 134, 7, 6, 1, 216, 58, 215, 79, 7, 6, 1, 191, 2, 90, 7, 3, 1, - 191, 2, 90, 7, 6, 1, 235, 143, 2, 90, 7, 3, 1, 235, 143, 2, 90, 7, 6, 1, - 3, 224, 241, 2, 241, 38, 218, 27, 7, 3, 1, 224, 241, 2, 241, 38, 218, 27, - 7, 6, 1, 224, 113, 2, 90, 7, 3, 1, 224, 113, 2, 90, 7, 6, 1, 213, 106, 2, - 90, 7, 3, 1, 213, 106, 2, 90, 7, 3, 1, 216, 58, 61, 7, 3, 1, 254, 52, 7, - 3, 1, 216, 58, 254, 52, 7, 3, 1, 54, 2, 101, 7, 3, 1, 227, 40, 75, 7, 3, - 1, 250, 253, 2, 249, 41, 7, 3, 1, 249, 4, 2, 218, 27, 7, 3, 1, 249, 4, 2, - 101, 7, 3, 1, 223, 202, 74, 7, 3, 1, 222, 113, 7, 3, 1, 222, 114, 2, 101, - 7, 3, 1, 227, 40, 74, 7, 3, 1, 223, 202, 227, 40, 74, 7, 3, 1, 223, 202, - 227, 40, 191, 2, 101, 7, 3, 1, 249, 193, 223, 202, 227, 40, 74, 7, 3, 1, - 247, 73, 235, 143, 2, 90, 7, 3, 1, 243, 178, 2, 101, 7, 3, 1, 113, 243, - 177, 7, 1, 3, 6, 243, 177, 7, 3, 1, 243, 83, 7, 3, 1, 224, 43, 240, 235, - 7, 3, 1, 216, 58, 242, 41, 7, 3, 1, 242, 42, 2, 101, 7, 3, 1, 241, 192, - 2, 101, 7, 3, 1, 240, 146, 2, 90, 7, 3, 1, 235, 183, 7, 1, 3, 6, 72, 7, - 3, 1, 233, 171, 2, 231, 37, 217, 42, 7, 3, 1, 233, 171, 2, 251, 218, 7, - 3, 1, 233, 171, 2, 223, 207, 101, 7, 3, 1, 233, 27, 7, 3, 1, 216, 58, - 183, 7, 3, 1, 216, 58, 232, 110, 2, 184, 233, 60, 7, 3, 1, 232, 110, 2, - 101, 7, 3, 1, 230, 98, 2, 42, 101, 7, 3, 1, 230, 98, 2, 223, 207, 101, 7, - 1, 3, 6, 204, 7, 3, 1, 252, 54, 75, 7, 1, 3, 6, 227, 99, 7, 3, 1, 249, - 193, 227, 67, 7, 3, 1, 226, 9, 7, 3, 1, 216, 58, 149, 7, 3, 1, 216, 58, - 224, 113, 2, 184, 233, 60, 7, 3, 1, 216, 58, 224, 113, 2, 101, 7, 3, 1, - 224, 113, 2, 184, 233, 60, 7, 3, 1, 224, 113, 2, 218, 27, 7, 3, 1, 224, - 113, 2, 244, 56, 7, 3, 1, 223, 202, 224, 113, 2, 244, 56, 7, 1, 3, 6, - 149, 7, 1, 3, 6, 235, 191, 149, 7, 3, 1, 223, 4, 2, 101, 7, 3, 1, 245, - 40, 7, 3, 1, 247, 73, 235, 143, 2, 219, 45, 24, 101, 7, 3, 1, 219, 163, - 223, 202, 245, 40, 7, 3, 1, 245, 41, 2, 249, 41, 7, 3, 1, 216, 58, 218, - 99, 7, 3, 1, 218, 100, 2, 223, 207, 101, 7, 3, 1, 111, 134, 7, 3, 1, 215, - 128, 7, 3, 1, 215, 80, 2, 101, 7, 3, 1, 216, 58, 215, 79, 7, 3, 1, 216, - 58, 214, 82, 7, 3, 1, 216, 58, 213, 105, 7, 1, 3, 6, 213, 105, 7, 3, 1, - 212, 153, 2, 223, 207, 101, 7, 3, 1, 212, 153, 2, 249, 41, 7, 3, 1, 244, - 232, 7, 3, 1, 244, 233, 2, 249, 41, 7, 1, 242, 156, 219, 69, 7, 1, 226, - 15, 214, 116, 243, 219, 7, 1, 235, 191, 242, 156, 219, 69, 7, 1, 219, 50, - 250, 252, 7, 1, 251, 169, 249, 204, 7, 1, 3, 6, 253, 74, 7, 3, 1, 249, - 193, 227, 40, 74, 7, 1, 3, 6, 243, 178, 2, 101, 7, 1, 3, 6, 242, 41, 7, - 3, 1, 235, 143, 2, 249, 67, 7, 3, 1, 216, 58, 235, 27, 7, 1, 3, 6, 150, - 7, 3, 1, 224, 241, 2, 101, 7, 1, 242, 156, 219, 70, 2, 90, 7, 1, 223, - 202, 242, 156, 219, 70, 2, 90, 7, 3, 1, 245, 251, 247, 172, 7, 3, 1, 247, - 233, 247, 172, 7, 3, 1, 245, 251, 247, 173, 2, 249, 41, 7, 3, 1, 216, - 143, 247, 172, 7, 3, 1, 217, 188, 247, 172, 7, 3, 1, 217, 236, 247, 173, - 2, 249, 41, 7, 3, 1, 244, 103, 247, 172, 7, 3, 1, 232, 158, 247, 172, 7, - 3, 1, 232, 111, 247, 172, 7, 1, 251, 169, 226, 56, 7, 1, 251, 177, 226, - 56, 7, 3, 1, 216, 58, 242, 42, 2, 244, 56, 7, 3, 1, 216, 58, 242, 42, 2, - 244, 57, 24, 218, 27, 59, 1, 3, 242, 41, 59, 1, 3, 242, 42, 2, 101, 59, - 1, 3, 235, 142, 59, 1, 3, 149, 59, 1, 3, 216, 58, 149, 59, 1, 3, 216, 58, - 224, 113, 2, 101, 59, 1, 3, 6, 235, 191, 149, 59, 1, 3, 214, 82, 59, 1, - 3, 213, 105, 59, 1, 225, 71, 59, 1, 51, 225, 71, 59, 1, 216, 58, 249, - 157, 59, 1, 253, 226, 59, 1, 223, 202, 249, 157, 59, 1, 46, 151, 223, - 130, 59, 1, 42, 151, 223, 130, 59, 1, 242, 156, 219, 69, 59, 1, 223, 202, - 242, 156, 219, 69, 59, 1, 42, 253, 164, 59, 1, 46, 253, 164, 59, 1, 114, - 253, 164, 59, 1, 119, 253, 164, 59, 1, 249, 224, 254, 174, 250, 166, 59, - 1, 71, 232, 242, 59, 1, 232, 37, 59, 1, 254, 164, 254, 174, 59, 1, 242, - 114, 254, 174, 59, 1, 115, 71, 232, 242, 59, 1, 115, 232, 37, 59, 1, 115, - 242, 114, 254, 174, 59, 1, 115, 254, 164, 254, 174, 59, 1, 216, 180, 249, - 164, 59, 1, 151, 216, 180, 249, 164, 59, 1, 250, 107, 46, 151, 223, 130, - 59, 1, 250, 107, 42, 151, 223, 130, 59, 1, 114, 218, 36, 59, 1, 119, 218, - 36, 59, 1, 94, 52, 59, 1, 230, 251, 52, 251, 74, 62, 49, 223, 131, 49, - 227, 90, 3, 217, 42, 51, 254, 164, 254, 174, 59, 1, 223, 189, 101, 59, 1, - 249, 71, 254, 174, 59, 1, 3, 243, 83, 59, 1, 3, 150, 59, 1, 3, 197, 59, - 1, 3, 213, 166, 59, 1, 3, 223, 202, 242, 156, 219, 69, 59, 1, 244, 244, - 160, 134, 59, 1, 124, 160, 134, 59, 1, 231, 38, 160, 134, 59, 1, 115, - 160, 134, 59, 1, 244, 243, 160, 134, 59, 1, 212, 245, 247, 251, 160, 77, - 59, 1, 213, 59, 247, 251, 160, 77, 59, 1, 214, 114, 59, 1, 215, 156, 59, - 1, 51, 253, 226, 59, 1, 115, 119, 253, 164, 59, 1, 115, 114, 253, 164, - 59, 1, 115, 42, 253, 164, 59, 1, 115, 46, 253, 164, 59, 1, 115, 223, 130, - 59, 1, 231, 37, 242, 114, 254, 174, 59, 1, 231, 37, 51, 242, 114, 254, - 174, 59, 1, 231, 37, 51, 254, 164, 254, 174, 59, 1, 115, 217, 42, 59, 1, - 224, 48, 249, 164, 59, 1, 251, 234, 124, 216, 241, 59, 1, 245, 101, 124, - 216, 241, 59, 1, 251, 234, 115, 216, 241, 59, 1, 245, 101, 115, 216, 241, - 59, 1, 220, 234, 59, 1, 227, 40, 220, 234, 59, 1, 115, 42, 68, 37, 242, - 114, 254, 174, 37, 254, 164, 254, 174, 37, 249, 224, 254, 174, 37, 217, - 42, 37, 232, 37, 37, 226, 243, 37, 251, 74, 37, 62, 49, 37, 247, 209, 37, - 241, 38, 49, 37, 223, 131, 49, 37, 51, 254, 164, 254, 174, 37, 250, 166, - 37, 71, 232, 243, 49, 37, 51, 71, 232, 243, 49, 37, 51, 242, 114, 254, - 174, 37, 250, 187, 37, 235, 191, 251, 74, 37, 216, 58, 249, 158, 49, 37, - 249, 158, 49, 37, 223, 202, 249, 158, 49, 37, 249, 158, 78, 223, 148, 37, - 242, 114, 254, 175, 55, 37, 254, 164, 254, 175, 55, 37, 42, 218, 37, 55, - 37, 46, 218, 37, 55, 37, 42, 254, 19, 49, 37, 240, 235, 37, 42, 151, 223, - 131, 55, 37, 114, 218, 37, 55, 37, 119, 218, 37, 55, 37, 94, 5, 55, 37, - 230, 251, 5, 55, 37, 226, 191, 241, 38, 55, 37, 223, 207, 241, 38, 55, - 37, 62, 55, 37, 247, 210, 55, 37, 223, 131, 55, 37, 249, 158, 55, 37, - 250, 117, 37, 227, 90, 37, 71, 232, 243, 55, 37, 251, 68, 55, 37, 235, - 191, 51, 253, 194, 55, 37, 250, 167, 55, 37, 249, 224, 254, 175, 55, 37, - 251, 75, 55, 37, 235, 191, 251, 75, 55, 37, 217, 43, 55, 37, 232, 38, 55, - 37, 115, 232, 242, 37, 51, 115, 232, 242, 37, 217, 43, 226, 244, 37, 220, - 175, 219, 45, 226, 244, 37, 184, 219, 45, 226, 244, 37, 220, 175, 219, - 232, 226, 244, 37, 184, 219, 232, 226, 244, 37, 46, 151, 223, 131, 55, - 37, 235, 191, 251, 68, 55, 37, 41, 55, 37, 222, 99, 55, 37, 213, 167, 49, - 37, 71, 217, 42, 37, 51, 226, 243, 37, 242, 114, 160, 77, 37, 254, 164, - 160, 77, 37, 25, 226, 50, 37, 25, 234, 11, 37, 25, 247, 204, 216, 231, - 37, 25, 212, 210, 37, 251, 68, 49, 37, 245, 61, 5, 55, 37, 51, 71, 232, - 243, 55, 37, 42, 254, 19, 55, 37, 228, 163, 217, 43, 49, 37, 241, 44, 49, - 37, 254, 57, 123, 211, 211, 49, 37, 42, 46, 76, 55, 37, 215, 124, 76, 55, - 37, 242, 118, 235, 66, 37, 46, 253, 165, 49, 37, 42, 151, 223, 131, 49, - 37, 244, 100, 37, 213, 167, 55, 37, 42, 253, 165, 55, 37, 46, 253, 165, - 55, 37, 46, 253, 165, 24, 114, 253, 165, 55, 37, 46, 151, 223, 131, 49, - 37, 62, 78, 223, 148, 37, 253, 133, 55, 37, 51, 223, 131, 55, 37, 212, - 28, 49, 37, 51, 251, 75, 55, 37, 51, 251, 74, 37, 51, 232, 37, 37, 51, - 232, 38, 55, 37, 51, 217, 42, 37, 51, 235, 191, 251, 74, 37, 51, 95, 76, - 55, 37, 7, 3, 1, 61, 37, 7, 3, 1, 74, 37, 7, 3, 1, 72, 37, 7, 3, 1, 75, - 37, 7, 3, 1, 69, 37, 7, 3, 1, 250, 252, 37, 7, 3, 1, 249, 3, 37, 7, 3, 1, - 242, 41, 37, 7, 3, 1, 183, 37, 7, 3, 1, 149, 37, 7, 3, 1, 218, 99, 37, 7, - 3, 1, 215, 79, 37, 7, 3, 1, 213, 166, 25, 6, 1, 241, 181, 25, 3, 1, 241, - 181, 25, 6, 1, 253, 193, 222, 161, 25, 3, 1, 253, 193, 222, 161, 25, 228, - 54, 52, 25, 232, 163, 228, 54, 52, 25, 6, 1, 226, 178, 247, 179, 25, 3, - 1, 226, 178, 247, 179, 25, 212, 210, 25, 3, 223, 202, 232, 141, 220, 104, - 87, 25, 3, 246, 72, 232, 141, 220, 104, 87, 25, 3, 223, 202, 246, 72, - 232, 141, 220, 104, 87, 25, 224, 158, 77, 25, 216, 231, 25, 247, 204, - 216, 231, 25, 6, 1, 254, 53, 2, 216, 231, 25, 254, 8, 217, 211, 25, 6, 1, - 245, 64, 2, 216, 231, 25, 6, 1, 245, 29, 2, 216, 231, 25, 6, 1, 235, 184, - 2, 216, 231, 25, 6, 1, 227, 66, 2, 216, 231, 25, 6, 1, 215, 129, 2, 216, - 231, 25, 6, 1, 227, 68, 2, 216, 231, 25, 3, 1, 235, 184, 2, 247, 204, 24, - 216, 231, 25, 6, 1, 254, 52, 25, 6, 1, 251, 203, 25, 6, 1, 243, 83, 25, - 6, 1, 248, 5, 25, 6, 1, 245, 63, 25, 6, 1, 212, 78, 25, 6, 1, 245, 28, - 25, 6, 1, 217, 132, 25, 6, 1, 235, 183, 25, 6, 1, 234, 227, 25, 6, 1, - 233, 122, 25, 6, 1, 230, 172, 25, 6, 1, 228, 92, 25, 6, 1, 213, 145, 25, - 6, 1, 227, 65, 25, 6, 1, 225, 240, 25, 6, 1, 223, 190, 25, 6, 1, 220, - 103, 25, 6, 1, 217, 248, 25, 6, 1, 215, 128, 25, 6, 1, 226, 9, 25, 6, 1, - 250, 47, 25, 6, 1, 225, 46, 25, 6, 1, 227, 67, 25, 6, 1, 235, 184, 2, - 247, 203, 25, 6, 1, 215, 129, 2, 247, 203, 25, 3, 1, 254, 53, 2, 216, - 231, 25, 3, 1, 245, 64, 2, 216, 231, 25, 3, 1, 245, 29, 2, 216, 231, 25, - 3, 1, 235, 184, 2, 216, 231, 25, 3, 1, 215, 129, 2, 247, 204, 24, 216, - 231, 25, 3, 1, 254, 52, 25, 3, 1, 251, 203, 25, 3, 1, 243, 83, 25, 3, 1, - 248, 5, 25, 3, 1, 245, 63, 25, 3, 1, 212, 78, 25, 3, 1, 245, 28, 25, 3, - 1, 217, 132, 25, 3, 1, 235, 183, 25, 3, 1, 234, 227, 25, 3, 1, 233, 122, - 25, 3, 1, 230, 172, 25, 3, 1, 228, 92, 25, 3, 1, 213, 145, 25, 3, 1, 227, - 65, 25, 3, 1, 225, 240, 25, 3, 1, 223, 190, 25, 3, 1, 40, 220, 103, 25, - 3, 1, 220, 103, 25, 3, 1, 217, 248, 25, 3, 1, 215, 128, 25, 3, 1, 226, 9, - 25, 3, 1, 250, 47, 25, 3, 1, 225, 46, 25, 3, 1, 227, 67, 25, 3, 1, 235, - 184, 2, 247, 203, 25, 3, 1, 215, 129, 2, 247, 203, 25, 3, 1, 227, 66, 2, - 216, 231, 25, 3, 1, 215, 129, 2, 216, 231, 25, 3, 1, 227, 68, 2, 216, - 231, 25, 6, 234, 251, 87, 25, 251, 204, 87, 25, 217, 133, 87, 25, 215, - 129, 2, 241, 38, 87, 25, 215, 129, 2, 254, 164, 24, 241, 38, 87, 25, 215, - 129, 2, 247, 210, 24, 241, 38, 87, 25, 226, 10, 87, 25, 225, 241, 87, 25, - 234, 251, 87, 25, 1, 253, 193, 234, 15, 25, 3, 1, 253, 193, 234, 15, 25, - 1, 219, 77, 25, 3, 1, 219, 77, 25, 1, 247, 179, 25, 3, 1, 247, 179, 25, - 1, 234, 15, 25, 3, 1, 234, 15, 25, 1, 222, 161, 25, 3, 1, 222, 161, 79, - 6, 1, 220, 235, 79, 3, 1, 220, 235, 79, 6, 1, 244, 109, 79, 3, 1, 244, - 109, 79, 6, 1, 234, 123, 79, 3, 1, 234, 123, 79, 6, 1, 241, 32, 79, 3, 1, - 241, 32, 79, 6, 1, 243, 78, 79, 3, 1, 243, 78, 79, 6, 1, 220, 202, 79, 3, - 1, 220, 202, 79, 6, 1, 248, 20, 79, 3, 1, 248, 20, 25, 234, 228, 87, 25, - 223, 191, 87, 25, 232, 141, 220, 104, 87, 25, 1, 212, 215, 25, 6, 217, - 133, 87, 25, 232, 141, 245, 64, 87, 25, 223, 202, 232, 141, 245, 64, 87, - 25, 6, 1, 220, 187, 25, 3, 1, 220, 187, 25, 6, 232, 141, 220, 104, 87, - 25, 6, 1, 222, 159, 25, 3, 1, 222, 159, 25, 223, 191, 2, 219, 45, 87, 25, - 6, 223, 202, 232, 141, 220, 104, 87, 25, 6, 246, 72, 232, 141, 220, 104, - 87, 25, 6, 223, 202, 246, 72, 232, 141, 220, 104, 87, 33, 6, 1, 236, 56, - 2, 242, 113, 33, 6, 1, 235, 187, 33, 6, 1, 247, 114, 33, 6, 1, 242, 163, - 33, 6, 1, 215, 172, 236, 55, 33, 6, 1, 245, 247, 33, 6, 1, 251, 5, 72, - 33, 6, 1, 212, 255, 33, 6, 1, 235, 127, 33, 6, 1, 232, 216, 33, 6, 1, - 229, 9, 33, 6, 1, 216, 132, 33, 6, 1, 234, 57, 33, 6, 1, 240, 146, 2, - 242, 113, 33, 6, 1, 220, 175, 69, 33, 6, 1, 245, 243, 33, 6, 1, 61, 33, - 6, 1, 251, 251, 33, 6, 1, 214, 232, 33, 6, 1, 242, 212, 33, 6, 1, 248, - 41, 33, 6, 1, 236, 55, 33, 6, 1, 212, 67, 33, 6, 1, 212, 87, 33, 6, 1, - 72, 33, 6, 1, 220, 175, 72, 33, 6, 1, 181, 33, 6, 1, 245, 131, 33, 6, 1, - 245, 117, 33, 6, 1, 245, 108, 33, 6, 1, 75, 33, 6, 1, 226, 96, 33, 6, 1, - 245, 55, 33, 6, 1, 245, 45, 33, 6, 1, 217, 229, 33, 6, 1, 69, 33, 6, 1, - 245, 159, 33, 6, 1, 159, 33, 6, 1, 216, 136, 33, 6, 1, 250, 67, 33, 6, 1, - 221, 24, 33, 6, 1, 220, 245, 33, 6, 1, 241, 242, 52, 33, 6, 1, 213, 18, - 33, 6, 1, 219, 236, 52, 33, 6, 1, 74, 33, 6, 1, 212, 203, 33, 6, 1, 186, - 33, 3, 1, 61, 33, 3, 1, 251, 251, 33, 3, 1, 214, 232, 33, 3, 1, 242, 212, - 33, 3, 1, 248, 41, 33, 3, 1, 236, 55, 33, 3, 1, 212, 67, 33, 3, 1, 212, - 87, 33, 3, 1, 72, 33, 3, 1, 220, 175, 72, 33, 3, 1, 181, 33, 3, 1, 245, - 131, 33, 3, 1, 245, 117, 33, 3, 1, 245, 108, 33, 3, 1, 75, 33, 3, 1, 226, - 96, 33, 3, 1, 245, 55, 33, 3, 1, 245, 45, 33, 3, 1, 217, 229, 33, 3, 1, - 69, 33, 3, 1, 245, 159, 33, 3, 1, 159, 33, 3, 1, 216, 136, 33, 3, 1, 250, - 67, 33, 3, 1, 221, 24, 33, 3, 1, 220, 245, 33, 3, 1, 241, 242, 52, 33, 3, - 1, 213, 18, 33, 3, 1, 219, 236, 52, 33, 3, 1, 74, 33, 3, 1, 212, 203, 33, - 3, 1, 186, 33, 3, 1, 236, 56, 2, 242, 113, 33, 3, 1, 235, 187, 33, 3, 1, - 247, 114, 33, 3, 1, 242, 163, 33, 3, 1, 215, 172, 236, 55, 33, 3, 1, 245, - 247, 33, 3, 1, 251, 5, 72, 33, 3, 1, 212, 255, 33, 3, 1, 235, 127, 33, 3, - 1, 232, 216, 33, 3, 1, 229, 9, 33, 3, 1, 216, 132, 33, 3, 1, 234, 57, 33, - 3, 1, 240, 146, 2, 242, 113, 33, 3, 1, 220, 175, 69, 33, 3, 1, 245, 243, - 33, 6, 1, 227, 67, 33, 3, 1, 227, 67, 33, 6, 1, 213, 49, 33, 3, 1, 213, - 49, 33, 6, 1, 235, 181, 74, 33, 3, 1, 235, 181, 74, 33, 6, 1, 232, 221, - 212, 174, 33, 3, 1, 232, 221, 212, 174, 33, 6, 1, 235, 181, 232, 221, - 212, 174, 33, 3, 1, 235, 181, 232, 221, 212, 174, 33, 6, 1, 251, 172, - 212, 174, 33, 3, 1, 251, 172, 212, 174, 33, 6, 1, 235, 181, 251, 172, - 212, 174, 33, 3, 1, 235, 181, 251, 172, 212, 174, 33, 6, 1, 233, 242, 33, - 3, 1, 233, 242, 33, 6, 1, 225, 46, 33, 3, 1, 225, 46, 33, 6, 1, 244, 51, - 33, 3, 1, 244, 51, 33, 6, 1, 235, 144, 33, 3, 1, 235, 144, 33, 6, 1, 235, - 145, 2, 51, 242, 114, 254, 174, 33, 3, 1, 235, 145, 2, 51, 242, 114, 254, - 174, 33, 6, 1, 215, 175, 33, 3, 1, 215, 175, 33, 6, 1, 223, 87, 227, 67, - 33, 3, 1, 223, 87, 227, 67, 33, 6, 1, 227, 68, 2, 217, 18, 33, 3, 1, 227, - 68, 2, 217, 18, 33, 6, 1, 227, 8, 33, 3, 1, 227, 8, 33, 6, 1, 234, 15, - 33, 3, 1, 234, 15, 33, 217, 99, 52, 37, 33, 217, 18, 37, 33, 226, 192, - 37, 33, 207, 225, 152, 37, 33, 225, 40, 225, 152, 37, 33, 225, 137, 37, - 33, 240, 201, 217, 99, 52, 37, 33, 231, 4, 52, 33, 6, 1, 220, 175, 240, - 146, 2, 218, 27, 33, 3, 1, 220, 175, 240, 146, 2, 218, 27, 33, 6, 1, 221, - 66, 52, 33, 3, 1, 221, 66, 52, 33, 6, 1, 245, 56, 2, 217, 68, 33, 3, 1, - 245, 56, 2, 217, 68, 33, 6, 1, 242, 213, 2, 215, 127, 33, 3, 1, 242, 213, - 2, 215, 127, 33, 6, 1, 242, 213, 2, 90, 33, 3, 1, 242, 213, 2, 90, 33, 6, - 1, 242, 213, 2, 231, 37, 101, 33, 3, 1, 242, 213, 2, 231, 37, 101, 33, 6, - 1, 212, 68, 2, 247, 246, 33, 3, 1, 212, 68, 2, 247, 246, 33, 6, 1, 212, - 88, 2, 247, 246, 33, 3, 1, 212, 88, 2, 247, 246, 33, 6, 1, 235, 17, 2, - 247, 246, 33, 3, 1, 235, 17, 2, 247, 246, 33, 6, 1, 235, 17, 2, 71, 90, - 33, 3, 1, 235, 17, 2, 71, 90, 33, 6, 1, 235, 17, 2, 90, 33, 3, 1, 235, - 17, 2, 90, 33, 6, 1, 252, 44, 181, 33, 3, 1, 252, 44, 181, 33, 6, 1, 245, - 109, 2, 247, 246, 33, 3, 1, 245, 109, 2, 247, 246, 33, 6, 26, 245, 109, - 242, 212, 33, 3, 26, 245, 109, 242, 212, 33, 6, 1, 226, 97, 2, 231, 37, - 101, 33, 3, 1, 226, 97, 2, 231, 37, 101, 33, 6, 1, 254, 180, 159, 33, 3, - 1, 254, 180, 159, 33, 6, 1, 245, 46, 2, 247, 246, 33, 3, 1, 245, 46, 2, - 247, 246, 33, 6, 1, 217, 230, 2, 247, 246, 33, 3, 1, 217, 230, 2, 247, - 246, 33, 6, 1, 219, 61, 69, 33, 3, 1, 219, 61, 69, 33, 6, 1, 219, 61, - 111, 2, 90, 33, 3, 1, 219, 61, 111, 2, 90, 33, 6, 1, 242, 30, 2, 247, - 246, 33, 3, 1, 242, 30, 2, 247, 246, 33, 6, 26, 217, 230, 216, 136, 33, - 3, 26, 217, 230, 216, 136, 33, 6, 1, 250, 68, 2, 247, 246, 33, 3, 1, 250, - 68, 2, 247, 246, 33, 6, 1, 250, 68, 2, 71, 90, 33, 3, 1, 250, 68, 2, 71, - 90, 33, 6, 1, 220, 213, 33, 3, 1, 220, 213, 33, 6, 1, 254, 180, 250, 67, - 33, 3, 1, 254, 180, 250, 67, 33, 6, 1, 254, 180, 250, 68, 2, 247, 246, - 33, 3, 1, 254, 180, 250, 68, 2, 247, 246, 33, 1, 226, 185, 33, 6, 1, 212, - 68, 2, 251, 74, 33, 3, 1, 212, 68, 2, 251, 74, 33, 6, 1, 235, 17, 2, 101, - 33, 3, 1, 235, 17, 2, 101, 33, 6, 1, 245, 132, 2, 218, 27, 33, 3, 1, 245, - 132, 2, 218, 27, 33, 6, 1, 245, 109, 2, 101, 33, 3, 1, 245, 109, 2, 101, - 33, 6, 1, 245, 109, 2, 218, 27, 33, 3, 1, 245, 109, 2, 218, 27, 33, 6, 1, - 234, 133, 250, 67, 33, 3, 1, 234, 133, 250, 67, 33, 6, 1, 245, 118, 2, - 218, 27, 33, 3, 1, 245, 118, 2, 218, 27, 33, 3, 1, 226, 185, 33, 6, 1, - 118, 2, 251, 74, 33, 3, 1, 118, 2, 251, 74, 33, 6, 1, 118, 2, 247, 209, - 33, 3, 1, 118, 2, 247, 209, 33, 6, 26, 118, 236, 55, 33, 3, 26, 118, 236, - 55, 33, 6, 1, 236, 56, 2, 251, 74, 33, 3, 1, 236, 56, 2, 251, 74, 33, 6, - 1, 222, 113, 33, 3, 1, 222, 113, 33, 6, 1, 222, 114, 2, 247, 209, 33, 3, - 1, 222, 114, 2, 247, 209, 33, 6, 1, 212, 68, 2, 247, 209, 33, 3, 1, 212, - 68, 2, 247, 209, 33, 6, 1, 212, 88, 2, 247, 209, 33, 3, 1, 212, 88, 2, - 247, 209, 33, 6, 1, 254, 180, 245, 247, 33, 3, 1, 254, 180, 245, 247, 33, - 6, 1, 240, 146, 2, 232, 37, 33, 3, 1, 240, 146, 2, 232, 37, 33, 6, 1, - 240, 146, 2, 247, 209, 33, 3, 1, 240, 146, 2, 247, 209, 33, 6, 1, 157, 2, - 247, 209, 33, 3, 1, 157, 2, 247, 209, 33, 6, 1, 252, 54, 75, 33, 3, 1, - 252, 54, 75, 33, 6, 1, 252, 54, 157, 2, 247, 209, 33, 3, 1, 252, 54, 157, - 2, 247, 209, 33, 6, 1, 191, 2, 247, 209, 33, 3, 1, 191, 2, 247, 209, 33, - 6, 1, 111, 2, 232, 37, 33, 3, 1, 111, 2, 232, 37, 33, 6, 1, 111, 2, 247, - 209, 33, 3, 1, 111, 2, 247, 209, 33, 6, 1, 111, 2, 51, 179, 33, 3, 1, - 111, 2, 51, 179, 33, 6, 1, 250, 68, 2, 247, 209, 33, 3, 1, 250, 68, 2, - 247, 209, 33, 6, 1, 242, 213, 2, 247, 246, 33, 3, 1, 242, 213, 2, 247, - 246, 33, 6, 1, 213, 19, 2, 247, 209, 33, 3, 1, 213, 19, 2, 247, 209, 33, - 6, 1, 242, 213, 2, 219, 45, 24, 101, 33, 3, 1, 242, 213, 2, 219, 45, 24, - 101, 33, 6, 1, 242, 30, 2, 101, 33, 3, 1, 242, 30, 2, 101, 33, 6, 1, 242, - 30, 2, 90, 33, 3, 1, 242, 30, 2, 90, 33, 6, 1, 234, 23, 248, 41, 33, 3, - 1, 234, 23, 248, 41, 33, 6, 1, 234, 23, 247, 114, 33, 3, 1, 234, 23, 247, - 114, 33, 6, 1, 234, 23, 212, 20, 33, 3, 1, 234, 23, 212, 20, 33, 6, 1, - 234, 23, 245, 241, 33, 3, 1, 234, 23, 245, 241, 33, 6, 1, 234, 23, 232, - 216, 33, 3, 1, 234, 23, 232, 216, 33, 6, 1, 234, 23, 229, 9, 33, 3, 1, - 234, 23, 229, 9, 33, 6, 1, 234, 23, 220, 37, 33, 3, 1, 234, 23, 220, 37, - 33, 6, 1, 234, 23, 217, 13, 33, 3, 1, 234, 23, 217, 13, 33, 6, 1, 223, - 202, 212, 87, 33, 3, 1, 223, 202, 212, 87, 33, 6, 1, 245, 132, 2, 101, - 33, 3, 1, 245, 132, 2, 101, 33, 6, 1, 233, 25, 33, 3, 1, 233, 25, 33, 6, - 1, 223, 192, 33, 3, 1, 223, 192, 33, 6, 1, 213, 80, 33, 3, 1, 213, 80, - 33, 6, 1, 224, 232, 33, 3, 1, 224, 232, 33, 6, 1, 214, 6, 33, 3, 1, 214, - 6, 33, 6, 1, 254, 75, 181, 33, 3, 1, 254, 75, 181, 33, 6, 1, 245, 132, 2, - 231, 37, 101, 33, 3, 1, 245, 132, 2, 231, 37, 101, 33, 6, 1, 245, 109, 2, - 231, 37, 101, 33, 3, 1, 245, 109, 2, 231, 37, 101, 33, 6, 1, 226, 97, 2, - 247, 246, 33, 3, 1, 226, 97, 2, 247, 246, 33, 6, 1, 220, 214, 2, 247, - 246, 33, 3, 1, 220, 214, 2, 247, 246, 141, 6, 1, 253, 80, 141, 6, 1, 251, - 216, 141, 6, 1, 242, 179, 141, 6, 1, 248, 164, 141, 6, 1, 245, 169, 141, - 6, 1, 212, 109, 141, 6, 1, 245, 154, 141, 6, 1, 245, 30, 141, 6, 1, 108, - 141, 6, 1, 212, 67, 141, 6, 1, 235, 224, 141, 6, 1, 232, 219, 141, 6, 1, - 213, 148, 141, 6, 1, 250, 219, 141, 6, 1, 234, 171, 141, 6, 1, 241, 54, - 141, 6, 1, 235, 139, 141, 6, 1, 242, 222, 141, 6, 1, 250, 62, 141, 6, 1, - 231, 122, 141, 6, 1, 212, 255, 141, 6, 1, 228, 150, 141, 6, 1, 221, 24, - 141, 6, 1, 214, 119, 141, 6, 1, 250, 92, 141, 6, 1, 226, 80, 141, 6, 1, - 235, 112, 141, 6, 1, 203, 141, 6, 1, 222, 80, 141, 6, 1, 214, 156, 141, - 6, 1, 217, 15, 141, 6, 1, 223, 245, 141, 6, 1, 249, 175, 141, 6, 1, 212, - 240, 141, 6, 1, 225, 178, 141, 6, 1, 234, 182, 141, 6, 1, 227, 88, 141, - 6, 1, 244, 111, 141, 59, 1, 42, 151, 223, 130, 141, 253, 226, 141, 245, - 112, 77, 141, 244, 254, 77, 141, 249, 157, 141, 224, 158, 77, 141, 254, - 181, 77, 141, 3, 1, 253, 80, 141, 3, 1, 251, 216, 141, 3, 1, 242, 179, - 141, 3, 1, 248, 164, 141, 3, 1, 245, 169, 141, 3, 1, 212, 109, 141, 3, 1, - 245, 154, 141, 3, 1, 245, 30, 141, 3, 1, 108, 141, 3, 1, 212, 67, 141, 3, - 1, 235, 224, 141, 3, 1, 232, 219, 141, 3, 1, 213, 148, 141, 3, 1, 250, - 219, 141, 3, 1, 234, 171, 141, 3, 1, 241, 54, 141, 3, 1, 235, 139, 141, - 3, 1, 242, 222, 141, 3, 1, 250, 62, 141, 3, 1, 231, 122, 141, 3, 1, 212, - 255, 141, 3, 1, 228, 150, 141, 3, 1, 221, 24, 141, 3, 1, 214, 119, 141, - 3, 1, 250, 92, 141, 3, 1, 226, 80, 141, 3, 1, 235, 112, 141, 3, 1, 203, - 141, 3, 1, 222, 80, 141, 3, 1, 214, 156, 141, 3, 1, 217, 15, 141, 3, 1, - 223, 245, 141, 3, 1, 249, 175, 141, 3, 1, 212, 240, 141, 3, 1, 225, 178, - 141, 3, 1, 234, 182, 141, 3, 1, 227, 88, 141, 3, 1, 244, 111, 141, 3, 26, - 245, 170, 212, 240, 141, 243, 200, 219, 69, 141, 240, 160, 93, 254, 175, - 245, 23, 93, 254, 175, 222, 81, 93, 254, 175, 221, 11, 93, 254, 175, 212, - 97, 224, 215, 93, 254, 175, 212, 97, 243, 100, 93, 254, 175, 217, 28, 93, - 254, 175, 223, 200, 93, 254, 175, 212, 96, 93, 254, 175, 226, 118, 93, - 254, 175, 213, 11, 93, 254, 175, 217, 167, 93, 254, 175, 243, 17, 93, - 254, 175, 243, 18, 230, 139, 93, 254, 175, 243, 15, 93, 254, 175, 224, - 216, 226, 144, 93, 254, 175, 217, 206, 243, 32, 93, 254, 175, 226, 100, - 93, 254, 175, 253, 116, 242, 22, 93, 254, 175, 230, 149, 93, 254, 175, - 232, 13, 93, 254, 175, 231, 113, 93, 254, 175, 231, 114, 234, 183, 93, - 254, 175, 248, 108, 93, 254, 175, 224, 227, 93, 254, 175, 217, 206, 224, - 211, 93, 254, 175, 213, 21, 251, 217, 212, 221, 93, 254, 175, 227, 73, - 93, 254, 175, 236, 14, 93, 254, 175, 248, 21, 93, 254, 175, 212, 26, 93, - 152, 231, 206, 249, 228, 93, 225, 145, 220, 216, 93, 225, 145, 241, 233, - 222, 81, 93, 225, 145, 241, 233, 226, 112, 93, 225, 145, 241, 233, 224, - 220, 93, 225, 145, 241, 144, 93, 225, 145, 216, 134, 93, 225, 145, 222, - 81, 93, 225, 145, 226, 112, 93, 225, 145, 224, 220, 93, 225, 145, 241, - 47, 93, 225, 145, 241, 48, 241, 235, 31, 214, 236, 93, 225, 145, 224, - 162, 93, 225, 145, 248, 151, 167, 231, 234, 93, 225, 145, 231, 105, 93, - 225, 27, 231, 231, 93, 225, 145, 224, 59, 93, 225, 27, 226, 120, 93, 225, - 145, 220, 201, 247, 74, 93, 225, 145, 220, 85, 247, 74, 93, 225, 27, 219, - 237, 226, 114, 93, 152, 215, 131, 247, 74, 93, 152, 232, 163, 247, 74, - 93, 225, 27, 228, 51, 242, 21, 93, 225, 145, 224, 221, 224, 215, 93, 1, - 254, 78, 93, 1, 251, 205, 93, 1, 242, 177, 93, 1, 248, 134, 93, 1, 241, - 222, 93, 1, 214, 236, 93, 1, 212, 90, 93, 1, 241, 182, 93, 1, 217, 183, - 93, 1, 212, 224, 93, 1, 40, 234, 254, 93, 1, 234, 254, 93, 1, 233, 118, - 93, 1, 40, 231, 129, 93, 1, 231, 129, 93, 1, 40, 228, 50, 93, 1, 228, 50, - 93, 1, 222, 164, 93, 1, 253, 78, 93, 1, 40, 226, 96, 93, 1, 226, 96, 93, - 1, 40, 216, 137, 93, 1, 216, 137, 93, 1, 224, 184, 93, 1, 223, 219, 93, - 1, 220, 200, 93, 1, 217, 245, 93, 26, 212, 253, 51, 214, 236, 93, 26, - 212, 253, 214, 237, 212, 224, 93, 26, 212, 253, 51, 212, 224, 93, 225, - 27, 243, 17, 93, 225, 27, 243, 15, 12, 50, 52, 12, 5, 222, 158, 12, 243, - 255, 231, 217, 12, 5, 222, 192, 253, 207, 249, 50, 223, 95, 253, 207, - 243, 230, 223, 95, 12, 224, 27, 253, 207, 226, 58, 231, 6, 52, 253, 207, - 226, 58, 217, 201, 217, 101, 52, 254, 126, 52, 12, 249, 157, 12, 248, 96, - 221, 57, 12, 225, 147, 214, 218, 52, 12, 5, 230, 243, 12, 5, 222, 174, - 254, 80, 214, 29, 12, 5, 254, 80, 253, 137, 12, 5, 224, 58, 254, 79, 12, - 5, 224, 65, 254, 61, 254, 14, 12, 5, 218, 20, 12, 3, 124, 218, 29, 12, 3, - 124, 26, 106, 2, 233, 127, 2, 213, 34, 12, 3, 124, 212, 101, 12, 3, 244, - 133, 12, 3, 248, 129, 12, 3, 234, 210, 12, 221, 70, 12, 216, 169, 62, - 225, 27, 77, 12, 224, 158, 77, 12, 1, 234, 214, 213, 34, 12, 1, 242, 2, - 12, 1, 106, 2, 232, 33, 49, 12, 1, 106, 2, 192, 49, 12, 1, 214, 15, 2, - 192, 49, 12, 1, 106, 2, 192, 55, 12, 1, 73, 2, 192, 49, 12, 1, 254, 78, - 12, 1, 251, 230, 12, 1, 217, 216, 231, 227, 12, 1, 217, 215, 12, 1, 217, - 145, 12, 1, 235, 124, 12, 1, 242, 18, 12, 1, 234, 135, 12, 1, 248, 140, - 12, 1, 217, 155, 12, 1, 223, 245, 12, 1, 212, 101, 12, 1, 222, 85, 12, 1, - 220, 239, 12, 1, 222, 195, 12, 1, 248, 159, 12, 1, 218, 29, 12, 1, 212, - 104, 12, 1, 254, 103, 12, 1, 242, 220, 12, 1, 234, 181, 2, 117, 176, 49, - 12, 1, 234, 181, 2, 133, 176, 55, 12, 1, 244, 136, 73, 2, 235, 191, 215, - 79, 12, 1, 244, 136, 73, 2, 117, 176, 49, 12, 1, 244, 136, 73, 2, 133, - 176, 49, 12, 217, 250, 12, 1, 244, 111, 12, 1, 224, 225, 12, 1, 234, 254, - 12, 1, 233, 126, 12, 1, 231, 143, 12, 1, 228, 173, 12, 1, 241, 202, 12, - 1, 214, 14, 12, 1, 106, 231, 255, 12, 1, 213, 34, 12, 244, 131, 12, 248, - 127, 12, 234, 208, 12, 244, 133, 12, 248, 129, 12, 234, 210, 12, 221, 15, - 12, 218, 246, 12, 232, 31, 49, 12, 192, 49, 12, 192, 55, 12, 219, 10, - 254, 78, 12, 235, 191, 248, 129, 12, 152, 228, 174, 242, 194, 12, 211, - 250, 12, 30, 5, 3, 215, 80, 49, 12, 30, 5, 235, 191, 3, 215, 80, 49, 12, - 30, 5, 62, 55, 12, 223, 202, 248, 129, 12, 244, 134, 2, 117, 247, 72, 12, - 214, 16, 192, 55, 253, 207, 21, 212, 79, 253, 207, 21, 116, 253, 207, 21, - 109, 253, 207, 21, 166, 253, 207, 21, 163, 253, 207, 21, 180, 253, 207, - 21, 189, 253, 207, 21, 198, 253, 207, 21, 195, 253, 207, 21, 200, 12, - 226, 57, 52, 12, 248, 34, 221, 57, 12, 217, 99, 221, 57, 12, 244, 50, - 225, 143, 219, 95, 12, 1, 247, 73, 251, 230, 12, 1, 247, 73, 224, 225, - 12, 1, 218, 223, 254, 78, 12, 1, 106, 214, 30, 12, 1, 106, 2, 214, 16, - 192, 49, 12, 1, 106, 2, 214, 16, 192, 55, 12, 1, 124, 242, 2, 12, 1, 124, - 192, 254, 78, 12, 1, 124, 192, 214, 14, 12, 1, 111, 2, 192, 49, 12, 1, - 124, 192, 213, 34, 12, 1, 216, 109, 12, 1, 216, 107, 12, 1, 251, 240, 12, - 1, 217, 216, 2, 223, 130, 12, 1, 217, 216, 2, 133, 176, 78, 246, 57, 12, - 1, 226, 80, 12, 1, 217, 213, 12, 1, 251, 228, 12, 1, 121, 2, 192, 49, 12, - 1, 121, 2, 117, 176, 71, 49, 12, 1, 228, 14, 12, 1, 245, 254, 12, 1, 121, - 2, 133, 176, 49, 12, 1, 217, 233, 12, 1, 217, 231, 12, 1, 248, 81, 12, 1, - 248, 141, 2, 223, 130, 12, 1, 248, 141, 2, 62, 55, 12, 1, 248, 141, 2, - 62, 251, 220, 24, 3, 218, 29, 12, 1, 248, 146, 12, 1, 248, 83, 12, 1, - 246, 25, 12, 1, 248, 141, 2, 133, 176, 78, 246, 57, 12, 1, 248, 141, 2, - 243, 237, 176, 49, 12, 1, 223, 77, 12, 1, 223, 246, 2, 3, 215, 79, 12, 1, - 223, 246, 2, 223, 130, 12, 1, 223, 246, 2, 62, 55, 12, 1, 223, 246, 2, 3, - 215, 80, 55, 12, 1, 223, 246, 2, 62, 251, 220, 24, 62, 49, 12, 1, 223, - 246, 2, 117, 176, 49, 12, 1, 235, 121, 12, 1, 223, 246, 2, 243, 237, 176, - 49, 12, 1, 222, 86, 2, 62, 251, 220, 24, 62, 49, 12, 1, 222, 86, 2, 133, - 176, 55, 12, 1, 222, 86, 2, 133, 176, 251, 220, 24, 133, 176, 49, 12, 1, - 222, 196, 2, 117, 176, 55, 12, 1, 222, 196, 2, 133, 176, 49, 12, 1, 218, - 30, 2, 133, 176, 49, 12, 1, 254, 104, 2, 133, 176, 49, 12, 1, 247, 73, - 244, 111, 12, 1, 244, 112, 2, 62, 230, 179, 55, 12, 1, 244, 112, 2, 62, - 55, 12, 1, 214, 225, 12, 1, 244, 112, 2, 133, 176, 55, 12, 1, 226, 78, - 12, 1, 224, 226, 2, 62, 49, 12, 1, 224, 226, 2, 133, 176, 49, 12, 1, 234, - 180, 12, 1, 218, 195, 234, 254, 12, 1, 234, 255, 2, 223, 130, 12, 1, 234, - 255, 2, 62, 49, 12, 1, 229, 161, 12, 1, 234, 255, 2, 133, 176, 55, 12, 1, - 243, 97, 12, 1, 243, 98, 2, 223, 130, 12, 1, 229, 88, 12, 1, 243, 98, 2, - 117, 176, 55, 12, 1, 242, 82, 12, 1, 243, 98, 2, 133, 176, 49, 12, 1, - 233, 127, 2, 3, 215, 79, 12, 1, 233, 127, 2, 62, 49, 12, 1, 233, 127, 2, - 133, 176, 49, 12, 1, 233, 127, 2, 133, 176, 55, 12, 1, 228, 174, 2, 62, - 55, 12, 1, 228, 174, 242, 194, 12, 1, 223, 115, 12, 1, 228, 174, 2, 223, - 130, 12, 1, 228, 174, 2, 133, 176, 49, 12, 1, 241, 203, 247, 95, 12, 1, - 217, 234, 2, 62, 49, 12, 1, 241, 203, 2, 73, 49, 12, 1, 241, 203, 242, - 147, 12, 1, 241, 203, 242, 148, 2, 192, 49, 12, 1, 217, 216, 231, 228, - 242, 147, 12, 1, 214, 15, 2, 223, 130, 12, 1, 234, 82, 227, 99, 12, 1, - 227, 99, 12, 1, 69, 12, 1, 212, 203, 12, 1, 234, 82, 212, 203, 12, 1, - 214, 15, 2, 117, 176, 49, 12, 1, 214, 232, 12, 1, 244, 136, 213, 34, 12, - 1, 73, 2, 218, 27, 12, 1, 73, 2, 3, 215, 79, 12, 1, 214, 15, 2, 62, 49, - 12, 1, 74, 12, 1, 73, 2, 133, 176, 55, 12, 1, 73, 252, 52, 12, 1, 73, - 252, 53, 2, 192, 49, 12, 243, 200, 219, 69, 12, 1, 254, 148, 12, 3, 124, - 26, 222, 196, 2, 233, 127, 2, 106, 231, 255, 12, 3, 124, 26, 224, 226, 2, - 233, 127, 2, 106, 231, 255, 12, 3, 124, 63, 70, 17, 12, 3, 124, 233, 127, - 254, 78, 12, 3, 124, 235, 124, 12, 3, 124, 133, 247, 72, 12, 3, 124, 222, - 85, 12, 245, 101, 65, 253, 82, 12, 219, 91, 65, 223, 49, 245, 132, 241, - 141, 12, 3, 124, 223, 85, 212, 79, 12, 3, 124, 215, 130, 224, 8, 212, 79, - 12, 3, 124, 247, 73, 241, 220, 65, 234, 135, 12, 3, 124, 63, 48, 17, 12, - 3, 115, 222, 85, 12, 3, 124, 232, 32, 12, 3, 214, 14, 12, 3, 213, 34, 12, - 3, 124, 213, 34, 12, 3, 124, 228, 173, 12, 225, 173, 65, 222, 184, 12, - 245, 110, 250, 109, 115, 219, 69, 12, 245, 110, 250, 109, 124, 219, 69, - 12, 223, 85, 124, 219, 70, 2, 244, 73, 250, 108, 12, 3, 115, 231, 143, - 12, 1, 248, 141, 2, 235, 191, 215, 79, 12, 1, 223, 246, 2, 235, 191, 215, - 79, 244, 246, 253, 207, 21, 212, 79, 244, 246, 253, 207, 21, 116, 244, - 246, 253, 207, 21, 109, 244, 246, 253, 207, 21, 166, 244, 246, 253, 207, - 21, 163, 244, 246, 253, 207, 21, 180, 244, 246, 253, 207, 21, 189, 244, - 246, 253, 207, 21, 198, 244, 246, 253, 207, 21, 195, 244, 246, 253, 207, - 21, 200, 12, 1, 220, 240, 2, 62, 55, 12, 1, 248, 160, 2, 62, 55, 12, 1, - 242, 221, 2, 62, 55, 12, 5, 220, 84, 254, 35, 12, 5, 220, 84, 225, 115, - 231, 122, 12, 1, 241, 203, 2, 235, 191, 215, 79, 175, 245, 101, 65, 226, - 142, 175, 218, 219, 243, 200, 219, 69, 175, 219, 12, 243, 200, 219, 69, - 175, 218, 219, 249, 164, 175, 219, 12, 249, 164, 175, 199, 249, 164, 175, - 249, 165, 220, 34, 233, 70, 175, 249, 165, 220, 34, 223, 148, 175, 218, - 219, 249, 165, 220, 34, 233, 70, 175, 219, 12, 249, 165, 220, 34, 223, - 148, 175, 249, 119, 175, 241, 240, 227, 114, 175, 241, 240, 231, 103, - 175, 241, 240, 253, 134, 175, 254, 181, 77, 175, 1, 254, 82, 175, 1, 218, - 223, 254, 82, 175, 1, 251, 202, 175, 1, 243, 89, 175, 1, 243, 90, 243, - 67, 175, 1, 248, 137, 175, 1, 247, 73, 248, 138, 223, 126, 175, 1, 241, - 222, 175, 1, 214, 14, 175, 1, 212, 101, 175, 1, 241, 180, 175, 1, 217, - 179, 175, 1, 217, 180, 243, 67, 175, 1, 212, 190, 175, 1, 212, 191, 241, - 222, 175, 1, 234, 230, 175, 1, 233, 125, 175, 1, 231, 3, 175, 1, 228, 50, - 175, 1, 221, 63, 175, 1, 40, 221, 63, 175, 1, 74, 175, 1, 226, 96, 175, - 1, 223, 202, 226, 96, 175, 1, 222, 193, 175, 1, 224, 219, 175, 1, 223, - 126, 175, 1, 220, 200, 175, 1, 217, 243, 175, 1, 226, 45, 251, 190, 175, - 1, 226, 45, 242, 218, 175, 1, 226, 45, 247, 228, 175, 225, 36, 49, 175, - 225, 36, 55, 175, 225, 36, 246, 71, 175, 212, 10, 49, 175, 212, 10, 55, - 175, 212, 10, 246, 71, 175, 224, 24, 49, 175, 224, 24, 55, 175, 246, 72, - 212, 17, 241, 31, 175, 246, 72, 212, 17, 254, 15, 175, 241, 225, 49, 175, - 241, 225, 55, 175, 241, 224, 246, 71, 175, 245, 43, 49, 175, 245, 43, 55, - 175, 223, 19, 175, 244, 105, 247, 74, 175, 224, 137, 175, 223, 45, 175, - 117, 71, 176, 49, 175, 117, 71, 176, 55, 175, 133, 176, 49, 175, 133, - 176, 55, 175, 227, 112, 232, 243, 49, 175, 227, 112, 232, 243, 55, 175, - 230, 126, 175, 252, 51, 175, 1, 219, 233, 212, 73, 175, 1, 219, 233, 234, - 128, 175, 1, 219, 233, 244, 123, 12, 1, 251, 231, 2, 133, 176, 240, 237, - 55, 12, 1, 251, 231, 2, 62, 251, 220, 24, 133, 176, 49, 12, 1, 251, 231, - 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 251, 231, 2, 133, 176, 225, - 141, 215, 124, 251, 220, 24, 117, 176, 49, 12, 1, 251, 231, 2, 117, 176, - 251, 220, 24, 62, 49, 12, 1, 251, 231, 2, 235, 191, 3, 215, 80, 55, 12, - 1, 251, 231, 2, 3, 215, 79, 12, 1, 121, 2, 117, 176, 49, 12, 1, 121, 2, - 133, 176, 225, 141, 215, 124, 55, 12, 1, 248, 141, 2, 117, 176, 214, 166, - 251, 220, 24, 3, 218, 29, 12, 1, 248, 141, 2, 235, 191, 3, 215, 80, 55, - 12, 1, 223, 246, 2, 90, 12, 1, 222, 86, 2, 243, 237, 176, 49, 12, 1, 254, - 104, 2, 117, 176, 49, 12, 1, 254, 104, 2, 133, 176, 225, 141, 246, 58, - 49, 12, 1, 254, 104, 2, 117, 176, 214, 166, 49, 12, 1, 244, 112, 2, 117, - 176, 55, 12, 1, 244, 112, 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, - 234, 181, 2, 62, 49, 12, 1, 234, 181, 2, 133, 176, 49, 12, 1, 234, 181, - 2, 133, 176, 225, 141, 215, 124, 55, 12, 1, 63, 2, 62, 49, 12, 1, 63, 2, - 62, 55, 12, 1, 228, 174, 2, 117, 176, 55, 12, 1, 228, 174, 2, 3, 218, 29, - 12, 1, 228, 174, 2, 3, 215, 79, 12, 1, 233, 127, 2, 134, 12, 1, 223, 246, - 2, 117, 176, 214, 166, 49, 12, 1, 223, 246, 2, 192, 49, 12, 1, 222, 86, - 2, 117, 176, 214, 166, 49, 12, 1, 121, 2, 3, 12, 1, 218, 30, 55, 12, 1, - 121, 2, 3, 12, 1, 218, 30, 24, 117, 247, 72, 12, 1, 222, 86, 2, 3, 12, 1, - 218, 30, 24, 117, 247, 72, 12, 1, 223, 246, 2, 3, 12, 1, 218, 30, 24, - 117, 247, 72, 12, 1, 121, 2, 3, 12, 1, 218, 30, 49, 12, 1, 106, 2, 244, - 246, 253, 207, 21, 117, 49, 12, 1, 106, 2, 244, 246, 253, 207, 21, 133, - 49, 12, 1, 244, 136, 73, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 244, - 136, 73, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1, 244, 136, 73, 2, 244, - 246, 253, 207, 21, 243, 237, 55, 12, 1, 214, 15, 2, 244, 246, 253, 207, - 21, 117, 49, 12, 1, 214, 15, 2, 244, 246, 253, 207, 21, 133, 49, 12, 1, - 73, 252, 53, 2, 244, 246, 253, 207, 21, 117, 49, 12, 1, 73, 252, 53, 2, - 244, 246, 253, 207, 21, 133, 49, 12, 1, 121, 2, 244, 246, 253, 207, 21, - 243, 237, 55, 12, 1, 222, 86, 2, 244, 246, 253, 207, 21, 243, 237, 49, - 12, 1, 222, 86, 2, 235, 191, 215, 79, 12, 1, 234, 255, 2, 117, 176, 49, - 217, 158, 1, 242, 27, 217, 158, 1, 220, 248, 217, 158, 1, 228, 172, 217, - 158, 1, 224, 74, 217, 158, 1, 252, 106, 217, 158, 1, 233, 22, 217, 158, - 1, 235, 12, 217, 158, 1, 254, 68, 217, 158, 1, 214, 255, 217, 158, 1, - 231, 142, 217, 158, 1, 244, 162, 217, 158, 1, 247, 231, 217, 158, 1, 217, - 160, 217, 158, 1, 233, 153, 217, 158, 1, 243, 106, 217, 158, 1, 242, 153, - 217, 158, 1, 222, 84, 217, 158, 1, 248, 94, 217, 158, 1, 212, 93, 217, - 158, 1, 217, 244, 217, 158, 1, 213, 91, 217, 158, 1, 226, 107, 217, 158, - 1, 235, 129, 217, 158, 1, 250, 70, 217, 158, 1, 216, 114, 217, 158, 1, - 241, 173, 217, 158, 1, 234, 137, 217, 158, 1, 217, 159, 217, 158, 1, 212, - 108, 217, 158, 1, 220, 238, 217, 158, 1, 222, 199, 217, 158, 1, 248, 162, - 217, 158, 1, 108, 217, 158, 1, 212, 16, 217, 158, 1, 254, 101, 217, 158, - 1, 242, 219, 217, 158, 1, 224, 229, 217, 158, 1, 214, 47, 217, 158, 254, - 182, 217, 158, 254, 197, 217, 158, 240, 107, 217, 158, 245, 164, 217, - 158, 215, 191, 217, 158, 227, 48, 217, 158, 245, 172, 217, 158, 244, 240, - 217, 158, 227, 111, 217, 158, 227, 119, 217, 158, 218, 246, 217, 158, 1, - 230, 43, 228, 224, 21, 212, 79, 228, 224, 21, 116, 228, 224, 21, 109, - 228, 224, 21, 166, 228, 224, 21, 163, 228, 224, 21, 180, 228, 224, 21, - 189, 228, 224, 21, 198, 228, 224, 21, 195, 228, 224, 21, 200, 228, 224, - 1, 61, 228, 224, 1, 245, 165, 228, 224, 1, 72, 228, 224, 1, 74, 228, 224, - 1, 69, 228, 224, 1, 227, 49, 228, 224, 1, 75, 228, 224, 1, 248, 152, 228, - 224, 1, 204, 228, 224, 1, 252, 107, 228, 224, 1, 193, 228, 224, 1, 218, - 52, 228, 224, 1, 235, 139, 228, 224, 1, 250, 92, 228, 224, 1, 248, 164, - 228, 224, 1, 203, 228, 224, 1, 223, 81, 228, 224, 1, 222, 202, 228, 224, - 1, 243, 55, 228, 224, 1, 244, 164, 228, 224, 1, 181, 228, 224, 1, 233, - 157, 228, 224, 1, 230, 46, 213, 210, 228, 224, 1, 188, 228, 224, 1, 228, - 23, 228, 224, 1, 205, 228, 224, 1, 159, 228, 224, 1, 214, 49, 228, 224, - 1, 186, 228, 224, 1, 228, 24, 213, 210, 228, 224, 1, 235, 64, 235, 139, - 228, 224, 1, 235, 64, 250, 92, 228, 224, 1, 235, 64, 203, 228, 224, 37, - 220, 175, 124, 216, 241, 228, 224, 37, 220, 175, 115, 216, 241, 228, 224, - 37, 220, 175, 223, 125, 216, 241, 228, 224, 37, 184, 247, 245, 216, 241, - 228, 224, 37, 184, 124, 216, 241, 228, 224, 37, 184, 115, 216, 241, 228, - 224, 37, 184, 223, 125, 216, 241, 228, 224, 37, 230, 13, 77, 228, 224, - 37, 51, 62, 49, 228, 224, 124, 160, 253, 226, 228, 224, 115, 160, 253, - 226, 228, 224, 16, 227, 50, 248, 1, 228, 224, 16, 243, 54, 228, 224, 249, - 157, 228, 224, 244, 254, 77, 228, 224, 233, 132, 222, 167, 1, 254, 84, - 222, 167, 1, 251, 151, 222, 167, 1, 243, 88, 222, 167, 1, 248, 139, 222, - 167, 1, 235, 150, 222, 167, 1, 252, 106, 222, 167, 1, 212, 82, 222, 167, - 1, 235, 158, 222, 167, 1, 217, 20, 222, 167, 1, 212, 173, 222, 167, 1, - 235, 13, 222, 167, 1, 233, 150, 222, 167, 1, 231, 3, 222, 167, 1, 228, - 50, 222, 167, 1, 220, 82, 222, 167, 1, 235, 251, 222, 167, 1, 244, 90, - 222, 167, 1, 216, 139, 222, 167, 1, 224, 155, 222, 167, 1, 223, 126, 222, - 167, 1, 221, 8, 222, 167, 1, 218, 48, 222, 167, 152, 235, 251, 222, 167, - 152, 235, 250, 222, 167, 152, 227, 107, 222, 167, 152, 248, 150, 222, - 167, 59, 1, 245, 68, 212, 173, 222, 167, 152, 245, 68, 212, 173, 222, - 167, 30, 5, 184, 74, 222, 167, 30, 5, 74, 222, 167, 30, 5, 226, 242, 254, - 232, 222, 167, 30, 5, 184, 254, 232, 222, 167, 30, 5, 254, 232, 222, 167, - 30, 5, 226, 242, 61, 222, 167, 30, 5, 184, 61, 222, 167, 30, 5, 61, 222, - 167, 59, 1, 220, 175, 61, 222, 167, 30, 5, 220, 175, 61, 222, 167, 30, 5, - 184, 69, 222, 167, 30, 5, 69, 222, 167, 59, 1, 72, 222, 167, 30, 5, 184, - 72, 222, 167, 30, 5, 72, 222, 167, 30, 5, 75, 222, 167, 30, 5, 218, 246, - 222, 167, 152, 229, 174, 222, 167, 225, 27, 229, 174, 222, 167, 225, 27, - 254, 123, 222, 167, 225, 27, 254, 23, 222, 167, 225, 27, 252, 34, 222, - 167, 225, 27, 253, 117, 222, 167, 225, 27, 220, 188, 222, 167, 254, 181, - 77, 222, 167, 225, 27, 231, 132, 224, 190, 222, 167, 225, 27, 212, 24, - 222, 167, 225, 27, 224, 190, 222, 167, 225, 27, 212, 107, 222, 167, 225, - 27, 216, 54, 222, 167, 225, 27, 253, 180, 222, 167, 225, 27, 219, 237, - 231, 208, 222, 167, 225, 27, 254, 11, 231, 245, 1, 242, 7, 231, 245, 1, - 254, 185, 231, 245, 1, 254, 121, 231, 245, 1, 254, 160, 231, 245, 1, 254, - 114, 231, 245, 1, 215, 98, 231, 245, 1, 253, 76, 231, 245, 1, 235, 158, - 231, 245, 1, 253, 114, 231, 245, 1, 254, 89, 231, 245, 1, 254, 94, 231, - 245, 1, 254, 86, 231, 245, 1, 254, 45, 231, 245, 1, 254, 32, 231, 245, 1, - 253, 152, 231, 245, 1, 235, 251, 231, 245, 1, 253, 239, 231, 245, 1, 253, - 124, 231, 245, 1, 253, 215, 231, 245, 1, 253, 211, 231, 245, 1, 253, 146, - 231, 245, 1, 253, 122, 231, 245, 1, 246, 10, 231, 245, 1, 235, 6, 231, - 245, 1, 254, 103, 231, 245, 254, 127, 77, 231, 245, 214, 117, 77, 231, - 245, 243, 29, 77, 231, 245, 225, 26, 82, 5, 235, 191, 250, 187, 82, 5, - 250, 187, 82, 5, 253, 242, 82, 5, 214, 128, 82, 1, 220, 175, 61, 82, 1, - 61, 82, 1, 254, 232, 82, 1, 72, 82, 1, 236, 28, 82, 1, 69, 82, 1, 215, - 92, 82, 1, 161, 149, 82, 1, 161, 150, 82, 1, 250, 190, 74, 82, 1, 220, - 175, 74, 82, 1, 74, 82, 1, 254, 108, 82, 1, 250, 190, 75, 82, 1, 220, - 175, 75, 82, 1, 75, 82, 1, 253, 108, 82, 1, 181, 82, 1, 234, 138, 82, 1, - 243, 110, 82, 1, 242, 225, 82, 1, 229, 159, 82, 1, 250, 219, 82, 1, 250, - 92, 82, 1, 235, 139, 82, 1, 235, 115, 82, 1, 228, 23, 82, 1, 216, 115, - 82, 1, 216, 105, 82, 1, 248, 86, 82, 1, 248, 70, 82, 1, 228, 198, 82, 1, - 218, 52, 82, 1, 217, 161, 82, 1, 248, 164, 82, 1, 247, 232, 82, 1, 205, - 82, 1, 228, 189, 82, 1, 193, 82, 1, 226, 23, 82, 1, 252, 107, 82, 1, 251, - 195, 82, 1, 188, 82, 1, 186, 82, 1, 203, 82, 1, 223, 81, 82, 1, 233, 157, - 82, 1, 232, 213, 82, 1, 232, 212, 82, 1, 215, 1, 82, 1, 221, 24, 82, 1, - 219, 157, 82, 1, 222, 202, 82, 1, 159, 82, 30, 5, 227, 99, 82, 30, 5, - 227, 47, 82, 5, 228, 60, 82, 5, 253, 91, 82, 30, 5, 254, 232, 82, 30, 5, - 72, 82, 30, 5, 236, 28, 82, 30, 5, 69, 82, 30, 5, 215, 92, 82, 30, 5, - 161, 149, 82, 30, 5, 161, 223, 82, 82, 30, 5, 250, 190, 74, 82, 30, 5, - 220, 175, 74, 82, 30, 5, 74, 82, 30, 5, 254, 108, 82, 30, 5, 250, 190, - 75, 82, 30, 5, 220, 175, 75, 82, 30, 5, 75, 82, 30, 5, 253, 108, 82, 5, - 214, 133, 82, 30, 5, 225, 66, 74, 82, 30, 5, 253, 87, 82, 227, 70, 82, - 219, 51, 5, 215, 185, 82, 219, 51, 5, 253, 244, 82, 242, 114, 254, 174, - 82, 254, 164, 254, 174, 82, 30, 5, 250, 190, 184, 74, 82, 30, 5, 215, - 183, 82, 30, 5, 215, 91, 82, 1, 224, 232, 82, 1, 234, 121, 82, 1, 242, - 202, 82, 1, 212, 109, 82, 1, 248, 75, 82, 1, 223, 192, 82, 1, 244, 164, - 82, 1, 212, 160, 82, 1, 161, 223, 82, 82, 1, 161, 232, 214, 82, 30, 5, - 161, 150, 82, 30, 5, 161, 232, 214, 82, 248, 123, 82, 51, 248, 123, 82, - 21, 212, 79, 82, 21, 116, 82, 21, 109, 82, 21, 166, 82, 21, 163, 82, 21, - 180, 82, 21, 189, 82, 21, 198, 82, 21, 195, 82, 21, 200, 82, 254, 181, - 52, 82, 5, 124, 219, 205, 247, 74, 82, 1, 250, 190, 61, 82, 1, 227, 99, - 82, 1, 227, 47, 82, 1, 253, 87, 82, 1, 215, 183, 82, 1, 215, 91, 82, 1, - 212, 75, 82, 1, 107, 186, 82, 1, 243, 5, 82, 1, 235, 99, 82, 1, 242, 156, - 219, 69, 82, 1, 248, 76, 82, 1, 252, 31, 140, 5, 250, 187, 140, 5, 253, - 242, 140, 5, 214, 128, 140, 1, 61, 140, 1, 254, 232, 140, 1, 72, 140, 1, - 236, 28, 140, 1, 69, 140, 1, 215, 92, 140, 1, 161, 149, 140, 1, 161, 150, - 140, 1, 74, 140, 1, 254, 108, 140, 1, 75, 140, 1, 253, 108, 140, 1, 181, - 140, 1, 234, 138, 140, 1, 243, 110, 140, 1, 242, 225, 140, 1, 229, 159, - 140, 1, 250, 219, 140, 1, 250, 92, 140, 1, 235, 139, 140, 1, 235, 115, - 140, 1, 228, 23, 140, 1, 216, 115, 140, 1, 216, 105, 140, 1, 248, 86, - 140, 1, 248, 70, 140, 1, 228, 198, 140, 1, 218, 52, 140, 1, 217, 161, - 140, 1, 248, 164, 140, 1, 247, 232, 140, 1, 205, 140, 1, 193, 140, 1, - 226, 23, 140, 1, 252, 107, 140, 1, 251, 195, 140, 1, 188, 140, 1, 186, - 140, 1, 203, 140, 1, 233, 157, 140, 1, 221, 24, 140, 1, 219, 157, 140, 1, - 222, 202, 140, 1, 159, 140, 5, 228, 60, 140, 5, 253, 91, 140, 30, 5, 254, - 232, 140, 30, 5, 72, 140, 30, 5, 236, 28, 140, 30, 5, 69, 140, 30, 5, - 215, 92, 140, 30, 5, 161, 149, 140, 30, 5, 161, 223, 82, 140, 30, 5, 74, - 140, 30, 5, 254, 108, 140, 30, 5, 75, 140, 30, 5, 253, 108, 140, 5, 214, - 133, 140, 1, 234, 130, 218, 52, 140, 253, 109, 233, 47, 77, 140, 1, 223, - 81, 140, 1, 223, 192, 140, 1, 212, 160, 140, 1, 161, 223, 82, 140, 1, - 161, 232, 214, 140, 30, 5, 161, 150, 140, 30, 5, 161, 232, 214, 140, 21, - 212, 79, 140, 21, 116, 140, 21, 109, 140, 21, 166, 140, 21, 163, 140, 21, - 180, 140, 21, 189, 140, 21, 198, 140, 21, 195, 140, 21, 200, 140, 1, 224, - 77, 2, 231, 37, 247, 206, 140, 1, 224, 77, 2, 232, 163, 247, 206, 140, - 223, 29, 77, 140, 223, 29, 52, 140, 249, 39, 228, 53, 116, 140, 249, 39, - 228, 53, 109, 140, 249, 39, 228, 53, 166, 140, 249, 39, 228, 53, 163, - 140, 249, 39, 228, 53, 122, 233, 40, 217, 154, 217, 149, 247, 255, 140, - 249, 39, 248, 0, 220, 47, 140, 235, 159, 140, 243, 79, 77, 173, 5, 254, - 159, 251, 166, 173, 5, 251, 166, 173, 5, 214, 128, 173, 1, 61, 173, 1, - 254, 232, 173, 1, 72, 173, 1, 236, 28, 173, 1, 69, 173, 1, 215, 92, 173, - 1, 245, 165, 173, 1, 254, 108, 173, 1, 227, 49, 173, 1, 253, 108, 173, 1, - 181, 173, 1, 234, 138, 173, 1, 243, 110, 173, 1, 242, 225, 173, 1, 229, - 159, 173, 1, 250, 219, 173, 1, 250, 92, 173, 1, 235, 139, 173, 1, 235, - 115, 173, 1, 228, 23, 173, 1, 216, 115, 173, 1, 216, 105, 173, 1, 248, - 86, 173, 1, 248, 70, 173, 1, 228, 198, 173, 1, 218, 52, 173, 1, 217, 161, - 173, 1, 248, 164, 173, 1, 247, 232, 173, 1, 205, 173, 1, 193, 173, 1, - 226, 23, 173, 1, 252, 107, 173, 1, 251, 195, 173, 1, 188, 173, 1, 186, - 173, 1, 203, 173, 1, 233, 157, 173, 1, 232, 213, 173, 1, 215, 1, 173, 1, - 221, 24, 173, 1, 222, 202, 173, 1, 159, 173, 5, 228, 60, 173, 30, 5, 254, - 232, 173, 30, 5, 72, 173, 30, 5, 236, 28, 173, 30, 5, 69, 173, 30, 5, - 215, 92, 173, 30, 5, 245, 165, 173, 30, 5, 254, 108, 173, 30, 5, 227, 49, - 173, 30, 5, 253, 108, 173, 5, 214, 133, 173, 5, 215, 187, 173, 1, 234, - 121, 173, 1, 242, 202, 173, 1, 212, 109, 173, 1, 223, 81, 173, 1, 244, - 164, 173, 21, 212, 79, 173, 21, 116, 173, 21, 109, 173, 21, 166, 173, 21, - 163, 173, 21, 180, 173, 21, 189, 173, 21, 198, 173, 21, 195, 173, 21, - 200, 173, 217, 27, 173, 254, 158, 173, 235, 176, 173, 215, 117, 173, 245, - 138, 227, 54, 173, 5, 213, 67, 164, 5, 250, 187, 164, 5, 253, 242, 164, - 5, 214, 128, 164, 1, 61, 164, 1, 254, 232, 164, 1, 72, 164, 1, 236, 28, - 164, 1, 69, 164, 1, 215, 92, 164, 1, 161, 149, 164, 1, 161, 150, 164, 30, - 250, 190, 74, 164, 1, 74, 164, 1, 254, 108, 164, 30, 250, 190, 75, 164, - 1, 75, 164, 1, 253, 108, 164, 1, 181, 164, 1, 234, 138, 164, 1, 243, 110, - 164, 1, 242, 225, 164, 1, 229, 159, 164, 1, 250, 219, 164, 1, 250, 92, - 164, 1, 235, 139, 164, 1, 235, 115, 164, 1, 228, 23, 164, 1, 216, 115, - 164, 1, 216, 105, 164, 1, 248, 86, 164, 1, 248, 70, 164, 1, 228, 198, - 164, 1, 218, 52, 164, 1, 217, 161, 164, 1, 248, 164, 164, 1, 247, 232, - 164, 1, 205, 164, 1, 193, 164, 1, 226, 23, 164, 1, 252, 107, 164, 1, 251, - 195, 164, 1, 188, 164, 1, 186, 164, 1, 203, 164, 1, 233, 157, 164, 1, - 232, 213, 164, 1, 215, 1, 164, 1, 221, 24, 164, 1, 219, 157, 164, 1, 222, - 202, 164, 1, 159, 164, 5, 228, 60, 164, 5, 253, 91, 164, 30, 5, 254, 232, - 164, 30, 5, 72, 164, 30, 5, 236, 28, 164, 30, 5, 69, 164, 30, 5, 215, 92, - 164, 30, 5, 161, 149, 164, 30, 5, 161, 223, 82, 164, 30, 5, 250, 190, 74, - 164, 30, 5, 74, 164, 30, 5, 254, 108, 164, 30, 5, 250, 190, 75, 164, 30, - 5, 75, 164, 30, 5, 253, 108, 164, 5, 214, 133, 164, 227, 70, 164, 1, 161, - 223, 82, 164, 1, 161, 232, 214, 164, 30, 5, 161, 150, 164, 30, 5, 161, - 232, 214, 164, 21, 212, 79, 164, 21, 116, 164, 21, 109, 164, 21, 166, - 164, 21, 163, 164, 21, 180, 164, 21, 189, 164, 21, 198, 164, 21, 195, - 164, 21, 200, 164, 223, 29, 52, 147, 5, 250, 187, 147, 5, 253, 242, 147, - 5, 214, 128, 147, 1, 61, 147, 1, 254, 232, 147, 1, 72, 147, 1, 236, 28, - 147, 1, 69, 147, 1, 215, 92, 147, 1, 161, 149, 147, 1, 161, 150, 147, 1, - 74, 147, 1, 254, 108, 147, 1, 75, 147, 1, 253, 108, 147, 1, 181, 147, 1, - 234, 138, 147, 1, 243, 110, 147, 1, 242, 225, 147, 1, 229, 159, 147, 1, - 250, 219, 147, 1, 250, 92, 147, 1, 235, 139, 147, 1, 235, 115, 147, 1, - 228, 23, 147, 1, 216, 115, 147, 1, 216, 105, 147, 1, 248, 86, 147, 1, - 248, 70, 147, 1, 228, 198, 147, 1, 218, 52, 147, 1, 217, 161, 147, 1, - 248, 164, 147, 1, 247, 232, 147, 1, 205, 147, 1, 193, 147, 1, 226, 23, - 147, 1, 252, 107, 147, 1, 251, 195, 147, 1, 188, 147, 1, 186, 147, 1, - 203, 147, 1, 233, 157, 147, 1, 232, 213, 147, 1, 215, 1, 147, 1, 221, 24, - 147, 1, 219, 157, 147, 1, 222, 202, 147, 1, 159, 147, 5, 228, 60, 147, 5, - 253, 91, 147, 30, 5, 254, 232, 147, 30, 5, 72, 147, 30, 5, 236, 28, 147, - 30, 5, 69, 147, 30, 5, 215, 92, 147, 30, 5, 161, 149, 147, 30, 5, 161, - 223, 82, 147, 30, 5, 74, 147, 30, 5, 254, 108, 147, 30, 5, 75, 147, 30, - 5, 253, 108, 147, 5, 214, 133, 147, 254, 109, 233, 47, 77, 147, 253, 109, - 233, 47, 77, 147, 1, 223, 81, 147, 1, 223, 192, 147, 1, 212, 160, 147, 1, - 161, 223, 82, 147, 1, 161, 232, 214, 147, 30, 5, 161, 150, 147, 30, 5, - 161, 232, 214, 147, 21, 212, 79, 147, 21, 116, 147, 21, 109, 147, 21, - 166, 147, 21, 163, 147, 21, 180, 147, 21, 189, 147, 21, 198, 147, 21, - 195, 147, 21, 200, 147, 235, 159, 147, 1, 214, 49, 147, 243, 228, 122, - 224, 166, 147, 243, 228, 122, 242, 9, 147, 243, 228, 133, 224, 164, 147, - 243, 228, 122, 220, 45, 147, 243, 228, 122, 245, 145, 147, 243, 228, 133, - 220, 44, 178, 5, 253, 242, 178, 5, 214, 128, 178, 1, 61, 178, 1, 254, - 232, 178, 1, 72, 178, 1, 236, 28, 178, 1, 69, 178, 1, 215, 92, 178, 1, - 74, 178, 1, 245, 165, 178, 1, 254, 108, 178, 1, 75, 178, 1, 227, 49, 178, - 1, 253, 108, 178, 1, 181, 178, 1, 229, 159, 178, 1, 250, 219, 178, 1, - 235, 139, 178, 1, 228, 23, 178, 1, 216, 115, 178, 1, 228, 198, 178, 1, - 218, 52, 178, 1, 205, 178, 1, 228, 189, 178, 1, 193, 178, 1, 188, 178, 1, - 186, 178, 1, 203, 178, 1, 223, 81, 178, 1, 233, 157, 178, 1, 232, 213, - 178, 1, 232, 212, 178, 1, 215, 1, 178, 1, 221, 24, 178, 1, 219, 157, 178, - 1, 222, 202, 178, 1, 159, 178, 30, 5, 254, 232, 178, 30, 5, 72, 178, 30, - 5, 236, 28, 178, 30, 5, 69, 178, 30, 5, 215, 92, 178, 30, 5, 74, 178, 30, - 5, 245, 165, 178, 30, 5, 254, 108, 178, 30, 5, 75, 178, 30, 5, 227, 49, - 178, 30, 5, 253, 108, 178, 5, 214, 133, 178, 227, 70, 178, 253, 109, 233, - 47, 77, 178, 21, 212, 79, 178, 21, 116, 178, 21, 109, 178, 21, 166, 178, - 21, 163, 178, 21, 180, 178, 21, 189, 178, 21, 198, 178, 21, 195, 178, 21, - 200, 178, 50, 217, 200, 178, 50, 122, 240, 200, 178, 50, 122, 217, 100, - 178, 248, 92, 52, 178, 230, 205, 52, 178, 213, 36, 52, 178, 248, 38, 52, - 178, 249, 79, 52, 178, 253, 153, 78, 52, 178, 223, 29, 52, 178, 50, 52, - 139, 5, 250, 187, 139, 5, 253, 242, 139, 5, 214, 128, 139, 1, 61, 139, 1, - 254, 232, 139, 1, 72, 139, 1, 236, 28, 139, 1, 69, 139, 1, 215, 92, 139, - 1, 161, 149, 139, 1, 161, 150, 139, 1, 74, 139, 1, 245, 165, 139, 1, 254, - 108, 139, 1, 75, 139, 1, 227, 49, 139, 1, 253, 108, 139, 1, 181, 139, 1, - 234, 138, 139, 1, 243, 110, 139, 1, 242, 225, 139, 1, 229, 159, 139, 1, - 250, 219, 139, 1, 250, 92, 139, 1, 235, 139, 139, 1, 235, 115, 139, 1, - 228, 23, 139, 1, 216, 115, 139, 1, 216, 105, 139, 1, 248, 86, 139, 1, - 248, 70, 139, 1, 228, 198, 139, 1, 218, 52, 139, 1, 217, 161, 139, 1, - 248, 164, 139, 1, 247, 232, 139, 1, 205, 139, 1, 193, 139, 1, 226, 23, - 139, 1, 252, 107, 139, 1, 251, 195, 139, 1, 188, 139, 1, 186, 139, 1, - 203, 139, 1, 223, 81, 139, 1, 233, 157, 139, 1, 232, 213, 139, 1, 215, 1, - 139, 1, 221, 24, 139, 1, 219, 157, 139, 1, 222, 202, 139, 1, 159, 139, 5, - 253, 91, 139, 30, 5, 254, 232, 139, 30, 5, 72, 139, 30, 5, 236, 28, 139, - 30, 5, 69, 139, 30, 5, 215, 92, 139, 30, 5, 161, 149, 139, 30, 5, 161, - 223, 82, 139, 30, 5, 74, 139, 30, 5, 245, 165, 139, 30, 5, 254, 108, 139, - 30, 5, 75, 139, 30, 5, 227, 49, 139, 30, 5, 253, 108, 139, 5, 214, 133, - 139, 233, 47, 77, 139, 254, 109, 233, 47, 77, 139, 1, 216, 141, 139, 1, - 245, 249, 139, 1, 161, 223, 82, 139, 1, 161, 232, 214, 139, 30, 5, 161, - 150, 139, 30, 5, 161, 232, 214, 139, 21, 212, 79, 139, 21, 116, 139, 21, - 109, 139, 21, 166, 139, 21, 163, 139, 21, 180, 139, 21, 189, 139, 21, - 198, 139, 21, 195, 139, 21, 200, 139, 243, 228, 21, 212, 80, 31, 227, - 102, 225, 103, 65, 163, 139, 243, 228, 21, 122, 31, 227, 102, 225, 103, - 65, 163, 139, 243, 228, 21, 117, 31, 227, 102, 225, 103, 65, 163, 139, - 243, 228, 21, 133, 31, 227, 102, 225, 103, 65, 163, 139, 243, 228, 21, - 122, 31, 245, 9, 225, 103, 65, 163, 139, 243, 228, 21, 117, 31, 245, 9, - 225, 103, 65, 163, 139, 243, 228, 21, 133, 31, 245, 9, 225, 103, 65, 163, - 139, 5, 216, 49, 155, 5, 253, 242, 155, 5, 214, 128, 155, 1, 61, 155, 1, - 254, 232, 155, 1, 72, 155, 1, 236, 28, 155, 1, 69, 155, 1, 215, 92, 155, - 1, 161, 149, 155, 1, 161, 150, 155, 1, 74, 155, 1, 245, 165, 155, 1, 254, - 108, 155, 1, 75, 155, 1, 227, 49, 155, 1, 253, 108, 155, 1, 181, 155, 1, - 234, 138, 155, 1, 243, 110, 155, 1, 242, 225, 155, 1, 229, 159, 155, 1, - 250, 219, 155, 1, 250, 92, 155, 1, 235, 139, 155, 1, 235, 115, 155, 1, - 228, 23, 155, 1, 216, 115, 155, 1, 216, 105, 155, 1, 248, 86, 155, 1, - 248, 70, 155, 1, 228, 198, 155, 1, 218, 52, 155, 1, 217, 161, 155, 1, - 248, 164, 155, 1, 247, 232, 155, 1, 205, 155, 1, 193, 155, 1, 226, 23, - 155, 1, 252, 107, 155, 1, 251, 195, 155, 1, 188, 155, 1, 186, 155, 1, - 203, 155, 1, 223, 81, 155, 1, 233, 157, 155, 1, 232, 213, 155, 1, 215, 1, - 155, 1, 221, 24, 155, 1, 219, 157, 155, 1, 222, 202, 155, 1, 159, 155, 5, - 228, 60, 155, 5, 253, 91, 155, 30, 5, 254, 232, 155, 30, 5, 72, 155, 30, - 5, 236, 28, 155, 30, 5, 69, 155, 30, 5, 215, 92, 155, 30, 5, 161, 149, - 155, 30, 5, 161, 223, 82, 155, 30, 5, 74, 155, 30, 5, 245, 165, 155, 30, - 5, 254, 108, 155, 30, 5, 75, 155, 30, 5, 227, 49, 155, 30, 5, 253, 108, - 155, 5, 214, 133, 155, 233, 47, 77, 155, 254, 109, 233, 47, 77, 155, 1, - 244, 164, 155, 1, 161, 223, 82, 155, 1, 161, 232, 214, 155, 30, 5, 161, - 150, 155, 30, 5, 161, 232, 214, 155, 21, 212, 79, 155, 21, 116, 155, 21, - 109, 155, 21, 166, 155, 21, 163, 155, 21, 180, 155, 21, 189, 155, 21, - 198, 155, 21, 195, 155, 21, 200, 155, 5, 235, 104, 155, 5, 215, 132, 130, - 5, 253, 242, 130, 5, 214, 128, 130, 1, 61, 130, 1, 254, 232, 130, 1, 72, - 130, 1, 236, 28, 130, 1, 69, 130, 1, 215, 92, 130, 1, 161, 149, 130, 1, - 161, 150, 130, 1, 74, 130, 1, 245, 165, 130, 1, 254, 108, 130, 1, 75, - 130, 1, 227, 49, 130, 1, 253, 108, 130, 1, 181, 130, 1, 234, 138, 130, 1, - 243, 110, 130, 1, 242, 225, 130, 1, 229, 159, 130, 1, 250, 219, 130, 1, - 250, 92, 130, 1, 235, 139, 130, 1, 235, 115, 130, 1, 228, 23, 130, 1, - 216, 115, 130, 1, 216, 105, 130, 1, 248, 86, 130, 1, 248, 70, 130, 1, - 228, 198, 130, 1, 218, 52, 130, 1, 217, 161, 130, 1, 248, 164, 130, 1, - 247, 232, 130, 1, 205, 130, 1, 228, 189, 130, 1, 193, 130, 1, 226, 23, - 130, 1, 252, 107, 130, 1, 251, 195, 130, 1, 188, 130, 1, 186, 130, 1, - 203, 130, 1, 223, 81, 130, 1, 233, 157, 130, 1, 232, 213, 130, 1, 232, - 212, 130, 1, 215, 1, 130, 1, 221, 24, 130, 1, 219, 157, 130, 1, 222, 202, - 130, 1, 159, 130, 1, 216, 88, 130, 5, 253, 91, 130, 30, 5, 254, 232, 130, - 30, 5, 72, 130, 30, 5, 236, 28, 130, 30, 5, 69, 130, 30, 5, 215, 92, 130, - 30, 5, 161, 149, 130, 30, 5, 161, 223, 82, 130, 30, 5, 74, 130, 30, 5, - 245, 165, 130, 30, 5, 254, 108, 130, 30, 5, 75, 130, 30, 5, 227, 49, 130, - 30, 5, 253, 108, 130, 5, 214, 133, 130, 1, 62, 223, 225, 130, 253, 109, - 233, 47, 77, 130, 1, 161, 223, 82, 130, 1, 161, 232, 214, 130, 30, 5, - 161, 150, 130, 30, 5, 161, 232, 214, 130, 21, 212, 79, 130, 21, 116, 130, - 21, 109, 130, 21, 166, 130, 21, 163, 130, 21, 180, 130, 21, 189, 130, 21, - 198, 130, 21, 195, 130, 21, 200, 130, 50, 217, 200, 130, 50, 122, 240, - 200, 130, 50, 122, 217, 100, 130, 243, 228, 122, 224, 166, 130, 243, 228, - 122, 242, 9, 130, 243, 228, 133, 224, 164, 130, 248, 96, 77, 130, 1, 250, - 36, 228, 199, 130, 1, 250, 36, 204, 130, 1, 250, 36, 223, 82, 130, 1, - 250, 36, 150, 130, 1, 250, 36, 232, 214, 130, 1, 250, 36, 235, 27, 172, - 5, 253, 241, 172, 5, 214, 127, 172, 1, 253, 81, 172, 1, 254, 187, 172, 1, - 254, 128, 172, 1, 254, 143, 172, 1, 235, 149, 172, 1, 236, 27, 172, 1, - 215, 84, 172, 1, 215, 86, 172, 1, 235, 171, 172, 1, 235, 172, 172, 1, - 236, 13, 172, 1, 236, 15, 172, 1, 244, 241, 172, 1, 245, 161, 172, 1, - 254, 96, 172, 1, 226, 232, 172, 1, 227, 43, 172, 1, 253, 94, 172, 1, 254, - 55, 234, 193, 172, 1, 232, 14, 234, 193, 172, 1, 254, 55, 243, 58, 172, - 1, 232, 14, 243, 58, 172, 1, 234, 234, 230, 40, 172, 1, 222, 152, 243, - 58, 172, 1, 254, 55, 250, 149, 172, 1, 232, 14, 250, 149, 172, 1, 254, - 55, 235, 128, 172, 1, 232, 14, 235, 128, 172, 1, 218, 46, 230, 40, 172, - 1, 218, 46, 222, 151, 230, 41, 172, 1, 222, 152, 235, 128, 172, 1, 254, - 55, 216, 113, 172, 1, 232, 14, 216, 113, 172, 1, 254, 55, 248, 77, 172, - 1, 232, 14, 248, 77, 172, 1, 230, 124, 230, 2, 172, 1, 222, 152, 248, 77, - 172, 1, 254, 55, 217, 237, 172, 1, 232, 14, 217, 237, 172, 1, 254, 55, - 248, 90, 172, 1, 232, 14, 248, 90, 172, 1, 248, 119, 230, 2, 172, 1, 222, - 152, 248, 90, 172, 1, 254, 55, 226, 102, 172, 1, 232, 14, 226, 102, 172, - 1, 254, 55, 252, 32, 172, 1, 232, 14, 252, 32, 172, 1, 231, 195, 172, 1, - 254, 40, 252, 32, 172, 1, 213, 42, 172, 1, 224, 26, 172, 1, 248, 119, - 233, 91, 172, 1, 214, 234, 172, 1, 218, 46, 222, 128, 172, 1, 230, 124, - 222, 128, 172, 1, 248, 119, 222, 128, 172, 1, 241, 226, 172, 1, 230, 124, - 233, 91, 172, 1, 244, 125, 172, 5, 254, 85, 172, 30, 5, 254, 138, 172, - 30, 5, 234, 161, 254, 145, 172, 30, 5, 247, 180, 254, 145, 172, 30, 5, - 234, 161, 235, 168, 172, 30, 5, 247, 180, 235, 168, 172, 30, 5, 234, 161, - 226, 212, 172, 30, 5, 247, 180, 226, 212, 172, 30, 5, 243, 99, 172, 30, - 5, 234, 24, 172, 30, 5, 247, 180, 234, 24, 172, 30, 5, 234, 26, 248, 18, - 172, 30, 5, 234, 25, 242, 28, 254, 138, 172, 30, 5, 234, 25, 242, 28, - 247, 180, 254, 138, 172, 30, 5, 234, 25, 242, 28, 243, 57, 172, 30, 5, - 243, 57, 172, 30, 5, 247, 180, 243, 99, 172, 30, 5, 247, 180, 243, 57, - 172, 225, 27, 233, 228, 154, 137, 234, 38, 234, 250, 154, 137, 234, 114, - 234, 134, 154, 137, 234, 114, 234, 107, 154, 137, 234, 114, 234, 104, - 154, 137, 234, 114, 234, 111, 154, 137, 234, 114, 224, 46, 154, 137, 229, - 91, 229, 78, 154, 137, 250, 24, 250, 83, 154, 137, 250, 24, 250, 32, 154, - 137, 250, 24, 250, 82, 154, 137, 219, 243, 219, 242, 154, 137, 250, 24, - 250, 20, 154, 137, 212, 236, 212, 243, 154, 137, 247, 100, 250, 89, 154, - 137, 211, 211, 226, 111, 154, 137, 217, 110, 217, 153, 154, 137, 217, - 110, 230, 21, 154, 137, 217, 110, 225, 243, 154, 137, 228, 186, 229, 180, - 154, 137, 247, 100, 248, 19, 154, 137, 211, 211, 218, 6, 154, 137, 217, - 110, 217, 85, 154, 137, 217, 110, 217, 157, 154, 137, 217, 110, 217, 107, - 154, 137, 228, 186, 228, 92, 154, 137, 251, 129, 252, 83, 154, 137, 225, - 151, 225, 174, 154, 137, 225, 254, 225, 245, 154, 137, 244, 13, 244, 164, - 154, 137, 225, 254, 226, 17, 154, 137, 244, 13, 244, 141, 154, 137, 225, - 254, 222, 162, 154, 137, 230, 232, 188, 154, 137, 212, 236, 213, 68, 154, - 137, 223, 113, 223, 50, 154, 137, 223, 51, 154, 137, 232, 209, 232, 235, - 154, 137, 232, 156, 154, 137, 213, 215, 214, 45, 154, 137, 219, 243, 222, - 177, 154, 137, 219, 243, 223, 25, 154, 137, 219, 243, 219, 26, 154, 137, - 241, 55, 241, 145, 154, 137, 232, 209, 250, 5, 154, 137, 157, 254, 24, - 154, 137, 241, 55, 228, 181, 154, 137, 226, 195, 154, 137, 222, 146, 61, - 154, 137, 232, 9, 242, 0, 154, 137, 222, 146, 254, 232, 154, 137, 222, - 146, 254, 45, 154, 137, 222, 146, 72, 154, 137, 222, 146, 236, 28, 154, - 137, 222, 146, 215, 183, 154, 137, 222, 146, 215, 181, 154, 137, 222, - 146, 69, 154, 137, 222, 146, 215, 92, 154, 137, 226, 0, 154, 249, 39, 16, - 252, 84, 154, 137, 222, 146, 74, 154, 137, 222, 146, 254, 148, 154, 137, - 222, 146, 75, 154, 137, 222, 146, 254, 109, 232, 4, 154, 137, 222, 146, - 254, 109, 232, 5, 154, 137, 233, 130, 154, 137, 232, 1, 154, 137, 232, 2, - 154, 137, 232, 9, 245, 137, 154, 137, 232, 9, 217, 109, 154, 137, 232, 9, - 216, 186, 154, 137, 232, 9, 250, 71, 154, 137, 217, 151, 154, 137, 229, - 36, 154, 137, 213, 62, 154, 137, 244, 4, 154, 21, 212, 79, 154, 21, 116, - 154, 21, 109, 154, 21, 166, 154, 21, 163, 154, 21, 180, 154, 21, 189, - 154, 21, 198, 154, 21, 195, 154, 21, 200, 154, 137, 254, 20, 154, 137, - 234, 112, 233, 112, 1, 234, 37, 233, 112, 1, 234, 114, 218, 235, 233, - 112, 1, 234, 114, 218, 13, 233, 112, 1, 229, 90, 233, 112, 1, 249, 175, - 233, 112, 1, 219, 243, 218, 13, 233, 112, 1, 227, 253, 233, 112, 1, 247, - 99, 233, 112, 1, 108, 233, 112, 1, 217, 110, 218, 235, 233, 112, 1, 217, - 110, 218, 13, 233, 112, 1, 228, 185, 233, 112, 1, 251, 128, 233, 112, 1, - 225, 150, 233, 112, 1, 225, 254, 218, 235, 233, 112, 1, 244, 13, 218, 13, - 233, 112, 1, 225, 254, 218, 13, 233, 112, 1, 244, 13, 218, 235, 233, 112, - 1, 230, 231, 233, 112, 1, 212, 235, 233, 112, 1, 232, 209, 232, 235, 233, - 112, 1, 232, 209, 232, 176, 233, 112, 1, 213, 214, 233, 112, 1, 219, 243, - 218, 235, 233, 112, 1, 241, 55, 218, 235, 233, 112, 1, 75, 233, 112, 1, - 241, 55, 218, 13, 233, 112, 245, 120, 233, 112, 30, 5, 61, 233, 112, 30, - 5, 232, 9, 234, 239, 233, 112, 30, 5, 254, 232, 233, 112, 30, 5, 254, 45, - 233, 112, 30, 5, 72, 233, 112, 30, 5, 236, 28, 233, 112, 30, 5, 213, 105, - 233, 112, 30, 5, 212, 161, 233, 112, 30, 5, 69, 233, 112, 30, 5, 215, 92, - 233, 112, 30, 5, 232, 9, 234, 22, 233, 112, 221, 65, 5, 232, 208, 233, - 112, 221, 65, 5, 227, 253, 233, 112, 30, 5, 74, 233, 112, 30, 5, 245, - 152, 233, 112, 30, 5, 75, 233, 112, 30, 5, 253, 83, 233, 112, 30, 5, 254, - 108, 233, 112, 234, 38, 233, 157, 233, 112, 160, 232, 9, 245, 137, 233, - 112, 160, 232, 9, 217, 109, 233, 112, 160, 232, 9, 217, 71, 233, 112, - 160, 232, 9, 250, 155, 233, 112, 250, 192, 77, 233, 112, 229, 45, 233, - 112, 21, 212, 79, 233, 112, 21, 116, 233, 112, 21, 109, 233, 112, 21, - 166, 233, 112, 21, 163, 233, 112, 21, 180, 233, 112, 21, 189, 233, 112, - 21, 198, 233, 112, 21, 195, 233, 112, 21, 200, 233, 112, 241, 55, 228, - 185, 233, 112, 241, 55, 230, 231, 60, 4, 227, 70, 60, 152, 242, 94, 212, - 247, 231, 59, 216, 147, 61, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62, - 223, 117, 251, 253, 188, 60, 152, 242, 94, 212, 247, 231, 59, 255, 62, - 242, 94, 216, 131, 188, 60, 152, 70, 212, 247, 231, 59, 231, 158, 188, - 60, 152, 249, 189, 212, 247, 231, 59, 221, 30, 188, 60, 152, 250, 171, - 212, 247, 231, 59, 225, 244, 221, 18, 188, 60, 152, 212, 247, 231, 59, - 216, 131, 221, 18, 188, 60, 152, 222, 126, 221, 17, 60, 152, 251, 57, - 212, 247, 231, 58, 60, 152, 251, 146, 220, 183, 212, 247, 231, 58, 60, - 152, 235, 194, 216, 130, 60, 152, 248, 12, 216, 131, 251, 56, 60, 152, - 221, 17, 60, 152, 228, 2, 221, 17, 60, 152, 216, 131, 221, 17, 60, 152, - 228, 2, 216, 131, 221, 17, 60, 152, 223, 133, 250, 59, 219, 168, 221, 17, - 60, 152, 223, 195, 242, 122, 221, 17, 60, 152, 250, 171, 255, 66, 223, - 55, 231, 157, 184, 250, 195, 60, 152, 242, 94, 216, 130, 60, 232, 197, 5, - 250, 90, 223, 54, 60, 232, 197, 5, 233, 23, 223, 54, 60, 253, 128, 5, - 221, 27, 243, 41, 255, 67, 223, 54, 60, 253, 128, 5, 255, 64, 193, 60, - 253, 128, 5, 222, 101, 216, 126, 60, 5, 224, 23, 247, 111, 243, 40, 60, - 5, 224, 23, 247, 111, 242, 152, 60, 5, 224, 23, 247, 111, 242, 95, 60, 5, - 224, 23, 230, 37, 243, 40, 60, 5, 224, 23, 230, 37, 242, 152, 60, 5, 224, - 23, 247, 111, 224, 23, 230, 36, 60, 21, 212, 79, 60, 21, 116, 60, 21, - 109, 60, 21, 166, 60, 21, 163, 60, 21, 180, 60, 21, 189, 60, 21, 198, 60, - 21, 195, 60, 21, 200, 60, 21, 151, 116, 60, 21, 151, 109, 60, 21, 151, - 166, 60, 21, 151, 163, 60, 21, 151, 180, 60, 21, 151, 189, 60, 21, 151, - 198, 60, 21, 151, 195, 60, 21, 151, 200, 60, 21, 151, 212, 79, 60, 152, - 251, 59, 223, 54, 60, 152, 229, 151, 250, 254, 228, 11, 212, 18, 60, 152, - 250, 171, 255, 66, 223, 55, 250, 255, 231, 15, 250, 195, 60, 152, 229, - 151, 250, 254, 221, 28, 223, 54, 60, 152, 250, 68, 231, 58, 60, 152, 216, - 142, 255, 63, 60, 152, 242, 81, 223, 55, 242, 44, 60, 152, 242, 81, 223, - 55, 242, 50, 60, 152, 254, 25, 234, 129, 242, 44, 60, 152, 254, 25, 234, - 129, 242, 50, 60, 5, 213, 55, 216, 129, 60, 5, 231, 230, 216, 129, 60, 1, - 181, 60, 1, 234, 138, 60, 1, 243, 110, 60, 1, 242, 225, 60, 1, 229, 159, - 60, 1, 250, 219, 60, 1, 250, 92, 60, 1, 235, 139, 60, 1, 228, 23, 60, 1, - 216, 115, 60, 1, 216, 105, 60, 1, 248, 86, 60, 1, 248, 70, 60, 1, 228, - 198, 60, 1, 218, 52, 60, 1, 217, 161, 60, 1, 248, 164, 60, 1, 247, 232, - 60, 1, 205, 60, 1, 193, 60, 1, 226, 23, 60, 1, 252, 107, 60, 1, 251, 195, - 60, 1, 188, 60, 1, 216, 141, 60, 1, 216, 133, 60, 1, 245, 249, 60, 1, - 245, 244, 60, 1, 214, 49, 60, 1, 212, 75, 60, 1, 212, 109, 60, 1, 255, - 69, 60, 1, 186, 60, 1, 203, 60, 1, 233, 157, 60, 1, 221, 24, 60, 1, 219, - 157, 60, 1, 222, 202, 60, 1, 159, 60, 1, 61, 60, 1, 233, 241, 60, 1, 244, - 46, 203, 60, 1, 234, 55, 60, 1, 223, 81, 60, 30, 5, 254, 232, 60, 30, 5, - 72, 60, 30, 5, 236, 28, 60, 30, 5, 69, 60, 30, 5, 215, 92, 60, 30, 5, - 161, 149, 60, 30, 5, 161, 223, 82, 60, 30, 5, 161, 150, 60, 30, 5, 161, - 232, 214, 60, 30, 5, 74, 60, 30, 5, 245, 165, 60, 30, 5, 75, 60, 30, 5, - 227, 49, 60, 5, 223, 118, 219, 28, 229, 160, 223, 112, 60, 5, 223, 117, - 251, 252, 60, 30, 5, 223, 202, 72, 60, 30, 5, 223, 202, 236, 28, 60, 5, - 228, 11, 212, 19, 230, 44, 248, 164, 60, 5, 219, 255, 233, 84, 60, 152, - 242, 11, 60, 152, 226, 184, 60, 5, 233, 87, 223, 54, 60, 5, 213, 59, 223, - 54, 60, 5, 233, 88, 216, 142, 250, 195, 60, 5, 231, 159, 250, 195, 60, 5, - 242, 97, 250, 196, 223, 193, 60, 5, 242, 97, 231, 150, 223, 193, 60, 5, - 235, 191, 231, 159, 250, 195, 60, 219, 18, 5, 233, 88, 216, 142, 250, - 195, 60, 219, 18, 5, 231, 159, 250, 195, 60, 219, 18, 5, 235, 191, 231, - 159, 250, 195, 60, 219, 18, 1, 181, 60, 219, 18, 1, 234, 138, 60, 219, - 18, 1, 243, 110, 60, 219, 18, 1, 242, 225, 60, 219, 18, 1, 229, 159, 60, - 219, 18, 1, 250, 219, 60, 219, 18, 1, 250, 92, 60, 219, 18, 1, 235, 139, - 60, 219, 18, 1, 228, 23, 60, 219, 18, 1, 216, 115, 60, 219, 18, 1, 216, - 105, 60, 219, 18, 1, 248, 86, 60, 219, 18, 1, 248, 70, 60, 219, 18, 1, - 228, 198, 60, 219, 18, 1, 218, 52, 60, 219, 18, 1, 217, 161, 60, 219, 18, - 1, 248, 164, 60, 219, 18, 1, 247, 232, 60, 219, 18, 1, 205, 60, 219, 18, - 1, 193, 60, 219, 18, 1, 226, 23, 60, 219, 18, 1, 252, 107, 60, 219, 18, - 1, 251, 195, 60, 219, 18, 1, 188, 60, 219, 18, 1, 216, 141, 60, 219, 18, - 1, 216, 133, 60, 219, 18, 1, 245, 249, 60, 219, 18, 1, 245, 244, 60, 219, - 18, 1, 214, 49, 60, 219, 18, 1, 212, 75, 60, 219, 18, 1, 212, 109, 60, - 219, 18, 1, 255, 69, 60, 219, 18, 1, 186, 60, 219, 18, 1, 203, 60, 219, - 18, 1, 233, 157, 60, 219, 18, 1, 221, 24, 60, 219, 18, 1, 219, 157, 60, - 219, 18, 1, 222, 202, 60, 219, 18, 1, 159, 60, 219, 18, 1, 61, 60, 219, - 18, 1, 233, 241, 60, 219, 18, 1, 244, 46, 214, 49, 60, 219, 18, 1, 244, - 46, 186, 60, 219, 18, 1, 244, 46, 203, 60, 233, 239, 223, 52, 234, 138, - 60, 233, 239, 223, 52, 234, 139, 250, 255, 231, 15, 250, 195, 60, 250, - 184, 5, 107, 251, 246, 60, 250, 184, 5, 177, 251, 246, 60, 250, 184, 5, - 250, 185, 217, 228, 60, 250, 184, 5, 222, 125, 255, 68, 60, 16, 246, 46, - 251, 54, 60, 16, 224, 22, 223, 119, 60, 16, 226, 202, 243, 39, 60, 16, - 224, 22, 223, 120, 223, 195, 242, 121, 60, 16, 225, 244, 193, 60, 16, - 228, 170, 251, 54, 60, 16, 228, 170, 251, 55, 228, 2, 255, 65, 60, 16, - 228, 170, 251, 55, 242, 96, 255, 65, 60, 16, 228, 170, 251, 55, 250, 255, - 255, 65, 60, 5, 224, 23, 230, 37, 224, 23, 247, 110, 60, 5, 224, 23, 230, - 37, 242, 95, 60, 152, 251, 58, 220, 183, 242, 191, 231, 59, 223, 194, 60, - 152, 230, 233, 212, 247, 242, 191, 231, 59, 223, 194, 60, 152, 228, 2, - 216, 130, 60, 152, 70, 251, 79, 223, 114, 212, 247, 231, 59, 231, 158, - 188, 60, 152, 249, 189, 251, 79, 223, 114, 212, 247, 231, 59, 221, 30, - 188, 223, 147, 218, 200, 52, 233, 69, 218, 200, 52, 223, 147, 218, 200, - 5, 2, 247, 72, 233, 69, 218, 200, 5, 2, 247, 72, 60, 152, 233, 79, 231, - 160, 223, 54, 60, 152, 216, 207, 231, 160, 223, 54, 64, 1, 181, 64, 1, - 234, 138, 64, 1, 243, 110, 64, 1, 242, 225, 64, 1, 229, 159, 64, 1, 250, - 219, 64, 1, 250, 92, 64, 1, 235, 139, 64, 1, 235, 115, 64, 1, 228, 23, - 64, 1, 228, 187, 64, 1, 216, 115, 64, 1, 216, 105, 64, 1, 248, 86, 64, 1, - 248, 70, 64, 1, 228, 198, 64, 1, 218, 52, 64, 1, 217, 161, 64, 1, 248, - 164, 64, 1, 247, 232, 64, 1, 205, 64, 1, 193, 64, 1, 226, 23, 64, 1, 252, - 107, 64, 1, 251, 195, 64, 1, 188, 64, 1, 186, 64, 1, 203, 64, 1, 233, - 157, 64, 1, 214, 49, 64, 1, 222, 202, 64, 1, 159, 64, 1, 232, 213, 64, 1, - 61, 64, 1, 221, 9, 61, 64, 1, 72, 64, 1, 236, 28, 64, 1, 69, 64, 1, 215, - 92, 64, 1, 74, 64, 1, 230, 221, 74, 64, 1, 75, 64, 1, 253, 108, 64, 30, - 5, 218, 15, 254, 232, 64, 30, 5, 254, 232, 64, 30, 5, 72, 64, 30, 5, 236, - 28, 64, 30, 5, 69, 64, 30, 5, 215, 92, 64, 30, 5, 74, 64, 30, 5, 254, - 108, 64, 30, 5, 230, 221, 236, 28, 64, 30, 5, 230, 221, 75, 64, 30, 5, - 191, 49, 64, 5, 253, 242, 64, 5, 62, 55, 64, 5, 214, 128, 64, 5, 214, - 133, 64, 5, 253, 150, 64, 249, 133, 5, 138, 186, 64, 249, 133, 5, 138, - 203, 64, 249, 133, 5, 138, 214, 49, 64, 249, 133, 5, 138, 159, 64, 1, - 242, 109, 222, 202, 64, 21, 212, 79, 64, 21, 116, 64, 21, 109, 64, 21, - 166, 64, 21, 163, 64, 21, 180, 64, 21, 189, 64, 21, 198, 64, 21, 195, 64, - 21, 200, 64, 5, 232, 221, 222, 91, 64, 5, 222, 91, 64, 16, 232, 205, 64, - 16, 249, 152, 64, 16, 254, 125, 64, 16, 243, 24, 64, 1, 221, 24, 64, 1, - 219, 157, 64, 1, 161, 149, 64, 1, 161, 223, 82, 64, 1, 161, 150, 64, 1, - 161, 232, 214, 64, 30, 5, 161, 149, 64, 30, 5, 161, 223, 82, 64, 30, 5, - 161, 150, 64, 30, 5, 161, 232, 214, 64, 1, 230, 221, 229, 159, 64, 1, - 230, 221, 235, 115, 64, 1, 230, 221, 252, 31, 64, 1, 230, 221, 252, 26, - 64, 249, 133, 5, 230, 221, 138, 205, 64, 249, 133, 5, 230, 221, 138, 188, - 64, 249, 133, 5, 230, 221, 138, 233, 157, 64, 1, 221, 29, 234, 218, 221, - 24, 64, 30, 5, 221, 29, 234, 218, 245, 22, 64, 160, 152, 221, 29, 234, - 218, 241, 230, 64, 160, 152, 221, 29, 234, 218, 234, 189, 225, 253, 64, - 1, 213, 248, 224, 252, 234, 218, 217, 161, 64, 1, 213, 248, 224, 252, - 234, 218, 225, 2, 64, 30, 5, 213, 248, 224, 252, 234, 218, 245, 22, 64, - 30, 5, 213, 248, 224, 252, 234, 218, 215, 183, 64, 5, 213, 248, 224, 252, - 234, 218, 216, 240, 64, 5, 213, 248, 224, 252, 234, 218, 216, 239, 64, 5, - 213, 248, 224, 252, 234, 218, 216, 238, 64, 5, 213, 248, 224, 252, 234, - 218, 216, 237, 64, 5, 213, 248, 224, 252, 234, 218, 216, 236, 64, 1, 245, - 175, 224, 252, 234, 218, 228, 198, 64, 1, 245, 175, 224, 252, 234, 218, - 212, 168, 64, 1, 245, 175, 224, 252, 234, 218, 242, 193, 64, 30, 5, 243, - 35, 234, 218, 72, 64, 30, 5, 234, 194, 227, 99, 64, 30, 5, 234, 194, 69, - 64, 30, 5, 234, 194, 245, 165, 64, 1, 221, 9, 181, 64, 1, 221, 9, 234, - 138, 64, 1, 221, 9, 243, 110, 64, 1, 221, 9, 250, 219, 64, 1, 221, 9, - 212, 109, 64, 1, 221, 9, 228, 23, 64, 1, 221, 9, 248, 164, 64, 1, 221, 9, - 205, 64, 1, 221, 9, 226, 23, 64, 1, 221, 9, 244, 164, 64, 1, 221, 9, 252, - 107, 64, 1, 221, 9, 217, 161, 64, 1, 221, 9, 159, 64, 249, 133, 5, 221, - 9, 138, 214, 49, 64, 30, 5, 221, 9, 254, 232, 64, 30, 5, 221, 9, 74, 64, - 30, 5, 221, 9, 191, 49, 64, 30, 5, 221, 9, 40, 213, 105, 64, 5, 221, 9, - 216, 239, 64, 5, 221, 9, 216, 238, 64, 5, 221, 9, 216, 236, 64, 5, 221, - 9, 216, 235, 64, 5, 221, 9, 249, 91, 216, 239, 64, 5, 221, 9, 249, 91, - 216, 238, 64, 5, 221, 9, 249, 91, 245, 111, 216, 241, 64, 1, 223, 39, - 226, 190, 244, 164, 64, 5, 223, 39, 226, 190, 216, 236, 64, 221, 9, 21, - 212, 79, 64, 221, 9, 21, 116, 64, 221, 9, 21, 109, 64, 221, 9, 21, 166, - 64, 221, 9, 21, 163, 64, 221, 9, 21, 180, 64, 221, 9, 21, 189, 64, 221, - 9, 21, 198, 64, 221, 9, 21, 195, 64, 221, 9, 21, 200, 64, 5, 234, 132, - 216, 240, 64, 5, 234, 132, 216, 238, 64, 30, 5, 254, 98, 61, 64, 30, 5, - 254, 98, 254, 108, 64, 16, 221, 9, 116, 64, 16, 221, 9, 244, 253, 100, 6, - 1, 254, 32, 100, 6, 1, 252, 71, 100, 6, 1, 243, 82, 100, 6, 1, 247, 82, - 100, 6, 1, 245, 108, 100, 6, 1, 214, 141, 100, 6, 1, 212, 82, 100, 6, 1, - 218, 11, 100, 6, 1, 235, 251, 100, 6, 1, 234, 239, 100, 6, 1, 233, 104, - 100, 6, 1, 231, 248, 100, 6, 1, 230, 15, 100, 6, 1, 227, 62, 100, 6, 1, - 226, 145, 100, 6, 1, 212, 71, 100, 6, 1, 224, 61, 100, 6, 1, 222, 159, - 100, 6, 1, 218, 1, 100, 6, 1, 215, 160, 100, 6, 1, 226, 16, 100, 6, 1, - 234, 127, 100, 6, 1, 242, 217, 100, 6, 1, 224, 217, 100, 6, 1, 220, 200, - 100, 6, 1, 250, 34, 100, 6, 1, 250, 195, 100, 6, 1, 235, 103, 100, 6, 1, - 249, 233, 100, 6, 1, 250, 79, 100, 6, 1, 213, 151, 100, 6, 1, 235, 113, - 100, 6, 1, 242, 24, 100, 6, 1, 241, 222, 100, 6, 1, 241, 160, 100, 6, 1, - 214, 6, 100, 6, 1, 241, 243, 100, 6, 1, 241, 51, 100, 1, 254, 32, 100, 1, - 252, 71, 100, 1, 243, 82, 100, 1, 247, 82, 100, 1, 245, 108, 100, 1, 214, - 141, 100, 1, 212, 82, 100, 1, 218, 11, 100, 1, 235, 251, 100, 1, 234, - 239, 100, 1, 233, 104, 100, 1, 231, 248, 100, 1, 230, 15, 100, 1, 227, - 62, 100, 1, 226, 145, 100, 1, 212, 71, 100, 1, 224, 61, 100, 1, 222, 159, - 100, 1, 218, 1, 100, 1, 215, 160, 100, 1, 226, 16, 100, 1, 234, 127, 100, - 1, 242, 217, 100, 1, 224, 217, 100, 1, 220, 200, 100, 1, 250, 34, 100, 1, - 250, 195, 100, 1, 235, 103, 100, 1, 249, 233, 100, 1, 250, 79, 100, 1, - 213, 151, 100, 1, 235, 113, 100, 1, 242, 24, 100, 1, 241, 222, 100, 1, - 241, 160, 100, 1, 214, 6, 100, 1, 241, 243, 100, 1, 241, 51, 100, 1, 244, - 90, 100, 1, 212, 237, 100, 1, 245, 122, 100, 1, 216, 58, 243, 82, 100, 1, - 254, 103, 100, 226, 143, 221, 57, 59, 1, 100, 230, 15, 23, 97, 234, 67, - 23, 97, 219, 150, 23, 97, 229, 57, 23, 97, 217, 55, 23, 97, 219, 139, 23, - 97, 223, 179, 23, 97, 231, 30, 23, 97, 225, 227, 23, 97, 219, 147, 23, - 97, 220, 76, 23, 97, 219, 144, 23, 97, 236, 51, 23, 97, 249, 239, 23, 97, - 219, 154, 23, 97, 250, 43, 23, 97, 234, 116, 23, 97, 217, 126, 23, 97, - 226, 7, 23, 97, 241, 158, 23, 97, 229, 53, 23, 97, 219, 148, 23, 97, 229, - 47, 23, 97, 229, 51, 23, 97, 217, 52, 23, 97, 223, 167, 23, 97, 219, 146, - 23, 97, 223, 177, 23, 97, 234, 223, 23, 97, 231, 23, 23, 97, 234, 226, - 23, 97, 225, 222, 23, 97, 225, 220, 23, 97, 225, 208, 23, 97, 225, 216, - 23, 97, 225, 214, 23, 97, 225, 211, 23, 97, 225, 213, 23, 97, 225, 210, - 23, 97, 225, 215, 23, 97, 225, 225, 23, 97, 225, 226, 23, 97, 225, 209, - 23, 97, 225, 219, 23, 97, 234, 224, 23, 97, 234, 222, 23, 97, 220, 69, - 23, 97, 220, 67, 23, 97, 220, 59, 23, 97, 220, 62, 23, 97, 220, 68, 23, - 97, 220, 64, 23, 97, 220, 63, 23, 97, 220, 61, 23, 97, 220, 72, 23, 97, - 220, 74, 23, 97, 220, 75, 23, 97, 220, 70, 23, 97, 220, 60, 23, 97, 220, - 65, 23, 97, 220, 73, 23, 97, 250, 27, 23, 97, 250, 25, 23, 97, 250, 102, - 23, 97, 250, 100, 23, 97, 226, 160, 23, 97, 236, 46, 23, 97, 236, 37, 23, - 97, 236, 45, 23, 97, 236, 42, 23, 97, 236, 40, 23, 97, 236, 44, 23, 97, - 219, 151, 23, 97, 236, 49, 23, 97, 236, 50, 23, 97, 236, 38, 23, 97, 236, - 43, 23, 97, 213, 17, 23, 97, 249, 238, 23, 97, 250, 28, 23, 97, 250, 26, - 23, 97, 250, 103, 23, 97, 250, 101, 23, 97, 250, 41, 23, 97, 250, 42, 23, - 97, 250, 29, 23, 97, 250, 104, 23, 97, 226, 5, 23, 97, 234, 225, 23, 97, - 219, 152, 23, 97, 213, 23, 23, 97, 234, 58, 23, 97, 229, 49, 23, 97, 229, - 55, 23, 97, 229, 54, 23, 97, 217, 49, 23, 97, 244, 72, 23, 135, 244, 72, - 23, 135, 61, 23, 135, 254, 148, 23, 135, 186, 23, 135, 213, 80, 23, 135, - 245, 76, 23, 135, 74, 23, 135, 213, 27, 23, 135, 213, 38, 23, 135, 75, - 23, 135, 214, 49, 23, 135, 214, 46, 23, 135, 227, 99, 23, 135, 212, 235, - 23, 135, 69, 23, 135, 213, 252, 23, 135, 214, 6, 23, 135, 213, 235, 23, - 135, 212, 203, 23, 135, 245, 22, 23, 135, 212, 255, 23, 135, 72, 23, 135, - 255, 60, 23, 135, 255, 59, 23, 135, 213, 94, 23, 135, 213, 92, 23, 135, - 245, 74, 23, 135, 245, 73, 23, 135, 245, 75, 23, 135, 213, 26, 23, 135, - 213, 25, 23, 135, 227, 204, 23, 135, 227, 205, 23, 135, 227, 198, 23, - 135, 227, 203, 23, 135, 227, 201, 23, 135, 212, 229, 23, 135, 212, 228, - 23, 135, 212, 227, 23, 135, 212, 230, 23, 135, 212, 231, 23, 135, 215, - 252, 23, 135, 215, 251, 23, 135, 215, 250, 23, 135, 215, 247, 23, 135, - 215, 248, 23, 135, 212, 202, 23, 135, 212, 199, 23, 135, 212, 200, 23, - 135, 212, 194, 23, 135, 212, 195, 23, 135, 212, 196, 23, 135, 212, 198, - 23, 135, 245, 16, 23, 135, 245, 18, 23, 135, 212, 254, 23, 135, 240, 145, - 23, 135, 240, 137, 23, 135, 240, 140, 23, 135, 240, 138, 23, 135, 240, - 142, 23, 135, 240, 144, 23, 135, 253, 204, 23, 135, 253, 201, 23, 135, - 253, 199, 23, 135, 253, 200, 23, 135, 219, 155, 23, 135, 255, 61, 23, - 135, 213, 93, 23, 135, 213, 24, 23, 135, 227, 200, 23, 135, 227, 199, 23, - 89, 234, 67, 23, 89, 219, 150, 23, 89, 234, 60, 23, 89, 229, 57, 23, 89, - 229, 55, 23, 89, 229, 54, 23, 89, 217, 55, 23, 89, 223, 179, 23, 89, 223, - 174, 23, 89, 223, 171, 23, 89, 223, 164, 23, 89, 223, 159, 23, 89, 223, - 154, 23, 89, 223, 165, 23, 89, 223, 177, 23, 89, 231, 30, 23, 89, 225, - 227, 23, 89, 225, 216, 23, 89, 220, 76, 23, 89, 219, 144, 23, 89, 236, - 51, 23, 89, 249, 239, 23, 89, 250, 43, 23, 89, 234, 116, 23, 89, 217, - 126, 23, 89, 226, 7, 23, 89, 241, 158, 23, 89, 234, 61, 23, 89, 234, 59, - 23, 89, 229, 53, 23, 89, 229, 47, 23, 89, 229, 49, 23, 89, 229, 52, 23, - 89, 229, 48, 23, 89, 217, 52, 23, 89, 217, 49, 23, 89, 223, 172, 23, 89, - 223, 167, 23, 89, 223, 153, 23, 89, 223, 152, 23, 89, 219, 146, 23, 89, - 223, 169, 23, 89, 223, 168, 23, 89, 223, 161, 23, 89, 223, 163, 23, 89, - 223, 176, 23, 89, 223, 156, 23, 89, 223, 166, 23, 89, 223, 175, 23, 89, - 223, 151, 23, 89, 231, 26, 23, 89, 231, 21, 23, 89, 231, 23, 23, 89, 231, - 20, 23, 89, 231, 18, 23, 89, 231, 24, 23, 89, 231, 29, 23, 89, 231, 27, - 23, 89, 234, 226, 23, 89, 225, 218, 23, 89, 225, 219, 23, 89, 225, 224, - 23, 89, 234, 224, 23, 89, 220, 69, 23, 89, 220, 59, 23, 89, 220, 62, 23, - 89, 220, 64, 23, 89, 226, 160, 23, 89, 236, 46, 23, 89, 236, 39, 23, 89, - 219, 151, 23, 89, 236, 47, 23, 89, 213, 17, 23, 89, 213, 13, 23, 89, 213, - 14, 23, 89, 226, 5, 23, 89, 234, 225, 23, 89, 241, 156, 23, 89, 241, 154, - 23, 89, 241, 157, 23, 89, 241, 155, 23, 89, 213, 23, 23, 89, 234, 63, 23, - 89, 234, 62, 23, 89, 234, 66, 23, 89, 234, 64, 23, 89, 234, 65, 23, 89, - 219, 148, 28, 4, 159, 28, 4, 240, 212, 28, 4, 241, 165, 28, 4, 242, 27, - 28, 4, 241, 204, 28, 4, 241, 222, 28, 4, 241, 54, 28, 4, 241, 53, 28, 4, - 233, 157, 28, 4, 232, 156, 28, 4, 233, 13, 28, 4, 233, 156, 28, 4, 233, - 74, 28, 4, 233, 82, 28, 4, 232, 208, 28, 4, 232, 129, 28, 4, 241, 174, - 28, 4, 241, 168, 28, 4, 241, 170, 28, 4, 241, 173, 28, 4, 241, 171, 28, - 4, 241, 172, 28, 4, 241, 169, 28, 4, 241, 167, 28, 4, 188, 28, 4, 230, - 172, 28, 4, 231, 42, 28, 4, 232, 41, 28, 4, 231, 145, 28, 4, 231, 156, - 28, 4, 230, 231, 28, 4, 230, 114, 28, 4, 218, 110, 28, 4, 218, 104, 28, - 4, 218, 106, 28, 4, 218, 109, 28, 4, 218, 107, 28, 4, 218, 108, 28, 4, - 218, 105, 28, 4, 218, 103, 28, 4, 203, 28, 4, 223, 51, 28, 4, 223, 188, - 28, 4, 224, 74, 28, 4, 224, 1, 28, 4, 224, 21, 28, 4, 223, 112, 28, 4, - 223, 21, 28, 4, 222, 202, 28, 4, 219, 27, 28, 4, 220, 117, 28, 4, 222, - 200, 28, 4, 222, 89, 28, 4, 222, 100, 28, 4, 219, 242, 28, 4, 218, 198, - 28, 4, 221, 24, 28, 4, 220, 150, 28, 4, 220, 212, 28, 4, 221, 20, 28, 4, - 220, 241, 28, 4, 220, 243, 28, 4, 220, 187, 28, 4, 220, 134, 28, 4, 224, - 232, 28, 4, 224, 175, 28, 4, 224, 198, 28, 4, 224, 231, 28, 4, 224, 212, - 28, 4, 224, 213, 28, 4, 224, 187, 28, 4, 224, 186, 28, 4, 224, 131, 28, - 4, 224, 127, 28, 4, 224, 130, 28, 4, 224, 128, 28, 4, 224, 129, 28, 4, - 224, 210, 28, 4, 224, 204, 28, 4, 224, 206, 28, 4, 224, 209, 28, 4, 224, - 207, 28, 4, 224, 208, 28, 4, 224, 205, 28, 4, 224, 203, 28, 4, 224, 199, - 28, 4, 224, 202, 28, 4, 224, 200, 28, 4, 224, 201, 28, 4, 252, 107, 28, - 4, 251, 54, 28, 4, 251, 184, 28, 4, 252, 106, 28, 4, 251, 242, 28, 4, - 251, 251, 28, 4, 251, 128, 28, 4, 251, 12, 28, 4, 215, 1, 28, 4, 214, 99, - 28, 4, 214, 154, 28, 4, 215, 0, 28, 4, 214, 227, 28, 4, 214, 232, 28, 4, - 214, 119, 28, 4, 214, 91, 28, 4, 218, 52, 28, 4, 216, 82, 28, 4, 217, 71, - 28, 4, 218, 49, 28, 4, 217, 219, 28, 4, 217, 229, 28, 4, 108, 28, 4, 216, - 45, 28, 4, 250, 219, 28, 4, 249, 53, 28, 4, 249, 244, 28, 4, 250, 218, - 28, 4, 250, 116, 28, 4, 250, 124, 28, 4, 249, 175, 28, 4, 249, 24, 28, 4, - 213, 153, 28, 4, 213, 129, 28, 4, 213, 145, 28, 4, 213, 152, 28, 4, 213, - 149, 28, 4, 213, 150, 28, 4, 213, 136, 28, 4, 213, 135, 28, 4, 213, 124, - 28, 4, 213, 120, 28, 4, 213, 123, 28, 4, 213, 121, 28, 4, 213, 122, 28, - 4, 205, 28, 4, 228, 92, 28, 4, 229, 64, 28, 4, 230, 43, 28, 4, 229, 184, - 28, 4, 229, 187, 28, 4, 228, 185, 28, 4, 228, 31, 28, 4, 228, 23, 28, 4, - 227, 247, 28, 4, 228, 10, 28, 4, 228, 22, 28, 4, 228, 16, 28, 4, 228, 17, - 28, 4, 227, 253, 28, 4, 227, 239, 28, 4, 242, 156, 61, 28, 4, 242, 156, - 69, 28, 4, 242, 156, 72, 28, 4, 242, 156, 254, 232, 28, 4, 242, 156, 245, - 165, 28, 4, 242, 156, 74, 28, 4, 242, 156, 75, 28, 4, 242, 156, 214, 49, - 28, 4, 181, 28, 4, 233, 238, 28, 4, 234, 101, 28, 4, 235, 14, 28, 4, 234, - 187, 28, 4, 234, 188, 28, 4, 234, 37, 28, 4, 234, 36, 28, 4, 233, 204, - 28, 4, 233, 198, 28, 4, 233, 203, 28, 4, 233, 199, 28, 4, 233, 200, 28, - 4, 233, 193, 28, 4, 233, 187, 28, 4, 233, 189, 28, 4, 233, 192, 28, 4, - 233, 190, 28, 4, 233, 191, 28, 4, 233, 188, 28, 4, 233, 186, 28, 4, 233, - 182, 28, 4, 233, 185, 28, 4, 233, 183, 28, 4, 233, 184, 28, 4, 214, 49, - 28, 4, 213, 183, 28, 4, 213, 235, 28, 4, 214, 48, 28, 4, 214, 1, 28, 4, - 214, 6, 28, 4, 213, 214, 28, 4, 213, 213, 28, 4, 226, 15, 61, 28, 4, 226, - 15, 69, 28, 4, 226, 15, 72, 28, 4, 226, 15, 254, 232, 28, 4, 226, 15, - 245, 165, 28, 4, 226, 15, 74, 28, 4, 226, 15, 75, 28, 4, 212, 109, 28, 4, - 212, 8, 28, 4, 212, 37, 28, 4, 212, 108, 28, 4, 212, 85, 28, 4, 212, 87, - 28, 4, 212, 16, 28, 4, 211, 251, 28, 4, 212, 75, 28, 4, 212, 55, 28, 4, - 212, 62, 28, 4, 212, 74, 28, 4, 212, 66, 28, 4, 212, 67, 28, 4, 212, 60, - 28, 4, 212, 46, 28, 4, 186, 28, 4, 212, 203, 28, 4, 212, 255, 28, 4, 213, - 91, 28, 4, 213, 35, 28, 4, 213, 38, 28, 4, 212, 235, 28, 4, 212, 226, 28, - 4, 248, 164, 28, 4, 246, 33, 28, 4, 247, 211, 28, 4, 248, 163, 28, 4, - 248, 28, 28, 4, 248, 41, 28, 4, 247, 99, 28, 4, 246, 2, 28, 4, 248, 86, - 28, 4, 248, 51, 28, 4, 248, 63, 28, 4, 248, 85, 28, 4, 248, 73, 28, 4, - 248, 74, 28, 4, 248, 56, 28, 4, 248, 42, 28, 4, 235, 139, 28, 4, 235, 54, - 28, 4, 235, 110, 28, 4, 235, 138, 28, 4, 235, 125, 28, 4, 235, 127, 28, - 4, 235, 71, 28, 4, 235, 35, 28, 4, 243, 110, 28, 4, 242, 92, 28, 4, 242, - 190, 28, 4, 243, 107, 28, 4, 243, 31, 28, 4, 243, 38, 28, 4, 242, 150, - 28, 4, 242, 149, 28, 4, 242, 59, 28, 4, 242, 55, 28, 4, 242, 58, 28, 4, - 242, 56, 28, 4, 242, 57, 28, 4, 243, 5, 28, 4, 242, 241, 28, 4, 242, 251, - 28, 4, 243, 4, 28, 4, 242, 255, 28, 4, 243, 0, 28, 4, 242, 245, 28, 4, - 242, 230, 28, 4, 217, 161, 28, 4, 217, 90, 28, 4, 217, 128, 28, 4, 217, - 160, 28, 4, 217, 147, 28, 4, 217, 148, 28, 4, 217, 109, 28, 4, 217, 82, - 28, 4, 250, 92, 28, 4, 250, 6, 28, 4, 250, 47, 28, 4, 250, 91, 28, 4, - 250, 64, 28, 4, 250, 67, 28, 4, 250, 23, 28, 4, 249, 251, 28, 4, 226, 23, - 28, 4, 225, 246, 28, 4, 226, 9, 28, 4, 226, 22, 28, 4, 226, 11, 28, 4, - 226, 12, 28, 4, 225, 253, 28, 4, 225, 242, 28, 4, 216, 141, 28, 4, 216, - 122, 28, 4, 216, 125, 28, 4, 216, 140, 28, 4, 216, 135, 28, 4, 216, 136, - 28, 4, 216, 124, 28, 4, 216, 120, 28, 4, 216, 5, 28, 4, 215, 253, 28, 4, - 216, 1, 28, 4, 216, 4, 28, 4, 216, 2, 28, 4, 216, 3, 28, 4, 215, 255, 28, - 4, 215, 254, 28, 4, 244, 164, 28, 4, 243, 205, 28, 4, 244, 90, 28, 4, - 244, 163, 28, 4, 244, 116, 28, 4, 244, 123, 28, 4, 244, 12, 28, 4, 243, - 188, 28, 4, 193, 28, 4, 225, 35, 28, 4, 225, 240, 28, 4, 226, 213, 28, 4, - 226, 86, 28, 4, 226, 96, 28, 4, 225, 150, 28, 4, 225, 2, 28, 4, 223, 11, - 28, 4, 230, 103, 28, 4, 243, 182, 28, 37, 243, 29, 24, 30, 233, 47, 77, - 28, 37, 30, 233, 47, 77, 28, 37, 243, 29, 77, 28, 222, 92, 77, 28, 213, - 195, 28, 243, 200, 219, 69, 28, 249, 157, 28, 221, 70, 28, 249, 164, 28, - 225, 79, 249, 164, 28, 224, 158, 77, 28, 226, 143, 221, 57, 28, 21, 116, - 28, 21, 109, 28, 21, 166, 28, 21, 163, 28, 21, 180, 28, 21, 189, 28, 21, - 198, 28, 21, 195, 28, 21, 200, 28, 50, 217, 200, 28, 50, 216, 38, 28, 50, - 217, 115, 28, 50, 243, 240, 28, 50, 244, 83, 28, 50, 220, 39, 28, 50, - 221, 37, 28, 50, 245, 141, 28, 50, 229, 26, 28, 50, 240, 200, 28, 50, - 217, 201, 217, 100, 28, 4, 222, 96, 230, 114, 28, 4, 230, 110, 28, 4, - 230, 111, 28, 4, 230, 112, 28, 4, 222, 96, 251, 12, 28, 4, 251, 9, 28, 4, - 251, 10, 28, 4, 251, 11, 28, 4, 222, 96, 243, 188, 28, 4, 243, 184, 28, - 4, 243, 185, 28, 4, 243, 186, 28, 4, 222, 96, 225, 2, 28, 4, 224, 254, - 28, 4, 224, 255, 28, 4, 225, 0, 28, 216, 242, 152, 212, 238, 28, 216, - 242, 152, 247, 248, 28, 216, 242, 152, 223, 135, 28, 216, 242, 152, 220, - 175, 223, 135, 28, 216, 242, 152, 247, 187, 28, 216, 242, 152, 234, 170, - 28, 216, 242, 152, 250, 31, 28, 216, 242, 152, 241, 162, 28, 216, 242, - 152, 247, 247, 28, 216, 242, 152, 233, 215, 158, 1, 61, 158, 1, 74, 158, - 1, 72, 158, 1, 75, 158, 1, 69, 158, 1, 215, 79, 158, 1, 243, 110, 158, 1, - 181, 158, 1, 243, 38, 158, 1, 242, 190, 158, 1, 242, 150, 158, 1, 242, - 92, 158, 1, 242, 60, 158, 1, 159, 158, 1, 241, 222, 158, 1, 241, 165, - 158, 1, 241, 54, 158, 1, 240, 212, 158, 1, 240, 193, 158, 1, 233, 157, - 158, 1, 233, 82, 158, 1, 233, 13, 158, 1, 232, 208, 158, 1, 232, 156, - 158, 1, 232, 130, 158, 1, 188, 158, 1, 231, 156, 158, 1, 231, 42, 158, 1, - 230, 231, 158, 1, 230, 172, 158, 1, 205, 158, 1, 241, 76, 158, 1, 230, - 31, 158, 1, 229, 187, 158, 1, 229, 64, 158, 1, 228, 185, 158, 1, 228, 92, - 158, 1, 228, 33, 158, 1, 224, 174, 158, 1, 224, 161, 158, 1, 224, 154, - 158, 1, 224, 146, 158, 1, 224, 135, 158, 1, 224, 133, 158, 1, 222, 202, - 158, 1, 197, 158, 1, 222, 100, 158, 1, 220, 117, 158, 1, 219, 242, 158, - 1, 219, 27, 158, 1, 218, 203, 158, 1, 248, 164, 158, 1, 218, 52, 158, 1, - 248, 41, 158, 1, 217, 229, 158, 1, 247, 211, 158, 1, 217, 71, 158, 1, - 247, 99, 158, 1, 246, 33, 158, 1, 246, 5, 158, 1, 247, 108, 158, 1, 217, - 12, 158, 1, 217, 11, 158, 1, 217, 1, 158, 1, 217, 0, 158, 1, 216, 255, - 158, 1, 216, 254, 158, 1, 216, 141, 158, 1, 216, 136, 158, 1, 216, 125, - 158, 1, 216, 124, 158, 1, 216, 122, 158, 1, 216, 121, 158, 1, 214, 49, - 158, 1, 214, 6, 158, 1, 213, 235, 158, 1, 213, 214, 158, 1, 213, 183, - 158, 1, 213, 171, 158, 1, 186, 158, 1, 213, 38, 158, 1, 212, 255, 158, 1, - 212, 235, 158, 1, 212, 203, 158, 1, 212, 169, 18, 19, 240, 160, 18, 19, - 74, 18, 19, 254, 196, 18, 19, 72, 18, 19, 236, 28, 18, 19, 75, 18, 19, - 227, 49, 18, 19, 213, 104, 227, 49, 18, 19, 66, 245, 165, 18, 19, 66, 72, - 18, 19, 61, 18, 19, 254, 232, 18, 19, 214, 6, 18, 19, 148, 214, 6, 18, - 19, 213, 235, 18, 19, 148, 213, 235, 18, 19, 213, 227, 18, 19, 148, 213, - 227, 18, 19, 213, 214, 18, 19, 148, 213, 214, 18, 19, 213, 202, 18, 19, - 148, 213, 202, 18, 19, 230, 11, 213, 202, 18, 19, 214, 49, 18, 19, 148, - 214, 49, 18, 19, 214, 48, 18, 19, 148, 214, 48, 18, 19, 230, 11, 214, 48, - 18, 19, 254, 108, 18, 19, 213, 104, 214, 82, 18, 19, 242, 156, 219, 69, - 18, 19, 40, 179, 18, 19, 40, 242, 113, 18, 19, 40, 251, 101, 151, 223, - 130, 18, 19, 40, 216, 227, 151, 223, 130, 18, 19, 40, 46, 151, 223, 130, - 18, 19, 40, 223, 130, 18, 19, 40, 51, 179, 18, 19, 40, 51, 220, 175, 71, - 219, 32, 18, 19, 40, 231, 37, 247, 74, 18, 19, 40, 220, 175, 199, 90, 18, - 19, 40, 225, 156, 18, 19, 40, 119, 218, 36, 18, 19, 245, 108, 18, 19, - 235, 251, 18, 19, 227, 62, 18, 19, 254, 32, 18, 19, 226, 96, 18, 19, 226, - 211, 18, 19, 225, 240, 18, 19, 225, 203, 18, 19, 225, 150, 18, 19, 225, - 129, 18, 19, 213, 104, 225, 129, 18, 19, 66, 241, 204, 18, 19, 66, 241, - 165, 18, 19, 193, 18, 19, 226, 213, 18, 19, 225, 0, 18, 19, 148, 225, 0, - 18, 19, 224, 254, 18, 19, 148, 224, 254, 18, 19, 224, 253, 18, 19, 148, - 224, 253, 18, 19, 224, 251, 18, 19, 148, 224, 251, 18, 19, 224, 250, 18, - 19, 148, 224, 250, 18, 19, 225, 2, 18, 19, 148, 225, 2, 18, 19, 225, 1, - 18, 19, 148, 225, 1, 18, 19, 213, 104, 225, 1, 18, 19, 226, 229, 18, 19, - 148, 226, 229, 18, 19, 66, 242, 41, 18, 19, 217, 229, 18, 19, 218, 47, - 18, 19, 217, 71, 18, 19, 217, 57, 18, 19, 108, 18, 19, 216, 230, 18, 19, - 213, 104, 216, 230, 18, 19, 66, 248, 28, 18, 19, 66, 247, 211, 18, 19, - 218, 52, 18, 19, 218, 49, 18, 19, 216, 43, 18, 19, 148, 216, 43, 18, 19, - 216, 27, 18, 19, 148, 216, 27, 18, 19, 216, 26, 18, 19, 148, 216, 26, 18, - 19, 109, 18, 19, 148, 109, 18, 19, 216, 20, 18, 19, 148, 216, 20, 18, 19, - 216, 45, 18, 19, 148, 216, 45, 18, 19, 216, 44, 18, 19, 148, 216, 44, 18, - 19, 230, 11, 216, 44, 18, 19, 218, 99, 18, 19, 216, 112, 18, 19, 216, 96, - 18, 19, 216, 95, 18, 19, 216, 115, 18, 19, 234, 188, 18, 19, 235, 11, 18, - 19, 234, 101, 18, 19, 234, 92, 18, 19, 234, 37, 18, 19, 234, 19, 18, 19, - 213, 104, 234, 19, 18, 19, 181, 18, 19, 235, 14, 18, 19, 233, 200, 18, - 19, 148, 233, 200, 18, 19, 233, 198, 18, 19, 148, 233, 198, 18, 19, 233, - 197, 18, 19, 148, 233, 197, 18, 19, 233, 196, 18, 19, 148, 233, 196, 18, - 19, 233, 195, 18, 19, 148, 233, 195, 18, 19, 233, 204, 18, 19, 148, 233, - 204, 18, 19, 233, 203, 18, 19, 148, 233, 203, 18, 19, 230, 11, 233, 203, - 18, 19, 235, 27, 18, 19, 233, 205, 18, 19, 219, 214, 234, 182, 18, 19, - 219, 214, 234, 93, 18, 19, 219, 214, 234, 32, 18, 19, 219, 214, 234, 252, - 18, 19, 250, 124, 18, 19, 250, 217, 18, 19, 249, 244, 18, 19, 249, 234, - 18, 19, 249, 175, 18, 19, 249, 113, 18, 19, 213, 104, 249, 113, 18, 19, - 250, 219, 18, 19, 250, 218, 18, 19, 249, 22, 18, 19, 148, 249, 22, 18, - 19, 249, 20, 18, 19, 148, 249, 20, 18, 19, 249, 19, 18, 19, 148, 249, 19, - 18, 19, 249, 18, 18, 19, 148, 249, 18, 18, 19, 249, 17, 18, 19, 148, 249, - 17, 18, 19, 249, 24, 18, 19, 148, 249, 24, 18, 19, 249, 23, 18, 19, 148, - 249, 23, 18, 19, 230, 11, 249, 23, 18, 19, 250, 252, 18, 19, 222, 127, - 217, 163, 18, 19, 231, 156, 18, 19, 232, 40, 18, 19, 231, 42, 18, 19, - 231, 14, 18, 19, 230, 231, 18, 19, 230, 202, 18, 19, 213, 104, 230, 202, - 18, 19, 188, 18, 19, 232, 41, 18, 19, 230, 112, 18, 19, 148, 230, 112, - 18, 19, 230, 110, 18, 19, 148, 230, 110, 18, 19, 230, 109, 18, 19, 148, - 230, 109, 18, 19, 230, 108, 18, 19, 148, 230, 108, 18, 19, 230, 107, 18, - 19, 148, 230, 107, 18, 19, 230, 114, 18, 19, 148, 230, 114, 18, 19, 230, - 113, 18, 19, 148, 230, 113, 18, 19, 230, 11, 230, 113, 18, 19, 183, 18, - 19, 148, 183, 18, 19, 231, 45, 18, 19, 253, 121, 183, 18, 19, 222, 127, - 183, 18, 19, 229, 187, 18, 19, 230, 42, 18, 19, 229, 64, 18, 19, 229, 39, - 18, 19, 228, 185, 18, 19, 228, 175, 18, 19, 213, 104, 228, 175, 18, 19, - 205, 18, 19, 230, 43, 18, 19, 228, 29, 18, 19, 148, 228, 29, 18, 19, 228, - 31, 18, 19, 148, 228, 31, 18, 19, 228, 30, 18, 19, 148, 228, 30, 18, 19, - 230, 11, 228, 30, 18, 19, 204, 18, 19, 66, 229, 161, 18, 19, 229, 69, 18, - 19, 233, 82, 18, 19, 233, 155, 18, 19, 233, 13, 18, 19, 232, 255, 18, 19, - 232, 208, 18, 19, 232, 180, 18, 19, 213, 104, 232, 180, 18, 19, 233, 157, - 18, 19, 233, 156, 18, 19, 232, 127, 18, 19, 148, 232, 127, 18, 19, 232, - 126, 18, 19, 148, 232, 126, 18, 19, 232, 125, 18, 19, 148, 232, 125, 18, - 19, 232, 124, 18, 19, 148, 232, 124, 18, 19, 232, 123, 18, 19, 148, 232, - 123, 18, 19, 232, 129, 18, 19, 148, 232, 129, 18, 19, 232, 128, 18, 19, - 148, 232, 128, 18, 19, 150, 18, 19, 148, 150, 18, 19, 138, 150, 18, 19, - 222, 100, 18, 19, 222, 198, 18, 19, 220, 117, 18, 19, 220, 101, 18, 19, - 219, 242, 18, 19, 219, 226, 18, 19, 213, 104, 219, 226, 18, 19, 222, 202, - 18, 19, 222, 200, 18, 19, 218, 194, 18, 19, 148, 218, 194, 18, 19, 218, - 188, 18, 19, 148, 218, 188, 18, 19, 218, 187, 18, 19, 148, 218, 187, 18, - 19, 218, 183, 18, 19, 148, 218, 183, 18, 19, 218, 182, 18, 19, 148, 218, - 182, 18, 19, 218, 198, 18, 19, 148, 218, 198, 18, 19, 218, 197, 18, 19, - 148, 218, 197, 18, 19, 230, 11, 218, 197, 18, 19, 197, 18, 19, 253, 121, - 197, 18, 19, 218, 199, 18, 19, 251, 141, 197, 18, 19, 230, 197, 220, 36, - 18, 19, 230, 11, 220, 27, 18, 19, 230, 11, 223, 2, 18, 19, 230, 11, 219, - 167, 18, 19, 230, 11, 219, 29, 18, 19, 230, 11, 220, 26, 18, 19, 230, 11, - 222, 103, 18, 19, 220, 243, 18, 19, 220, 212, 18, 19, 220, 207, 18, 19, - 220, 187, 18, 19, 220, 181, 18, 19, 221, 24, 18, 19, 221, 20, 18, 19, - 220, 132, 18, 19, 148, 220, 132, 18, 19, 220, 131, 18, 19, 148, 220, 131, - 18, 19, 220, 130, 18, 19, 148, 220, 130, 18, 19, 220, 129, 18, 19, 148, - 220, 129, 18, 19, 220, 128, 18, 19, 148, 220, 128, 18, 19, 220, 134, 18, - 19, 148, 220, 134, 18, 19, 220, 133, 18, 19, 148, 220, 133, 18, 19, 221, - 26, 18, 19, 213, 38, 18, 19, 213, 89, 18, 19, 212, 255, 18, 19, 212, 246, - 18, 19, 212, 235, 18, 19, 212, 220, 18, 19, 213, 104, 212, 220, 18, 19, - 186, 18, 19, 213, 91, 18, 19, 212, 166, 18, 19, 148, 212, 166, 18, 19, - 212, 165, 18, 19, 148, 212, 165, 18, 19, 212, 164, 18, 19, 148, 212, 164, - 18, 19, 212, 163, 18, 19, 148, 212, 163, 18, 19, 212, 162, 18, 19, 148, - 212, 162, 18, 19, 212, 168, 18, 19, 148, 212, 168, 18, 19, 212, 167, 18, - 19, 148, 212, 167, 18, 19, 230, 11, 212, 167, 18, 19, 213, 105, 18, 19, - 251, 182, 213, 105, 18, 19, 148, 213, 105, 18, 19, 222, 127, 212, 255, - 18, 19, 224, 21, 18, 19, 224, 112, 224, 21, 18, 19, 148, 233, 82, 18, 19, - 224, 73, 18, 19, 223, 188, 18, 19, 223, 136, 18, 19, 223, 112, 18, 19, - 223, 99, 18, 19, 148, 232, 208, 18, 19, 203, 18, 19, 224, 74, 18, 19, - 148, 233, 157, 18, 19, 223, 20, 18, 19, 148, 223, 20, 18, 19, 149, 18, - 19, 148, 149, 18, 19, 138, 149, 18, 19, 244, 123, 18, 19, 244, 161, 18, - 19, 244, 90, 18, 19, 244, 77, 18, 19, 244, 12, 18, 19, 244, 3, 18, 19, - 244, 164, 18, 19, 244, 163, 18, 19, 243, 187, 18, 19, 148, 243, 187, 18, - 19, 244, 230, 18, 19, 217, 148, 18, 19, 230, 96, 217, 148, 18, 19, 217, - 128, 18, 19, 230, 96, 217, 128, 18, 19, 217, 124, 18, 19, 230, 96, 217, - 124, 18, 19, 217, 109, 18, 19, 217, 106, 18, 19, 217, 161, 18, 19, 217, - 160, 18, 19, 217, 81, 18, 19, 148, 217, 81, 18, 19, 217, 163, 18, 19, - 216, 103, 18, 19, 216, 101, 18, 19, 216, 100, 18, 19, 216, 105, 18, 19, - 216, 106, 18, 19, 216, 18, 18, 19, 216, 17, 18, 19, 216, 16, 18, 19, 216, - 19, 18, 19, 228, 49, 241, 222, 18, 19, 228, 49, 241, 165, 18, 19, 228, - 49, 241, 147, 18, 19, 228, 49, 241, 54, 18, 19, 228, 49, 241, 39, 18, 19, - 228, 49, 159, 18, 19, 228, 49, 242, 27, 18, 19, 228, 49, 242, 41, 18, 19, - 228, 48, 242, 41, 18, 19, 241, 140, 18, 19, 224, 228, 18, 19, 224, 198, - 18, 19, 224, 193, 18, 19, 224, 187, 18, 19, 224, 182, 18, 19, 224, 232, - 18, 19, 224, 231, 18, 19, 224, 240, 18, 19, 217, 8, 18, 19, 217, 6, 18, - 19, 217, 5, 18, 19, 217, 9, 18, 19, 148, 224, 21, 18, 19, 148, 223, 188, - 18, 19, 148, 223, 112, 18, 19, 148, 203, 18, 19, 229, 157, 18, 19, 229, - 113, 18, 19, 229, 109, 18, 19, 229, 90, 18, 19, 229, 85, 18, 19, 229, - 159, 18, 19, 229, 158, 18, 19, 229, 161, 18, 19, 228, 196, 18, 19, 222, - 127, 220, 243, 18, 19, 222, 127, 220, 212, 18, 19, 222, 127, 220, 187, - 18, 19, 222, 127, 221, 24, 18, 19, 213, 200, 217, 148, 18, 19, 213, 200, - 217, 128, 18, 19, 213, 200, 217, 109, 18, 19, 213, 200, 217, 161, 18, 19, - 213, 200, 217, 163, 18, 19, 233, 19, 18, 19, 233, 18, 18, 19, 233, 17, - 18, 19, 233, 16, 18, 19, 233, 25, 18, 19, 233, 24, 18, 19, 233, 26, 18, - 19, 217, 162, 217, 148, 18, 19, 217, 162, 217, 128, 18, 19, 217, 162, - 217, 124, 18, 19, 217, 162, 217, 109, 18, 19, 217, 162, 217, 106, 18, 19, - 217, 162, 217, 161, 18, 19, 217, 162, 217, 160, 18, 19, 217, 162, 217, - 163, 18, 19, 254, 97, 253, 74, 18, 19, 251, 141, 74, 18, 19, 251, 141, - 72, 18, 19, 251, 141, 75, 18, 19, 251, 141, 61, 18, 19, 251, 141, 214, 6, - 18, 19, 251, 141, 213, 235, 18, 19, 251, 141, 213, 214, 18, 19, 251, 141, - 214, 49, 18, 19, 251, 141, 229, 187, 18, 19, 251, 141, 229, 64, 18, 19, - 251, 141, 228, 185, 18, 19, 251, 141, 205, 18, 19, 251, 141, 234, 188, - 18, 19, 251, 141, 234, 101, 18, 19, 251, 141, 234, 37, 18, 19, 251, 141, - 181, 18, 19, 222, 127, 241, 222, 18, 19, 222, 127, 241, 165, 18, 19, 222, - 127, 241, 54, 18, 19, 222, 127, 159, 18, 19, 66, 242, 196, 18, 19, 66, - 242, 200, 18, 19, 66, 242, 212, 18, 19, 66, 242, 211, 18, 19, 66, 242, - 201, 18, 19, 66, 242, 225, 18, 19, 66, 223, 51, 18, 19, 66, 223, 112, 18, - 19, 66, 224, 21, 18, 19, 66, 224, 1, 18, 19, 66, 223, 188, 18, 19, 66, - 203, 18, 19, 66, 213, 183, 18, 19, 66, 213, 214, 18, 19, 66, 214, 6, 18, - 19, 66, 214, 1, 18, 19, 66, 213, 235, 18, 19, 66, 214, 49, 18, 19, 66, - 240, 186, 18, 19, 66, 240, 187, 18, 19, 66, 240, 190, 18, 19, 66, 240, - 189, 18, 19, 66, 240, 188, 18, 19, 66, 240, 192, 18, 19, 66, 217, 90, 18, - 19, 66, 217, 109, 18, 19, 66, 217, 148, 18, 19, 66, 217, 147, 18, 19, 66, - 217, 128, 18, 19, 66, 217, 161, 18, 19, 66, 216, 86, 18, 19, 66, 216, 95, - 18, 19, 66, 216, 112, 18, 19, 66, 216, 111, 18, 19, 66, 216, 96, 18, 19, - 66, 216, 115, 18, 19, 66, 225, 35, 18, 19, 66, 225, 150, 18, 19, 66, 226, - 96, 18, 19, 66, 226, 86, 18, 19, 66, 225, 240, 18, 19, 66, 193, 18, 19, - 66, 226, 229, 18, 19, 66, 242, 92, 18, 19, 66, 242, 150, 18, 19, 66, 243, - 38, 18, 19, 66, 243, 31, 18, 19, 66, 242, 190, 18, 19, 66, 243, 110, 18, - 19, 66, 234, 108, 18, 19, 66, 234, 113, 18, 19, 66, 234, 125, 18, 19, 66, - 234, 124, 18, 19, 66, 234, 118, 18, 19, 66, 234, 138, 18, 19, 66, 234, - 50, 18, 19, 66, 234, 51, 18, 19, 66, 234, 54, 18, 19, 66, 234, 53, 18, - 19, 66, 234, 52, 18, 19, 66, 234, 55, 18, 19, 66, 234, 56, 18, 19, 66, - 228, 92, 18, 19, 66, 228, 185, 18, 19, 66, 229, 187, 18, 19, 66, 229, - 184, 18, 19, 66, 229, 64, 18, 19, 66, 205, 18, 19, 66, 230, 172, 18, 19, - 66, 230, 231, 18, 19, 66, 231, 156, 18, 19, 66, 231, 145, 18, 19, 66, - 231, 42, 18, 19, 66, 188, 18, 19, 66, 212, 203, 18, 19, 66, 212, 235, 18, - 19, 66, 213, 38, 18, 19, 66, 213, 35, 18, 19, 66, 212, 255, 18, 19, 66, - 186, 18, 19, 66, 235, 54, 18, 19, 222, 127, 235, 54, 18, 19, 66, 235, 71, - 18, 19, 66, 235, 127, 18, 19, 66, 235, 125, 18, 19, 66, 235, 110, 18, 19, - 222, 127, 235, 110, 18, 19, 66, 235, 139, 18, 19, 66, 235, 84, 18, 19, - 66, 235, 88, 18, 19, 66, 235, 98, 18, 19, 66, 235, 97, 18, 19, 66, 235, - 96, 18, 19, 66, 235, 99, 18, 19, 66, 232, 156, 18, 19, 66, 232, 208, 18, - 19, 66, 233, 82, 18, 19, 66, 233, 74, 18, 19, 66, 233, 13, 18, 19, 66, - 233, 157, 18, 19, 66, 247, 103, 18, 19, 66, 247, 104, 18, 19, 66, 247, - 107, 18, 19, 66, 247, 106, 18, 19, 66, 247, 105, 18, 19, 66, 247, 108, - 18, 19, 66, 233, 15, 18, 19, 66, 233, 17, 18, 19, 66, 233, 21, 18, 19, - 66, 233, 20, 18, 19, 66, 233, 19, 18, 19, 66, 233, 25, 18, 19, 66, 217, - 3, 18, 19, 66, 217, 5, 18, 19, 66, 217, 8, 18, 19, 66, 217, 7, 18, 19, - 66, 217, 6, 18, 19, 66, 217, 9, 18, 19, 66, 216, 255, 18, 19, 66, 217, 0, - 18, 19, 66, 217, 11, 18, 19, 66, 217, 10, 18, 19, 66, 217, 1, 18, 19, 66, - 217, 12, 18, 19, 66, 212, 8, 18, 19, 66, 212, 16, 18, 19, 66, 212, 87, - 18, 19, 66, 212, 85, 18, 19, 66, 212, 37, 18, 19, 66, 212, 109, 18, 19, - 66, 212, 152, 18, 19, 66, 70, 212, 152, 18, 19, 66, 245, 239, 18, 19, 66, - 245, 240, 18, 19, 66, 245, 247, 18, 19, 66, 245, 246, 18, 19, 66, 245, - 242, 18, 19, 66, 245, 249, 18, 19, 66, 219, 27, 18, 19, 66, 219, 242, 18, - 19, 66, 222, 100, 18, 19, 66, 222, 89, 18, 19, 66, 220, 117, 18, 19, 66, - 222, 202, 18, 19, 66, 220, 150, 18, 19, 66, 220, 187, 18, 19, 66, 220, - 243, 18, 19, 66, 220, 241, 18, 19, 66, 220, 212, 18, 19, 66, 221, 24, 18, - 19, 66, 221, 26, 18, 19, 66, 216, 122, 18, 19, 66, 216, 124, 18, 19, 66, - 216, 136, 18, 19, 66, 216, 135, 18, 19, 66, 216, 125, 18, 19, 66, 216, - 141, 18, 19, 66, 250, 6, 18, 19, 66, 250, 23, 18, 19, 66, 250, 67, 18, - 19, 66, 250, 64, 18, 19, 66, 250, 47, 18, 19, 66, 250, 92, 18, 19, 66, - 216, 89, 18, 19, 66, 216, 90, 18, 19, 66, 216, 93, 18, 19, 66, 216, 92, - 18, 19, 66, 216, 91, 18, 19, 66, 216, 94, 18, 19, 250, 48, 52, 18, 19, - 243, 200, 219, 69, 18, 19, 224, 224, 18, 19, 229, 156, 18, 19, 228, 193, - 18, 19, 228, 192, 18, 19, 228, 191, 18, 19, 228, 190, 18, 19, 228, 195, - 18, 19, 228, 194, 18, 19, 213, 200, 217, 79, 18, 19, 213, 200, 217, 78, - 18, 19, 213, 200, 217, 77, 18, 19, 213, 200, 217, 76, 18, 19, 213, 200, - 217, 75, 18, 19, 213, 200, 217, 82, 18, 19, 213, 200, 217, 81, 18, 19, - 213, 200, 40, 217, 163, 18, 19, 251, 141, 214, 82, 227, 92, 219, 207, 77, - 227, 92, 1, 251, 224, 227, 92, 1, 232, 145, 227, 92, 1, 244, 120, 227, - 92, 1, 222, 186, 227, 92, 1, 229, 24, 227, 92, 1, 215, 195, 227, 92, 1, - 248, 142, 227, 92, 1, 217, 33, 227, 92, 1, 249, 167, 227, 92, 1, 250, - 114, 227, 92, 1, 230, 161, 227, 92, 1, 242, 132, 227, 92, 1, 229, 147, - 227, 92, 1, 219, 62, 227, 92, 1, 223, 46, 227, 92, 1, 254, 105, 227, 92, - 1, 227, 53, 227, 92, 1, 215, 121, 227, 92, 1, 245, 187, 227, 92, 1, 235, - 186, 227, 92, 1, 245, 188, 227, 92, 1, 227, 24, 227, 92, 1, 215, 176, - 227, 92, 1, 236, 34, 227, 92, 1, 245, 185, 227, 92, 1, 226, 77, 227, 92, - 244, 119, 77, 227, 92, 223, 202, 244, 119, 77, 168, 1, 244, 110, 244, - 102, 244, 124, 244, 230, 168, 1, 215, 79, 168, 1, 215, 106, 215, 122, 69, - 168, 1, 212, 205, 168, 1, 213, 105, 168, 1, 214, 82, 168, 1, 217, 84, - 217, 83, 217, 104, 168, 1, 245, 25, 168, 1, 254, 4, 61, 168, 1, 227, 10, - 75, 168, 1, 254, 177, 61, 168, 1, 254, 132, 168, 1, 232, 186, 75, 168, 1, - 220, 168, 75, 168, 1, 75, 168, 1, 227, 99, 168, 1, 227, 62, 168, 1, 224, - 55, 224, 67, 223, 244, 149, 168, 1, 234, 199, 168, 1, 250, 111, 168, 1, - 234, 200, 235, 27, 168, 1, 243, 177, 168, 1, 245, 96, 168, 1, 243, 34, - 242, 47, 243, 177, 168, 1, 243, 72, 168, 1, 213, 176, 213, 170, 214, 82, - 168, 1, 242, 19, 242, 41, 168, 1, 242, 23, 242, 41, 168, 1, 232, 188, - 242, 41, 168, 1, 220, 171, 242, 41, 168, 1, 230, 7, 228, 18, 230, 8, 204, - 168, 1, 220, 169, 204, 168, 1, 246, 69, 168, 1, 235, 166, 235, 170, 235, - 160, 72, 168, 1, 74, 168, 1, 235, 118, 235, 142, 168, 1, 243, 19, 168, 1, - 232, 189, 254, 148, 168, 1, 220, 173, 61, 168, 1, 235, 152, 245, 72, 168, - 1, 226, 40, 226, 61, 226, 229, 168, 1, 254, 72, 245, 71, 168, 1, 219, - 211, 197, 168, 1, 220, 105, 232, 185, 197, 168, 1, 220, 167, 197, 168, 1, - 250, 252, 168, 1, 212, 152, 168, 1, 217, 16, 217, 26, 216, 7, 218, 99, - 168, 1, 220, 166, 218, 99, 168, 1, 249, 3, 168, 1, 251, 208, 251, 211, - 251, 147, 253, 74, 168, 1, 220, 172, 253, 74, 168, 1, 246, 68, 168, 1, - 227, 36, 168, 1, 245, 153, 245, 155, 74, 168, 1, 231, 241, 231, 249, 183, - 168, 1, 232, 187, 183, 168, 1, 220, 170, 183, 168, 1, 233, 97, 233, 137, - 232, 196, 150, 168, 1, 246, 70, 168, 1, 235, 227, 168, 1, 235, 228, 168, - 1, 248, 153, 248, 158, 249, 3, 168, 1, 227, 6, 245, 24, 75, 168, 1, 245, - 183, 168, 1, 235, 185, 168, 1, 249, 21, 168, 1, 250, 205, 168, 1, 250, - 123, 168, 1, 219, 100, 168, 1, 232, 184, 168, 1, 220, 165, 168, 1, 240, - 103, 168, 1, 224, 240, 168, 1, 213, 166, 168, 220, 81, 225, 26, 168, 230, - 155, 225, 26, 168, 249, 71, 225, 26, 168, 253, 177, 87, 168, 216, 47, 87, - 168, 251, 223, 87, 218, 32, 1, 61, 218, 32, 1, 72, 218, 32, 1, 69, 218, - 32, 1, 181, 218, 32, 1, 243, 110, 218, 32, 1, 229, 159, 218, 32, 1, 218, - 52, 218, 32, 1, 248, 164, 218, 32, 1, 205, 218, 32, 1, 193, 218, 32, 1, - 252, 107, 218, 32, 1, 188, 218, 32, 1, 186, 218, 32, 1, 233, 157, 218, - 32, 1, 214, 49, 218, 32, 1, 222, 202, 218, 32, 1, 159, 218, 32, 30, 5, - 72, 218, 32, 30, 5, 69, 218, 32, 5, 214, 133, 241, 246, 1, 61, 241, 246, - 1, 72, 241, 246, 1, 69, 241, 246, 1, 181, 241, 246, 1, 243, 110, 241, - 246, 1, 229, 159, 241, 246, 1, 218, 52, 241, 246, 1, 248, 164, 241, 246, - 1, 205, 241, 246, 1, 193, 241, 246, 1, 252, 107, 241, 246, 1, 188, 241, - 246, 1, 186, 241, 246, 1, 203, 241, 246, 1, 233, 157, 241, 246, 1, 214, - 49, 241, 246, 1, 222, 202, 241, 246, 1, 159, 241, 246, 30, 5, 72, 241, - 246, 30, 5, 69, 241, 246, 5, 226, 176, 226, 2, 220, 81, 225, 26, 226, 2, - 51, 225, 26, 251, 49, 1, 61, 251, 49, 1, 72, 251, 49, 1, 69, 251, 49, 1, - 181, 251, 49, 1, 243, 110, 251, 49, 1, 229, 159, 251, 49, 1, 218, 52, - 251, 49, 1, 248, 164, 251, 49, 1, 205, 251, 49, 1, 193, 251, 49, 1, 252, - 107, 251, 49, 1, 188, 251, 49, 1, 186, 251, 49, 1, 203, 251, 49, 1, 233, - 157, 251, 49, 1, 214, 49, 251, 49, 1, 222, 202, 251, 49, 1, 159, 251, 49, - 30, 5, 72, 251, 49, 30, 5, 69, 218, 31, 1, 61, 218, 31, 1, 72, 218, 31, - 1, 69, 218, 31, 1, 181, 218, 31, 1, 243, 110, 218, 31, 1, 229, 159, 218, - 31, 1, 218, 52, 218, 31, 1, 248, 164, 218, 31, 1, 205, 218, 31, 1, 193, - 218, 31, 1, 252, 107, 218, 31, 1, 188, 218, 31, 1, 186, 218, 31, 1, 233, - 157, 218, 31, 1, 214, 49, 218, 31, 1, 222, 202, 218, 31, 30, 5, 72, 218, - 31, 30, 5, 69, 84, 1, 181, 84, 1, 234, 138, 84, 1, 234, 37, 84, 1, 234, - 113, 84, 1, 229, 90, 84, 1, 250, 219, 84, 1, 250, 92, 84, 1, 249, 175, - 84, 1, 250, 23, 84, 1, 227, 253, 84, 1, 248, 164, 84, 1, 216, 105, 84, 1, - 247, 99, 84, 1, 216, 100, 84, 1, 228, 188, 84, 1, 218, 52, 84, 1, 217, - 161, 84, 1, 108, 84, 1, 217, 109, 84, 1, 228, 185, 84, 1, 252, 107, 84, - 1, 226, 23, 84, 1, 225, 150, 84, 1, 225, 253, 84, 1, 230, 231, 84, 1, - 212, 235, 84, 1, 223, 112, 84, 1, 232, 208, 84, 1, 214, 119, 84, 1, 221, - 24, 84, 1, 219, 121, 84, 1, 222, 202, 84, 1, 159, 84, 1, 233, 157, 84, 1, - 224, 232, 84, 235, 240, 30, 224, 218, 84, 235, 240, 30, 224, 231, 84, - 235, 240, 30, 224, 198, 84, 235, 240, 30, 224, 193, 84, 235, 240, 30, - 224, 175, 84, 235, 240, 30, 224, 147, 84, 235, 240, 30, 224, 135, 84, - 235, 240, 30, 224, 134, 84, 235, 240, 30, 223, 12, 84, 235, 240, 30, 223, - 5, 84, 235, 240, 30, 232, 121, 84, 235, 240, 30, 232, 112, 84, 235, 240, - 30, 224, 213, 84, 235, 240, 30, 224, 224, 84, 235, 240, 30, 224, 183, - 216, 15, 116, 84, 235, 240, 30, 224, 183, 216, 15, 109, 84, 235, 240, 30, - 224, 214, 84, 30, 235, 226, 253, 215, 84, 30, 235, 226, 254, 232, 84, 30, - 5, 254, 232, 84, 30, 5, 72, 84, 30, 5, 236, 28, 84, 30, 5, 213, 105, 84, - 30, 5, 212, 161, 84, 30, 5, 69, 84, 30, 5, 215, 92, 84, 30, 5, 215, 196, - 84, 30, 5, 227, 99, 84, 30, 5, 186, 84, 30, 5, 236, 55, 84, 30, 5, 74, - 84, 30, 5, 254, 148, 84, 30, 5, 254, 108, 84, 30, 5, 227, 49, 84, 30, 5, - 253, 108, 84, 5, 229, 37, 84, 5, 224, 19, 84, 5, 212, 172, 84, 5, 230, - 123, 84, 5, 216, 171, 84, 5, 252, 62, 84, 5, 223, 107, 84, 5, 216, 251, - 84, 5, 234, 246, 84, 5, 254, 110, 84, 5, 222, 160, 222, 154, 84, 5, 214, - 130, 84, 5, 249, 170, 84, 5, 252, 37, 84, 5, 234, 131, 84, 5, 252, 57, - 84, 5, 250, 197, 225, 204, 233, 209, 84, 5, 233, 54, 216, 230, 84, 5, - 251, 197, 84, 5, 225, 255, 230, 169, 84, 5, 234, 18, 84, 249, 39, 16, - 223, 181, 84, 5, 253, 90, 84, 5, 253, 111, 84, 21, 212, 79, 84, 21, 116, - 84, 21, 109, 84, 21, 166, 84, 21, 163, 84, 21, 180, 84, 21, 189, 84, 21, - 198, 84, 21, 195, 84, 21, 200, 84, 16, 233, 54, 253, 113, 219, 229, 84, - 16, 233, 54, 253, 113, 230, 141, 84, 16, 233, 54, 253, 113, 225, 203, 84, - 16, 233, 54, 253, 113, 251, 225, 84, 16, 233, 54, 253, 113, 251, 32, 84, - 16, 233, 54, 253, 113, 225, 95, 84, 16, 233, 54, 253, 113, 225, 89, 84, - 16, 233, 54, 253, 113, 225, 87, 84, 16, 233, 54, 253, 113, 225, 93, 84, - 16, 233, 54, 253, 113, 225, 91, 81, 251, 159, 81, 245, 120, 81, 249, 157, - 81, 243, 200, 219, 69, 81, 249, 164, 81, 243, 237, 247, 72, 81, 216, 250, - 219, 236, 240, 160, 81, 220, 116, 4, 251, 98, 231, 217, 81, 231, 246, - 249, 157, 81, 231, 246, 243, 200, 219, 69, 81, 229, 22, 81, 243, 223, 43, - 222, 77, 116, 81, 243, 223, 43, 222, 77, 109, 81, 243, 223, 43, 222, 77, - 166, 81, 30, 221, 57, 81, 21, 212, 79, 81, 21, 116, 81, 21, 109, 81, 21, - 166, 81, 21, 163, 81, 21, 180, 81, 21, 189, 81, 21, 198, 81, 21, 195, 81, - 21, 200, 81, 1, 61, 81, 1, 74, 81, 1, 72, 81, 1, 75, 81, 1, 69, 81, 1, - 227, 99, 81, 1, 215, 183, 81, 1, 245, 165, 81, 1, 205, 81, 1, 254, 24, - 81, 1, 252, 107, 81, 1, 193, 81, 1, 224, 232, 81, 1, 243, 110, 81, 1, - 188, 81, 1, 233, 157, 81, 1, 222, 202, 81, 1, 221, 24, 81, 1, 218, 52, - 81, 1, 248, 164, 81, 1, 250, 92, 81, 1, 235, 139, 81, 1, 186, 81, 1, 203, - 81, 1, 214, 49, 81, 1, 244, 164, 81, 1, 181, 81, 1, 234, 138, 81, 1, 216, - 141, 81, 1, 212, 109, 81, 1, 242, 27, 81, 1, 212, 9, 81, 1, 233, 25, 81, - 1, 212, 62, 81, 1, 250, 47, 81, 1, 216, 250, 184, 30, 52, 81, 1, 216, - 250, 74, 81, 1, 216, 250, 72, 81, 1, 216, 250, 75, 81, 1, 216, 250, 69, - 81, 1, 216, 250, 227, 99, 81, 1, 216, 250, 215, 183, 81, 1, 216, 250, - 254, 24, 81, 1, 216, 250, 252, 107, 81, 1, 216, 250, 193, 81, 1, 216, - 250, 224, 232, 81, 1, 216, 250, 243, 110, 81, 1, 216, 250, 188, 81, 1, - 216, 250, 218, 52, 81, 1, 216, 250, 248, 164, 81, 1, 216, 250, 250, 92, - 81, 1, 216, 250, 235, 139, 81, 1, 216, 250, 216, 141, 81, 1, 216, 250, - 186, 81, 1, 216, 250, 214, 49, 81, 1, 216, 250, 181, 81, 1, 216, 250, - 243, 107, 81, 1, 216, 250, 242, 27, 81, 1, 216, 250, 235, 109, 81, 1, - 216, 250, 229, 62, 81, 1, 216, 250, 245, 249, 81, 1, 220, 116, 74, 81, 1, - 220, 116, 72, 81, 1, 220, 116, 235, 150, 81, 1, 220, 116, 215, 183, 81, - 1, 220, 116, 69, 81, 1, 220, 116, 254, 24, 81, 1, 220, 116, 181, 81, 1, - 220, 116, 243, 110, 81, 1, 220, 116, 159, 81, 1, 220, 116, 193, 81, 1, - 220, 116, 221, 24, 81, 1, 220, 116, 218, 52, 81, 1, 220, 116, 248, 164, - 81, 1, 220, 116, 235, 139, 81, 1, 220, 116, 244, 164, 81, 1, 220, 116, - 243, 107, 81, 1, 220, 116, 242, 27, 81, 1, 220, 116, 216, 141, 81, 1, - 220, 116, 212, 109, 81, 1, 220, 116, 224, 74, 81, 1, 220, 116, 250, 92, - 81, 1, 220, 116, 212, 75, 81, 1, 231, 246, 72, 81, 1, 231, 246, 181, 81, - 1, 231, 246, 203, 81, 1, 231, 246, 244, 164, 81, 1, 231, 246, 212, 75, - 81, 1, 254, 71, 243, 92, 253, 243, 116, 81, 1, 254, 71, 243, 92, 214, - 129, 116, 81, 1, 254, 71, 243, 92, 248, 131, 81, 1, 254, 71, 243, 92, - 215, 193, 81, 1, 254, 71, 243, 92, 235, 191, 215, 193, 81, 1, 254, 71, - 243, 92, 252, 74, 81, 1, 254, 71, 243, 92, 133, 252, 74, 81, 1, 254, 71, - 243, 92, 61, 81, 1, 254, 71, 243, 92, 72, 81, 1, 254, 71, 243, 92, 181, - 81, 1, 254, 71, 243, 92, 229, 159, 81, 1, 254, 71, 243, 92, 250, 219, 81, - 1, 254, 71, 243, 92, 216, 115, 81, 1, 254, 71, 243, 92, 216, 105, 81, 1, - 254, 71, 243, 92, 248, 86, 81, 1, 254, 71, 243, 92, 228, 198, 81, 1, 254, - 71, 243, 92, 218, 52, 81, 1, 254, 71, 243, 92, 248, 164, 81, 1, 254, 71, - 243, 92, 193, 81, 1, 254, 71, 243, 92, 226, 23, 81, 1, 254, 71, 243, 92, - 219, 157, 81, 1, 254, 71, 243, 92, 212, 75, 81, 1, 254, 71, 243, 92, 212, - 109, 81, 1, 254, 71, 243, 92, 254, 114, 81, 1, 216, 250, 254, 71, 243, - 92, 218, 52, 81, 1, 216, 250, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246, - 254, 71, 243, 92, 242, 225, 81, 1, 231, 246, 254, 71, 243, 92, 229, 159, - 81, 1, 231, 246, 254, 71, 243, 92, 250, 219, 81, 1, 231, 246, 254, 71, - 243, 92, 235, 115, 81, 1, 231, 246, 254, 71, 243, 92, 216, 115, 81, 1, - 231, 246, 254, 71, 243, 92, 248, 70, 81, 1, 231, 246, 254, 71, 243, 92, - 218, 52, 81, 1, 231, 246, 254, 71, 243, 92, 247, 232, 81, 1, 231, 246, - 254, 71, 243, 92, 219, 157, 81, 1, 231, 246, 254, 71, 243, 92, 249, 15, - 81, 1, 231, 246, 254, 71, 243, 92, 212, 75, 81, 1, 231, 246, 254, 71, - 243, 92, 212, 109, 81, 1, 254, 71, 243, 92, 151, 69, 81, 1, 254, 71, 243, - 92, 151, 186, 81, 1, 231, 246, 254, 71, 243, 92, 251, 195, 81, 1, 254, - 71, 243, 92, 248, 154, 81, 1, 231, 246, 254, 71, 243, 92, 233, 25, 18, - 19, 226, 233, 18, 19, 253, 83, 18, 19, 254, 188, 18, 19, 214, 9, 18, 19, - 225, 101, 18, 19, 226, 103, 18, 19, 224, 249, 18, 19, 217, 238, 18, 19, - 234, 195, 18, 19, 233, 201, 18, 19, 231, 196, 18, 19, 228, 148, 18, 19, - 230, 3, 18, 19, 233, 92, 18, 19, 219, 209, 18, 19, 222, 129, 18, 19, 220, - 156, 18, 19, 220, 246, 18, 19, 220, 127, 18, 19, 212, 211, 18, 19, 213, - 43, 18, 19, 224, 27, 18, 19, 228, 28, 18, 19, 227, 82, 228, 28, 18, 19, - 228, 27, 18, 19, 227, 82, 228, 27, 18, 19, 228, 26, 18, 19, 227, 82, 228, - 26, 18, 19, 228, 25, 18, 19, 227, 82, 228, 25, 18, 19, 223, 17, 18, 19, - 223, 16, 18, 19, 223, 15, 18, 19, 223, 14, 18, 19, 223, 13, 18, 19, 223, - 21, 18, 19, 227, 82, 226, 229, 18, 19, 227, 82, 218, 99, 18, 19, 227, 82, - 235, 27, 18, 19, 227, 82, 250, 252, 18, 19, 227, 82, 183, 18, 19, 227, - 82, 204, 18, 19, 227, 82, 197, 18, 19, 227, 82, 221, 26, 18, 19, 245, - 175, 214, 82, 18, 19, 213, 248, 214, 82, 18, 19, 40, 3, 223, 130, 18, 19, - 40, 224, 48, 247, 74, 18, 19, 224, 112, 223, 18, 18, 19, 148, 232, 180, - 18, 19, 148, 233, 156, 18, 19, 217, 80, 18, 19, 217, 82, 18, 19, 216, 97, - 18, 19, 216, 99, 18, 19, 216, 104, 18, 19, 217, 2, 18, 19, 217, 4, 18, - 19, 222, 127, 220, 132, 18, 19, 222, 127, 220, 181, 18, 19, 222, 127, - 241, 39, 18, 19, 66, 242, 54, 18, 19, 66, 248, 3, 243, 31, 18, 19, 66, - 243, 107, 18, 19, 66, 242, 59, 18, 19, 222, 127, 235, 37, 18, 19, 66, - 235, 35, 18, 19, 251, 244, 248, 3, 150, 18, 19, 251, 244, 248, 3, 149, - 18, 19, 66, 247, 254, 197, 209, 214, 103, 233, 34, 209, 1, 181, 209, 1, - 234, 138, 209, 1, 243, 110, 209, 1, 242, 225, 209, 1, 229, 159, 209, 1, - 250, 219, 209, 1, 250, 92, 209, 1, 235, 139, 209, 1, 235, 115, 209, 1, - 213, 60, 209, 1, 218, 52, 209, 1, 217, 161, 209, 1, 248, 164, 209, 1, - 247, 232, 209, 1, 205, 209, 1, 193, 209, 1, 226, 23, 209, 1, 252, 107, - 209, 1, 251, 195, 209, 1, 188, 209, 1, 186, 209, 1, 203, 209, 1, 233, - 157, 209, 1, 214, 49, 209, 1, 221, 24, 209, 1, 219, 157, 209, 1, 222, - 202, 209, 1, 159, 209, 30, 5, 61, 209, 30, 5, 72, 209, 30, 5, 69, 209, - 30, 5, 245, 165, 209, 30, 5, 254, 108, 209, 30, 5, 227, 49, 209, 30, 5, - 253, 108, 209, 30, 5, 74, 209, 30, 5, 75, 209, 219, 18, 1, 186, 209, 219, - 18, 1, 203, 209, 219, 18, 1, 214, 49, 209, 3, 1, 181, 209, 3, 1, 229, - 159, 209, 3, 1, 253, 242, 209, 3, 1, 218, 52, 209, 3, 1, 205, 209, 3, 1, - 193, 209, 3, 1, 188, 209, 3, 1, 203, 209, 3, 1, 233, 157, 209, 5, 230, - 159, 209, 5, 234, 177, 209, 5, 222, 201, 209, 5, 232, 180, 209, 244, 254, - 77, 209, 224, 158, 77, 209, 21, 212, 79, 209, 21, 116, 209, 21, 109, 209, - 21, 166, 209, 21, 163, 209, 21, 180, 209, 21, 189, 209, 21, 198, 209, 21, - 195, 209, 21, 200, 38, 233, 83, 1, 181, 38, 233, 83, 1, 213, 153, 38, - 233, 83, 1, 229, 159, 38, 233, 83, 1, 216, 141, 38, 233, 83, 1, 222, 202, - 38, 233, 83, 1, 186, 38, 233, 83, 1, 218, 52, 38, 233, 83, 1, 217, 161, - 38, 233, 83, 1, 233, 157, 38, 233, 83, 1, 193, 38, 233, 83, 1, 226, 23, - 38, 233, 83, 1, 188, 38, 233, 83, 1, 244, 164, 38, 233, 83, 1, 215, 1, - 38, 233, 83, 1, 159, 38, 233, 83, 1, 224, 232, 38, 233, 83, 1, 234, 138, - 38, 233, 83, 1, 216, 133, 38, 233, 83, 1, 205, 38, 233, 83, 1, 61, 38, - 233, 83, 1, 72, 38, 233, 83, 1, 245, 165, 38, 233, 83, 1, 245, 154, 38, - 233, 83, 1, 69, 38, 233, 83, 1, 227, 49, 38, 233, 83, 1, 75, 38, 233, 83, - 1, 215, 183, 38, 233, 83, 1, 74, 38, 233, 83, 1, 253, 106, 38, 233, 83, - 1, 254, 108, 38, 233, 83, 1, 216, 239, 38, 233, 83, 1, 216, 238, 38, 233, - 83, 1, 216, 237, 38, 233, 83, 1, 216, 236, 38, 233, 83, 1, 216, 235, 156, - 38, 165, 1, 124, 224, 232, 156, 38, 165, 1, 115, 224, 232, 156, 38, 165, - 1, 124, 181, 156, 38, 165, 1, 124, 213, 153, 156, 38, 165, 1, 124, 229, - 159, 156, 38, 165, 1, 115, 181, 156, 38, 165, 1, 115, 213, 153, 156, 38, - 165, 1, 115, 229, 159, 156, 38, 165, 1, 124, 216, 141, 156, 38, 165, 1, - 124, 222, 202, 156, 38, 165, 1, 124, 186, 156, 38, 165, 1, 115, 216, 141, - 156, 38, 165, 1, 115, 222, 202, 156, 38, 165, 1, 115, 186, 156, 38, 165, - 1, 124, 218, 52, 156, 38, 165, 1, 124, 217, 161, 156, 38, 165, 1, 124, - 205, 156, 38, 165, 1, 115, 218, 52, 156, 38, 165, 1, 115, 217, 161, 156, - 38, 165, 1, 115, 205, 156, 38, 165, 1, 124, 193, 156, 38, 165, 1, 124, - 226, 23, 156, 38, 165, 1, 124, 188, 156, 38, 165, 1, 115, 193, 156, 38, - 165, 1, 115, 226, 23, 156, 38, 165, 1, 115, 188, 156, 38, 165, 1, 124, - 244, 164, 156, 38, 165, 1, 124, 215, 1, 156, 38, 165, 1, 124, 233, 157, - 156, 38, 165, 1, 115, 244, 164, 156, 38, 165, 1, 115, 215, 1, 156, 38, - 165, 1, 115, 233, 157, 156, 38, 165, 1, 124, 159, 156, 38, 165, 1, 124, - 248, 164, 156, 38, 165, 1, 124, 252, 107, 156, 38, 165, 1, 115, 159, 156, - 38, 165, 1, 115, 248, 164, 156, 38, 165, 1, 115, 252, 107, 156, 38, 165, - 1, 124, 233, 206, 156, 38, 165, 1, 124, 213, 126, 156, 38, 165, 1, 115, - 233, 206, 156, 38, 165, 1, 115, 213, 126, 156, 38, 165, 1, 124, 219, 26, - 156, 38, 165, 1, 115, 219, 26, 156, 38, 165, 30, 5, 30, 220, 163, 156, - 38, 165, 30, 5, 254, 232, 156, 38, 165, 30, 5, 236, 28, 156, 38, 165, 30, - 5, 69, 156, 38, 165, 30, 5, 215, 92, 156, 38, 165, 30, 5, 74, 156, 38, - 165, 30, 5, 254, 148, 156, 38, 165, 30, 5, 75, 156, 38, 165, 30, 5, 227, - 120, 156, 38, 165, 30, 5, 215, 183, 156, 38, 165, 30, 5, 253, 83, 156, - 38, 165, 30, 5, 254, 188, 156, 38, 165, 30, 5, 215, 85, 156, 38, 165, 30, - 5, 226, 233, 156, 38, 165, 30, 5, 227, 117, 156, 38, 165, 30, 5, 215, - 180, 156, 38, 165, 30, 5, 235, 150, 156, 38, 165, 1, 40, 215, 79, 156, - 38, 165, 1, 40, 229, 161, 156, 38, 165, 1, 40, 204, 156, 38, 165, 1, 40, - 183, 156, 38, 165, 1, 40, 235, 27, 156, 38, 165, 1, 40, 249, 3, 156, 38, - 165, 1, 40, 253, 74, 156, 38, 165, 160, 231, 221, 156, 38, 165, 160, 231, - 220, 156, 38, 165, 21, 212, 79, 156, 38, 165, 21, 116, 156, 38, 165, 21, - 109, 156, 38, 165, 21, 166, 156, 38, 165, 21, 163, 156, 38, 165, 21, 180, - 156, 38, 165, 21, 189, 156, 38, 165, 21, 198, 156, 38, 165, 21, 195, 156, - 38, 165, 21, 200, 156, 38, 165, 88, 21, 116, 156, 38, 165, 5, 233, 143, - 156, 38, 165, 5, 233, 142, 84, 16, 226, 109, 84, 16, 230, 142, 234, 34, - 84, 16, 225, 204, 234, 34, 84, 16, 251, 226, 234, 34, 84, 16, 251, 33, - 234, 34, 84, 16, 225, 96, 234, 34, 84, 16, 225, 90, 234, 34, 84, 16, 225, - 88, 234, 34, 84, 16, 225, 94, 234, 34, 84, 16, 225, 92, 234, 34, 84, 16, - 248, 118, 234, 34, 84, 16, 248, 114, 234, 34, 84, 16, 248, 113, 234, 34, - 84, 16, 248, 116, 234, 34, 84, 16, 248, 115, 234, 34, 84, 16, 248, 112, - 234, 34, 84, 16, 216, 51, 84, 16, 230, 142, 223, 106, 84, 16, 225, 204, - 223, 106, 84, 16, 251, 226, 223, 106, 84, 16, 251, 33, 223, 106, 84, 16, - 225, 96, 223, 106, 84, 16, 225, 90, 223, 106, 84, 16, 225, 88, 223, 106, - 84, 16, 225, 94, 223, 106, 84, 16, 225, 92, 223, 106, 84, 16, 248, 118, - 223, 106, 84, 16, 248, 114, 223, 106, 84, 16, 248, 113, 223, 106, 84, 16, - 248, 116, 223, 106, 84, 16, 248, 115, 223, 106, 84, 16, 248, 112, 223, - 106, 251, 50, 1, 181, 251, 50, 1, 243, 110, 251, 50, 1, 229, 159, 251, - 50, 1, 229, 108, 251, 50, 1, 193, 251, 50, 1, 252, 107, 251, 50, 1, 188, - 251, 50, 1, 230, 175, 251, 50, 1, 218, 52, 251, 50, 1, 248, 164, 251, 50, - 1, 205, 251, 50, 1, 228, 147, 251, 50, 1, 250, 219, 251, 50, 1, 235, 139, - 251, 50, 1, 228, 23, 251, 50, 1, 228, 19, 251, 50, 1, 186, 251, 50, 1, - 203, 251, 50, 1, 233, 157, 251, 50, 1, 215, 1, 251, 50, 1, 222, 202, 251, - 50, 1, 61, 251, 50, 1, 159, 251, 50, 30, 5, 72, 251, 50, 30, 5, 69, 251, - 50, 30, 5, 74, 251, 50, 30, 5, 75, 251, 50, 30, 5, 254, 148, 251, 50, - 226, 187, 251, 50, 245, 101, 65, 222, 91, 38, 88, 1, 124, 181, 38, 88, 1, - 124, 234, 138, 38, 88, 1, 124, 233, 193, 38, 88, 1, 115, 181, 38, 88, 1, - 115, 233, 193, 38, 88, 1, 115, 234, 138, 38, 88, 1, 229, 159, 38, 88, 1, - 124, 250, 219, 38, 88, 1, 124, 250, 92, 38, 88, 1, 115, 250, 219, 38, 88, - 1, 115, 222, 202, 38, 88, 1, 115, 250, 92, 38, 88, 1, 228, 23, 38, 88, 1, - 224, 32, 38, 88, 1, 124, 224, 30, 38, 88, 1, 248, 164, 38, 88, 1, 115, - 224, 30, 38, 88, 1, 224, 41, 38, 88, 1, 124, 218, 52, 38, 88, 1, 124, - 217, 161, 38, 88, 1, 115, 218, 52, 38, 88, 1, 115, 217, 161, 38, 88, 1, - 205, 38, 88, 1, 252, 107, 38, 88, 1, 124, 193, 38, 88, 1, 124, 226, 23, - 38, 88, 1, 124, 244, 164, 38, 88, 1, 115, 193, 38, 88, 1, 115, 244, 164, - 38, 88, 1, 115, 226, 23, 38, 88, 1, 188, 38, 88, 1, 115, 186, 38, 88, 1, - 124, 186, 38, 88, 1, 203, 38, 88, 1, 223, 48, 38, 88, 1, 233, 157, 38, - 88, 1, 232, 151, 38, 88, 1, 214, 49, 38, 88, 1, 124, 221, 24, 38, 88, 1, - 124, 219, 157, 38, 88, 1, 124, 222, 202, 38, 88, 1, 124, 159, 38, 88, 1, - 232, 213, 38, 88, 1, 61, 38, 88, 1, 115, 159, 38, 88, 1, 72, 38, 88, 1, - 236, 28, 38, 88, 1, 69, 38, 88, 1, 215, 92, 38, 88, 1, 245, 165, 38, 88, - 1, 227, 49, 38, 88, 1, 233, 143, 38, 88, 1, 242, 109, 222, 202, 38, 88, - 249, 133, 5, 138, 203, 38, 88, 249, 133, 5, 138, 233, 157, 38, 88, 249, - 133, 5, 233, 158, 218, 9, 233, 133, 38, 88, 5, 232, 9, 234, 236, 233, - 133, 38, 88, 249, 133, 5, 40, 229, 159, 38, 88, 249, 133, 5, 115, 193, - 38, 88, 249, 133, 5, 124, 224, 31, 167, 115, 193, 38, 88, 249, 133, 5, - 188, 38, 88, 249, 133, 5, 252, 107, 38, 88, 249, 133, 5, 222, 202, 38, - 88, 5, 222, 181, 38, 88, 30, 5, 61, 38, 88, 30, 5, 232, 9, 222, 142, 38, - 88, 30, 5, 254, 232, 38, 88, 30, 5, 218, 15, 254, 232, 38, 88, 30, 5, 72, - 38, 88, 30, 5, 236, 28, 38, 88, 30, 5, 215, 183, 38, 88, 30, 5, 215, 91, - 38, 88, 30, 5, 69, 38, 88, 30, 5, 215, 92, 38, 88, 30, 5, 75, 38, 88, 30, - 5, 227, 121, 55, 38, 88, 30, 5, 226, 233, 38, 88, 30, 5, 74, 38, 88, 30, - 5, 254, 148, 38, 88, 30, 5, 227, 49, 38, 88, 30, 5, 254, 108, 38, 88, 30, - 5, 88, 254, 108, 38, 88, 30, 5, 227, 121, 49, 38, 88, 5, 232, 9, 234, - 235, 38, 88, 5, 216, 240, 38, 88, 5, 216, 239, 38, 88, 5, 234, 106, 216, - 238, 38, 88, 5, 234, 106, 216, 237, 38, 88, 5, 234, 106, 216, 236, 38, - 88, 5, 224, 77, 242, 26, 38, 88, 5, 232, 9, 222, 168, 38, 88, 5, 234, - 105, 234, 220, 38, 88, 37, 249, 55, 247, 74, 38, 88, 241, 33, 21, 212, - 79, 38, 88, 241, 33, 21, 116, 38, 88, 241, 33, 21, 109, 38, 88, 241, 33, - 21, 166, 38, 88, 241, 33, 21, 163, 38, 88, 241, 33, 21, 180, 38, 88, 241, - 33, 21, 189, 38, 88, 241, 33, 21, 198, 38, 88, 241, 33, 21, 195, 38, 88, - 241, 33, 21, 200, 38, 88, 88, 21, 212, 79, 38, 88, 88, 21, 116, 38, 88, - 88, 21, 109, 38, 88, 88, 21, 166, 38, 88, 88, 21, 163, 38, 88, 88, 21, - 180, 38, 88, 88, 21, 189, 38, 88, 88, 21, 198, 38, 88, 88, 21, 195, 38, - 88, 88, 21, 200, 38, 88, 5, 213, 234, 38, 88, 5, 213, 233, 38, 88, 5, - 222, 133, 38, 88, 5, 234, 166, 38, 88, 5, 240, 219, 38, 88, 5, 247, 88, - 38, 88, 5, 223, 202, 223, 89, 224, 41, 38, 88, 5, 232, 9, 213, 61, 38, - 88, 5, 235, 10, 38, 88, 5, 235, 9, 38, 88, 5, 222, 139, 38, 88, 5, 222, - 138, 38, 88, 5, 241, 248, 38, 88, 5, 250, 216, 99, 5, 215, 170, 223, 183, - 99, 5, 215, 170, 250, 189, 99, 5, 250, 120, 99, 5, 218, 215, 99, 5, 251, - 156, 99, 1, 254, 92, 99, 1, 254, 93, 217, 221, 99, 1, 236, 24, 99, 1, - 236, 25, 217, 221, 99, 1, 215, 173, 99, 1, 215, 174, 217, 221, 99, 1, - 224, 77, 223, 229, 99, 1, 224, 77, 223, 230, 217, 221, 99, 1, 233, 158, - 233, 48, 99, 1, 233, 158, 233, 49, 217, 221, 99, 1, 245, 136, 99, 1, 254, - 106, 99, 1, 227, 78, 99, 1, 227, 79, 217, 221, 99, 1, 181, 99, 1, 235, - 17, 232, 12, 99, 1, 243, 110, 99, 1, 243, 111, 242, 137, 99, 1, 229, 159, - 99, 1, 250, 219, 99, 1, 250, 220, 233, 146, 99, 1, 235, 139, 99, 1, 235, - 140, 235, 119, 99, 1, 228, 23, 99, 1, 218, 53, 233, 99, 99, 1, 218, 53, - 230, 137, 232, 12, 99, 1, 248, 165, 230, 137, 254, 54, 99, 1, 248, 165, - 230, 137, 232, 12, 99, 1, 230, 46, 224, 44, 99, 1, 218, 52, 99, 1, 218, - 53, 217, 242, 99, 1, 248, 164, 99, 1, 248, 165, 232, 30, 99, 1, 205, 99, - 1, 193, 99, 1, 226, 214, 234, 231, 99, 1, 252, 107, 99, 1, 252, 108, 234, - 178, 99, 1, 188, 99, 1, 186, 99, 1, 203, 99, 1, 233, 157, 99, 1, 214, 49, - 99, 1, 222, 203, 222, 189, 99, 1, 222, 203, 222, 149, 99, 1, 222, 202, - 99, 1, 159, 99, 5, 223, 222, 99, 30, 5, 217, 221, 99, 30, 5, 215, 169, - 99, 30, 5, 215, 170, 222, 145, 99, 30, 5, 218, 248, 99, 30, 5, 218, 249, - 236, 16, 99, 30, 5, 224, 77, 223, 229, 99, 30, 5, 224, 77, 223, 230, 217, - 221, 99, 30, 5, 233, 158, 233, 48, 99, 30, 5, 233, 158, 233, 49, 217, - 221, 99, 30, 5, 218, 16, 99, 30, 5, 218, 17, 223, 229, 99, 30, 5, 218, - 17, 217, 221, 99, 30, 5, 218, 17, 223, 230, 217, 221, 99, 30, 5, 226, 59, - 99, 30, 5, 226, 60, 217, 221, 99, 254, 155, 254, 154, 99, 1, 234, 255, - 222, 144, 99, 1, 234, 110, 222, 144, 99, 1, 216, 0, 222, 144, 99, 1, 245, - 160, 222, 144, 99, 1, 214, 233, 222, 144, 99, 1, 212, 100, 222, 144, 99, - 1, 253, 125, 222, 144, 99, 21, 212, 79, 99, 21, 116, 99, 21, 109, 99, 21, - 166, 99, 21, 163, 99, 21, 180, 99, 21, 189, 99, 21, 198, 99, 21, 195, 99, - 21, 200, 99, 226, 157, 99, 226, 182, 99, 213, 223, 99, 250, 168, 226, - 175, 99, 250, 168, 220, 98, 99, 250, 168, 226, 130, 99, 226, 181, 99, 27, - 16, 247, 80, 99, 27, 16, 248, 2, 99, 27, 16, 246, 19, 99, 27, 16, 248, - 121, 99, 27, 16, 248, 122, 218, 215, 99, 27, 16, 247, 157, 99, 27, 16, - 248, 157, 99, 27, 16, 247, 240, 99, 27, 16, 248, 143, 99, 27, 16, 248, - 122, 243, 33, 99, 27, 16, 37, 217, 217, 99, 27, 16, 37, 245, 99, 99, 27, - 16, 37, 234, 173, 99, 27, 16, 37, 234, 175, 99, 27, 16, 37, 235, 123, 99, - 27, 16, 37, 234, 174, 2, 235, 123, 99, 27, 16, 37, 234, 176, 2, 235, 123, - 99, 27, 16, 37, 251, 214, 99, 27, 16, 37, 242, 141, 99, 27, 16, 223, 146, - 227, 40, 246, 29, 99, 27, 16, 223, 146, 227, 40, 248, 155, 99, 27, 16, - 223, 146, 249, 193, 216, 75, 99, 27, 16, 223, 146, 249, 193, 218, 23, 99, - 27, 16, 233, 68, 227, 40, 226, 170, 99, 27, 16, 233, 68, 227, 40, 225, - 25, 99, 27, 16, 233, 68, 249, 193, 225, 170, 99, 27, 16, 233, 68, 249, - 193, 225, 160, 99, 27, 16, 233, 68, 227, 40, 225, 193, 218, 237, 5, 226, - 154, 218, 237, 5, 226, 166, 218, 237, 5, 226, 163, 218, 237, 1, 61, 218, - 237, 1, 72, 218, 237, 1, 69, 218, 237, 1, 254, 148, 218, 237, 1, 75, 218, - 237, 1, 74, 218, 237, 1, 245, 22, 218, 237, 1, 181, 218, 237, 1, 224, - 232, 218, 237, 1, 243, 110, 218, 237, 1, 229, 159, 218, 237, 1, 250, 219, - 218, 237, 1, 235, 139, 218, 237, 1, 212, 109, 218, 237, 1, 228, 23, 218, - 237, 1, 218, 52, 218, 237, 1, 248, 164, 218, 237, 1, 205, 218, 237, 1, - 193, 218, 237, 1, 244, 164, 218, 237, 1, 215, 1, 218, 237, 1, 252, 107, - 218, 237, 1, 188, 218, 237, 1, 186, 218, 237, 1, 203, 218, 237, 1, 233, - 157, 218, 237, 1, 214, 49, 218, 237, 1, 222, 202, 218, 237, 1, 213, 153, - 218, 237, 1, 159, 218, 237, 249, 133, 5, 226, 179, 218, 237, 249, 133, 5, - 226, 156, 218, 237, 249, 133, 5, 226, 153, 218, 237, 30, 5, 226, 169, - 218, 237, 30, 5, 226, 152, 218, 237, 30, 5, 226, 173, 218, 237, 30, 5, - 226, 162, 218, 237, 30, 5, 226, 180, 218, 237, 30, 5, 226, 171, 218, 237, - 5, 226, 183, 218, 237, 1, 234, 138, 218, 237, 1, 218, 176, 218, 237, 21, - 212, 79, 218, 237, 21, 116, 218, 237, 21, 109, 218, 237, 21, 166, 218, - 237, 21, 163, 218, 237, 21, 180, 218, 237, 21, 189, 218, 237, 21, 198, - 218, 237, 21, 195, 218, 237, 21, 200, 252, 40, 1, 61, 252, 40, 1, 220, - 90, 61, 252, 40, 1, 159, 252, 40, 1, 220, 90, 159, 252, 40, 1, 231, 244, - 159, 252, 40, 1, 252, 107, 252, 40, 1, 234, 217, 252, 107, 252, 40, 1, - 193, 252, 40, 1, 220, 90, 193, 252, 40, 1, 205, 252, 40, 1, 231, 244, - 205, 252, 40, 1, 214, 49, 252, 40, 1, 220, 90, 214, 49, 252, 40, 1, 226, - 194, 214, 49, 252, 40, 1, 243, 110, 252, 40, 1, 220, 90, 243, 110, 252, - 40, 1, 235, 139, 252, 40, 1, 248, 164, 252, 40, 1, 203, 252, 40, 1, 220, - 90, 203, 252, 40, 1, 188, 252, 40, 1, 220, 90, 188, 252, 40, 1, 219, 213, - 218, 52, 252, 40, 1, 228, 166, 218, 52, 252, 40, 1, 222, 202, 252, 40, 1, - 220, 90, 222, 202, 252, 40, 1, 231, 244, 222, 202, 252, 40, 1, 186, 252, - 40, 1, 220, 90, 186, 252, 40, 1, 229, 159, 252, 40, 1, 233, 157, 252, 40, - 1, 220, 90, 233, 157, 252, 40, 1, 228, 23, 252, 40, 1, 250, 219, 252, 40, - 1, 229, 228, 252, 40, 1, 231, 187, 252, 40, 1, 72, 252, 40, 1, 69, 252, - 40, 5, 216, 244, 252, 40, 30, 5, 74, 252, 40, 30, 5, 226, 194, 74, 252, - 40, 30, 5, 245, 165, 252, 40, 30, 5, 72, 252, 40, 30, 5, 234, 217, 72, - 252, 40, 30, 5, 75, 252, 40, 30, 5, 234, 217, 75, 252, 40, 30, 5, 69, - 252, 40, 30, 5, 111, 31, 220, 90, 222, 202, 252, 40, 249, 133, 5, 229, - 161, 252, 40, 249, 133, 5, 242, 41, 252, 40, 226, 165, 252, 40, 226, 161, - 252, 40, 16, 251, 164, 230, 46, 231, 104, 252, 40, 16, 251, 164, 225, - 196, 252, 40, 16, 251, 164, 235, 51, 252, 40, 16, 251, 164, 226, 165, - 182, 1, 181, 182, 1, 234, 48, 182, 1, 234, 138, 182, 1, 243, 110, 182, 1, - 242, 162, 182, 1, 229, 159, 182, 1, 250, 219, 182, 1, 250, 92, 182, 1, - 235, 139, 182, 1, 228, 23, 182, 1, 218, 52, 182, 1, 217, 161, 182, 1, - 248, 164, 182, 1, 205, 182, 1, 193, 182, 1, 225, 174, 182, 1, 226, 23, - 182, 1, 244, 164, 182, 1, 244, 44, 182, 1, 252, 107, 182, 1, 251, 145, - 182, 1, 188, 182, 1, 230, 237, 182, 1, 216, 141, 182, 1, 216, 133, 182, - 1, 245, 249, 182, 1, 186, 182, 1, 203, 182, 1, 233, 157, 182, 1, 159, - 182, 1, 241, 139, 182, 1, 215, 1, 182, 1, 222, 202, 182, 1, 221, 24, 182, - 1, 214, 49, 182, 1, 61, 182, 219, 18, 1, 186, 182, 219, 18, 1, 203, 182, - 30, 5, 254, 232, 182, 30, 5, 72, 182, 30, 5, 75, 182, 30, 5, 227, 49, - 182, 30, 5, 69, 182, 30, 5, 215, 92, 182, 30, 5, 74, 182, 249, 133, 5, - 235, 27, 182, 249, 133, 5, 183, 182, 249, 133, 5, 150, 182, 249, 133, 5, - 204, 182, 249, 133, 5, 226, 229, 182, 249, 133, 5, 149, 182, 249, 133, 5, - 218, 99, 182, 249, 133, 5, 228, 5, 182, 249, 133, 5, 234, 235, 182, 5, - 224, 42, 182, 5, 228, 60, 182, 225, 27, 218, 51, 182, 225, 27, 228, 13, - 217, 74, 218, 51, 182, 225, 27, 250, 98, 182, 225, 27, 216, 128, 250, 98, - 182, 225, 27, 216, 127, 182, 21, 212, 79, 182, 21, 116, 182, 21, 109, - 182, 21, 166, 182, 21, 163, 182, 21, 180, 182, 21, 189, 182, 21, 198, - 182, 21, 195, 182, 21, 200, 182, 1, 216, 115, 182, 1, 216, 105, 182, 1, - 248, 86, 227, 76, 250, 40, 21, 212, 79, 227, 76, 250, 40, 21, 116, 227, - 76, 250, 40, 21, 109, 227, 76, 250, 40, 21, 166, 227, 76, 250, 40, 21, - 163, 227, 76, 250, 40, 21, 180, 227, 76, 250, 40, 21, 189, 227, 76, 250, - 40, 21, 198, 227, 76, 250, 40, 21, 195, 227, 76, 250, 40, 21, 200, 227, - 76, 250, 40, 1, 233, 157, 227, 76, 250, 40, 1, 253, 122, 227, 76, 250, - 40, 1, 254, 121, 227, 76, 250, 40, 1, 254, 24, 227, 76, 250, 40, 1, 254, - 86, 227, 76, 250, 40, 1, 233, 156, 227, 76, 250, 40, 1, 254, 194, 227, - 76, 250, 40, 1, 254, 195, 227, 76, 250, 40, 1, 254, 193, 227, 76, 250, - 40, 1, 254, 189, 227, 76, 250, 40, 1, 233, 13, 227, 76, 250, 40, 1, 235, - 169, 227, 76, 250, 40, 1, 236, 29, 227, 76, 250, 40, 1, 235, 188, 227, - 76, 250, 40, 1, 235, 177, 227, 76, 250, 40, 1, 232, 156, 227, 76, 250, - 40, 1, 215, 190, 227, 76, 250, 40, 1, 215, 188, 227, 76, 250, 40, 1, 215, - 139, 227, 76, 250, 40, 1, 215, 85, 227, 76, 250, 40, 1, 233, 82, 227, 76, - 250, 40, 1, 245, 70, 227, 76, 250, 40, 1, 245, 168, 227, 76, 250, 40, 1, - 245, 108, 227, 76, 250, 40, 1, 245, 49, 227, 76, 250, 40, 1, 232, 208, - 227, 76, 250, 40, 1, 227, 5, 227, 76, 250, 40, 1, 227, 116, 227, 76, 250, - 40, 1, 226, 249, 227, 76, 250, 40, 1, 227, 88, 227, 76, 250, 40, 230, - 173, 216, 84, 227, 76, 250, 40, 243, 105, 216, 85, 227, 76, 250, 40, 230, - 171, 216, 85, 227, 76, 250, 40, 223, 242, 227, 76, 250, 40, 226, 21, 227, - 76, 250, 40, 254, 113, 227, 76, 250, 40, 225, 27, 230, 168, 227, 76, 250, - 40, 225, 27, 51, 230, 168, 214, 229, 160, 234, 215, 214, 229, 160, 221, - 0, 214, 229, 160, 225, 78, 214, 229, 5, 229, 40, 214, 229, 5, 213, 69, - 231, 35, 218, 201, 214, 229, 160, 213, 69, 254, 118, 235, 240, 218, 201, - 214, 229, 160, 213, 69, 235, 240, 218, 201, 214, 229, 160, 213, 69, 234, - 203, 235, 240, 218, 201, 214, 229, 160, 250, 190, 55, 214, 229, 160, 213, - 69, 234, 203, 235, 240, 218, 202, 222, 115, 214, 229, 160, 51, 218, 201, - 214, 229, 160, 216, 169, 218, 201, 214, 229, 160, 234, 203, 253, 244, - 214, 229, 160, 62, 55, 214, 229, 160, 117, 176, 55, 214, 229, 160, 133, - 176, 55, 214, 229, 160, 223, 137, 234, 214, 235, 240, 218, 201, 214, 229, - 160, 253, 120, 235, 240, 218, 201, 214, 229, 5, 214, 129, 218, 201, 214, - 229, 5, 214, 129, 215, 185, 214, 229, 5, 223, 202, 214, 129, 215, 185, - 214, 229, 5, 214, 129, 253, 244, 214, 229, 5, 223, 202, 214, 129, 253, - 244, 214, 229, 5, 214, 129, 215, 186, 2, 218, 27, 214, 229, 5, 214, 129, - 253, 245, 2, 218, 27, 214, 229, 5, 253, 243, 254, 2, 214, 229, 5, 253, - 243, 252, 85, 214, 229, 5, 253, 243, 214, 252, 214, 229, 5, 253, 243, - 214, 253, 2, 218, 27, 214, 229, 5, 217, 21, 214, 229, 5, 241, 176, 184, - 253, 242, 214, 229, 5, 184, 253, 242, 214, 229, 5, 223, 53, 184, 253, - 242, 214, 229, 5, 253, 243, 215, 192, 230, 160, 214, 229, 5, 253, 190, 7, - 1, 3, 6, 61, 7, 1, 3, 6, 254, 148, 7, 3, 1, 216, 58, 254, 148, 7, 1, 3, - 6, 252, 54, 253, 74, 7, 1, 3, 6, 250, 252, 7, 1, 3, 6, 249, 3, 7, 1, 3, - 6, 245, 25, 7, 1, 3, 6, 74, 7, 3, 1, 216, 58, 227, 40, 74, 7, 3, 1, 216, - 58, 72, 7, 1, 3, 6, 235, 142, 7, 1, 3, 6, 235, 27, 7, 1, 3, 6, 233, 171, - 2, 90, 7, 1, 3, 6, 183, 7, 1, 3, 6, 223, 202, 204, 7, 1, 3, 6, 75, 7, 1, - 3, 6, 227, 40, 75, 7, 3, 1, 220, 113, 75, 7, 3, 1, 220, 113, 227, 40, 75, - 7, 3, 1, 220, 113, 157, 2, 90, 7, 3, 1, 216, 58, 227, 99, 7, 1, 3, 6, - 227, 2, 7, 3, 1, 216, 227, 151, 75, 7, 3, 1, 251, 101, 151, 75, 7, 1, 3, - 6, 226, 229, 7, 1, 3, 6, 223, 202, 149, 7, 1, 3, 6, 216, 58, 149, 7, 1, - 3, 6, 218, 99, 7, 1, 3, 6, 69, 7, 3, 1, 220, 113, 69, 7, 3, 1, 220, 113, - 247, 208, 69, 7, 3, 1, 220, 113, 216, 58, 183, 7, 1, 3, 6, 215, 79, 7, 1, - 3, 6, 214, 82, 7, 1, 3, 6, 212, 152, 7, 1, 3, 6, 244, 232, 7, 1, 214, - 116, 233, 105, 219, 182, 7, 1, 254, 103, 25, 1, 3, 6, 243, 83, 25, 1, 3, - 6, 233, 122, 25, 1, 3, 6, 225, 240, 25, 1, 3, 6, 223, 190, 25, 1, 3, 6, - 225, 46, 33, 1, 3, 6, 245, 131, 59, 1, 6, 61, 59, 1, 6, 254, 148, 59, 1, - 6, 253, 74, 59, 1, 6, 252, 54, 253, 74, 59, 1, 6, 249, 3, 59, 1, 6, 74, - 59, 1, 6, 223, 202, 74, 59, 1, 6, 243, 177, 59, 1, 6, 242, 41, 59, 1, 6, - 72, 59, 1, 6, 235, 142, 59, 1, 6, 235, 27, 59, 1, 6, 150, 59, 1, 6, 183, - 59, 1, 6, 204, 59, 1, 6, 223, 202, 204, 59, 1, 6, 75, 59, 1, 6, 227, 2, - 59, 1, 6, 226, 229, 59, 1, 6, 149, 59, 1, 6, 218, 99, 59, 1, 6, 69, 59, - 1, 6, 214, 82, 59, 1, 3, 61, 59, 1, 3, 216, 58, 61, 59, 1, 3, 254, 52, - 59, 1, 3, 216, 58, 254, 148, 59, 1, 3, 253, 74, 59, 1, 3, 249, 3, 59, 1, - 3, 74, 59, 1, 3, 222, 113, 59, 1, 3, 227, 40, 74, 59, 1, 3, 216, 58, 227, - 40, 74, 59, 1, 3, 243, 177, 59, 1, 3, 216, 58, 72, 59, 1, 3, 235, 27, 59, - 1, 3, 183, 59, 1, 3, 245, 96, 59, 1, 3, 75, 59, 1, 3, 227, 40, 75, 59, 1, - 3, 216, 227, 151, 75, 59, 1, 3, 251, 101, 151, 75, 59, 1, 3, 226, 229, - 59, 1, 3, 218, 99, 59, 1, 3, 69, 59, 1, 3, 220, 113, 69, 59, 1, 3, 216, - 58, 183, 59, 1, 3, 215, 79, 59, 1, 3, 254, 103, 59, 1, 3, 251, 203, 59, - 1, 3, 25, 243, 83, 59, 1, 3, 248, 5, 59, 1, 3, 25, 226, 9, 59, 1, 3, 250, - 47, 7, 219, 10, 3, 1, 72, 7, 219, 10, 3, 1, 149, 7, 219, 10, 3, 1, 69, 7, - 219, 10, 3, 1, 215, 79, 25, 219, 10, 3, 1, 251, 203, 25, 219, 10, 3, 1, - 243, 83, 25, 219, 10, 3, 1, 223, 190, 25, 219, 10, 3, 1, 226, 9, 25, 219, - 10, 3, 1, 250, 47, 7, 3, 1, 215, 183, 7, 3, 1, 54, 2, 231, 37, 217, 42, - 7, 3, 1, 249, 4, 2, 231, 37, 217, 42, 7, 3, 1, 244, 231, 2, 231, 37, 217, - 42, 7, 3, 1, 232, 110, 2, 231, 37, 217, 42, 7, 3, 1, 230, 98, 2, 231, 37, - 217, 42, 7, 3, 1, 226, 230, 2, 231, 37, 217, 42, 7, 3, 1, 224, 113, 2, - 231, 37, 217, 42, 7, 3, 1, 224, 113, 2, 244, 57, 24, 231, 37, 217, 42, 7, - 3, 1, 223, 4, 2, 231, 37, 217, 42, 7, 3, 1, 218, 100, 2, 231, 37, 217, - 42, 7, 3, 1, 212, 153, 2, 231, 37, 217, 42, 7, 3, 1, 216, 58, 243, 177, - 59, 1, 33, 245, 108, 7, 3, 1, 235, 210, 243, 177, 7, 3, 1, 217, 164, 2, - 219, 47, 7, 3, 6, 1, 240, 146, 2, 90, 7, 3, 1, 235, 184, 2, 90, 7, 3, 1, - 226, 230, 2, 90, 7, 3, 6, 1, 111, 2, 90, 7, 3, 1, 215, 129, 2, 90, 7, 3, - 1, 54, 2, 226, 193, 101, 7, 3, 1, 249, 4, 2, 226, 193, 101, 7, 3, 1, 244, - 231, 2, 226, 193, 101, 7, 3, 1, 243, 178, 2, 226, 193, 101, 7, 3, 1, 235, - 28, 2, 226, 193, 101, 7, 3, 1, 233, 171, 2, 226, 193, 101, 7, 3, 1, 232, - 110, 2, 226, 193, 101, 7, 3, 1, 230, 98, 2, 226, 193, 101, 7, 3, 1, 226, - 230, 2, 226, 193, 101, 7, 3, 1, 224, 113, 2, 226, 193, 101, 7, 3, 1, 223, - 4, 2, 226, 193, 101, 7, 3, 1, 245, 41, 2, 226, 193, 101, 7, 3, 1, 215, - 80, 2, 226, 193, 101, 7, 3, 1, 213, 167, 2, 226, 193, 101, 7, 3, 1, 212, - 153, 2, 226, 193, 101, 7, 3, 1, 118, 2, 223, 207, 101, 7, 3, 1, 254, 53, - 2, 223, 207, 101, 7, 3, 1, 249, 4, 2, 241, 38, 24, 218, 27, 7, 3, 1, 191, - 2, 223, 207, 101, 7, 3, 1, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 223, - 202, 227, 40, 191, 2, 223, 207, 101, 7, 3, 1, 222, 114, 2, 223, 207, 101, - 7, 3, 1, 240, 146, 2, 223, 207, 101, 7, 3, 1, 227, 40, 157, 2, 223, 207, - 101, 7, 3, 1, 245, 41, 2, 223, 207, 101, 7, 3, 1, 111, 2, 223, 207, 101, - 7, 3, 1, 244, 233, 2, 223, 207, 101, 59, 1, 3, 216, 58, 254, 52, 59, 1, - 3, 250, 252, 59, 1, 3, 250, 253, 2, 249, 41, 59, 1, 3, 245, 25, 59, 1, 3, - 223, 202, 227, 40, 74, 59, 1, 3, 244, 230, 59, 1, 3, 247, 73, 235, 143, - 2, 90, 59, 1, 3, 113, 243, 177, 59, 1, 3, 216, 58, 242, 41, 59, 1, 3, - 240, 146, 2, 90, 59, 1, 3, 235, 183, 59, 1, 3, 6, 72, 59, 1, 3, 6, 240, - 146, 2, 90, 59, 1, 3, 235, 143, 2, 249, 67, 59, 1, 3, 233, 171, 2, 223, - 207, 101, 59, 1, 3, 233, 171, 2, 226, 193, 101, 59, 1, 3, 6, 150, 59, 1, - 3, 232, 110, 2, 101, 59, 1, 3, 216, 58, 232, 110, 2, 184, 233, 60, 59, 1, - 3, 230, 98, 2, 42, 101, 59, 1, 3, 230, 98, 2, 223, 207, 101, 59, 1, 3, 6, - 204, 59, 1, 3, 252, 54, 75, 59, 1, 3, 226, 9, 59, 1, 3, 223, 4, 2, 101, - 59, 1, 3, 245, 40, 59, 1, 3, 218, 100, 2, 226, 193, 101, 59, 1, 3, 111, - 134, 59, 1, 3, 215, 128, 59, 1, 3, 6, 69, 59, 1, 3, 215, 80, 2, 101, 59, - 1, 3, 216, 58, 215, 79, 59, 1, 3, 212, 152, 59, 1, 3, 212, 153, 2, 223, - 207, 101, 59, 1, 3, 212, 153, 2, 249, 41, 59, 1, 3, 244, 232, 59, 1, 3, - 217, 132, 37, 246, 72, 242, 114, 254, 174, 37, 246, 72, 254, 164, 254, - 174, 37, 219, 253, 55, 37, 218, 207, 77, 37, 232, 36, 37, 242, 111, 37, - 232, 34, 37, 254, 162, 37, 242, 112, 37, 254, 163, 37, 7, 3, 1, 224, 113, - 55, 37, 251, 73, 37, 232, 35, 37, 51, 249, 224, 49, 37, 227, 91, 49, 37, - 212, 28, 55, 37, 235, 170, 55, 37, 215, 122, 49, 37, 215, 105, 49, 37, 7, - 3, 1, 244, 32, 227, 40, 118, 49, 37, 7, 3, 1, 254, 148, 37, 7, 3, 1, 253, - 240, 37, 7, 3, 1, 253, 92, 37, 7, 3, 1, 250, 253, 250, 117, 37, 7, 3, 1, - 235, 210, 249, 3, 37, 7, 3, 1, 245, 25, 37, 7, 3, 1, 243, 177, 37, 7, 1, - 3, 6, 243, 177, 37, 7, 3, 1, 235, 27, 37, 7, 3, 1, 150, 37, 7, 1, 3, 6, - 150, 37, 7, 1, 3, 6, 183, 37, 7, 3, 1, 204, 37, 7, 1, 3, 6, 204, 37, 7, - 1, 3, 6, 149, 37, 7, 3, 1, 224, 113, 223, 88, 37, 7, 3, 1, 197, 37, 7, 3, - 1, 184, 197, 37, 7, 3, 1, 212, 152, 37, 51, 235, 191, 251, 75, 55, 37, - 254, 57, 123, 211, 211, 55, 37, 42, 253, 165, 49, 37, 46, 253, 165, 24, - 119, 253, 165, 55, 7, 6, 1, 118, 2, 223, 131, 55, 7, 3, 1, 118, 2, 223, - 131, 55, 7, 6, 1, 54, 2, 62, 49, 7, 3, 1, 54, 2, 62, 49, 7, 6, 1, 54, 2, - 62, 55, 7, 3, 1, 54, 2, 62, 55, 7, 6, 1, 54, 2, 232, 243, 55, 7, 3, 1, - 54, 2, 232, 243, 55, 7, 6, 1, 250, 253, 2, 250, 118, 24, 179, 7, 3, 1, - 250, 253, 2, 250, 118, 24, 179, 7, 6, 1, 249, 4, 2, 62, 49, 7, 3, 1, 249, - 4, 2, 62, 49, 7, 6, 1, 249, 4, 2, 62, 55, 7, 3, 1, 249, 4, 2, 62, 55, 7, - 6, 1, 249, 4, 2, 232, 243, 55, 7, 3, 1, 249, 4, 2, 232, 243, 55, 7, 6, 1, - 249, 4, 2, 250, 117, 7, 3, 1, 249, 4, 2, 250, 117, 7, 6, 1, 249, 4, 2, - 249, 224, 55, 7, 3, 1, 249, 4, 2, 249, 224, 55, 7, 6, 1, 191, 2, 232, 38, - 24, 242, 113, 7, 3, 1, 191, 2, 232, 38, 24, 242, 113, 7, 6, 1, 191, 2, - 232, 38, 24, 179, 7, 3, 1, 191, 2, 232, 38, 24, 179, 7, 6, 1, 191, 2, - 249, 224, 55, 7, 3, 1, 191, 2, 249, 224, 55, 7, 6, 1, 191, 2, 217, 43, - 55, 7, 3, 1, 191, 2, 217, 43, 55, 7, 6, 1, 191, 2, 250, 118, 24, 251, 74, - 7, 3, 1, 191, 2, 250, 118, 24, 251, 74, 7, 6, 1, 244, 231, 2, 62, 49, 7, - 3, 1, 244, 231, 2, 62, 49, 7, 6, 1, 243, 178, 2, 232, 37, 7, 3, 1, 243, - 178, 2, 232, 37, 7, 6, 1, 242, 42, 2, 62, 49, 7, 3, 1, 242, 42, 2, 62, - 49, 7, 6, 1, 242, 42, 2, 62, 55, 7, 3, 1, 242, 42, 2, 62, 55, 7, 6, 1, - 242, 42, 2, 247, 209, 7, 3, 1, 242, 42, 2, 247, 209, 7, 6, 1, 242, 42, 2, - 250, 117, 7, 3, 1, 242, 42, 2, 250, 117, 7, 6, 1, 242, 42, 2, 251, 75, - 55, 7, 3, 1, 242, 42, 2, 251, 75, 55, 7, 6, 1, 240, 146, 2, 217, 43, 55, - 7, 3, 1, 240, 146, 2, 217, 43, 55, 7, 6, 1, 240, 146, 2, 247, 210, 24, - 179, 7, 3, 1, 240, 146, 2, 247, 210, 24, 179, 7, 6, 1, 235, 28, 2, 179, - 7, 3, 1, 235, 28, 2, 179, 7, 6, 1, 235, 28, 2, 62, 55, 7, 3, 1, 235, 28, - 2, 62, 55, 7, 6, 1, 235, 28, 2, 232, 243, 55, 7, 3, 1, 235, 28, 2, 232, - 243, 55, 7, 6, 1, 233, 171, 2, 62, 55, 7, 3, 1, 233, 171, 2, 62, 55, 7, - 6, 1, 233, 171, 2, 62, 251, 220, 24, 232, 37, 7, 3, 1, 233, 171, 2, 62, - 251, 220, 24, 232, 37, 7, 6, 1, 233, 171, 2, 232, 243, 55, 7, 3, 1, 233, - 171, 2, 232, 243, 55, 7, 6, 1, 233, 171, 2, 249, 224, 55, 7, 3, 1, 233, - 171, 2, 249, 224, 55, 7, 6, 1, 232, 110, 2, 179, 7, 3, 1, 232, 110, 2, - 179, 7, 6, 1, 232, 110, 2, 62, 49, 7, 3, 1, 232, 110, 2, 62, 49, 7, 6, 1, - 232, 110, 2, 62, 55, 7, 3, 1, 232, 110, 2, 62, 55, 7, 6, 1, 230, 98, 2, - 62, 49, 7, 3, 1, 230, 98, 2, 62, 49, 7, 6, 1, 230, 98, 2, 62, 55, 7, 3, - 1, 230, 98, 2, 62, 55, 7, 6, 1, 230, 98, 2, 232, 243, 55, 7, 3, 1, 230, - 98, 2, 232, 243, 55, 7, 6, 1, 230, 98, 2, 249, 224, 55, 7, 3, 1, 230, 98, - 2, 249, 224, 55, 7, 6, 1, 157, 2, 217, 43, 24, 179, 7, 3, 1, 157, 2, 217, - 43, 24, 179, 7, 6, 1, 157, 2, 217, 43, 24, 247, 209, 7, 3, 1, 157, 2, - 217, 43, 24, 247, 209, 7, 6, 1, 157, 2, 232, 38, 24, 242, 113, 7, 3, 1, - 157, 2, 232, 38, 24, 242, 113, 7, 6, 1, 157, 2, 232, 38, 24, 179, 7, 3, - 1, 157, 2, 232, 38, 24, 179, 7, 6, 1, 226, 230, 2, 179, 7, 3, 1, 226, - 230, 2, 179, 7, 6, 1, 226, 230, 2, 62, 49, 7, 3, 1, 226, 230, 2, 62, 49, - 7, 6, 1, 224, 113, 2, 62, 49, 7, 3, 1, 224, 113, 2, 62, 49, 7, 6, 1, 224, - 113, 2, 62, 55, 7, 3, 1, 224, 113, 2, 62, 55, 7, 6, 1, 224, 113, 2, 62, - 251, 220, 24, 232, 37, 7, 3, 1, 224, 113, 2, 62, 251, 220, 24, 232, 37, - 7, 6, 1, 224, 113, 2, 232, 243, 55, 7, 3, 1, 224, 113, 2, 232, 243, 55, - 7, 6, 1, 223, 4, 2, 62, 49, 7, 3, 1, 223, 4, 2, 62, 49, 7, 6, 1, 223, 4, - 2, 62, 55, 7, 3, 1, 223, 4, 2, 62, 55, 7, 6, 1, 223, 4, 2, 254, 164, 24, - 62, 49, 7, 3, 1, 223, 4, 2, 254, 164, 24, 62, 49, 7, 6, 1, 223, 4, 2, - 250, 167, 24, 62, 49, 7, 3, 1, 223, 4, 2, 250, 167, 24, 62, 49, 7, 6, 1, - 223, 4, 2, 62, 251, 220, 24, 62, 49, 7, 3, 1, 223, 4, 2, 62, 251, 220, - 24, 62, 49, 7, 6, 1, 218, 100, 2, 62, 49, 7, 3, 1, 218, 100, 2, 62, 49, - 7, 6, 1, 218, 100, 2, 62, 55, 7, 3, 1, 218, 100, 2, 62, 55, 7, 6, 1, 218, - 100, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2, 232, 243, 55, 7, 6, 1, 218, - 100, 2, 249, 224, 55, 7, 3, 1, 218, 100, 2, 249, 224, 55, 7, 6, 1, 111, - 2, 247, 210, 55, 7, 3, 1, 111, 2, 247, 210, 55, 7, 6, 1, 111, 2, 217, 43, - 55, 7, 3, 1, 111, 2, 217, 43, 55, 7, 6, 1, 111, 2, 249, 224, 55, 7, 3, 1, - 111, 2, 249, 224, 55, 7, 6, 1, 111, 2, 217, 43, 24, 179, 7, 3, 1, 111, 2, - 217, 43, 24, 179, 7, 6, 1, 111, 2, 232, 38, 24, 247, 209, 7, 3, 1, 111, - 2, 232, 38, 24, 247, 209, 7, 6, 1, 215, 80, 2, 217, 42, 7, 3, 1, 215, 80, - 2, 217, 42, 7, 6, 1, 215, 80, 2, 62, 55, 7, 3, 1, 215, 80, 2, 62, 55, 7, - 6, 1, 214, 83, 2, 242, 113, 7, 3, 1, 214, 83, 2, 242, 113, 7, 6, 1, 214, - 83, 2, 179, 7, 3, 1, 214, 83, 2, 179, 7, 6, 1, 214, 83, 2, 247, 209, 7, - 3, 1, 214, 83, 2, 247, 209, 7, 6, 1, 214, 83, 2, 62, 49, 7, 3, 1, 214, - 83, 2, 62, 49, 7, 6, 1, 214, 83, 2, 62, 55, 7, 3, 1, 214, 83, 2, 62, 55, - 7, 6, 1, 213, 167, 2, 62, 49, 7, 3, 1, 213, 167, 2, 62, 49, 7, 6, 1, 213, - 167, 2, 247, 209, 7, 3, 1, 213, 167, 2, 247, 209, 7, 6, 1, 213, 106, 2, - 62, 49, 7, 3, 1, 213, 106, 2, 62, 49, 7, 6, 1, 212, 153, 2, 249, 223, 7, - 3, 1, 212, 153, 2, 249, 223, 7, 6, 1, 212, 153, 2, 62, 55, 7, 3, 1, 212, - 153, 2, 62, 55, 7, 6, 1, 212, 153, 2, 232, 243, 55, 7, 3, 1, 212, 153, 2, - 232, 243, 55, 7, 3, 1, 242, 42, 2, 232, 243, 55, 7, 3, 1, 218, 100, 2, - 247, 209, 7, 3, 1, 214, 83, 2, 223, 131, 49, 7, 3, 1, 213, 106, 2, 223, - 131, 49, 7, 3, 1, 118, 2, 46, 151, 223, 130, 7, 3, 1, 184, 223, 4, 2, 62, - 49, 7, 3, 1, 184, 223, 4, 2, 247, 207, 90, 7, 3, 1, 184, 223, 4, 2, 124, - 90, 7, 6, 1, 220, 255, 197, 7, 3, 1, 248, 5, 7, 6, 1, 118, 2, 62, 55, 7, - 3, 1, 118, 2, 62, 55, 7, 6, 1, 118, 2, 241, 38, 49, 7, 3, 1, 118, 2, 241, - 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 179, 7, 3, 1, 118, 2, 249, 224, - 24, 179, 7, 6, 1, 118, 2, 249, 224, 24, 242, 113, 7, 3, 1, 118, 2, 249, - 224, 24, 242, 113, 7, 6, 1, 118, 2, 249, 224, 24, 241, 38, 49, 7, 3, 1, - 118, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 118, 2, 249, 224, 24, 217, - 42, 7, 3, 1, 118, 2, 249, 224, 24, 217, 42, 7, 6, 1, 118, 2, 249, 224, - 24, 62, 55, 7, 3, 1, 118, 2, 249, 224, 24, 62, 55, 7, 6, 1, 118, 2, 251, - 75, 24, 179, 7, 3, 1, 118, 2, 251, 75, 24, 179, 7, 6, 1, 118, 2, 251, 75, - 24, 242, 113, 7, 3, 1, 118, 2, 251, 75, 24, 242, 113, 7, 6, 1, 118, 2, - 251, 75, 24, 241, 38, 49, 7, 3, 1, 118, 2, 251, 75, 24, 241, 38, 49, 7, - 6, 1, 118, 2, 251, 75, 24, 217, 42, 7, 3, 1, 118, 2, 251, 75, 24, 217, - 42, 7, 6, 1, 118, 2, 251, 75, 24, 62, 55, 7, 3, 1, 118, 2, 251, 75, 24, - 62, 55, 7, 6, 1, 191, 2, 62, 55, 7, 3, 1, 191, 2, 62, 55, 7, 6, 1, 191, - 2, 241, 38, 49, 7, 3, 1, 191, 2, 241, 38, 49, 7, 6, 1, 191, 2, 217, 42, - 7, 3, 1, 191, 2, 217, 42, 7, 6, 1, 191, 2, 249, 224, 24, 179, 7, 3, 1, - 191, 2, 249, 224, 24, 179, 7, 6, 1, 191, 2, 249, 224, 24, 242, 113, 7, 3, - 1, 191, 2, 249, 224, 24, 242, 113, 7, 6, 1, 191, 2, 249, 224, 24, 241, - 38, 49, 7, 3, 1, 191, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 191, 2, 249, - 224, 24, 217, 42, 7, 3, 1, 191, 2, 249, 224, 24, 217, 42, 7, 6, 1, 191, - 2, 249, 224, 24, 62, 55, 7, 3, 1, 191, 2, 249, 224, 24, 62, 55, 7, 6, 1, - 240, 146, 2, 241, 38, 49, 7, 3, 1, 240, 146, 2, 241, 38, 49, 7, 6, 1, - 240, 146, 2, 62, 55, 7, 3, 1, 240, 146, 2, 62, 55, 7, 6, 1, 157, 2, 62, - 55, 7, 3, 1, 157, 2, 62, 55, 7, 6, 1, 157, 2, 241, 38, 49, 7, 3, 1, 157, - 2, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 179, 7, 3, 1, 157, 2, 249, - 224, 24, 179, 7, 6, 1, 157, 2, 249, 224, 24, 242, 113, 7, 3, 1, 157, 2, - 249, 224, 24, 242, 113, 7, 6, 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 3, - 1, 157, 2, 249, 224, 24, 241, 38, 49, 7, 6, 1, 157, 2, 249, 224, 24, 217, - 42, 7, 3, 1, 157, 2, 249, 224, 24, 217, 42, 7, 6, 1, 157, 2, 249, 224, - 24, 62, 55, 7, 3, 1, 157, 2, 249, 224, 24, 62, 55, 7, 6, 1, 157, 2, 240, - 236, 24, 179, 7, 3, 1, 157, 2, 240, 236, 24, 179, 7, 6, 1, 157, 2, 240, - 236, 24, 242, 113, 7, 3, 1, 157, 2, 240, 236, 24, 242, 113, 7, 6, 1, 157, - 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 157, 2, 240, 236, 24, 241, 38, 49, - 7, 6, 1, 157, 2, 240, 236, 24, 217, 42, 7, 3, 1, 157, 2, 240, 236, 24, - 217, 42, 7, 6, 1, 157, 2, 240, 236, 24, 62, 55, 7, 3, 1, 157, 2, 240, - 236, 24, 62, 55, 7, 6, 1, 111, 2, 62, 55, 7, 3, 1, 111, 2, 62, 55, 7, 6, - 1, 111, 2, 241, 38, 49, 7, 3, 1, 111, 2, 241, 38, 49, 7, 6, 1, 111, 2, - 240, 236, 24, 179, 7, 3, 1, 111, 2, 240, 236, 24, 179, 7, 6, 1, 111, 2, - 240, 236, 24, 242, 113, 7, 3, 1, 111, 2, 240, 236, 24, 242, 113, 7, 6, 1, - 111, 2, 240, 236, 24, 241, 38, 49, 7, 3, 1, 111, 2, 240, 236, 24, 241, - 38, 49, 7, 6, 1, 111, 2, 240, 236, 24, 217, 42, 7, 3, 1, 111, 2, 240, - 236, 24, 217, 42, 7, 6, 1, 111, 2, 240, 236, 24, 62, 55, 7, 3, 1, 111, 2, - 240, 236, 24, 62, 55, 7, 6, 1, 213, 106, 2, 242, 113, 7, 3, 1, 213, 106, - 2, 242, 113, 7, 6, 1, 213, 106, 2, 62, 55, 7, 3, 1, 213, 106, 2, 62, 55, - 7, 6, 1, 213, 106, 2, 241, 38, 49, 7, 3, 1, 213, 106, 2, 241, 38, 49, 7, - 6, 1, 213, 106, 2, 217, 42, 7, 3, 1, 213, 106, 2, 217, 42, 7, 6, 1, 231, - 36, 232, 214, 7, 3, 1, 231, 36, 232, 214, 7, 6, 1, 231, 36, 215, 79, 7, - 3, 1, 231, 36, 215, 79, 7, 6, 1, 213, 106, 2, 232, 177, 7, 3, 1, 213, - 106, 2, 232, 177, 25, 3, 1, 254, 53, 2, 225, 39, 25, 3, 1, 254, 53, 2, - 248, 99, 25, 3, 1, 254, 53, 2, 225, 40, 24, 214, 245, 25, 3, 1, 254, 53, - 2, 207, 24, 214, 245, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 234, 25, 3, - 1, 254, 53, 2, 207, 24, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, - 50, 25, 3, 1, 254, 53, 2, 207, 24, 226, 50, 25, 6, 1, 254, 53, 2, 225, - 39, 25, 6, 1, 254, 53, 2, 248, 99, 25, 6, 1, 254, 53, 2, 225, 40, 24, - 214, 245, 25, 6, 1, 254, 53, 2, 207, 24, 214, 245, 25, 6, 1, 254, 53, 2, - 225, 40, 24, 226, 234, 25, 6, 1, 254, 53, 2, 207, 24, 226, 234, 25, 6, 1, - 254, 53, 2, 225, 40, 24, 226, 50, 25, 6, 1, 254, 53, 2, 207, 24, 226, 50, - 25, 3, 1, 245, 64, 2, 225, 39, 25, 3, 1, 245, 64, 2, 248, 99, 25, 3, 1, - 245, 64, 2, 225, 40, 24, 214, 245, 25, 3, 1, 245, 64, 2, 207, 24, 214, - 245, 25, 3, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 3, 1, 245, 64, 2, - 207, 24, 226, 234, 25, 6, 1, 245, 64, 2, 225, 39, 25, 6, 1, 245, 64, 2, - 248, 99, 25, 6, 1, 245, 64, 2, 225, 40, 24, 214, 245, 25, 6, 1, 245, 64, - 2, 207, 24, 214, 245, 25, 6, 1, 245, 64, 2, 225, 40, 24, 226, 234, 25, 6, - 1, 245, 64, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2, 225, 39, 25, 3, - 1, 245, 29, 2, 248, 99, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214, 245, 25, - 3, 1, 245, 29, 2, 207, 24, 214, 245, 25, 3, 1, 245, 29, 2, 225, 40, 24, - 226, 234, 25, 3, 1, 245, 29, 2, 207, 24, 226, 234, 25, 3, 1, 245, 29, 2, - 225, 40, 24, 226, 50, 25, 3, 1, 245, 29, 2, 207, 24, 226, 50, 25, 6, 1, - 245, 29, 2, 225, 39, 25, 6, 1, 245, 29, 2, 248, 99, 25, 6, 1, 245, 29, 2, - 225, 40, 24, 214, 245, 25, 6, 1, 245, 29, 2, 207, 24, 214, 245, 25, 6, 1, - 245, 29, 2, 225, 40, 24, 226, 234, 25, 6, 1, 245, 29, 2, 207, 24, 226, - 234, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226, 50, 25, 6, 1, 245, 29, 2, - 207, 24, 226, 50, 25, 3, 1, 235, 184, 2, 225, 39, 25, 3, 1, 235, 184, 2, - 248, 99, 25, 3, 1, 235, 184, 2, 225, 40, 24, 214, 245, 25, 3, 1, 235, - 184, 2, 207, 24, 214, 245, 25, 3, 1, 235, 184, 2, 225, 40, 24, 226, 234, - 25, 3, 1, 235, 184, 2, 207, 24, 226, 234, 25, 3, 1, 235, 184, 2, 225, 40, - 24, 226, 50, 25, 3, 1, 235, 184, 2, 207, 24, 226, 50, 25, 6, 1, 235, 184, - 2, 225, 39, 25, 6, 1, 235, 184, 2, 248, 99, 25, 6, 1, 235, 184, 2, 225, - 40, 24, 214, 245, 25, 6, 1, 235, 184, 2, 207, 24, 214, 245, 25, 6, 1, - 235, 184, 2, 225, 40, 24, 226, 234, 25, 6, 1, 235, 184, 2, 207, 24, 226, - 234, 25, 6, 1, 235, 184, 2, 225, 40, 24, 226, 50, 25, 6, 1, 235, 184, 2, - 207, 24, 226, 50, 25, 3, 1, 227, 66, 2, 225, 39, 25, 3, 1, 227, 66, 2, - 248, 99, 25, 3, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25, 3, 1, 227, 66, - 2, 207, 24, 214, 245, 25, 3, 1, 227, 66, 2, 225, 40, 24, 226, 234, 25, 3, - 1, 227, 66, 2, 207, 24, 226, 234, 25, 6, 1, 227, 66, 2, 225, 39, 25, 6, - 1, 227, 66, 2, 248, 99, 25, 6, 1, 227, 66, 2, 225, 40, 24, 214, 245, 25, - 6, 1, 227, 66, 2, 207, 24, 214, 245, 25, 6, 1, 227, 66, 2, 225, 40, 24, - 226, 234, 25, 6, 1, 227, 66, 2, 207, 24, 226, 234, 25, 3, 1, 215, 129, 2, - 225, 39, 25, 3, 1, 215, 129, 2, 248, 99, 25, 3, 1, 215, 129, 2, 225, 40, - 24, 214, 245, 25, 3, 1, 215, 129, 2, 207, 24, 214, 245, 25, 3, 1, 215, - 129, 2, 225, 40, 24, 226, 234, 25, 3, 1, 215, 129, 2, 207, 24, 226, 234, - 25, 3, 1, 215, 129, 2, 225, 40, 24, 226, 50, 25, 3, 1, 215, 129, 2, 207, - 24, 226, 50, 25, 6, 1, 215, 129, 2, 248, 99, 25, 6, 1, 215, 129, 2, 207, - 24, 214, 245, 25, 6, 1, 215, 129, 2, 207, 24, 226, 234, 25, 6, 1, 215, - 129, 2, 207, 24, 226, 50, 25, 3, 1, 227, 68, 2, 225, 39, 25, 3, 1, 227, - 68, 2, 248, 99, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 245, 25, 3, 1, - 227, 68, 2, 207, 24, 214, 245, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226, - 234, 25, 3, 1, 227, 68, 2, 207, 24, 226, 234, 25, 3, 1, 227, 68, 2, 225, - 40, 24, 226, 50, 25, 3, 1, 227, 68, 2, 207, 24, 226, 50, 25, 6, 1, 227, - 68, 2, 225, 39, 25, 6, 1, 227, 68, 2, 248, 99, 25, 6, 1, 227, 68, 2, 225, - 40, 24, 214, 245, 25, 6, 1, 227, 68, 2, 207, 24, 214, 245, 25, 6, 1, 227, - 68, 2, 225, 40, 24, 226, 234, 25, 6, 1, 227, 68, 2, 207, 24, 226, 234, - 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 50, 25, 6, 1, 227, 68, 2, 207, - 24, 226, 50, 25, 3, 1, 254, 53, 2, 214, 245, 25, 3, 1, 254, 53, 2, 226, - 234, 25, 3, 1, 245, 64, 2, 214, 245, 25, 3, 1, 245, 64, 2, 226, 234, 25, - 3, 1, 245, 29, 2, 214, 245, 25, 3, 1, 245, 29, 2, 226, 234, 25, 3, 1, - 235, 184, 2, 214, 245, 25, 3, 1, 235, 184, 2, 226, 234, 25, 3, 1, 227, - 66, 2, 214, 245, 25, 3, 1, 227, 66, 2, 226, 234, 25, 3, 1, 215, 129, 2, - 214, 245, 25, 3, 1, 215, 129, 2, 226, 234, 25, 3, 1, 227, 68, 2, 214, - 245, 25, 3, 1, 227, 68, 2, 226, 234, 25, 3, 1, 254, 53, 2, 225, 40, 24, - 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 212, 210, 25, 3, 1, 254, 53, 2, - 225, 40, 24, 214, 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 207, 24, 214, - 246, 24, 212, 210, 25, 3, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 212, - 210, 25, 3, 1, 254, 53, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1, - 254, 53, 2, 225, 40, 24, 226, 51, 24, 212, 210, 25, 3, 1, 254, 53, 2, - 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 225, 40, 24, 225, - 51, 25, 6, 1, 254, 53, 2, 207, 24, 225, 51, 25, 6, 1, 254, 53, 2, 225, - 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 214, 246, - 24, 225, 51, 25, 6, 1, 254, 53, 2, 225, 40, 24, 226, 235, 24, 225, 51, - 25, 6, 1, 254, 53, 2, 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 254, 53, - 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1, 254, 53, 2, 207, 24, 226, - 51, 24, 225, 51, 25, 3, 1, 245, 29, 2, 225, 40, 24, 212, 210, 25, 3, 1, - 245, 29, 2, 207, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40, 24, 214, - 246, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 214, 246, 24, 212, 210, - 25, 3, 1, 245, 29, 2, 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245, - 29, 2, 207, 24, 226, 235, 24, 212, 210, 25, 3, 1, 245, 29, 2, 225, 40, - 24, 226, 51, 24, 212, 210, 25, 3, 1, 245, 29, 2, 207, 24, 226, 51, 24, - 212, 210, 25, 6, 1, 245, 29, 2, 225, 40, 24, 225, 51, 25, 6, 1, 245, 29, - 2, 207, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 214, 246, 24, - 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1, - 245, 29, 2, 225, 40, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2, - 207, 24, 226, 235, 24, 225, 51, 25, 6, 1, 245, 29, 2, 225, 40, 24, 226, - 51, 24, 225, 51, 25, 6, 1, 245, 29, 2, 207, 24, 226, 51, 24, 225, 51, 25, - 3, 1, 227, 68, 2, 225, 40, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24, - 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 212, 210, 25, - 3, 1, 227, 68, 2, 207, 24, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2, - 225, 40, 24, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 207, 24, 226, - 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 212, - 210, 25, 3, 1, 227, 68, 2, 207, 24, 226, 51, 24, 212, 210, 25, 6, 1, 227, - 68, 2, 225, 40, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 225, 51, 25, - 6, 1, 227, 68, 2, 225, 40, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68, - 2, 207, 24, 214, 246, 24, 225, 51, 25, 6, 1, 227, 68, 2, 225, 40, 24, - 226, 235, 24, 225, 51, 25, 6, 1, 227, 68, 2, 207, 24, 226, 235, 24, 225, - 51, 25, 6, 1, 227, 68, 2, 225, 40, 24, 226, 51, 24, 225, 51, 25, 6, 1, - 227, 68, 2, 207, 24, 226, 51, 24, 225, 51, 25, 3, 1, 254, 53, 2, 214, - 101, 25, 3, 1, 254, 53, 2, 232, 37, 25, 3, 1, 254, 53, 2, 214, 246, 24, - 212, 210, 25, 3, 1, 254, 53, 2, 212, 210, 25, 3, 1, 254, 53, 2, 226, 235, - 24, 212, 210, 25, 3, 1, 254, 53, 2, 226, 50, 25, 3, 1, 254, 53, 2, 226, - 51, 24, 212, 210, 25, 6, 1, 254, 53, 2, 214, 101, 25, 6, 1, 254, 53, 2, - 232, 37, 25, 6, 1, 254, 53, 2, 214, 245, 25, 6, 1, 254, 53, 2, 226, 234, - 25, 6, 1, 254, 53, 2, 225, 51, 25, 234, 11, 25, 225, 51, 25, 225, 39, 25, - 226, 50, 25, 247, 204, 24, 226, 50, 25, 3, 1, 245, 29, 2, 214, 246, 24, - 212, 210, 25, 3, 1, 245, 29, 2, 212, 210, 25, 3, 1, 245, 29, 2, 226, 235, - 24, 212, 210, 25, 3, 1, 245, 29, 2, 226, 50, 25, 3, 1, 245, 29, 2, 226, - 51, 24, 212, 210, 25, 6, 1, 245, 64, 2, 214, 245, 25, 6, 1, 245, 64, 2, - 226, 234, 25, 6, 1, 245, 29, 2, 214, 245, 25, 6, 1, 245, 29, 2, 226, 234, - 25, 6, 1, 245, 29, 2, 225, 51, 25, 225, 40, 24, 214, 245, 25, 225, 40, - 24, 226, 234, 25, 225, 40, 24, 226, 50, 25, 3, 1, 235, 184, 2, 214, 101, - 25, 3, 1, 235, 184, 2, 232, 37, 25, 3, 1, 235, 184, 2, 247, 204, 24, 214, - 245, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 234, 25, 3, 1, 235, 184, - 2, 226, 50, 25, 3, 1, 235, 184, 2, 247, 204, 24, 226, 50, 25, 6, 1, 235, - 184, 2, 214, 101, 25, 6, 1, 235, 184, 2, 232, 37, 25, 6, 1, 235, 184, 2, - 214, 245, 25, 6, 1, 235, 184, 2, 226, 234, 25, 207, 24, 214, 245, 25, - 207, 24, 226, 234, 25, 207, 24, 226, 50, 25, 3, 1, 215, 129, 2, 214, 101, - 25, 3, 1, 215, 129, 2, 232, 37, 25, 3, 1, 215, 129, 2, 247, 204, 24, 214, - 245, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 234, 25, 3, 1, 223, 191, - 2, 225, 39, 25, 3, 1, 223, 191, 2, 248, 99, 25, 3, 1, 215, 129, 2, 226, - 50, 25, 3, 1, 215, 129, 2, 247, 204, 24, 226, 50, 25, 6, 1, 215, 129, 2, - 214, 101, 25, 6, 1, 215, 129, 2, 232, 37, 25, 6, 1, 215, 129, 2, 214, - 245, 25, 6, 1, 215, 129, 2, 226, 234, 25, 6, 1, 223, 191, 2, 248, 99, 25, - 247, 204, 24, 214, 245, 25, 247, 204, 24, 226, 234, 25, 214, 245, 25, 3, - 1, 227, 68, 2, 214, 246, 24, 212, 210, 25, 3, 1, 227, 68, 2, 212, 210, - 25, 3, 1, 227, 68, 2, 226, 235, 24, 212, 210, 25, 3, 1, 227, 68, 2, 226, - 50, 25, 3, 1, 227, 68, 2, 226, 51, 24, 212, 210, 25, 6, 1, 227, 66, 2, - 214, 245, 25, 6, 1, 227, 66, 2, 226, 234, 25, 6, 1, 227, 68, 2, 214, 245, - 25, 6, 1, 227, 68, 2, 226, 234, 25, 6, 1, 227, 68, 2, 225, 51, 25, 226, - 234, 25, 248, 99, 245, 109, 224, 172, 245, 118, 224, 172, 245, 109, 219, - 206, 245, 118, 219, 206, 217, 95, 219, 206, 243, 235, 219, 206, 220, 51, - 219, 206, 244, 81, 219, 206, 225, 27, 219, 206, 217, 123, 219, 206, 242, - 17, 219, 206, 212, 80, 213, 230, 219, 206, 212, 80, 213, 230, 228, 178, - 212, 80, 213, 230, 235, 66, 233, 62, 77, 223, 140, 77, 240, 160, 228, - 179, 240, 160, 244, 81, 248, 101, 245, 109, 248, 101, 245, 118, 248, 101, - 199, 134, 51, 71, 232, 242, 51, 115, 232, 242, 42, 220, 81, 224, 143, 77, - 46, 220, 81, 224, 143, 77, 220, 81, 232, 164, 224, 143, 77, 220, 81, 241, - 149, 224, 143, 77, 42, 51, 224, 143, 77, 46, 51, 224, 143, 77, 51, 232, - 164, 224, 143, 77, 51, 241, 149, 224, 143, 77, 248, 149, 51, 248, 149, - 251, 42, 216, 180, 251, 42, 122, 62, 233, 80, 117, 62, 233, 80, 199, 245, - 120, 240, 158, 225, 144, 232, 243, 221, 57, 226, 143, 221, 57, 233, 62, - 245, 116, 223, 140, 245, 116, 225, 126, 247, 148, 243, 244, 233, 62, 226, - 241, 223, 140, 226, 241, 230, 14, 228, 184, 219, 206, 226, 58, 231, 6, - 52, 226, 58, 217, 201, 217, 101, 52, 225, 71, 51, 225, 71, 216, 169, 225, - 71, 223, 202, 225, 71, 223, 202, 51, 225, 71, 223, 202, 216, 169, 225, - 71, 250, 170, 220, 81, 233, 66, 254, 19, 224, 143, 77, 220, 81, 223, 144, - 254, 19, 224, 143, 77, 224, 0, 77, 51, 244, 254, 77, 235, 198, 226, 243, - 215, 150, 137, 217, 65, 250, 171, 235, 213, 225, 144, 253, 130, 240, 161, - 251, 42, 243, 228, 220, 23, 42, 41, 251, 85, 2, 224, 152, 46, 41, 251, - 85, 2, 224, 152, 51, 224, 158, 77, 224, 158, 244, 254, 77, 244, 254, 224, - 158, 77, 217, 23, 5, 245, 30, 223, 202, 225, 200, 52, 83, 132, 251, 42, - 83, 95, 251, 42, 115, 253, 132, 223, 202, 221, 70, 249, 194, 215, 134, - 117, 253, 131, 254, 67, 214, 165, 249, 156, 230, 251, 52, 218, 179, 248, - 101, 235, 191, 215, 150, 244, 21, 225, 27, 77, 133, 62, 225, 26, 224, - 169, 225, 71, 243, 237, 62, 225, 26, 244, 50, 62, 225, 26, 117, 62, 225, - 26, 243, 237, 62, 77, 246, 72, 249, 70, 216, 179, 71, 243, 237, 247, 72, - 231, 147, 14, 219, 206, 213, 196, 235, 66, 243, 198, 253, 222, 235, 189, - 217, 38, 235, 189, 221, 57, 235, 189, 225, 156, 235, 225, 218, 127, 218, - 196, 254, 166, 218, 127, 218, 196, 235, 225, 12, 243, 245, 221, 3, 254, - 166, 12, 243, 245, 221, 3, 230, 10, 21, 221, 4, 228, 180, 21, 221, 4, - 218, 223, 212, 79, 218, 223, 7, 3, 1, 72, 218, 223, 163, 218, 223, 180, - 218, 223, 189, 218, 223, 198, 218, 223, 195, 218, 223, 200, 218, 223, 94, - 52, 218, 223, 230, 250, 218, 223, 245, 61, 52, 218, 223, 42, 226, 131, - 218, 223, 46, 226, 131, 218, 223, 7, 3, 1, 204, 219, 10, 212, 79, 219, - 10, 116, 219, 10, 109, 219, 10, 166, 219, 10, 163, 219, 10, 180, 219, 10, - 189, 219, 10, 198, 219, 10, 195, 219, 10, 200, 219, 10, 94, 52, 219, 10, - 230, 250, 219, 10, 245, 61, 52, 219, 10, 42, 226, 131, 219, 10, 46, 226, - 131, 7, 219, 10, 3, 1, 61, 7, 219, 10, 3, 1, 74, 7, 219, 10, 3, 1, 75, 7, - 219, 10, 3, 1, 213, 166, 7, 219, 10, 3, 1, 222, 113, 7, 219, 10, 3, 1, - 242, 41, 7, 219, 10, 3, 1, 235, 27, 7, 219, 10, 3, 1, 150, 7, 219, 10, 3, - 1, 183, 7, 219, 10, 3, 1, 204, 7, 219, 10, 3, 1, 226, 229, 7, 219, 10, 3, - 1, 197, 7, 219, 10, 3, 1, 218, 99, 245, 13, 52, 249, 165, 52, 249, 57, - 52, 243, 221, 243, 224, 52, 232, 227, 52, 231, 7, 52, 230, 29, 52, 226, - 38, 52, 223, 29, 52, 213, 204, 52, 156, 220, 229, 52, 247, 81, 52, 245, - 14, 52, 234, 85, 52, 216, 76, 52, 246, 55, 52, 243, 16, 226, 68, 52, 226, - 36, 52, 242, 88, 52, 253, 98, 52, 240, 215, 52, 250, 119, 52, 232, 220, - 216, 216, 52, 219, 188, 52, 217, 198, 52, 235, 238, 223, 29, 52, 37, 42, - 241, 238, 49, 37, 46, 241, 238, 49, 37, 184, 71, 232, 243, 226, 244, 37, - 220, 175, 71, 232, 243, 226, 244, 37, 253, 255, 76, 49, 37, 249, 195, 76, - 49, 37, 42, 76, 49, 37, 46, 76, 49, 37, 223, 131, 226, 244, 37, 249, 195, - 223, 131, 226, 244, 37, 253, 255, 223, 131, 226, 244, 37, 133, 176, 49, - 37, 243, 237, 176, 49, 37, 245, 104, 249, 228, 37, 245, 104, 219, 166, - 37, 245, 104, 247, 200, 37, 245, 104, 249, 229, 252, 97, 37, 42, 46, 76, - 49, 37, 245, 104, 222, 107, 37, 245, 104, 234, 141, 37, 245, 104, 215, - 126, 225, 141, 216, 183, 37, 223, 203, 219, 232, 226, 244, 37, 51, 71, - 219, 45, 226, 244, 37, 254, 9, 87, 37, 216, 169, 215, 152, 37, 213, 232, - 251, 68, 49, 37, 132, 76, 226, 244, 37, 184, 51, 219, 232, 226, 244, 37, - 95, 241, 238, 2, 206, 246, 57, 37, 132, 241, 238, 2, 206, 246, 57, 37, - 42, 76, 55, 37, 46, 76, 55, 37, 253, 133, 49, 254, 171, 227, 97, 254, - 156, 211, 211, 217, 149, 219, 19, 187, 6, 250, 252, 248, 22, 250, 112, - 250, 109, 232, 243, 87, 250, 172, 227, 97, 250, 212, 215, 159, 245, 15, - 249, 130, 222, 104, 248, 22, 244, 147, 113, 3, 243, 177, 113, 6, 242, 41, - 251, 142, 6, 242, 41, 187, 6, 242, 41, 225, 169, 249, 130, 225, 169, 249, - 131, 110, 117, 225, 240, 113, 6, 72, 251, 142, 6, 72, 113, 6, 150, 113, - 3, 150, 233, 171, 54, 252, 60, 87, 187, 6, 204, 228, 52, 52, 219, 218, - 224, 12, 249, 101, 113, 6, 226, 229, 187, 6, 226, 229, 187, 6, 224, 240, - 113, 6, 149, 251, 142, 6, 149, 187, 6, 149, 225, 76, 218, 21, 223, 214, - 221, 53, 77, 217, 210, 52, 216, 210, 152, 52, 214, 217, 187, 6, 212, 152, - 227, 1, 52, 227, 87, 52, 235, 191, 227, 87, 52, 251, 142, 6, 212, 152, - 216, 58, 25, 3, 1, 235, 183, 234, 179, 52, 254, 16, 52, 113, 6, 253, 74, - 251, 142, 6, 250, 252, 245, 33, 87, 113, 3, 74, 113, 6, 74, 113, 6, 244, - 230, 216, 58, 6, 244, 230, 113, 6, 183, 113, 3, 75, 106, 87, 251, 206, - 87, 242, 178, 87, 248, 135, 87, 235, 229, 219, 216, 223, 89, 6, 224, 240, - 244, 150, 52, 187, 3, 225, 240, 187, 3, 243, 83, 187, 6, 243, 83, 187, 6, - 225, 240, 187, 230, 97, 218, 241, 216, 58, 35, 6, 243, 177, 216, 58, 35, - 6, 150, 223, 202, 35, 6, 150, 216, 58, 35, 6, 213, 105, 187, 32, 6, 249, - 3, 187, 32, 3, 249, 3, 187, 32, 3, 74, 187, 32, 3, 72, 187, 32, 3, 235, - 142, 225, 54, 232, 242, 216, 58, 254, 35, 226, 58, 52, 254, 88, 216, 58, - 3, 244, 230, 16, 31, 222, 167, 219, 216, 214, 97, 243, 228, 122, 221, 39, - 214, 97, 243, 228, 122, 229, 25, 214, 97, 243, 228, 122, 217, 194, 214, - 97, 243, 228, 122, 217, 121, 214, 97, 243, 228, 117, 217, 119, 214, 97, - 243, 228, 122, 244, 86, 214, 97, 243, 228, 117, 244, 85, 214, 97, 243, - 228, 133, 244, 85, 214, 97, 243, 228, 243, 237, 244, 85, 214, 97, 243, - 228, 122, 220, 43, 214, 97, 243, 228, 244, 50, 220, 41, 214, 97, 243, - 228, 122, 245, 145, 214, 97, 243, 228, 133, 245, 143, 214, 97, 243, 228, - 244, 50, 245, 143, 214, 97, 243, 228, 221, 43, 245, 143, 243, 228, 228, - 53, 116, 223, 100, 228, 54, 116, 223, 100, 228, 54, 109, 223, 100, 228, - 54, 166, 223, 100, 228, 54, 163, 223, 100, 228, 54, 180, 223, 100, 228, - 54, 189, 223, 100, 228, 54, 198, 223, 100, 228, 54, 195, 223, 100, 228, - 54, 200, 223, 100, 228, 54, 217, 200, 223, 100, 228, 54, 245, 124, 223, - 100, 228, 54, 216, 41, 223, 100, 228, 54, 244, 83, 223, 100, 228, 54, - 122, 240, 200, 223, 100, 228, 54, 244, 50, 240, 200, 223, 100, 228, 54, - 122, 217, 100, 3, 223, 100, 228, 54, 116, 3, 223, 100, 228, 54, 109, 3, - 223, 100, 228, 54, 166, 3, 223, 100, 228, 54, 163, 3, 223, 100, 228, 54, - 180, 3, 223, 100, 228, 54, 189, 3, 223, 100, 228, 54, 198, 3, 223, 100, - 228, 54, 195, 3, 223, 100, 228, 54, 200, 3, 223, 100, 228, 54, 217, 200, - 3, 223, 100, 228, 54, 245, 124, 3, 223, 100, 228, 54, 216, 41, 3, 223, - 100, 228, 54, 244, 83, 3, 223, 100, 228, 54, 122, 240, 200, 3, 223, 100, - 228, 54, 244, 50, 240, 200, 3, 223, 100, 228, 54, 122, 217, 100, 223, - 100, 228, 54, 122, 217, 101, 250, 253, 249, 3, 223, 100, 228, 54, 244, - 50, 217, 100, 223, 100, 228, 54, 217, 201, 217, 100, 223, 100, 228, 54, - 223, 202, 122, 240, 200, 7, 3, 1, 223, 202, 250, 252, 223, 100, 228, 54, - 220, 53, 233, 101, 17, 223, 100, 228, 54, 244, 84, 245, 182, 17, 223, - 100, 228, 54, 244, 84, 217, 100, 223, 100, 228, 54, 122, 240, 201, 217, - 100, 214, 97, 243, 228, 212, 80, 217, 119, 132, 68, 215, 124, 68, 95, 68, - 246, 58, 68, 42, 46, 68, 114, 119, 68, 228, 167, 213, 250, 68, 228, 167, - 245, 176, 68, 219, 215, 245, 176, 68, 219, 215, 213, 250, 68, 132, 76, 2, - 90, 95, 76, 2, 90, 132, 214, 20, 68, 95, 214, 20, 68, 132, 117, 241, 218, - 68, 215, 124, 117, 241, 218, 68, 95, 117, 241, 218, 68, 246, 58, 117, - 241, 218, 68, 132, 76, 2, 218, 27, 95, 76, 2, 218, 27, 132, 76, 243, 213, - 134, 215, 124, 76, 243, 213, 134, 95, 76, 243, 213, 134, 246, 58, 76, - 243, 213, 134, 114, 119, 76, 2, 252, 47, 132, 76, 2, 101, 95, 76, 2, 101, - 132, 76, 2, 232, 177, 95, 76, 2, 232, 177, 42, 46, 214, 20, 68, 42, 46, - 76, 2, 90, 246, 58, 212, 28, 68, 215, 124, 76, 2, 217, 30, 233, 61, 215, - 124, 76, 2, 217, 30, 223, 138, 246, 58, 76, 2, 217, 30, 233, 61, 246, 58, - 76, 2, 217, 30, 223, 138, 95, 76, 2, 249, 100, 246, 57, 246, 58, 76, 2, - 249, 100, 233, 61, 253, 255, 216, 227, 221, 73, 68, 249, 195, 216, 227, - 221, 73, 68, 228, 167, 213, 250, 76, 211, 211, 184, 134, 132, 76, 211, - 211, 252, 60, 110, 95, 76, 211, 211, 134, 253, 255, 227, 40, 249, 229, - 68, 249, 195, 227, 40, 249, 229, 68, 132, 241, 238, 2, 206, 215, 123, - 132, 241, 238, 2, 206, 246, 57, 215, 124, 241, 238, 2, 206, 223, 138, - 215, 124, 241, 238, 2, 206, 233, 61, 95, 241, 238, 2, 206, 215, 123, 95, - 241, 238, 2, 206, 246, 57, 246, 58, 241, 238, 2, 206, 223, 138, 246, 58, - 241, 238, 2, 206, 233, 61, 95, 76, 110, 132, 68, 215, 124, 76, 132, 65, - 246, 58, 68, 132, 76, 110, 95, 68, 132, 226, 197, 253, 162, 215, 124, - 226, 197, 253, 162, 95, 226, 197, 253, 162, 246, 58, 226, 197, 253, 162, - 132, 241, 238, 110, 95, 241, 237, 95, 241, 238, 110, 132, 241, 237, 132, - 51, 76, 2, 90, 42, 46, 51, 76, 2, 90, 95, 51, 76, 2, 90, 132, 51, 68, - 215, 124, 51, 68, 95, 51, 68, 246, 58, 51, 68, 42, 46, 51, 68, 114, 119, - 51, 68, 228, 167, 213, 250, 51, 68, 228, 167, 245, 176, 51, 68, 219, 215, - 245, 176, 51, 68, 219, 215, 213, 250, 51, 68, 132, 216, 169, 68, 95, 216, - 169, 68, 132, 219, 162, 68, 95, 219, 162, 68, 215, 124, 76, 2, 51, 90, - 246, 58, 76, 2, 51, 90, 132, 248, 100, 68, 215, 124, 248, 100, 68, 95, - 248, 100, 68, 246, 58, 248, 100, 68, 132, 76, 211, 211, 134, 95, 76, 211, - 211, 134, 132, 67, 68, 215, 124, 67, 68, 95, 67, 68, 246, 58, 67, 68, - 215, 124, 67, 76, 243, 213, 134, 215, 124, 67, 76, 227, 63, 226, 89, 215, - 124, 67, 76, 227, 63, 226, 90, 2, 199, 134, 215, 124, 67, 76, 227, 63, - 226, 90, 2, 71, 134, 215, 124, 67, 51, 68, 215, 124, 67, 51, 76, 227, 63, - 226, 89, 95, 67, 76, 243, 213, 214, 40, 228, 167, 213, 250, 76, 211, 211, - 249, 99, 219, 215, 245, 176, 76, 211, 211, 249, 99, 114, 119, 67, 68, 46, - 76, 2, 3, 249, 228, 246, 58, 76, 132, 65, 215, 124, 68, 133, 95, 253, - 162, 132, 76, 2, 71, 90, 95, 76, 2, 71, 90, 42, 46, 76, 2, 71, 90, 132, - 76, 2, 51, 71, 90, 95, 76, 2, 51, 71, 90, 42, 46, 76, 2, 51, 71, 90, 132, - 227, 38, 68, 95, 227, 38, 68, 42, 46, 227, 38, 68, 31, 254, 63, 249, 153, - 226, 125, 247, 185, 217, 140, 244, 250, 217, 140, 247, 92, 228, 163, 244, - 251, 245, 110, 221, 48, 235, 241, 230, 39, 245, 127, 227, 97, 228, 163, - 254, 33, 245, 127, 227, 97, 3, 245, 127, 227, 97, 249, 125, 253, 153, - 231, 126, 247, 92, 228, 163, 249, 127, 253, 153, 231, 126, 3, 249, 125, - 253, 153, 231, 126, 245, 101, 65, 225, 56, 230, 97, 225, 63, 230, 97, - 249, 104, 230, 97, 218, 241, 230, 251, 52, 230, 249, 52, 62, 225, 156, - 247, 121, 220, 23, 221, 49, 230, 250, 253, 133, 227, 33, 223, 131, 227, - 33, 251, 43, 227, 33, 41, 223, 95, 249, 50, 223, 95, 243, 230, 223, 95, - 225, 52, 108, 235, 231, 46, 254, 18, 254, 18, 231, 153, 254, 18, 219, - 187, 254, 18, 247, 123, 247, 92, 228, 163, 247, 126, 226, 136, 108, 228, - 163, 226, 136, 108, 232, 199, 254, 27, 232, 199, 227, 24, 235, 195, 215, - 146, 235, 208, 51, 235, 208, 216, 169, 235, 208, 249, 121, 235, 208, 218, - 213, 235, 208, 214, 110, 235, 208, 249, 195, 235, 208, 249, 195, 249, - 121, 235, 208, 253, 255, 249, 121, 235, 208, 217, 139, 251, 243, 224, 29, - 225, 53, 62, 230, 250, 245, 0, 243, 22, 225, 53, 241, 43, 217, 43, 227, - 33, 223, 202, 217, 42, 235, 191, 233, 89, 197, 220, 83, 214, 19, 213, - 188, 225, 63, 228, 163, 217, 42, 230, 251, 217, 42, 253, 126, 123, 108, - 228, 163, 253, 126, 123, 108, 253, 218, 123, 108, 253, 218, 251, 17, 228, - 163, 254, 165, 123, 108, 229, 181, 253, 218, 228, 170, 254, 165, 123, - 108, 254, 57, 123, 108, 228, 163, 254, 57, 123, 108, 254, 57, 123, 167, - 123, 108, 216, 169, 217, 42, 254, 64, 123, 108, 245, 57, 108, 243, 21, - 245, 57, 108, 247, 186, 251, 200, 253, 220, 217, 149, 232, 250, 243, 21, - 123, 108, 253, 218, 123, 211, 211, 167, 217, 149, 236, 10, 227, 97, 236, - 10, 65, 167, 253, 218, 123, 108, 249, 165, 245, 60, 245, 61, 249, 164, - 223, 131, 235, 252, 123, 108, 223, 131, 123, 108, 249, 93, 108, 245, 32, - 245, 59, 108, 219, 96, 245, 60, 248, 6, 123, 108, 123, 211, 211, 251, 7, - 248, 23, 231, 153, 251, 6, 224, 156, 123, 108, 228, 163, 123, 108, 240, - 97, 108, 228, 163, 240, 97, 108, 219, 49, 245, 57, 108, 233, 39, 167, - 123, 108, 242, 107, 167, 123, 108, 233, 39, 110, 123, 108, 242, 107, 110, - 123, 108, 233, 39, 251, 17, 228, 163, 123, 108, 242, 107, 251, 17, 228, - 163, 123, 108, 230, 167, 233, 38, 230, 167, 242, 106, 251, 200, 228, 163, - 245, 57, 108, 228, 163, 233, 38, 228, 163, 242, 106, 229, 181, 233, 39, - 228, 170, 123, 108, 229, 181, 242, 107, 228, 170, 123, 108, 233, 39, 167, - 245, 57, 108, 242, 107, 167, 245, 57, 108, 229, 181, 233, 39, 228, 170, - 245, 57, 108, 229, 181, 242, 107, 228, 170, 245, 57, 108, 233, 39, 167, - 242, 106, 242, 107, 167, 233, 38, 229, 181, 233, 39, 228, 170, 242, 106, - 229, 181, 242, 107, 228, 170, 233, 38, 225, 82, 219, 0, 225, 83, 167, - 123, 108, 219, 1, 167, 123, 108, 225, 83, 167, 245, 57, 108, 219, 1, 167, - 245, 57, 108, 247, 92, 228, 163, 225, 85, 247, 92, 228, 163, 219, 2, 219, - 9, 227, 97, 218, 222, 227, 97, 228, 163, 118, 219, 9, 227, 97, 228, 163, - 118, 218, 222, 227, 97, 219, 9, 65, 167, 123, 108, 218, 222, 65, 167, - 123, 108, 229, 181, 118, 219, 9, 65, 228, 170, 123, 108, 229, 181, 118, - 218, 222, 65, 228, 170, 123, 108, 219, 9, 65, 2, 228, 163, 123, 108, 218, - 222, 65, 2, 228, 163, 123, 108, 230, 151, 230, 152, 230, 153, 230, 152, - 215, 146, 41, 236, 10, 227, 97, 41, 227, 17, 227, 97, 41, 236, 10, 65, - 167, 123, 108, 41, 227, 17, 65, 167, 123, 108, 41, 250, 183, 41, 249, 43, - 36, 225, 156, 36, 230, 250, 36, 217, 38, 36, 247, 121, 220, 23, 36, 62, - 227, 33, 36, 223, 131, 227, 33, 36, 253, 133, 227, 33, 36, 245, 60, 36, - 248, 101, 91, 225, 156, 91, 230, 250, 91, 217, 38, 91, 62, 227, 33, 46, - 218, 36, 42, 218, 36, 119, 218, 36, 114, 218, 36, 253, 136, 230, 226, - 216, 149, 243, 250, 216, 169, 71, 252, 60, 46, 216, 57, 51, 71, 252, 60, - 51, 46, 216, 57, 247, 92, 228, 163, 225, 48, 228, 163, 216, 149, 247, 92, - 228, 163, 243, 251, 229, 183, 51, 71, 252, 60, 51, 46, 216, 57, 225, 83, - 215, 154, 223, 241, 219, 1, 215, 154, 223, 241, 228, 168, 219, 22, 227, - 97, 249, 125, 253, 153, 228, 168, 219, 21, 228, 168, 219, 22, 65, 167, - 123, 108, 249, 125, 253, 153, 228, 168, 219, 22, 167, 123, 108, 227, 17, - 227, 97, 236, 10, 227, 97, 230, 157, 241, 185, 249, 136, 231, 200, 235, - 205, 213, 133, 230, 22, 228, 169, 46, 254, 19, 2, 253, 195, 46, 216, 183, - 230, 97, 232, 199, 254, 27, 230, 97, 232, 199, 227, 24, 230, 97, 235, - 195, 230, 97, 215, 146, 247, 201, 227, 33, 62, 227, 33, 219, 96, 227, 33, - 247, 121, 217, 38, 251, 90, 42, 228, 168, 244, 149, 221, 69, 225, 63, 46, - 228, 168, 244, 149, 221, 69, 225, 63, 42, 221, 69, 225, 63, 46, 221, 69, - 225, 63, 223, 202, 217, 43, 245, 60, 249, 40, 232, 199, 227, 24, 249, 40, - 232, 199, 254, 27, 51, 219, 8, 51, 218, 221, 51, 235, 195, 51, 215, 146, - 225, 179, 123, 24, 226, 136, 108, 233, 39, 2, 247, 74, 242, 107, 2, 247, - 74, 214, 164, 230, 167, 233, 38, 214, 164, 230, 167, 242, 106, 233, 39, - 123, 211, 211, 167, 242, 106, 242, 107, 123, 211, 211, 167, 233, 38, 123, - 211, 211, 167, 233, 38, 123, 211, 211, 167, 242, 106, 123, 211, 211, 167, - 225, 82, 123, 211, 211, 167, 219, 0, 247, 92, 228, 163, 225, 86, 167, - 245, 62, 247, 92, 228, 163, 219, 3, 167, 245, 62, 228, 163, 41, 236, 10, - 65, 167, 123, 108, 228, 163, 41, 227, 17, 65, 167, 123, 108, 41, 236, 10, - 65, 167, 228, 163, 123, 108, 41, 227, 17, 65, 167, 228, 163, 123, 108, - 233, 39, 251, 17, 228, 163, 245, 57, 108, 242, 107, 251, 17, 228, 163, - 245, 57, 108, 225, 83, 251, 17, 228, 163, 245, 57, 108, 219, 1, 251, 17, - 228, 163, 245, 57, 108, 228, 163, 228, 168, 219, 22, 227, 97, 247, 92, - 228, 163, 249, 127, 253, 153, 228, 168, 219, 21, 228, 163, 228, 168, 219, - 22, 65, 167, 123, 108, 247, 92, 228, 163, 249, 127, 253, 153, 228, 168, - 219, 22, 167, 245, 62, 71, 245, 120, 231, 35, 199, 245, 120, 114, 46, - 247, 207, 245, 120, 119, 46, 247, 207, 245, 120, 245, 127, 65, 2, 184, - 199, 90, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, - 3, 245, 127, 65, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, 245, - 127, 65, 2, 62, 49, 245, 127, 65, 2, 226, 247, 3, 245, 127, 65, 2, 226, - 247, 245, 127, 65, 2, 215, 153, 245, 127, 65, 2, 117, 199, 219, 32, 249, - 125, 2, 184, 199, 90, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65, - 199, 90, 3, 249, 125, 2, 71, 252, 60, 253, 123, 245, 101, 65, 199, 90, - 249, 125, 2, 226, 247, 3, 249, 125, 2, 226, 247, 212, 153, 174, 252, 91, - 231, 125, 247, 202, 52, 245, 129, 68, 240, 221, 114, 253, 164, 119, 253, - 164, 225, 59, 226, 41, 214, 16, 232, 242, 42, 250, 115, 46, 250, 115, 42, - 244, 26, 46, 244, 26, 251, 101, 46, 249, 72, 251, 101, 42, 249, 72, 216, - 227, 46, 249, 72, 216, 227, 42, 249, 72, 223, 202, 228, 163, 52, 41, 232, - 159, 253, 195, 222, 83, 222, 90, 217, 210, 224, 13, 225, 121, 235, 235, - 214, 145, 219, 166, 225, 173, 65, 235, 204, 52, 216, 58, 228, 163, 52, - 214, 26, 240, 223, 216, 227, 42, 249, 99, 216, 227, 46, 249, 99, 251, - 101, 42, 249, 99, 251, 101, 46, 249, 99, 216, 227, 151, 235, 208, 251, - 101, 151, 235, 208, 243, 210, 220, 3, 114, 253, 165, 251, 201, 117, 199, - 252, 49, 227, 26, 234, 144, 245, 53, 211, 211, 217, 149, 223, 148, 213, - 167, 235, 252, 118, 224, 10, 251, 89, 234, 143, 233, 66, 254, 19, 125, - 223, 144, 254, 19, 125, 245, 53, 211, 211, 217, 149, 233, 70, 251, 212, - 223, 130, 249, 13, 254, 64, 253, 172, 218, 126, 216, 217, 223, 34, 247, - 167, 227, 18, 249, 138, 218, 3, 220, 14, 249, 90, 249, 89, 194, 196, 16, - 240, 143, 194, 196, 16, 219, 160, 224, 172, 194, 196, 16, 224, 173, 245, - 62, 194, 196, 16, 224, 173, 247, 126, 194, 196, 16, 224, 173, 247, 200, - 194, 196, 16, 224, 173, 235, 59, 194, 196, 16, 224, 173, 249, 228, 194, - 196, 16, 249, 229, 219, 75, 194, 196, 16, 249, 229, 235, 59, 194, 196, - 16, 220, 24, 134, 194, 196, 16, 252, 98, 134, 194, 196, 16, 224, 173, - 220, 23, 194, 196, 16, 224, 173, 252, 97, 194, 196, 16, 224, 173, 233, - 38, 194, 196, 16, 224, 173, 242, 106, 194, 196, 16, 132, 214, 251, 194, - 196, 16, 95, 214, 251, 194, 196, 16, 224, 173, 132, 68, 194, 196, 16, - 224, 173, 95, 68, 194, 196, 16, 249, 229, 252, 97, 194, 196, 16, 119, - 218, 37, 215, 153, 194, 196, 16, 248, 6, 219, 75, 194, 196, 16, 224, 173, - 119, 250, 170, 194, 196, 16, 224, 173, 248, 5, 194, 196, 16, 119, 218, - 37, 235, 59, 194, 196, 16, 215, 124, 214, 251, 194, 196, 16, 224, 173, - 215, 124, 68, 194, 196, 16, 114, 218, 37, 226, 247, 194, 196, 16, 248, - 17, 219, 75, 194, 196, 16, 224, 173, 114, 250, 170, 194, 196, 16, 224, - 173, 248, 16, 194, 196, 16, 114, 218, 37, 235, 59, 194, 196, 16, 246, 58, - 214, 251, 194, 196, 16, 224, 173, 246, 58, 68, 194, 196, 16, 224, 142, - 215, 153, 194, 196, 16, 248, 6, 215, 153, 194, 196, 16, 247, 201, 215, - 153, 194, 196, 16, 235, 60, 215, 153, 194, 196, 16, 249, 229, 215, 153, - 194, 196, 16, 114, 220, 185, 235, 59, 194, 196, 16, 224, 142, 224, 172, - 194, 196, 16, 249, 229, 219, 95, 194, 196, 16, 224, 173, 249, 164, 194, - 196, 16, 114, 218, 37, 247, 209, 194, 196, 16, 248, 17, 247, 209, 194, - 196, 16, 219, 96, 247, 209, 194, 196, 16, 235, 60, 247, 209, 194, 196, - 16, 249, 229, 247, 209, 194, 196, 16, 119, 220, 185, 219, 75, 194, 196, - 16, 42, 220, 185, 219, 75, 194, 196, 16, 217, 43, 247, 209, 194, 196, 16, - 242, 107, 247, 209, 194, 196, 16, 249, 158, 134, 194, 196, 16, 248, 17, - 217, 42, 194, 196, 16, 212, 27, 194, 196, 16, 219, 76, 217, 42, 194, 196, - 16, 221, 71, 215, 153, 194, 196, 16, 224, 173, 228, 163, 245, 62, 194, - 196, 16, 224, 173, 224, 157, 194, 196, 16, 119, 250, 171, 217, 42, 194, - 196, 16, 114, 250, 171, 217, 42, 194, 196, 16, 235, 183, 194, 196, 16, - 223, 190, 194, 196, 16, 227, 67, 194, 196, 16, 254, 53, 215, 153, 194, - 196, 16, 245, 64, 215, 153, 194, 196, 16, 235, 184, 215, 153, 194, 196, - 16, 227, 68, 215, 153, 194, 196, 16, 254, 52, 228, 163, 250, 66, 77, 46, - 254, 19, 2, 246, 58, 212, 28, 68, 220, 159, 227, 40, 251, 89, 251, 222, - 87, 71, 232, 243, 2, 231, 37, 247, 74, 235, 213, 87, 249, 122, 215, 151, - 87, 247, 141, 215, 151, 87, 245, 112, 87, 249, 149, 87, 67, 41, 2, 250, - 109, 71, 232, 242, 245, 89, 87, 254, 48, 234, 145, 87, 241, 197, 87, 36, - 199, 252, 60, 2, 228, 161, 36, 216, 184, 246, 60, 251, 63, 249, 229, 2, - 228, 165, 68, 215, 149, 87, 230, 207, 87, 240, 156, 87, 227, 39, 242, 40, - 87, 227, 39, 233, 169, 87, 226, 117, 87, 226, 116, 87, 247, 149, 249, 38, - 16, 243, 245, 109, 219, 234, 87, 194, 196, 16, 224, 172, 248, 34, 221, - 58, 234, 145, 87, 225, 73, 226, 200, 229, 164, 226, 200, 225, 69, 222, - 108, 87, 249, 210, 222, 108, 87, 42, 226, 132, 215, 131, 101, 42, 226, - 132, 244, 245, 42, 226, 132, 232, 163, 101, 46, 226, 132, 215, 131, 101, - 46, 226, 132, 244, 245, 46, 226, 132, 232, 163, 101, 42, 41, 251, 85, - 215, 131, 249, 99, 42, 41, 251, 85, 244, 245, 42, 41, 251, 85, 232, 163, - 249, 99, 46, 41, 251, 85, 215, 131, 249, 99, 46, 41, 251, 85, 244, 245, - 46, 41, 251, 85, 232, 163, 249, 99, 42, 249, 40, 251, 85, 215, 131, 101, - 42, 249, 40, 251, 85, 231, 37, 225, 233, 42, 249, 40, 251, 85, 232, 163, - 101, 249, 40, 251, 85, 244, 245, 46, 249, 40, 251, 85, 215, 131, 101, 46, - 249, 40, 251, 85, 231, 37, 225, 233, 46, 249, 40, 251, 85, 232, 163, 101, - 235, 209, 244, 245, 199, 232, 243, 244, 245, 215, 131, 42, 167, 232, 163, - 46, 249, 40, 251, 85, 222, 91, 215, 131, 46, 167, 232, 163, 42, 249, 40, - 251, 85, 222, 91, 218, 242, 216, 226, 218, 242, 251, 100, 216, 227, 41, - 125, 251, 101, 41, 125, 251, 101, 41, 251, 85, 110, 216, 227, 41, 125, - 34, 16, 251, 100, 42, 71, 92, 232, 242, 46, 71, 92, 232, 242, 199, 222, - 123, 232, 241, 199, 222, 123, 232, 240, 199, 222, 123, 232, 239, 199, - 222, 123, 232, 238, 247, 253, 16, 177, 71, 24, 216, 227, 223, 148, 247, - 253, 16, 177, 71, 24, 251, 101, 223, 148, 247, 253, 16, 177, 71, 2, 249, - 228, 247, 253, 16, 177, 119, 24, 199, 2, 249, 228, 247, 253, 16, 177, - 114, 24, 199, 2, 249, 228, 247, 253, 16, 177, 71, 2, 216, 183, 247, 253, - 16, 177, 119, 24, 199, 2, 216, 183, 247, 253, 16, 177, 114, 24, 199, 2, - 216, 183, 247, 253, 16, 177, 71, 24, 214, 19, 247, 253, 16, 177, 119, 24, - 199, 2, 214, 19, 247, 253, 16, 177, 114, 24, 199, 2, 214, 19, 247, 253, - 16, 177, 119, 24, 241, 31, 247, 253, 16, 177, 114, 24, 241, 31, 247, 253, - 16, 177, 71, 24, 216, 227, 233, 70, 247, 253, 16, 177, 71, 24, 251, 101, - 233, 70, 41, 244, 1, 223, 206, 87, 245, 139, 87, 71, 232, 243, 244, 245, - 231, 100, 251, 74, 231, 100, 184, 110, 220, 174, 231, 100, 220, 175, 110, - 232, 190, 231, 100, 184, 110, 117, 220, 161, 231, 100, 117, 220, 162, - 110, 232, 190, 231, 100, 117, 220, 162, 235, 67, 231, 100, 216, 166, 231, - 100, 217, 176, 231, 100, 226, 63, 245, 180, 242, 100, 243, 191, 216, 227, - 226, 131, 251, 101, 226, 131, 216, 227, 249, 40, 125, 251, 101, 249, 40, - 125, 216, 227, 216, 219, 220, 233, 125, 251, 101, 216, 219, 220, 233, - 125, 67, 216, 197, 251, 212, 223, 131, 2, 249, 228, 219, 60, 244, 33, - 254, 177, 249, 37, 245, 128, 235, 195, 248, 34, 244, 247, 87, 83, 223, - 144, 51, 216, 183, 83, 233, 66, 51, 216, 183, 83, 215, 133, 51, 216, 183, - 83, 246, 59, 51, 216, 183, 83, 223, 144, 51, 216, 184, 2, 71, 134, 83, - 233, 66, 51, 216, 184, 2, 71, 134, 83, 223, 144, 216, 184, 2, 51, 71, - 134, 254, 81, 249, 196, 219, 66, 217, 39, 249, 196, 240, 224, 2, 244, 19, - 222, 157, 16, 31, 228, 58, 16, 31, 219, 91, 65, 241, 217, 16, 31, 219, - 91, 65, 217, 165, 16, 31, 245, 101, 65, 217, 165, 16, 31, 245, 101, 65, - 216, 200, 16, 31, 245, 91, 16, 31, 254, 168, 16, 31, 251, 221, 16, 31, - 252, 96, 16, 31, 199, 218, 38, 16, 31, 232, 243, 244, 114, 16, 31, 71, - 218, 38, 16, 31, 243, 245, 244, 114, 16, 31, 250, 162, 223, 205, 16, 31, - 220, 208, 226, 254, 16, 31, 220, 208, 235, 251, 16, 31, 248, 97, 232, - 233, 245, 42, 16, 31, 247, 238, 249, 117, 116, 16, 31, 247, 238, 249, - 117, 109, 16, 31, 247, 238, 249, 117, 166, 16, 31, 247, 238, 249, 117, - 163, 16, 31, 146, 254, 168, 16, 31, 218, 123, 236, 57, 16, 31, 245, 101, - 65, 216, 201, 251, 136, 16, 31, 250, 193, 16, 31, 245, 101, 65, 231, 146, - 16, 31, 219, 6, 16, 31, 245, 42, 16, 31, 244, 76, 221, 57, 16, 31, 242, - 99, 221, 57, 16, 31, 224, 14, 221, 57, 16, 31, 215, 145, 221, 57, 16, 31, - 219, 206, 16, 31, 248, 14, 251, 139, 87, 227, 40, 251, 89, 16, 31, 229, - 167, 16, 31, 248, 15, 243, 245, 109, 16, 31, 219, 7, 243, 245, 109, 227, - 105, 101, 227, 105, 250, 87, 227, 105, 243, 248, 227, 105, 235, 191, 243, - 248, 227, 105, 251, 219, 251, 53, 227, 105, 251, 96, 217, 65, 227, 105, - 251, 82, 252, 65, 240, 96, 227, 105, 254, 36, 65, 250, 65, 227, 105, 248, - 101, 227, 105, 249, 29, 254, 171, 228, 56, 227, 105, 51, 252, 97, 36, 21, - 116, 36, 21, 109, 36, 21, 166, 36, 21, 163, 36, 21, 180, 36, 21, 189, 36, - 21, 198, 36, 21, 195, 36, 21, 200, 36, 50, 217, 200, 36, 50, 245, 124, - 36, 50, 216, 41, 36, 50, 217, 117, 36, 50, 243, 231, 36, 50, 244, 87, 36, - 50, 220, 47, 36, 50, 221, 40, 36, 50, 245, 147, 36, 50, 229, 28, 36, 50, - 216, 38, 86, 21, 116, 86, 21, 109, 86, 21, 166, 86, 21, 163, 86, 21, 180, - 86, 21, 189, 86, 21, 198, 86, 21, 195, 86, 21, 200, 86, 50, 217, 200, 86, - 50, 245, 124, 86, 50, 216, 41, 86, 50, 217, 117, 86, 50, 243, 231, 86, - 50, 244, 87, 86, 50, 220, 47, 86, 50, 221, 40, 86, 50, 245, 147, 86, 50, - 229, 28, 86, 50, 216, 38, 21, 122, 243, 200, 219, 69, 21, 117, 243, 200, - 219, 69, 21, 133, 243, 200, 219, 69, 21, 243, 237, 243, 200, 219, 69, 21, - 244, 50, 243, 200, 219, 69, 21, 220, 53, 243, 200, 219, 69, 21, 221, 43, - 243, 200, 219, 69, 21, 245, 150, 243, 200, 219, 69, 21, 229, 31, 243, - 200, 219, 69, 50, 217, 201, 243, 200, 219, 69, 50, 245, 125, 243, 200, - 219, 69, 50, 216, 42, 243, 200, 219, 69, 50, 217, 118, 243, 200, 219, 69, - 50, 243, 232, 243, 200, 219, 69, 50, 244, 88, 243, 200, 219, 69, 50, 220, - 48, 243, 200, 219, 69, 50, 221, 41, 243, 200, 219, 69, 50, 245, 148, 243, - 200, 219, 69, 50, 229, 29, 243, 200, 219, 69, 50, 216, 39, 243, 200, 219, - 69, 86, 7, 3, 1, 61, 86, 7, 3, 1, 253, 74, 86, 7, 3, 1, 250, 252, 86, 7, - 3, 1, 249, 3, 86, 7, 3, 1, 74, 86, 7, 3, 1, 244, 230, 86, 7, 3, 1, 243, - 177, 86, 7, 3, 1, 242, 41, 86, 7, 3, 1, 72, 86, 7, 3, 1, 235, 142, 86, 7, - 3, 1, 235, 27, 86, 7, 3, 1, 150, 86, 7, 3, 1, 183, 86, 7, 3, 1, 204, 86, - 7, 3, 1, 75, 86, 7, 3, 1, 226, 229, 86, 7, 3, 1, 224, 240, 86, 7, 3, 1, - 149, 86, 7, 3, 1, 197, 86, 7, 3, 1, 218, 99, 86, 7, 3, 1, 69, 86, 7, 3, - 1, 215, 79, 86, 7, 3, 1, 214, 82, 86, 7, 3, 1, 213, 166, 86, 7, 3, 1, - 213, 105, 86, 7, 3, 1, 212, 152, 36, 7, 6, 1, 61, 36, 7, 6, 1, 253, 74, - 36, 7, 6, 1, 250, 252, 36, 7, 6, 1, 249, 3, 36, 7, 6, 1, 74, 36, 7, 6, 1, - 244, 230, 36, 7, 6, 1, 243, 177, 36, 7, 6, 1, 242, 41, 36, 7, 6, 1, 72, - 36, 7, 6, 1, 235, 142, 36, 7, 6, 1, 235, 27, 36, 7, 6, 1, 150, 36, 7, 6, - 1, 183, 36, 7, 6, 1, 204, 36, 7, 6, 1, 75, 36, 7, 6, 1, 226, 229, 36, 7, - 6, 1, 224, 240, 36, 7, 6, 1, 149, 36, 7, 6, 1, 197, 36, 7, 6, 1, 218, 99, - 36, 7, 6, 1, 69, 36, 7, 6, 1, 215, 79, 36, 7, 6, 1, 214, 82, 36, 7, 6, 1, - 213, 166, 36, 7, 6, 1, 213, 105, 36, 7, 6, 1, 212, 152, 36, 7, 3, 1, 61, - 36, 7, 3, 1, 253, 74, 36, 7, 3, 1, 250, 252, 36, 7, 3, 1, 249, 3, 36, 7, - 3, 1, 74, 36, 7, 3, 1, 244, 230, 36, 7, 3, 1, 243, 177, 36, 7, 3, 1, 242, - 41, 36, 7, 3, 1, 72, 36, 7, 3, 1, 235, 142, 36, 7, 3, 1, 235, 27, 36, 7, - 3, 1, 150, 36, 7, 3, 1, 183, 36, 7, 3, 1, 204, 36, 7, 3, 1, 75, 36, 7, 3, - 1, 226, 229, 36, 7, 3, 1, 224, 240, 36, 7, 3, 1, 149, 36, 7, 3, 1, 197, - 36, 7, 3, 1, 218, 99, 36, 7, 3, 1, 69, 36, 7, 3, 1, 215, 79, 36, 7, 3, 1, - 214, 82, 36, 7, 3, 1, 213, 166, 36, 7, 3, 1, 213, 105, 36, 7, 3, 1, 212, - 152, 36, 21, 212, 79, 146, 36, 50, 245, 124, 146, 36, 50, 216, 41, 146, - 36, 50, 217, 117, 146, 36, 50, 243, 231, 146, 36, 50, 244, 87, 146, 36, - 50, 220, 47, 146, 36, 50, 221, 40, 146, 36, 50, 245, 147, 146, 36, 50, - 229, 28, 146, 36, 50, 216, 38, 51, 36, 21, 116, 51, 36, 21, 109, 51, 36, - 21, 166, 51, 36, 21, 163, 51, 36, 21, 180, 51, 36, 21, 189, 51, 36, 21, - 198, 51, 36, 21, 195, 51, 36, 21, 200, 51, 36, 50, 217, 200, 146, 36, 21, - 212, 79, 92, 96, 177, 241, 31, 92, 96, 107, 241, 31, 92, 96, 177, 214, - 216, 92, 96, 107, 214, 216, 92, 96, 177, 216, 169, 248, 102, 241, 31, 92, - 96, 107, 216, 169, 248, 102, 241, 31, 92, 96, 177, 216, 169, 248, 102, - 214, 216, 92, 96, 107, 216, 169, 248, 102, 214, 216, 92, 96, 177, 224, - 169, 248, 102, 241, 31, 92, 96, 107, 224, 169, 248, 102, 241, 31, 92, 96, - 177, 224, 169, 248, 102, 214, 216, 92, 96, 107, 224, 169, 248, 102, 214, - 216, 92, 96, 177, 119, 24, 223, 148, 92, 96, 119, 177, 24, 46, 241, 205, - 92, 96, 119, 107, 24, 46, 233, 2, 92, 96, 107, 119, 24, 223, 148, 92, 96, - 177, 119, 24, 233, 70, 92, 96, 119, 177, 24, 42, 241, 205, 92, 96, 119, - 107, 24, 42, 233, 2, 92, 96, 107, 119, 24, 233, 70, 92, 96, 177, 114, 24, - 223, 148, 92, 96, 114, 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46, - 233, 2, 92, 96, 107, 114, 24, 223, 148, 92, 96, 177, 114, 24, 233, 70, - 92, 96, 114, 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 233, 2, 92, - 96, 107, 114, 24, 233, 70, 92, 96, 177, 71, 24, 223, 148, 92, 96, 71, - 177, 24, 46, 241, 205, 92, 96, 114, 107, 24, 46, 119, 233, 2, 92, 96, - 119, 107, 24, 46, 114, 233, 2, 92, 96, 71, 107, 24, 46, 233, 2, 92, 96, - 119, 177, 24, 46, 114, 241, 205, 92, 96, 114, 177, 24, 46, 119, 241, 205, - 92, 96, 107, 71, 24, 223, 148, 92, 96, 177, 71, 24, 233, 70, 92, 96, 71, - 177, 24, 42, 241, 205, 92, 96, 114, 107, 24, 42, 119, 233, 2, 92, 96, - 119, 107, 24, 42, 114, 233, 2, 92, 96, 71, 107, 24, 42, 233, 2, 92, 96, - 119, 177, 24, 42, 114, 241, 205, 92, 96, 114, 177, 24, 42, 119, 241, 205, - 92, 96, 107, 71, 24, 233, 70, 92, 96, 177, 119, 24, 241, 31, 92, 96, 42, - 107, 24, 46, 119, 233, 2, 92, 96, 46, 107, 24, 42, 119, 233, 2, 92, 96, - 119, 177, 24, 199, 241, 205, 92, 96, 119, 107, 24, 199, 233, 2, 92, 96, - 46, 177, 24, 42, 119, 241, 205, 92, 96, 42, 177, 24, 46, 119, 241, 205, - 92, 96, 107, 119, 24, 241, 31, 92, 96, 177, 114, 24, 241, 31, 92, 96, 42, - 107, 24, 46, 114, 233, 2, 92, 96, 46, 107, 24, 42, 114, 233, 2, 92, 96, - 114, 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 199, 233, 2, 92, 96, - 46, 177, 24, 42, 114, 241, 205, 92, 96, 42, 177, 24, 46, 114, 241, 205, - 92, 96, 107, 114, 24, 241, 31, 92, 96, 177, 71, 24, 241, 31, 92, 96, 42, - 107, 24, 46, 71, 233, 2, 92, 96, 46, 107, 24, 42, 71, 233, 2, 92, 96, 71, - 177, 24, 199, 241, 205, 92, 96, 114, 107, 24, 119, 199, 233, 2, 92, 96, - 119, 107, 24, 114, 199, 233, 2, 92, 96, 71, 107, 24, 199, 233, 2, 92, 96, - 42, 114, 107, 24, 46, 119, 233, 2, 92, 96, 46, 114, 107, 24, 42, 119, - 233, 2, 92, 96, 42, 119, 107, 24, 46, 114, 233, 2, 92, 96, 46, 119, 107, - 24, 42, 114, 233, 2, 92, 96, 119, 177, 24, 114, 199, 241, 205, 92, 96, - 114, 177, 24, 119, 199, 241, 205, 92, 96, 46, 177, 24, 42, 71, 241, 205, - 92, 96, 42, 177, 24, 46, 71, 241, 205, 92, 96, 107, 71, 24, 241, 31, 92, - 96, 177, 51, 248, 102, 241, 31, 92, 96, 107, 51, 248, 102, 241, 31, 92, - 96, 177, 51, 248, 102, 214, 216, 92, 96, 107, 51, 248, 102, 214, 216, 92, - 96, 51, 241, 31, 92, 96, 51, 214, 216, 92, 96, 119, 220, 81, 24, 46, 246, - 67, 92, 96, 119, 51, 24, 46, 220, 80, 92, 96, 51, 119, 24, 223, 148, 92, - 96, 119, 220, 81, 24, 42, 246, 67, 92, 96, 119, 51, 24, 42, 220, 80, 92, - 96, 51, 119, 24, 233, 70, 92, 96, 114, 220, 81, 24, 46, 246, 67, 92, 96, - 114, 51, 24, 46, 220, 80, 92, 96, 51, 114, 24, 223, 148, 92, 96, 114, - 220, 81, 24, 42, 246, 67, 92, 96, 114, 51, 24, 42, 220, 80, 92, 96, 51, - 114, 24, 233, 70, 92, 96, 71, 220, 81, 24, 46, 246, 67, 92, 96, 71, 51, - 24, 46, 220, 80, 92, 96, 51, 71, 24, 223, 148, 92, 96, 71, 220, 81, 24, - 42, 246, 67, 92, 96, 71, 51, 24, 42, 220, 80, 92, 96, 51, 71, 24, 233, - 70, 92, 96, 119, 220, 81, 24, 199, 246, 67, 92, 96, 119, 51, 24, 199, - 220, 80, 92, 96, 51, 119, 24, 241, 31, 92, 96, 114, 220, 81, 24, 199, - 246, 67, 92, 96, 114, 51, 24, 199, 220, 80, 92, 96, 51, 114, 24, 241, 31, - 92, 96, 71, 220, 81, 24, 199, 246, 67, 92, 96, 71, 51, 24, 199, 220, 80, - 92, 96, 51, 71, 24, 241, 31, 92, 96, 177, 253, 196, 119, 24, 223, 148, - 92, 96, 177, 253, 196, 119, 24, 233, 70, 92, 96, 177, 253, 196, 114, 24, - 233, 70, 92, 96, 177, 253, 196, 114, 24, 223, 148, 92, 96, 177, 247, 207, - 215, 131, 46, 211, 211, 232, 163, 233, 70, 92, 96, 177, 247, 207, 215, - 131, 42, 211, 211, 232, 163, 223, 148, 92, 96, 177, 247, 207, 249, 70, - 92, 96, 177, 233, 70, 92, 96, 177, 215, 134, 92, 96, 177, 223, 148, 92, - 96, 177, 246, 60, 92, 96, 107, 233, 70, 92, 96, 107, 215, 134, 92, 96, - 107, 223, 148, 92, 96, 107, 246, 60, 92, 96, 177, 42, 24, 107, 223, 148, - 92, 96, 177, 114, 24, 107, 246, 60, 92, 96, 107, 42, 24, 177, 223, 148, - 92, 96, 107, 114, 24, 177, 246, 60, 215, 131, 151, 251, 136, 232, 163, - 122, 245, 146, 251, 136, 232, 163, 122, 224, 167, 251, 136, 232, 163, - 133, 245, 144, 251, 136, 232, 163, 151, 251, 136, 232, 163, 244, 50, 245, - 144, 251, 136, 232, 163, 133, 224, 165, 251, 136, 232, 163, 221, 43, 245, - 144, 251, 136, 243, 200, 251, 136, 42, 221, 43, 245, 144, 251, 136, 42, - 133, 224, 165, 251, 136, 42, 244, 50, 245, 144, 251, 136, 42, 151, 251, - 136, 42, 133, 245, 144, 251, 136, 42, 122, 224, 167, 251, 136, 42, 122, - 245, 146, 251, 136, 46, 151, 251, 136, 177, 221, 14, 231, 147, 221, 14, - 248, 107, 221, 14, 215, 131, 122, 245, 146, 251, 136, 46, 122, 245, 146, - 251, 136, 224, 171, 232, 163, 233, 70, 224, 171, 232, 163, 223, 148, 224, - 171, 215, 131, 233, 70, 224, 171, 215, 131, 42, 24, 232, 163, 42, 24, - 232, 163, 223, 148, 224, 171, 215, 131, 42, 24, 232, 163, 223, 148, 224, - 171, 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171, - 215, 131, 42, 24, 215, 131, 46, 24, 232, 163, 223, 148, 224, 171, 215, - 131, 223, 148, 224, 171, 215, 131, 46, 24, 232, 163, 233, 70, 224, 171, - 215, 131, 46, 24, 232, 163, 42, 24, 232, 163, 223, 148, 83, 219, 166, 67, - 219, 166, 67, 41, 2, 223, 85, 249, 98, 67, 41, 249, 126, 83, 3, 219, 166, - 41, 2, 199, 244, 74, 41, 2, 71, 244, 74, 41, 2, 227, 11, 249, 66, 244, - 74, 41, 2, 215, 131, 42, 211, 211, 232, 163, 46, 244, 74, 41, 2, 215, - 131, 46, 211, 211, 232, 163, 42, 244, 74, 41, 2, 247, 207, 249, 66, 244, - 74, 83, 3, 219, 166, 67, 3, 219, 166, 83, 224, 9, 67, 224, 9, 83, 71, - 224, 9, 67, 71, 224, 9, 83, 226, 134, 67, 226, 134, 83, 215, 133, 216, - 183, 67, 215, 133, 216, 183, 83, 215, 133, 3, 216, 183, 67, 215, 133, 3, - 216, 183, 83, 223, 144, 216, 183, 67, 223, 144, 216, 183, 83, 223, 144, - 3, 216, 183, 67, 223, 144, 3, 216, 183, 83, 223, 144, 225, 142, 67, 223, - 144, 225, 142, 83, 246, 59, 216, 183, 67, 246, 59, 216, 183, 83, 246, 59, - 3, 216, 183, 67, 246, 59, 3, 216, 183, 83, 233, 66, 216, 183, 67, 233, - 66, 216, 183, 83, 233, 66, 3, 216, 183, 67, 233, 66, 3, 216, 183, 83, - 233, 66, 225, 142, 67, 233, 66, 225, 142, 83, 247, 200, 67, 247, 200, 67, - 247, 201, 249, 126, 83, 3, 247, 200, 244, 58, 232, 159, 67, 249, 228, - 246, 72, 249, 228, 249, 229, 2, 71, 244, 74, 251, 40, 83, 249, 228, 249, - 229, 2, 42, 151, 251, 144, 249, 229, 2, 46, 151, 251, 144, 249, 229, 2, - 232, 163, 151, 251, 144, 249, 229, 2, 215, 131, 151, 251, 144, 249, 229, - 2, 215, 131, 46, 224, 171, 251, 144, 249, 229, 2, 254, 64, 251, 17, 215, - 131, 42, 224, 171, 251, 144, 42, 151, 83, 249, 228, 46, 151, 83, 249, - 228, 235, 192, 251, 42, 235, 192, 67, 249, 228, 215, 131, 151, 235, 192, - 67, 249, 228, 232, 163, 151, 235, 192, 67, 249, 228, 215, 131, 42, 224, - 171, 249, 226, 253, 195, 215, 131, 46, 224, 171, 249, 226, 253, 195, 232, - 163, 46, 224, 171, 249, 226, 253, 195, 232, 163, 42, 224, 171, 249, 226, - 253, 195, 215, 131, 151, 249, 228, 232, 163, 151, 249, 228, 83, 232, 163, - 46, 216, 183, 83, 232, 163, 42, 216, 183, 83, 215, 131, 42, 216, 183, 83, - 215, 131, 46, 216, 183, 67, 251, 42, 41, 2, 42, 151, 251, 144, 41, 2, 46, - 151, 251, 144, 41, 2, 215, 131, 42, 247, 207, 151, 251, 144, 41, 2, 232, - 163, 46, 247, 207, 151, 251, 144, 67, 41, 2, 71, 251, 155, 232, 242, 67, - 215, 133, 216, 184, 2, 247, 74, 215, 133, 216, 184, 2, 42, 151, 251, 144, - 215, 133, 216, 184, 2, 46, 151, 251, 144, 233, 108, 249, 228, 67, 41, 2, - 215, 131, 42, 224, 170, 67, 41, 2, 232, 163, 42, 224, 170, 67, 41, 2, - 232, 163, 46, 224, 170, 67, 41, 2, 215, 131, 46, 224, 170, 67, 249, 229, - 2, 215, 131, 42, 224, 170, 67, 249, 229, 2, 232, 163, 42, 224, 170, 67, - 249, 229, 2, 232, 163, 46, 224, 170, 67, 249, 229, 2, 215, 131, 46, 224, - 170, 215, 131, 42, 216, 183, 215, 131, 46, 216, 183, 232, 163, 42, 216, - 183, 67, 231, 147, 219, 166, 83, 231, 147, 219, 166, 67, 231, 147, 3, - 219, 166, 83, 231, 147, 3, 219, 166, 232, 163, 46, 216, 183, 83, 218, - 239, 2, 224, 25, 249, 184, 215, 164, 219, 244, 249, 160, 83, 219, 95, 67, - 219, 95, 233, 0, 217, 86, 218, 238, 253, 149, 228, 182, 247, 245, 228, - 182, 249, 135, 227, 29, 83, 217, 209, 67, 217, 209, 252, 75, 251, 89, - 252, 75, 92, 2, 250, 65, 252, 75, 92, 2, 213, 166, 222, 169, 215, 165, 2, - 224, 51, 246, 39, 240, 230, 251, 199, 67, 220, 182, 225, 233, 83, 220, - 182, 225, 233, 221, 10, 223, 202, 223, 89, 244, 24, 241, 212, 251, 42, - 83, 42, 225, 141, 235, 239, 83, 46, 225, 141, 235, 239, 67, 42, 225, 141, - 235, 239, 67, 114, 225, 141, 235, 239, 67, 46, 225, 141, 235, 239, 67, - 119, 225, 141, 235, 239, 220, 29, 24, 249, 69, 250, 152, 52, 224, 62, 52, - 251, 162, 52, 250, 211, 254, 13, 227, 12, 249, 70, 250, 48, 223, 190, - 249, 71, 65, 232, 173, 249, 71, 65, 235, 117, 219, 96, 24, 249, 76, 244, - 136, 87, 254, 153, 221, 12, 242, 5, 24, 220, 115, 226, 95, 87, 212, 245, - 213, 58, 216, 173, 31, 241, 207, 216, 173, 31, 233, 131, 216, 173, 31, - 244, 65, 216, 173, 31, 217, 87, 216, 173, 31, 213, 224, 216, 173, 31, - 214, 24, 216, 173, 31, 230, 185, 216, 173, 31, 245, 179, 213, 242, 65, - 247, 226, 67, 243, 209, 244, 158, 67, 220, 2, 244, 158, 83, 220, 2, 244, - 158, 67, 218, 239, 2, 224, 25, 244, 61, 224, 167, 230, 198, 233, 103, - 224, 167, 230, 198, 231, 118, 244, 107, 52, 245, 179, 231, 253, 52, 235, - 41, 222, 137, 215, 116, 229, 175, 225, 154, 253, 183, 217, 247, 243, 28, - 250, 191, 233, 43, 214, 131, 233, 10, 222, 110, 222, 188, 250, 180, 253, - 212, 225, 184, 67, 250, 54, 234, 87, 67, 250, 54, 224, 159, 67, 250, 54, - 223, 97, 67, 250, 54, 251, 154, 67, 250, 54, 234, 39, 67, 250, 54, 226, - 105, 83, 250, 54, 234, 87, 83, 250, 54, 224, 159, 83, 250, 54, 223, 97, - 83, 250, 54, 251, 154, 83, 250, 54, 234, 39, 83, 250, 54, 226, 105, 83, - 219, 204, 218, 251, 67, 241, 212, 218, 251, 67, 247, 201, 218, 251, 83, - 249, 182, 218, 251, 67, 219, 204, 218, 251, 83, 241, 212, 218, 251, 83, - 247, 201, 218, 251, 67, 249, 182, 218, 251, 240, 230, 219, 170, 224, 167, - 228, 158, 245, 146, 228, 158, 251, 249, 245, 146, 228, 153, 251, 249, - 220, 46, 228, 153, 230, 127, 244, 35, 52, 230, 127, 230, 9, 52, 230, 127, - 220, 255, 52, 213, 250, 175, 249, 70, 245, 176, 175, 249, 70, 215, 142, - 224, 5, 87, 224, 5, 16, 31, 216, 14, 225, 166, 224, 5, 16, 31, 216, 13, - 225, 166, 224, 5, 16, 31, 216, 12, 225, 166, 224, 5, 16, 31, 216, 11, - 225, 166, 224, 5, 16, 31, 216, 10, 225, 166, 224, 5, 16, 31, 216, 9, 225, - 166, 224, 5, 16, 31, 216, 8, 225, 166, 224, 5, 16, 31, 243, 26, 231, 201, - 83, 215, 142, 224, 5, 87, 224, 6, 226, 148, 87, 226, 124, 226, 148, 87, - 226, 49, 226, 148, 52, 213, 240, 87, 247, 193, 244, 157, 247, 193, 244, - 156, 247, 193, 244, 155, 247, 193, 244, 154, 247, 193, 244, 153, 247, - 193, 244, 152, 67, 249, 229, 2, 62, 223, 148, 67, 249, 229, 2, 117, 247, - 72, 83, 249, 229, 2, 67, 62, 223, 148, 83, 249, 229, 2, 117, 67, 247, 72, - 230, 212, 31, 213, 58, 230, 212, 31, 212, 244, 247, 176, 31, 242, 108, - 213, 58, 247, 176, 31, 233, 37, 212, 244, 247, 176, 31, 233, 37, 213, 58, - 247, 176, 31, 242, 108, 212, 244, 67, 244, 42, 83, 244, 42, 242, 5, 24, - 225, 236, 254, 29, 249, 68, 218, 180, 219, 103, 65, 254, 131, 222, 124, - 254, 77, 244, 20, 243, 36, 219, 103, 65, 241, 187, 253, 115, 87, 244, 31, - 226, 250, 67, 219, 95, 133, 232, 237, 249, 114, 223, 148, 133, 232, 237, - 249, 114, 233, 70, 214, 34, 52, 124, 214, 111, 52, 246, 64, 244, 107, 52, - 246, 64, 231, 253, 52, 235, 200, 244, 107, 24, 231, 253, 52, 231, 253, - 24, 244, 107, 52, 231, 253, 2, 219, 45, 52, 231, 253, 2, 219, 45, 24, - 231, 253, 24, 244, 107, 52, 71, 231, 253, 2, 219, 45, 52, 199, 231, 253, - 2, 219, 45, 52, 231, 147, 67, 249, 228, 231, 147, 83, 249, 228, 231, 147, - 3, 67, 249, 228, 231, 216, 87, 247, 119, 87, 215, 140, 226, 123, 87, 249, - 169, 243, 196, 215, 112, 229, 170, 250, 95, 226, 188, 235, 47, 214, 162, - 250, 30, 83, 230, 199, 232, 253, 221, 33, 221, 67, 224, 150, 221, 51, - 219, 239, 252, 78, 252, 46, 91, 234, 144, 67, 246, 48, 231, 248, 67, 246, - 48, 234, 87, 83, 246, 48, 231, 248, 83, 246, 48, 234, 87, 219, 245, 213, - 216, 219, 248, 218, 239, 251, 227, 249, 184, 224, 50, 83, 219, 244, 217, - 88, 249, 185, 24, 224, 50, 216, 58, 67, 220, 182, 225, 233, 216, 58, 83, - 220, 182, 225, 233, 67, 247, 201, 235, 252, 219, 166, 249, 65, 233, 115, - 247, 145, 250, 176, 227, 32, 225, 236, 250, 177, 220, 16, 241, 196, 2, - 67, 249, 70, 36, 249, 65, 233, 115, 250, 88, 228, 186, 245, 83, 254, 50, - 227, 57, 42, 214, 10, 216, 208, 83, 216, 21, 42, 214, 10, 216, 208, 67, - 216, 21, 42, 214, 10, 216, 208, 83, 42, 233, 116, 231, 117, 67, 42, 233, - 116, 231, 117, 246, 44, 220, 10, 52, 107, 67, 246, 59, 216, 183, 42, 249, - 193, 245, 83, 91, 222, 169, 244, 143, 247, 207, 235, 252, 67, 249, 229, - 235, 252, 83, 219, 166, 83, 216, 150, 223, 212, 42, 245, 82, 223, 212, - 42, 245, 81, 253, 127, 16, 31, 215, 116, 107, 249, 229, 2, 219, 45, 24, - 117, 176, 49, 226, 64, 223, 145, 235, 202, 226, 64, 233, 67, 235, 202, - 226, 64, 235, 191, 226, 64, 83, 249, 71, 227, 63, 220, 209, 220, 197, - 220, 154, 249, 254, 250, 158, 241, 143, 220, 54, 243, 37, 213, 216, 240, - 210, 243, 37, 2, 241, 251, 231, 236, 16, 31, 233, 1, 230, 185, 215, 165, - 227, 63, 242, 100, 243, 238, 244, 43, 235, 252, 241, 45, 244, 98, 222, - 185, 41, 243, 237, 249, 98, 220, 32, 240, 105, 220, 35, 226, 44, 2, 252, - 78, 217, 195, 235, 131, 252, 65, 87, 241, 215, 242, 110, 87, 243, 203, - 225, 28, 249, 44, 227, 63, 83, 219, 166, 67, 244, 43, 2, 199, 231, 37, - 83, 219, 46, 215, 131, 251, 140, 222, 112, 83, 222, 112, 232, 163, 251, - 140, 222, 112, 67, 222, 112, 67, 107, 250, 66, 77, 217, 210, 232, 206, - 52, 218, 4, 246, 43, 254, 99, 245, 78, 224, 48, 244, 54, 224, 48, 241, - 254, 214, 152, 241, 254, 213, 186, 241, 254, 232, 163, 46, 226, 73, 226, - 73, 215, 131, 46, 226, 73, 67, 229, 61, 83, 229, 61, 250, 66, 77, 107, - 250, 66, 77, 230, 154, 213, 166, 107, 230, 154, 213, 166, 252, 75, 213, - 166, 107, 252, 75, 213, 166, 226, 250, 25, 249, 70, 107, 25, 249, 70, - 227, 40, 250, 109, 249, 70, 107, 227, 40, 250, 109, 249, 70, 7, 249, 70, - 221, 13, 67, 7, 249, 70, 226, 250, 7, 249, 70, 231, 250, 249, 70, 219, - 96, 65, 248, 95, 243, 237, 217, 223, 253, 132, 243, 237, 252, 76, 253, - 132, 107, 243, 237, 252, 76, 253, 132, 243, 237, 249, 180, 253, 132, 83, - 243, 237, 225, 143, 219, 95, 67, 243, 237, 225, 143, 219, 95, 219, 199, - 219, 51, 226, 250, 67, 219, 95, 36, 67, 219, 95, 227, 40, 250, 109, 83, - 219, 95, 83, 250, 109, 67, 219, 95, 226, 250, 83, 219, 95, 107, 226, 250, - 83, 219, 95, 225, 192, 219, 95, 221, 13, 67, 219, 95, 107, 253, 132, 227, - 40, 250, 109, 253, 132, 245, 150, 219, 176, 253, 132, 245, 150, 225, 143, - 83, 219, 95, 245, 150, 225, 143, 225, 192, 219, 95, 220, 53, 225, 143, - 83, 219, 95, 245, 150, 225, 143, 224, 7, 83, 219, 95, 107, 245, 150, 225, - 143, 224, 7, 83, 219, 95, 216, 42, 225, 143, 83, 219, 95, 220, 48, 225, - 143, 253, 132, 217, 223, 253, 132, 227, 40, 250, 109, 217, 223, 253, 132, - 107, 217, 223, 253, 132, 220, 53, 226, 33, 83, 24, 67, 244, 23, 83, 244, - 23, 67, 244, 23, 245, 150, 226, 33, 226, 250, 83, 244, 23, 36, 227, 40, - 250, 109, 245, 150, 225, 143, 219, 95, 107, 217, 223, 225, 192, 253, 132, - 219, 246, 217, 59, 216, 176, 219, 246, 107, 250, 51, 219, 246, 219, 201, - 107, 219, 201, 252, 76, 253, 132, 245, 150, 217, 223, 225, 55, 253, 132, - 107, 245, 150, 217, 223, 225, 55, 253, 132, 249, 71, 77, 221, 13, 67, - 249, 228, 146, 91, 249, 71, 77, 232, 163, 46, 246, 41, 67, 219, 166, 215, - 131, 46, 246, 41, 67, 219, 166, 232, 163, 46, 221, 13, 67, 219, 166, 215, - 131, 46, 221, 13, 67, 219, 166, 83, 224, 158, 152, 227, 14, 67, 224, 158, - 152, 227, 14, 67, 244, 254, 152, 227, 14, 83, 247, 201, 230, 251, 67, - 213, 166, 107, 244, 254, 152, 87, 177, 71, 134, 231, 147, 71, 134, 107, - 71, 134, 107, 220, 81, 216, 58, 249, 158, 224, 143, 152, 227, 14, 107, - 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 51, 216, 58, 249, 158, - 224, 143, 152, 227, 14, 107, 51, 249, 158, 224, 143, 152, 227, 14, 107, - 115, 220, 81, 249, 158, 224, 143, 152, 227, 14, 107, 115, 51, 249, 158, - 224, 143, 152, 227, 14, 249, 33, 219, 80, 226, 143, 5, 227, 14, 107, 244, - 254, 152, 227, 14, 107, 241, 212, 244, 254, 152, 227, 14, 107, 83, 241, - 211, 223, 89, 107, 83, 241, 212, 251, 42, 244, 24, 241, 211, 223, 89, - 244, 24, 241, 212, 251, 42, 231, 147, 42, 226, 132, 227, 14, 231, 147, - 46, 226, 132, 227, 14, 231, 147, 244, 32, 42, 226, 132, 227, 14, 231, - 147, 244, 32, 46, 226, 132, 227, 14, 231, 147, 233, 66, 254, 19, 251, 85, - 227, 14, 231, 147, 223, 144, 254, 19, 251, 85, 227, 14, 107, 233, 66, - 254, 19, 224, 143, 152, 227, 14, 107, 223, 144, 254, 19, 224, 143, 152, - 227, 14, 107, 233, 66, 254, 19, 251, 85, 227, 14, 107, 223, 144, 254, 19, - 251, 85, 227, 14, 177, 42, 216, 219, 220, 233, 251, 85, 227, 14, 177, 46, - 216, 219, 220, 233, 251, 85, 227, 14, 231, 147, 42, 249, 40, 251, 85, - 227, 14, 231, 147, 46, 249, 40, 251, 85, 227, 14, 247, 156, 146, 36, 21, - 116, 247, 156, 146, 36, 21, 109, 247, 156, 146, 36, 21, 166, 247, 156, - 146, 36, 21, 163, 247, 156, 146, 36, 21, 180, 247, 156, 146, 36, 21, 189, - 247, 156, 146, 36, 21, 198, 247, 156, 146, 36, 21, 195, 247, 156, 146, - 36, 21, 200, 247, 156, 146, 36, 50, 217, 200, 247, 156, 36, 35, 21, 116, - 247, 156, 36, 35, 21, 109, 247, 156, 36, 35, 21, 166, 247, 156, 36, 35, - 21, 163, 247, 156, 36, 35, 21, 180, 247, 156, 36, 35, 21, 189, 247, 156, - 36, 35, 21, 198, 247, 156, 36, 35, 21, 195, 247, 156, 36, 35, 21, 200, - 247, 156, 36, 35, 50, 217, 200, 247, 156, 146, 36, 35, 21, 116, 247, 156, - 146, 36, 35, 21, 109, 247, 156, 146, 36, 35, 21, 166, 247, 156, 146, 36, - 35, 21, 163, 247, 156, 146, 36, 35, 21, 180, 247, 156, 146, 36, 35, 21, - 189, 247, 156, 146, 36, 35, 21, 198, 247, 156, 146, 36, 35, 21, 195, 247, - 156, 146, 36, 35, 21, 200, 247, 156, 146, 36, 35, 50, 217, 200, 107, 213, - 231, 95, 68, 107, 94, 52, 107, 230, 251, 52, 107, 247, 121, 52, 107, 219, - 215, 245, 176, 68, 107, 95, 68, 107, 228, 167, 245, 176, 68, 246, 52, - 225, 145, 95, 68, 107, 223, 86, 95, 68, 216, 182, 95, 68, 107, 216, 182, - 95, 68, 248, 100, 216, 182, 95, 68, 107, 248, 100, 216, 182, 95, 68, 83, - 95, 68, 217, 97, 216, 225, 95, 253, 164, 217, 97, 251, 99, 95, 253, 164, - 83, 95, 253, 164, 107, 83, 249, 33, 246, 58, 24, 95, 68, 107, 83, 249, - 33, 215, 124, 24, 95, 68, 219, 163, 83, 95, 68, 107, 249, 145, 83, 95, - 68, 223, 143, 67, 95, 68, 233, 65, 67, 95, 68, 252, 100, 221, 13, 67, 95, - 68, 243, 211, 221, 13, 67, 95, 68, 107, 232, 163, 223, 142, 67, 95, 68, - 107, 215, 131, 223, 142, 67, 95, 68, 228, 160, 232, 163, 223, 142, 67, - 95, 68, 249, 40, 232, 177, 228, 160, 215, 131, 223, 142, 67, 95, 68, 36, - 107, 67, 95, 68, 213, 237, 95, 68, 251, 143, 219, 215, 245, 176, 68, 251, - 143, 95, 68, 251, 143, 228, 167, 245, 176, 68, 107, 251, 143, 219, 215, - 245, 176, 68, 107, 251, 143, 95, 68, 107, 251, 143, 228, 167, 245, 176, - 68, 217, 225, 95, 68, 107, 217, 224, 95, 68, 214, 2, 95, 68, 107, 214, 2, - 95, 68, 227, 37, 95, 68, 51, 249, 40, 232, 177, 133, 247, 166, 254, 18, - 67, 216, 184, 249, 126, 3, 67, 216, 183, 226, 47, 227, 40, 219, 8, 227, - 40, 218, 221, 42, 223, 3, 252, 91, 248, 11, 46, 223, 3, 252, 91, 248, 11, - 167, 2, 62, 235, 212, 223, 203, 219, 232, 225, 81, 219, 8, 218, 222, 225, - 81, 219, 231, 71, 252, 60, 2, 199, 90, 184, 247, 120, 91, 232, 199, 254, - 27, 91, 232, 199, 227, 24, 67, 247, 201, 2, 250, 107, 247, 74, 24, 2, - 247, 74, 245, 127, 65, 227, 35, 215, 123, 232, 163, 46, 249, 100, 2, 247, - 74, 215, 131, 42, 249, 100, 2, 247, 74, 42, 226, 252, 235, 69, 46, 226, - 252, 235, 69, 243, 200, 226, 252, 235, 69, 233, 108, 114, 218, 36, 233, - 108, 119, 218, 36, 42, 24, 46, 51, 216, 57, 42, 24, 46, 218, 36, 42, 230, - 157, 184, 46, 218, 36, 184, 42, 218, 36, 114, 218, 37, 2, 249, 229, 49, - 232, 160, 247, 125, 251, 7, 199, 223, 44, 67, 249, 144, 247, 200, 67, - 249, 144, 247, 201, 2, 132, 217, 68, 67, 249, 144, 247, 201, 2, 95, 217, - 68, 67, 41, 2, 132, 217, 68, 67, 41, 2, 95, 217, 68, 14, 42, 67, 41, 125, - 14, 46, 67, 41, 125, 14, 42, 254, 19, 125, 14, 46, 254, 19, 125, 14, 42, - 51, 254, 19, 125, 14, 46, 51, 254, 19, 125, 14, 42, 67, 216, 219, 220, - 233, 125, 14, 46, 67, 216, 219, 220, 233, 125, 14, 42, 244, 32, 226, 131, - 14, 46, 244, 32, 226, 131, 215, 124, 224, 169, 68, 246, 58, 224, 169, 68, - 253, 255, 243, 74, 249, 229, 68, 249, 195, 243, 74, 249, 229, 68, 46, 76, - 2, 36, 225, 156, 184, 132, 68, 184, 95, 68, 184, 42, 46, 68, 184, 132, - 51, 68, 184, 95, 51, 68, 184, 42, 46, 51, 68, 184, 132, 76, 243, 213, - 134, 184, 95, 76, 243, 213, 134, 184, 132, 51, 76, 243, 213, 134, 184, - 95, 51, 76, 243, 213, 134, 184, 95, 219, 162, 68, 44, 45, 251, 138, 44, - 45, 247, 71, 44, 45, 246, 199, 44, 45, 247, 70, 44, 45, 246, 135, 44, 45, - 247, 6, 44, 45, 246, 198, 44, 45, 247, 69, 44, 45, 246, 103, 44, 45, 246, - 230, 44, 45, 246, 166, 44, 45, 247, 37, 44, 45, 246, 134, 44, 45, 247, 5, - 44, 45, 246, 197, 44, 45, 247, 68, 44, 45, 246, 87, 44, 45, 246, 214, 44, - 45, 246, 150, 44, 45, 247, 21, 44, 45, 246, 118, 44, 45, 246, 245, 44, - 45, 246, 181, 44, 45, 247, 52, 44, 45, 246, 102, 44, 45, 246, 229, 44, - 45, 246, 165, 44, 45, 247, 36, 44, 45, 246, 133, 44, 45, 247, 4, 44, 45, - 246, 196, 44, 45, 247, 67, 44, 45, 246, 79, 44, 45, 246, 206, 44, 45, - 246, 142, 44, 45, 247, 13, 44, 45, 246, 110, 44, 45, 246, 237, 44, 45, - 246, 173, 44, 45, 247, 44, 44, 45, 246, 94, 44, 45, 246, 221, 44, 45, - 246, 157, 44, 45, 247, 28, 44, 45, 246, 125, 44, 45, 246, 252, 44, 45, - 246, 188, 44, 45, 247, 59, 44, 45, 246, 86, 44, 45, 246, 213, 44, 45, - 246, 149, 44, 45, 247, 20, 44, 45, 246, 117, 44, 45, 246, 244, 44, 45, - 246, 180, 44, 45, 247, 51, 44, 45, 246, 101, 44, 45, 246, 228, 44, 45, - 246, 164, 44, 45, 247, 35, 44, 45, 246, 132, 44, 45, 247, 3, 44, 45, 246, - 195, 44, 45, 247, 66, 44, 45, 246, 75, 44, 45, 246, 202, 44, 45, 246, - 138, 44, 45, 247, 9, 44, 45, 246, 106, 44, 45, 246, 233, 44, 45, 246, - 169, 44, 45, 247, 40, 44, 45, 246, 90, 44, 45, 246, 217, 44, 45, 246, - 153, 44, 45, 247, 24, 44, 45, 246, 121, 44, 45, 246, 248, 44, 45, 246, - 184, 44, 45, 247, 55, 44, 45, 246, 82, 44, 45, 246, 209, 44, 45, 246, - 145, 44, 45, 247, 16, 44, 45, 246, 113, 44, 45, 246, 240, 44, 45, 246, - 176, 44, 45, 247, 47, 44, 45, 246, 97, 44, 45, 246, 224, 44, 45, 246, - 160, 44, 45, 247, 31, 44, 45, 246, 128, 44, 45, 246, 255, 44, 45, 246, - 191, 44, 45, 247, 62, 44, 45, 246, 78, 44, 45, 246, 205, 44, 45, 246, - 141, 44, 45, 247, 12, 44, 45, 246, 109, 44, 45, 246, 236, 44, 45, 246, - 172, 44, 45, 247, 43, 44, 45, 246, 93, 44, 45, 246, 220, 44, 45, 246, - 156, 44, 45, 247, 27, 44, 45, 246, 124, 44, 45, 246, 251, 44, 45, 246, - 187, 44, 45, 247, 58, 44, 45, 246, 85, 44, 45, 246, 212, 44, 45, 246, - 148, 44, 45, 247, 19, 44, 45, 246, 116, 44, 45, 246, 243, 44, 45, 246, - 179, 44, 45, 247, 50, 44, 45, 246, 100, 44, 45, 246, 227, 44, 45, 246, - 163, 44, 45, 247, 34, 44, 45, 246, 131, 44, 45, 247, 2, 44, 45, 246, 194, - 44, 45, 247, 65, 44, 45, 246, 73, 44, 45, 246, 200, 44, 45, 246, 136, 44, - 45, 247, 7, 44, 45, 246, 104, 44, 45, 246, 231, 44, 45, 246, 167, 44, 45, - 247, 38, 44, 45, 246, 88, 44, 45, 246, 215, 44, 45, 246, 151, 44, 45, - 247, 22, 44, 45, 246, 119, 44, 45, 246, 246, 44, 45, 246, 182, 44, 45, - 247, 53, 44, 45, 246, 80, 44, 45, 246, 207, 44, 45, 246, 143, 44, 45, - 247, 14, 44, 45, 246, 111, 44, 45, 246, 238, 44, 45, 246, 174, 44, 45, - 247, 45, 44, 45, 246, 95, 44, 45, 246, 222, 44, 45, 246, 158, 44, 45, - 247, 29, 44, 45, 246, 126, 44, 45, 246, 253, 44, 45, 246, 189, 44, 45, - 247, 60, 44, 45, 246, 76, 44, 45, 246, 203, 44, 45, 246, 139, 44, 45, - 247, 10, 44, 45, 246, 107, 44, 45, 246, 234, 44, 45, 246, 170, 44, 45, - 247, 41, 44, 45, 246, 91, 44, 45, 246, 218, 44, 45, 246, 154, 44, 45, - 247, 25, 44, 45, 246, 122, 44, 45, 246, 249, 44, 45, 246, 185, 44, 45, - 247, 56, 44, 45, 246, 83, 44, 45, 246, 210, 44, 45, 246, 146, 44, 45, - 247, 17, 44, 45, 246, 114, 44, 45, 246, 241, 44, 45, 246, 177, 44, 45, - 247, 48, 44, 45, 246, 98, 44, 45, 246, 225, 44, 45, 246, 161, 44, 45, - 247, 32, 44, 45, 246, 129, 44, 45, 247, 0, 44, 45, 246, 192, 44, 45, 247, - 63, 44, 45, 246, 74, 44, 45, 246, 201, 44, 45, 246, 137, 44, 45, 247, 8, - 44, 45, 246, 105, 44, 45, 246, 232, 44, 45, 246, 168, 44, 45, 247, 39, - 44, 45, 246, 89, 44, 45, 246, 216, 44, 45, 246, 152, 44, 45, 247, 23, 44, - 45, 246, 120, 44, 45, 246, 247, 44, 45, 246, 183, 44, 45, 247, 54, 44, - 45, 246, 81, 44, 45, 246, 208, 44, 45, 246, 144, 44, 45, 247, 15, 44, 45, - 246, 112, 44, 45, 246, 239, 44, 45, 246, 175, 44, 45, 247, 46, 44, 45, - 246, 96, 44, 45, 246, 223, 44, 45, 246, 159, 44, 45, 247, 30, 44, 45, - 246, 127, 44, 45, 246, 254, 44, 45, 246, 190, 44, 45, 247, 61, 44, 45, - 246, 77, 44, 45, 246, 204, 44, 45, 246, 140, 44, 45, 247, 11, 44, 45, - 246, 108, 44, 45, 246, 235, 44, 45, 246, 171, 44, 45, 247, 42, 44, 45, - 246, 92, 44, 45, 246, 219, 44, 45, 246, 155, 44, 45, 247, 26, 44, 45, - 246, 123, 44, 45, 246, 250, 44, 45, 246, 186, 44, 45, 247, 57, 44, 45, - 246, 84, 44, 45, 246, 211, 44, 45, 246, 147, 44, 45, 247, 18, 44, 45, - 246, 115, 44, 45, 246, 242, 44, 45, 246, 178, 44, 45, 247, 49, 44, 45, - 246, 99, 44, 45, 246, 226, 44, 45, 246, 162, 44, 45, 247, 33, 44, 45, - 246, 130, 44, 45, 247, 1, 44, 45, 246, 193, 44, 45, 247, 64, 95, 216, 24, - 76, 2, 71, 90, 95, 216, 24, 76, 2, 51, 71, 90, 132, 51, 76, 2, 71, 90, - 95, 51, 76, 2, 71, 90, 42, 46, 51, 76, 2, 71, 90, 95, 216, 24, 76, 243, - 213, 134, 132, 51, 76, 243, 213, 134, 95, 51, 76, 243, 213, 134, 246, 58, - 76, 2, 199, 90, 215, 124, 76, 2, 199, 90, 215, 124, 216, 169, 68, 246, - 58, 216, 169, 68, 132, 51, 248, 102, 68, 95, 51, 248, 102, 68, 132, 216, - 169, 248, 102, 68, 95, 216, 169, 248, 102, 68, 95, 216, 24, 216, 169, - 248, 102, 68, 95, 76, 2, 246, 72, 219, 79, 215, 124, 76, 211, 211, 134, - 246, 58, 76, 211, 211, 134, 95, 76, 2, 218, 28, 2, 71, 90, 95, 76, 2, - 218, 28, 2, 51, 71, 90, 95, 216, 24, 76, 2, 218, 27, 95, 216, 24, 76, 2, - 218, 28, 2, 71, 90, 95, 216, 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 253, - 166, 95, 253, 166, 132, 51, 253, 166, 95, 51, 253, 166, 132, 76, 211, - 211, 83, 247, 200, 95, 76, 211, 211, 83, 247, 200, 132, 76, 243, 213, - 252, 60, 211, 211, 83, 247, 200, 95, 76, 243, 213, 252, 60, 211, 211, 83, - 247, 200, 228, 167, 213, 250, 24, 219, 215, 245, 176, 68, 228, 167, 245, - 176, 24, 219, 215, 213, 250, 68, 228, 167, 213, 250, 76, 2, 101, 228, - 167, 245, 176, 76, 2, 101, 219, 215, 245, 176, 76, 2, 101, 219, 215, 213, - 250, 76, 2, 101, 228, 167, 213, 250, 76, 24, 228, 167, 245, 176, 68, 228, - 167, 245, 176, 76, 24, 219, 215, 245, 176, 68, 219, 215, 245, 176, 76, - 24, 219, 215, 213, 250, 68, 219, 215, 213, 250, 76, 24, 228, 167, 213, - 250, 68, 223, 125, 247, 207, 249, 65, 244, 143, 247, 206, 244, 143, 247, - 207, 249, 65, 223, 125, 247, 206, 219, 215, 245, 176, 76, 249, 65, 228, - 167, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65, 219, 215, 245, 176, - 68, 244, 143, 247, 207, 249, 65, 228, 167, 245, 176, 68, 223, 125, 247, - 207, 249, 65, 219, 215, 245, 176, 68, 228, 167, 245, 176, 76, 249, 65, - 228, 167, 213, 250, 68, 228, 167, 213, 250, 76, 249, 65, 228, 167, 245, - 176, 68, 214, 20, 76, 225, 141, 247, 147, 223, 148, 76, 225, 141, 95, - 217, 141, 249, 32, 215, 123, 76, 225, 141, 95, 217, 141, 249, 32, 246, - 57, 76, 225, 141, 246, 58, 217, 141, 249, 32, 233, 61, 76, 225, 141, 246, - 58, 217, 141, 249, 32, 223, 138, 223, 141, 253, 196, 249, 195, 68, 233, - 64, 253, 196, 253, 255, 68, 216, 227, 253, 196, 253, 255, 68, 251, 101, - 253, 196, 253, 255, 68, 216, 227, 253, 196, 249, 195, 76, 2, 230, 250, - 216, 227, 253, 196, 253, 255, 76, 2, 225, 156, 232, 163, 46, 221, 72, - 249, 195, 68, 232, 163, 42, 221, 72, 253, 255, 68, 253, 255, 249, 193, - 249, 229, 68, 249, 195, 249, 193, 249, 229, 68, 95, 76, 78, 220, 175, - 132, 68, 132, 76, 78, 220, 175, 95, 68, 220, 175, 95, 76, 78, 132, 68, - 95, 76, 2, 94, 55, 132, 76, 2, 94, 55, 95, 76, 217, 93, 213, 166, 42, 46, - 76, 217, 93, 3, 249, 228, 215, 124, 216, 24, 76, 243, 213, 3, 249, 228, - 42, 206, 114, 46, 206, 119, 241, 237, 42, 206, 119, 46, 206, 114, 241, - 237, 114, 206, 46, 119, 206, 42, 241, 237, 114, 206, 42, 119, 206, 46, - 241, 237, 42, 206, 114, 46, 206, 114, 241, 237, 114, 206, 46, 119, 206, - 46, 241, 237, 42, 206, 119, 46, 206, 119, 241, 237, 114, 206, 42, 119, - 206, 42, 241, 237, 132, 241, 238, 2, 206, 114, 211, 211, 134, 95, 241, - 238, 2, 206, 114, 211, 211, 134, 215, 124, 241, 238, 2, 206, 46, 211, - 211, 134, 246, 58, 241, 238, 2, 206, 46, 211, 211, 134, 132, 241, 238, 2, - 206, 119, 211, 211, 134, 95, 241, 238, 2, 206, 119, 211, 211, 134, 215, - 124, 241, 238, 2, 206, 42, 211, 211, 134, 246, 58, 241, 238, 2, 206, 42, - 211, 211, 134, 132, 241, 238, 2, 206, 114, 243, 213, 134, 95, 241, 238, - 2, 206, 114, 243, 213, 134, 215, 124, 241, 238, 2, 206, 46, 243, 213, - 134, 246, 58, 241, 238, 2, 206, 46, 243, 213, 134, 132, 241, 238, 2, 206, - 119, 243, 213, 134, 95, 241, 238, 2, 206, 119, 243, 213, 134, 215, 124, - 241, 238, 2, 206, 42, 243, 213, 134, 246, 58, 241, 238, 2, 206, 42, 243, - 213, 134, 132, 241, 238, 2, 206, 114, 78, 132, 241, 238, 2, 206, 246, 60, - 215, 124, 241, 238, 2, 206, 42, 251, 207, 215, 124, 241, 238, 2, 206, - 223, 148, 95, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 246, 60, - 246, 58, 241, 238, 2, 206, 42, 251, 207, 246, 58, 241, 238, 2, 206, 223, - 148, 132, 241, 238, 2, 206, 114, 78, 95, 241, 238, 2, 206, 215, 134, 132, - 241, 238, 2, 206, 119, 78, 95, 241, 238, 2, 206, 246, 60, 95, 241, 238, - 2, 206, 114, 78, 132, 241, 238, 2, 206, 215, 134, 95, 241, 238, 2, 206, - 119, 78, 132, 241, 238, 2, 206, 246, 60, 132, 241, 238, 2, 206, 114, 78, - 184, 248, 101, 132, 241, 238, 2, 206, 119, 251, 220, 184, 248, 101, 95, - 241, 238, 2, 206, 114, 78, 184, 248, 101, 95, 241, 238, 2, 206, 119, 251, - 220, 184, 248, 101, 215, 124, 241, 238, 2, 206, 42, 251, 207, 246, 58, - 241, 238, 2, 206, 223, 148, 246, 58, 241, 238, 2, 206, 42, 251, 207, 215, - 124, 241, 238, 2, 206, 223, 148, 46, 51, 76, 2, 223, 85, 241, 219, 245, - 61, 5, 78, 95, 68, 217, 43, 227, 34, 78, 95, 68, 132, 76, 78, 217, 43, - 227, 33, 95, 76, 78, 217, 43, 227, 33, 95, 76, 78, 254, 57, 123, 108, - 233, 39, 78, 132, 68, 132, 76, 217, 93, 233, 38, 242, 107, 78, 95, 68, - 219, 9, 78, 95, 68, 132, 76, 217, 93, 219, 8, 218, 222, 78, 132, 68, 42, - 244, 60, 218, 27, 46, 244, 60, 218, 27, 114, 244, 60, 218, 27, 119, 244, - 60, 218, 27, 216, 169, 71, 252, 60, 248, 11, 212, 153, 174, 219, 174, - 212, 153, 174, 216, 15, 249, 164, 42, 67, 249, 40, 125, 46, 67, 249, 40, - 125, 42, 67, 226, 131, 46, 67, 226, 131, 212, 153, 174, 42, 236, 10, 125, - 212, 153, 174, 46, 236, 10, 125, 212, 153, 174, 42, 251, 165, 125, 212, - 153, 174, 46, 251, 165, 125, 42, 41, 251, 85, 2, 215, 153, 46, 41, 251, - 85, 2, 215, 153, 42, 41, 251, 85, 2, 217, 69, 235, 252, 216, 227, 249, - 99, 46, 41, 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 42, 41, - 251, 85, 2, 217, 69, 235, 252, 251, 101, 249, 99, 46, 41, 251, 85, 2, - 217, 69, 235, 252, 216, 227, 249, 99, 42, 254, 19, 251, 85, 2, 247, 74, - 46, 254, 19, 251, 85, 2, 247, 74, 42, 253, 196, 233, 39, 125, 46, 253, - 196, 242, 107, 125, 51, 42, 253, 196, 242, 107, 125, 51, 46, 253, 196, - 233, 39, 125, 42, 83, 216, 219, 220, 233, 125, 46, 83, 216, 219, 220, - 233, 125, 246, 72, 244, 104, 71, 212, 28, 232, 242, 231, 153, 254, 19, - 227, 35, 233, 70, 46, 254, 19, 214, 244, 2, 219, 166, 231, 153, 46, 254, - 19, 2, 247, 74, 254, 19, 2, 223, 4, 235, 212, 254, 164, 254, 18, 219, - 187, 254, 19, 227, 35, 233, 70, 219, 187, 254, 19, 227, 35, 215, 134, - 216, 58, 254, 18, 223, 202, 254, 18, 254, 19, 2, 215, 153, 223, 202, 254, - 19, 2, 215, 153, 227, 112, 254, 19, 227, 35, 215, 134, 227, 112, 254, 19, - 227, 35, 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, - 252, 76, 225, 141, 114, 24, 223, 148, 231, 153, 254, 19, 2, 227, 40, 253, - 176, 245, 98, 235, 252, 76, 225, 141, 114, 24, 233, 70, 231, 153, 254, - 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 119, 24, 223, - 148, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, - 141, 119, 24, 233, 70, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, - 235, 252, 76, 225, 141, 46, 24, 215, 134, 231, 153, 254, 19, 2, 227, 40, - 253, 176, 245, 98, 235, 252, 76, 225, 141, 42, 24, 215, 134, 231, 153, - 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, 225, 141, 46, 24, - 246, 60, 231, 153, 254, 19, 2, 227, 40, 253, 176, 245, 98, 235, 252, 76, - 225, 141, 42, 24, 246, 60, 223, 202, 245, 110, 221, 48, 245, 110, 221, - 49, 2, 226, 247, 245, 110, 221, 49, 2, 3, 249, 229, 49, 245, 110, 221, - 49, 2, 46, 76, 49, 245, 110, 221, 49, 2, 42, 76, 49, 249, 229, 2, 199, - 134, 36, 71, 134, 36, 226, 135, 36, 223, 203, 219, 231, 36, 226, 47, 249, - 229, 247, 125, 251, 7, 199, 252, 60, 24, 216, 227, 151, 247, 125, 251, 7, - 71, 134, 249, 229, 2, 218, 224, 213, 166, 36, 253, 254, 247, 121, 52, - 114, 76, 217, 93, 249, 228, 36, 67, 251, 42, 36, 251, 42, 36, 233, 38, - 36, 242, 106, 249, 229, 2, 3, 249, 229, 211, 211, 217, 149, 223, 148, - 249, 229, 2, 117, 199, 219, 33, 211, 211, 217, 149, 223, 148, 91, 223, - 125, 247, 207, 220, 23, 91, 244, 143, 247, 207, 220, 23, 91, 253, 132, - 91, 3, 249, 228, 91, 219, 166, 117, 235, 68, 219, 164, 216, 184, 2, 62, - 49, 216, 184, 2, 215, 153, 223, 4, 235, 252, 216, 183, 216, 184, 2, 221, - 55, 253, 123, 251, 100, 46, 216, 184, 78, 42, 216, 183, 42, 216, 184, - 251, 207, 71, 134, 71, 252, 60, 251, 207, 46, 216, 183, 251, 91, 2, 42, - 151, 251, 144, 251, 91, 2, 46, 151, 251, 144, 83, 251, 90, 29, 2, 42, - 151, 251, 144, 29, 2, 46, 151, 251, 144, 67, 240, 223, 83, 240, 223, 42, - 213, 229, 244, 104, 46, 213, 229, 244, 104, 42, 51, 213, 229, 244, 104, - 46, 51, 213, 229, 244, 104, 235, 244, 235, 231, 217, 66, 110, 235, 231, - 235, 232, 229, 183, 2, 71, 134, 246, 66, 230, 157, 41, 2, 249, 120, 226, - 251, 235, 242, 253, 152, 220, 144, 225, 63, 245, 61, 5, 24, 220, 25, 226, - 135, 245, 61, 5, 24, 220, 25, 226, 136, 2, 217, 43, 49, 240, 97, 211, - 211, 24, 220, 25, 226, 135, 242, 159, 219, 94, 217, 138, 246, 59, 216, - 184, 2, 42, 151, 251, 144, 246, 59, 216, 184, 2, 46, 151, 251, 144, 83, - 247, 201, 2, 119, 68, 83, 232, 159, 67, 249, 229, 2, 119, 68, 83, 249, - 229, 2, 119, 68, 245, 48, 67, 219, 166, 245, 48, 83, 219, 166, 245, 48, - 67, 247, 200, 245, 48, 83, 247, 200, 245, 48, 67, 249, 228, 245, 48, 83, - 249, 228, 223, 43, 223, 203, 219, 232, 227, 33, 219, 232, 2, 226, 247, - 223, 203, 219, 232, 2, 199, 90, 251, 172, 219, 231, 251, 172, 223, 203, - 219, 231, 51, 225, 156, 216, 169, 225, 156, 233, 66, 249, 33, 254, 19, - 125, 223, 144, 249, 33, 254, 19, 125, 217, 31, 230, 248, 230, 97, 36, 62, - 227, 33, 230, 97, 36, 94, 227, 33, 230, 97, 36, 29, 227, 33, 230, 97, - 215, 147, 227, 34, 2, 247, 74, 230, 97, 215, 147, 227, 34, 2, 225, 156, - 230, 97, 41, 235, 196, 227, 33, 230, 97, 41, 215, 147, 227, 33, 117, 232, - 199, 24, 227, 33, 117, 232, 199, 167, 227, 33, 230, 97, 29, 227, 33, 230, - 224, 117, 218, 244, 218, 242, 2, 235, 208, 224, 169, 235, 209, 227, 33, - 244, 68, 226, 127, 235, 208, 235, 209, 2, 51, 90, 235, 209, 253, 89, 2, - 220, 23, 249, 225, 243, 197, 253, 255, 235, 206, 232, 243, 235, 207, 2, - 224, 8, 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 2, 221, 72, - 226, 110, 253, 173, 225, 135, 232, 243, 235, 207, 228, 163, 235, 246, - 217, 149, 225, 135, 235, 209, 253, 173, 118, 225, 145, 227, 33, 224, 163, - 235, 209, 227, 33, 235, 209, 2, 132, 76, 2, 101, 235, 209, 2, 29, 52, - 235, 209, 2, 235, 195, 235, 209, 2, 215, 146, 235, 209, 2, 226, 247, 235, - 209, 2, 215, 153, 235, 69, 233, 108, 42, 216, 184, 227, 33, 212, 153, - 174, 222, 119, 249, 148, 212, 153, 174, 222, 119, 225, 188, 212, 153, - 174, 222, 119, 225, 60, 94, 5, 2, 3, 249, 229, 49, 94, 5, 2, 249, 224, - 254, 175, 49, 94, 5, 2, 217, 43, 49, 94, 5, 2, 62, 55, 94, 5, 2, 217, 43, - 55, 94, 5, 2, 219, 10, 109, 94, 5, 2, 83, 216, 183, 230, 251, 5, 2, 249, - 158, 49, 230, 251, 5, 2, 62, 55, 230, 251, 5, 2, 244, 143, 247, 72, 230, - 251, 5, 2, 223, 125, 247, 72, 94, 5, 235, 252, 42, 151, 249, 228, 94, 5, - 235, 252, 46, 151, 249, 228, 214, 231, 167, 249, 71, 225, 63, 230, 154, - 5, 2, 62, 49, 230, 154, 5, 2, 215, 153, 221, 69, 225, 64, 2, 251, 101, - 249, 192, 220, 5, 225, 63, 230, 154, 5, 235, 252, 42, 151, 249, 228, 230, - 154, 5, 235, 252, 46, 151, 249, 228, 36, 230, 154, 5, 2, 249, 224, 254, - 174, 230, 154, 5, 235, 252, 51, 249, 228, 36, 247, 121, 52, 94, 5, 235, - 252, 216, 183, 230, 251, 5, 235, 252, 216, 183, 230, 154, 5, 235, 252, - 216, 183, 235, 203, 225, 63, 223, 139, 235, 203, 225, 63, 212, 153, 174, - 223, 240, 249, 148, 254, 43, 167, 249, 104, 235, 196, 2, 247, 74, 215, - 147, 2, 230, 251, 52, 215, 147, 2, 226, 247, 235, 196, 2, 226, 247, 235, - 196, 2, 232, 199, 254, 27, 215, 147, 2, 232, 199, 227, 24, 215, 147, 78, - 235, 195, 235, 196, 78, 215, 146, 215, 147, 78, 252, 60, 78, 235, 195, - 235, 196, 78, 252, 60, 78, 215, 146, 215, 147, 251, 207, 24, 235, 68, 2, - 215, 146, 235, 196, 251, 207, 24, 235, 68, 2, 235, 195, 249, 193, 215, - 147, 2, 221, 54, 249, 193, 235, 196, 2, 221, 54, 51, 41, 235, 195, 51, - 41, 215, 146, 249, 193, 215, 147, 2, 221, 55, 24, 220, 5, 225, 63, 232, - 199, 24, 2, 62, 49, 232, 199, 167, 2, 62, 49, 51, 232, 199, 254, 27, 51, - 232, 199, 227, 24, 117, 235, 197, 232, 199, 254, 27, 117, 235, 197, 232, - 199, 227, 24, 220, 13, 233, 108, 227, 24, 220, 13, 233, 108, 254, 27, - 232, 199, 167, 226, 245, 232, 199, 254, 27, 232, 199, 24, 2, 231, 37, - 219, 79, 232, 199, 167, 2, 231, 37, 219, 79, 232, 199, 24, 2, 199, 248, - 101, 232, 199, 167, 2, 199, 248, 101, 232, 199, 24, 2, 51, 226, 247, 232, - 199, 24, 2, 215, 153, 232, 199, 24, 2, 51, 215, 153, 3, 214, 228, 2, 215, - 153, 232, 199, 167, 2, 51, 226, 247, 232, 199, 167, 2, 51, 215, 153, 212, - 153, 174, 247, 83, 253, 246, 212, 153, 174, 224, 40, 253, 246, 245, 61, - 5, 2, 62, 55, 240, 97, 2, 62, 49, 216, 169, 199, 252, 60, 2, 51, 71, 90, - 216, 169, 199, 252, 60, 2, 216, 169, 71, 90, 217, 43, 227, 34, 2, 62, 49, - 217, 43, 227, 34, 2, 223, 125, 247, 72, 220, 88, 230, 251, 220, 87, 249, - 139, 2, 62, 49, 245, 61, 2, 253, 132, 254, 57, 123, 211, 211, 2, 249, - 224, 254, 174, 253, 218, 123, 167, 123, 108, 245, 61, 5, 78, 94, 52, 94, - 5, 78, 245, 61, 52, 245, 61, 5, 78, 217, 43, 227, 33, 51, 249, 165, 245, - 62, 117, 249, 134, 245, 61, 220, 102, 133, 249, 134, 245, 61, 220, 102, - 245, 61, 5, 2, 117, 176, 78, 24, 117, 176, 55, 245, 57, 2, 243, 237, 176, - 49, 233, 39, 2, 249, 229, 235, 212, 242, 107, 2, 249, 229, 235, 212, 233, - 39, 2, 224, 158, 152, 49, 242, 107, 2, 224, 158, 152, 49, 233, 39, 167, - 220, 25, 123, 108, 242, 107, 167, 220, 25, 123, 108, 233, 39, 167, 220, - 25, 123, 211, 211, 2, 62, 235, 212, 242, 107, 167, 220, 25, 123, 211, - 211, 2, 62, 235, 212, 233, 39, 167, 220, 25, 123, 211, 211, 2, 62, 49, - 242, 107, 167, 220, 25, 123, 211, 211, 2, 62, 49, 233, 39, 167, 220, 25, - 123, 211, 211, 2, 62, 78, 223, 148, 242, 107, 167, 220, 25, 123, 211, - 211, 2, 62, 78, 233, 70, 233, 39, 167, 253, 219, 242, 107, 167, 253, 219, - 233, 39, 24, 220, 79, 228, 163, 123, 108, 242, 107, 24, 220, 79, 228, - 163, 123, 108, 233, 39, 24, 228, 163, 253, 219, 242, 107, 24, 228, 163, - 253, 219, 233, 39, 78, 246, 65, 123, 78, 242, 106, 242, 107, 78, 246, 65, - 123, 78, 233, 38, 233, 39, 78, 220, 88, 167, 245, 62, 242, 107, 78, 220, - 88, 167, 245, 62, 233, 39, 78, 220, 88, 78, 242, 106, 242, 107, 78, 220, - 88, 78, 233, 38, 233, 39, 78, 242, 107, 78, 246, 65, 245, 62, 242, 107, - 78, 233, 39, 78, 246, 65, 245, 62, 233, 39, 78, 220, 25, 123, 78, 242, - 107, 78, 220, 25, 245, 62, 242, 107, 78, 220, 25, 123, 78, 233, 39, 78, - 220, 25, 245, 62, 220, 25, 123, 211, 211, 167, 233, 38, 220, 25, 123, - 211, 211, 167, 242, 106, 220, 25, 123, 211, 211, 167, 233, 39, 2, 62, - 235, 212, 220, 25, 123, 211, 211, 167, 242, 107, 2, 62, 235, 212, 246, - 65, 123, 211, 211, 167, 233, 38, 246, 65, 123, 211, 211, 167, 242, 106, - 246, 65, 220, 25, 123, 211, 211, 167, 233, 38, 246, 65, 220, 25, 123, - 211, 211, 167, 242, 106, 220, 88, 167, 233, 38, 220, 88, 167, 242, 106, - 220, 88, 78, 233, 39, 78, 245, 61, 52, 220, 88, 78, 242, 107, 78, 245, - 61, 52, 51, 229, 173, 233, 38, 51, 229, 173, 242, 106, 51, 229, 173, 233, - 39, 2, 215, 153, 242, 107, 226, 245, 233, 38, 242, 107, 251, 207, 233, - 38, 233, 39, 249, 193, 251, 7, 249, 34, 242, 107, 249, 193, 251, 7, 249, - 34, 233, 39, 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 242, 107, - 249, 193, 251, 7, 249, 35, 78, 220, 25, 245, 62, 220, 6, 217, 153, 233, - 106, 217, 153, 220, 6, 217, 154, 167, 123, 108, 233, 106, 217, 154, 167, - 123, 108, 245, 61, 5, 2, 251, 37, 49, 225, 83, 78, 220, 79, 245, 61, 52, - 219, 1, 78, 220, 79, 245, 61, 52, 225, 83, 78, 220, 79, 228, 163, 123, - 108, 219, 1, 78, 220, 79, 228, 163, 123, 108, 225, 83, 78, 245, 61, 52, - 219, 1, 78, 245, 61, 52, 225, 83, 78, 228, 163, 123, 108, 219, 1, 78, - 228, 163, 123, 108, 225, 83, 78, 254, 57, 123, 108, 219, 1, 78, 254, 57, - 123, 108, 225, 83, 78, 228, 163, 254, 57, 123, 108, 219, 1, 78, 228, 163, - 254, 57, 123, 108, 51, 225, 82, 51, 219, 0, 219, 9, 2, 247, 74, 218, 222, - 2, 247, 74, 219, 9, 2, 94, 5, 55, 218, 222, 2, 94, 5, 55, 219, 9, 2, 230, - 154, 5, 55, 218, 222, 2, 230, 154, 5, 55, 219, 9, 65, 167, 123, 211, 211, - 2, 62, 49, 218, 222, 65, 167, 123, 211, 211, 2, 62, 49, 219, 9, 65, 78, - 245, 61, 52, 218, 222, 65, 78, 245, 61, 52, 219, 9, 65, 78, 217, 43, 227, - 33, 218, 222, 65, 78, 217, 43, 227, 33, 219, 9, 65, 78, 254, 57, 123, - 108, 218, 222, 65, 78, 254, 57, 123, 108, 219, 9, 65, 78, 228, 163, 123, - 108, 218, 222, 65, 78, 228, 163, 123, 108, 41, 42, 227, 40, 92, 227, 33, - 41, 46, 227, 40, 92, 227, 33, 249, 193, 219, 8, 249, 193, 218, 221, 249, - 193, 219, 9, 167, 123, 108, 249, 193, 218, 222, 167, 123, 108, 219, 9, - 78, 218, 221, 218, 222, 78, 219, 8, 219, 9, 78, 219, 8, 218, 222, 78, - 218, 221, 218, 222, 251, 207, 219, 8, 218, 222, 251, 207, 24, 235, 68, - 251, 7, 248, 102, 2, 219, 8, 245, 127, 65, 227, 35, 246, 57, 225, 180, 2, - 217, 220, 216, 226, 216, 198, 235, 195, 243, 246, 228, 176, 220, 175, 42, - 218, 36, 220, 175, 119, 218, 36, 220, 175, 114, 218, 36, 226, 48, 2, 197, - 71, 252, 60, 216, 169, 46, 216, 57, 51, 71, 252, 60, 42, 216, 57, 71, - 252, 60, 51, 42, 216, 57, 51, 71, 252, 60, 51, 42, 216, 57, 184, 248, - 102, 243, 213, 42, 231, 127, 65, 51, 214, 216, 220, 175, 119, 218, 37, 2, - 226, 247, 220, 175, 114, 218, 37, 2, 215, 153, 220, 175, 114, 218, 37, - 78, 220, 175, 119, 218, 36, 51, 119, 218, 36, 51, 114, 218, 36, 51, 219, - 45, 228, 163, 52, 223, 202, 51, 219, 45, 228, 163, 52, 247, 92, 228, 163, - 247, 127, 2, 223, 202, 229, 182, 220, 23, 71, 232, 243, 2, 249, 229, 49, - 71, 232, 243, 2, 249, 229, 55, 119, 218, 37, 2, 249, 229, 55, 226, 136, - 2, 199, 90, 226, 136, 2, 217, 43, 227, 33, 216, 169, 71, 252, 60, 251, - 167, 223, 241, 216, 169, 71, 252, 60, 2, 199, 90, 216, 169, 249, 165, - 227, 33, 216, 169, 229, 173, 233, 38, 216, 169, 229, 173, 242, 106, 246, - 65, 220, 25, 233, 39, 167, 123, 108, 246, 65, 220, 25, 242, 107, 167, - 123, 108, 216, 169, 219, 232, 251, 167, 223, 241, 233, 108, 216, 169, 71, - 252, 60, 227, 33, 51, 219, 232, 227, 33, 67, 71, 134, 230, 97, 67, 71, - 134, 228, 167, 245, 176, 67, 68, 228, 167, 213, 250, 67, 68, 219, 215, - 245, 176, 67, 68, 219, 215, 213, 250, 67, 68, 42, 46, 67, 68, 132, 83, - 68, 215, 124, 83, 68, 246, 58, 83, 68, 228, 167, 245, 176, 83, 68, 228, - 167, 213, 250, 83, 68, 219, 215, 245, 176, 83, 68, 219, 215, 213, 250, - 83, 68, 42, 46, 83, 68, 114, 119, 83, 68, 95, 76, 2, 217, 30, 246, 57, - 95, 76, 2, 217, 30, 215, 123, 132, 76, 2, 217, 30, 246, 57, 132, 76, 2, - 217, 30, 215, 123, 41, 2, 216, 227, 151, 251, 144, 41, 2, 251, 101, 151, - 251, 144, 41, 2, 215, 131, 46, 247, 207, 151, 251, 144, 41, 2, 232, 163, - 42, 247, 207, 151, 251, 144, 247, 201, 2, 42, 151, 251, 144, 247, 201, 2, - 46, 151, 251, 144, 247, 201, 2, 216, 227, 151, 251, 144, 247, 201, 2, - 251, 101, 151, 251, 144, 246, 72, 219, 166, 83, 233, 108, 219, 166, 67, - 233, 108, 219, 166, 83, 214, 164, 3, 219, 166, 67, 214, 164, 3, 219, 166, - 83, 226, 65, 67, 226, 65, 67, 241, 178, 83, 241, 178, 199, 83, 241, 178, - 83, 233, 108, 249, 228, 83, 231, 147, 247, 200, 67, 231, 147, 247, 200, - 83, 231, 147, 232, 159, 67, 231, 147, 232, 159, 83, 3, 247, 200, 83, 3, - 232, 159, 67, 3, 232, 159, 83, 199, 245, 121, 67, 199, 245, 121, 83, 71, - 245, 121, 67, 71, 245, 121, 42, 76, 2, 3, 249, 228, 133, 132, 253, 162, - 42, 76, 2, 36, 225, 156, 184, 132, 219, 162, 68, 132, 216, 24, 76, 2, 71, - 90, 132, 216, 24, 76, 2, 51, 71, 90, 132, 216, 24, 76, 243, 213, 134, - 132, 216, 24, 216, 169, 248, 102, 68, 132, 76, 2, 246, 72, 219, 79, 132, - 76, 2, 218, 28, 2, 71, 90, 132, 76, 2, 218, 28, 2, 51, 71, 90, 132, 216, - 24, 76, 2, 218, 27, 132, 216, 24, 76, 2, 218, 28, 2, 71, 90, 132, 216, - 24, 76, 2, 218, 28, 2, 51, 71, 90, 132, 76, 217, 93, 213, 166, 214, 20, - 76, 225, 141, 247, 147, 233, 70, 245, 61, 5, 78, 132, 68, 223, 203, 217, - 43, 227, 34, 78, 132, 68, 132, 76, 78, 223, 203, 254, 57, 123, 108, 95, - 76, 217, 93, 242, 106, 95, 76, 217, 93, 218, 221, 132, 224, 169, 68, 95, - 224, 169, 68, 223, 203, 217, 43, 227, 34, 78, 95, 68, 95, 76, 78, 223, - 203, 254, 57, 123, 108, 217, 43, 227, 34, 78, 132, 68, 132, 76, 78, 254, - 57, 123, 108, 132, 76, 78, 223, 203, 217, 43, 227, 33, 95, 76, 78, 223, - 203, 217, 43, 227, 33, 67, 231, 147, 219, 95, 83, 3, 219, 95, 67, 3, 219, - 95, 83, 223, 144, 226, 65, 67, 223, 144, 226, 65, 107, 233, 108, 249, - 228, 107, 226, 248, 2, 226, 248, 235, 212, 107, 249, 229, 2, 249, 229, - 235, 212, 107, 249, 228, 107, 36, 222, 169, 136, 6, 1, 253, 75, 136, 6, - 1, 251, 46, 136, 6, 1, 214, 230, 136, 6, 1, 242, 161, 136, 6, 1, 247, 94, - 136, 6, 1, 213, 12, 136, 6, 1, 212, 61, 136, 6, 1, 245, 245, 136, 6, 1, - 212, 84, 136, 6, 1, 235, 146, 136, 6, 1, 70, 235, 146, 136, 6, 1, 72, - 136, 6, 1, 247, 112, 136, 6, 1, 234, 245, 136, 6, 1, 232, 215, 136, 6, 1, - 230, 101, 136, 6, 1, 230, 12, 136, 6, 1, 227, 51, 136, 6, 1, 225, 138, - 136, 6, 1, 223, 124, 136, 6, 1, 220, 11, 136, 6, 1, 216, 46, 136, 6, 1, - 215, 171, 136, 6, 1, 243, 216, 136, 6, 1, 241, 184, 136, 6, 1, 227, 3, - 136, 6, 1, 226, 96, 136, 6, 1, 220, 153, 136, 6, 1, 216, 125, 136, 6, 1, - 250, 12, 136, 6, 1, 221, 24, 136, 6, 1, 213, 18, 136, 6, 1, 213, 20, 136, - 6, 1, 213, 47, 136, 6, 1, 219, 185, 159, 136, 6, 1, 212, 203, 136, 6, 1, - 3, 212, 174, 136, 6, 1, 3, 212, 175, 2, 218, 27, 136, 6, 1, 212, 235, - 136, 6, 1, 235, 182, 3, 212, 174, 136, 6, 1, 251, 172, 212, 174, 136, 6, - 1, 235, 182, 251, 172, 212, 174, 136, 6, 1, 244, 51, 136, 6, 1, 235, 144, - 136, 6, 1, 220, 152, 136, 6, 1, 216, 160, 61, 136, 6, 1, 233, 98, 230, - 101, 136, 3, 1, 253, 75, 136, 3, 1, 251, 46, 136, 3, 1, 214, 230, 136, 3, - 1, 242, 161, 136, 3, 1, 247, 94, 136, 3, 1, 213, 12, 136, 3, 1, 212, 61, - 136, 3, 1, 245, 245, 136, 3, 1, 212, 84, 136, 3, 1, 235, 146, 136, 3, 1, - 70, 235, 146, 136, 3, 1, 72, 136, 3, 1, 247, 112, 136, 3, 1, 234, 245, - 136, 3, 1, 232, 215, 136, 3, 1, 230, 101, 136, 3, 1, 230, 12, 136, 3, 1, - 227, 51, 136, 3, 1, 225, 138, 136, 3, 1, 223, 124, 136, 3, 1, 220, 11, - 136, 3, 1, 216, 46, 136, 3, 1, 215, 171, 136, 3, 1, 243, 216, 136, 3, 1, - 241, 184, 136, 3, 1, 227, 3, 136, 3, 1, 226, 96, 136, 3, 1, 220, 153, - 136, 3, 1, 216, 125, 136, 3, 1, 250, 12, 136, 3, 1, 221, 24, 136, 3, 1, - 213, 18, 136, 3, 1, 213, 20, 136, 3, 1, 213, 47, 136, 3, 1, 219, 185, - 159, 136, 3, 1, 212, 203, 136, 3, 1, 3, 212, 174, 136, 3, 1, 3, 212, 175, - 2, 218, 27, 136, 3, 1, 212, 235, 136, 3, 1, 235, 182, 3, 212, 174, 136, - 3, 1, 251, 172, 212, 174, 136, 3, 1, 235, 182, 251, 172, 212, 174, 136, - 3, 1, 244, 51, 136, 3, 1, 235, 144, 136, 3, 1, 220, 152, 136, 3, 1, 216, - 160, 61, 136, 3, 1, 233, 98, 230, 101, 7, 6, 1, 233, 171, 2, 51, 134, 7, - 3, 1, 233, 171, 2, 51, 134, 7, 6, 1, 233, 171, 2, 231, 37, 217, 42, 7, 6, - 1, 226, 230, 2, 90, 7, 6, 1, 224, 113, 2, 218, 27, 7, 3, 1, 118, 2, 90, - 7, 3, 1, 218, 100, 2, 247, 207, 90, 7, 6, 1, 242, 42, 2, 247, 246, 7, 3, - 1, 242, 42, 2, 247, 246, 7, 6, 1, 235, 28, 2, 247, 246, 7, 3, 1, 235, 28, - 2, 247, 246, 7, 6, 1, 212, 153, 2, 247, 246, 7, 3, 1, 212, 153, 2, 247, - 246, 7, 6, 1, 254, 52, 7, 6, 1, 232, 110, 2, 101, 7, 6, 1, 216, 58, 61, - 7, 6, 1, 216, 58, 254, 52, 7, 3, 1, 215, 80, 2, 46, 101, 7, 6, 1, 214, - 83, 2, 101, 7, 3, 1, 214, 83, 2, 101, 7, 3, 1, 215, 80, 2, 249, 41, 7, 6, - 1, 151, 242, 41, 7, 3, 1, 151, 242, 41, 7, 3, 1, 218, 25, 226, 9, 7, 3, - 1, 191, 2, 228, 161, 7, 3, 1, 216, 58, 224, 113, 2, 218, 27, 7, 3, 1, - 157, 2, 115, 223, 131, 235, 212, 7, 1, 3, 6, 216, 58, 74, 7, 219, 10, 3, - 1, 235, 142, 59, 1, 6, 215, 79, 7, 6, 1, 223, 4, 2, 218, 195, 218, 27, 7, - 6, 1, 212, 153, 2, 218, 195, 218, 27, 79, 6, 1, 254, 73, 79, 3, 1, 254, - 73, 79, 6, 1, 214, 151, 79, 3, 1, 214, 151, 79, 6, 1, 243, 83, 79, 3, 1, - 243, 83, 79, 6, 1, 248, 136, 79, 3, 1, 248, 136, 79, 6, 1, 245, 151, 79, - 3, 1, 245, 151, 79, 6, 1, 219, 220, 79, 3, 1, 219, 220, 79, 6, 1, 212, - 94, 79, 3, 1, 212, 94, 79, 6, 1, 241, 231, 79, 3, 1, 241, 231, 79, 6, 1, - 217, 130, 79, 3, 1, 217, 130, 79, 6, 1, 240, 109, 79, 3, 1, 240, 109, 79, - 6, 1, 234, 232, 79, 3, 1, 234, 232, 79, 6, 1, 233, 96, 79, 3, 1, 233, 96, - 79, 6, 1, 231, 42, 79, 3, 1, 231, 42, 79, 6, 1, 229, 64, 79, 3, 1, 229, - 64, 79, 6, 1, 233, 242, 79, 3, 1, 233, 242, 79, 6, 1, 75, 79, 3, 1, 75, - 79, 6, 1, 225, 240, 79, 3, 1, 225, 240, 79, 6, 1, 223, 112, 79, 3, 1, - 223, 112, 79, 6, 1, 220, 91, 79, 3, 1, 220, 91, 79, 6, 1, 217, 248, 79, - 3, 1, 217, 248, 79, 6, 1, 215, 196, 79, 3, 1, 215, 196, 79, 6, 1, 244, - 90, 79, 3, 1, 244, 90, 79, 6, 1, 234, 118, 79, 3, 1, 234, 118, 79, 6, 1, - 225, 46, 79, 3, 1, 225, 46, 79, 6, 1, 227, 44, 79, 3, 1, 227, 44, 79, 6, - 1, 247, 205, 254, 78, 79, 3, 1, 247, 205, 254, 78, 79, 6, 1, 53, 79, 254, - 103, 79, 3, 1, 53, 79, 254, 103, 79, 6, 1, 249, 55, 245, 151, 79, 3, 1, - 249, 55, 245, 151, 79, 6, 1, 247, 205, 234, 232, 79, 3, 1, 247, 205, 234, - 232, 79, 6, 1, 247, 205, 229, 64, 79, 3, 1, 247, 205, 229, 64, 79, 6, 1, - 249, 55, 229, 64, 79, 3, 1, 249, 55, 229, 64, 79, 6, 1, 53, 79, 227, 44, - 79, 3, 1, 53, 79, 227, 44, 79, 6, 1, 222, 161, 79, 3, 1, 222, 161, 79, 6, - 1, 249, 68, 220, 235, 79, 3, 1, 249, 68, 220, 235, 79, 6, 1, 53, 79, 220, - 235, 79, 3, 1, 53, 79, 220, 235, 79, 6, 1, 53, 79, 245, 40, 79, 3, 1, 53, - 79, 245, 40, 79, 6, 1, 254, 90, 234, 123, 79, 3, 1, 254, 90, 234, 123, - 79, 6, 1, 247, 205, 241, 32, 79, 3, 1, 247, 205, 241, 32, 79, 6, 1, 53, - 79, 241, 32, 79, 3, 1, 53, 79, 241, 32, 79, 6, 1, 53, 79, 159, 79, 3, 1, - 53, 79, 159, 79, 6, 1, 233, 170, 159, 79, 3, 1, 233, 170, 159, 79, 6, 1, - 53, 79, 241, 201, 79, 3, 1, 53, 79, 241, 201, 79, 6, 1, 53, 79, 241, 234, - 79, 3, 1, 53, 79, 241, 234, 79, 6, 1, 53, 79, 243, 78, 79, 3, 1, 53, 79, - 243, 78, 79, 6, 1, 53, 79, 247, 115, 79, 3, 1, 53, 79, 247, 115, 79, 6, - 1, 53, 79, 220, 202, 79, 3, 1, 53, 79, 220, 202, 79, 6, 1, 53, 228, 63, - 220, 202, 79, 3, 1, 53, 228, 63, 220, 202, 79, 6, 1, 53, 228, 63, 229, - 113, 79, 3, 1, 53, 228, 63, 229, 113, 79, 6, 1, 53, 228, 63, 228, 10, 79, - 3, 1, 53, 228, 63, 228, 10, 79, 6, 1, 53, 228, 63, 214, 21, 79, 3, 1, 53, - 228, 63, 214, 21, 79, 16, 234, 250, 79, 16, 231, 43, 223, 112, 79, 16, - 225, 241, 223, 112, 79, 16, 219, 87, 79, 16, 217, 249, 223, 112, 79, 16, - 234, 119, 223, 112, 79, 16, 220, 203, 220, 91, 79, 6, 1, 249, 55, 220, - 235, 79, 3, 1, 249, 55, 220, 235, 79, 6, 1, 249, 55, 243, 78, 79, 3, 1, - 249, 55, 243, 78, 79, 37, 229, 65, 49, 79, 37, 219, 179, 253, 139, 79, - 37, 219, 179, 233, 45, 79, 53, 228, 63, 243, 200, 219, 69, 79, 53, 228, - 63, 247, 149, 224, 158, 77, 79, 53, 228, 63, 235, 234, 224, 158, 77, 79, - 53, 228, 63, 214, 218, 247, 124, 79, 243, 228, 122, 242, 9, 79, 243, 200, - 219, 69, 79, 230, 194, 247, 124, 100, 3, 1, 254, 32, 100, 3, 1, 252, 71, - 100, 3, 1, 243, 82, 100, 3, 1, 247, 82, 100, 3, 1, 245, 108, 100, 3, 1, - 214, 141, 100, 3, 1, 212, 82, 100, 3, 1, 218, 11, 100, 3, 1, 235, 251, - 100, 3, 1, 234, 239, 100, 3, 1, 233, 104, 100, 3, 1, 231, 248, 100, 3, 1, - 230, 15, 100, 3, 1, 227, 62, 100, 3, 1, 226, 145, 100, 3, 1, 212, 71, - 100, 3, 1, 224, 61, 100, 3, 1, 222, 159, 100, 3, 1, 218, 1, 100, 3, 1, - 215, 160, 100, 3, 1, 226, 16, 100, 3, 1, 234, 127, 100, 3, 1, 242, 217, - 100, 3, 1, 224, 217, 100, 3, 1, 220, 200, 100, 3, 1, 250, 34, 100, 3, 1, - 250, 195, 100, 3, 1, 235, 103, 100, 3, 1, 249, 233, 100, 3, 1, 250, 79, - 100, 3, 1, 213, 151, 100, 3, 1, 235, 113, 100, 3, 1, 242, 24, 100, 3, 1, - 241, 222, 100, 3, 1, 241, 160, 100, 3, 1, 214, 6, 100, 3, 1, 241, 243, - 100, 3, 1, 241, 51, 217, 62, 1, 186, 217, 62, 1, 213, 87, 217, 62, 1, - 213, 86, 217, 62, 1, 213, 76, 217, 62, 1, 213, 74, 217, 62, 1, 251, 209, - 254, 176, 213, 70, 217, 62, 1, 213, 70, 217, 62, 1, 213, 84, 217, 62, 1, - 213, 81, 217, 62, 1, 213, 83, 217, 62, 1, 213, 82, 217, 62, 1, 213, 3, - 217, 62, 1, 213, 78, 217, 62, 1, 213, 68, 217, 62, 1, 216, 79, 213, 68, - 217, 62, 1, 213, 65, 217, 62, 1, 213, 72, 217, 62, 1, 251, 209, 254, 176, - 213, 72, 217, 62, 1, 216, 79, 213, 72, 217, 62, 1, 213, 71, 217, 62, 1, - 213, 91, 217, 62, 1, 213, 66, 217, 62, 1, 216, 79, 213, 66, 217, 62, 1, - 213, 56, 217, 62, 1, 216, 79, 213, 56, 217, 62, 1, 212, 255, 217, 62, 1, - 213, 40, 217, 62, 1, 254, 112, 213, 40, 217, 62, 1, 216, 79, 213, 40, - 217, 62, 1, 213, 64, 217, 62, 1, 213, 63, 217, 62, 1, 213, 60, 217, 62, - 1, 216, 79, 213, 73, 217, 62, 1, 216, 79, 213, 58, 217, 62, 1, 213, 57, - 217, 62, 1, 212, 203, 217, 62, 1, 213, 54, 217, 62, 1, 213, 53, 217, 62, - 1, 213, 75, 217, 62, 1, 216, 79, 213, 75, 217, 62, 1, 253, 79, 213, 75, - 217, 62, 1, 213, 52, 217, 62, 1, 213, 50, 217, 62, 1, 213, 51, 217, 62, - 1, 213, 49, 217, 62, 1, 213, 48, 217, 62, 1, 213, 85, 217, 62, 1, 213, - 46, 217, 62, 1, 213, 45, 217, 62, 1, 213, 44, 217, 62, 1, 213, 43, 217, - 62, 1, 213, 41, 217, 62, 1, 217, 241, 213, 41, 217, 62, 1, 213, 39, 217, - 62, 59, 1, 233, 149, 77, 217, 62, 221, 58, 77, 217, 62, 249, 133, 235, - 66, 28, 4, 232, 207, 28, 4, 230, 230, 28, 4, 223, 110, 28, 4, 219, 241, - 28, 4, 220, 186, 28, 4, 251, 127, 28, 4, 216, 252, 28, 4, 249, 174, 28, - 4, 228, 183, 28, 4, 227, 252, 28, 4, 242, 156, 227, 120, 28, 4, 212, 15, - 28, 4, 247, 97, 28, 4, 248, 55, 28, 4, 235, 70, 28, 4, 217, 108, 28, 4, - 250, 22, 28, 4, 225, 252, 28, 4, 225, 149, 28, 4, 242, 231, 28, 4, 242, - 227, 28, 4, 242, 228, 28, 4, 242, 229, 28, 4, 219, 157, 28, 4, 219, 117, - 28, 4, 219, 128, 28, 4, 219, 156, 28, 4, 219, 132, 28, 4, 219, 133, 28, - 4, 219, 121, 28, 4, 250, 146, 28, 4, 250, 126, 28, 4, 250, 128, 28, 4, - 250, 145, 28, 4, 250, 143, 28, 4, 250, 144, 28, 4, 250, 127, 28, 4, 211, - 242, 28, 4, 211, 222, 28, 4, 211, 233, 28, 4, 211, 241, 28, 4, 211, 236, - 28, 4, 211, 237, 28, 4, 211, 225, 28, 4, 250, 142, 28, 4, 250, 129, 28, - 4, 250, 131, 28, 4, 250, 141, 28, 4, 250, 139, 28, 4, 250, 140, 28, 4, - 250, 130, 28, 4, 224, 125, 28, 4, 224, 115, 28, 4, 224, 121, 28, 4, 224, - 124, 28, 4, 224, 122, 28, 4, 224, 123, 28, 4, 224, 120, 28, 4, 233, 181, - 28, 4, 233, 173, 28, 4, 233, 176, 28, 4, 233, 180, 28, 4, 233, 177, 28, - 4, 233, 178, 28, 4, 233, 174, 28, 4, 213, 118, 28, 4, 213, 108, 28, 4, - 213, 114, 28, 4, 213, 117, 28, 4, 213, 115, 28, 4, 213, 116, 28, 4, 213, - 113, 28, 4, 242, 52, 28, 4, 242, 43, 28, 4, 242, 46, 28, 4, 242, 51, 28, - 4, 242, 48, 28, 4, 242, 49, 28, 4, 242, 45, 37, 33, 1, 251, 251, 37, 33, - 1, 214, 232, 37, 33, 1, 242, 212, 37, 33, 1, 248, 41, 37, 33, 1, 212, 67, - 37, 33, 1, 212, 87, 37, 33, 1, 181, 37, 33, 1, 245, 131, 37, 33, 1, 245, - 117, 37, 33, 1, 245, 108, 37, 33, 1, 75, 37, 33, 1, 226, 96, 37, 33, 1, - 245, 55, 37, 33, 1, 245, 45, 37, 33, 1, 217, 229, 37, 33, 1, 159, 37, 33, - 1, 216, 136, 37, 33, 1, 250, 67, 37, 33, 1, 221, 24, 37, 33, 1, 220, 245, - 37, 33, 1, 244, 51, 37, 33, 1, 245, 44, 37, 33, 1, 61, 37, 33, 1, 236, - 55, 37, 33, 1, 247, 113, 37, 33, 1, 230, 210, 215, 175, 37, 33, 1, 213, - 49, 37, 33, 1, 212, 203, 37, 33, 1, 235, 181, 61, 37, 33, 1, 232, 221, - 212, 174, 37, 33, 1, 251, 172, 212, 174, 37, 33, 1, 235, 181, 251, 172, - 212, 174, 46, 254, 19, 219, 5, 231, 217, 46, 254, 19, 246, 72, 219, 5, - 231, 217, 42, 219, 5, 125, 46, 219, 5, 125, 42, 246, 72, 219, 5, 125, 46, - 246, 72, 219, 5, 125, 224, 48, 235, 199, 231, 217, 224, 48, 246, 72, 235, - 199, 231, 217, 246, 72, 216, 199, 231, 217, 42, 216, 199, 125, 46, 216, - 199, 125, 224, 48, 219, 166, 42, 224, 48, 227, 64, 125, 46, 224, 48, 227, - 64, 125, 245, 166, 249, 97, 226, 141, 243, 247, 226, 141, 223, 202, 243, - 247, 226, 141, 240, 157, 246, 72, 227, 115, 246, 58, 254, 28, 215, 124, - 254, 28, 246, 72, 223, 144, 254, 18, 51, 227, 112, 240, 160, 235, 191, - 235, 198, 226, 186, 251, 81, 240, 161, 2, 247, 209, 217, 43, 2, 223, 131, - 49, 42, 115, 226, 133, 125, 46, 115, 226, 133, 125, 217, 43, 2, 62, 49, - 217, 43, 2, 62, 55, 42, 71, 252, 60, 2, 224, 152, 46, 71, 252, 60, 2, - 224, 152, 216, 227, 42, 151, 125, 216, 227, 46, 151, 125, 251, 101, 42, - 151, 125, 251, 101, 46, 151, 125, 42, 220, 113, 111, 125, 46, 220, 113, - 111, 125, 42, 51, 226, 131, 46, 51, 226, 131, 117, 176, 110, 122, 62, - 225, 26, 122, 62, 110, 117, 176, 225, 26, 91, 243, 237, 62, 225, 26, 244, - 50, 62, 77, 223, 202, 224, 158, 77, 71, 217, 42, 223, 131, 225, 144, 213, - 196, 221, 58, 231, 37, 247, 74, 9, 34, 223, 227, 9, 34, 249, 203, 9, 34, - 222, 95, 116, 9, 34, 222, 95, 109, 9, 34, 222, 95, 166, 9, 34, 226, 43, - 9, 34, 251, 89, 9, 34, 218, 40, 9, 34, 234, 42, 116, 9, 34, 234, 42, 109, - 9, 34, 247, 122, 9, 34, 222, 98, 9, 34, 3, 116, 9, 34, 3, 109, 9, 34, - 233, 121, 116, 9, 34, 233, 121, 109, 9, 34, 233, 121, 166, 9, 34, 233, - 121, 163, 9, 34, 219, 252, 9, 34, 217, 98, 9, 34, 219, 250, 116, 9, 34, - 219, 250, 109, 9, 34, 241, 212, 116, 9, 34, 241, 212, 109, 9, 34, 241, - 254, 9, 34, 224, 39, 9, 34, 250, 19, 9, 34, 218, 238, 9, 34, 230, 198, 9, - 34, 248, 39, 9, 34, 230, 190, 9, 34, 249, 218, 9, 34, 214, 25, 116, 9, - 34, 214, 25, 109, 9, 34, 244, 65, 9, 34, 226, 106, 116, 9, 34, 226, 106, - 109, 9, 34, 220, 86, 151, 216, 194, 216, 146, 9, 34, 249, 84, 9, 34, 247, - 90, 9, 34, 235, 135, 9, 34, 251, 122, 65, 249, 187, 9, 34, 244, 239, 9, - 34, 219, 181, 116, 9, 34, 219, 181, 109, 9, 34, 252, 73, 9, 34, 220, 93, - 9, 34, 250, 249, 220, 93, 9, 34, 229, 172, 116, 9, 34, 229, 172, 109, 9, - 34, 229, 172, 166, 9, 34, 229, 172, 163, 9, 34, 231, 111, 9, 34, 220, - 237, 9, 34, 224, 45, 9, 34, 245, 4, 9, 34, 227, 75, 9, 34, 251, 61, 116, - 9, 34, 251, 61, 109, 9, 34, 231, 151, 9, 34, 230, 193, 9, 34, 242, 117, - 116, 9, 34, 242, 117, 109, 9, 34, 242, 117, 166, 9, 34, 217, 60, 9, 34, - 249, 186, 9, 34, 213, 250, 116, 9, 34, 213, 250, 109, 9, 34, 250, 249, - 222, 89, 9, 34, 220, 86, 240, 235, 9, 34, 240, 235, 9, 34, 250, 249, 219, - 190, 9, 34, 250, 249, 220, 232, 9, 34, 244, 1, 9, 34, 250, 249, 250, 160, - 9, 34, 220, 86, 214, 41, 9, 34, 214, 42, 116, 9, 34, 214, 42, 109, 9, 34, - 249, 220, 9, 34, 250, 249, 242, 142, 9, 34, 184, 116, 9, 34, 184, 109, 9, - 34, 250, 249, 232, 190, 9, 34, 250, 249, 243, 64, 9, 34, 230, 189, 116, - 9, 34, 230, 189, 109, 9, 34, 224, 50, 9, 34, 251, 130, 9, 34, 250, 249, - 218, 7, 233, 76, 9, 34, 250, 249, 233, 77, 9, 34, 250, 249, 213, 224, 9, - 34, 250, 249, 244, 15, 9, 34, 245, 174, 116, 9, 34, 245, 174, 109, 9, 34, - 245, 174, 166, 9, 34, 250, 249, 245, 173, 9, 34, 241, 219, 9, 34, 250, - 249, 240, 232, 9, 34, 251, 119, 9, 34, 242, 198, 9, 34, 250, 249, 244, - 59, 9, 34, 250, 249, 251, 160, 9, 34, 250, 249, 222, 172, 9, 34, 220, 86, - 213, 243, 9, 34, 220, 86, 213, 32, 9, 34, 250, 249, 243, 214, 9, 34, 235, - 141, 245, 8, 9, 34, 250, 249, 245, 8, 9, 34, 235, 141, 216, 228, 9, 34, - 250, 249, 216, 228, 9, 34, 235, 141, 246, 50, 9, 34, 250, 249, 246, 50, - 9, 34, 216, 55, 9, 34, 235, 141, 216, 55, 9, 34, 250, 249, 216, 55, 57, - 34, 116, 57, 34, 232, 242, 57, 34, 247, 74, 57, 34, 220, 23, 57, 34, 222, - 94, 57, 34, 101, 57, 34, 109, 57, 34, 233, 9, 57, 34, 231, 248, 57, 34, - 233, 57, 57, 34, 245, 88, 57, 34, 195, 57, 34, 119, 251, 89, 57, 34, 249, - 86, 57, 34, 240, 104, 57, 34, 218, 40, 57, 34, 227, 40, 251, 89, 57, 34, - 234, 41, 57, 34, 225, 104, 57, 34, 213, 190, 57, 34, 219, 175, 57, 34, - 46, 227, 40, 251, 89, 57, 34, 241, 161, 245, 103, 57, 34, 217, 200, 57, - 34, 247, 122, 57, 34, 222, 98, 57, 34, 249, 203, 57, 34, 225, 65, 57, 34, - 254, 120, 57, 34, 230, 180, 57, 34, 245, 103, 57, 34, 245, 179, 57, 34, - 222, 118, 57, 34, 242, 150, 57, 34, 242, 151, 220, 9, 57, 34, 245, 7, 57, - 34, 251, 171, 57, 34, 213, 208, 57, 34, 250, 38, 57, 34, 223, 98, 57, 34, - 235, 247, 57, 34, 220, 7, 57, 34, 233, 120, 57, 34, 249, 95, 57, 34, 219, - 169, 57, 34, 230, 185, 57, 34, 223, 121, 57, 34, 213, 193, 57, 34, 227, - 56, 57, 34, 216, 61, 57, 34, 246, 35, 57, 34, 220, 175, 217, 98, 57, 34, - 246, 72, 249, 203, 57, 34, 184, 219, 48, 57, 34, 117, 241, 249, 57, 34, - 220, 180, 57, 34, 251, 95, 57, 34, 219, 249, 57, 34, 251, 65, 57, 34, - 219, 78, 57, 34, 241, 211, 57, 34, 242, 10, 57, 34, 247, 77, 57, 34, 241, - 254, 57, 34, 251, 81, 57, 34, 224, 39, 57, 34, 222, 106, 57, 34, 247, - 151, 57, 34, 253, 84, 57, 34, 219, 166, 57, 34, 228, 162, 57, 34, 218, - 238, 57, 34, 222, 129, 57, 34, 230, 198, 57, 34, 216, 193, 57, 34, 233, - 145, 57, 34, 219, 69, 57, 34, 248, 39, 57, 34, 214, 5, 57, 34, 247, 100, - 228, 162, 57, 34, 249, 154, 57, 34, 243, 194, 57, 34, 249, 214, 57, 34, - 219, 82, 57, 34, 214, 24, 57, 34, 244, 65, 57, 34, 249, 211, 57, 34, 244, - 129, 57, 34, 51, 213, 166, 57, 34, 151, 216, 194, 216, 146, 57, 34, 220, - 17, 57, 34, 244, 139, 57, 34, 249, 84, 57, 34, 247, 90, 57, 34, 225, 62, - 57, 34, 235, 135, 57, 34, 231, 131, 57, 34, 217, 41, 57, 34, 218, 190, - 57, 34, 233, 3, 57, 34, 215, 103, 57, 34, 244, 89, 57, 34, 251, 122, 65, - 249, 187, 57, 34, 220, 114, 57, 34, 246, 72, 217, 195, 57, 34, 213, 238, - 57, 34, 220, 31, 57, 34, 247, 139, 57, 34, 244, 239, 57, 34, 219, 193, - 57, 34, 68, 57, 34, 219, 71, 57, 34, 219, 180, 57, 34, 216, 212, 57, 34, - 242, 123, 57, 34, 250, 151, 57, 34, 219, 99, 57, 34, 252, 73, 57, 34, - 223, 184, 57, 34, 220, 93, 57, 34, 235, 130, 57, 34, 229, 171, 57, 34, - 220, 237, 57, 34, 244, 118, 57, 34, 227, 75, 57, 34, 254, 27, 57, 34, - 225, 162, 57, 34, 245, 183, 57, 34, 251, 60, 57, 34, 231, 151, 57, 34, - 230, 252, 57, 34, 221, 76, 57, 34, 253, 167, 57, 34, 230, 193, 57, 34, - 216, 232, 57, 34, 227, 31, 57, 34, 251, 124, 57, 34, 219, 67, 57, 34, - 249, 163, 57, 34, 242, 116, 57, 34, 217, 60, 57, 34, 235, 214, 57, 34, - 251, 134, 57, 34, 214, 42, 245, 103, 57, 34, 249, 186, 57, 34, 213, 249, - 57, 34, 222, 89, 57, 34, 240, 235, 57, 34, 219, 190, 57, 34, 214, 254, - 57, 34, 251, 248, 57, 34, 225, 205, 57, 34, 252, 92, 57, 34, 220, 232, - 57, 34, 224, 3, 57, 34, 223, 37, 57, 34, 244, 1, 57, 34, 251, 123, 57, - 34, 250, 160, 57, 34, 251, 149, 57, 34, 230, 195, 57, 34, 214, 41, 57, - 34, 249, 220, 57, 34, 213, 221, 57, 34, 247, 132, 57, 34, 214, 142, 57, - 34, 242, 142, 57, 34, 232, 190, 57, 34, 243, 64, 57, 34, 230, 188, 57, - 34, 220, 22, 57, 34, 220, 175, 218, 26, 251, 160, 57, 34, 224, 50, 57, - 34, 251, 130, 57, 34, 213, 185, 57, 34, 244, 158, 57, 34, 233, 76, 57, - 34, 218, 7, 233, 76, 57, 34, 233, 72, 57, 34, 219, 217, 57, 34, 233, 77, - 57, 34, 213, 224, 57, 34, 244, 15, 57, 34, 245, 173, 57, 34, 241, 219, - 57, 34, 243, 226, 57, 34, 240, 232, 57, 34, 251, 119, 57, 34, 218, 14, - 57, 34, 242, 16, 57, 34, 244, 82, 57, 34, 222, 197, 213, 221, 57, 34, - 250, 153, 57, 34, 242, 198, 57, 34, 244, 59, 57, 34, 251, 160, 57, 34, - 222, 172, 57, 34, 248, 25, 57, 34, 213, 243, 57, 34, 241, 194, 57, 34, - 213, 32, 57, 34, 231, 5, 57, 34, 251, 144, 57, 34, 245, 113, 57, 34, 243, - 214, 57, 34, 216, 167, 57, 34, 246, 37, 57, 34, 224, 33, 57, 34, 228, - 164, 57, 34, 245, 8, 57, 34, 216, 228, 57, 34, 246, 50, 57, 34, 216, 55, - 57, 34, 244, 17, 105, 247, 244, 137, 42, 211, 211, 223, 148, 105, 247, - 244, 137, 78, 211, 211, 55, 105, 247, 244, 137, 42, 211, 211, 231, 37, - 24, 223, 148, 105, 247, 244, 137, 78, 211, 211, 231, 37, 24, 55, 105, - 247, 244, 137, 243, 200, 218, 210, 105, 247, 244, 137, 218, 211, 243, - 213, 49, 105, 247, 244, 137, 218, 211, 243, 213, 55, 105, 247, 244, 137, - 218, 211, 243, 213, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215, - 131, 233, 70, 105, 247, 244, 137, 218, 211, 243, 213, 215, 131, 223, 148, - 105, 247, 244, 137, 218, 211, 243, 213, 232, 163, 233, 70, 105, 247, 244, - 137, 226, 246, 105, 219, 206, 105, 249, 157, 105, 243, 200, 219, 69, 247, - 129, 77, 235, 131, 235, 233, 219, 98, 87, 105, 235, 156, 77, 105, 249, - 189, 77, 105, 50, 212, 79, 42, 254, 19, 125, 46, 254, 19, 125, 42, 51, - 254, 19, 125, 46, 51, 254, 19, 125, 42, 249, 100, 125, 46, 249, 100, 125, - 42, 67, 249, 100, 125, 46, 67, 249, 100, 125, 42, 83, 233, 44, 125, 46, - 83, 233, 44, 125, 225, 117, 77, 243, 8, 77, 42, 216, 219, 220, 233, 125, - 46, 216, 219, 220, 233, 125, 42, 67, 233, 44, 125, 46, 67, 233, 44, 125, - 42, 67, 216, 219, 220, 233, 125, 46, 67, 216, 219, 220, 233, 125, 42, 67, - 41, 125, 46, 67, 41, 125, 214, 20, 248, 101, 223, 202, 51, 225, 72, 224, - 143, 77, 51, 225, 72, 224, 143, 77, 115, 51, 225, 72, 224, 143, 77, 225, - 117, 152, 244, 158, 241, 247, 228, 54, 116, 241, 247, 228, 54, 109, 241, - 247, 228, 54, 166, 241, 247, 228, 54, 163, 241, 247, 228, 54, 180, 241, - 247, 228, 54, 189, 241, 247, 228, 54, 198, 241, 247, 228, 54, 195, 241, - 247, 228, 54, 200, 105, 233, 29, 160, 77, 105, 223, 125, 160, 77, 105, - 247, 251, 160, 77, 105, 245, 87, 160, 77, 23, 220, 81, 62, 160, 77, 23, - 51, 62, 160, 77, 214, 16, 248, 101, 71, 234, 238, 223, 228, 77, 71, 234, - 238, 223, 228, 2, 214, 116, 219, 218, 77, 71, 234, 238, 223, 228, 152, - 215, 131, 242, 9, 71, 234, 238, 223, 228, 2, 214, 116, 219, 218, 152, - 215, 131, 242, 9, 71, 234, 238, 223, 228, 152, 232, 163, 242, 9, 36, 225, - 117, 77, 105, 201, 232, 243, 244, 115, 221, 58, 87, 241, 247, 228, 54, - 217, 200, 241, 247, 228, 54, 216, 38, 241, 247, 228, 54, 217, 115, 71, - 105, 235, 156, 77, 231, 203, 77, 226, 127, 254, 49, 77, 105, 43, 235, - 235, 105, 151, 244, 75, 219, 206, 142, 1, 3, 61, 142, 1, 61, 142, 1, 3, - 72, 142, 1, 72, 142, 1, 3, 69, 142, 1, 69, 142, 1, 3, 74, 142, 1, 74, - 142, 1, 3, 75, 142, 1, 75, 142, 1, 181, 142, 1, 243, 110, 142, 1, 234, - 101, 142, 1, 242, 190, 142, 1, 233, 238, 142, 1, 242, 92, 142, 1, 234, - 188, 142, 1, 243, 38, 142, 1, 234, 37, 142, 1, 242, 150, 142, 1, 222, - 202, 142, 1, 212, 109, 142, 1, 220, 117, 142, 1, 212, 37, 142, 1, 219, - 27, 142, 1, 212, 8, 142, 1, 222, 100, 142, 1, 212, 87, 142, 1, 219, 242, - 142, 1, 212, 16, 142, 1, 218, 52, 142, 1, 248, 164, 142, 1, 217, 71, 142, - 1, 247, 211, 142, 1, 3, 216, 82, 142, 1, 216, 82, 142, 1, 246, 33, 142, - 1, 217, 229, 142, 1, 248, 41, 142, 1, 108, 142, 1, 247, 99, 142, 1, 205, - 142, 1, 229, 64, 142, 1, 228, 92, 142, 1, 229, 187, 142, 1, 228, 185, - 142, 1, 159, 142, 1, 252, 107, 142, 1, 193, 142, 1, 241, 165, 142, 1, - 251, 184, 142, 1, 225, 240, 142, 1, 240, 212, 142, 1, 251, 54, 142, 1, - 225, 35, 142, 1, 241, 222, 142, 1, 251, 251, 142, 1, 226, 96, 142, 1, - 241, 54, 142, 1, 251, 128, 142, 1, 225, 150, 142, 1, 188, 142, 1, 231, - 42, 142, 1, 230, 172, 142, 1, 231, 156, 142, 1, 230, 231, 142, 1, 3, 186, - 142, 1, 186, 142, 1, 3, 212, 203, 142, 1, 212, 203, 142, 1, 3, 212, 235, - 142, 1, 212, 235, 142, 1, 203, 142, 1, 223, 188, 142, 1, 223, 51, 142, 1, - 224, 21, 142, 1, 223, 112, 142, 1, 3, 214, 49, 142, 1, 214, 49, 142, 1, - 213, 235, 142, 1, 214, 6, 142, 1, 213, 214, 142, 1, 204, 142, 1, 214, 99, - 142, 1, 3, 181, 142, 1, 3, 234, 188, 37, 234, 206, 214, 116, 219, 218, - 77, 37, 234, 206, 221, 75, 219, 218, 77, 234, 206, 214, 116, 219, 218, - 77, 234, 206, 221, 75, 219, 218, 77, 142, 235, 156, 77, 142, 214, 116, - 235, 156, 77, 142, 247, 173, 212, 216, 234, 206, 51, 240, 160, 56, 1, 3, - 61, 56, 1, 61, 56, 1, 3, 72, 56, 1, 72, 56, 1, 3, 69, 56, 1, 69, 56, 1, - 3, 74, 56, 1, 74, 56, 1, 3, 75, 56, 1, 75, 56, 1, 181, 56, 1, 243, 110, - 56, 1, 234, 101, 56, 1, 242, 190, 56, 1, 233, 238, 56, 1, 242, 92, 56, 1, - 234, 188, 56, 1, 243, 38, 56, 1, 234, 37, 56, 1, 242, 150, 56, 1, 222, - 202, 56, 1, 212, 109, 56, 1, 220, 117, 56, 1, 212, 37, 56, 1, 219, 27, - 56, 1, 212, 8, 56, 1, 222, 100, 56, 1, 212, 87, 56, 1, 219, 242, 56, 1, - 212, 16, 56, 1, 218, 52, 56, 1, 248, 164, 56, 1, 217, 71, 56, 1, 247, - 211, 56, 1, 3, 216, 82, 56, 1, 216, 82, 56, 1, 246, 33, 56, 1, 217, 229, - 56, 1, 248, 41, 56, 1, 108, 56, 1, 247, 99, 56, 1, 205, 56, 1, 229, 64, - 56, 1, 228, 92, 56, 1, 229, 187, 56, 1, 228, 185, 56, 1, 159, 56, 1, 252, - 107, 56, 1, 193, 56, 1, 241, 165, 56, 1, 251, 184, 56, 1, 225, 240, 56, - 1, 240, 212, 56, 1, 251, 54, 56, 1, 225, 35, 56, 1, 241, 222, 56, 1, 251, - 251, 56, 1, 226, 96, 56, 1, 241, 54, 56, 1, 251, 128, 56, 1, 225, 150, - 56, 1, 188, 56, 1, 231, 42, 56, 1, 230, 172, 56, 1, 231, 156, 56, 1, 230, - 231, 56, 1, 3, 186, 56, 1, 186, 56, 1, 3, 212, 203, 56, 1, 212, 203, 56, - 1, 3, 212, 235, 56, 1, 212, 235, 56, 1, 203, 56, 1, 223, 188, 56, 1, 223, - 51, 56, 1, 224, 21, 56, 1, 223, 112, 56, 1, 3, 214, 49, 56, 1, 214, 49, - 56, 1, 213, 235, 56, 1, 214, 6, 56, 1, 213, 214, 56, 1, 204, 56, 1, 214, - 99, 56, 1, 3, 181, 56, 1, 3, 234, 188, 56, 1, 215, 1, 56, 1, 214, 154, - 56, 1, 214, 232, 56, 1, 214, 119, 56, 231, 37, 247, 74, 234, 206, 225, - 57, 219, 218, 77, 56, 235, 156, 77, 56, 214, 116, 235, 156, 77, 56, 247, - 173, 234, 8, 202, 1, 253, 74, 202, 1, 226, 229, 202, 1, 183, 202, 1, 244, - 230, 202, 1, 249, 3, 202, 1, 218, 99, 202, 1, 204, 202, 1, 150, 202, 1, - 243, 177, 202, 1, 235, 27, 202, 1, 242, 41, 202, 1, 235, 142, 202, 1, - 224, 240, 202, 1, 213, 166, 202, 1, 212, 76, 202, 1, 250, 93, 202, 1, - 221, 26, 202, 1, 149, 202, 1, 212, 152, 202, 1, 250, 252, 202, 1, 197, - 202, 1, 61, 202, 1, 75, 202, 1, 74, 202, 1, 245, 154, 202, 1, 254, 108, - 202, 1, 245, 152, 202, 1, 253, 108, 202, 1, 227, 2, 202, 1, 254, 32, 202, - 1, 245, 108, 202, 1, 254, 24, 202, 1, 245, 96, 202, 1, 245, 55, 202, 1, - 72, 202, 1, 69, 202, 1, 235, 154, 202, 1, 215, 79, 202, 1, 229, 161, 202, - 1, 242, 154, 202, 1, 236, 29, 23, 1, 234, 67, 23, 1, 219, 150, 23, 1, - 234, 60, 23, 1, 229, 57, 23, 1, 229, 55, 23, 1, 229, 54, 23, 1, 217, 55, - 23, 1, 219, 139, 23, 1, 223, 179, 23, 1, 223, 174, 23, 1, 223, 171, 23, - 1, 223, 164, 23, 1, 223, 159, 23, 1, 223, 154, 23, 1, 223, 165, 23, 1, - 223, 177, 23, 1, 231, 30, 23, 1, 225, 227, 23, 1, 219, 147, 23, 1, 225, - 216, 23, 1, 220, 76, 23, 1, 219, 144, 23, 1, 236, 51, 23, 1, 249, 239, - 23, 1, 219, 154, 23, 1, 250, 43, 23, 1, 234, 116, 23, 1, 217, 126, 23, 1, - 226, 7, 23, 1, 241, 158, 23, 1, 61, 23, 1, 254, 148, 23, 1, 186, 23, 1, - 213, 80, 23, 1, 245, 76, 23, 1, 74, 23, 1, 213, 27, 23, 1, 213, 38, 23, - 1, 75, 23, 1, 214, 49, 23, 1, 214, 46, 23, 1, 227, 99, 23, 1, 212, 235, - 23, 1, 69, 23, 1, 213, 252, 23, 1, 214, 6, 23, 1, 213, 235, 23, 1, 212, - 203, 23, 1, 245, 22, 23, 1, 212, 255, 23, 1, 72, 23, 244, 72, 23, 1, 219, - 148, 23, 1, 229, 47, 23, 1, 229, 49, 23, 1, 229, 52, 23, 1, 223, 172, 23, - 1, 223, 153, 23, 1, 223, 161, 23, 1, 223, 166, 23, 1, 223, 151, 23, 1, - 231, 23, 23, 1, 231, 20, 23, 1, 231, 24, 23, 1, 234, 226, 23, 1, 225, - 222, 23, 1, 225, 208, 23, 1, 225, 214, 23, 1, 225, 211, 23, 1, 225, 225, - 23, 1, 225, 209, 23, 1, 234, 224, 23, 1, 234, 222, 23, 1, 220, 69, 23, 1, - 220, 67, 23, 1, 220, 59, 23, 1, 220, 64, 23, 1, 220, 74, 23, 1, 226, 160, - 23, 1, 219, 151, 23, 1, 213, 17, 23, 1, 213, 13, 23, 1, 213, 14, 23, 1, - 234, 225, 23, 1, 219, 152, 23, 1, 213, 23, 23, 1, 212, 229, 23, 1, 212, - 228, 23, 1, 212, 231, 23, 1, 212, 194, 23, 1, 212, 195, 23, 1, 212, 198, - 23, 1, 253, 204, 23, 1, 253, 198, 105, 254, 10, 232, 232, 77, 105, 254, - 10, 223, 203, 77, 105, 254, 10, 122, 77, 105, 254, 10, 117, 77, 105, 254, - 10, 133, 77, 105, 254, 10, 243, 237, 77, 105, 254, 10, 216, 227, 77, 105, - 254, 10, 231, 37, 77, 105, 254, 10, 251, 101, 77, 105, 254, 10, 244, 61, - 77, 105, 254, 10, 222, 95, 77, 105, 254, 10, 217, 122, 77, 105, 254, 10, - 243, 230, 77, 105, 254, 10, 241, 208, 77, 105, 254, 10, 245, 180, 77, - 105, 254, 10, 231, 249, 77, 202, 1, 251, 54, 202, 1, 212, 37, 202, 1, - 235, 110, 202, 1, 242, 92, 202, 1, 245, 165, 202, 1, 245, 93, 202, 1, - 227, 49, 202, 1, 227, 53, 202, 1, 235, 177, 202, 1, 254, 12, 202, 1, 235, - 221, 202, 1, 215, 139, 202, 1, 236, 11, 202, 1, 229, 142, 202, 1, 254, - 102, 202, 1, 253, 103, 202, 1, 254, 45, 202, 1, 227, 70, 202, 1, 227, 55, - 202, 1, 235, 218, 202, 40, 1, 226, 229, 202, 40, 1, 218, 99, 202, 40, 1, - 235, 27, 202, 40, 1, 242, 41, 202, 1, 242, 226, 202, 1, 233, 26, 202, 1, - 211, 249, 9, 219, 45, 218, 99, 9, 219, 45, 213, 245, 9, 219, 45, 213, - 146, 9, 219, 45, 251, 8, 9, 219, 45, 218, 199, 9, 219, 45, 240, 150, 9, - 219, 45, 240, 154, 9, 219, 45, 240, 218, 9, 219, 45, 240, 151, 9, 219, - 45, 218, 102, 9, 219, 45, 240, 153, 9, 219, 45, 240, 149, 9, 219, 45, - 240, 216, 9, 219, 45, 240, 152, 9, 219, 45, 240, 148, 9, 219, 45, 204, 9, - 219, 45, 242, 41, 9, 219, 45, 197, 9, 219, 45, 226, 229, 9, 219, 45, 219, - 208, 9, 219, 45, 249, 3, 9, 219, 45, 240, 155, 9, 219, 45, 241, 175, 9, - 219, 45, 218, 111, 9, 219, 45, 218, 178, 9, 219, 45, 219, 107, 9, 219, - 45, 221, 31, 9, 219, 45, 226, 98, 9, 219, 45, 224, 242, 9, 219, 45, 216, - 253, 9, 219, 45, 218, 101, 9, 219, 45, 218, 189, 9, 219, 45, 240, 162, 9, - 219, 45, 240, 147, 9, 219, 45, 226, 25, 9, 219, 45, 224, 240, 56, 1, 3, - 233, 238, 56, 1, 3, 220, 117, 56, 1, 3, 219, 27, 56, 1, 3, 108, 56, 1, 3, - 228, 92, 56, 1, 3, 159, 56, 1, 3, 241, 165, 56, 1, 3, 240, 212, 56, 1, 3, - 241, 222, 56, 1, 3, 241, 54, 56, 1, 3, 230, 172, 56, 1, 3, 203, 56, 1, 3, - 223, 188, 56, 1, 3, 223, 51, 56, 1, 3, 224, 21, 56, 1, 3, 223, 112, 86, - 23, 234, 67, 86, 23, 229, 57, 86, 23, 217, 55, 86, 23, 223, 179, 86, 23, - 231, 30, 86, 23, 225, 227, 86, 23, 220, 76, 86, 23, 236, 51, 86, 23, 249, - 239, 86, 23, 250, 43, 86, 23, 234, 116, 86, 23, 217, 126, 86, 23, 226, 7, - 86, 23, 241, 158, 86, 23, 234, 68, 61, 86, 23, 229, 58, 61, 86, 23, 217, - 56, 61, 86, 23, 223, 180, 61, 86, 23, 231, 31, 61, 86, 23, 225, 228, 61, - 86, 23, 220, 77, 61, 86, 23, 236, 52, 61, 86, 23, 249, 240, 61, 86, 23, - 250, 44, 61, 86, 23, 234, 117, 61, 86, 23, 217, 127, 61, 86, 23, 226, 8, - 61, 86, 23, 241, 159, 61, 86, 23, 249, 240, 69, 86, 234, 12, 137, 227, - 83, 86, 234, 12, 137, 157, 240, 212, 86, 143, 116, 86, 143, 109, 86, 143, - 166, 86, 143, 163, 86, 143, 180, 86, 143, 189, 86, 143, 198, 86, 143, - 195, 86, 143, 200, 86, 143, 217, 200, 86, 143, 230, 198, 86, 143, 244, - 65, 86, 143, 214, 24, 86, 143, 213, 201, 86, 143, 231, 106, 86, 143, 245, - 179, 86, 143, 218, 238, 86, 143, 219, 72, 86, 143, 241, 228, 86, 143, - 219, 238, 86, 143, 230, 24, 86, 143, 219, 192, 86, 143, 244, 71, 86, 143, - 249, 140, 86, 143, 233, 148, 86, 143, 223, 223, 86, 143, 250, 203, 86, - 143, 219, 30, 86, 143, 218, 220, 86, 143, 245, 86, 86, 143, 223, 215, 86, - 143, 254, 59, 86, 143, 244, 97, 86, 143, 223, 213, 86, 143, 221, 76, 86, - 143, 224, 20, 36, 143, 224, 157, 36, 143, 234, 89, 36, 143, 222, 116, 36, - 143, 234, 8, 36, 50, 217, 201, 227, 63, 83, 219, 166, 36, 50, 216, 39, - 227, 63, 83, 219, 166, 36, 50, 217, 116, 227, 63, 83, 219, 166, 36, 50, - 243, 241, 227, 63, 83, 219, 166, 36, 50, 244, 84, 227, 63, 83, 219, 166, - 36, 50, 220, 40, 227, 63, 83, 219, 166, 36, 50, 221, 38, 227, 63, 83, - 219, 166, 36, 50, 245, 142, 227, 63, 83, 219, 166, 226, 123, 52, 36, 50, - 216, 39, 116, 36, 50, 216, 39, 109, 36, 50, 216, 39, 166, 36, 50, 216, - 39, 163, 36, 50, 216, 39, 180, 36, 50, 216, 39, 189, 36, 50, 216, 39, - 198, 36, 50, 216, 39, 195, 36, 50, 216, 39, 200, 36, 50, 217, 115, 36, - 50, 217, 116, 116, 36, 50, 217, 116, 109, 36, 50, 217, 116, 166, 36, 50, - 217, 116, 163, 36, 50, 217, 116, 180, 36, 23, 234, 67, 36, 23, 229, 57, - 36, 23, 217, 55, 36, 23, 223, 179, 36, 23, 231, 30, 36, 23, 225, 227, 36, - 23, 220, 76, 36, 23, 236, 51, 36, 23, 249, 239, 36, 23, 250, 43, 36, 23, - 234, 116, 36, 23, 217, 126, 36, 23, 226, 7, 36, 23, 241, 158, 36, 23, - 234, 68, 61, 36, 23, 229, 58, 61, 36, 23, 217, 56, 61, 36, 23, 223, 180, - 61, 36, 23, 231, 31, 61, 36, 23, 225, 228, 61, 36, 23, 220, 77, 61, 36, - 23, 236, 52, 61, 36, 23, 249, 240, 61, 36, 23, 250, 44, 61, 36, 23, 234, - 117, 61, 36, 23, 217, 127, 61, 36, 23, 226, 8, 61, 36, 23, 241, 159, 61, - 36, 234, 12, 137, 250, 84, 36, 234, 12, 137, 235, 50, 36, 23, 236, 52, - 69, 234, 12, 219, 98, 87, 36, 143, 116, 36, 143, 109, 36, 143, 166, 36, - 143, 163, 36, 143, 180, 36, 143, 189, 36, 143, 198, 36, 143, 195, 36, - 143, 200, 36, 143, 217, 200, 36, 143, 230, 198, 36, 143, 244, 65, 36, - 143, 214, 24, 36, 143, 213, 201, 36, 143, 231, 106, 36, 143, 245, 179, - 36, 143, 218, 238, 36, 143, 219, 72, 36, 143, 241, 228, 36, 143, 219, - 238, 36, 143, 230, 24, 36, 143, 219, 192, 36, 143, 244, 71, 36, 143, 249, - 140, 36, 143, 233, 148, 36, 143, 222, 93, 36, 143, 231, 252, 36, 143, - 244, 106, 36, 143, 218, 250, 36, 143, 245, 1, 36, 143, 225, 68, 36, 143, - 253, 112, 36, 143, 235, 157, 36, 143, 223, 213, 36, 143, 249, 103, 36, - 143, 249, 94, 36, 143, 241, 151, 36, 143, 250, 108, 36, 143, 232, 165, - 36, 143, 233, 70, 36, 143, 223, 148, 36, 143, 231, 148, 36, 143, 223, - 237, 36, 143, 219, 30, 36, 143, 218, 220, 36, 143, 245, 86, 36, 143, 223, - 215, 36, 143, 254, 59, 36, 143, 229, 43, 36, 50, 217, 116, 189, 36, 50, - 217, 116, 198, 36, 50, 217, 116, 195, 36, 50, 217, 116, 200, 36, 50, 243, - 240, 36, 50, 243, 241, 116, 36, 50, 243, 241, 109, 36, 50, 243, 241, 166, - 36, 50, 243, 241, 163, 36, 50, 243, 241, 180, 36, 50, 243, 241, 189, 36, - 50, 243, 241, 198, 36, 50, 243, 241, 195, 36, 50, 243, 241, 200, 36, 50, - 244, 83, 105, 201, 16, 31, 235, 133, 105, 201, 16, 31, 244, 117, 105, - 201, 16, 31, 231, 223, 105, 201, 16, 31, 253, 217, 105, 201, 16, 31, 231, - 196, 105, 201, 16, 31, 235, 48, 105, 201, 16, 31, 235, 49, 105, 201, 16, - 31, 253, 104, 105, 201, 16, 31, 221, 56, 105, 201, 16, 31, 227, 104, 105, - 201, 16, 31, 228, 151, 105, 201, 16, 31, 248, 36, 41, 241, 175, 41, 245, - 51, 41, 245, 10, 232, 248, 233, 12, 52, 36, 56, 61, 36, 56, 72, 36, 56, - 69, 36, 56, 74, 36, 56, 75, 36, 56, 181, 36, 56, 234, 101, 36, 56, 233, - 238, 36, 56, 234, 188, 36, 56, 234, 37, 36, 56, 222, 202, 36, 56, 220, - 117, 36, 56, 219, 27, 36, 56, 222, 100, 36, 56, 219, 242, 36, 56, 218, - 52, 36, 56, 217, 71, 36, 56, 216, 82, 36, 56, 217, 229, 36, 56, 108, 36, - 56, 205, 36, 56, 229, 64, 36, 56, 228, 92, 36, 56, 229, 187, 36, 56, 228, - 185, 36, 56, 159, 36, 56, 241, 165, 36, 56, 240, 212, 36, 56, 241, 222, - 36, 56, 241, 54, 36, 56, 188, 36, 56, 231, 42, 36, 56, 230, 172, 36, 56, - 231, 156, 36, 56, 230, 231, 36, 56, 186, 36, 56, 212, 203, 36, 56, 212, - 235, 36, 56, 203, 36, 56, 223, 188, 36, 56, 223, 51, 36, 56, 224, 21, 36, - 56, 223, 112, 36, 56, 214, 49, 36, 56, 213, 235, 36, 56, 214, 6, 36, 56, - 213, 214, 41, 253, 238, 41, 253, 154, 41, 254, 6, 41, 254, 190, 41, 235, - 223, 41, 235, 193, 41, 215, 137, 41, 245, 31, 41, 245, 163, 41, 227, 52, - 41, 227, 46, 41, 234, 249, 41, 234, 219, 41, 234, 216, 41, 243, 68, 41, - 243, 77, 41, 242, 180, 41, 242, 176, 41, 233, 172, 41, 242, 169, 41, 234, - 81, 41, 234, 80, 41, 234, 79, 41, 234, 78, 41, 242, 67, 41, 242, 66, 41, - 233, 214, 41, 233, 216, 41, 234, 184, 41, 234, 10, 41, 234, 17, 41, 222, - 187, 41, 222, 153, 41, 220, 57, 41, 221, 61, 41, 221, 60, 41, 248, 161, - 41, 247, 243, 41, 247, 75, 41, 216, 243, 41, 230, 20, 41, 228, 152, 41, - 242, 14, 41, 226, 208, 41, 226, 207, 41, 252, 105, 41, 225, 237, 41, 225, - 201, 41, 225, 202, 41, 251, 157, 41, 240, 211, 41, 240, 207, 41, 251, 20, - 41, 240, 194, 41, 241, 199, 41, 226, 35, 41, 226, 69, 41, 241, 183, 41, - 226, 66, 41, 226, 82, 41, 251, 237, 41, 225, 140, 41, 251, 106, 41, 241, - 42, 41, 225, 130, 41, 241, 35, 41, 241, 37, 41, 232, 7, 41, 232, 3, 41, - 232, 11, 41, 231, 213, 41, 231, 238, 41, 231, 10, 41, 230, 245, 41, 230, - 244, 41, 231, 138, 41, 231, 135, 41, 231, 139, 41, 213, 90, 41, 213, 88, - 41, 212, 192, 41, 223, 123, 41, 223, 127, 41, 223, 28, 41, 223, 23, 41, - 223, 235, 41, 223, 232, 41, 214, 22, 105, 201, 16, 31, 240, 226, 212, 79, - 105, 201, 16, 31, 240, 226, 116, 105, 201, 16, 31, 240, 226, 109, 105, - 201, 16, 31, 240, 226, 166, 105, 201, 16, 31, 240, 226, 163, 105, 201, - 16, 31, 240, 226, 180, 105, 201, 16, 31, 240, 226, 189, 105, 201, 16, 31, - 240, 226, 198, 105, 201, 16, 31, 240, 226, 195, 105, 201, 16, 31, 240, - 226, 200, 105, 201, 16, 31, 240, 226, 217, 200, 105, 201, 16, 31, 240, - 226, 245, 124, 105, 201, 16, 31, 240, 226, 216, 41, 105, 201, 16, 31, - 240, 226, 217, 117, 105, 201, 16, 31, 240, 226, 243, 231, 105, 201, 16, - 31, 240, 226, 244, 87, 105, 201, 16, 31, 240, 226, 220, 47, 105, 201, 16, - 31, 240, 226, 221, 40, 105, 201, 16, 31, 240, 226, 245, 147, 105, 201, - 16, 31, 240, 226, 229, 28, 105, 201, 16, 31, 240, 226, 216, 38, 105, 201, - 16, 31, 240, 226, 216, 32, 105, 201, 16, 31, 240, 226, 216, 28, 105, 201, - 16, 31, 240, 226, 216, 29, 105, 201, 16, 31, 240, 226, 216, 34, 41, 240, - 217, 41, 248, 164, 41, 253, 108, 41, 134, 41, 226, 249, 41, 226, 99, 41, - 247, 101, 41, 247, 102, 219, 165, 41, 247, 102, 249, 49, 41, 235, 154, - 41, 245, 54, 230, 25, 241, 200, 41, 245, 54, 230, 25, 218, 120, 41, 245, - 54, 230, 25, 218, 24, 41, 245, 54, 230, 25, 231, 134, 41, 249, 96, 41, - 226, 214, 254, 34, 41, 205, 41, 230, 173, 61, 41, 188, 41, 181, 41, 234, - 191, 41, 231, 192, 41, 243, 56, 41, 250, 206, 41, 234, 190, 41, 226, 26, - 41, 229, 163, 41, 230, 173, 244, 230, 41, 230, 173, 243, 177, 41, 231, - 82, 41, 234, 140, 41, 240, 155, 41, 234, 103, 41, 231, 44, 41, 242, 192, - 41, 217, 73, 41, 230, 173, 150, 41, 230, 238, 41, 247, 109, 41, 234, 49, - 41, 244, 14, 41, 228, 200, 41, 230, 173, 183, 41, 230, 235, 41, 249, 176, - 41, 234, 43, 41, 230, 236, 219, 165, 41, 249, 177, 219, 165, 41, 232, - 110, 219, 165, 41, 234, 44, 219, 165, 41, 230, 236, 249, 49, 41, 249, - 177, 249, 49, 41, 232, 110, 249, 49, 41, 234, 44, 249, 49, 41, 232, 110, - 110, 197, 41, 232, 110, 110, 223, 4, 219, 165, 41, 193, 41, 234, 4, 41, - 230, 175, 41, 242, 127, 41, 224, 66, 41, 224, 67, 110, 197, 41, 224, 67, - 110, 223, 4, 219, 165, 41, 225, 47, 41, 228, 124, 41, 230, 173, 197, 41, - 230, 174, 41, 225, 4, 41, 228, 33, 41, 230, 173, 215, 79, 41, 230, 120, - 41, 233, 207, 41, 230, 121, 231, 138, 41, 225, 3, 41, 228, 32, 41, 230, - 173, 214, 82, 41, 230, 115, 41, 233, 205, 41, 230, 116, 231, 138, 41, - 235, 28, 227, 86, 41, 232, 110, 227, 86, 41, 254, 45, 41, 251, 87, 41, - 250, 147, 41, 250, 125, 41, 250, 253, 110, 234, 140, 41, 249, 175, 41, - 248, 88, 41, 242, 53, 41, 159, 41, 240, 218, 41, 235, 251, 41, 234, 56, - 41, 234, 44, 250, 182, 41, 233, 240, 41, 232, 211, 41, 232, 210, 41, 232, - 200, 41, 232, 122, 41, 231, 193, 220, 7, 41, 231, 9, 41, 230, 222, 41, - 226, 24, 41, 225, 153, 41, 225, 99, 41, 225, 97, 41, 219, 159, 41, 218, - 203, 41, 214, 8, 41, 215, 80, 110, 183, 41, 118, 110, 183, 105, 201, 16, - 31, 248, 92, 116, 105, 201, 16, 31, 248, 92, 109, 105, 201, 16, 31, 248, - 92, 166, 105, 201, 16, 31, 248, 92, 163, 105, 201, 16, 31, 248, 92, 180, - 105, 201, 16, 31, 248, 92, 189, 105, 201, 16, 31, 248, 92, 198, 105, 201, - 16, 31, 248, 92, 195, 105, 201, 16, 31, 248, 92, 200, 105, 201, 16, 31, - 248, 92, 217, 200, 105, 201, 16, 31, 248, 92, 245, 124, 105, 201, 16, 31, - 248, 92, 216, 41, 105, 201, 16, 31, 248, 92, 217, 117, 105, 201, 16, 31, - 248, 92, 243, 231, 105, 201, 16, 31, 248, 92, 244, 87, 105, 201, 16, 31, - 248, 92, 220, 47, 105, 201, 16, 31, 248, 92, 221, 40, 105, 201, 16, 31, - 248, 92, 245, 147, 105, 201, 16, 31, 248, 92, 229, 28, 105, 201, 16, 31, - 248, 92, 216, 38, 105, 201, 16, 31, 248, 92, 216, 32, 105, 201, 16, 31, - 248, 92, 216, 28, 105, 201, 16, 31, 248, 92, 216, 29, 105, 201, 16, 31, - 248, 92, 216, 34, 105, 201, 16, 31, 248, 92, 216, 35, 105, 201, 16, 31, - 248, 92, 216, 30, 105, 201, 16, 31, 248, 92, 216, 31, 105, 201, 16, 31, - 248, 92, 216, 37, 105, 201, 16, 31, 248, 92, 216, 33, 105, 201, 16, 31, - 248, 92, 217, 115, 105, 201, 16, 31, 248, 92, 217, 114, 41, 243, 94, 241, - 177, 31, 217, 149, 249, 80, 241, 207, 241, 177, 31, 217, 149, 224, 15, - 245, 179, 241, 177, 31, 247, 183, 253, 123, 217, 149, 251, 232, 241, 177, - 31, 212, 214, 244, 7, 241, 177, 31, 214, 43, 241, 177, 31, 249, 142, 241, - 177, 31, 217, 149, 253, 174, 241, 177, 31, 241, 46, 216, 249, 241, 177, - 31, 3, 218, 12, 241, 177, 31, 216, 195, 241, 177, 31, 226, 94, 241, 177, - 31, 219, 97, 241, 177, 31, 244, 108, 241, 177, 31, 242, 109, 225, 120, - 241, 177, 31, 230, 225, 241, 177, 31, 245, 85, 241, 177, 31, 244, 8, 241, - 177, 31, 213, 194, 227, 63, 217, 149, 248, 37, 241, 177, 31, 253, 221, - 241, 177, 31, 249, 124, 241, 177, 31, 251, 150, 217, 92, 241, 177, 31, - 242, 125, 241, 177, 31, 219, 177, 253, 237, 241, 177, 31, 223, 205, 241, - 177, 31, 235, 217, 241, 177, 31, 242, 109, 218, 12, 241, 177, 31, 230, - 181, 249, 98, 241, 177, 31, 242, 109, 225, 77, 241, 177, 31, 217, 149, - 254, 178, 214, 24, 241, 177, 31, 217, 149, 249, 201, 244, 65, 241, 177, - 31, 235, 230, 241, 177, 31, 246, 12, 241, 177, 31, 223, 208, 241, 177, - 31, 242, 109, 225, 104, 241, 177, 31, 225, 61, 241, 177, 31, 248, 106, - 65, 217, 149, 233, 2, 241, 177, 31, 217, 149, 244, 142, 241, 177, 31, - 227, 29, 241, 177, 31, 227, 108, 241, 177, 31, 248, 10, 241, 177, 31, - 248, 30, 241, 177, 31, 235, 243, 241, 177, 31, 251, 77, 241, 177, 31, - 249, 159, 211, 211, 231, 141, 241, 177, 31, 243, 63, 216, 249, 241, 177, - 31, 225, 12, 215, 125, 241, 177, 31, 227, 28, 241, 177, 31, 217, 149, - 213, 254, 241, 177, 31, 223, 198, 241, 177, 31, 217, 149, 250, 153, 241, - 177, 31, 217, 149, 253, 170, 217, 87, 241, 177, 31, 217, 149, 234, 185, - 219, 74, 230, 185, 241, 177, 31, 247, 239, 241, 177, 31, 217, 149, 231, - 215, 232, 8, 241, 177, 31, 254, 179, 241, 177, 31, 217, 149, 214, 38, - 241, 177, 31, 217, 149, 243, 23, 213, 224, 241, 177, 31, 217, 149, 235, - 55, 233, 131, 241, 177, 31, 247, 136, 241, 177, 31, 232, 249, 241, 177, - 31, 235, 220, 216, 145, 241, 177, 31, 3, 225, 77, 241, 177, 31, 254, 122, - 249, 151, 241, 177, 31, 251, 235, 249, 151, 8, 4, 235, 158, 8, 4, 235, - 151, 8, 4, 72, 8, 4, 235, 180, 8, 4, 236, 53, 8, 4, 236, 36, 8, 4, 236, - 55, 8, 4, 236, 54, 8, 4, 253, 122, 8, 4, 253, 85, 8, 4, 61, 8, 4, 253, - 239, 8, 4, 215, 135, 8, 4, 215, 138, 8, 4, 215, 136, 8, 4, 227, 8, 8, 4, - 226, 238, 8, 4, 75, 8, 4, 227, 41, 8, 4, 245, 2, 8, 4, 74, 8, 4, 213, - 183, 8, 4, 251, 151, 8, 4, 251, 148, 8, 4, 251, 184, 8, 4, 251, 161, 8, - 4, 251, 174, 8, 4, 251, 173, 8, 4, 251, 176, 8, 4, 251, 175, 8, 4, 252, - 41, 8, 4, 252, 33, 8, 4, 252, 107, 8, 4, 252, 61, 8, 4, 251, 30, 8, 4, - 251, 34, 8, 4, 251, 31, 8, 4, 251, 105, 8, 4, 251, 89, 8, 4, 251, 128, 8, - 4, 251, 110, 8, 4, 251, 198, 8, 4, 251, 251, 8, 4, 251, 210, 8, 4, 251, - 16, 8, 4, 251, 13, 8, 4, 251, 54, 8, 4, 251, 29, 8, 4, 251, 23, 8, 4, - 251, 27, 8, 4, 251, 1, 8, 4, 251, 0, 8, 4, 251, 6, 8, 4, 251, 4, 8, 4, - 251, 2, 8, 4, 251, 3, 8, 4, 225, 181, 8, 4, 225, 177, 8, 4, 225, 240, 8, - 4, 225, 191, 8, 4, 225, 207, 8, 4, 225, 234, 8, 4, 225, 230, 8, 4, 226, - 113, 8, 4, 226, 104, 8, 4, 193, 8, 4, 226, 149, 8, 4, 225, 21, 8, 4, 225, - 23, 8, 4, 225, 22, 8, 4, 225, 113, 8, 4, 225, 102, 8, 4, 225, 150, 8, 4, - 225, 125, 8, 4, 225, 8, 8, 4, 225, 5, 8, 4, 225, 35, 8, 4, 225, 20, 8, 4, - 225, 13, 8, 4, 225, 18, 8, 4, 224, 244, 8, 4, 224, 243, 8, 4, 224, 248, - 8, 4, 224, 247, 8, 4, 224, 245, 8, 4, 224, 246, 8, 4, 252, 16, 8, 4, 252, - 15, 8, 4, 252, 22, 8, 4, 252, 17, 8, 4, 252, 19, 8, 4, 252, 18, 8, 4, - 252, 21, 8, 4, 252, 20, 8, 4, 252, 28, 8, 4, 252, 27, 8, 4, 252, 31, 8, - 4, 252, 29, 8, 4, 252, 7, 8, 4, 252, 9, 8, 4, 252, 8, 8, 4, 252, 12, 8, - 4, 252, 11, 8, 4, 252, 14, 8, 4, 252, 13, 8, 4, 252, 23, 8, 4, 252, 26, - 8, 4, 252, 24, 8, 4, 252, 3, 8, 4, 252, 2, 8, 4, 252, 10, 8, 4, 252, 6, - 8, 4, 252, 4, 8, 4, 252, 5, 8, 4, 251, 255, 8, 4, 251, 254, 8, 4, 252, 1, - 8, 4, 252, 0, 8, 4, 229, 248, 8, 4, 229, 247, 8, 4, 229, 253, 8, 4, 229, - 249, 8, 4, 229, 250, 8, 4, 229, 252, 8, 4, 229, 251, 8, 4, 229, 255, 8, - 4, 229, 254, 8, 4, 230, 1, 8, 4, 230, 0, 8, 4, 229, 244, 8, 4, 229, 243, - 8, 4, 229, 246, 8, 4, 229, 245, 8, 4, 229, 238, 8, 4, 229, 237, 8, 4, - 229, 242, 8, 4, 229, 241, 8, 4, 229, 239, 8, 4, 229, 240, 8, 4, 229, 232, - 8, 4, 229, 231, 8, 4, 229, 236, 8, 4, 229, 235, 8, 4, 229, 233, 8, 4, - 229, 234, 8, 4, 241, 96, 8, 4, 241, 95, 8, 4, 241, 101, 8, 4, 241, 97, 8, - 4, 241, 98, 8, 4, 241, 100, 8, 4, 241, 99, 8, 4, 241, 104, 8, 4, 241, - 103, 8, 4, 241, 106, 8, 4, 241, 105, 8, 4, 241, 87, 8, 4, 241, 89, 8, 4, - 241, 88, 8, 4, 241, 92, 8, 4, 241, 91, 8, 4, 241, 94, 8, 4, 241, 93, 8, - 4, 241, 83, 8, 4, 241, 82, 8, 4, 241, 90, 8, 4, 241, 86, 8, 4, 241, 84, - 8, 4, 241, 85, 8, 4, 241, 77, 8, 4, 241, 81, 8, 4, 241, 80, 8, 4, 241, - 78, 8, 4, 241, 79, 8, 4, 230, 241, 8, 4, 230, 240, 8, 4, 231, 42, 8, 4, - 230, 247, 8, 4, 231, 16, 8, 4, 231, 34, 8, 4, 231, 32, 8, 4, 231, 202, 8, - 4, 231, 198, 8, 4, 188, 8, 4, 231, 235, 8, 4, 230, 144, 8, 4, 230, 143, - 8, 4, 230, 147, 8, 4, 230, 145, 8, 4, 230, 191, 8, 4, 230, 177, 8, 4, - 230, 231, 8, 4, 230, 196, 8, 4, 231, 93, 8, 4, 231, 156, 8, 4, 230, 125, - 8, 4, 230, 122, 8, 4, 230, 172, 8, 4, 230, 140, 8, 4, 230, 133, 8, 4, - 230, 138, 8, 4, 230, 100, 8, 4, 230, 99, 8, 4, 230, 105, 8, 4, 230, 102, - 8, 4, 244, 52, 8, 4, 244, 47, 8, 4, 244, 90, 8, 4, 244, 67, 8, 4, 244, - 135, 8, 4, 244, 126, 8, 4, 244, 164, 8, 4, 244, 138, 8, 4, 243, 229, 8, - 4, 244, 12, 8, 4, 243, 252, 8, 4, 243, 190, 8, 4, 243, 189, 8, 4, 243, - 205, 8, 4, 243, 195, 8, 4, 243, 193, 8, 4, 243, 194, 8, 4, 243, 180, 8, - 4, 243, 179, 8, 4, 243, 183, 8, 4, 243, 181, 8, 4, 214, 125, 8, 4, 214, - 120, 8, 4, 214, 154, 8, 4, 214, 134, 8, 4, 214, 146, 8, 4, 214, 143, 8, - 4, 214, 148, 8, 4, 214, 147, 8, 4, 214, 239, 8, 4, 214, 235, 8, 4, 215, - 1, 8, 4, 214, 250, 8, 4, 214, 106, 8, 4, 214, 102, 8, 4, 214, 119, 8, 4, - 214, 107, 8, 4, 214, 155, 8, 4, 214, 221, 8, 4, 214, 93, 8, 4, 214, 92, - 8, 4, 214, 99, 8, 4, 214, 96, 8, 4, 214, 94, 8, 4, 214, 95, 8, 4, 214, - 86, 8, 4, 214, 85, 8, 4, 214, 90, 8, 4, 214, 89, 8, 4, 214, 87, 8, 4, - 214, 88, 8, 4, 247, 130, 8, 4, 247, 118, 8, 4, 247, 211, 8, 4, 247, 155, - 8, 4, 247, 188, 8, 4, 247, 192, 8, 4, 247, 191, 8, 4, 248, 98, 8, 4, 248, - 93, 8, 4, 248, 164, 8, 4, 248, 117, 8, 4, 246, 17, 8, 4, 246, 18, 8, 4, - 247, 74, 8, 4, 246, 56, 8, 4, 247, 99, 8, 4, 247, 76, 8, 4, 247, 237, 8, - 4, 248, 41, 8, 4, 247, 252, 8, 4, 246, 8, 8, 4, 246, 6, 8, 4, 246, 33, 8, - 4, 246, 16, 8, 4, 246, 11, 8, 4, 246, 14, 8, 4, 217, 20, 8, 4, 217, 14, - 8, 4, 217, 71, 8, 4, 217, 29, 8, 4, 217, 63, 8, 4, 217, 65, 8, 4, 217, - 64, 8, 4, 217, 253, 8, 4, 217, 240, 8, 4, 218, 52, 8, 4, 218, 5, 8, 4, - 216, 66, 8, 4, 216, 65, 8, 4, 216, 68, 8, 4, 216, 67, 8, 4, 216, 218, 8, - 4, 216, 214, 8, 4, 108, 8, 4, 216, 226, 8, 4, 217, 166, 8, 4, 217, 229, - 8, 4, 217, 190, 8, 4, 216, 52, 8, 4, 216, 48, 8, 4, 216, 82, 8, 4, 216, - 64, 8, 4, 216, 53, 8, 4, 216, 62, 8, 4, 248, 58, 8, 4, 248, 57, 8, 4, - 248, 63, 8, 4, 248, 59, 8, 4, 248, 60, 8, 4, 248, 62, 8, 4, 248, 61, 8, - 4, 248, 79, 8, 4, 248, 78, 8, 4, 248, 86, 8, 4, 248, 80, 8, 4, 248, 48, - 8, 4, 248, 50, 8, 4, 248, 49, 8, 4, 248, 53, 8, 4, 248, 52, 8, 4, 248, - 56, 8, 4, 248, 54, 8, 4, 248, 71, 8, 4, 248, 74, 8, 4, 248, 72, 8, 4, - 248, 44, 8, 4, 248, 43, 8, 4, 248, 51, 8, 4, 248, 47, 8, 4, 248, 45, 8, - 4, 248, 46, 8, 4, 229, 206, 8, 4, 229, 205, 8, 4, 229, 213, 8, 4, 229, - 208, 8, 4, 229, 209, 8, 4, 229, 210, 8, 4, 229, 222, 8, 4, 229, 221, 8, - 4, 229, 228, 8, 4, 229, 223, 8, 4, 229, 198, 8, 4, 229, 197, 8, 4, 229, - 204, 8, 4, 229, 199, 8, 4, 229, 214, 8, 4, 229, 220, 8, 4, 229, 218, 8, - 4, 229, 190, 8, 4, 229, 189, 8, 4, 229, 195, 8, 4, 229, 193, 8, 4, 229, - 191, 8, 4, 229, 192, 8, 4, 241, 63, 8, 4, 241, 62, 8, 4, 241, 69, 8, 4, - 241, 64, 8, 4, 241, 66, 8, 4, 241, 65, 8, 4, 241, 68, 8, 4, 241, 67, 8, - 4, 241, 74, 8, 4, 241, 73, 8, 4, 241, 76, 8, 4, 241, 75, 8, 4, 241, 57, - 8, 4, 241, 58, 8, 4, 241, 60, 8, 4, 241, 59, 8, 4, 241, 61, 8, 4, 241, - 70, 8, 4, 241, 72, 8, 4, 241, 71, 8, 4, 241, 56, 8, 4, 229, 20, 8, 4, - 229, 18, 8, 4, 229, 64, 8, 4, 229, 23, 8, 4, 229, 46, 8, 4, 229, 60, 8, - 4, 229, 59, 8, 4, 230, 5, 8, 4, 205, 8, 4, 230, 17, 8, 4, 228, 42, 8, 4, - 228, 44, 8, 4, 228, 43, 8, 4, 228, 162, 8, 4, 228, 149, 8, 4, 228, 185, - 8, 4, 228, 171, 8, 4, 229, 165, 8, 4, 229, 187, 8, 4, 229, 176, 8, 4, - 228, 37, 8, 4, 228, 34, 8, 4, 228, 92, 8, 4, 228, 41, 8, 4, 228, 39, 8, - 4, 228, 40, 8, 4, 241, 127, 8, 4, 241, 126, 8, 4, 241, 132, 8, 4, 241, - 128, 8, 4, 241, 129, 8, 4, 241, 131, 8, 4, 241, 130, 8, 4, 241, 137, 8, - 4, 241, 136, 8, 4, 241, 139, 8, 4, 241, 138, 8, 4, 241, 119, 8, 4, 241, - 121, 8, 4, 241, 120, 8, 4, 241, 123, 8, 4, 241, 125, 8, 4, 241, 124, 8, - 4, 241, 133, 8, 4, 241, 135, 8, 4, 241, 134, 8, 4, 241, 115, 8, 4, 241, - 114, 8, 4, 241, 122, 8, 4, 241, 118, 8, 4, 241, 116, 8, 4, 241, 117, 8, - 4, 241, 109, 8, 4, 241, 108, 8, 4, 241, 113, 8, 4, 241, 112, 8, 4, 241, - 110, 8, 4, 241, 111, 8, 4, 232, 224, 8, 4, 232, 218, 8, 4, 233, 13, 8, 4, - 232, 231, 8, 4, 233, 5, 8, 4, 233, 4, 8, 4, 233, 8, 8, 4, 233, 6, 8, 4, - 233, 102, 8, 4, 233, 93, 8, 4, 233, 157, 8, 4, 233, 111, 8, 4, 232, 137, - 8, 4, 232, 136, 8, 4, 232, 139, 8, 4, 232, 138, 8, 4, 232, 171, 8, 4, - 232, 161, 8, 4, 232, 208, 8, 4, 232, 175, 8, 4, 233, 28, 8, 4, 233, 82, - 8, 4, 233, 41, 8, 4, 232, 132, 8, 4, 232, 131, 8, 4, 232, 156, 8, 4, 232, - 135, 8, 4, 232, 133, 8, 4, 232, 134, 8, 4, 232, 114, 8, 4, 232, 113, 8, - 4, 232, 121, 8, 4, 232, 117, 8, 4, 232, 115, 8, 4, 232, 116, 8, 4, 242, - 165, 8, 4, 242, 164, 8, 4, 242, 190, 8, 4, 242, 175, 8, 4, 242, 182, 8, - 4, 242, 181, 8, 4, 242, 184, 8, 4, 242, 183, 8, 4, 243, 65, 8, 4, 243, - 60, 8, 4, 243, 110, 8, 4, 243, 75, 8, 4, 242, 72, 8, 4, 242, 71, 8, 4, - 242, 74, 8, 4, 242, 73, 8, 4, 242, 130, 8, 4, 242, 128, 8, 4, 242, 150, - 8, 4, 242, 138, 8, 4, 243, 9, 8, 4, 243, 7, 8, 4, 243, 38, 8, 4, 243, 20, - 8, 4, 242, 62, 8, 4, 242, 61, 8, 4, 242, 92, 8, 4, 242, 70, 8, 4, 242, - 63, 8, 4, 242, 69, 8, 4, 234, 70, 8, 4, 234, 69, 8, 4, 234, 101, 8, 4, - 234, 84, 8, 4, 234, 94, 8, 4, 234, 97, 8, 4, 234, 95, 8, 4, 234, 207, 8, - 4, 234, 196, 8, 4, 181, 8, 4, 234, 233, 8, 4, 233, 221, 8, 4, 233, 226, - 8, 4, 233, 223, 8, 4, 234, 9, 8, 4, 234, 5, 8, 4, 234, 37, 8, 4, 234, 16, - 8, 4, 234, 162, 8, 4, 234, 146, 8, 4, 234, 188, 8, 4, 234, 165, 8, 4, - 233, 210, 8, 4, 233, 208, 8, 4, 233, 238, 8, 4, 233, 220, 8, 4, 233, 213, - 8, 4, 233, 217, 8, 4, 242, 247, 8, 4, 242, 246, 8, 4, 242, 251, 8, 4, - 242, 248, 8, 4, 242, 250, 8, 4, 242, 249, 8, 4, 243, 2, 8, 4, 243, 1, 8, - 4, 243, 5, 8, 4, 243, 3, 8, 4, 242, 238, 8, 4, 242, 237, 8, 4, 242, 240, - 8, 4, 242, 239, 8, 4, 242, 243, 8, 4, 242, 242, 8, 4, 242, 245, 8, 4, - 242, 244, 8, 4, 242, 253, 8, 4, 242, 252, 8, 4, 243, 0, 8, 4, 242, 254, - 8, 4, 242, 233, 8, 4, 242, 232, 8, 4, 242, 241, 8, 4, 242, 236, 8, 4, - 242, 234, 8, 4, 242, 235, 8, 4, 231, 60, 8, 4, 231, 61, 8, 4, 231, 79, 8, - 4, 231, 78, 8, 4, 231, 81, 8, 4, 231, 80, 8, 4, 231, 51, 8, 4, 231, 53, - 8, 4, 231, 52, 8, 4, 231, 56, 8, 4, 231, 55, 8, 4, 231, 58, 8, 4, 231, - 57, 8, 4, 231, 62, 8, 4, 231, 64, 8, 4, 231, 63, 8, 4, 231, 47, 8, 4, - 231, 46, 8, 4, 231, 54, 8, 4, 231, 50, 8, 4, 231, 48, 8, 4, 231, 49, 8, - 4, 240, 172, 8, 4, 240, 171, 8, 4, 240, 178, 8, 4, 240, 173, 8, 4, 240, - 175, 8, 4, 240, 174, 8, 4, 240, 177, 8, 4, 240, 176, 8, 4, 240, 183, 8, - 4, 240, 182, 8, 4, 240, 185, 8, 4, 240, 184, 8, 4, 240, 164, 8, 4, 240, - 163, 8, 4, 240, 166, 8, 4, 240, 165, 8, 4, 240, 168, 8, 4, 240, 167, 8, - 4, 240, 170, 8, 4, 240, 169, 8, 4, 240, 179, 8, 4, 240, 181, 8, 4, 240, - 180, 8, 4, 229, 110, 8, 4, 229, 112, 8, 4, 229, 111, 8, 4, 229, 150, 8, - 4, 229, 149, 8, 4, 229, 159, 8, 4, 229, 153, 8, 4, 229, 73, 8, 4, 229, - 72, 8, 4, 229, 74, 8, 4, 229, 82, 8, 4, 229, 79, 8, 4, 229, 90, 8, 4, - 229, 84, 8, 4, 229, 143, 8, 4, 229, 148, 8, 4, 229, 145, 8, 4, 241, 142, - 8, 4, 241, 152, 8, 4, 241, 160, 8, 4, 241, 234, 8, 4, 241, 227, 8, 4, - 159, 8, 4, 241, 245, 8, 4, 240, 196, 8, 4, 240, 195, 8, 4, 240, 198, 8, - 4, 240, 197, 8, 4, 240, 229, 8, 4, 240, 220, 8, 4, 241, 54, 8, 4, 241, - 34, 8, 4, 241, 179, 8, 4, 241, 222, 8, 4, 241, 190, 8, 4, 214, 27, 8, 4, - 214, 12, 8, 4, 214, 49, 8, 4, 214, 35, 8, 4, 213, 173, 8, 4, 213, 175, 8, - 4, 213, 174, 8, 4, 213, 191, 8, 4, 213, 214, 8, 4, 213, 197, 8, 4, 213, - 246, 8, 4, 214, 6, 8, 4, 213, 251, 8, 4, 212, 23, 8, 4, 212, 22, 8, 4, - 212, 37, 8, 4, 212, 25, 8, 4, 212, 30, 8, 4, 212, 32, 8, 4, 212, 31, 8, - 4, 212, 95, 8, 4, 212, 92, 8, 4, 212, 109, 8, 4, 212, 98, 8, 4, 212, 1, - 8, 4, 212, 3, 8, 4, 212, 2, 8, 4, 212, 12, 8, 4, 212, 11, 8, 4, 212, 16, - 8, 4, 212, 13, 8, 4, 212, 77, 8, 4, 212, 87, 8, 4, 212, 81, 8, 4, 211, - 253, 8, 4, 211, 252, 8, 4, 212, 8, 8, 4, 212, 0, 8, 4, 211, 254, 8, 4, - 211, 255, 8, 4, 211, 244, 8, 4, 211, 243, 8, 4, 211, 249, 8, 4, 211, 247, - 8, 4, 211, 245, 8, 4, 211, 246, 8, 4, 249, 221, 8, 4, 249, 217, 8, 4, - 249, 244, 8, 4, 249, 230, 8, 4, 249, 241, 8, 4, 249, 235, 8, 4, 249, 243, - 8, 4, 249, 242, 8, 4, 250, 156, 8, 4, 250, 150, 8, 4, 250, 219, 8, 4, - 250, 183, 8, 4, 249, 45, 8, 4, 249, 47, 8, 4, 249, 46, 8, 4, 249, 92, 8, - 4, 249, 83, 8, 4, 249, 175, 8, 4, 249, 108, 8, 4, 250, 94, 8, 4, 250, - 124, 8, 4, 250, 99, 8, 4, 249, 26, 8, 4, 249, 25, 8, 4, 249, 53, 8, 4, - 249, 43, 8, 4, 249, 31, 8, 4, 249, 42, 8, 4, 249, 6, 8, 4, 249, 5, 8, 4, - 249, 16, 8, 4, 249, 12, 8, 4, 249, 7, 8, 4, 249, 9, 8, 4, 211, 227, 8, 4, - 211, 226, 8, 4, 211, 233, 8, 4, 211, 228, 8, 4, 211, 230, 8, 4, 211, 229, - 8, 4, 211, 232, 8, 4, 211, 231, 8, 4, 211, 239, 8, 4, 211, 238, 8, 4, - 211, 242, 8, 4, 211, 240, 8, 4, 211, 223, 8, 4, 211, 225, 8, 4, 211, 224, - 8, 4, 211, 234, 8, 4, 211, 237, 8, 4, 211, 235, 8, 4, 211, 218, 8, 4, - 211, 222, 8, 4, 211, 221, 8, 4, 211, 219, 8, 4, 211, 220, 8, 4, 211, 213, - 8, 4, 211, 212, 8, 4, 211, 217, 8, 4, 211, 216, 8, 4, 211, 214, 8, 4, - 211, 215, 8, 4, 227, 224, 8, 4, 227, 223, 8, 4, 227, 229, 8, 4, 227, 225, - 8, 4, 227, 226, 8, 4, 227, 228, 8, 4, 227, 227, 8, 4, 227, 234, 8, 4, - 227, 233, 8, 4, 227, 237, 8, 4, 227, 236, 8, 4, 227, 217, 8, 4, 227, 218, - 8, 4, 227, 221, 8, 4, 227, 222, 8, 4, 227, 230, 8, 4, 227, 232, 8, 4, - 227, 212, 8, 4, 227, 220, 8, 4, 227, 216, 8, 4, 227, 213, 8, 4, 227, 214, - 8, 4, 227, 207, 8, 4, 227, 206, 8, 4, 227, 211, 8, 4, 227, 210, 8, 4, - 227, 208, 8, 4, 227, 209, 8, 4, 220, 55, 8, 4, 189, 8, 4, 220, 117, 8, 4, - 220, 58, 8, 4, 220, 109, 8, 4, 220, 112, 8, 4, 220, 110, 8, 4, 222, 142, - 8, 4, 222, 132, 8, 4, 222, 202, 8, 4, 222, 150, 8, 4, 218, 228, 8, 4, - 218, 230, 8, 4, 218, 229, 8, 4, 219, 221, 8, 4, 219, 210, 8, 4, 219, 242, - 8, 4, 219, 224, 8, 4, 221, 35, 8, 4, 222, 100, 8, 4, 221, 59, 8, 4, 218, - 206, 8, 4, 218, 204, 8, 4, 219, 27, 8, 4, 218, 227, 8, 4, 218, 209, 8, 4, - 218, 217, 8, 4, 218, 113, 8, 4, 218, 112, 8, 4, 218, 177, 8, 4, 218, 119, - 8, 4, 218, 114, 8, 4, 218, 118, 8, 4, 219, 123, 8, 4, 219, 122, 8, 4, - 219, 128, 8, 4, 219, 124, 8, 4, 219, 125, 8, 4, 219, 127, 8, 4, 219, 126, - 8, 4, 219, 135, 8, 4, 219, 134, 8, 4, 219, 157, 8, 4, 219, 136, 8, 4, - 219, 119, 8, 4, 219, 118, 8, 4, 219, 121, 8, 4, 219, 120, 8, 4, 219, 130, - 8, 4, 219, 133, 8, 4, 219, 131, 8, 4, 219, 115, 8, 4, 219, 114, 8, 4, - 219, 117, 8, 4, 219, 116, 8, 4, 219, 109, 8, 4, 219, 108, 8, 4, 219, 113, - 8, 4, 219, 112, 8, 4, 219, 110, 8, 4, 219, 111, 8, 4, 212, 70, 8, 4, 212, - 69, 8, 4, 212, 75, 8, 4, 212, 72, 8, 4, 212, 52, 8, 4, 212, 54, 8, 4, - 212, 53, 8, 4, 212, 57, 8, 4, 212, 56, 8, 4, 212, 60, 8, 4, 212, 58, 8, - 4, 212, 64, 8, 4, 212, 63, 8, 4, 212, 67, 8, 4, 212, 65, 8, 4, 212, 48, - 8, 4, 212, 47, 8, 4, 212, 55, 8, 4, 212, 51, 8, 4, 212, 49, 8, 4, 212, - 50, 8, 4, 212, 40, 8, 4, 212, 39, 8, 4, 212, 44, 8, 4, 212, 43, 8, 4, - 212, 41, 8, 4, 212, 42, 8, 4, 250, 72, 8, 4, 250, 69, 8, 4, 250, 92, 8, - 4, 250, 80, 8, 4, 250, 2, 8, 4, 250, 1, 8, 4, 250, 4, 8, 4, 250, 3, 8, 4, - 250, 16, 8, 4, 250, 15, 8, 4, 250, 23, 8, 4, 250, 18, 8, 4, 250, 52, 8, - 4, 250, 50, 8, 4, 250, 67, 8, 4, 250, 58, 8, 4, 249, 252, 8, 4, 250, 6, - 8, 4, 250, 0, 8, 4, 249, 253, 8, 4, 249, 255, 8, 4, 249, 246, 8, 4, 249, - 245, 8, 4, 249, 250, 8, 4, 249, 249, 8, 4, 249, 247, 8, 4, 249, 248, 8, - 4, 223, 80, 8, 4, 223, 81, 8, 4, 223, 67, 8, 4, 223, 68, 8, 4, 223, 71, - 8, 4, 223, 70, 8, 4, 223, 73, 8, 4, 223, 72, 8, 4, 223, 75, 8, 4, 223, - 74, 8, 4, 223, 79, 8, 4, 223, 76, 8, 4, 223, 63, 8, 4, 223, 62, 8, 4, - 223, 69, 8, 4, 223, 66, 8, 4, 223, 64, 8, 4, 223, 65, 8, 4, 223, 57, 8, - 4, 223, 56, 8, 4, 223, 61, 8, 4, 223, 60, 8, 4, 223, 58, 8, 4, 223, 59, - 8, 4, 228, 145, 8, 4, 228, 144, 8, 4, 228, 147, 8, 4, 228, 146, 8, 4, - 228, 137, 8, 4, 228, 139, 8, 4, 228, 138, 8, 4, 228, 141, 8, 4, 228, 140, - 8, 4, 228, 143, 8, 4, 228, 142, 8, 4, 228, 132, 8, 4, 228, 131, 8, 4, - 228, 136, 8, 4, 228, 135, 8, 4, 228, 133, 8, 4, 228, 134, 8, 4, 228, 126, - 8, 4, 228, 125, 8, 4, 228, 130, 8, 4, 228, 129, 8, 4, 228, 127, 8, 4, - 228, 128, 8, 4, 220, 251, 8, 4, 220, 247, 8, 4, 221, 24, 8, 4, 221, 6, 8, - 4, 220, 140, 8, 4, 220, 142, 8, 4, 220, 141, 8, 4, 220, 160, 8, 4, 220, - 157, 8, 4, 220, 187, 8, 4, 220, 178, 8, 4, 220, 222, 8, 4, 220, 215, 8, - 4, 220, 243, 8, 4, 220, 230, 8, 4, 220, 136, 8, 4, 220, 135, 8, 4, 220, - 150, 8, 4, 220, 139, 8, 4, 220, 137, 8, 4, 220, 138, 8, 4, 220, 120, 8, - 4, 220, 119, 8, 4, 220, 126, 8, 4, 220, 123, 8, 4, 220, 121, 8, 4, 220, - 122, 8, 4, 224, 33, 8, 4, 224, 28, 8, 4, 203, 8, 4, 224, 39, 8, 4, 223, - 31, 8, 4, 223, 33, 8, 4, 223, 32, 8, 4, 223, 90, 8, 4, 223, 83, 8, 4, - 223, 112, 8, 4, 223, 94, 8, 4, 223, 196, 8, 4, 224, 21, 8, 4, 223, 231, - 8, 4, 223, 24, 8, 4, 223, 22, 8, 4, 223, 51, 8, 4, 223, 30, 8, 4, 223, - 26, 8, 4, 223, 27, 8, 4, 223, 7, 8, 4, 223, 6, 8, 4, 223, 12, 8, 4, 223, - 10, 8, 4, 223, 8, 8, 4, 223, 9, 8, 4, 235, 101, 8, 4, 235, 100, 8, 4, - 235, 110, 8, 4, 235, 102, 8, 4, 235, 106, 8, 4, 235, 105, 8, 4, 235, 108, - 8, 4, 235, 107, 8, 4, 235, 44, 8, 4, 235, 43, 8, 4, 235, 46, 8, 4, 235, - 45, 8, 4, 235, 59, 8, 4, 235, 57, 8, 4, 235, 71, 8, 4, 235, 61, 8, 4, - 235, 38, 8, 4, 235, 36, 8, 4, 235, 54, 8, 4, 235, 42, 8, 4, 235, 39, 8, - 4, 235, 40, 8, 4, 235, 30, 8, 4, 235, 29, 8, 4, 235, 34, 8, 4, 235, 33, - 8, 4, 235, 31, 8, 4, 235, 32, 8, 4, 224, 191, 8, 4, 224, 189, 8, 4, 224, - 198, 8, 4, 224, 192, 8, 4, 224, 195, 8, 4, 224, 194, 8, 4, 224, 197, 8, - 4, 224, 196, 8, 4, 224, 144, 8, 4, 224, 141, 8, 4, 224, 146, 8, 4, 224, - 145, 8, 4, 224, 178, 8, 4, 224, 177, 8, 4, 224, 187, 8, 4, 224, 181, 8, - 4, 224, 136, 8, 4, 224, 132, 8, 4, 224, 175, 8, 4, 224, 140, 8, 4, 224, - 138, 8, 4, 224, 139, 8, 4, 224, 116, 8, 4, 224, 114, 8, 4, 224, 126, 8, - 4, 224, 119, 8, 4, 224, 117, 8, 4, 224, 118, 8, 4, 235, 90, 8, 4, 235, - 89, 8, 4, 235, 96, 8, 4, 235, 91, 8, 4, 235, 93, 8, 4, 235, 92, 8, 4, - 235, 95, 8, 4, 235, 94, 8, 4, 235, 81, 8, 4, 235, 83, 8, 4, 235, 82, 8, - 4, 235, 86, 8, 4, 235, 85, 8, 4, 235, 88, 8, 4, 235, 87, 8, 4, 235, 77, - 8, 4, 235, 76, 8, 4, 235, 84, 8, 4, 235, 80, 8, 4, 235, 78, 8, 4, 235, - 79, 8, 4, 235, 73, 8, 4, 235, 72, 8, 4, 235, 75, 8, 4, 235, 74, 8, 4, - 228, 249, 8, 4, 228, 248, 8, 4, 229, 0, 8, 4, 228, 250, 8, 4, 228, 252, - 8, 4, 228, 251, 8, 4, 228, 255, 8, 4, 228, 253, 8, 4, 228, 238, 8, 4, - 228, 239, 8, 4, 228, 244, 8, 4, 228, 243, 8, 4, 228, 247, 8, 4, 228, 245, - 8, 4, 228, 233, 8, 4, 228, 242, 8, 4, 228, 237, 8, 4, 228, 234, 8, 4, - 228, 235, 8, 4, 228, 228, 8, 4, 228, 227, 8, 4, 228, 232, 8, 4, 228, 231, - 8, 4, 228, 229, 8, 4, 228, 230, 8, 4, 228, 0, 8, 4, 227, 255, 8, 4, 228, - 10, 8, 4, 228, 4, 8, 4, 228, 7, 8, 4, 228, 6, 8, 4, 228, 9, 8, 4, 228, 8, - 8, 4, 227, 243, 8, 4, 227, 245, 8, 4, 227, 244, 8, 4, 227, 249, 8, 4, - 227, 248, 8, 4, 227, 253, 8, 4, 227, 250, 8, 4, 227, 241, 8, 4, 227, 240, - 8, 4, 227, 247, 8, 4, 227, 242, 8, 4, 213, 138, 8, 4, 213, 137, 8, 4, - 213, 145, 8, 4, 213, 140, 8, 4, 213, 142, 8, 4, 213, 141, 8, 4, 213, 144, - 8, 4, 213, 143, 8, 4, 213, 127, 8, 4, 213, 128, 8, 4, 213, 132, 8, 4, - 213, 131, 8, 4, 213, 136, 8, 4, 213, 134, 8, 4, 213, 109, 8, 4, 213, 107, - 8, 4, 213, 119, 8, 4, 213, 112, 8, 4, 213, 110, 8, 4, 213, 111, 8, 4, - 212, 241, 8, 4, 212, 239, 8, 4, 212, 255, 8, 4, 212, 242, 8, 4, 212, 249, - 8, 4, 212, 248, 8, 4, 212, 252, 8, 4, 212, 250, 8, 4, 212, 182, 8, 4, - 212, 181, 8, 4, 212, 185, 8, 4, 212, 183, 8, 4, 212, 215, 8, 4, 212, 212, - 8, 4, 212, 235, 8, 4, 212, 219, 8, 4, 212, 173, 8, 4, 212, 170, 8, 4, - 212, 203, 8, 4, 212, 180, 8, 4, 212, 176, 8, 4, 212, 177, 8, 4, 212, 155, - 8, 4, 212, 154, 8, 4, 212, 161, 8, 4, 212, 158, 8, 4, 212, 156, 8, 4, - 212, 157, 8, 34, 224, 178, 8, 34, 233, 13, 8, 34, 234, 70, 8, 34, 228, 4, - 8, 34, 249, 12, 8, 34, 219, 128, 8, 34, 242, 244, 8, 34, 243, 20, 8, 34, - 231, 42, 8, 34, 240, 172, 8, 34, 232, 116, 8, 34, 252, 3, 8, 34, 230, - 196, 8, 34, 212, 235, 8, 34, 225, 8, 8, 34, 240, 166, 8, 34, 217, 253, 8, - 34, 243, 110, 8, 34, 212, 0, 8, 34, 249, 6, 8, 34, 248, 46, 8, 34, 251, - 27, 8, 34, 242, 240, 8, 34, 227, 250, 8, 34, 216, 82, 8, 34, 227, 41, 8, - 34, 235, 77, 8, 34, 212, 12, 8, 34, 224, 244, 8, 34, 241, 94, 8, 34, 212, - 241, 8, 34, 214, 95, 8, 34, 220, 126, 8, 34, 214, 221, 8, 34, 212, 109, - 8, 34, 235, 71, 8, 34, 227, 216, 8, 34, 235, 75, 8, 34, 242, 130, 8, 34, - 235, 95, 8, 34, 213, 214, 8, 34, 246, 33, 8, 34, 220, 138, 8, 34, 233, 8, - 8, 34, 249, 16, 8, 34, 249, 46, 8, 34, 249, 230, 8, 34, 240, 169, 8, 34, - 220, 251, 8, 34, 211, 255, 8, 34, 220, 178, 8, 34, 250, 67, 8, 34, 211, - 230, 8, 34, 229, 252, 8, 34, 234, 188, 232, 225, 1, 252, 107, 232, 225, - 1, 193, 232, 225, 1, 226, 23, 232, 225, 1, 248, 164, 232, 225, 1, 218, - 52, 232, 225, 1, 217, 161, 232, 225, 1, 243, 110, 232, 225, 1, 181, 232, - 225, 1, 234, 138, 232, 225, 1, 235, 139, 232, 225, 1, 250, 219, 232, 225, - 1, 250, 92, 232, 225, 1, 245, 249, 232, 225, 1, 216, 141, 232, 225, 1, - 216, 133, 232, 225, 1, 188, 232, 225, 1, 205, 232, 225, 1, 233, 157, 232, - 225, 1, 222, 202, 232, 225, 1, 212, 75, 232, 225, 1, 212, 109, 232, 225, - 1, 229, 159, 232, 225, 1, 159, 232, 225, 1, 213, 153, 232, 225, 1, 241, - 174, 232, 225, 1, 244, 164, 232, 225, 1, 214, 49, 232, 225, 1, 221, 24, - 232, 225, 1, 186, 232, 225, 1, 242, 225, 232, 225, 1, 61, 232, 225, 1, - 254, 148, 232, 225, 1, 74, 232, 225, 1, 245, 22, 232, 225, 1, 72, 232, - 225, 1, 75, 232, 225, 1, 69, 232, 225, 1, 215, 183, 232, 225, 1, 215, - 178, 232, 225, 1, 227, 99, 232, 225, 1, 160, 230, 104, 217, 71, 232, 225, - 1, 160, 230, 46, 225, 150, 232, 225, 1, 160, 230, 104, 249, 15, 232, 225, - 1, 160, 230, 104, 251, 128, 232, 225, 1, 160, 230, 104, 205, 232, 225, 1, - 160, 230, 104, 235, 116, 232, 225, 225, 27, 249, 157, 232, 225, 225, 27, - 243, 200, 219, 69, 39, 4, 245, 165, 39, 4, 245, 162, 39, 4, 241, 204, 39, - 4, 214, 1, 39, 4, 214, 0, 39, 4, 226, 86, 39, 4, 251, 191, 39, 4, 251, - 242, 39, 4, 231, 179, 39, 4, 234, 0, 39, 4, 231, 73, 39, 4, 243, 51, 39, - 4, 244, 116, 39, 4, 214, 227, 39, 4, 217, 219, 39, 4, 217, 147, 39, 4, - 247, 224, 39, 4, 247, 221, 39, 4, 233, 74, 39, 4, 224, 1, 39, 4, 248, 28, - 39, 4, 229, 219, 39, 4, 222, 89, 39, 4, 220, 241, 39, 4, 212, 85, 39, 4, - 212, 66, 39, 4, 250, 116, 39, 4, 235, 125, 39, 4, 229, 7, 39, 4, 213, 35, - 39, 4, 234, 187, 39, 4, 229, 136, 39, 4, 243, 31, 39, 4, 231, 145, 39, 4, - 229, 184, 39, 4, 228, 16, 39, 4, 72, 39, 4, 235, 251, 39, 4, 241, 165, - 39, 4, 241, 146, 39, 4, 213, 235, 39, 4, 213, 226, 39, 4, 225, 240, 39, - 4, 251, 189, 39, 4, 251, 184, 39, 4, 231, 172, 39, 4, 233, 253, 39, 4, - 231, 70, 39, 4, 243, 47, 39, 4, 244, 90, 39, 4, 214, 154, 39, 4, 217, 71, - 39, 4, 217, 128, 39, 4, 247, 216, 39, 4, 247, 220, 39, 4, 233, 13, 39, 4, - 223, 188, 39, 4, 247, 211, 39, 4, 229, 213, 39, 4, 220, 117, 39, 4, 220, - 212, 39, 4, 212, 37, 39, 4, 212, 62, 39, 4, 249, 244, 39, 4, 235, 110, - 39, 4, 229, 0, 39, 4, 212, 255, 39, 4, 234, 101, 39, 4, 229, 128, 39, 4, - 242, 190, 39, 4, 231, 42, 39, 4, 229, 64, 39, 4, 228, 10, 39, 4, 61, 39, - 4, 254, 32, 39, 4, 229, 155, 39, 4, 159, 39, 4, 242, 1, 39, 4, 214, 49, - 39, 4, 214, 39, 39, 4, 193, 39, 4, 251, 195, 39, 4, 252, 107, 39, 4, 231, - 187, 39, 4, 234, 4, 39, 4, 234, 3, 39, 4, 231, 77, 39, 4, 243, 55, 39, 4, - 244, 164, 39, 4, 215, 1, 39, 4, 218, 52, 39, 4, 217, 161, 39, 4, 247, - 232, 39, 4, 247, 223, 39, 4, 233, 157, 39, 4, 203, 39, 4, 248, 164, 39, - 4, 229, 228, 39, 4, 222, 202, 39, 4, 221, 24, 39, 4, 212, 109, 39, 4, - 212, 75, 39, 4, 250, 219, 39, 4, 235, 139, 39, 4, 229, 16, 39, 4, 186, - 39, 4, 181, 39, 4, 234, 239, 39, 4, 229, 141, 39, 4, 243, 110, 39, 4, - 188, 39, 4, 205, 39, 4, 228, 23, 39, 4, 227, 49, 39, 4, 227, 45, 39, 4, - 241, 39, 39, 4, 213, 202, 39, 4, 213, 198, 39, 4, 225, 129, 39, 4, 251, - 187, 39, 4, 251, 118, 39, 4, 231, 167, 39, 4, 233, 251, 39, 4, 231, 66, - 39, 4, 243, 43, 39, 4, 244, 3, 39, 4, 214, 108, 39, 4, 216, 230, 39, 4, - 217, 106, 39, 4, 247, 214, 39, 4, 247, 218, 39, 4, 232, 180, 39, 4, 223, - 99, 39, 4, 247, 79, 39, 4, 229, 200, 39, 4, 219, 226, 39, 4, 220, 181, - 39, 4, 212, 14, 39, 4, 212, 59, 39, 4, 249, 113, 39, 4, 235, 62, 39, 4, - 228, 246, 39, 4, 212, 220, 39, 4, 234, 19, 39, 4, 229, 126, 39, 4, 242, - 140, 39, 4, 230, 202, 39, 4, 228, 175, 39, 4, 227, 251, 39, 4, 69, 39, 4, - 215, 160, 39, 4, 240, 212, 39, 4, 240, 202, 39, 4, 213, 183, 39, 4, 213, - 177, 39, 4, 225, 35, 39, 4, 251, 186, 39, 4, 251, 54, 39, 4, 231, 166, - 39, 4, 233, 249, 39, 4, 231, 65, 39, 4, 243, 42, 39, 4, 243, 205, 39, 4, - 214, 99, 39, 4, 216, 82, 39, 4, 217, 90, 39, 4, 247, 212, 39, 4, 247, - 217, 39, 4, 232, 156, 39, 4, 223, 51, 39, 4, 246, 33, 39, 4, 229, 195, - 39, 4, 219, 27, 39, 4, 220, 150, 39, 4, 212, 8, 39, 4, 212, 55, 39, 4, - 249, 53, 39, 4, 235, 54, 39, 4, 228, 242, 39, 4, 212, 203, 39, 4, 233, - 238, 39, 4, 229, 125, 39, 4, 242, 92, 39, 4, 230, 172, 39, 4, 228, 92, - 39, 4, 227, 247, 39, 4, 75, 39, 4, 227, 62, 39, 4, 229, 86, 39, 4, 241, - 54, 39, 4, 241, 42, 39, 4, 213, 214, 39, 4, 213, 203, 39, 4, 225, 150, - 39, 4, 251, 188, 39, 4, 251, 128, 39, 4, 231, 168, 39, 4, 233, 252, 39, - 4, 231, 68, 39, 4, 243, 45, 39, 4, 243, 44, 39, 4, 244, 12, 39, 4, 214, - 119, 39, 4, 108, 39, 4, 217, 109, 39, 4, 247, 215, 39, 4, 247, 219, 39, - 4, 232, 208, 39, 4, 223, 112, 39, 4, 247, 99, 39, 4, 229, 204, 39, 4, - 219, 242, 39, 4, 220, 187, 39, 4, 212, 16, 39, 4, 212, 60, 39, 4, 249, - 175, 39, 4, 235, 71, 39, 4, 228, 247, 39, 4, 212, 235, 39, 4, 234, 37, - 39, 4, 229, 127, 39, 4, 242, 150, 39, 4, 230, 231, 39, 4, 228, 185, 39, - 4, 227, 253, 39, 4, 74, 39, 4, 245, 108, 39, 4, 229, 146, 39, 4, 241, - 222, 39, 4, 241, 193, 39, 4, 214, 6, 39, 4, 213, 253, 39, 4, 226, 96, 39, - 4, 251, 192, 39, 4, 251, 251, 39, 4, 231, 180, 39, 4, 234, 1, 39, 4, 233, - 255, 39, 4, 231, 74, 39, 4, 243, 52, 39, 4, 243, 50, 39, 4, 244, 123, 39, - 4, 214, 232, 39, 4, 217, 229, 39, 4, 217, 148, 39, 4, 247, 225, 39, 4, - 247, 222, 39, 4, 233, 82, 39, 4, 224, 21, 39, 4, 248, 41, 39, 4, 229, - 220, 39, 4, 222, 100, 39, 4, 220, 243, 39, 4, 212, 87, 39, 4, 212, 67, - 39, 4, 250, 124, 39, 4, 235, 127, 39, 4, 229, 9, 39, 4, 213, 38, 39, 4, - 234, 188, 39, 4, 229, 137, 39, 4, 229, 133, 39, 4, 243, 38, 39, 4, 243, - 27, 39, 4, 231, 156, 39, 4, 229, 187, 39, 4, 228, 17, 39, 4, 229, 161, - 39, 4, 233, 46, 39, 249, 157, 39, 243, 200, 219, 69, 39, 224, 158, 77, - 39, 4, 229, 203, 244, 164, 39, 4, 229, 203, 181, 39, 4, 229, 203, 219, - 226, 39, 16, 244, 113, 39, 16, 234, 186, 39, 16, 217, 34, 39, 16, 229, - 39, 39, 16, 252, 66, 39, 16, 244, 163, 39, 16, 218, 49, 39, 16, 248, 121, - 39, 16, 247, 78, 39, 16, 233, 227, 39, 16, 216, 234, 39, 16, 247, 98, 39, - 16, 235, 63, 39, 21, 212, 79, 39, 21, 116, 39, 21, 109, 39, 21, 166, 39, - 21, 163, 39, 21, 180, 39, 21, 189, 39, 21, 198, 39, 21, 195, 39, 21, 200, - 39, 4, 229, 203, 188, 39, 4, 229, 203, 247, 99, 33, 6, 1, 212, 83, 33, 3, - 1, 212, 83, 33, 6, 1, 245, 245, 33, 3, 1, 245, 245, 33, 6, 1, 223, 202, - 245, 247, 33, 3, 1, 223, 202, 245, 247, 33, 6, 1, 235, 183, 33, 3, 1, - 235, 183, 33, 6, 1, 247, 113, 33, 3, 1, 247, 113, 33, 6, 1, 230, 210, - 215, 175, 33, 3, 1, 230, 210, 215, 175, 33, 6, 1, 251, 64, 227, 67, 33, - 3, 1, 251, 64, 227, 67, 33, 6, 1, 229, 169, 213, 22, 33, 3, 1, 229, 169, - 213, 22, 33, 6, 1, 213, 19, 2, 252, 102, 213, 22, 33, 3, 1, 213, 19, 2, - 252, 102, 213, 22, 33, 6, 1, 235, 181, 213, 49, 33, 3, 1, 235, 181, 213, - 49, 33, 6, 1, 223, 202, 212, 203, 33, 3, 1, 223, 202, 212, 203, 33, 6, 1, - 235, 181, 61, 33, 3, 1, 235, 181, 61, 33, 6, 1, 249, 193, 232, 221, 212, - 174, 33, 3, 1, 249, 193, 232, 221, 212, 174, 33, 6, 1, 251, 137, 212, - 174, 33, 3, 1, 251, 137, 212, 174, 33, 6, 1, 235, 181, 249, 193, 232, - 221, 212, 174, 33, 3, 1, 235, 181, 249, 193, 232, 221, 212, 174, 33, 6, - 1, 212, 237, 33, 3, 1, 212, 237, 33, 6, 1, 223, 202, 216, 136, 33, 3, 1, - 223, 202, 216, 136, 33, 6, 1, 219, 236, 248, 41, 33, 3, 1, 219, 236, 248, - 41, 33, 6, 1, 219, 236, 245, 131, 33, 3, 1, 219, 236, 245, 131, 33, 6, 1, - 219, 236, 245, 117, 33, 3, 1, 219, 236, 245, 117, 33, 6, 1, 230, 214, 75, - 33, 3, 1, 230, 214, 75, 33, 6, 1, 251, 163, 75, 33, 3, 1, 251, 163, 75, - 33, 6, 1, 51, 230, 214, 75, 33, 3, 1, 51, 230, 214, 75, 33, 1, 230, 156, - 75, 37, 33, 214, 84, 37, 33, 217, 201, 231, 4, 52, 37, 33, 240, 201, 231, - 4, 52, 37, 33, 217, 101, 231, 4, 52, 220, 21, 253, 132, 37, 33, 234, 198, - 37, 33, 226, 101, 33, 234, 198, 33, 226, 101, 33, 6, 1, 246, 1, 33, 3, 1, - 246, 1, 33, 6, 1, 245, 238, 33, 3, 1, 245, 238, 33, 6, 1, 212, 45, 33, 3, - 1, 212, 45, 33, 6, 1, 250, 140, 33, 3, 1, 250, 140, 33, 6, 1, 245, 237, - 33, 3, 1, 245, 237, 33, 6, 1, 217, 230, 2, 231, 37, 101, 33, 3, 1, 217, - 230, 2, 231, 37, 101, 33, 6, 1, 216, 43, 33, 3, 1, 216, 43, 33, 6, 1, - 216, 119, 33, 3, 1, 216, 119, 33, 6, 1, 216, 123, 33, 3, 1, 216, 123, 33, - 6, 1, 217, 235, 33, 3, 1, 217, 235, 33, 6, 1, 240, 190, 33, 3, 1, 240, - 190, 33, 6, 1, 220, 132, 33, 3, 1, 220, 132, 20, 1, 61, 20, 1, 181, 20, - 1, 69, 20, 1, 233, 238, 20, 1, 245, 165, 20, 1, 224, 1, 20, 1, 218, 35, - 20, 1, 75, 20, 1, 228, 10, 20, 1, 72, 20, 1, 233, 157, 20, 1, 193, 20, 1, - 223, 136, 20, 1, 223, 182, 20, 1, 233, 73, 20, 1, 231, 144, 20, 1, 218, - 49, 20, 1, 229, 226, 20, 1, 229, 14, 20, 1, 183, 20, 1, 218, 205, 20, 1, - 230, 172, 20, 1, 220, 207, 20, 1, 220, 117, 20, 1, 220, 217, 20, 1, 221, - 44, 20, 1, 233, 177, 20, 1, 234, 162, 20, 1, 228, 64, 20, 1, 228, 92, 20, - 1, 228, 241, 20, 1, 212, 217, 20, 1, 220, 150, 20, 1, 212, 178, 20, 1, - 186, 20, 1, 228, 120, 20, 1, 234, 148, 20, 1, 226, 27, 20, 1, 229, 7, 20, - 1, 228, 101, 20, 1, 225, 30, 20, 1, 213, 180, 20, 1, 226, 86, 20, 1, 244, - 116, 20, 1, 223, 51, 20, 1, 232, 156, 20, 1, 231, 42, 20, 1, 229, 64, 20, - 1, 223, 204, 20, 1, 224, 61, 20, 1, 234, 171, 20, 1, 229, 93, 20, 1, 229, - 141, 20, 1, 229, 159, 20, 1, 220, 187, 20, 1, 225, 33, 20, 1, 243, 205, - 20, 1, 244, 6, 20, 1, 214, 49, 20, 1, 205, 20, 1, 233, 13, 20, 1, 225, - 240, 20, 1, 232, 174, 20, 1, 234, 37, 20, 1, 231, 177, 20, 1, 223, 233, - 20, 1, 231, 122, 20, 1, 188, 20, 1, 217, 71, 20, 1, 234, 101, 20, 1, 230, - 231, 20, 1, 231, 185, 20, 1, 217, 183, 20, 1, 234, 4, 20, 1, 217, 200, - 20, 1, 228, 93, 20, 1, 222, 166, 20, 1, 244, 160, 20, 1, 234, 6, 20, 1, - 234, 33, 20, 37, 152, 234, 14, 20, 37, 152, 216, 74, 20, 229, 13, 20, - 243, 200, 219, 69, 20, 249, 164, 20, 249, 157, 20, 221, 70, 20, 224, 158, - 77, 59, 1, 250, 33, 160, 212, 245, 225, 193, 59, 1, 250, 33, 160, 213, - 59, 225, 193, 59, 1, 250, 33, 160, 212, 245, 221, 7, 59, 1, 250, 33, 160, - 213, 59, 221, 7, 59, 1, 250, 33, 160, 212, 245, 224, 175, 59, 1, 250, 33, - 160, 213, 59, 224, 175, 59, 1, 250, 33, 160, 212, 245, 223, 51, 59, 1, - 250, 33, 160, 213, 59, 223, 51, 59, 1, 244, 244, 246, 72, 160, 134, 59, - 1, 124, 246, 72, 160, 134, 59, 1, 231, 38, 246, 72, 160, 134, 59, 1, 115, - 246, 72, 160, 134, 59, 1, 244, 243, 246, 72, 160, 134, 59, 1, 244, 244, - 246, 72, 233, 63, 160, 134, 59, 1, 124, 246, 72, 233, 63, 160, 134, 59, - 1, 231, 38, 246, 72, 233, 63, 160, 134, 59, 1, 115, 246, 72, 233, 63, - 160, 134, 59, 1, 244, 243, 246, 72, 233, 63, 160, 134, 59, 1, 244, 244, - 233, 63, 160, 134, 59, 1, 124, 233, 63, 160, 134, 59, 1, 231, 38, 233, - 63, 160, 134, 59, 1, 115, 233, 63, 160, 134, 59, 1, 244, 243, 233, 63, - 160, 134, 59, 1, 62, 71, 134, 59, 1, 62, 220, 23, 59, 1, 62, 199, 134, - 59, 1, 232, 163, 46, 249, 100, 254, 18, 59, 1, 224, 48, 114, 68, 59, 1, - 224, 48, 119, 68, 59, 1, 224, 48, 244, 254, 77, 59, 1, 224, 48, 235, 191, - 244, 254, 77, 59, 1, 115, 235, 191, 244, 254, 77, 59, 1, 219, 51, 24, - 124, 216, 241, 59, 1, 219, 51, 24, 115, 216, 241, 7, 6, 1, 245, 156, 254, - 78, 7, 3, 1, 245, 156, 254, 78, 7, 6, 1, 245, 156, 254, 103, 7, 3, 1, - 245, 156, 254, 103, 7, 6, 1, 241, 191, 7, 3, 1, 241, 191, 7, 6, 1, 216, - 6, 7, 3, 1, 216, 6, 7, 6, 1, 216, 187, 7, 3, 1, 216, 187, 7, 6, 1, 249, - 51, 7, 3, 1, 249, 51, 7, 6, 1, 249, 52, 2, 249, 157, 7, 3, 1, 249, 52, 2, - 249, 157, 7, 1, 3, 6, 244, 230, 7, 1, 3, 6, 197, 7, 6, 1, 254, 232, 7, 3, - 1, 254, 232, 7, 6, 1, 253, 240, 7, 3, 1, 253, 240, 7, 6, 1, 253, 108, 7, - 3, 1, 253, 108, 7, 6, 1, 253, 92, 7, 3, 1, 253, 92, 7, 6, 1, 253, 93, 2, - 199, 134, 7, 3, 1, 253, 93, 2, 199, 134, 7, 6, 1, 253, 83, 7, 3, 1, 253, - 83, 7, 6, 1, 223, 202, 250, 253, 2, 247, 74, 7, 3, 1, 223, 202, 250, 253, - 2, 247, 74, 7, 6, 1, 235, 28, 2, 90, 7, 3, 1, 235, 28, 2, 90, 7, 6, 1, - 235, 28, 2, 247, 207, 90, 7, 3, 1, 235, 28, 2, 247, 207, 90, 7, 6, 1, - 235, 28, 2, 219, 45, 24, 247, 207, 90, 7, 3, 1, 235, 28, 2, 219, 45, 24, - 247, 207, 90, 7, 6, 1, 251, 63, 150, 7, 3, 1, 251, 63, 150, 7, 6, 1, 233, - 171, 2, 124, 90, 7, 3, 1, 233, 171, 2, 124, 90, 7, 6, 1, 157, 2, 184, - 219, 45, 226, 244, 7, 3, 1, 157, 2, 184, 219, 45, 226, 244, 7, 6, 1, 157, - 2, 232, 177, 7, 3, 1, 157, 2, 232, 177, 7, 6, 1, 227, 49, 7, 3, 1, 227, - 49, 7, 6, 1, 226, 230, 2, 219, 45, 217, 93, 247, 246, 7, 3, 1, 226, 230, - 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 226, 230, 2, 244, 22, 7, 3, 1, - 226, 230, 2, 244, 22, 7, 6, 1, 226, 230, 2, 219, 161, 218, 27, 7, 3, 1, - 226, 230, 2, 219, 161, 218, 27, 7, 6, 1, 224, 241, 2, 219, 45, 217, 93, - 247, 246, 7, 3, 1, 224, 241, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 224, - 241, 2, 247, 207, 90, 7, 3, 1, 224, 241, 2, 247, 207, 90, 7, 6, 1, 224, - 113, 223, 88, 7, 3, 1, 224, 113, 223, 88, 7, 6, 1, 223, 41, 223, 88, 7, - 3, 1, 223, 41, 223, 88, 7, 6, 1, 215, 80, 2, 247, 207, 90, 7, 3, 1, 215, - 80, 2, 247, 207, 90, 7, 6, 1, 214, 90, 7, 3, 1, 214, 90, 7, 6, 1, 214, - 126, 212, 152, 7, 3, 1, 214, 126, 212, 152, 7, 6, 1, 217, 105, 2, 90, 7, - 3, 1, 217, 105, 2, 90, 7, 6, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246, - 7, 3, 1, 217, 105, 2, 219, 45, 217, 93, 247, 246, 7, 6, 1, 214, 222, 7, - 3, 1, 214, 222, 7, 6, 1, 245, 30, 7, 3, 1, 245, 30, 7, 6, 1, 235, 169, 7, - 3, 1, 235, 169, 7, 6, 1, 249, 146, 7, 3, 1, 249, 146, 59, 1, 215, 104, 7, - 3, 1, 246, 24, 7, 3, 1, 232, 142, 7, 3, 1, 230, 150, 7, 3, 1, 228, 57, 7, - 3, 1, 223, 40, 7, 1, 3, 6, 223, 40, 7, 3, 1, 216, 72, 7, 3, 1, 215, 167, - 7, 6, 1, 235, 210, 249, 3, 7, 3, 1, 235, 210, 249, 3, 7, 6, 1, 235, 210, - 244, 230, 7, 3, 1, 235, 210, 244, 230, 7, 6, 1, 235, 210, 243, 177, 7, 6, - 1, 216, 58, 235, 210, 243, 177, 7, 3, 1, 216, 58, 235, 210, 243, 177, 7, - 6, 1, 216, 58, 150, 7, 3, 1, 216, 58, 150, 7, 6, 1, 235, 210, 149, 7, 3, - 1, 235, 210, 149, 7, 6, 1, 235, 210, 197, 7, 3, 1, 235, 210, 197, 7, 6, - 1, 235, 210, 218, 99, 7, 3, 1, 235, 210, 218, 99, 59, 1, 115, 249, 224, - 254, 174, 59, 1, 249, 164, 59, 1, 220, 175, 245, 61, 52, 7, 6, 1, 222, - 170, 7, 3, 1, 222, 170, 7, 6, 1, 216, 58, 242, 41, 7, 3, 1, 233, 171, 2, - 223, 207, 241, 38, 24, 251, 218, 7, 6, 1, 230, 98, 2, 247, 246, 7, 3, 1, - 230, 98, 2, 247, 246, 7, 6, 1, 243, 178, 2, 227, 112, 90, 7, 3, 1, 243, - 178, 2, 227, 112, 90, 7, 6, 1, 235, 28, 2, 227, 112, 90, 7, 3, 1, 235, - 28, 2, 227, 112, 90, 7, 6, 1, 230, 98, 2, 227, 112, 90, 7, 3, 1, 230, 98, - 2, 227, 112, 90, 7, 6, 1, 224, 113, 2, 227, 112, 90, 7, 3, 1, 224, 113, - 2, 227, 112, 90, 7, 6, 1, 223, 4, 2, 227, 112, 90, 7, 3, 1, 223, 4, 2, - 227, 112, 90, 7, 1, 3, 6, 216, 58, 183, 7, 245, 66, 1, 223, 202, 244, - 230, 7, 245, 66, 1, 223, 202, 226, 229, 7, 245, 66, 1, 235, 191, 183, 7, - 245, 66, 1, 240, 146, 232, 182, 7, 245, 66, 1, 253, 193, 183, 218, 175, - 230, 32, 1, 61, 218, 175, 230, 32, 1, 72, 218, 175, 230, 32, 5, 246, 3, - 218, 175, 230, 32, 1, 69, 218, 175, 230, 32, 1, 74, 218, 175, 230, 32, 1, - 75, 218, 175, 230, 32, 5, 241, 236, 218, 175, 230, 32, 1, 234, 37, 218, - 175, 230, 32, 1, 234, 113, 218, 175, 230, 32, 1, 242, 150, 218, 175, 230, - 32, 1, 242, 200, 218, 175, 230, 32, 5, 253, 242, 218, 175, 230, 32, 1, - 249, 175, 218, 175, 230, 32, 1, 250, 23, 218, 175, 230, 32, 1, 235, 71, - 218, 175, 230, 32, 1, 235, 111, 218, 175, 230, 32, 1, 216, 95, 218, 175, - 230, 32, 1, 216, 100, 218, 175, 230, 32, 1, 248, 56, 218, 175, 230, 32, - 1, 248, 65, 218, 175, 230, 32, 1, 108, 218, 175, 230, 32, 1, 217, 109, - 218, 175, 230, 32, 1, 247, 99, 218, 175, 230, 32, 1, 247, 215, 218, 175, - 230, 32, 1, 228, 185, 218, 175, 230, 32, 1, 225, 150, 218, 175, 230, 32, - 1, 225, 253, 218, 175, 230, 32, 1, 251, 128, 218, 175, 230, 32, 1, 251, - 188, 218, 175, 230, 32, 1, 230, 231, 218, 175, 230, 32, 1, 223, 112, 218, - 175, 230, 32, 1, 232, 208, 218, 175, 230, 32, 1, 223, 73, 218, 175, 230, - 32, 1, 219, 242, 218, 175, 230, 32, 1, 241, 54, 218, 175, 230, 32, 30, 5, - 61, 218, 175, 230, 32, 30, 5, 72, 218, 175, 230, 32, 30, 5, 69, 218, 175, - 230, 32, 30, 5, 74, 218, 175, 230, 32, 30, 5, 227, 49, 218, 175, 230, 32, - 225, 146, 231, 221, 218, 175, 230, 32, 225, 146, 231, 220, 218, 175, 230, - 32, 225, 146, 231, 219, 218, 175, 230, 32, 225, 146, 231, 218, 228, 167, - 235, 237, 243, 228, 122, 224, 166, 228, 167, 235, 237, 243, 228, 122, - 242, 9, 228, 167, 235, 237, 243, 228, 133, 224, 164, 228, 167, 235, 237, - 243, 228, 122, 220, 45, 228, 167, 235, 237, 243, 228, 122, 245, 145, 228, - 167, 235, 237, 243, 228, 133, 220, 44, 228, 167, 235, 237, 224, 167, 77, - 228, 167, 235, 237, 225, 172, 77, 228, 167, 235, 237, 223, 29, 77, 228, - 167, 235, 237, 224, 168, 77, 226, 20, 1, 181, 226, 20, 1, 234, 138, 226, - 20, 1, 243, 110, 226, 20, 1, 229, 159, 226, 20, 1, 250, 219, 226, 20, 1, - 250, 92, 226, 20, 1, 235, 139, 226, 20, 1, 228, 23, 226, 20, 1, 218, 52, - 226, 20, 1, 217, 161, 226, 20, 1, 248, 164, 226, 20, 1, 205, 226, 20, 1, - 193, 226, 20, 1, 226, 23, 226, 20, 1, 252, 107, 226, 20, 1, 188, 226, 20, - 1, 216, 141, 226, 20, 1, 216, 133, 226, 20, 1, 245, 249, 226, 20, 1, 214, - 49, 226, 20, 1, 212, 75, 226, 20, 1, 212, 109, 226, 20, 1, 3, 61, 226, - 20, 1, 186, 226, 20, 1, 203, 226, 20, 1, 233, 157, 226, 20, 1, 221, 24, - 226, 20, 1, 222, 202, 226, 20, 1, 159, 226, 20, 1, 61, 226, 20, 1, 72, - 226, 20, 1, 69, 226, 20, 1, 74, 226, 20, 1, 75, 226, 20, 1, 224, 232, - 226, 20, 1, 213, 153, 226, 20, 1, 244, 164, 226, 20, 1, 243, 5, 226, 20, - 1, 245, 165, 226, 20, 219, 18, 1, 214, 49, 226, 20, 219, 18, 1, 186, 226, - 20, 1, 216, 115, 226, 20, 1, 216, 105, 226, 20, 1, 248, 86, 226, 20, 1, - 228, 198, 226, 20, 1, 254, 50, 186, 226, 20, 1, 214, 115, 221, 24, 226, - 20, 1, 214, 116, 159, 226, 20, 1, 253, 138, 244, 164, 226, 20, 219, 18, - 1, 203, 226, 20, 218, 225, 1, 203, 226, 20, 1, 250, 187, 226, 20, 220, - 81, 241, 220, 77, 226, 20, 51, 241, 220, 77, 226, 20, 152, 221, 17, 226, - 20, 152, 51, 221, 17, 169, 5, 253, 242, 169, 5, 214, 128, 169, 1, 61, - 169, 1, 254, 232, 169, 1, 72, 169, 1, 236, 28, 169, 1, 69, 169, 1, 215, - 92, 169, 1, 161, 149, 169, 1, 161, 223, 82, 169, 1, 161, 150, 169, 1, - 161, 232, 214, 169, 1, 74, 169, 1, 245, 165, 169, 1, 254, 108, 169, 1, - 75, 169, 1, 227, 49, 169, 1, 253, 108, 169, 1, 181, 169, 1, 234, 138, - 169, 1, 243, 110, 169, 1, 242, 225, 169, 1, 229, 159, 169, 1, 250, 219, - 169, 1, 250, 92, 169, 1, 235, 139, 169, 1, 235, 115, 169, 1, 228, 23, - 169, 1, 216, 115, 169, 1, 216, 105, 169, 1, 248, 86, 169, 1, 248, 70, - 169, 1, 228, 198, 169, 1, 218, 52, 169, 1, 217, 161, 169, 1, 248, 164, - 169, 1, 247, 232, 169, 1, 205, 169, 1, 193, 169, 1, 226, 23, 169, 1, 252, - 107, 169, 1, 251, 195, 169, 1, 188, 169, 1, 186, 169, 1, 203, 169, 1, - 233, 157, 169, 1, 215, 1, 169, 1, 221, 24, 169, 1, 219, 157, 169, 1, 222, - 202, 169, 1, 159, 169, 1, 232, 213, 169, 249, 133, 5, 242, 25, 169, 30, - 5, 254, 232, 169, 30, 5, 72, 169, 30, 5, 236, 28, 169, 30, 5, 69, 169, - 30, 5, 215, 92, 169, 30, 5, 161, 149, 169, 30, 5, 161, 223, 82, 169, 30, - 5, 161, 150, 169, 30, 5, 161, 232, 214, 169, 30, 5, 74, 169, 30, 5, 245, - 165, 169, 30, 5, 254, 108, 169, 30, 5, 75, 169, 30, 5, 227, 49, 169, 30, - 5, 253, 108, 169, 5, 214, 133, 169, 248, 123, 169, 51, 248, 123, 169, 21, - 212, 79, 169, 21, 116, 169, 21, 109, 169, 21, 166, 169, 21, 163, 169, 21, - 180, 169, 21, 189, 169, 21, 198, 169, 21, 195, 169, 21, 200, 37, 82, 21, - 212, 79, 37, 82, 21, 116, 37, 82, 21, 109, 37, 82, 21, 166, 37, 82, 21, - 163, 37, 82, 21, 180, 37, 82, 21, 189, 37, 82, 21, 198, 37, 82, 21, 195, - 37, 82, 21, 200, 37, 82, 1, 61, 37, 82, 1, 69, 37, 82, 1, 181, 37, 82, 1, - 205, 37, 82, 1, 193, 37, 82, 1, 203, 37, 82, 1, 214, 154, 37, 82, 5, 253, - 91, 82, 5, 219, 205, 250, 187, 82, 5, 250, 188, 214, 133, 82, 5, 51, 250, - 188, 214, 133, 82, 5, 250, 188, 109, 82, 5, 250, 188, 166, 82, 5, 250, - 188, 253, 91, 82, 5, 225, 11, 82, 243, 76, 244, 72, 82, 250, 170, 82, - 241, 214, 234, 194, 233, 14, 21, 212, 79, 234, 194, 233, 14, 21, 116, - 234, 194, 233, 14, 21, 109, 234, 194, 233, 14, 21, 166, 234, 194, 233, - 14, 21, 163, 234, 194, 233, 14, 21, 180, 234, 194, 233, 14, 21, 189, 234, - 194, 233, 14, 21, 198, 234, 194, 233, 14, 21, 195, 234, 194, 233, 14, 21, - 200, 234, 194, 233, 14, 1, 181, 234, 194, 233, 14, 1, 234, 138, 234, 194, - 233, 14, 1, 243, 110, 234, 194, 233, 14, 1, 229, 159, 234, 194, 233, 14, - 1, 222, 202, 234, 194, 233, 14, 1, 221, 24, 234, 194, 233, 14, 1, 212, - 109, 234, 194, 233, 14, 1, 228, 23, 234, 194, 233, 14, 1, 218, 52, 234, - 194, 233, 14, 1, 240, 214, 234, 194, 233, 14, 1, 205, 234, 194, 233, 14, - 1, 193, 234, 194, 233, 14, 1, 226, 23, 234, 194, 233, 14, 1, 188, 234, - 194, 233, 14, 1, 248, 164, 234, 194, 233, 14, 1, 252, 107, 234, 194, 233, - 14, 1, 203, 234, 194, 233, 14, 1, 186, 234, 194, 233, 14, 1, 233, 157, - 234, 194, 233, 14, 1, 214, 49, 234, 194, 233, 14, 1, 217, 161, 234, 194, - 233, 14, 1, 159, 234, 194, 233, 14, 1, 215, 1, 234, 194, 233, 14, 1, 250, - 219, 234, 194, 233, 14, 1, 61, 234, 194, 233, 14, 1, 227, 99, 234, 194, - 233, 14, 1, 72, 234, 194, 233, 14, 1, 227, 49, 234, 194, 233, 14, 30, - 215, 183, 234, 194, 233, 14, 30, 74, 234, 194, 233, 14, 30, 69, 234, 194, - 233, 14, 30, 245, 165, 234, 194, 233, 14, 30, 75, 234, 194, 233, 14, 160, - 225, 163, 234, 194, 233, 14, 160, 250, 200, 234, 194, 233, 14, 160, 250, - 201, 225, 163, 234, 194, 233, 14, 5, 249, 20, 234, 194, 233, 14, 5, 220, - 125, 223, 243, 1, 181, 223, 243, 1, 243, 110, 223, 243, 1, 229, 159, 223, - 243, 1, 218, 52, 223, 243, 1, 248, 164, 223, 243, 1, 205, 223, 243, 1, - 193, 223, 243, 1, 252, 107, 223, 243, 1, 188, 223, 243, 1, 250, 219, 223, - 243, 1, 235, 139, 223, 243, 1, 228, 23, 223, 243, 1, 222, 202, 223, 243, - 1, 203, 223, 243, 1, 233, 157, 223, 243, 1, 186, 223, 243, 1, 214, 49, - 223, 243, 1, 159, 223, 243, 1, 231, 187, 223, 243, 1, 229, 141, 223, 243, - 1, 229, 228, 223, 243, 1, 227, 254, 223, 243, 1, 61, 223, 243, 30, 5, 72, - 223, 243, 30, 5, 69, 223, 243, 30, 5, 74, 223, 243, 30, 5, 254, 108, 223, - 243, 30, 5, 75, 223, 243, 30, 5, 253, 108, 223, 243, 30, 5, 245, 22, 223, - 243, 30, 5, 245, 189, 223, 243, 249, 133, 5, 229, 161, 223, 243, 249, - 133, 5, 204, 223, 243, 249, 133, 5, 149, 223, 243, 249, 133, 5, 242, 41, - 223, 243, 214, 133, 223, 243, 222, 92, 77, 23, 97, 217, 51, 23, 97, 217, - 50, 23, 97, 217, 48, 23, 97, 217, 53, 23, 97, 223, 174, 23, 97, 223, 158, - 23, 97, 223, 153, 23, 97, 223, 155, 23, 97, 223, 171, 23, 97, 223, 164, - 23, 97, 223, 157, 23, 97, 223, 176, 23, 97, 223, 159, 23, 97, 223, 178, - 23, 97, 223, 175, 23, 97, 231, 26, 23, 97, 231, 17, 23, 97, 231, 20, 23, - 97, 225, 212, 23, 97, 225, 223, 23, 97, 225, 224, 23, 97, 219, 142, 23, - 97, 236, 41, 23, 97, 236, 48, 23, 97, 219, 153, 23, 97, 219, 140, 23, 97, - 226, 6, 23, 97, 241, 153, 23, 97, 219, 137, 144, 5, 226, 155, 144, 5, - 250, 121, 144, 5, 233, 90, 144, 5, 213, 228, 144, 1, 61, 144, 1, 240, - 146, 234, 197, 144, 1, 72, 144, 1, 236, 28, 144, 1, 69, 144, 1, 226, 214, - 250, 97, 144, 1, 229, 160, 233, 52, 144, 1, 229, 160, 233, 53, 224, 34, - 144, 1, 74, 144, 1, 254, 108, 144, 1, 75, 144, 1, 181, 144, 1, 235, 17, - 222, 144, 144, 1, 235, 17, 230, 136, 144, 1, 243, 110, 144, 1, 243, 111, - 230, 136, 144, 1, 229, 159, 144, 1, 250, 219, 144, 1, 250, 220, 230, 136, - 144, 1, 235, 139, 144, 1, 228, 24, 230, 136, 144, 1, 235, 140, 232, 12, - 144, 1, 228, 23, 144, 1, 216, 115, 144, 1, 216, 116, 232, 12, 144, 1, - 248, 86, 144, 1, 248, 87, 232, 12, 144, 1, 230, 46, 230, 136, 144, 1, - 218, 52, 144, 1, 218, 53, 230, 136, 144, 1, 248, 164, 144, 1, 248, 165, - 232, 12, 144, 1, 205, 144, 1, 193, 144, 1, 226, 214, 230, 136, 144, 1, - 252, 107, 144, 1, 252, 108, 230, 136, 144, 1, 188, 144, 1, 186, 144, 1, - 203, 144, 1, 224, 77, 254, 115, 144, 1, 233, 157, 144, 1, 214, 49, 144, - 1, 222, 203, 230, 136, 144, 1, 222, 203, 232, 12, 144, 1, 222, 202, 144, - 1, 159, 144, 5, 250, 122, 217, 203, 144, 30, 5, 217, 254, 144, 30, 5, - 216, 246, 144, 30, 5, 213, 178, 144, 30, 5, 213, 179, 231, 133, 144, 30, - 5, 218, 248, 144, 30, 5, 218, 249, 231, 121, 144, 30, 5, 218, 16, 144, - 30, 5, 247, 146, 230, 135, 144, 30, 5, 226, 59, 144, 249, 133, 5, 234, - 164, 144, 249, 133, 5, 226, 71, 144, 249, 133, 5, 250, 207, 144, 226, - 167, 144, 42, 223, 221, 144, 46, 223, 221, 144, 226, 203, 254, 26, 144, - 226, 203, 232, 29, 144, 226, 203, 232, 146, 144, 226, 203, 213, 223, 144, - 226, 203, 226, 168, 144, 226, 203, 232, 234, 144, 226, 203, 232, 140, - 144, 226, 203, 254, 154, 144, 226, 203, 254, 155, 254, 154, 144, 226, - 203, 225, 183, 144, 216, 58, 226, 203, 225, 183, 144, 226, 164, 144, 21, - 212, 79, 144, 21, 116, 144, 21, 109, 144, 21, 166, 144, 21, 163, 144, 21, - 180, 144, 21, 189, 144, 21, 198, 144, 21, 195, 144, 21, 200, 144, 226, - 203, 217, 22, 216, 70, 144, 226, 203, 235, 165, 162, 1, 61, 162, 1, 72, - 162, 1, 69, 162, 1, 74, 162, 1, 254, 108, 162, 1, 75, 162, 1, 181, 162, - 1, 234, 138, 162, 1, 243, 110, 162, 1, 242, 225, 162, 1, 229, 75, 162, 1, - 229, 159, 162, 1, 250, 92, 162, 1, 250, 49, 162, 1, 235, 139, 162, 1, - 235, 115, 162, 1, 229, 66, 162, 1, 229, 68, 162, 1, 229, 67, 162, 1, 218, - 52, 162, 1, 217, 161, 162, 1, 248, 164, 162, 1, 247, 232, 162, 1, 228, - 62, 162, 1, 205, 162, 1, 248, 86, 162, 1, 193, 162, 1, 225, 100, 162, 1, - 226, 23, 162, 1, 252, 107, 162, 1, 251, 195, 162, 1, 230, 165, 162, 1, - 188, 162, 1, 252, 31, 162, 1, 186, 162, 1, 203, 162, 1, 233, 157, 162, 1, - 215, 1, 162, 1, 219, 157, 162, 1, 222, 202, 162, 1, 159, 162, 30, 5, 254, - 232, 162, 30, 5, 72, 162, 30, 5, 236, 28, 162, 30, 5, 245, 152, 162, 30, - 5, 69, 162, 30, 5, 227, 99, 162, 30, 5, 75, 162, 30, 5, 254, 108, 162, - 30, 5, 253, 108, 162, 30, 5, 215, 183, 162, 249, 133, 5, 186, 162, 249, - 133, 5, 203, 162, 249, 133, 5, 233, 157, 162, 249, 133, 5, 214, 49, 162, - 1, 40, 235, 27, 162, 1, 40, 243, 177, 162, 1, 40, 229, 161, 162, 249, - 133, 5, 40, 229, 161, 162, 1, 40, 250, 93, 162, 1, 40, 218, 99, 162, 1, - 40, 204, 162, 1, 40, 226, 229, 162, 1, 40, 213, 105, 162, 1, 40, 149, - 162, 1, 40, 150, 162, 1, 40, 219, 158, 162, 249, 133, 5, 40, 183, 162, - 249, 133, 5, 40, 242, 41, 162, 21, 212, 79, 162, 21, 116, 162, 21, 109, - 162, 21, 166, 162, 21, 163, 162, 21, 180, 162, 21, 189, 162, 21, 198, - 162, 21, 195, 162, 21, 200, 162, 225, 27, 219, 183, 162, 225, 27, 248, - 123, 162, 225, 27, 51, 248, 123, 162, 225, 27, 216, 169, 248, 123, 64, 1, - 234, 132, 243, 110, 64, 1, 234, 132, 250, 219, 64, 1, 234, 132, 250, 92, - 64, 1, 234, 132, 235, 139, 64, 1, 234, 132, 235, 115, 64, 1, 234, 132, - 228, 23, 64, 1, 234, 132, 216, 115, 64, 1, 234, 132, 216, 105, 64, 1, - 234, 132, 248, 86, 64, 1, 234, 132, 248, 70, 64, 1, 234, 132, 247, 232, - 64, 1, 234, 132, 205, 64, 1, 234, 132, 222, 202, 64, 1, 234, 132, 159, - 64, 1, 234, 132, 241, 174, 64, 1, 234, 132, 244, 164, 64, 59, 1, 234, - 132, 224, 2, 64, 1, 234, 132, 213, 153, 64, 1, 234, 132, 212, 109, 64, 1, - 234, 132, 203, 64, 232, 198, 234, 132, 227, 117, 64, 232, 198, 234, 132, - 224, 188, 64, 232, 198, 234, 132, 241, 107, 64, 16, 254, 98, 244, 253, - 64, 16, 254, 98, 116, 64, 16, 254, 98, 109, 64, 1, 254, 98, 203, 64, 5, - 226, 151, 234, 218, 216, 241, 38, 190, 1, 115, 234, 37, 38, 190, 1, 124, - 234, 37, 38, 190, 1, 115, 234, 113, 38, 190, 1, 124, 234, 113, 38, 190, - 1, 115, 234, 120, 38, 190, 1, 124, 234, 120, 38, 190, 1, 115, 242, 150, - 38, 190, 1, 124, 242, 150, 38, 190, 1, 115, 229, 90, 38, 190, 1, 124, - 229, 90, 38, 190, 1, 115, 249, 175, 38, 190, 1, 124, 249, 175, 38, 190, - 1, 115, 250, 23, 38, 190, 1, 124, 250, 23, 38, 190, 1, 115, 219, 242, 38, - 190, 1, 124, 219, 242, 38, 190, 1, 115, 227, 253, 38, 190, 1, 124, 227, - 253, 38, 190, 1, 115, 247, 99, 38, 190, 1, 124, 247, 99, 38, 190, 1, 115, - 108, 38, 190, 1, 124, 108, 38, 190, 1, 115, 217, 109, 38, 190, 1, 124, - 217, 109, 38, 190, 1, 115, 228, 185, 38, 190, 1, 124, 228, 185, 38, 190, - 1, 115, 251, 128, 38, 190, 1, 124, 251, 128, 38, 190, 1, 115, 225, 150, - 38, 190, 1, 124, 225, 150, 38, 190, 1, 115, 225, 253, 38, 190, 1, 124, - 225, 253, 38, 190, 1, 115, 244, 12, 38, 190, 1, 124, 244, 12, 38, 190, 1, - 115, 230, 231, 38, 190, 1, 124, 230, 231, 38, 190, 1, 115, 212, 235, 38, - 190, 1, 124, 212, 235, 38, 190, 1, 115, 223, 112, 38, 190, 1, 124, 223, - 112, 38, 190, 1, 115, 232, 208, 38, 190, 1, 124, 232, 208, 38, 190, 1, - 115, 214, 119, 38, 190, 1, 124, 214, 119, 38, 190, 1, 115, 241, 54, 38, - 190, 1, 124, 241, 54, 38, 190, 1, 115, 75, 38, 190, 1, 124, 75, 38, 190, - 232, 9, 234, 235, 38, 190, 30, 254, 232, 38, 190, 30, 72, 38, 190, 30, - 215, 183, 38, 190, 30, 69, 38, 190, 30, 74, 38, 190, 30, 75, 38, 190, - 232, 9, 234, 115, 38, 190, 30, 240, 111, 38, 190, 30, 215, 182, 38, 190, - 30, 215, 196, 38, 190, 30, 253, 106, 38, 190, 30, 253, 83, 38, 190, 30, - 254, 32, 38, 190, 30, 254, 45, 38, 190, 160, 232, 9, 245, 137, 38, 190, - 160, 232, 9, 228, 61, 38, 190, 160, 232, 9, 217, 109, 38, 190, 160, 232, - 9, 219, 228, 38, 190, 16, 234, 22, 38, 190, 16, 228, 61, 38, 190, 16, - 222, 168, 38, 190, 16, 241, 55, 241, 50, 38, 190, 16, 234, 31, 234, 30, - 28, 4, 216, 98, 28, 4, 216, 101, 28, 4, 216, 104, 28, 4, 216, 102, 28, 4, - 216, 103, 28, 4, 216, 100, 28, 4, 248, 64, 28, 4, 248, 66, 28, 4, 248, - 69, 28, 4, 248, 67, 28, 4, 248, 68, 28, 4, 248, 65, 28, 4, 245, 239, 28, - 4, 245, 242, 28, 4, 245, 248, 28, 4, 245, 246, 28, 4, 245, 247, 28, 4, - 245, 240, 28, 4, 250, 138, 28, 4, 250, 132, 28, 4, 250, 134, 28, 4, 250, - 137, 28, 4, 250, 135, 28, 4, 250, 136, 28, 4, 250, 133, 28, 4, 252, 31, - 28, 4, 252, 10, 28, 4, 252, 22, 28, 4, 252, 30, 28, 4, 252, 25, 28, 4, - 252, 26, 28, 4, 252, 14, 231, 140, 231, 194, 1, 234, 28, 231, 140, 231, - 194, 1, 222, 168, 231, 140, 231, 194, 1, 233, 133, 231, 140, 231, 194, 1, - 230, 241, 231, 140, 231, 194, 1, 193, 231, 140, 231, 194, 1, 205, 231, - 140, 231, 194, 1, 250, 39, 231, 140, 231, 194, 1, 217, 44, 231, 140, 231, - 194, 1, 234, 109, 231, 140, 231, 194, 1, 229, 80, 231, 140, 231, 194, 1, - 217, 103, 231, 140, 231, 194, 1, 214, 44, 231, 140, 231, 194, 1, 213, 58, - 231, 140, 231, 194, 1, 240, 206, 231, 140, 231, 194, 1, 215, 160, 231, - 140, 231, 194, 1, 72, 231, 140, 231, 194, 1, 226, 18, 231, 140, 231, 194, - 1, 253, 118, 231, 140, 231, 194, 1, 242, 143, 231, 140, 231, 194, 1, 235, - 114, 231, 140, 231, 194, 1, 224, 57, 231, 140, 231, 194, 1, 252, 107, - 231, 140, 231, 194, 1, 235, 103, 231, 140, 231, 194, 1, 247, 171, 231, - 140, 231, 194, 1, 242, 197, 231, 140, 231, 194, 1, 247, 213, 231, 140, - 231, 194, 1, 251, 194, 231, 140, 231, 194, 1, 234, 29, 232, 181, 231, - 140, 231, 194, 1, 233, 134, 232, 181, 231, 140, 231, 194, 1, 230, 242, - 232, 181, 231, 140, 231, 194, 1, 226, 214, 232, 181, 231, 140, 231, 194, - 1, 230, 46, 232, 181, 231, 140, 231, 194, 1, 217, 45, 232, 181, 231, 140, - 231, 194, 1, 229, 81, 232, 181, 231, 140, 231, 194, 1, 240, 146, 232, - 181, 231, 140, 231, 194, 30, 5, 227, 61, 231, 140, 231, 194, 30, 5, 235, - 249, 231, 140, 231, 194, 30, 5, 254, 31, 231, 140, 231, 194, 30, 5, 213, - 29, 231, 140, 231, 194, 30, 5, 219, 219, 231, 140, 231, 194, 30, 5, 215, - 157, 231, 140, 231, 194, 30, 5, 250, 60, 231, 140, 231, 194, 30, 5, 228, - 47, 231, 140, 231, 194, 250, 61, 231, 140, 231, 194, 232, 143, 235, 148, - 231, 140, 231, 194, 253, 216, 235, 148, 231, 140, 231, 194, 21, 212, 79, - 231, 140, 231, 194, 21, 116, 231, 140, 231, 194, 21, 109, 231, 140, 231, - 194, 21, 166, 231, 140, 231, 194, 21, 163, 231, 140, 231, 194, 21, 180, - 231, 140, 231, 194, 21, 189, 231, 140, 231, 194, 21, 198, 231, 140, 231, - 194, 21, 195, 231, 140, 231, 194, 21, 200, 23, 135, 227, 197, 23, 135, - 227, 202, 23, 135, 212, 234, 23, 135, 212, 233, 23, 135, 212, 232, 23, - 135, 215, 246, 23, 135, 215, 249, 23, 135, 212, 201, 23, 135, 212, 197, - 23, 135, 245, 21, 23, 135, 245, 19, 23, 135, 245, 20, 23, 135, 245, 17, - 23, 135, 240, 136, 23, 135, 240, 135, 23, 135, 240, 133, 23, 135, 240, - 134, 23, 135, 240, 139, 23, 135, 240, 132, 23, 135, 240, 131, 23, 135, - 240, 141, 23, 135, 253, 203, 23, 135, 253, 202, 23, 89, 229, 50, 23, 89, - 229, 56, 23, 89, 219, 139, 23, 89, 219, 138, 23, 89, 217, 50, 23, 89, - 217, 48, 23, 89, 217, 47, 23, 89, 217, 53, 23, 89, 217, 54, 23, 89, 217, - 46, 23, 89, 223, 158, 23, 89, 223, 173, 23, 89, 219, 145, 23, 89, 223, - 170, 23, 89, 223, 160, 23, 89, 223, 162, 23, 89, 223, 149, 23, 89, 223, - 150, 23, 89, 234, 223, 23, 89, 231, 25, 23, 89, 231, 19, 23, 89, 219, - 149, 23, 89, 231, 22, 23, 89, 231, 28, 23, 89, 225, 208, 23, 89, 225, - 217, 23, 89, 225, 221, 23, 89, 219, 147, 23, 89, 225, 211, 23, 89, 225, - 225, 23, 89, 225, 226, 23, 89, 220, 68, 23, 89, 220, 71, 23, 89, 219, - 143, 23, 89, 219, 141, 23, 89, 220, 66, 23, 89, 220, 74, 23, 89, 220, 75, - 23, 89, 220, 60, 23, 89, 220, 73, 23, 89, 226, 158, 23, 89, 226, 159, 23, - 89, 213, 15, 23, 89, 213, 16, 23, 89, 249, 237, 23, 89, 249, 236, 23, 89, - 219, 154, 23, 89, 226, 4, 23, 89, 226, 3, 9, 13, 238, 17, 9, 13, 238, 16, - 9, 13, 238, 15, 9, 13, 238, 14, 9, 13, 238, 13, 9, 13, 238, 12, 9, 13, - 238, 11, 9, 13, 238, 10, 9, 13, 238, 9, 9, 13, 238, 8, 9, 13, 238, 7, 9, - 13, 238, 6, 9, 13, 238, 5, 9, 13, 238, 4, 9, 13, 238, 3, 9, 13, 238, 2, - 9, 13, 238, 1, 9, 13, 238, 0, 9, 13, 237, 255, 9, 13, 237, 254, 9, 13, - 237, 253, 9, 13, 237, 252, 9, 13, 237, 251, 9, 13, 237, 250, 9, 13, 237, - 249, 9, 13, 237, 248, 9, 13, 237, 247, 9, 13, 237, 246, 9, 13, 237, 245, - 9, 13, 237, 244, 9, 13, 237, 243, 9, 13, 237, 242, 9, 13, 237, 241, 9, - 13, 237, 240, 9, 13, 237, 239, 9, 13, 237, 238, 9, 13, 237, 237, 9, 13, - 237, 236, 9, 13, 237, 235, 9, 13, 237, 234, 9, 13, 237, 233, 9, 13, 237, - 232, 9, 13, 237, 231, 9, 13, 237, 230, 9, 13, 237, 229, 9, 13, 237, 228, - 9, 13, 237, 227, 9, 13, 237, 226, 9, 13, 237, 225, 9, 13, 237, 224, 9, - 13, 237, 223, 9, 13, 237, 222, 9, 13, 237, 221, 9, 13, 237, 220, 9, 13, - 237, 219, 9, 13, 237, 218, 9, 13, 237, 217, 9, 13, 237, 216, 9, 13, 237, - 215, 9, 13, 237, 214, 9, 13, 237, 213, 9, 13, 237, 212, 9, 13, 237, 211, - 9, 13, 237, 210, 9, 13, 237, 209, 9, 13, 237, 208, 9, 13, 237, 207, 9, - 13, 237, 206, 9, 13, 237, 205, 9, 13, 237, 204, 9, 13, 237, 203, 9, 13, - 237, 202, 9, 13, 237, 201, 9, 13, 237, 200, 9, 13, 237, 199, 9, 13, 237, - 198, 9, 13, 237, 197, 9, 13, 237, 196, 9, 13, 237, 195, 9, 13, 237, 194, - 9, 13, 237, 193, 9, 13, 237, 192, 9, 13, 237, 191, 9, 13, 237, 190, 9, - 13, 237, 189, 9, 13, 237, 188, 9, 13, 237, 187, 9, 13, 237, 186, 9, 13, - 237, 185, 9, 13, 237, 184, 9, 13, 237, 183, 9, 13, 237, 182, 9, 13, 237, - 181, 9, 13, 237, 180, 9, 13, 237, 179, 9, 13, 237, 178, 9, 13, 237, 177, - 9, 13, 237, 176, 9, 13, 237, 175, 9, 13, 237, 174, 9, 13, 237, 173, 9, - 13, 237, 172, 9, 13, 237, 171, 9, 13, 237, 170, 9, 13, 237, 169, 9, 13, - 237, 168, 9, 13, 237, 167, 9, 13, 237, 166, 9, 13, 237, 165, 9, 13, 237, - 164, 9, 13, 237, 163, 9, 13, 237, 162, 9, 13, 237, 161, 9, 13, 237, 160, - 9, 13, 237, 159, 9, 13, 237, 158, 9, 13, 237, 157, 9, 13, 237, 156, 9, - 13, 237, 155, 9, 13, 237, 154, 9, 13, 237, 153, 9, 13, 237, 152, 9, 13, - 237, 151, 9, 13, 237, 150, 9, 13, 237, 149, 9, 13, 237, 148, 9, 13, 237, - 147, 9, 13, 237, 146, 9, 13, 237, 145, 9, 13, 237, 144, 9, 13, 237, 143, - 9, 13, 237, 142, 9, 13, 237, 141, 9, 13, 237, 140, 9, 13, 237, 139, 9, - 13, 237, 138, 9, 13, 237, 137, 9, 13, 237, 136, 9, 13, 237, 135, 9, 13, - 237, 134, 9, 13, 237, 133, 9, 13, 237, 132, 9, 13, 237, 131, 9, 13, 237, - 130, 9, 13, 237, 129, 9, 13, 237, 128, 9, 13, 237, 127, 9, 13, 237, 126, - 9, 13, 237, 125, 9, 13, 237, 124, 9, 13, 237, 123, 9, 13, 237, 122, 9, - 13, 237, 121, 9, 13, 237, 120, 9, 13, 237, 119, 9, 13, 237, 118, 9, 13, - 237, 117, 9, 13, 237, 116, 9, 13, 237, 115, 9, 13, 237, 114, 9, 13, 237, - 113, 9, 13, 237, 112, 9, 13, 237, 111, 9, 13, 237, 110, 9, 13, 237, 109, - 9, 13, 237, 108, 9, 13, 237, 107, 9, 13, 237, 106, 9, 13, 237, 105, 9, - 13, 237, 104, 9, 13, 237, 103, 9, 13, 237, 102, 9, 13, 237, 101, 9, 13, - 237, 100, 9, 13, 237, 99, 9, 13, 237, 98, 9, 13, 237, 97, 9, 13, 237, 96, - 9, 13, 237, 95, 9, 13, 237, 94, 9, 13, 237, 93, 9, 13, 237, 92, 9, 13, - 237, 91, 9, 13, 237, 90, 9, 13, 237, 89, 9, 13, 237, 88, 9, 13, 237, 87, - 9, 13, 237, 86, 9, 13, 237, 85, 9, 13, 237, 84, 9, 13, 237, 83, 9, 13, - 237, 82, 9, 13, 237, 81, 9, 13, 237, 80, 9, 13, 237, 79, 9, 13, 237, 78, - 9, 13, 237, 77, 9, 13, 237, 76, 9, 13, 237, 75, 9, 13, 237, 74, 9, 13, - 237, 73, 9, 13, 237, 72, 9, 13, 237, 71, 9, 13, 237, 70, 9, 13, 237, 69, - 9, 13, 237, 68, 9, 13, 237, 67, 9, 13, 237, 66, 9, 13, 237, 65, 9, 13, - 237, 64, 9, 13, 237, 63, 9, 13, 237, 62, 9, 13, 237, 61, 9, 13, 237, 60, - 9, 13, 237, 59, 9, 13, 237, 58, 9, 13, 237, 57, 9, 13, 237, 56, 9, 13, - 237, 55, 9, 13, 237, 54, 9, 13, 237, 53, 9, 13, 237, 52, 9, 13, 237, 51, - 9, 13, 237, 50, 9, 13, 237, 49, 9, 13, 237, 48, 9, 13, 237, 47, 9, 13, - 237, 46, 9, 13, 237, 45, 9, 13, 237, 44, 9, 13, 237, 43, 9, 13, 237, 42, - 9, 13, 237, 41, 9, 13, 237, 40, 9, 13, 237, 39, 9, 13, 237, 38, 9, 13, - 237, 37, 9, 13, 237, 36, 9, 13, 237, 35, 9, 13, 237, 34, 9, 13, 237, 33, - 9, 13, 237, 32, 9, 13, 237, 31, 9, 13, 237, 30, 9, 13, 237, 29, 9, 13, - 237, 28, 9, 13, 237, 27, 9, 13, 237, 26, 9, 13, 237, 25, 9, 13, 237, 24, - 9, 13, 237, 23, 9, 13, 237, 22, 9, 13, 237, 21, 9, 13, 237, 20, 9, 13, - 237, 19, 9, 13, 237, 18, 9, 13, 237, 17, 9, 13, 237, 16, 9, 13, 237, 15, - 9, 13, 237, 14, 9, 13, 237, 13, 9, 13, 237, 12, 9, 13, 237, 11, 9, 13, - 237, 10, 9, 13, 237, 9, 9, 13, 237, 8, 9, 13, 237, 7, 9, 13, 237, 6, 9, - 13, 237, 5, 9, 13, 237, 4, 9, 13, 237, 3, 9, 13, 237, 2, 9, 13, 237, 1, - 9, 13, 237, 0, 9, 13, 236, 255, 9, 13, 236, 254, 9, 13, 236, 253, 9, 13, - 236, 252, 9, 13, 236, 251, 9, 13, 236, 250, 9, 13, 236, 249, 9, 13, 236, - 248, 9, 13, 236, 247, 9, 13, 236, 246, 9, 13, 236, 245, 9, 13, 236, 244, - 9, 13, 236, 243, 9, 13, 236, 242, 9, 13, 236, 241, 9, 13, 236, 240, 9, - 13, 236, 239, 9, 13, 236, 238, 9, 13, 236, 237, 9, 13, 236, 236, 9, 13, - 236, 235, 9, 13, 236, 234, 9, 13, 236, 233, 9, 13, 236, 232, 9, 13, 236, - 231, 9, 13, 236, 230, 9, 13, 236, 229, 9, 13, 236, 228, 9, 13, 236, 227, - 9, 13, 236, 226, 9, 13, 236, 225, 9, 13, 236, 224, 9, 13, 236, 223, 9, - 13, 236, 222, 9, 13, 236, 221, 9, 13, 236, 220, 9, 13, 236, 219, 9, 13, - 236, 218, 9, 13, 236, 217, 9, 13, 236, 216, 9, 13, 236, 215, 9, 13, 236, - 214, 9, 13, 236, 213, 9, 13, 236, 212, 9, 13, 236, 211, 9, 13, 236, 210, - 9, 13, 236, 209, 9, 13, 236, 208, 9, 13, 236, 207, 9, 13, 236, 206, 9, - 13, 236, 205, 9, 13, 236, 204, 9, 13, 236, 203, 9, 13, 236, 202, 9, 13, - 236, 201, 9, 13, 236, 200, 9, 13, 236, 199, 9, 13, 236, 198, 9, 13, 236, - 197, 9, 13, 236, 196, 9, 13, 236, 195, 9, 13, 236, 194, 9, 13, 236, 193, - 9, 13, 236, 192, 9, 13, 236, 191, 9, 13, 236, 190, 9, 13, 236, 189, 9, - 13, 236, 188, 9, 13, 236, 187, 9, 13, 236, 186, 9, 13, 236, 185, 9, 13, - 236, 184, 9, 13, 236, 183, 9, 13, 236, 182, 9, 13, 236, 181, 9, 13, 236, - 180, 9, 13, 236, 179, 9, 13, 236, 178, 9, 13, 236, 177, 9, 13, 236, 176, - 9, 13, 236, 175, 9, 13, 236, 174, 9, 13, 236, 173, 9, 13, 236, 172, 9, - 13, 236, 171, 9, 13, 236, 170, 9, 13, 236, 169, 9, 13, 236, 168, 9, 13, - 236, 167, 9, 13, 236, 166, 9, 13, 236, 165, 9, 13, 236, 164, 9, 13, 236, - 163, 9, 13, 236, 162, 9, 13, 236, 161, 9, 13, 236, 160, 9, 13, 236, 159, - 9, 13, 236, 158, 9, 13, 236, 157, 9, 13, 236, 156, 9, 13, 236, 155, 9, - 13, 236, 154, 9, 13, 236, 153, 9, 13, 236, 152, 9, 13, 236, 151, 9, 13, - 236, 150, 9, 13, 236, 149, 9, 13, 236, 148, 9, 13, 236, 147, 9, 13, 236, - 146, 9, 13, 236, 145, 9, 13, 236, 144, 9, 13, 236, 143, 9, 13, 236, 142, - 9, 13, 236, 141, 9, 13, 236, 140, 9, 13, 236, 139, 9, 13, 236, 138, 9, - 13, 236, 137, 9, 13, 236, 136, 9, 13, 236, 135, 9, 13, 236, 134, 9, 13, - 236, 133, 9, 13, 236, 132, 9, 13, 236, 131, 9, 13, 236, 130, 9, 13, 236, - 129, 9, 13, 236, 128, 9, 13, 236, 127, 9, 13, 236, 126, 9, 13, 236, 125, - 9, 13, 236, 124, 9, 13, 236, 123, 9, 13, 236, 122, 9, 13, 236, 121, 9, - 13, 236, 120, 9, 13, 236, 119, 9, 13, 236, 118, 9, 13, 236, 117, 9, 13, - 236, 116, 9, 13, 236, 115, 9, 13, 236, 114, 9, 13, 236, 113, 9, 13, 236, - 112, 9, 13, 236, 111, 9, 13, 236, 110, 9, 13, 236, 109, 9, 13, 236, 108, - 9, 13, 236, 107, 9, 13, 236, 106, 9, 13, 236, 105, 9, 13, 236, 104, 9, - 13, 236, 103, 9, 13, 236, 102, 9, 13, 236, 101, 9, 13, 236, 100, 9, 13, - 236, 99, 9, 13, 236, 98, 9, 13, 236, 97, 9, 13, 236, 96, 9, 13, 236, 95, - 9, 13, 236, 94, 9, 13, 236, 93, 9, 13, 236, 92, 9, 13, 236, 91, 9, 13, - 236, 90, 9, 13, 236, 89, 9, 13, 236, 88, 9, 13, 236, 87, 9, 13, 236, 86, - 9, 13, 236, 85, 9, 13, 236, 84, 9, 13, 236, 83, 9, 13, 236, 82, 9, 13, - 236, 81, 9, 13, 236, 80, 9, 13, 236, 79, 9, 13, 236, 78, 9, 13, 236, 77, - 9, 13, 236, 76, 9, 13, 236, 75, 9, 13, 236, 74, 9, 13, 236, 73, 9, 13, - 236, 72, 9, 13, 236, 71, 9, 13, 236, 70, 9, 13, 236, 69, 9, 13, 236, 68, - 9, 13, 236, 67, 9, 13, 236, 66, 9, 13, 236, 65, 9, 13, 236, 64, 9, 13, - 236, 63, 9, 13, 236, 62, 9, 13, 236, 61, 9, 13, 236, 60, 7, 3, 26, 244, - 94, 7, 3, 26, 244, 90, 7, 3, 26, 244, 45, 7, 3, 26, 244, 93, 7, 3, 26, - 244, 92, 7, 3, 26, 184, 223, 4, 218, 99, 7, 3, 26, 219, 107, 141, 3, 26, - 231, 123, 228, 150, 141, 3, 26, 231, 123, 245, 169, 141, 3, 26, 231, 123, - 235, 224, 141, 3, 26, 214, 157, 228, 150, 141, 3, 26, 231, 123, 213, 148, - 93, 1, 212, 225, 2, 241, 144, 93, 225, 145, 235, 53, 214, 243, 93, 26, - 212, 253, 212, 225, 212, 225, 226, 112, 93, 1, 254, 48, 253, 78, 93, 1, - 213, 232, 254, 78, 93, 1, 213, 232, 248, 134, 93, 1, 213, 232, 241, 222, - 93, 1, 213, 232, 234, 254, 93, 1, 213, 232, 233, 118, 93, 1, 213, 232, - 40, 231, 129, 93, 1, 213, 232, 223, 219, 93, 1, 213, 232, 217, 245, 93, - 1, 254, 48, 94, 52, 93, 1, 220, 201, 2, 220, 201, 247, 74, 93, 1, 220, - 201, 2, 220, 85, 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 201, - 247, 74, 93, 1, 220, 201, 2, 248, 151, 24, 220, 85, 247, 74, 93, 1, 106, - 2, 226, 112, 93, 1, 106, 2, 224, 220, 93, 1, 106, 2, 231, 234, 93, 1, - 251, 206, 2, 248, 150, 93, 1, 242, 178, 2, 248, 150, 93, 1, 248, 135, 2, - 248, 150, 93, 1, 241, 223, 2, 231, 234, 93, 1, 214, 237, 2, 248, 150, 93, - 1, 212, 91, 2, 248, 150, 93, 1, 217, 184, 2, 248, 150, 93, 1, 212, 225, - 2, 248, 150, 93, 1, 40, 234, 255, 2, 248, 150, 93, 1, 234, 255, 2, 248, - 150, 93, 1, 233, 119, 2, 248, 150, 93, 1, 231, 130, 2, 248, 150, 93, 1, - 228, 51, 2, 248, 150, 93, 1, 222, 165, 2, 248, 150, 93, 1, 40, 226, 97, - 2, 248, 150, 93, 1, 226, 97, 2, 248, 150, 93, 1, 216, 138, 2, 248, 150, - 93, 1, 224, 185, 2, 248, 150, 93, 1, 223, 220, 2, 248, 150, 93, 1, 220, - 201, 2, 248, 150, 93, 1, 217, 246, 2, 248, 150, 93, 1, 214, 237, 2, 241, - 47, 93, 1, 251, 206, 2, 224, 59, 93, 1, 234, 255, 2, 224, 59, 93, 1, 226, - 97, 2, 224, 59, 93, 26, 106, 233, 118, 12, 1, 106, 214, 31, 48, 17, 12, - 1, 106, 214, 31, 40, 17, 12, 1, 251, 241, 48, 17, 12, 1, 251, 241, 40, - 17, 12, 1, 251, 241, 70, 17, 12, 1, 251, 241, 138, 17, 12, 1, 226, 81, - 48, 17, 12, 1, 226, 81, 40, 17, 12, 1, 226, 81, 70, 17, 12, 1, 226, 81, - 138, 17, 12, 1, 251, 229, 48, 17, 12, 1, 251, 229, 40, 17, 12, 1, 251, - 229, 70, 17, 12, 1, 251, 229, 138, 17, 12, 1, 216, 108, 48, 17, 12, 1, - 216, 108, 40, 17, 12, 1, 216, 108, 70, 17, 12, 1, 216, 108, 138, 17, 12, - 1, 217, 214, 48, 17, 12, 1, 217, 214, 40, 17, 12, 1, 217, 214, 70, 17, - 12, 1, 217, 214, 138, 17, 12, 1, 216, 110, 48, 17, 12, 1, 216, 110, 40, - 17, 12, 1, 216, 110, 70, 17, 12, 1, 216, 110, 138, 17, 12, 1, 214, 226, - 48, 17, 12, 1, 214, 226, 40, 17, 12, 1, 214, 226, 70, 17, 12, 1, 214, - 226, 138, 17, 12, 1, 226, 79, 48, 17, 12, 1, 226, 79, 40, 17, 12, 1, 226, - 79, 70, 17, 12, 1, 226, 79, 138, 17, 12, 1, 245, 255, 48, 17, 12, 1, 245, - 255, 40, 17, 12, 1, 245, 255, 70, 17, 12, 1, 245, 255, 138, 17, 12, 1, - 228, 15, 48, 17, 12, 1, 228, 15, 40, 17, 12, 1, 228, 15, 70, 17, 12, 1, - 228, 15, 138, 17, 12, 1, 217, 234, 48, 17, 12, 1, 217, 234, 40, 17, 12, - 1, 217, 234, 70, 17, 12, 1, 217, 234, 138, 17, 12, 1, 217, 232, 48, 17, - 12, 1, 217, 232, 40, 17, 12, 1, 217, 232, 70, 17, 12, 1, 217, 232, 138, - 17, 12, 1, 248, 84, 48, 17, 12, 1, 248, 84, 40, 17, 12, 1, 248, 147, 48, - 17, 12, 1, 248, 147, 40, 17, 12, 1, 246, 26, 48, 17, 12, 1, 246, 26, 40, - 17, 12, 1, 248, 82, 48, 17, 12, 1, 248, 82, 40, 17, 12, 1, 235, 122, 48, - 17, 12, 1, 235, 122, 40, 17, 12, 1, 223, 78, 48, 17, 12, 1, 223, 78, 40, - 17, 12, 1, 234, 181, 48, 17, 12, 1, 234, 181, 40, 17, 12, 1, 234, 181, - 70, 17, 12, 1, 234, 181, 138, 17, 12, 1, 243, 98, 48, 17, 12, 1, 243, 98, - 40, 17, 12, 1, 243, 98, 70, 17, 12, 1, 243, 98, 138, 17, 12, 1, 242, 83, - 48, 17, 12, 1, 242, 83, 40, 17, 12, 1, 242, 83, 70, 17, 12, 1, 242, 83, - 138, 17, 12, 1, 229, 89, 48, 17, 12, 1, 229, 89, 40, 17, 12, 1, 229, 89, - 70, 17, 12, 1, 229, 89, 138, 17, 12, 1, 228, 174, 242, 195, 48, 17, 12, - 1, 228, 174, 242, 195, 40, 17, 12, 1, 223, 116, 48, 17, 12, 1, 223, 116, - 40, 17, 12, 1, 223, 116, 70, 17, 12, 1, 223, 116, 138, 17, 12, 1, 241, - 203, 2, 73, 78, 48, 17, 12, 1, 241, 203, 2, 73, 78, 40, 17, 12, 1, 241, - 203, 242, 148, 48, 17, 12, 1, 241, 203, 242, 148, 40, 17, 12, 1, 241, - 203, 242, 148, 70, 17, 12, 1, 241, 203, 242, 148, 138, 17, 12, 1, 241, - 203, 247, 96, 48, 17, 12, 1, 241, 203, 247, 96, 40, 17, 12, 1, 241, 203, - 247, 96, 70, 17, 12, 1, 241, 203, 247, 96, 138, 17, 12, 1, 73, 252, 53, - 48, 17, 12, 1, 73, 252, 53, 40, 17, 12, 1, 73, 252, 53, 2, 192, 78, 48, - 17, 12, 1, 73, 252, 53, 2, 192, 78, 40, 17, 12, 16, 62, 49, 12, 16, 62, - 55, 12, 16, 117, 176, 49, 12, 16, 117, 176, 55, 12, 16, 133, 176, 49, 12, - 16, 133, 176, 55, 12, 16, 133, 176, 225, 141, 246, 58, 49, 12, 16, 133, - 176, 225, 141, 246, 58, 55, 12, 16, 243, 237, 176, 49, 12, 16, 243, 237, - 176, 55, 12, 16, 51, 71, 252, 60, 55, 12, 16, 117, 176, 214, 166, 49, 12, - 16, 117, 176, 214, 166, 55, 12, 16, 223, 130, 12, 16, 3, 218, 30, 49, 12, - 16, 3, 218, 30, 55, 12, 1, 229, 162, 48, 17, 12, 1, 229, 162, 40, 17, 12, - 1, 229, 162, 70, 17, 12, 1, 229, 162, 138, 17, 12, 1, 111, 48, 17, 12, 1, - 111, 40, 17, 12, 1, 227, 100, 48, 17, 12, 1, 227, 100, 40, 17, 12, 1, - 212, 204, 48, 17, 12, 1, 212, 204, 40, 17, 12, 1, 111, 2, 192, 78, 48, - 17, 12, 1, 214, 233, 48, 17, 12, 1, 214, 233, 40, 17, 12, 1, 234, 82, - 227, 100, 48, 17, 12, 1, 234, 82, 227, 100, 40, 17, 12, 1, 234, 82, 212, - 204, 48, 17, 12, 1, 234, 82, 212, 204, 40, 17, 12, 1, 191, 48, 17, 12, 1, - 191, 40, 17, 12, 1, 191, 70, 17, 12, 1, 191, 138, 17, 12, 1, 215, 177, - 234, 192, 234, 82, 106, 210, 70, 17, 12, 1, 215, 177, 234, 192, 234, 82, - 106, 210, 138, 17, 12, 26, 73, 2, 192, 78, 2, 106, 48, 17, 12, 26, 73, 2, - 192, 78, 2, 106, 40, 17, 12, 26, 73, 2, 192, 78, 2, 254, 149, 48, 17, 12, - 26, 73, 2, 192, 78, 2, 254, 149, 40, 17, 12, 26, 73, 2, 192, 78, 2, 214, - 15, 48, 17, 12, 26, 73, 2, 192, 78, 2, 214, 15, 40, 17, 12, 26, 73, 2, - 192, 78, 2, 111, 48, 17, 12, 26, 73, 2, 192, 78, 2, 111, 40, 17, 12, 26, - 73, 2, 192, 78, 2, 227, 100, 48, 17, 12, 26, 73, 2, 192, 78, 2, 227, 100, - 40, 17, 12, 26, 73, 2, 192, 78, 2, 212, 204, 48, 17, 12, 26, 73, 2, 192, - 78, 2, 212, 204, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 48, 17, 12, 26, - 73, 2, 192, 78, 2, 191, 40, 17, 12, 26, 73, 2, 192, 78, 2, 191, 70, 17, - 12, 26, 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26, - 215, 177, 234, 82, 73, 2, 192, 78, 2, 106, 210, 40, 17, 12, 26, 215, 177, - 234, 82, 73, 2, 192, 78, 2, 106, 210, 70, 17, 12, 1, 244, 136, 73, 48, - 17, 12, 1, 244, 136, 73, 40, 17, 12, 1, 244, 136, 73, 70, 17, 12, 1, 244, - 136, 73, 138, 17, 12, 26, 73, 2, 192, 78, 2, 145, 48, 17, 12, 26, 73, 2, - 192, 78, 2, 121, 48, 17, 12, 26, 73, 2, 192, 78, 2, 63, 48, 17, 12, 26, - 73, 2, 192, 78, 2, 106, 210, 48, 17, 12, 26, 73, 2, 192, 78, 2, 73, 48, - 17, 12, 26, 251, 231, 2, 145, 48, 17, 12, 26, 251, 231, 2, 121, 48, 17, - 12, 26, 251, 231, 2, 234, 136, 48, 17, 12, 26, 251, 231, 2, 63, 48, 17, - 12, 26, 251, 231, 2, 106, 210, 48, 17, 12, 26, 251, 231, 2, 73, 48, 17, - 12, 26, 217, 216, 2, 145, 48, 17, 12, 26, 217, 216, 2, 121, 48, 17, 12, - 26, 217, 216, 2, 234, 136, 48, 17, 12, 26, 217, 216, 2, 63, 48, 17, 12, - 26, 217, 216, 2, 106, 210, 48, 17, 12, 26, 217, 216, 2, 73, 48, 17, 12, - 26, 217, 146, 2, 145, 48, 17, 12, 26, 217, 146, 2, 63, 48, 17, 12, 26, - 217, 146, 2, 106, 210, 48, 17, 12, 26, 217, 146, 2, 73, 48, 17, 12, 26, - 145, 2, 121, 48, 17, 12, 26, 145, 2, 63, 48, 17, 12, 26, 121, 2, 145, 48, - 17, 12, 26, 121, 2, 63, 48, 17, 12, 26, 234, 136, 2, 145, 48, 17, 12, 26, - 234, 136, 2, 121, 48, 17, 12, 26, 234, 136, 2, 63, 48, 17, 12, 26, 222, - 86, 2, 145, 48, 17, 12, 26, 222, 86, 2, 121, 48, 17, 12, 26, 222, 86, 2, - 234, 136, 48, 17, 12, 26, 222, 86, 2, 63, 48, 17, 12, 26, 222, 196, 2, - 121, 48, 17, 12, 26, 222, 196, 2, 63, 48, 17, 12, 26, 248, 160, 2, 145, - 48, 17, 12, 26, 248, 160, 2, 121, 48, 17, 12, 26, 248, 160, 2, 234, 136, - 48, 17, 12, 26, 248, 160, 2, 63, 48, 17, 12, 26, 218, 30, 2, 121, 48, 17, - 12, 26, 218, 30, 2, 63, 48, 17, 12, 26, 212, 105, 2, 63, 48, 17, 12, 26, - 254, 104, 2, 145, 48, 17, 12, 26, 254, 104, 2, 63, 48, 17, 12, 26, 242, - 221, 2, 145, 48, 17, 12, 26, 242, 221, 2, 63, 48, 17, 12, 26, 244, 112, - 2, 145, 48, 17, 12, 26, 244, 112, 2, 121, 48, 17, 12, 26, 244, 112, 2, - 234, 136, 48, 17, 12, 26, 244, 112, 2, 63, 48, 17, 12, 26, 244, 112, 2, - 106, 210, 48, 17, 12, 26, 244, 112, 2, 73, 48, 17, 12, 26, 224, 226, 2, - 121, 48, 17, 12, 26, 224, 226, 2, 63, 48, 17, 12, 26, 224, 226, 2, 106, - 210, 48, 17, 12, 26, 224, 226, 2, 73, 48, 17, 12, 26, 234, 255, 2, 106, - 48, 17, 12, 26, 234, 255, 2, 145, 48, 17, 12, 26, 234, 255, 2, 121, 48, - 17, 12, 26, 234, 255, 2, 234, 136, 48, 17, 12, 26, 234, 255, 2, 233, 127, - 48, 17, 12, 26, 234, 255, 2, 63, 48, 17, 12, 26, 234, 255, 2, 106, 210, - 48, 17, 12, 26, 234, 255, 2, 73, 48, 17, 12, 26, 233, 127, 2, 145, 48, - 17, 12, 26, 233, 127, 2, 121, 48, 17, 12, 26, 233, 127, 2, 234, 136, 48, - 17, 12, 26, 233, 127, 2, 63, 48, 17, 12, 26, 233, 127, 2, 106, 210, 48, - 17, 12, 26, 233, 127, 2, 73, 48, 17, 12, 26, 63, 2, 145, 48, 17, 12, 26, - 63, 2, 121, 48, 17, 12, 26, 63, 2, 234, 136, 48, 17, 12, 26, 63, 2, 63, - 48, 17, 12, 26, 63, 2, 106, 210, 48, 17, 12, 26, 63, 2, 73, 48, 17, 12, - 26, 228, 174, 2, 145, 48, 17, 12, 26, 228, 174, 2, 121, 48, 17, 12, 26, - 228, 174, 2, 234, 136, 48, 17, 12, 26, 228, 174, 2, 63, 48, 17, 12, 26, - 228, 174, 2, 106, 210, 48, 17, 12, 26, 228, 174, 2, 73, 48, 17, 12, 26, - 241, 203, 2, 145, 48, 17, 12, 26, 241, 203, 2, 63, 48, 17, 12, 26, 241, - 203, 2, 106, 210, 48, 17, 12, 26, 241, 203, 2, 73, 48, 17, 12, 26, 73, 2, - 145, 48, 17, 12, 26, 73, 2, 121, 48, 17, 12, 26, 73, 2, 234, 136, 48, 17, - 12, 26, 73, 2, 63, 48, 17, 12, 26, 73, 2, 106, 210, 48, 17, 12, 26, 73, - 2, 73, 48, 17, 12, 26, 217, 156, 2, 218, 223, 106, 48, 17, 12, 26, 223, - 246, 2, 218, 223, 106, 48, 17, 12, 26, 106, 210, 2, 218, 223, 106, 48, - 17, 12, 26, 221, 16, 2, 248, 128, 48, 17, 12, 26, 221, 16, 2, 234, 209, - 48, 17, 12, 26, 221, 16, 2, 244, 134, 48, 17, 12, 26, 221, 16, 2, 248, - 130, 48, 17, 12, 26, 221, 16, 2, 234, 211, 48, 17, 12, 26, 221, 16, 2, - 218, 223, 106, 48, 17, 12, 26, 73, 2, 192, 78, 2, 223, 246, 40, 17, 12, - 26, 73, 2, 192, 78, 2, 212, 102, 40, 17, 12, 26, 73, 2, 192, 78, 2, 63, - 40, 17, 12, 26, 73, 2, 192, 78, 2, 228, 174, 40, 17, 12, 26, 73, 2, 192, - 78, 2, 106, 210, 40, 17, 12, 26, 73, 2, 192, 78, 2, 73, 40, 17, 12, 26, - 251, 231, 2, 223, 246, 40, 17, 12, 26, 251, 231, 2, 212, 102, 40, 17, 12, - 26, 251, 231, 2, 63, 40, 17, 12, 26, 251, 231, 2, 228, 174, 40, 17, 12, - 26, 251, 231, 2, 106, 210, 40, 17, 12, 26, 251, 231, 2, 73, 40, 17, 12, - 26, 217, 216, 2, 223, 246, 40, 17, 12, 26, 217, 216, 2, 212, 102, 40, 17, - 12, 26, 217, 216, 2, 63, 40, 17, 12, 26, 217, 216, 2, 228, 174, 40, 17, - 12, 26, 217, 216, 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 73, 40, 17, - 12, 26, 217, 146, 2, 223, 246, 40, 17, 12, 26, 217, 146, 2, 212, 102, 40, - 17, 12, 26, 217, 146, 2, 63, 40, 17, 12, 26, 217, 146, 2, 228, 174, 40, - 17, 12, 26, 217, 146, 2, 106, 210, 40, 17, 12, 26, 217, 146, 2, 73, 40, - 17, 12, 26, 244, 112, 2, 106, 210, 40, 17, 12, 26, 244, 112, 2, 73, 40, - 17, 12, 26, 224, 226, 2, 106, 210, 40, 17, 12, 26, 224, 226, 2, 73, 40, - 17, 12, 26, 234, 255, 2, 106, 40, 17, 12, 26, 234, 255, 2, 233, 127, 40, - 17, 12, 26, 234, 255, 2, 63, 40, 17, 12, 26, 234, 255, 2, 106, 210, 40, - 17, 12, 26, 234, 255, 2, 73, 40, 17, 12, 26, 233, 127, 2, 63, 40, 17, 12, - 26, 233, 127, 2, 106, 210, 40, 17, 12, 26, 233, 127, 2, 73, 40, 17, 12, - 26, 63, 2, 106, 40, 17, 12, 26, 63, 2, 63, 40, 17, 12, 26, 228, 174, 2, - 223, 246, 40, 17, 12, 26, 228, 174, 2, 212, 102, 40, 17, 12, 26, 228, - 174, 2, 63, 40, 17, 12, 26, 228, 174, 2, 228, 174, 40, 17, 12, 26, 228, - 174, 2, 106, 210, 40, 17, 12, 26, 228, 174, 2, 73, 40, 17, 12, 26, 106, - 210, 2, 218, 223, 106, 40, 17, 12, 26, 73, 2, 223, 246, 40, 17, 12, 26, - 73, 2, 212, 102, 40, 17, 12, 26, 73, 2, 63, 40, 17, 12, 26, 73, 2, 228, - 174, 40, 17, 12, 26, 73, 2, 106, 210, 40, 17, 12, 26, 73, 2, 73, 40, 17, - 12, 26, 73, 2, 192, 78, 2, 145, 70, 17, 12, 26, 73, 2, 192, 78, 2, 121, - 70, 17, 12, 26, 73, 2, 192, 78, 2, 234, 136, 70, 17, 12, 26, 73, 2, 192, - 78, 2, 63, 70, 17, 12, 26, 73, 2, 192, 78, 2, 241, 203, 70, 17, 12, 26, - 251, 231, 2, 145, 70, 17, 12, 26, 251, 231, 2, 121, 70, 17, 12, 26, 251, - 231, 2, 234, 136, 70, 17, 12, 26, 251, 231, 2, 63, 70, 17, 12, 26, 251, - 231, 2, 241, 203, 70, 17, 12, 26, 217, 216, 2, 145, 70, 17, 12, 26, 217, - 216, 2, 121, 70, 17, 12, 26, 217, 216, 2, 234, 136, 70, 17, 12, 26, 217, - 216, 2, 63, 70, 17, 12, 26, 217, 216, 2, 241, 203, 70, 17, 12, 26, 217, - 146, 2, 63, 70, 17, 12, 26, 145, 2, 121, 70, 17, 12, 26, 145, 2, 63, 70, - 17, 12, 26, 121, 2, 145, 70, 17, 12, 26, 121, 2, 63, 70, 17, 12, 26, 234, - 136, 2, 145, 70, 17, 12, 26, 234, 136, 2, 63, 70, 17, 12, 26, 222, 86, 2, - 145, 70, 17, 12, 26, 222, 86, 2, 121, 70, 17, 12, 26, 222, 86, 2, 234, - 136, 70, 17, 12, 26, 222, 86, 2, 63, 70, 17, 12, 26, 222, 196, 2, 121, - 70, 17, 12, 26, 222, 196, 2, 234, 136, 70, 17, 12, 26, 222, 196, 2, 63, - 70, 17, 12, 26, 248, 160, 2, 145, 70, 17, 12, 26, 248, 160, 2, 121, 70, - 17, 12, 26, 248, 160, 2, 234, 136, 70, 17, 12, 26, 248, 160, 2, 63, 70, - 17, 12, 26, 218, 30, 2, 121, 70, 17, 12, 26, 212, 105, 2, 63, 70, 17, 12, - 26, 254, 104, 2, 145, 70, 17, 12, 26, 254, 104, 2, 63, 70, 17, 12, 26, - 242, 221, 2, 145, 70, 17, 12, 26, 242, 221, 2, 63, 70, 17, 12, 26, 244, - 112, 2, 145, 70, 17, 12, 26, 244, 112, 2, 121, 70, 17, 12, 26, 244, 112, - 2, 234, 136, 70, 17, 12, 26, 244, 112, 2, 63, 70, 17, 12, 26, 224, 226, - 2, 121, 70, 17, 12, 26, 224, 226, 2, 63, 70, 17, 12, 26, 234, 255, 2, - 145, 70, 17, 12, 26, 234, 255, 2, 121, 70, 17, 12, 26, 234, 255, 2, 234, - 136, 70, 17, 12, 26, 234, 255, 2, 233, 127, 70, 17, 12, 26, 234, 255, 2, - 63, 70, 17, 12, 26, 233, 127, 2, 145, 70, 17, 12, 26, 233, 127, 2, 121, - 70, 17, 12, 26, 233, 127, 2, 234, 136, 70, 17, 12, 26, 233, 127, 2, 63, - 70, 17, 12, 26, 233, 127, 2, 241, 203, 70, 17, 12, 26, 63, 2, 145, 70, - 17, 12, 26, 63, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 70, 17, 12, 26, - 63, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 70, 17, 12, 26, 228, 174, 2, - 121, 70, 17, 12, 26, 228, 174, 2, 234, 136, 70, 17, 12, 26, 228, 174, 2, - 63, 70, 17, 12, 26, 228, 174, 2, 241, 203, 70, 17, 12, 26, 241, 203, 2, - 145, 70, 17, 12, 26, 241, 203, 2, 63, 70, 17, 12, 26, 241, 203, 2, 218, - 223, 106, 70, 17, 12, 26, 73, 2, 145, 70, 17, 12, 26, 73, 2, 121, 70, 17, - 12, 26, 73, 2, 234, 136, 70, 17, 12, 26, 73, 2, 63, 70, 17, 12, 26, 73, - 2, 241, 203, 70, 17, 12, 26, 73, 2, 192, 78, 2, 63, 138, 17, 12, 26, 73, - 2, 192, 78, 2, 241, 203, 138, 17, 12, 26, 251, 231, 2, 63, 138, 17, 12, - 26, 251, 231, 2, 241, 203, 138, 17, 12, 26, 217, 216, 2, 63, 138, 17, 12, - 26, 217, 216, 2, 241, 203, 138, 17, 12, 26, 217, 146, 2, 63, 138, 17, 12, - 26, 217, 146, 2, 241, 203, 138, 17, 12, 26, 222, 86, 2, 63, 138, 17, 12, - 26, 222, 86, 2, 241, 203, 138, 17, 12, 26, 220, 240, 2, 63, 138, 17, 12, - 26, 220, 240, 2, 241, 203, 138, 17, 12, 26, 234, 255, 2, 233, 127, 138, - 17, 12, 26, 234, 255, 2, 63, 138, 17, 12, 26, 233, 127, 2, 63, 138, 17, - 12, 26, 228, 174, 2, 63, 138, 17, 12, 26, 228, 174, 2, 241, 203, 138, 17, - 12, 26, 73, 2, 63, 138, 17, 12, 26, 73, 2, 241, 203, 138, 17, 12, 26, - 221, 16, 2, 244, 134, 138, 17, 12, 26, 221, 16, 2, 248, 130, 138, 17, 12, - 26, 221, 16, 2, 234, 211, 138, 17, 12, 26, 218, 30, 2, 106, 210, 48, 17, - 12, 26, 218, 30, 2, 73, 48, 17, 12, 26, 254, 104, 2, 106, 210, 48, 17, - 12, 26, 254, 104, 2, 73, 48, 17, 12, 26, 242, 221, 2, 106, 210, 48, 17, - 12, 26, 242, 221, 2, 73, 48, 17, 12, 26, 222, 86, 2, 106, 210, 48, 17, - 12, 26, 222, 86, 2, 73, 48, 17, 12, 26, 220, 240, 2, 106, 210, 48, 17, - 12, 26, 220, 240, 2, 73, 48, 17, 12, 26, 121, 2, 106, 210, 48, 17, 12, - 26, 121, 2, 73, 48, 17, 12, 26, 145, 2, 106, 210, 48, 17, 12, 26, 145, 2, - 73, 48, 17, 12, 26, 234, 136, 2, 106, 210, 48, 17, 12, 26, 234, 136, 2, - 73, 48, 17, 12, 26, 222, 196, 2, 106, 210, 48, 17, 12, 26, 222, 196, 2, - 73, 48, 17, 12, 26, 248, 160, 2, 106, 210, 48, 17, 12, 26, 248, 160, 2, - 73, 48, 17, 12, 26, 220, 240, 2, 145, 48, 17, 12, 26, 220, 240, 2, 121, - 48, 17, 12, 26, 220, 240, 2, 234, 136, 48, 17, 12, 26, 220, 240, 2, 63, - 48, 17, 12, 26, 220, 240, 2, 223, 246, 48, 17, 12, 26, 222, 86, 2, 223, - 246, 48, 17, 12, 26, 222, 196, 2, 223, 246, 48, 17, 12, 26, 248, 160, 2, - 223, 246, 48, 17, 12, 26, 218, 30, 2, 106, 210, 40, 17, 12, 26, 218, 30, - 2, 73, 40, 17, 12, 26, 254, 104, 2, 106, 210, 40, 17, 12, 26, 254, 104, - 2, 73, 40, 17, 12, 26, 242, 221, 2, 106, 210, 40, 17, 12, 26, 242, 221, - 2, 73, 40, 17, 12, 26, 222, 86, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, - 73, 40, 17, 12, 26, 220, 240, 2, 106, 210, 40, 17, 12, 26, 220, 240, 2, - 73, 40, 17, 12, 26, 121, 2, 106, 210, 40, 17, 12, 26, 121, 2, 73, 40, 17, - 12, 26, 145, 2, 106, 210, 40, 17, 12, 26, 145, 2, 73, 40, 17, 12, 26, - 234, 136, 2, 106, 210, 40, 17, 12, 26, 234, 136, 2, 73, 40, 17, 12, 26, - 222, 196, 2, 106, 210, 40, 17, 12, 26, 222, 196, 2, 73, 40, 17, 12, 26, - 248, 160, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 73, 40, 17, 12, 26, - 220, 240, 2, 145, 40, 17, 12, 26, 220, 240, 2, 121, 40, 17, 12, 26, 220, - 240, 2, 234, 136, 40, 17, 12, 26, 220, 240, 2, 63, 40, 17, 12, 26, 220, - 240, 2, 223, 246, 40, 17, 12, 26, 222, 86, 2, 223, 246, 40, 17, 12, 26, - 222, 196, 2, 223, 246, 40, 17, 12, 26, 248, 160, 2, 223, 246, 40, 17, 12, - 26, 220, 240, 2, 145, 70, 17, 12, 26, 220, 240, 2, 121, 70, 17, 12, 26, - 220, 240, 2, 234, 136, 70, 17, 12, 26, 220, 240, 2, 63, 70, 17, 12, 26, - 222, 86, 2, 241, 203, 70, 17, 12, 26, 220, 240, 2, 241, 203, 70, 17, 12, - 26, 218, 30, 2, 63, 70, 17, 12, 26, 222, 86, 2, 145, 138, 17, 12, 26, - 222, 86, 2, 121, 138, 17, 12, 26, 222, 86, 2, 234, 136, 138, 17, 12, 26, - 220, 240, 2, 145, 138, 17, 12, 26, 220, 240, 2, 121, 138, 17, 12, 26, - 220, 240, 2, 234, 136, 138, 17, 12, 26, 218, 30, 2, 63, 138, 17, 12, 26, - 212, 105, 2, 63, 138, 17, 12, 26, 106, 2, 244, 132, 40, 17, 12, 26, 106, - 2, 244, 132, 48, 17, 227, 13, 42, 226, 131, 227, 13, 46, 226, 131, 12, - 26, 217, 216, 2, 145, 2, 63, 70, 17, 12, 26, 217, 216, 2, 121, 2, 145, - 40, 17, 12, 26, 217, 216, 2, 121, 2, 145, 70, 17, 12, 26, 217, 216, 2, - 121, 2, 63, 70, 17, 12, 26, 217, 216, 2, 234, 136, 2, 63, 70, 17, 12, 26, - 217, 216, 2, 63, 2, 145, 70, 17, 12, 26, 217, 216, 2, 63, 2, 121, 70, 17, - 12, 26, 217, 216, 2, 63, 2, 234, 136, 70, 17, 12, 26, 145, 2, 63, 2, 121, - 40, 17, 12, 26, 145, 2, 63, 2, 121, 70, 17, 12, 26, 121, 2, 63, 2, 73, - 40, 17, 12, 26, 121, 2, 63, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 121, - 2, 145, 70, 17, 12, 26, 222, 86, 2, 145, 2, 121, 70, 17, 12, 26, 222, 86, - 2, 145, 2, 106, 210, 40, 17, 12, 26, 222, 86, 2, 63, 2, 121, 40, 17, 12, - 26, 222, 86, 2, 63, 2, 121, 70, 17, 12, 26, 222, 86, 2, 63, 2, 145, 70, - 17, 12, 26, 222, 86, 2, 63, 2, 63, 40, 17, 12, 26, 222, 86, 2, 63, 2, 63, - 70, 17, 12, 26, 222, 196, 2, 121, 2, 121, 40, 17, 12, 26, 222, 196, 2, - 121, 2, 121, 70, 17, 12, 26, 222, 196, 2, 63, 2, 63, 40, 17, 12, 26, 220, - 240, 2, 121, 2, 63, 40, 17, 12, 26, 220, 240, 2, 121, 2, 63, 70, 17, 12, - 26, 220, 240, 2, 145, 2, 73, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234, - 136, 40, 17, 12, 26, 220, 240, 2, 63, 2, 234, 136, 70, 17, 12, 26, 220, - 240, 2, 63, 2, 63, 40, 17, 12, 26, 220, 240, 2, 63, 2, 63, 70, 17, 12, - 26, 248, 160, 2, 121, 2, 106, 210, 40, 17, 12, 26, 248, 160, 2, 234, 136, - 2, 63, 40, 17, 12, 26, 248, 160, 2, 234, 136, 2, 63, 70, 17, 12, 26, 218, - 30, 2, 63, 2, 121, 40, 17, 12, 26, 218, 30, 2, 63, 2, 121, 70, 17, 12, - 26, 218, 30, 2, 63, 2, 63, 70, 17, 12, 26, 218, 30, 2, 63, 2, 73, 40, 17, - 12, 26, 254, 104, 2, 145, 2, 63, 40, 17, 12, 26, 254, 104, 2, 63, 2, 63, - 40, 17, 12, 26, 254, 104, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 63, - 2, 106, 210, 40, 17, 12, 26, 242, 221, 2, 63, 2, 63, 40, 17, 12, 26, 242, - 221, 2, 63, 2, 73, 40, 17, 12, 26, 242, 221, 2, 63, 2, 106, 210, 40, 17, - 12, 26, 244, 112, 2, 234, 136, 2, 63, 40, 17, 12, 26, 244, 112, 2, 234, - 136, 2, 63, 70, 17, 12, 26, 224, 226, 2, 63, 2, 121, 40, 17, 12, 26, 224, - 226, 2, 63, 2, 63, 40, 17, 12, 26, 233, 127, 2, 121, 2, 63, 40, 17, 12, - 26, 233, 127, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 121, 2, 106, - 210, 40, 17, 12, 26, 233, 127, 2, 145, 2, 145, 70, 17, 12, 26, 233, 127, - 2, 145, 2, 145, 40, 17, 12, 26, 233, 127, 2, 234, 136, 2, 63, 40, 17, 12, - 26, 233, 127, 2, 234, 136, 2, 63, 70, 17, 12, 26, 233, 127, 2, 63, 2, - 121, 40, 17, 12, 26, 233, 127, 2, 63, 2, 121, 70, 17, 12, 26, 63, 2, 121, - 2, 145, 70, 17, 12, 26, 63, 2, 121, 2, 63, 70, 17, 12, 26, 63, 2, 121, 2, - 73, 40, 17, 12, 26, 63, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 145, 2, - 63, 70, 17, 12, 26, 63, 2, 234, 136, 2, 145, 70, 17, 12, 26, 63, 2, 234, - 136, 2, 63, 70, 17, 12, 26, 63, 2, 145, 2, 234, 136, 70, 17, 12, 26, 241, - 203, 2, 63, 2, 145, 70, 17, 12, 26, 241, 203, 2, 63, 2, 63, 70, 17, 12, - 26, 228, 174, 2, 121, 2, 63, 70, 17, 12, 26, 228, 174, 2, 121, 2, 106, - 210, 40, 17, 12, 26, 228, 174, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174, - 2, 145, 2, 63, 70, 17, 12, 26, 228, 174, 2, 145, 2, 106, 210, 40, 17, 12, - 26, 228, 174, 2, 63, 2, 73, 40, 17, 12, 26, 228, 174, 2, 63, 2, 106, 210, - 40, 17, 12, 26, 73, 2, 63, 2, 63, 40, 17, 12, 26, 73, 2, 63, 2, 63, 70, - 17, 12, 26, 251, 231, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2, - 145, 2, 73, 40, 17, 12, 26, 217, 216, 2, 145, 2, 106, 210, 40, 17, 12, - 26, 217, 216, 2, 234, 136, 2, 73, 40, 17, 12, 26, 217, 216, 2, 234, 136, - 2, 106, 210, 40, 17, 12, 26, 217, 216, 2, 63, 2, 73, 40, 17, 12, 26, 217, - 216, 2, 63, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 73, 40, 17, 12, - 26, 145, 2, 121, 2, 106, 210, 40, 17, 12, 26, 145, 2, 63, 2, 106, 210, - 40, 17, 12, 26, 222, 86, 2, 234, 136, 2, 106, 210, 40, 17, 12, 26, 222, - 196, 2, 121, 2, 73, 40, 17, 12, 26, 220, 240, 2, 121, 2, 73, 40, 17, 12, - 26, 248, 160, 2, 121, 2, 73, 40, 17, 12, 26, 233, 127, 2, 145, 2, 73, 40, - 17, 12, 26, 233, 127, 2, 63, 2, 73, 40, 17, 12, 26, 73, 2, 121, 2, 73, - 40, 17, 12, 26, 73, 2, 145, 2, 73, 40, 17, 12, 26, 73, 2, 63, 2, 73, 40, - 17, 12, 26, 63, 2, 63, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2, 73, 40, - 17, 12, 26, 228, 174, 2, 121, 2, 73, 40, 17, 12, 26, 224, 226, 2, 63, 2, - 121, 70, 17, 12, 26, 233, 127, 2, 121, 2, 63, 70, 17, 12, 26, 254, 104, - 2, 63, 2, 73, 40, 17, 12, 26, 234, 255, 2, 63, 2, 73, 40, 17, 12, 26, - 228, 174, 2, 145, 2, 121, 70, 17, 12, 26, 63, 2, 234, 136, 2, 73, 40, 17, - 12, 26, 233, 127, 2, 145, 2, 63, 70, 17, 12, 26, 234, 255, 2, 63, 2, 63, - 40, 17, 12, 26, 233, 127, 2, 145, 2, 63, 40, 17, 12, 26, 228, 174, 2, - 145, 2, 121, 40, 17, 12, 26, 145, 2, 121, 2, 73, 40, 17, 12, 26, 121, 2, - 145, 2, 73, 40, 17, 12, 26, 63, 2, 145, 2, 73, 40, 17, 12, 26, 244, 112, - 2, 63, 2, 73, 40, 17, 12, 26, 251, 231, 2, 121, 2, 73, 40, 17, 12, 26, - 234, 255, 2, 63, 2, 63, 70, 17, 12, 26, 254, 104, 2, 145, 2, 63, 70, 17, - 12, 26, 222, 196, 2, 63, 2, 63, 70, 17, 12, 26, 222, 86, 2, 234, 136, 2, - 73, 40, 17, 12, 26, 228, 174, 2, 145, 2, 73, 40, 17, 12, 26, 222, 175, - 215, 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 224, 222, 215, - 102, 253, 153, 234, 13, 219, 70, 5, 48, 17, 12, 26, 254, 62, 48, 17, 12, - 26, 254, 91, 48, 17, 12, 26, 230, 223, 48, 17, 12, 26, 222, 176, 48, 17, - 12, 26, 224, 35, 48, 17, 12, 26, 254, 80, 48, 17, 12, 26, 214, 33, 48, - 17, 12, 26, 222, 175, 48, 17, 12, 26, 222, 174, 254, 80, 214, 32, 12, 26, - 235, 134, 223, 187, 52, 12, 26, 251, 153, 253, 209, 253, 210, 43, 222, - 76, 43, 221, 221, 43, 221, 153, 43, 221, 142, 43, 221, 131, 43, 221, 120, - 43, 221, 109, 43, 221, 98, 43, 221, 87, 43, 222, 75, 43, 222, 64, 43, - 222, 53, 43, 222, 42, 43, 222, 31, 43, 222, 20, 43, 222, 9, 225, 74, 243, - 245, 31, 71, 249, 157, 225, 74, 243, 245, 31, 71, 105, 249, 157, 225, 74, - 243, 245, 31, 71, 105, 243, 200, 219, 69, 225, 74, 243, 245, 31, 71, 249, - 164, 225, 74, 243, 245, 31, 71, 221, 70, 225, 74, 243, 245, 31, 71, 244, - 254, 77, 225, 74, 243, 245, 31, 71, 224, 158, 77, 225, 74, 243, 245, 31, - 71, 42, 67, 233, 44, 125, 225, 74, 243, 245, 31, 71, 46, 67, 233, 44, - 251, 83, 225, 74, 243, 245, 31, 71, 199, 245, 120, 37, 26, 42, 242, 9, - 37, 26, 46, 242, 9, 37, 51, 217, 43, 42, 242, 9, 37, 51, 217, 43, 46, - 242, 9, 37, 232, 38, 42, 242, 9, 37, 232, 38, 46, 242, 9, 37, 249, 137, - 232, 37, 225, 74, 243, 245, 31, 71, 117, 62, 233, 80, 225, 74, 243, 245, - 31, 71, 245, 118, 248, 101, 225, 74, 243, 245, 31, 71, 245, 109, 248, - 101, 225, 74, 243, 245, 31, 71, 115, 232, 242, 225, 74, 243, 245, 31, 71, - 214, 16, 115, 232, 242, 225, 74, 243, 245, 31, 71, 42, 226, 131, 225, 74, - 243, 245, 31, 71, 46, 226, 131, 225, 74, 243, 245, 31, 71, 42, 249, 40, - 125, 225, 74, 243, 245, 31, 71, 46, 249, 40, 125, 225, 74, 243, 245, 31, - 71, 42, 216, 219, 220, 233, 125, 225, 74, 243, 245, 31, 71, 46, 216, 219, - 220, 233, 125, 225, 74, 243, 245, 31, 71, 42, 83, 233, 44, 125, 225, 74, - 243, 245, 31, 71, 46, 83, 233, 44, 125, 225, 74, 243, 245, 31, 71, 42, - 51, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46, 51, 254, 19, 125, 225, - 74, 243, 245, 31, 71, 42, 254, 19, 125, 225, 74, 243, 245, 31, 71, 46, - 254, 19, 125, 225, 74, 243, 245, 31, 71, 42, 249, 100, 125, 225, 74, 243, - 245, 31, 71, 46, 249, 100, 125, 225, 74, 243, 245, 31, 71, 42, 67, 249, - 100, 125, 225, 74, 243, 245, 31, 71, 46, 67, 249, 100, 125, 221, 52, 247, - 74, 67, 221, 52, 247, 74, 225, 74, 243, 245, 31, 71, 42, 41, 125, 225, - 74, 243, 245, 31, 71, 46, 41, 125, 248, 100, 226, 243, 250, 106, 226, - 243, 214, 16, 226, 243, 51, 214, 16, 226, 243, 248, 100, 115, 232, 242, - 250, 106, 115, 232, 242, 214, 16, 115, 232, 242, 3, 249, 157, 3, 105, - 249, 157, 3, 243, 200, 219, 69, 3, 221, 70, 3, 249, 164, 3, 224, 158, 77, - 3, 244, 254, 77, 3, 245, 118, 248, 101, 3, 42, 226, 131, 3, 46, 226, 131, - 3, 42, 249, 40, 125, 3, 46, 249, 40, 125, 3, 42, 216, 219, 220, 233, 125, - 3, 46, 216, 219, 220, 233, 125, 3, 50, 52, 3, 254, 35, 3, 253, 132, 3, - 94, 52, 3, 240, 159, 3, 233, 39, 52, 3, 242, 107, 52, 3, 245, 61, 52, 3, - 223, 203, 219, 231, 3, 247, 86, 52, 3, 226, 57, 52, 3, 249, 156, 253, - 122, 12, 244, 132, 48, 17, 12, 217, 251, 2, 244, 132, 49, 12, 248, 128, - 48, 17, 12, 218, 28, 243, 227, 12, 234, 209, 48, 17, 12, 244, 134, 48, - 17, 12, 244, 134, 138, 17, 12, 248, 130, 48, 17, 12, 248, 130, 138, 17, - 12, 234, 211, 48, 17, 12, 234, 211, 138, 17, 12, 221, 16, 48, 17, 12, - 221, 16, 138, 17, 12, 218, 247, 48, 17, 12, 218, 247, 138, 17, 12, 1, - 192, 48, 17, 12, 1, 106, 2, 232, 33, 78, 48, 17, 12, 1, 106, 2, 232, 33, - 78, 40, 17, 12, 1, 106, 2, 192, 78, 48, 17, 12, 1, 106, 2, 192, 78, 40, - 17, 12, 1, 214, 15, 2, 192, 78, 48, 17, 12, 1, 214, 15, 2, 192, 78, 40, - 17, 12, 1, 106, 2, 192, 251, 220, 48, 17, 12, 1, 106, 2, 192, 251, 220, - 40, 17, 12, 1, 73, 2, 192, 78, 48, 17, 12, 1, 73, 2, 192, 78, 40, 17, 12, - 1, 73, 2, 192, 78, 70, 17, 12, 1, 73, 2, 192, 78, 138, 17, 12, 1, 106, - 48, 17, 12, 1, 106, 40, 17, 12, 1, 251, 231, 48, 17, 12, 1, 251, 231, 40, - 17, 12, 1, 251, 231, 70, 17, 12, 1, 251, 231, 138, 17, 12, 1, 217, 216, - 231, 228, 48, 17, 12, 1, 217, 216, 231, 228, 40, 17, 12, 1, 217, 216, 48, - 17, 12, 1, 217, 216, 40, 17, 12, 1, 217, 216, 70, 17, 12, 1, 217, 216, - 138, 17, 12, 1, 217, 146, 48, 17, 12, 1, 217, 146, 40, 17, 12, 1, 217, - 146, 70, 17, 12, 1, 217, 146, 138, 17, 12, 1, 145, 48, 17, 12, 1, 145, - 40, 17, 12, 1, 145, 70, 17, 12, 1, 145, 138, 17, 12, 1, 121, 48, 17, 12, - 1, 121, 40, 17, 12, 1, 121, 70, 17, 12, 1, 121, 138, 17, 12, 1, 234, 136, - 48, 17, 12, 1, 234, 136, 40, 17, 12, 1, 234, 136, 70, 17, 12, 1, 234, - 136, 138, 17, 12, 1, 248, 141, 48, 17, 12, 1, 248, 141, 40, 17, 12, 1, - 217, 156, 48, 17, 12, 1, 217, 156, 40, 17, 12, 1, 223, 246, 48, 17, 12, - 1, 223, 246, 40, 17, 12, 1, 212, 102, 48, 17, 12, 1, 212, 102, 40, 17, - 12, 1, 222, 86, 48, 17, 12, 1, 222, 86, 40, 17, 12, 1, 222, 86, 70, 17, - 12, 1, 222, 86, 138, 17, 12, 1, 220, 240, 48, 17, 12, 1, 220, 240, 40, - 17, 12, 1, 220, 240, 70, 17, 12, 1, 220, 240, 138, 17, 12, 1, 222, 196, - 48, 17, 12, 1, 222, 196, 40, 17, 12, 1, 222, 196, 70, 17, 12, 1, 222, - 196, 138, 17, 12, 1, 248, 160, 48, 17, 12, 1, 248, 160, 40, 17, 12, 1, - 248, 160, 70, 17, 12, 1, 248, 160, 138, 17, 12, 1, 218, 30, 48, 17, 12, - 1, 218, 30, 40, 17, 12, 1, 218, 30, 70, 17, 12, 1, 218, 30, 138, 17, 12, - 1, 212, 105, 48, 17, 12, 1, 212, 105, 40, 17, 12, 1, 212, 105, 70, 17, - 12, 1, 212, 105, 138, 17, 12, 1, 254, 104, 48, 17, 12, 1, 254, 104, 40, - 17, 12, 1, 254, 104, 70, 17, 12, 1, 254, 104, 138, 17, 12, 1, 242, 221, - 48, 17, 12, 1, 242, 221, 40, 17, 12, 1, 242, 221, 70, 17, 12, 1, 242, - 221, 138, 17, 12, 1, 244, 112, 48, 17, 12, 1, 244, 112, 40, 17, 12, 1, - 244, 112, 70, 17, 12, 1, 244, 112, 138, 17, 12, 1, 224, 226, 48, 17, 12, - 1, 224, 226, 40, 17, 12, 1, 224, 226, 70, 17, 12, 1, 224, 226, 138, 17, - 12, 1, 234, 255, 48, 17, 12, 1, 234, 255, 40, 17, 12, 1, 234, 255, 70, - 17, 12, 1, 234, 255, 138, 17, 12, 1, 233, 127, 48, 17, 12, 1, 233, 127, - 40, 17, 12, 1, 233, 127, 70, 17, 12, 1, 233, 127, 138, 17, 12, 1, 63, 48, - 17, 12, 1, 63, 40, 17, 12, 1, 63, 70, 17, 12, 1, 63, 138, 17, 12, 1, 228, - 174, 48, 17, 12, 1, 228, 174, 40, 17, 12, 1, 228, 174, 70, 17, 12, 1, - 228, 174, 138, 17, 12, 1, 241, 203, 48, 17, 12, 1, 241, 203, 40, 17, 12, - 1, 241, 203, 70, 17, 12, 1, 241, 203, 138, 17, 12, 1, 214, 15, 48, 17, - 12, 1, 214, 15, 40, 17, 12, 1, 106, 210, 48, 17, 12, 1, 106, 210, 40, 17, - 12, 1, 73, 48, 17, 12, 1, 73, 40, 17, 12, 1, 73, 70, 17, 12, 1, 73, 138, - 17, 12, 26, 233, 127, 2, 106, 2, 232, 33, 78, 48, 17, 12, 26, 233, 127, - 2, 106, 2, 232, 33, 78, 40, 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 48, - 17, 12, 26, 233, 127, 2, 106, 2, 192, 78, 40, 17, 12, 26, 233, 127, 2, - 106, 2, 192, 251, 220, 48, 17, 12, 26, 233, 127, 2, 106, 2, 192, 251, - 220, 40, 17, 12, 26, 233, 127, 2, 106, 48, 17, 12, 26, 233, 127, 2, 106, - 40, 17, 212, 80, 213, 230, 228, 184, 219, 206, 120, 244, 254, 77, 120, - 224, 143, 77, 120, 50, 52, 120, 247, 86, 52, 120, 226, 57, 52, 120, 254, - 35, 120, 253, 226, 120, 42, 226, 131, 120, 46, 226, 131, 120, 253, 132, - 120, 94, 52, 120, 249, 157, 120, 240, 159, 120, 243, 200, 219, 69, 120, - 219, 231, 120, 21, 212, 79, 120, 21, 116, 120, 21, 109, 120, 21, 166, - 120, 21, 163, 120, 21, 180, 120, 21, 189, 120, 21, 198, 120, 21, 195, - 120, 21, 200, 120, 249, 164, 120, 221, 70, 120, 233, 39, 52, 120, 245, - 61, 52, 120, 242, 107, 52, 120, 224, 158, 77, 120, 249, 156, 253, 122, - 120, 7, 6, 1, 61, 120, 7, 6, 1, 253, 74, 120, 7, 6, 1, 250, 252, 120, 7, - 6, 1, 249, 3, 120, 7, 6, 1, 74, 120, 7, 6, 1, 244, 230, 120, 7, 6, 1, - 243, 177, 120, 7, 6, 1, 242, 41, 120, 7, 6, 1, 72, 120, 7, 6, 1, 235, - 142, 120, 7, 6, 1, 235, 27, 120, 7, 6, 1, 150, 120, 7, 6, 1, 183, 120, 7, - 6, 1, 204, 120, 7, 6, 1, 75, 120, 7, 6, 1, 226, 229, 120, 7, 6, 1, 224, - 240, 120, 7, 6, 1, 149, 120, 7, 6, 1, 197, 120, 7, 6, 1, 218, 99, 120, 7, - 6, 1, 69, 120, 7, 6, 1, 215, 79, 120, 7, 6, 1, 214, 82, 120, 7, 6, 1, - 213, 166, 120, 7, 6, 1, 213, 105, 120, 7, 6, 1, 212, 152, 120, 42, 41, - 125, 120, 223, 203, 219, 231, 120, 46, 41, 125, 120, 249, 224, 254, 174, - 120, 115, 232, 242, 120, 242, 114, 254, 174, 120, 7, 3, 1, 61, 120, 7, 3, - 1, 253, 74, 120, 7, 3, 1, 250, 252, 120, 7, 3, 1, 249, 3, 120, 7, 3, 1, - 74, 120, 7, 3, 1, 244, 230, 120, 7, 3, 1, 243, 177, 120, 7, 3, 1, 242, - 41, 120, 7, 3, 1, 72, 120, 7, 3, 1, 235, 142, 120, 7, 3, 1, 235, 27, 120, - 7, 3, 1, 150, 120, 7, 3, 1, 183, 120, 7, 3, 1, 204, 120, 7, 3, 1, 75, - 120, 7, 3, 1, 226, 229, 120, 7, 3, 1, 224, 240, 120, 7, 3, 1, 149, 120, - 7, 3, 1, 197, 120, 7, 3, 1, 218, 99, 120, 7, 3, 1, 69, 120, 7, 3, 1, 215, - 79, 120, 7, 3, 1, 214, 82, 120, 7, 3, 1, 213, 166, 120, 7, 3, 1, 213, - 105, 120, 7, 3, 1, 212, 152, 120, 42, 249, 40, 125, 120, 71, 232, 242, - 120, 46, 249, 40, 125, 120, 217, 42, 120, 42, 67, 226, 131, 120, 46, 67, - 226, 131, 98, 105, 243, 200, 219, 69, 98, 42, 249, 100, 125, 98, 46, 249, - 100, 125, 98, 105, 249, 157, 98, 56, 231, 37, 247, 74, 98, 56, 1, 213, - 214, 98, 56, 1, 3, 61, 98, 56, 1, 3, 72, 98, 56, 1, 3, 69, 98, 56, 1, 3, - 74, 98, 56, 1, 3, 75, 98, 56, 1, 3, 186, 98, 56, 1, 3, 212, 203, 98, 56, - 1, 3, 212, 235, 98, 56, 1, 3, 216, 82, 98, 234, 206, 225, 57, 219, 218, - 77, 98, 56, 1, 61, 98, 56, 1, 72, 98, 56, 1, 69, 98, 56, 1, 74, 98, 56, - 1, 75, 98, 56, 1, 181, 98, 56, 1, 234, 101, 98, 56, 1, 233, 238, 98, 56, - 1, 234, 188, 98, 56, 1, 234, 37, 98, 56, 1, 222, 202, 98, 56, 1, 220, - 117, 98, 56, 1, 219, 27, 98, 56, 1, 222, 100, 98, 56, 1, 219, 242, 98, - 56, 1, 218, 52, 98, 56, 1, 217, 71, 98, 56, 1, 216, 82, 98, 56, 1, 217, - 229, 98, 56, 1, 108, 98, 56, 1, 205, 98, 56, 1, 229, 64, 98, 56, 1, 228, - 92, 98, 56, 1, 229, 187, 98, 56, 1, 228, 185, 98, 56, 1, 159, 98, 56, 1, - 241, 165, 98, 56, 1, 240, 212, 98, 56, 1, 241, 222, 98, 56, 1, 241, 54, - 98, 56, 1, 188, 98, 56, 1, 231, 42, 98, 56, 1, 230, 172, 98, 56, 1, 231, - 156, 98, 56, 1, 230, 231, 98, 56, 1, 186, 98, 56, 1, 212, 203, 98, 56, 1, - 212, 235, 98, 56, 1, 203, 98, 56, 1, 223, 188, 98, 56, 1, 223, 51, 98, - 56, 1, 224, 21, 98, 56, 1, 223, 112, 98, 56, 1, 214, 49, 98, 56, 1, 204, - 98, 56, 214, 116, 219, 218, 77, 98, 56, 221, 75, 219, 218, 77, 98, 23, - 244, 72, 98, 23, 1, 234, 67, 98, 23, 1, 219, 150, 98, 23, 1, 234, 60, 98, - 23, 1, 229, 57, 98, 23, 1, 229, 55, 98, 23, 1, 229, 54, 98, 23, 1, 217, - 55, 98, 23, 1, 219, 139, 98, 23, 1, 223, 179, 98, 23, 1, 223, 174, 98, - 23, 1, 223, 171, 98, 23, 1, 223, 164, 98, 23, 1, 223, 159, 98, 23, 1, - 223, 154, 98, 23, 1, 223, 165, 98, 23, 1, 223, 177, 98, 23, 1, 231, 30, - 98, 23, 1, 225, 227, 98, 23, 1, 219, 147, 98, 23, 1, 225, 216, 98, 23, 1, - 220, 76, 98, 23, 1, 219, 144, 98, 23, 1, 236, 51, 98, 23, 1, 249, 239, - 98, 23, 1, 219, 154, 98, 23, 1, 250, 43, 98, 23, 1, 234, 116, 98, 23, 1, - 217, 126, 98, 23, 1, 226, 7, 98, 23, 1, 241, 158, 98, 23, 1, 61, 98, 23, - 1, 254, 148, 98, 23, 1, 186, 98, 23, 1, 213, 80, 98, 23, 1, 245, 76, 98, - 23, 1, 74, 98, 23, 1, 213, 27, 98, 23, 1, 213, 38, 98, 23, 1, 75, 98, 23, - 1, 214, 49, 98, 23, 1, 214, 46, 98, 23, 1, 227, 99, 98, 23, 1, 212, 235, - 98, 23, 1, 69, 98, 23, 1, 213, 252, 98, 23, 1, 214, 6, 98, 23, 1, 213, - 235, 98, 23, 1, 212, 203, 98, 23, 1, 245, 22, 98, 23, 1, 212, 255, 98, - 23, 1, 72, 120, 250, 110, 52, 120, 225, 108, 52, 120, 228, 163, 52, 120, - 232, 37, 120, 251, 63, 134, 120, 213, 31, 52, 120, 213, 204, 52, 98, 243, - 243, 177, 214, 216, 98, 132, 68, 98, 215, 124, 68, 98, 95, 68, 98, 246, - 58, 68, 98, 83, 219, 166, 98, 67, 249, 228, 235, 201, 254, 10, 254, 29, - 235, 201, 254, 10, 221, 57, 235, 201, 254, 10, 217, 189, 227, 113, 223, - 224, 250, 78, 223, 224, 250, 78, 58, 54, 4, 253, 58, 61, 58, 54, 4, 253, - 27, 74, 58, 54, 4, 253, 36, 72, 58, 54, 4, 253, 4, 75, 58, 54, 4, 253, - 54, 69, 58, 54, 4, 253, 73, 248, 164, 58, 54, 4, 253, 20, 248, 41, 58, - 54, 4, 253, 60, 247, 211, 58, 54, 4, 253, 50, 247, 99, 58, 54, 4, 253, - 14, 246, 33, 58, 54, 4, 253, 8, 235, 139, 58, 54, 4, 253, 19, 235, 127, - 58, 54, 4, 253, 29, 235, 71, 58, 54, 4, 253, 0, 235, 54, 58, 54, 4, 252, - 244, 181, 58, 54, 4, 253, 21, 234, 188, 58, 54, 4, 252, 254, 234, 101, - 58, 54, 4, 252, 251, 234, 37, 58, 54, 4, 252, 240, 233, 238, 58, 54, 4, - 252, 241, 188, 58, 54, 4, 253, 51, 231, 156, 58, 54, 4, 252, 248, 231, - 42, 58, 54, 4, 253, 49, 230, 231, 58, 54, 4, 253, 41, 230, 172, 58, 54, - 4, 253, 62, 205, 58, 54, 4, 253, 40, 229, 187, 58, 54, 4, 253, 34, 229, - 64, 58, 54, 4, 253, 13, 228, 185, 58, 54, 4, 253, 10, 228, 92, 58, 54, 4, - 253, 69, 193, 58, 54, 4, 252, 249, 226, 96, 58, 54, 4, 253, 26, 225, 240, - 58, 54, 4, 253, 53, 225, 150, 58, 54, 4, 253, 15, 225, 35, 58, 54, 4, - 253, 48, 224, 232, 58, 54, 4, 252, 243, 224, 213, 58, 54, 4, 253, 43, - 224, 198, 58, 54, 4, 253, 32, 224, 187, 58, 54, 4, 253, 5, 203, 58, 54, - 4, 253, 37, 224, 21, 58, 54, 4, 253, 12, 223, 188, 58, 54, 4, 253, 71, - 223, 112, 58, 54, 4, 253, 38, 223, 51, 58, 54, 4, 253, 33, 222, 202, 58, - 54, 4, 253, 56, 222, 100, 58, 54, 4, 253, 24, 220, 117, 58, 54, 4, 253, - 52, 219, 242, 58, 54, 4, 253, 7, 219, 27, 58, 54, 4, 253, 6, 218, 52, 58, - 54, 4, 253, 67, 217, 229, 58, 54, 4, 253, 28, 217, 71, 58, 54, 4, 253, - 65, 108, 58, 54, 4, 252, 252, 216, 82, 58, 54, 4, 253, 11, 214, 49, 58, - 54, 4, 252, 246, 214, 6, 58, 54, 4, 253, 25, 213, 235, 58, 54, 4, 253, - 23, 213, 214, 58, 54, 4, 253, 47, 212, 109, 58, 54, 4, 252, 247, 212, 87, - 58, 54, 4, 253, 44, 212, 16, 58, 54, 4, 253, 39, 254, 234, 58, 54, 4, - 253, 22, 254, 233, 58, 54, 4, 252, 237, 253, 108, 58, 54, 4, 252, 250, - 246, 1, 58, 54, 4, 252, 233, 246, 0, 58, 54, 4, 253, 17, 228, 31, 58, 54, - 4, 253, 35, 225, 34, 58, 54, 4, 253, 3, 225, 37, 58, 54, 4, 252, 245, - 224, 76, 58, 54, 4, 253, 31, 224, 75, 58, 54, 4, 252, 253, 223, 111, 58, - 54, 4, 252, 255, 218, 50, 58, 54, 4, 252, 235, 216, 43, 58, 54, 4, 252, - 232, 109, 58, 54, 16, 253, 46, 58, 54, 16, 253, 45, 58, 54, 16, 253, 42, - 58, 54, 16, 253, 30, 58, 54, 16, 253, 18, 58, 54, 16, 253, 16, 58, 54, - 16, 253, 9, 58, 54, 16, 253, 2, 58, 54, 16, 253, 1, 58, 54, 16, 252, 242, - 58, 54, 16, 252, 239, 58, 54, 16, 252, 238, 58, 54, 16, 252, 236, 58, 54, - 16, 252, 234, 58, 54, 102, 252, 231, 231, 248, 58, 54, 102, 252, 230, - 213, 208, 58, 54, 102, 252, 229, 248, 25, 58, 54, 102, 252, 228, 245, 58, - 58, 54, 102, 252, 227, 231, 222, 58, 54, 102, 252, 226, 219, 101, 58, 54, - 102, 252, 225, 245, 4, 58, 54, 102, 252, 224, 224, 45, 58, 54, 102, 252, - 223, 220, 242, 58, 54, 102, 252, 222, 241, 221, 58, 54, 102, 252, 221, - 219, 212, 58, 54, 102, 252, 220, 251, 126, 58, 54, 102, 252, 219, 249, - 84, 58, 54, 102, 252, 218, 251, 44, 58, 54, 102, 252, 217, 213, 243, 58, - 54, 102, 252, 216, 252, 56, 58, 54, 102, 252, 215, 227, 71, 58, 54, 102, - 252, 214, 219, 186, 58, 54, 102, 252, 213, 249, 11, 58, 54, 230, 212, - 252, 212, 234, 229, 58, 54, 230, 212, 252, 211, 234, 237, 58, 54, 102, - 252, 210, 227, 84, 58, 54, 102, 252, 209, 213, 221, 58, 54, 102, 252, - 208, 58, 54, 230, 212, 252, 207, 253, 188, 58, 54, 230, 212, 252, 206, - 231, 116, 58, 54, 102, 252, 205, 251, 62, 58, 54, 102, 252, 204, 242, - 142, 58, 54, 102, 252, 203, 58, 54, 102, 252, 202, 213, 199, 58, 54, 102, - 252, 201, 58, 54, 102, 252, 200, 58, 54, 102, 252, 199, 240, 235, 58, 54, - 102, 252, 198, 58, 54, 102, 252, 197, 58, 54, 102, 252, 196, 58, 54, 230, - 212, 252, 194, 216, 56, 58, 54, 102, 252, 193, 58, 54, 102, 252, 192, 58, - 54, 102, 252, 191, 249, 187, 58, 54, 102, 252, 190, 58, 54, 102, 252, - 189, 58, 54, 102, 252, 188, 243, 69, 58, 54, 102, 252, 187, 253, 175, 58, - 54, 102, 252, 186, 58, 54, 102, 252, 185, 58, 54, 102, 252, 184, 58, 54, - 102, 252, 183, 58, 54, 102, 252, 182, 58, 54, 102, 252, 181, 58, 54, 102, - 252, 180, 58, 54, 102, 252, 179, 58, 54, 102, 252, 178, 58, 54, 102, 252, - 177, 230, 204, 58, 54, 102, 252, 176, 58, 54, 102, 252, 175, 216, 193, - 58, 54, 102, 252, 174, 58, 54, 102, 252, 173, 58, 54, 102, 252, 172, 58, - 54, 102, 252, 171, 58, 54, 102, 252, 170, 58, 54, 102, 252, 169, 58, 54, - 102, 252, 168, 58, 54, 102, 252, 167, 58, 54, 102, 252, 166, 58, 54, 102, - 252, 165, 58, 54, 102, 252, 164, 58, 54, 102, 252, 163, 241, 195, 58, 54, - 102, 252, 142, 243, 253, 58, 54, 102, 252, 139, 252, 36, 58, 54, 102, - 252, 134, 219, 193, 58, 54, 102, 252, 133, 68, 58, 54, 102, 252, 132, 58, - 54, 102, 252, 131, 218, 181, 58, 54, 102, 252, 130, 58, 54, 102, 252, - 129, 58, 54, 102, 252, 128, 213, 239, 250, 75, 58, 54, 102, 252, 127, - 250, 75, 58, 54, 102, 252, 126, 250, 76, 243, 225, 58, 54, 102, 252, 125, - 213, 241, 58, 54, 102, 252, 124, 58, 54, 102, 252, 123, 58, 54, 230, 212, - 252, 122, 247, 150, 58, 54, 102, 252, 121, 58, 54, 102, 252, 120, 58, 54, - 102, 252, 118, 58, 54, 102, 252, 117, 58, 54, 102, 252, 116, 58, 54, 102, - 252, 115, 248, 104, 58, 54, 102, 252, 114, 58, 54, 102, 252, 113, 58, 54, - 102, 252, 112, 58, 54, 102, 252, 111, 58, 54, 102, 252, 110, 58, 54, 102, - 214, 163, 252, 195, 58, 54, 102, 214, 163, 252, 162, 58, 54, 102, 214, - 163, 252, 161, 58, 54, 102, 214, 163, 252, 160, 58, 54, 102, 214, 163, - 252, 159, 58, 54, 102, 214, 163, 252, 158, 58, 54, 102, 214, 163, 252, - 157, 58, 54, 102, 214, 163, 252, 156, 58, 54, 102, 214, 163, 252, 155, - 58, 54, 102, 214, 163, 252, 154, 58, 54, 102, 214, 163, 252, 153, 58, 54, - 102, 214, 163, 252, 152, 58, 54, 102, 214, 163, 252, 151, 58, 54, 102, - 214, 163, 252, 150, 58, 54, 102, 214, 163, 252, 149, 58, 54, 102, 214, - 163, 252, 148, 58, 54, 102, 214, 163, 252, 147, 58, 54, 102, 214, 163, - 252, 146, 58, 54, 102, 214, 163, 252, 145, 58, 54, 102, 214, 163, 252, - 144, 58, 54, 102, 214, 163, 252, 143, 58, 54, 102, 214, 163, 252, 141, - 58, 54, 102, 214, 163, 252, 140, 58, 54, 102, 214, 163, 252, 138, 58, 54, - 102, 214, 163, 252, 137, 58, 54, 102, 214, 163, 252, 136, 58, 54, 102, - 214, 163, 252, 135, 58, 54, 102, 214, 163, 252, 119, 58, 54, 102, 214, - 163, 252, 109, 254, 141, 213, 196, 221, 58, 232, 242, 254, 141, 213, 196, - 221, 58, 247, 74, 254, 141, 250, 66, 77, 254, 141, 50, 116, 254, 141, 50, - 109, 254, 141, 50, 166, 254, 141, 50, 163, 254, 141, 50, 180, 254, 141, - 50, 189, 254, 141, 50, 198, 254, 141, 50, 195, 254, 141, 50, 200, 254, - 141, 50, 217, 200, 254, 141, 50, 216, 38, 254, 141, 50, 217, 115, 254, - 141, 50, 243, 240, 254, 141, 50, 244, 83, 254, 141, 50, 220, 39, 254, - 141, 50, 221, 37, 254, 141, 50, 245, 141, 254, 141, 50, 229, 26, 254, - 141, 50, 122, 240, 200, 254, 141, 50, 117, 240, 200, 254, 141, 50, 133, - 240, 200, 254, 141, 50, 243, 237, 240, 200, 254, 141, 50, 244, 50, 240, - 200, 254, 141, 50, 220, 53, 240, 200, 254, 141, 50, 221, 43, 240, 200, - 254, 141, 50, 245, 150, 240, 200, 254, 141, 50, 229, 31, 240, 200, 254, - 141, 50, 122, 217, 100, 254, 141, 50, 117, 217, 100, 254, 141, 50, 133, - 217, 100, 254, 141, 50, 243, 237, 217, 100, 254, 141, 50, 244, 50, 217, - 100, 254, 141, 50, 220, 53, 217, 100, 254, 141, 50, 221, 43, 217, 100, - 254, 141, 50, 245, 150, 217, 100, 254, 141, 50, 229, 31, 217, 100, 254, - 141, 50, 217, 201, 217, 100, 254, 141, 50, 216, 39, 217, 100, 254, 141, - 50, 217, 116, 217, 100, 254, 141, 50, 243, 241, 217, 100, 254, 141, 50, - 244, 84, 217, 100, 254, 141, 50, 220, 40, 217, 100, 254, 141, 50, 221, - 38, 217, 100, 254, 141, 50, 245, 142, 217, 100, 254, 141, 50, 229, 27, - 217, 100, 254, 141, 213, 255, 252, 48, 215, 144, 254, 141, 213, 255, 244, - 61, 219, 4, 254, 141, 213, 255, 222, 95, 219, 4, 254, 141, 213, 255, 217, - 122, 219, 4, 254, 141, 213, 255, 243, 230, 219, 4, 254, 141, 246, 36, - 231, 155, 244, 61, 219, 4, 254, 141, 232, 228, 231, 155, 244, 61, 219, 4, - 254, 141, 231, 155, 222, 95, 219, 4, 254, 141, 231, 155, 217, 122, 219, - 4, 25, 254, 167, 253, 110, 122, 224, 166, 25, 254, 167, 253, 110, 122, - 242, 9, 25, 254, 167, 253, 110, 122, 246, 54, 25, 254, 167, 253, 110, - 180, 25, 254, 167, 253, 110, 244, 83, 25, 254, 167, 253, 110, 244, 50, - 240, 200, 25, 254, 167, 253, 110, 244, 50, 217, 100, 25, 254, 167, 253, - 110, 244, 84, 217, 100, 25, 254, 167, 253, 110, 244, 50, 218, 18, 25, - 254, 167, 253, 110, 217, 201, 218, 18, 25, 254, 167, 253, 110, 244, 84, - 218, 18, 25, 254, 167, 253, 110, 122, 240, 201, 218, 18, 25, 254, 167, - 253, 110, 244, 50, 240, 201, 218, 18, 25, 254, 167, 253, 110, 122, 217, - 101, 218, 18, 25, 254, 167, 253, 110, 244, 50, 217, 101, 218, 18, 25, - 254, 167, 253, 110, 244, 50, 219, 90, 25, 254, 167, 253, 110, 217, 201, - 219, 90, 25, 254, 167, 253, 110, 244, 84, 219, 90, 25, 254, 167, 253, - 110, 122, 240, 201, 219, 90, 25, 254, 167, 253, 110, 244, 50, 240, 201, - 219, 90, 25, 254, 167, 253, 110, 122, 217, 101, 219, 90, 25, 254, 167, - 253, 110, 217, 201, 217, 101, 219, 90, 25, 254, 167, 253, 110, 244, 84, - 217, 101, 219, 90, 25, 254, 167, 253, 110, 217, 201, 230, 234, 25, 254, - 167, 241, 189, 122, 225, 164, 25, 254, 167, 217, 134, 116, 25, 254, 167, - 241, 186, 116, 25, 254, 167, 245, 67, 109, 25, 254, 167, 217, 134, 109, - 25, 254, 167, 249, 8, 117, 246, 53, 25, 254, 167, 245, 67, 117, 246, 53, - 25, 254, 167, 216, 161, 180, 25, 254, 167, 216, 161, 217, 200, 25, 254, - 167, 216, 161, 217, 201, 254, 50, 17, 25, 254, 167, 241, 186, 217, 200, - 25, 254, 167, 231, 108, 217, 200, 25, 254, 167, 217, 134, 217, 200, 25, - 254, 167, 217, 134, 217, 115, 25, 254, 167, 216, 161, 244, 83, 25, 254, - 167, 216, 161, 244, 84, 254, 50, 17, 25, 254, 167, 241, 186, 244, 83, 25, - 254, 167, 217, 134, 244, 83, 25, 254, 167, 217, 134, 122, 240, 200, 25, - 254, 167, 217, 134, 133, 240, 200, 25, 254, 167, 245, 67, 244, 50, 240, - 200, 25, 254, 167, 216, 161, 244, 50, 240, 200, 25, 254, 167, 217, 134, - 244, 50, 240, 200, 25, 254, 167, 250, 159, 244, 50, 240, 200, 25, 254, - 167, 230, 4, 244, 50, 240, 200, 25, 254, 167, 217, 134, 122, 217, 100, - 25, 254, 167, 217, 134, 244, 50, 217, 100, 25, 254, 167, 248, 8, 244, 50, - 230, 234, 25, 254, 167, 219, 58, 244, 84, 230, 234, 25, 122, 151, 52, 25, - 122, 151, 5, 254, 50, 17, 25, 117, 217, 120, 52, 25, 133, 224, 165, 52, - 25, 213, 36, 52, 25, 218, 19, 52, 25, 246, 55, 52, 25, 227, 110, 52, 25, - 117, 227, 109, 52, 25, 133, 227, 109, 52, 25, 243, 237, 227, 109, 52, 25, - 244, 50, 227, 109, 52, 25, 231, 102, 52, 25, 233, 179, 252, 48, 52, 25, - 232, 223, 52, 25, 226, 255, 52, 25, 213, 147, 52, 25, 253, 158, 52, 25, - 253, 171, 52, 25, 242, 120, 52, 25, 216, 144, 252, 48, 52, 25, 212, 80, - 52, 223, 100, 221, 34, 52, 223, 100, 215, 155, 52, 223, 100, 221, 62, 52, - 223, 100, 221, 32, 52, 223, 100, 247, 165, 221, 32, 52, 223, 100, 220, - 94, 52, 223, 100, 248, 4, 52, 223, 100, 224, 151, 52, 223, 100, 221, 50, - 52, 223, 100, 246, 15, 52, 223, 100, 253, 153, 52, 223, 100, 250, 105, - 52, 226, 19, 247, 143, 5, 226, 88, 226, 19, 247, 143, 5, 225, 158, 241, - 219, 226, 19, 247, 143, 5, 217, 252, 241, 219, 226, 19, 247, 143, 5, 250, - 179, 226, 19, 247, 143, 5, 250, 38, 226, 19, 247, 143, 5, 213, 208, 226, - 19, 247, 143, 5, 241, 195, 226, 19, 247, 143, 5, 243, 61, 226, 19, 247, - 143, 5, 217, 70, 226, 19, 247, 143, 5, 68, 226, 19, 247, 143, 5, 251, 95, - 226, 19, 247, 143, 5, 220, 209, 226, 19, 247, 143, 5, 249, 181, 226, 19, - 247, 143, 5, 231, 247, 226, 19, 247, 143, 5, 231, 199, 226, 19, 247, 143, - 5, 222, 134, 226, 19, 247, 143, 5, 233, 9, 226, 19, 247, 143, 5, 251, - 113, 226, 19, 247, 143, 5, 250, 163, 225, 167, 226, 19, 247, 143, 5, 247, - 87, 226, 19, 247, 143, 5, 249, 161, 226, 19, 247, 143, 5, 220, 15, 226, - 19, 247, 143, 5, 249, 162, 226, 19, 247, 143, 5, 251, 239, 226, 19, 247, - 143, 5, 220, 196, 226, 19, 247, 143, 5, 240, 235, 226, 19, 247, 143, 5, - 241, 163, 226, 19, 247, 143, 5, 251, 41, 233, 60, 226, 19, 247, 143, 5, - 250, 156, 226, 19, 247, 143, 5, 224, 45, 226, 19, 247, 143, 5, 245, 186, - 226, 19, 247, 143, 5, 246, 61, 226, 19, 247, 143, 5, 216, 69, 226, 19, - 247, 143, 5, 251, 242, 226, 19, 247, 143, 5, 225, 168, 216, 193, 226, 19, - 247, 143, 5, 214, 140, 226, 19, 247, 143, 5, 226, 146, 226, 19, 247, 143, - 5, 223, 92, 226, 19, 247, 143, 5, 232, 252, 226, 19, 247, 143, 5, 226, - 239, 252, 101, 226, 19, 247, 143, 5, 244, 17, 226, 19, 247, 143, 5, 242, - 115, 226, 19, 247, 143, 5, 219, 59, 226, 19, 247, 143, 5, 3, 253, 84, - 226, 19, 247, 143, 5, 214, 16, 252, 67, 226, 19, 247, 143, 5, 37, 227, - 112, 90, 232, 120, 1, 61, 232, 120, 1, 74, 232, 120, 1, 253, 74, 232, - 120, 1, 251, 196, 232, 120, 1, 243, 177, 232, 120, 1, 249, 3, 232, 120, - 1, 72, 232, 120, 1, 214, 82, 232, 120, 1, 212, 152, 232, 120, 1, 217, - 163, 232, 120, 1, 235, 142, 232, 120, 1, 235, 27, 232, 120, 1, 224, 240, - 232, 120, 1, 150, 232, 120, 1, 183, 232, 120, 1, 204, 232, 120, 1, 230, - 235, 232, 120, 1, 228, 199, 232, 120, 1, 69, 232, 120, 1, 226, 229, 232, - 120, 1, 234, 56, 232, 120, 1, 149, 232, 120, 1, 197, 232, 120, 1, 218, - 99, 232, 120, 1, 216, 118, 232, 120, 1, 254, 32, 232, 120, 1, 245, 108, - 232, 120, 1, 242, 41, 232, 120, 1, 213, 166, 250, 169, 1, 61, 250, 169, - 1, 226, 215, 250, 169, 1, 249, 3, 250, 169, 1, 150, 250, 169, 1, 215, 90, - 250, 169, 1, 149, 250, 169, 1, 233, 86, 250, 169, 1, 254, 234, 250, 169, - 1, 224, 240, 250, 169, 1, 253, 74, 250, 169, 1, 183, 250, 169, 1, 75, - 250, 169, 1, 248, 166, 250, 169, 1, 218, 99, 250, 169, 1, 221, 26, 250, - 169, 1, 221, 25, 250, 169, 1, 197, 250, 169, 1, 250, 251, 250, 169, 1, - 69, 250, 169, 1, 228, 199, 250, 169, 1, 213, 166, 250, 169, 1, 204, 250, - 169, 1, 216, 117, 250, 169, 1, 226, 229, 250, 169, 1, 219, 158, 250, 169, - 1, 72, 250, 169, 1, 74, 250, 169, 1, 215, 87, 250, 169, 1, 235, 27, 250, - 169, 1, 235, 18, 250, 169, 1, 229, 230, 250, 169, 1, 215, 92, 250, 169, - 1, 243, 177, 250, 169, 1, 243, 112, 250, 169, 1, 219, 107, 250, 169, 1, - 219, 106, 250, 169, 1, 229, 161, 250, 169, 1, 236, 28, 250, 169, 1, 250, - 250, 250, 169, 1, 216, 118, 250, 169, 1, 215, 89, 250, 169, 1, 223, 82, - 250, 169, 1, 231, 192, 250, 169, 1, 231, 191, 250, 169, 1, 231, 190, 250, - 169, 1, 231, 189, 250, 169, 1, 233, 85, 250, 169, 1, 245, 190, 250, 169, - 1, 215, 88, 53, 32, 1, 61, 53, 32, 1, 251, 251, 53, 32, 1, 234, 188, 53, - 32, 1, 248, 41, 53, 32, 1, 74, 53, 32, 1, 214, 232, 53, 32, 1, 212, 87, - 53, 32, 1, 241, 222, 53, 32, 1, 217, 148, 53, 32, 1, 72, 53, 32, 1, 181, - 53, 32, 1, 245, 131, 53, 32, 1, 245, 117, 53, 32, 1, 245, 108, 53, 32, 1, - 245, 40, 53, 32, 1, 75, 53, 32, 1, 226, 96, 53, 32, 1, 220, 243, 53, 32, - 1, 233, 238, 53, 32, 1, 245, 55, 53, 32, 1, 245, 45, 53, 32, 1, 217, 229, - 53, 32, 1, 69, 53, 32, 1, 245, 134, 53, 32, 1, 226, 12, 53, 32, 1, 234, - 125, 53, 32, 1, 245, 159, 53, 32, 1, 245, 47, 53, 32, 1, 250, 67, 53, 32, - 1, 236, 28, 53, 32, 1, 215, 92, 53, 32, 228, 54, 116, 53, 32, 228, 54, - 180, 53, 32, 228, 54, 217, 200, 53, 32, 228, 54, 244, 83, 242, 129, 1, - 254, 111, 242, 129, 1, 252, 82, 242, 129, 1, 242, 187, 242, 129, 1, 248, - 148, 242, 129, 1, 254, 107, 242, 129, 1, 224, 223, 242, 129, 1, 235, 153, - 242, 129, 1, 242, 20, 242, 129, 1, 217, 111, 242, 129, 1, 245, 140, 242, - 129, 1, 233, 211, 242, 129, 1, 233, 136, 242, 129, 1, 231, 242, 242, 129, - 1, 230, 6, 242, 129, 1, 235, 120, 242, 129, 1, 215, 107, 242, 129, 1, - 226, 196, 242, 129, 1, 229, 26, 242, 129, 1, 224, 56, 242, 129, 1, 222, - 136, 242, 129, 1, 217, 212, 242, 129, 1, 213, 219, 242, 129, 1, 244, 146, - 242, 129, 1, 236, 32, 242, 129, 1, 240, 191, 242, 129, 1, 227, 7, 242, - 129, 1, 229, 31, 240, 200, 215, 179, 1, 254, 56, 215, 179, 1, 251, 203, - 215, 179, 1, 243, 84, 215, 179, 1, 234, 138, 215, 179, 1, 248, 5, 215, - 179, 1, 241, 54, 215, 179, 1, 213, 214, 215, 179, 1, 212, 78, 215, 179, - 1, 240, 228, 215, 179, 1, 217, 183, 215, 179, 1, 212, 224, 215, 179, 1, - 234, 254, 215, 179, 1, 220, 200, 215, 179, 1, 233, 122, 215, 179, 1, 231, - 129, 215, 179, 1, 247, 229, 215, 179, 1, 228, 50, 215, 179, 1, 212, 8, - 215, 179, 1, 222, 163, 215, 179, 1, 254, 103, 215, 179, 1, 225, 35, 215, - 179, 1, 222, 194, 215, 179, 1, 224, 180, 215, 179, 1, 224, 36, 215, 179, - 1, 217, 152, 215, 179, 1, 242, 220, 215, 179, 1, 108, 215, 179, 1, 72, - 215, 179, 1, 69, 215, 179, 1, 219, 117, 215, 179, 213, 196, 247, 124, 53, - 226, 45, 5, 61, 53, 226, 45, 5, 72, 53, 226, 45, 5, 69, 53, 226, 45, 5, - 181, 53, 226, 45, 5, 233, 238, 53, 226, 45, 5, 243, 110, 53, 226, 45, 5, - 242, 92, 53, 226, 45, 5, 213, 153, 53, 226, 45, 5, 250, 219, 53, 226, 45, - 5, 235, 139, 53, 226, 45, 5, 235, 110, 53, 226, 45, 5, 218, 52, 53, 226, - 45, 5, 216, 82, 53, 226, 45, 5, 248, 164, 53, 226, 45, 5, 247, 211, 53, - 226, 45, 5, 246, 33, 53, 226, 45, 5, 217, 161, 53, 226, 45, 5, 193, 53, - 226, 45, 5, 252, 107, 53, 226, 45, 5, 244, 164, 53, 226, 45, 5, 205, 53, - 226, 45, 5, 228, 92, 53, 226, 45, 5, 188, 53, 226, 45, 5, 231, 42, 53, - 226, 45, 5, 230, 172, 53, 226, 45, 5, 186, 53, 226, 45, 5, 215, 1, 53, - 226, 45, 5, 214, 154, 53, 226, 45, 5, 203, 53, 226, 45, 5, 223, 51, 53, - 226, 45, 5, 233, 157, 53, 226, 45, 5, 222, 202, 53, 226, 45, 5, 212, 109, - 53, 226, 45, 5, 221, 24, 53, 226, 45, 5, 219, 157, 53, 226, 45, 5, 159, - 53, 226, 45, 5, 253, 102, 53, 226, 45, 5, 253, 101, 53, 226, 45, 5, 253, - 100, 53, 226, 45, 5, 213, 130, 53, 226, 45, 5, 248, 145, 53, 226, 45, 5, - 248, 144, 53, 226, 45, 5, 252, 88, 53, 226, 45, 5, 251, 14, 53, 226, 45, - 213, 196, 247, 124, 53, 226, 45, 50, 116, 53, 226, 45, 50, 109, 53, 226, - 45, 50, 217, 200, 53, 226, 45, 50, 216, 38, 53, 226, 45, 50, 240, 200, - 171, 6, 1, 184, 72, 171, 6, 1, 184, 74, 171, 6, 1, 184, 61, 171, 6, 1, - 184, 254, 114, 171, 6, 1, 184, 75, 171, 6, 1, 184, 227, 49, 171, 6, 1, - 220, 175, 72, 171, 6, 1, 220, 175, 74, 171, 6, 1, 220, 175, 61, 171, 6, - 1, 220, 175, 254, 114, 171, 6, 1, 220, 175, 75, 171, 6, 1, 220, 175, 227, - 49, 171, 6, 1, 253, 83, 171, 6, 1, 226, 240, 171, 6, 1, 213, 183, 171, 6, - 1, 213, 35, 171, 6, 1, 242, 41, 171, 6, 1, 226, 86, 171, 6, 1, 251, 242, - 171, 6, 1, 217, 219, 171, 6, 1, 248, 28, 171, 6, 1, 250, 64, 171, 6, 1, - 235, 125, 171, 6, 1, 234, 195, 171, 6, 1, 243, 59, 171, 6, 1, 245, 159, - 171, 6, 1, 214, 227, 171, 6, 1, 245, 25, 171, 6, 1, 217, 147, 171, 6, 1, - 245, 45, 171, 6, 1, 212, 85, 171, 6, 1, 245, 40, 171, 6, 1, 212, 66, 171, - 6, 1, 245, 55, 171, 6, 1, 245, 131, 171, 6, 1, 245, 117, 171, 6, 1, 245, - 108, 171, 6, 1, 245, 96, 171, 6, 1, 227, 85, 171, 6, 1, 245, 5, 171, 3, - 1, 184, 72, 171, 3, 1, 184, 74, 171, 3, 1, 184, 61, 171, 3, 1, 184, 254, - 114, 171, 3, 1, 184, 75, 171, 3, 1, 184, 227, 49, 171, 3, 1, 220, 175, - 72, 171, 3, 1, 220, 175, 74, 171, 3, 1, 220, 175, 61, 171, 3, 1, 220, - 175, 254, 114, 171, 3, 1, 220, 175, 75, 171, 3, 1, 220, 175, 227, 49, - 171, 3, 1, 253, 83, 171, 3, 1, 226, 240, 171, 3, 1, 213, 183, 171, 3, 1, - 213, 35, 171, 3, 1, 242, 41, 171, 3, 1, 226, 86, 171, 3, 1, 251, 242, - 171, 3, 1, 217, 219, 171, 3, 1, 248, 28, 171, 3, 1, 250, 64, 171, 3, 1, - 235, 125, 171, 3, 1, 234, 195, 171, 3, 1, 243, 59, 171, 3, 1, 245, 159, - 171, 3, 1, 214, 227, 171, 3, 1, 245, 25, 171, 3, 1, 217, 147, 171, 3, 1, - 245, 45, 171, 3, 1, 212, 85, 171, 3, 1, 245, 40, 171, 3, 1, 212, 66, 171, - 3, 1, 245, 55, 171, 3, 1, 245, 131, 171, 3, 1, 245, 117, 171, 3, 1, 245, - 108, 171, 3, 1, 245, 96, 171, 3, 1, 227, 85, 171, 3, 1, 245, 5, 220, 249, - 1, 226, 84, 220, 249, 1, 216, 218, 220, 249, 1, 234, 100, 220, 249, 1, - 244, 116, 220, 249, 1, 217, 125, 220, 249, 1, 219, 242, 220, 249, 1, 218, - 214, 220, 249, 1, 249, 254, 220, 249, 1, 213, 37, 220, 249, 1, 240, 199, - 220, 249, 1, 251, 183, 220, 249, 1, 248, 40, 220, 249, 1, 243, 96, 220, - 249, 1, 214, 104, 220, 249, 1, 217, 129, 220, 249, 1, 212, 14, 220, 249, - 1, 231, 154, 220, 249, 1, 235, 52, 220, 249, 1, 213, 212, 220, 249, 1, - 242, 29, 220, 249, 1, 232, 195, 220, 249, 1, 231, 2, 220, 249, 1, 236, - 35, 220, 249, 1, 245, 158, 220, 249, 1, 253, 146, 220, 249, 1, 254, 152, - 220, 249, 1, 227, 62, 220, 249, 1, 213, 199, 220, 249, 1, 226, 254, 220, - 249, 1, 254, 114, 220, 249, 1, 223, 109, 220, 249, 1, 228, 50, 220, 249, - 1, 245, 173, 220, 249, 1, 254, 119, 220, 249, 1, 240, 104, 220, 249, 1, - 215, 134, 220, 249, 1, 227, 118, 220, 249, 1, 227, 42, 220, 249, 1, 227, - 84, 220, 249, 1, 253, 86, 220, 249, 1, 253, 189, 220, 249, 1, 227, 24, - 220, 249, 1, 254, 100, 220, 249, 1, 245, 49, 220, 249, 1, 253, 168, 220, - 249, 1, 245, 183, 220, 249, 1, 240, 110, 220, 249, 1, 213, 4, 227, 9, 1, - 254, 78, 227, 9, 1, 252, 107, 227, 9, 1, 218, 52, 227, 9, 1, 235, 139, - 227, 9, 1, 213, 153, 227, 9, 1, 234, 138, 227, 9, 1, 248, 27, 227, 9, 1, - 203, 227, 9, 1, 222, 202, 227, 9, 1, 220, 206, 227, 9, 1, 247, 232, 227, - 9, 1, 250, 148, 227, 9, 1, 243, 110, 227, 9, 1, 244, 164, 227, 9, 1, 224, - 230, 227, 9, 1, 235, 13, 227, 9, 1, 233, 152, 227, 9, 1, 231, 13, 227, 9, - 1, 228, 35, 227, 9, 1, 214, 14, 227, 9, 1, 159, 227, 9, 1, 186, 227, 9, - 1, 61, 227, 9, 1, 74, 227, 9, 1, 72, 227, 9, 1, 75, 227, 9, 1, 69, 227, - 9, 1, 254, 232, 227, 9, 1, 245, 165, 227, 9, 1, 227, 49, 227, 9, 21, 212, - 79, 227, 9, 21, 116, 227, 9, 21, 109, 227, 9, 21, 166, 227, 9, 21, 163, - 227, 9, 21, 180, 227, 9, 21, 189, 227, 9, 21, 198, 227, 9, 21, 195, 227, - 9, 21, 200, 249, 10, 4, 61, 249, 10, 4, 74, 249, 10, 4, 72, 249, 10, 4, - 75, 249, 10, 4, 69, 249, 10, 4, 235, 139, 249, 10, 4, 235, 71, 249, 10, - 4, 181, 249, 10, 4, 234, 188, 249, 10, 4, 234, 101, 249, 10, 4, 234, 37, - 249, 10, 4, 233, 238, 249, 10, 4, 233, 157, 249, 10, 4, 233, 82, 249, 10, - 4, 233, 13, 249, 10, 4, 232, 208, 249, 10, 4, 232, 156, 249, 10, 4, 188, - 249, 10, 4, 231, 156, 249, 10, 4, 231, 42, 249, 10, 4, 230, 231, 249, 10, - 4, 230, 172, 249, 10, 4, 205, 249, 10, 4, 229, 187, 249, 10, 4, 229, 64, - 249, 10, 4, 228, 185, 249, 10, 4, 228, 92, 249, 10, 4, 193, 249, 10, 4, - 226, 96, 249, 10, 4, 225, 240, 249, 10, 4, 225, 150, 249, 10, 4, 225, 35, - 249, 10, 4, 203, 249, 10, 4, 224, 21, 249, 10, 4, 223, 188, 249, 10, 4, - 223, 112, 249, 10, 4, 223, 51, 249, 10, 4, 222, 202, 249, 10, 4, 222, - 100, 249, 10, 4, 220, 117, 249, 10, 4, 219, 242, 249, 10, 4, 219, 27, - 249, 10, 4, 218, 52, 249, 10, 4, 217, 229, 249, 10, 4, 217, 71, 249, 10, - 4, 108, 249, 10, 4, 216, 82, 249, 10, 4, 214, 49, 249, 10, 4, 214, 6, - 249, 10, 4, 213, 235, 249, 10, 4, 213, 214, 249, 10, 4, 213, 153, 249, - 10, 4, 213, 150, 249, 10, 4, 212, 109, 249, 10, 4, 212, 16, 235, 253, - 253, 197, 1, 254, 76, 235, 253, 253, 197, 1, 251, 202, 235, 253, 253, - 197, 1, 242, 177, 235, 253, 253, 197, 1, 248, 133, 235, 253, 253, 197, 1, - 241, 222, 235, 253, 253, 197, 1, 214, 14, 235, 253, 253, 197, 1, 212, 90, - 235, 253, 253, 197, 1, 241, 180, 235, 253, 253, 197, 1, 217, 179, 235, - 253, 253, 197, 1, 212, 223, 235, 253, 253, 197, 1, 234, 230, 235, 253, - 253, 197, 1, 233, 117, 235, 253, 253, 197, 1, 231, 129, 235, 253, 253, - 197, 1, 228, 50, 235, 253, 253, 197, 1, 222, 164, 235, 253, 253, 197, 1, - 253, 78, 235, 253, 253, 197, 1, 226, 96, 235, 253, 253, 197, 1, 222, 193, - 235, 253, 253, 197, 1, 224, 179, 235, 253, 253, 197, 1, 223, 219, 235, - 253, 253, 197, 1, 220, 200, 235, 253, 253, 197, 1, 217, 243, 235, 253, - 253, 197, 222, 92, 52, 235, 253, 253, 197, 50, 116, 235, 253, 253, 197, - 50, 109, 235, 253, 253, 197, 50, 166, 235, 253, 253, 197, 50, 217, 200, - 235, 253, 253, 197, 50, 216, 38, 235, 253, 253, 197, 50, 122, 240, 200, - 235, 253, 253, 197, 50, 122, 217, 100, 235, 253, 253, 197, 50, 217, 201, - 217, 100, 225, 251, 1, 254, 74, 225, 251, 1, 251, 205, 225, 251, 1, 243, - 85, 225, 251, 1, 248, 7, 225, 251, 1, 241, 222, 225, 251, 1, 214, 21, - 225, 251, 1, 212, 103, 225, 251, 1, 241, 182, 225, 251, 1, 217, 183, 225, - 251, 1, 212, 224, 225, 251, 1, 234, 254, 225, 251, 1, 233, 123, 225, 251, - 1, 231, 129, 225, 251, 1, 228, 50, 225, 251, 1, 221, 64, 225, 251, 1, - 254, 103, 225, 251, 1, 226, 96, 225, 251, 1, 222, 194, 225, 251, 1, 224, - 184, 225, 251, 1, 223, 91, 225, 251, 1, 220, 200, 225, 251, 1, 217, 248, - 225, 251, 50, 116, 225, 251, 50, 217, 200, 225, 251, 50, 216, 38, 225, - 251, 50, 122, 240, 200, 225, 251, 50, 109, 225, 251, 50, 166, 225, 251, - 213, 196, 221, 57, 232, 119, 1, 61, 232, 119, 1, 253, 74, 232, 119, 1, - 243, 177, 232, 119, 1, 249, 3, 232, 119, 1, 74, 232, 119, 1, 215, 79, - 232, 119, 1, 72, 232, 119, 1, 213, 105, 232, 119, 1, 235, 27, 232, 119, - 1, 150, 232, 119, 1, 183, 232, 119, 1, 204, 232, 119, 1, 75, 232, 119, 1, - 149, 232, 119, 1, 219, 158, 232, 119, 1, 218, 99, 232, 119, 1, 69, 232, - 119, 1, 244, 230, 232, 119, 1, 224, 240, 232, 119, 1, 197, 232, 119, 1, - 216, 118, 232, 119, 1, 254, 32, 232, 119, 1, 245, 108, 232, 119, 1, 232, - 121, 232, 119, 1, 228, 199, 232, 119, 1, 250, 252, 232, 119, 216, 180, - 77, 234, 126, 1, 61, 234, 126, 30, 5, 72, 234, 126, 30, 5, 69, 234, 126, - 30, 5, 161, 149, 234, 126, 30, 5, 74, 234, 126, 30, 5, 75, 234, 126, 30, - 233, 47, 77, 234, 126, 5, 51, 223, 131, 55, 234, 126, 5, 253, 242, 234, - 126, 5, 214, 128, 234, 126, 1, 181, 234, 126, 1, 234, 138, 234, 126, 1, - 243, 110, 234, 126, 1, 242, 225, 234, 126, 1, 250, 219, 234, 126, 1, 250, - 92, 234, 126, 1, 235, 139, 234, 126, 1, 228, 23, 234, 126, 1, 216, 115, - 234, 126, 1, 216, 105, 234, 126, 1, 248, 86, 234, 126, 1, 248, 70, 234, - 126, 1, 228, 198, 234, 126, 1, 218, 52, 234, 126, 1, 217, 161, 234, 126, - 1, 248, 164, 234, 126, 1, 247, 232, 234, 126, 1, 205, 234, 126, 1, 193, - 234, 126, 1, 226, 23, 234, 126, 1, 252, 107, 234, 126, 1, 251, 195, 234, - 126, 1, 188, 234, 126, 1, 186, 234, 126, 1, 203, 234, 126, 1, 233, 157, - 234, 126, 1, 215, 1, 234, 126, 1, 221, 24, 234, 126, 1, 219, 157, 234, - 126, 1, 222, 202, 234, 126, 1, 212, 109, 234, 126, 1, 159, 234, 126, 1, - 234, 55, 234, 126, 1, 216, 87, 234, 126, 5, 252, 60, 49, 234, 126, 5, - 250, 154, 234, 126, 5, 62, 55, 234, 126, 214, 133, 234, 126, 21, 116, - 234, 126, 21, 109, 234, 126, 21, 166, 234, 126, 21, 163, 234, 126, 50, - 217, 200, 234, 126, 50, 216, 38, 234, 126, 50, 122, 240, 200, 234, 126, - 50, 122, 217, 100, 234, 126, 225, 27, 247, 74, 234, 126, 225, 27, 3, 249, - 228, 234, 126, 225, 27, 249, 228, 234, 126, 225, 27, 249, 77, 134, 234, - 126, 225, 27, 231, 243, 234, 126, 225, 27, 232, 170, 234, 126, 225, 27, - 248, 123, 234, 126, 225, 27, 51, 248, 123, 234, 126, 225, 27, 232, 236, - 53, 219, 215, 253, 208, 1, 241, 222, 53, 219, 215, 253, 208, 1, 233, 117, - 53, 219, 215, 253, 208, 1, 241, 180, 53, 219, 215, 253, 208, 1, 231, 129, - 53, 219, 215, 253, 208, 1, 224, 179, 53, 219, 215, 253, 208, 1, 214, 14, - 53, 219, 215, 253, 208, 1, 220, 200, 53, 219, 215, 253, 208, 1, 223, 219, - 53, 219, 215, 253, 208, 1, 251, 202, 53, 219, 215, 253, 208, 1, 217, 243, - 53, 219, 215, 253, 208, 1, 222, 142, 53, 219, 215, 253, 208, 1, 234, 230, - 53, 219, 215, 253, 208, 1, 228, 50, 53, 219, 215, 253, 208, 1, 234, 122, - 53, 219, 215, 253, 208, 1, 222, 193, 53, 219, 215, 253, 208, 1, 222, 164, - 53, 219, 215, 253, 208, 1, 244, 123, 53, 219, 215, 253, 208, 1, 254, 78, - 53, 219, 215, 253, 208, 1, 253, 77, 53, 219, 215, 253, 208, 1, 247, 230, - 53, 219, 215, 253, 208, 1, 242, 177, 53, 219, 215, 253, 208, 1, 248, 133, - 53, 219, 215, 253, 208, 1, 242, 214, 53, 219, 215, 253, 208, 1, 217, 179, - 53, 219, 215, 253, 208, 1, 212, 89, 53, 219, 215, 253, 208, 1, 247, 227, - 53, 219, 215, 253, 208, 1, 212, 223, 53, 219, 215, 253, 208, 1, 217, 150, - 53, 219, 215, 253, 208, 1, 217, 131, 53, 219, 215, 253, 208, 50, 116, 53, - 219, 215, 253, 208, 50, 244, 83, 53, 219, 215, 253, 208, 128, 235, 235, - 253, 88, 1, 61, 253, 88, 1, 254, 232, 253, 88, 1, 253, 240, 253, 88, 1, - 254, 191, 253, 88, 1, 254, 32, 253, 88, 1, 254, 192, 253, 88, 1, 254, - 148, 253, 88, 1, 254, 144, 253, 88, 1, 74, 253, 88, 1, 245, 165, 253, 88, - 1, 75, 253, 88, 1, 227, 49, 253, 88, 1, 72, 253, 88, 1, 236, 28, 253, 88, - 1, 69, 253, 88, 1, 215, 92, 253, 88, 1, 234, 188, 253, 88, 1, 213, 150, - 253, 88, 1, 213, 116, 253, 88, 1, 213, 125, 253, 88, 1, 243, 38, 253, 88, - 1, 243, 0, 253, 88, 1, 242, 212, 253, 88, 1, 250, 124, 253, 88, 1, 235, - 127, 253, 88, 1, 217, 229, 253, 88, 1, 217, 148, 253, 88, 1, 248, 41, - 253, 88, 1, 247, 225, 253, 88, 1, 216, 112, 253, 88, 1, 226, 96, 253, 88, - 1, 244, 123, 253, 88, 1, 251, 251, 253, 88, 1, 251, 192, 253, 88, 1, 229, - 148, 253, 88, 1, 229, 70, 253, 88, 1, 229, 71, 253, 88, 1, 229, 187, 253, - 88, 1, 228, 17, 253, 88, 1, 228, 197, 253, 88, 1, 231, 156, 253, 88, 1, - 241, 102, 253, 88, 1, 212, 159, 253, 88, 1, 213, 38, 253, 88, 1, 214, - 232, 253, 88, 1, 224, 21, 253, 88, 1, 233, 82, 253, 88, 1, 222, 100, 253, - 88, 1, 212, 87, 253, 88, 1, 220, 243, 253, 88, 1, 212, 67, 253, 88, 1, - 220, 124, 253, 88, 1, 219, 129, 253, 88, 1, 241, 222, 253, 88, 254, 181, - 77, 217, 32, 117, 176, 110, 122, 62, 225, 26, 3, 117, 176, 110, 122, 62, - 225, 26, 233, 108, 117, 176, 110, 122, 62, 225, 26, 233, 108, 122, 62, - 110, 117, 176, 225, 26, 233, 108, 117, 223, 129, 110, 122, 223, 131, 225, - 26, 233, 108, 122, 223, 131, 110, 117, 223, 129, 225, 26, 235, 215, 226, - 126, 1, 254, 76, 235, 215, 226, 126, 1, 251, 202, 235, 215, 226, 126, 1, - 242, 177, 235, 215, 226, 126, 1, 248, 133, 235, 215, 226, 126, 1, 241, - 222, 235, 215, 226, 126, 1, 214, 14, 235, 215, 226, 126, 1, 212, 90, 235, - 215, 226, 126, 1, 241, 180, 235, 215, 226, 126, 1, 217, 179, 235, 215, - 226, 126, 1, 212, 223, 235, 215, 226, 126, 1, 234, 230, 235, 215, 226, - 126, 1, 233, 117, 235, 215, 226, 126, 1, 231, 129, 235, 215, 226, 126, 1, - 228, 50, 235, 215, 226, 126, 1, 222, 164, 235, 215, 226, 126, 1, 253, 78, - 235, 215, 226, 126, 1, 226, 96, 235, 215, 226, 126, 1, 222, 193, 235, - 215, 226, 126, 1, 224, 179, 235, 215, 226, 126, 1, 223, 219, 235, 215, - 226, 126, 1, 220, 200, 235, 215, 226, 126, 1, 217, 243, 235, 215, 226, - 126, 50, 116, 235, 215, 226, 126, 50, 109, 235, 215, 226, 126, 50, 166, - 235, 215, 226, 126, 50, 163, 235, 215, 226, 126, 50, 217, 200, 235, 215, - 226, 126, 50, 216, 38, 235, 215, 226, 126, 50, 122, 240, 200, 235, 215, - 226, 126, 50, 122, 217, 100, 235, 215, 226, 198, 1, 254, 76, 235, 215, - 226, 198, 1, 251, 202, 235, 215, 226, 198, 1, 242, 177, 235, 215, 226, - 198, 1, 248, 133, 235, 215, 226, 198, 1, 241, 222, 235, 215, 226, 198, 1, - 214, 13, 235, 215, 226, 198, 1, 212, 90, 235, 215, 226, 198, 1, 241, 180, - 235, 215, 226, 198, 1, 217, 179, 235, 215, 226, 198, 1, 212, 223, 235, - 215, 226, 198, 1, 234, 230, 235, 215, 226, 198, 1, 233, 117, 235, 215, - 226, 198, 1, 231, 128, 235, 215, 226, 198, 1, 228, 50, 235, 215, 226, - 198, 1, 222, 164, 235, 215, 226, 198, 1, 226, 96, 235, 215, 226, 198, 1, - 222, 193, 235, 215, 226, 198, 1, 220, 200, 235, 215, 226, 198, 1, 217, - 243, 235, 215, 226, 198, 50, 116, 235, 215, 226, 198, 50, 109, 235, 215, - 226, 198, 50, 166, 235, 215, 226, 198, 50, 163, 235, 215, 226, 198, 50, - 217, 200, 235, 215, 226, 198, 50, 216, 38, 235, 215, 226, 198, 50, 122, - 240, 200, 235, 215, 226, 198, 50, 122, 217, 100, 53, 185, 1, 227, 16, 61, - 53, 185, 1, 213, 28, 61, 53, 185, 1, 213, 28, 254, 148, 53, 185, 1, 227, - 16, 72, 53, 185, 1, 213, 28, 72, 53, 185, 1, 213, 28, 74, 53, 185, 1, - 227, 16, 75, 53, 185, 1, 227, 16, 227, 99, 53, 185, 1, 213, 28, 227, 99, - 53, 185, 1, 227, 16, 254, 185, 53, 185, 1, 213, 28, 254, 185, 53, 185, 1, - 227, 16, 254, 147, 53, 185, 1, 213, 28, 254, 147, 53, 185, 1, 227, 16, - 254, 121, 53, 185, 1, 213, 28, 254, 121, 53, 185, 1, 227, 16, 254, 142, - 53, 185, 1, 213, 28, 254, 142, 53, 185, 1, 227, 16, 254, 160, 53, 185, 1, - 213, 28, 254, 160, 53, 185, 1, 227, 16, 254, 146, 53, 185, 1, 227, 16, - 244, 236, 53, 185, 1, 213, 28, 244, 236, 53, 185, 1, 227, 16, 253, 83, - 53, 185, 1, 213, 28, 253, 83, 53, 185, 1, 227, 16, 254, 129, 53, 185, 1, - 213, 28, 254, 129, 53, 185, 1, 227, 16, 254, 140, 53, 185, 1, 213, 28, - 254, 140, 53, 185, 1, 227, 16, 227, 98, 53, 185, 1, 213, 28, 227, 98, 53, - 185, 1, 227, 16, 254, 86, 53, 185, 1, 213, 28, 254, 86, 53, 185, 1, 227, - 16, 254, 139, 53, 185, 1, 227, 16, 245, 119, 53, 185, 1, 227, 16, 245, - 117, 53, 185, 1, 227, 16, 254, 32, 53, 185, 1, 227, 16, 254, 137, 53, - 185, 1, 213, 28, 254, 137, 53, 185, 1, 227, 16, 245, 90, 53, 185, 1, 213, - 28, 245, 90, 53, 185, 1, 227, 16, 245, 105, 53, 185, 1, 213, 28, 245, - 105, 53, 185, 1, 227, 16, 245, 77, 53, 185, 1, 213, 28, 245, 77, 53, 185, - 1, 213, 28, 254, 24, 53, 185, 1, 227, 16, 245, 96, 53, 185, 1, 213, 28, - 254, 136, 53, 185, 1, 227, 16, 245, 70, 53, 185, 1, 227, 16, 227, 41, 53, - 185, 1, 227, 16, 240, 106, 53, 185, 1, 227, 16, 245, 171, 53, 185, 1, - 213, 28, 245, 171, 53, 185, 1, 227, 16, 253, 215, 53, 185, 1, 213, 28, - 253, 215, 53, 185, 1, 227, 16, 235, 179, 53, 185, 1, 213, 28, 235, 179, - 53, 185, 1, 227, 16, 227, 25, 53, 185, 1, 213, 28, 227, 25, 53, 185, 1, - 227, 16, 253, 211, 53, 185, 1, 213, 28, 253, 211, 53, 185, 1, 227, 16, - 254, 135, 53, 185, 1, 227, 16, 253, 152, 53, 185, 1, 227, 16, 254, 133, - 53, 185, 1, 227, 16, 253, 146, 53, 185, 1, 213, 28, 253, 146, 53, 185, 1, - 227, 16, 245, 40, 53, 185, 1, 213, 28, 245, 40, 53, 185, 1, 227, 16, 253, - 122, 53, 185, 1, 213, 28, 253, 122, 53, 185, 1, 227, 16, 254, 130, 53, - 185, 1, 213, 28, 254, 130, 53, 185, 1, 227, 16, 227, 8, 53, 185, 1, 227, - 16, 252, 45, 223, 38, 21, 116, 223, 38, 21, 109, 223, 38, 21, 166, 223, - 38, 21, 163, 223, 38, 21, 180, 223, 38, 21, 189, 223, 38, 21, 198, 223, - 38, 21, 195, 223, 38, 21, 200, 223, 38, 50, 217, 200, 223, 38, 50, 216, - 38, 223, 38, 50, 217, 115, 223, 38, 50, 243, 240, 223, 38, 50, 244, 83, - 223, 38, 50, 220, 39, 223, 38, 50, 221, 37, 223, 38, 50, 245, 141, 223, - 38, 50, 229, 26, 223, 38, 50, 122, 240, 200, 223, 38, 50, 117, 240, 200, - 223, 38, 50, 133, 240, 200, 223, 38, 50, 243, 237, 240, 200, 223, 38, 50, - 244, 50, 240, 200, 223, 38, 50, 220, 53, 240, 200, 223, 38, 50, 221, 43, - 240, 200, 223, 38, 50, 245, 150, 240, 200, 223, 38, 50, 229, 31, 240, - 200, 223, 38, 243, 228, 122, 242, 9, 223, 38, 243, 228, 122, 224, 166, - 223, 38, 243, 228, 122, 217, 121, 223, 38, 243, 228, 117, 217, 119, 112, - 5, 250, 187, 112, 5, 253, 242, 112, 5, 214, 128, 112, 5, 235, 104, 112, - 5, 215, 132, 112, 1, 61, 112, 1, 254, 232, 112, 1, 72, 112, 1, 236, 28, - 112, 1, 69, 112, 1, 215, 92, 112, 1, 161, 149, 112, 1, 161, 223, 82, 112, - 1, 161, 150, 112, 1, 161, 232, 214, 112, 1, 74, 112, 1, 254, 108, 112, 1, - 75, 112, 1, 253, 108, 112, 1, 181, 112, 1, 234, 138, 112, 1, 243, 110, - 112, 1, 242, 225, 112, 1, 229, 159, 112, 1, 250, 219, 112, 1, 250, 92, - 112, 1, 235, 139, 112, 1, 235, 115, 112, 1, 228, 23, 112, 1, 216, 115, - 112, 1, 216, 105, 112, 1, 248, 86, 112, 1, 248, 70, 112, 1, 228, 198, - 112, 1, 218, 52, 112, 1, 217, 161, 112, 1, 248, 164, 112, 1, 247, 232, - 112, 1, 205, 112, 1, 193, 112, 1, 226, 23, 112, 1, 252, 107, 112, 1, 251, - 195, 112, 1, 188, 112, 1, 186, 112, 1, 203, 112, 1, 233, 157, 112, 1, - 215, 1, 112, 1, 221, 24, 112, 1, 219, 157, 112, 1, 222, 202, 112, 1, 159, - 112, 1, 232, 213, 112, 1, 53, 178, 232, 212, 112, 1, 53, 178, 223, 81, - 112, 1, 53, 178, 228, 189, 112, 30, 5, 254, 232, 112, 30, 5, 251, 193, - 254, 232, 112, 30, 5, 72, 112, 30, 5, 236, 28, 112, 30, 5, 69, 112, 30, - 5, 215, 92, 112, 30, 5, 161, 149, 112, 30, 5, 161, 223, 82, 112, 30, 5, - 161, 150, 112, 30, 5, 161, 232, 214, 112, 30, 5, 74, 112, 30, 5, 254, - 108, 112, 30, 5, 75, 112, 30, 5, 253, 108, 112, 214, 133, 112, 248, 123, - 112, 51, 248, 123, 112, 225, 27, 247, 74, 112, 225, 27, 51, 247, 74, 112, - 225, 27, 232, 242, 112, 225, 27, 249, 77, 134, 112, 225, 27, 232, 170, - 112, 50, 116, 112, 50, 109, 112, 50, 166, 112, 50, 163, 112, 50, 180, - 112, 50, 189, 112, 50, 198, 112, 50, 195, 112, 50, 200, 112, 50, 217, - 200, 112, 50, 216, 38, 112, 50, 217, 115, 112, 50, 243, 240, 112, 50, - 244, 83, 112, 50, 220, 39, 112, 50, 221, 37, 112, 50, 245, 141, 112, 50, - 229, 26, 112, 50, 122, 240, 200, 112, 50, 122, 217, 100, 112, 21, 212, - 79, 112, 21, 116, 112, 21, 109, 112, 21, 166, 112, 21, 163, 112, 21, 180, - 112, 21, 189, 112, 21, 198, 112, 21, 195, 112, 21, 200, 208, 5, 250, 187, - 208, 5, 253, 242, 208, 5, 214, 128, 208, 1, 61, 208, 1, 254, 232, 208, 1, - 72, 208, 1, 236, 28, 208, 1, 69, 208, 1, 215, 92, 208, 1, 74, 208, 1, - 254, 108, 208, 1, 75, 208, 1, 253, 108, 208, 1, 181, 208, 1, 234, 138, - 208, 1, 243, 110, 208, 1, 242, 225, 208, 1, 229, 159, 208, 1, 250, 219, - 208, 1, 250, 92, 208, 1, 235, 139, 208, 1, 235, 115, 208, 1, 228, 23, - 208, 1, 216, 115, 208, 1, 216, 105, 208, 1, 248, 86, 208, 1, 248, 75, - 208, 1, 248, 70, 208, 1, 223, 192, 208, 1, 228, 198, 208, 1, 218, 52, - 208, 1, 217, 161, 208, 1, 248, 164, 208, 1, 247, 232, 208, 1, 205, 208, - 1, 193, 208, 1, 226, 23, 208, 1, 252, 107, 208, 1, 251, 195, 208, 1, 188, - 208, 1, 186, 208, 1, 203, 208, 1, 233, 157, 208, 1, 215, 1, 208, 1, 221, - 24, 208, 1, 219, 157, 208, 1, 222, 202, 208, 1, 159, 208, 30, 5, 254, - 232, 208, 30, 5, 72, 208, 30, 5, 236, 28, 208, 30, 5, 69, 208, 30, 5, - 215, 92, 208, 30, 5, 74, 208, 30, 5, 254, 108, 208, 30, 5, 75, 208, 30, - 5, 253, 108, 208, 5, 214, 133, 208, 5, 228, 60, 208, 254, 181, 52, 208, - 245, 80, 52, 208, 50, 52, 208, 222, 92, 77, 208, 51, 222, 92, 77, 208, - 248, 123, 208, 51, 248, 123, 15, 5, 61, 15, 5, 118, 29, 61, 15, 5, 118, - 29, 252, 94, 15, 5, 118, 29, 243, 81, 217, 192, 15, 5, 118, 29, 159, 15, - 5, 118, 29, 236, 30, 15, 5, 118, 29, 233, 139, 242, 75, 15, 5, 118, 29, - 230, 131, 15, 5, 118, 29, 222, 190, 15, 5, 254, 234, 15, 5, 254, 185, 15, - 5, 254, 186, 29, 253, 144, 15, 5, 254, 186, 29, 246, 22, 242, 75, 15, 5, - 254, 186, 29, 243, 94, 15, 5, 254, 186, 29, 243, 81, 217, 192, 15, 5, - 254, 186, 29, 159, 15, 5, 254, 186, 29, 236, 31, 242, 75, 15, 5, 254, - 186, 29, 236, 4, 15, 5, 254, 186, 29, 233, 140, 15, 5, 254, 186, 29, 220, - 228, 15, 5, 254, 186, 29, 111, 94, 111, 94, 69, 15, 5, 254, 186, 242, 75, - 15, 5, 254, 183, 15, 5, 254, 184, 29, 252, 79, 15, 5, 254, 184, 29, 243, - 81, 217, 192, 15, 5, 254, 184, 29, 231, 157, 94, 245, 108, 15, 5, 254, - 184, 29, 221, 22, 15, 5, 254, 184, 29, 218, 22, 15, 5, 254, 160, 15, 5, - 254, 94, 15, 5, 254, 95, 29, 245, 50, 15, 5, 254, 95, 29, 220, 190, 94, - 242, 166, 15, 5, 254, 86, 15, 5, 254, 87, 29, 254, 86, 15, 5, 254, 87, - 29, 247, 168, 15, 5, 254, 87, 29, 242, 166, 15, 5, 254, 87, 29, 159, 15, - 5, 254, 87, 29, 235, 3, 15, 5, 254, 87, 29, 234, 101, 15, 5, 254, 87, 29, - 220, 243, 15, 5, 254, 87, 29, 215, 100, 15, 5, 254, 83, 15, 5, 254, 76, - 15, 5, 254, 41, 15, 5, 254, 42, 29, 220, 243, 15, 5, 254, 32, 15, 5, 254, - 33, 110, 254, 32, 15, 5, 254, 33, 133, 217, 38, 15, 5, 254, 33, 94, 230, - 35, 227, 30, 254, 33, 94, 230, 34, 15, 5, 254, 33, 94, 230, 35, 219, 165, - 15, 5, 254, 5, 15, 5, 253, 235, 15, 5, 253, 205, 15, 5, 253, 206, 29, - 233, 217, 15, 5, 253, 179, 15, 5, 253, 151, 15, 5, 253, 146, 15, 5, 253, - 147, 212, 33, 217, 192, 15, 5, 253, 147, 235, 7, 217, 192, 15, 5, 253, - 147, 110, 253, 147, 216, 78, 110, 216, 78, 216, 78, 110, 216, 78, 226, - 149, 15, 5, 253, 147, 110, 253, 147, 110, 253, 146, 15, 5, 253, 147, 110, - 253, 147, 110, 253, 147, 249, 65, 253, 147, 110, 253, 147, 110, 253, 146, - 15, 5, 253, 144, 15, 5, 253, 141, 15, 5, 252, 107, 15, 5, 252, 94, 15, 5, - 252, 89, 15, 5, 252, 86, 15, 5, 252, 80, 15, 5, 252, 81, 110, 252, 80, - 15, 5, 252, 79, 15, 5, 134, 15, 5, 252, 59, 15, 5, 251, 184, 15, 5, 251, - 185, 29, 61, 15, 5, 251, 185, 29, 243, 72, 15, 5, 251, 185, 29, 236, 31, - 242, 75, 15, 5, 251, 54, 15, 5, 251, 55, 110, 251, 55, 254, 185, 15, 5, - 251, 55, 110, 251, 55, 215, 160, 15, 5, 251, 55, 249, 65, 251, 54, 15, 5, - 251, 38, 15, 5, 251, 39, 110, 251, 38, 15, 5, 251, 27, 15, 5, 251, 26, - 15, 5, 248, 164, 15, 5, 248, 155, 15, 5, 248, 156, 234, 75, 29, 118, 94, - 231, 210, 15, 5, 248, 156, 234, 75, 29, 254, 41, 15, 5, 248, 156, 234, - 75, 29, 252, 79, 15, 5, 248, 156, 234, 75, 29, 251, 184, 15, 5, 248, 156, - 234, 75, 29, 243, 110, 15, 5, 248, 156, 234, 75, 29, 243, 111, 94, 231, - 210, 15, 5, 248, 156, 234, 75, 29, 242, 190, 15, 5, 248, 156, 234, 75, - 29, 242, 173, 15, 5, 248, 156, 234, 75, 29, 242, 84, 15, 5, 248, 156, - 234, 75, 29, 159, 15, 5, 248, 156, 234, 75, 29, 235, 177, 15, 5, 248, - 156, 234, 75, 29, 235, 178, 94, 232, 156, 15, 5, 248, 156, 234, 75, 29, - 234, 247, 15, 5, 248, 156, 234, 75, 29, 233, 157, 15, 5, 248, 156, 234, - 75, 29, 232, 156, 15, 5, 248, 156, 234, 75, 29, 232, 157, 94, 231, 209, - 15, 5, 248, 156, 234, 75, 29, 232, 142, 15, 5, 248, 156, 234, 75, 29, - 229, 187, 15, 5, 248, 156, 234, 75, 29, 226, 150, 94, 226, 149, 15, 5, - 248, 156, 234, 75, 29, 220, 117, 15, 5, 248, 156, 234, 75, 29, 218, 22, - 15, 5, 248, 156, 234, 75, 29, 215, 198, 94, 242, 173, 15, 5, 248, 156, - 234, 75, 29, 215, 100, 15, 5, 248, 132, 15, 5, 248, 111, 15, 5, 248, 110, - 15, 5, 248, 109, 15, 5, 247, 211, 15, 5, 247, 194, 15, 5, 247, 169, 15, - 5, 247, 170, 29, 220, 243, 15, 5, 247, 168, 15, 5, 247, 158, 15, 5, 247, - 159, 234, 213, 111, 242, 76, 247, 139, 15, 5, 247, 139, 15, 5, 246, 33, - 15, 5, 246, 34, 110, 246, 33, 15, 5, 246, 34, 242, 75, 15, 5, 246, 34, - 220, 225, 15, 5, 246, 31, 15, 5, 246, 32, 29, 245, 37, 15, 5, 246, 30, - 15, 5, 246, 29, 15, 5, 246, 28, 15, 5, 246, 27, 15, 5, 246, 23, 15, 5, - 246, 21, 15, 5, 246, 22, 242, 75, 15, 5, 246, 22, 242, 76, 242, 75, 15, - 5, 246, 20, 15, 5, 246, 13, 15, 5, 74, 15, 5, 191, 29, 226, 149, 15, 5, - 191, 110, 191, 228, 51, 110, 228, 50, 15, 5, 245, 190, 15, 5, 245, 191, - 29, 118, 94, 242, 30, 94, 248, 164, 15, 5, 245, 191, 29, 243, 72, 15, 5, - 245, 191, 29, 231, 42, 15, 5, 245, 191, 29, 222, 179, 15, 5, 245, 191, - 29, 220, 243, 15, 5, 245, 191, 29, 69, 15, 5, 245, 167, 15, 5, 245, 157, - 15, 5, 245, 131, 15, 5, 245, 108, 15, 5, 245, 109, 29, 243, 80, 15, 5, - 245, 109, 29, 243, 81, 217, 192, 15, 5, 245, 109, 29, 231, 156, 15, 5, - 245, 109, 249, 65, 245, 108, 15, 5, 245, 109, 227, 30, 245, 108, 15, 5, - 245, 109, 219, 165, 15, 5, 245, 52, 15, 5, 245, 50, 15, 5, 245, 37, 15, - 5, 244, 234, 15, 5, 244, 235, 29, 61, 15, 5, 244, 235, 29, 118, 94, 233, - 128, 15, 5, 244, 235, 29, 118, 94, 233, 129, 29, 233, 128, 15, 5, 244, - 235, 29, 254, 32, 15, 5, 244, 235, 29, 252, 94, 15, 5, 244, 235, 29, 246, - 22, 242, 75, 15, 5, 244, 235, 29, 246, 22, 242, 76, 242, 75, 15, 5, 244, - 235, 29, 159, 15, 5, 244, 235, 29, 242, 30, 242, 75, 15, 5, 244, 235, 29, - 236, 31, 242, 75, 15, 5, 244, 235, 29, 234, 212, 15, 5, 244, 235, 29, - 234, 213, 219, 165, 15, 5, 244, 235, 29, 233, 236, 15, 5, 244, 235, 29, - 233, 157, 15, 5, 244, 235, 29, 233, 129, 29, 233, 128, 15, 5, 244, 235, - 29, 233, 13, 15, 5, 244, 235, 29, 232, 156, 15, 5, 244, 235, 29, 215, - 197, 15, 5, 244, 235, 29, 215, 188, 15, 5, 243, 110, 15, 5, 243, 111, - 242, 75, 15, 5, 243, 108, 15, 5, 243, 109, 29, 118, 94, 248, 165, 94, - 159, 15, 5, 243, 109, 29, 118, 94, 159, 15, 5, 243, 109, 29, 118, 94, - 236, 30, 15, 5, 243, 109, 29, 254, 184, 217, 193, 94, 218, 41, 15, 5, - 243, 109, 29, 254, 32, 15, 5, 243, 109, 29, 253, 146, 15, 5, 243, 109, - 29, 253, 145, 94, 243, 94, 15, 5, 243, 109, 29, 252, 94, 15, 5, 243, 109, - 29, 252, 60, 94, 203, 15, 5, 243, 109, 29, 251, 27, 15, 5, 243, 109, 29, - 251, 28, 94, 203, 15, 5, 243, 109, 29, 248, 164, 15, 5, 243, 109, 29, - 247, 211, 15, 5, 243, 109, 29, 247, 170, 29, 220, 243, 15, 5, 243, 109, - 29, 246, 31, 15, 5, 243, 109, 29, 245, 131, 15, 5, 243, 109, 29, 245, - 132, 94, 233, 157, 15, 5, 243, 109, 29, 245, 108, 15, 5, 243, 109, 29, - 245, 109, 29, 243, 81, 217, 192, 15, 5, 243, 109, 29, 243, 81, 217, 192, - 15, 5, 243, 109, 29, 243, 72, 15, 5, 243, 109, 29, 242, 190, 15, 5, 243, - 109, 29, 242, 188, 15, 5, 243, 109, 29, 242, 189, 94, 61, 15, 5, 243, - 109, 29, 242, 174, 94, 219, 27, 15, 5, 243, 109, 29, 242, 30, 94, 232, - 157, 94, 245, 37, 15, 5, 243, 109, 29, 242, 12, 15, 5, 243, 109, 29, 242, - 13, 94, 233, 157, 15, 5, 243, 109, 29, 241, 166, 94, 233, 13, 15, 5, 243, - 109, 29, 240, 208, 15, 5, 243, 109, 29, 236, 31, 242, 75, 15, 5, 243, - 109, 29, 235, 164, 94, 240, 213, 94, 253, 146, 15, 5, 243, 109, 29, 234, - 247, 15, 5, 243, 109, 29, 234, 212, 15, 5, 243, 109, 29, 234, 98, 15, 5, - 243, 109, 29, 234, 99, 94, 233, 128, 15, 5, 243, 109, 29, 233, 237, 94, - 254, 32, 15, 5, 243, 109, 29, 233, 157, 15, 5, 243, 109, 29, 231, 157, - 94, 245, 108, 15, 5, 243, 109, 29, 231, 42, 15, 5, 243, 109, 29, 228, 50, - 15, 5, 243, 109, 29, 228, 51, 110, 228, 50, 15, 5, 243, 109, 29, 193, 15, - 5, 243, 109, 29, 222, 179, 15, 5, 243, 109, 29, 222, 147, 15, 5, 243, - 109, 29, 220, 243, 15, 5, 243, 109, 29, 220, 244, 94, 216, 62, 15, 5, - 243, 109, 29, 220, 210, 15, 5, 243, 109, 29, 218, 244, 15, 5, 243, 109, - 29, 218, 22, 15, 5, 243, 109, 29, 69, 15, 5, 243, 109, 29, 215, 188, 15, - 5, 243, 109, 29, 215, 189, 94, 246, 33, 15, 5, 243, 109, 110, 243, 108, - 15, 5, 243, 103, 15, 5, 243, 104, 249, 65, 243, 103, 15, 5, 243, 101, 15, - 5, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 94, 15, 5, - 243, 95, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, 15, 5, 243, 93, - 15, 5, 243, 91, 15, 5, 243, 82, 15, 5, 243, 80, 15, 5, 243, 81, 217, 192, - 15, 5, 243, 81, 110, 243, 80, 15, 5, 243, 81, 249, 65, 243, 80, 15, 5, - 243, 72, 15, 5, 243, 71, 15, 5, 243, 66, 15, 5, 243, 12, 15, 5, 243, 13, - 29, 233, 217, 15, 5, 242, 190, 15, 5, 242, 191, 29, 74, 15, 5, 242, 191, - 29, 69, 15, 5, 242, 191, 249, 65, 242, 190, 15, 5, 242, 188, 15, 5, 242, - 189, 110, 242, 188, 15, 5, 242, 189, 249, 65, 242, 188, 15, 5, 242, 185, - 15, 5, 242, 173, 15, 5, 242, 174, 242, 75, 15, 5, 242, 171, 15, 5, 242, - 172, 29, 118, 94, 236, 30, 15, 5, 242, 172, 29, 243, 81, 217, 192, 15, 5, - 242, 172, 29, 236, 30, 15, 5, 242, 172, 29, 232, 157, 94, 236, 30, 15, 5, - 242, 172, 29, 193, 15, 5, 242, 168, 15, 5, 242, 166, 15, 5, 242, 167, - 249, 65, 242, 166, 15, 5, 242, 167, 29, 252, 94, 15, 5, 242, 167, 29, - 218, 22, 15, 5, 242, 167, 217, 192, 15, 5, 242, 92, 15, 5, 242, 93, 249, - 65, 242, 92, 15, 5, 242, 90, 15, 5, 242, 91, 29, 234, 247, 15, 5, 242, - 91, 29, 234, 248, 29, 236, 31, 242, 75, 15, 5, 242, 91, 29, 228, 50, 15, - 5, 242, 91, 29, 222, 180, 94, 216, 77, 15, 5, 242, 91, 242, 75, 15, 5, - 242, 84, 15, 5, 242, 85, 29, 118, 94, 233, 217, 15, 5, 242, 85, 29, 233, - 217, 15, 5, 242, 85, 110, 242, 85, 232, 149, 15, 5, 242, 79, 15, 5, 242, - 77, 15, 5, 242, 78, 29, 220, 243, 15, 5, 242, 69, 15, 5, 242, 68, 15, 5, - 242, 65, 15, 5, 242, 64, 15, 5, 159, 15, 5, 242, 30, 217, 192, 15, 5, - 242, 30, 242, 75, 15, 5, 242, 12, 15, 5, 241, 165, 15, 5, 241, 166, 29, - 253, 146, 15, 5, 241, 166, 29, 253, 144, 15, 5, 241, 166, 29, 252, 94, - 15, 5, 241, 166, 29, 247, 139, 15, 5, 241, 166, 29, 243, 101, 15, 5, 241, - 166, 29, 234, 90, 15, 5, 241, 166, 29, 228, 50, 15, 5, 241, 166, 29, 220, - 243, 15, 5, 241, 166, 29, 69, 15, 5, 240, 212, 15, 5, 240, 208, 15, 5, - 240, 209, 29, 254, 32, 15, 5, 240, 209, 29, 242, 12, 15, 5, 240, 209, 29, - 234, 212, 15, 5, 240, 209, 29, 232, 226, 15, 5, 240, 209, 29, 215, 188, - 15, 5, 240, 205, 15, 5, 72, 15, 5, 240, 146, 61, 15, 5, 240, 108, 15, 5, - 236, 58, 15, 5, 236, 59, 110, 236, 59, 251, 27, 15, 5, 236, 59, 110, 236, - 59, 219, 165, 15, 5, 236, 33, 15, 5, 236, 30, 15, 5, 236, 31, 247, 194, - 15, 5, 236, 31, 223, 188, 15, 5, 236, 31, 110, 236, 31, 220, 194, 110, - 220, 194, 215, 189, 110, 215, 188, 15, 5, 236, 31, 242, 75, 15, 5, 236, - 22, 15, 5, 236, 23, 29, 243, 81, 217, 192, 15, 5, 236, 21, 15, 5, 236, - 11, 15, 5, 236, 12, 29, 218, 22, 15, 5, 236, 12, 249, 65, 236, 11, 15, 5, - 236, 12, 227, 30, 236, 11, 15, 5, 236, 12, 219, 165, 15, 5, 236, 4, 15, - 5, 235, 251, 15, 5, 235, 177, 15, 5, 235, 163, 15, 5, 181, 15, 5, 235, - 17, 29, 61, 15, 5, 235, 17, 29, 254, 160, 15, 5, 235, 17, 29, 254, 161, - 94, 233, 236, 15, 5, 235, 17, 29, 253, 144, 15, 5, 235, 17, 29, 252, 94, - 15, 5, 235, 17, 29, 252, 79, 15, 5, 235, 17, 29, 134, 15, 5, 235, 17, 29, - 251, 184, 15, 5, 235, 17, 29, 245, 50, 15, 5, 235, 17, 29, 245, 37, 15, - 5, 235, 17, 29, 243, 110, 15, 5, 235, 17, 29, 243, 94, 15, 5, 235, 17, - 29, 243, 81, 217, 192, 15, 5, 235, 17, 29, 243, 72, 15, 5, 235, 17, 29, - 243, 73, 94, 221, 23, 94, 61, 15, 5, 235, 17, 29, 242, 190, 15, 5, 235, - 17, 29, 242, 173, 15, 5, 235, 17, 29, 242, 167, 94, 222, 147, 15, 5, 235, - 17, 29, 242, 167, 249, 65, 242, 166, 15, 5, 235, 17, 29, 242, 92, 15, 5, - 235, 17, 29, 242, 68, 15, 5, 235, 17, 29, 236, 30, 15, 5, 235, 17, 29, - 236, 11, 15, 5, 235, 17, 29, 234, 247, 15, 5, 235, 17, 29, 234, 101, 15, - 5, 235, 17, 29, 234, 98, 15, 5, 235, 17, 29, 233, 13, 15, 5, 235, 17, 29, - 232, 156, 15, 5, 235, 17, 29, 231, 156, 15, 5, 235, 17, 29, 231, 157, 94, - 246, 33, 15, 5, 235, 17, 29, 231, 157, 94, 242, 190, 15, 5, 235, 17, 29, - 231, 157, 94, 217, 229, 15, 5, 235, 17, 29, 231, 42, 15, 5, 235, 17, 29, - 231, 43, 94, 228, 45, 15, 5, 235, 17, 29, 229, 187, 15, 5, 235, 17, 29, - 228, 50, 15, 5, 235, 17, 29, 225, 240, 15, 5, 235, 17, 29, 223, 51, 15, - 5, 235, 17, 29, 222, 202, 15, 5, 235, 17, 29, 222, 147, 15, 5, 235, 17, - 29, 221, 24, 15, 5, 235, 17, 29, 220, 243, 15, 5, 235, 17, 29, 220, 210, - 15, 5, 235, 17, 29, 220, 150, 15, 5, 235, 17, 29, 220, 108, 15, 5, 235, - 17, 29, 218, 252, 15, 5, 235, 17, 29, 218, 1, 15, 5, 235, 17, 29, 69, 15, - 5, 235, 17, 29, 215, 197, 15, 5, 235, 17, 29, 215, 188, 15, 5, 235, 17, - 29, 215, 163, 29, 193, 15, 5, 235, 17, 29, 215, 100, 15, 5, 235, 17, 29, - 212, 37, 15, 5, 235, 15, 15, 5, 235, 16, 249, 65, 235, 15, 15, 5, 235, 8, - 15, 5, 235, 5, 15, 5, 235, 3, 15, 5, 235, 2, 15, 5, 235, 0, 15, 5, 235, - 1, 110, 235, 0, 15, 5, 234, 247, 15, 5, 234, 248, 29, 236, 31, 242, 75, - 15, 5, 234, 243, 15, 5, 234, 244, 29, 252, 94, 15, 5, 234, 244, 249, 65, - 234, 243, 15, 5, 234, 241, 15, 5, 234, 240, 15, 5, 234, 212, 15, 5, 234, - 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 213, 110, 234, - 213, 233, 141, 29, 111, 110, 233, 141, 29, 69, 15, 5, 234, 163, 15, 5, - 234, 101, 15, 5, 234, 102, 29, 252, 94, 15, 5, 234, 102, 29, 69, 15, 5, - 234, 102, 29, 215, 188, 15, 5, 234, 98, 15, 5, 234, 90, 15, 5, 234, 77, - 15, 5, 234, 76, 15, 5, 234, 74, 15, 5, 234, 75, 110, 234, 74, 15, 5, 233, - 238, 15, 5, 233, 239, 110, 241, 166, 29, 253, 145, 233, 239, 110, 241, - 166, 29, 253, 144, 15, 5, 233, 236, 15, 5, 233, 234, 15, 5, 233, 235, - 214, 244, 17, 15, 5, 233, 233, 15, 5, 233, 230, 15, 5, 233, 231, 242, 75, - 15, 5, 233, 229, 15, 5, 233, 217, 15, 5, 233, 218, 227, 30, 233, 217, 15, - 5, 233, 212, 15, 5, 233, 194, 15, 5, 233, 157, 15, 5, 233, 140, 15, 5, - 233, 141, 29, 61, 15, 5, 233, 141, 29, 118, 94, 248, 165, 94, 159, 15, 5, - 233, 141, 29, 118, 94, 243, 72, 15, 5, 233, 141, 29, 118, 94, 233, 128, - 15, 5, 233, 141, 29, 254, 86, 15, 5, 233, 141, 29, 254, 32, 15, 5, 233, - 141, 29, 253, 147, 212, 33, 217, 192, 15, 5, 233, 141, 29, 252, 94, 15, - 5, 233, 141, 29, 251, 184, 15, 5, 233, 141, 29, 248, 111, 15, 5, 233, - 141, 29, 245, 108, 15, 5, 233, 141, 29, 243, 110, 15, 5, 233, 141, 29, - 243, 72, 15, 5, 233, 141, 29, 242, 84, 15, 5, 233, 141, 29, 242, 85, 94, - 242, 84, 15, 5, 233, 141, 29, 159, 15, 5, 233, 141, 29, 242, 12, 15, 5, - 233, 141, 29, 241, 166, 29, 228, 50, 15, 5, 233, 141, 29, 236, 31, 242, - 75, 15, 5, 233, 141, 29, 236, 11, 15, 5, 233, 141, 29, 236, 12, 94, 159, - 15, 5, 233, 141, 29, 236, 12, 94, 232, 156, 15, 5, 233, 141, 29, 234, - 101, 15, 5, 233, 141, 29, 234, 90, 15, 5, 233, 141, 29, 233, 236, 15, 5, - 233, 141, 29, 233, 230, 15, 5, 233, 141, 29, 233, 231, 94, 241, 166, 94, - 61, 15, 5, 233, 141, 29, 233, 140, 15, 5, 233, 141, 29, 232, 226, 15, 5, - 233, 141, 29, 232, 156, 15, 5, 233, 141, 29, 232, 144, 15, 5, 233, 141, - 29, 231, 156, 15, 5, 233, 141, 29, 231, 157, 94, 245, 108, 15, 5, 233, - 141, 29, 230, 131, 15, 5, 233, 141, 29, 229, 187, 15, 5, 233, 141, 29, - 220, 244, 94, 218, 244, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 94, - 245, 50, 15, 5, 233, 141, 29, 220, 190, 94, 242, 167, 217, 192, 15, 5, - 233, 141, 29, 220, 148, 15, 5, 233, 141, 29, 220, 149, 94, 220, 148, 15, - 5, 233, 141, 29, 218, 244, 15, 5, 233, 141, 29, 218, 33, 15, 5, 233, 141, - 29, 218, 22, 15, 5, 233, 141, 29, 217, 230, 94, 118, 94, 219, 28, 94, - 205, 15, 5, 233, 141, 29, 69, 15, 5, 233, 141, 29, 111, 94, 61, 15, 5, - 233, 141, 29, 111, 94, 111, 94, 69, 15, 5, 233, 141, 29, 215, 198, 94, - 253, 146, 15, 5, 233, 141, 29, 215, 188, 15, 5, 233, 141, 29, 215, 100, - 15, 5, 233, 141, 219, 165, 15, 5, 233, 138, 15, 5, 233, 139, 29, 220, - 243, 15, 5, 233, 139, 29, 220, 244, 94, 218, 244, 15, 5, 233, 139, 242, - 75, 15, 5, 233, 139, 242, 76, 110, 233, 139, 242, 76, 220, 243, 15, 5, - 233, 135, 15, 5, 233, 128, 15, 5, 233, 129, 29, 233, 128, 15, 5, 233, - 126, 15, 5, 233, 127, 29, 233, 217, 15, 5, 233, 127, 29, 233, 218, 94, - 223, 51, 15, 5, 233, 13, 15, 5, 232, 254, 15, 5, 232, 245, 15, 5, 232, - 226, 15, 5, 232, 156, 15, 5, 232, 157, 29, 252, 94, 15, 5, 232, 154, 15, - 5, 232, 155, 29, 254, 86, 15, 5, 232, 155, 29, 252, 94, 15, 5, 232, 155, - 29, 245, 37, 15, 5, 232, 155, 29, 245, 38, 217, 192, 15, 5, 232, 155, 29, - 243, 81, 217, 192, 15, 5, 232, 155, 29, 241, 166, 29, 252, 94, 15, 5, - 232, 155, 29, 236, 11, 15, 5, 232, 155, 29, 235, 5, 15, 5, 232, 155, 29, - 235, 3, 15, 5, 232, 155, 29, 235, 4, 94, 253, 146, 15, 5, 232, 155, 29, - 234, 101, 15, 5, 232, 155, 29, 233, 158, 94, 253, 146, 15, 5, 232, 155, - 29, 233, 140, 15, 5, 232, 155, 29, 231, 157, 94, 245, 108, 15, 5, 232, - 155, 29, 229, 187, 15, 5, 232, 155, 29, 228, 92, 15, 5, 232, 155, 29, - 220, 118, 94, 253, 146, 15, 5, 232, 155, 29, 220, 100, 94, 251, 54, 15, - 5, 232, 155, 29, 216, 77, 15, 5, 232, 155, 217, 192, 15, 5, 232, 155, - 249, 65, 232, 154, 15, 5, 232, 155, 227, 30, 232, 154, 15, 5, 232, 155, - 219, 165, 15, 5, 232, 155, 220, 225, 15, 5, 232, 153, 15, 5, 232, 149, - 15, 5, 232, 150, 110, 232, 149, 15, 5, 232, 150, 227, 30, 232, 149, 15, - 5, 232, 150, 220, 225, 15, 5, 232, 147, 15, 5, 232, 144, 15, 5, 232, 142, - 15, 5, 232, 143, 110, 232, 142, 15, 5, 232, 143, 110, 232, 143, 243, 73, - 110, 243, 72, 15, 5, 188, 15, 5, 232, 43, 29, 218, 22, 15, 5, 232, 43, - 242, 75, 15, 5, 232, 42, 15, 5, 232, 15, 15, 5, 231, 229, 15, 5, 231, - 210, 15, 5, 231, 209, 15, 5, 231, 156, 15, 5, 231, 112, 15, 5, 231, 42, - 15, 5, 231, 1, 15, 5, 230, 172, 15, 5, 230, 173, 110, 230, 172, 15, 5, - 230, 163, 15, 5, 230, 164, 242, 75, 15, 5, 230, 148, 15, 5, 230, 134, 15, - 5, 230, 131, 15, 5, 230, 132, 29, 61, 15, 5, 230, 132, 29, 233, 217, 15, - 5, 230, 132, 29, 212, 109, 15, 5, 230, 132, 110, 230, 131, 15, 5, 230, - 132, 110, 230, 132, 29, 118, 94, 205, 15, 5, 230, 132, 249, 65, 230, 131, - 15, 5, 230, 129, 15, 5, 230, 130, 29, 61, 15, 5, 230, 130, 29, 118, 94, - 247, 211, 15, 5, 230, 130, 29, 247, 211, 15, 5, 230, 130, 242, 75, 15, 5, - 205, 15, 5, 230, 45, 15, 5, 230, 34, 15, 5, 230, 35, 235, 190, 15, 5, - 230, 35, 29, 220, 151, 217, 192, 15, 5, 230, 35, 227, 30, 230, 34, 15, 5, - 230, 33, 15, 5, 230, 28, 228, 36, 15, 5, 230, 27, 15, 5, 230, 26, 15, 5, - 229, 187, 15, 5, 229, 188, 29, 61, 15, 5, 229, 188, 29, 215, 188, 15, 5, - 229, 188, 220, 225, 15, 5, 229, 64, 15, 5, 229, 65, 29, 74, 15, 5, 229, - 63, 15, 5, 229, 34, 15, 5, 229, 35, 29, 243, 81, 217, 192, 15, 5, 229, - 35, 29, 243, 73, 94, 243, 81, 217, 192, 15, 5, 229, 32, 15, 5, 229, 33, - 29, 254, 32, 15, 5, 229, 33, 29, 253, 146, 15, 5, 229, 33, 29, 253, 147, - 94, 253, 146, 15, 5, 229, 33, 29, 242, 84, 15, 5, 229, 33, 29, 231, 157, - 94, 243, 81, 217, 192, 15, 5, 229, 33, 29, 229, 187, 15, 5, 229, 33, 29, - 228, 50, 15, 5, 229, 33, 29, 220, 243, 15, 5, 229, 33, 29, 220, 244, 94, - 118, 254, 32, 15, 5, 229, 33, 29, 220, 244, 94, 253, 146, 15, 5, 229, 33, - 29, 220, 244, 94, 253, 147, 94, 253, 146, 15, 5, 229, 33, 29, 215, 198, - 94, 253, 146, 15, 5, 229, 33, 29, 215, 100, 15, 5, 229, 21, 15, 5, 228, - 92, 15, 5, 228, 65, 15, 5, 228, 50, 15, 5, 228, 51, 233, 139, 29, 243, - 72, 15, 5, 228, 51, 233, 139, 29, 231, 210, 15, 5, 228, 51, 233, 139, 29, - 222, 179, 15, 5, 228, 51, 233, 139, 29, 222, 180, 110, 228, 51, 233, 139, - 29, 222, 179, 15, 5, 228, 51, 233, 139, 29, 215, 100, 15, 5, 228, 51, - 217, 192, 15, 5, 228, 51, 110, 228, 50, 15, 5, 228, 51, 249, 65, 228, 50, - 15, 5, 228, 51, 249, 65, 228, 51, 233, 139, 110, 233, 138, 15, 5, 228, - 45, 15, 5, 228, 46, 254, 184, 29, 253, 141, 15, 5, 228, 46, 254, 184, 29, - 251, 184, 15, 5, 228, 46, 254, 184, 29, 246, 29, 15, 5, 228, 46, 254, - 184, 29, 242, 84, 15, 5, 228, 46, 254, 184, 29, 236, 31, 242, 75, 15, 5, - 228, 46, 254, 184, 29, 235, 3, 15, 5, 228, 46, 254, 184, 29, 233, 157, - 15, 5, 228, 46, 254, 184, 29, 229, 187, 15, 5, 228, 46, 254, 184, 29, - 220, 97, 15, 5, 228, 46, 254, 184, 29, 215, 197, 15, 5, 228, 46, 234, 75, - 29, 251, 184, 15, 5, 228, 46, 234, 75, 29, 251, 185, 69, 15, 5, 193, 15, - 5, 226, 204, 15, 5, 226, 174, 15, 5, 226, 149, 15, 5, 226, 37, 15, 5, - 225, 240, 15, 5, 225, 241, 29, 61, 15, 5, 225, 241, 29, 254, 185, 15, 5, - 225, 241, 29, 251, 184, 15, 5, 225, 241, 29, 251, 54, 15, 5, 225, 241, - 29, 74, 15, 5, 225, 241, 29, 72, 15, 5, 225, 241, 29, 240, 108, 15, 5, - 225, 241, 29, 69, 15, 5, 225, 241, 29, 215, 197, 15, 5, 225, 241, 249, - 65, 225, 240, 15, 5, 225, 185, 15, 5, 225, 186, 29, 234, 243, 15, 5, 225, - 186, 29, 215, 188, 15, 5, 225, 186, 29, 212, 109, 15, 5, 225, 186, 227, - 30, 225, 185, 15, 5, 203, 15, 5, 224, 72, 15, 5, 223, 188, 15, 5, 223, - 51, 15, 5, 222, 202, 15, 5, 222, 191, 228, 36, 15, 5, 222, 190, 15, 5, - 222, 191, 29, 61, 15, 5, 222, 191, 29, 246, 33, 15, 5, 222, 191, 29, 246, - 31, 15, 5, 222, 191, 29, 159, 15, 5, 222, 191, 29, 234, 247, 15, 5, 222, - 191, 29, 233, 217, 15, 5, 222, 191, 29, 232, 142, 15, 5, 222, 191, 29, - 231, 42, 15, 5, 222, 191, 29, 228, 50, 15, 5, 222, 191, 29, 222, 179, 15, - 5, 222, 191, 29, 220, 210, 15, 5, 222, 191, 29, 218, 41, 15, 5, 222, 191, - 29, 215, 197, 15, 5, 222, 191, 29, 215, 194, 15, 5, 222, 191, 29, 215, - 167, 15, 5, 222, 191, 29, 215, 121, 15, 5, 222, 191, 29, 215, 100, 15, 5, - 222, 191, 110, 222, 190, 15, 5, 222, 191, 242, 75, 15, 5, 222, 179, 15, - 5, 222, 180, 233, 141, 29, 253, 144, 15, 5, 222, 155, 15, 5, 222, 147, - 15, 5, 221, 24, 15, 5, 221, 22, 15, 5, 221, 23, 29, 61, 15, 5, 221, 23, - 29, 252, 94, 15, 5, 221, 23, 29, 242, 166, 15, 5, 221, 23, 29, 229, 187, - 15, 5, 221, 23, 29, 220, 148, 15, 5, 221, 23, 29, 216, 62, 15, 5, 221, - 23, 29, 69, 15, 5, 221, 23, 29, 111, 94, 61, 15, 5, 221, 21, 15, 5, 221, - 19, 15, 5, 221, 1, 15, 5, 220, 243, 15, 5, 220, 244, 240, 212, 15, 5, - 220, 244, 110, 220, 244, 243, 102, 110, 243, 102, 243, 73, 110, 243, 72, - 15, 5, 220, 244, 110, 220, 244, 218, 42, 110, 218, 42, 243, 73, 110, 243, - 72, 15, 5, 220, 236, 15, 5, 220, 231, 15, 5, 220, 228, 15, 5, 220, 227, - 15, 5, 220, 224, 15, 5, 220, 210, 15, 5, 220, 211, 29, 61, 15, 5, 220, - 211, 29, 236, 11, 15, 5, 220, 204, 15, 5, 220, 205, 29, 61, 15, 5, 220, - 205, 29, 252, 80, 15, 5, 220, 205, 29, 251, 38, 15, 5, 220, 205, 29, 247, - 158, 15, 5, 220, 205, 29, 243, 72, 15, 5, 220, 205, 29, 236, 30, 15, 5, - 220, 205, 29, 236, 31, 242, 75, 15, 5, 220, 205, 29, 233, 212, 15, 5, - 220, 205, 29, 232, 144, 15, 5, 220, 205, 29, 230, 163, 15, 5, 220, 205, - 29, 222, 179, 15, 5, 220, 198, 15, 5, 220, 193, 15, 5, 220, 194, 217, - 192, 15, 5, 220, 194, 110, 220, 194, 251, 28, 110, 251, 27, 15, 5, 220, - 189, 15, 5, 220, 150, 15, 5, 220, 151, 110, 235, 191, 220, 150, 15, 5, - 220, 148, 15, 5, 220, 147, 15, 5, 220, 117, 15, 5, 220, 118, 242, 75, 15, - 5, 220, 108, 15, 5, 220, 106, 15, 5, 220, 107, 110, 220, 107, 220, 148, - 15, 5, 220, 99, 15, 5, 220, 97, 15, 5, 219, 27, 15, 5, 219, 28, 110, 219, - 27, 15, 5, 218, 255, 15, 5, 218, 254, 15, 5, 218, 252, 15, 5, 218, 244, - 15, 5, 218, 243, 15, 5, 218, 217, 15, 5, 218, 216, 15, 5, 218, 52, 15, 5, - 218, 53, 253, 132, 15, 5, 218, 53, 29, 241, 165, 15, 5, 218, 53, 29, 231, - 42, 15, 5, 218, 53, 242, 75, 15, 5, 218, 41, 15, 5, 218, 42, 110, 218, - 42, 229, 65, 110, 229, 65, 247, 140, 110, 247, 139, 15, 5, 218, 42, 219, - 165, 15, 5, 218, 33, 15, 5, 126, 29, 251, 184, 15, 5, 126, 29, 242, 84, - 15, 5, 126, 29, 220, 243, 15, 5, 126, 29, 220, 150, 15, 5, 126, 29, 216, - 77, 15, 5, 126, 29, 215, 188, 15, 5, 218, 22, 15, 5, 218, 1, 15, 5, 217, - 229, 15, 5, 217, 230, 242, 75, 15, 5, 217, 71, 15, 5, 217, 72, 217, 192, - 15, 5, 217, 44, 15, 5, 217, 25, 15, 5, 217, 26, 29, 218, 22, 15, 5, 217, - 26, 110, 217, 25, 15, 5, 217, 26, 110, 217, 26, 243, 102, 110, 243, 102, - 243, 73, 110, 243, 72, 15, 5, 216, 82, 15, 5, 216, 77, 15, 5, 216, 75, - 15, 5, 216, 72, 15, 5, 216, 62, 15, 5, 216, 63, 110, 216, 63, 212, 110, - 110, 212, 109, 15, 5, 69, 15, 5, 111, 242, 84, 15, 5, 111, 111, 69, 15, - 5, 111, 110, 111, 226, 214, 110, 226, 214, 243, 73, 110, 243, 72, 15, 5, - 111, 110, 111, 218, 218, 110, 218, 217, 15, 5, 111, 110, 111, 111, 223, - 202, 110, 111, 223, 201, 15, 5, 215, 197, 15, 5, 215, 194, 15, 5, 215, - 188, 15, 5, 215, 189, 233, 212, 15, 5, 215, 189, 29, 252, 94, 15, 5, 215, - 189, 29, 231, 42, 15, 5, 215, 189, 29, 111, 94, 111, 94, 69, 15, 5, 215, - 189, 29, 111, 94, 111, 94, 111, 242, 75, 15, 5, 215, 189, 242, 75, 15, 5, - 215, 189, 220, 225, 15, 5, 215, 189, 220, 226, 29, 252, 94, 15, 5, 215, - 184, 15, 5, 215, 167, 15, 5, 215, 168, 29, 233, 140, 15, 5, 215, 168, 29, - 231, 157, 94, 248, 164, 15, 5, 215, 168, 29, 221, 22, 15, 5, 215, 168, - 29, 69, 15, 5, 215, 166, 15, 5, 215, 162, 15, 5, 215, 163, 29, 234, 212, - 15, 5, 215, 163, 29, 193, 15, 5, 215, 160, 15, 5, 215, 161, 242, 75, 15, - 5, 215, 121, 15, 5, 215, 122, 249, 65, 215, 121, 15, 5, 215, 122, 220, - 225, 15, 5, 215, 119, 15, 5, 215, 120, 29, 118, 94, 159, 15, 5, 215, 120, - 29, 118, 94, 205, 15, 5, 215, 120, 29, 254, 86, 15, 5, 215, 120, 29, 159, - 15, 5, 215, 120, 29, 228, 50, 15, 5, 215, 120, 29, 215, 197, 15, 5, 215, - 120, 29, 215, 198, 94, 253, 146, 15, 5, 215, 120, 29, 215, 198, 94, 251, - 184, 15, 5, 215, 118, 15, 5, 215, 115, 15, 5, 215, 114, 15, 5, 215, 110, - 15, 5, 215, 111, 29, 61, 15, 5, 215, 111, 29, 253, 141, 15, 5, 215, 111, - 29, 134, 15, 5, 215, 111, 29, 246, 23, 15, 5, 215, 111, 29, 243, 110, 15, - 5, 215, 111, 29, 243, 94, 15, 5, 215, 111, 29, 243, 81, 217, 192, 15, 5, - 215, 111, 29, 243, 72, 15, 5, 215, 111, 29, 242, 92, 15, 5, 215, 111, 29, - 159, 15, 5, 215, 111, 29, 236, 30, 15, 5, 215, 111, 29, 236, 11, 15, 5, - 215, 111, 29, 235, 163, 15, 5, 215, 111, 29, 234, 101, 15, 5, 215, 111, - 29, 232, 142, 15, 5, 215, 111, 29, 231, 1, 15, 5, 215, 111, 29, 193, 15, - 5, 215, 111, 29, 220, 243, 15, 5, 215, 111, 29, 220, 106, 15, 5, 215, - 111, 29, 216, 82, 15, 5, 215, 111, 29, 111, 94, 242, 84, 15, 5, 215, 111, - 29, 215, 188, 15, 5, 215, 111, 29, 215, 108, 15, 5, 215, 108, 15, 5, 215, - 109, 29, 69, 15, 5, 215, 100, 15, 5, 215, 101, 29, 61, 15, 5, 215, 101, - 29, 233, 238, 15, 5, 215, 101, 29, 233, 217, 15, 5, 215, 101, 29, 218, - 22, 15, 5, 215, 96, 15, 5, 215, 99, 15, 5, 215, 97, 15, 5, 215, 93, 15, - 5, 215, 82, 15, 5, 215, 83, 29, 234, 212, 15, 5, 215, 81, 15, 5, 212, - 109, 15, 5, 212, 110, 217, 192, 15, 5, 212, 110, 91, 29, 233, 217, 15, 5, - 212, 106, 15, 5, 212, 99, 15, 5, 212, 86, 15, 5, 212, 37, 15, 5, 212, 38, - 110, 212, 37, 15, 5, 212, 36, 15, 5, 212, 34, 15, 5, 212, 35, 235, 7, - 217, 192, 15, 5, 212, 29, 15, 5, 212, 21, 15, 5, 212, 8, 15, 5, 212, 6, - 15, 5, 212, 7, 29, 61, 15, 5, 212, 5, 15, 5, 212, 4, 15, 128, 5, 117, - 253, 146, 15, 128, 5, 133, 253, 146, 15, 128, 5, 243, 237, 253, 146, 15, - 128, 5, 244, 50, 253, 146, 15, 128, 5, 220, 53, 253, 146, 15, 128, 5, - 221, 43, 253, 146, 15, 128, 5, 245, 150, 253, 146, 15, 128, 5, 229, 31, - 253, 146, 15, 128, 5, 133, 247, 139, 15, 128, 5, 243, 237, 247, 139, 15, - 128, 5, 244, 50, 247, 139, 15, 128, 5, 220, 53, 247, 139, 15, 128, 5, - 221, 43, 247, 139, 15, 128, 5, 245, 150, 247, 139, 15, 128, 5, 229, 31, - 247, 139, 15, 128, 5, 243, 237, 69, 15, 128, 5, 244, 50, 69, 15, 128, 5, - 220, 53, 69, 15, 128, 5, 221, 43, 69, 15, 128, 5, 245, 150, 69, 15, 128, - 5, 229, 31, 69, 15, 128, 5, 122, 243, 14, 15, 128, 5, 117, 243, 14, 15, - 128, 5, 133, 243, 14, 15, 128, 5, 243, 237, 243, 14, 15, 128, 5, 244, 50, - 243, 14, 15, 128, 5, 220, 53, 243, 14, 15, 128, 5, 221, 43, 243, 14, 15, - 128, 5, 245, 150, 243, 14, 15, 128, 5, 229, 31, 243, 14, 15, 128, 5, 122, - 243, 11, 15, 128, 5, 117, 243, 11, 15, 128, 5, 133, 243, 11, 15, 128, 5, - 243, 237, 243, 11, 15, 128, 5, 244, 50, 243, 11, 15, 128, 5, 117, 221, 1, - 15, 128, 5, 133, 221, 1, 15, 128, 5, 133, 221, 2, 214, 244, 17, 15, 128, - 5, 243, 237, 221, 1, 15, 128, 5, 244, 50, 221, 1, 15, 128, 5, 220, 53, - 221, 1, 15, 128, 5, 221, 43, 221, 1, 15, 128, 5, 245, 150, 221, 1, 15, - 128, 5, 229, 31, 221, 1, 15, 128, 5, 122, 220, 252, 15, 128, 5, 117, 220, - 252, 15, 128, 5, 133, 220, 252, 15, 128, 5, 133, 220, 253, 214, 244, 17, - 15, 128, 5, 243, 237, 220, 252, 15, 128, 5, 244, 50, 220, 252, 15, 128, - 5, 221, 2, 29, 243, 95, 94, 247, 139, 15, 128, 5, 221, 2, 29, 243, 95, - 94, 231, 1, 15, 128, 5, 122, 251, 24, 15, 128, 5, 117, 251, 24, 15, 128, - 5, 133, 251, 24, 15, 128, 5, 133, 251, 25, 214, 244, 17, 15, 128, 5, 243, - 237, 251, 24, 15, 128, 5, 244, 50, 251, 24, 15, 128, 5, 133, 214, 244, - 243, 245, 245, 39, 15, 128, 5, 133, 214, 244, 243, 245, 245, 36, 15, 128, - 5, 243, 237, 214, 244, 243, 245, 232, 246, 15, 128, 5, 243, 237, 214, - 244, 243, 245, 232, 244, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232, - 247, 61, 15, 128, 5, 243, 237, 214, 244, 243, 245, 232, 247, 253, 74, 15, - 128, 5, 220, 53, 214, 244, 243, 245, 253, 143, 15, 128, 5, 221, 43, 214, - 244, 243, 245, 236, 3, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5, - 61, 15, 128, 5, 221, 43, 214, 244, 243, 245, 236, 5, 253, 74, 15, 128, 5, - 245, 150, 214, 244, 243, 245, 215, 95, 15, 128, 5, 245, 150, 214, 244, - 243, 245, 215, 94, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 19, 15, - 128, 5, 229, 31, 214, 244, 243, 245, 236, 18, 15, 128, 5, 229, 31, 214, - 244, 243, 245, 236, 17, 15, 128, 5, 229, 31, 214, 244, 243, 245, 236, 20, - 61, 15, 128, 5, 117, 253, 147, 217, 192, 15, 128, 5, 133, 253, 147, 217, - 192, 15, 128, 5, 243, 237, 253, 147, 217, 192, 15, 128, 5, 244, 50, 253, - 147, 217, 192, 15, 128, 5, 220, 53, 253, 147, 217, 192, 15, 128, 5, 122, - 252, 69, 15, 128, 5, 117, 252, 69, 15, 128, 5, 133, 252, 69, 15, 128, 5, - 243, 237, 252, 69, 15, 128, 5, 243, 237, 252, 70, 214, 244, 17, 15, 128, - 5, 244, 50, 252, 69, 15, 128, 5, 244, 50, 252, 70, 214, 244, 17, 15, 128, - 5, 229, 41, 15, 128, 5, 229, 42, 15, 128, 5, 122, 245, 35, 15, 128, 5, - 117, 245, 35, 15, 128, 5, 122, 217, 122, 247, 139, 15, 128, 5, 117, 217, - 120, 247, 139, 15, 128, 5, 244, 50, 220, 42, 247, 139, 15, 128, 5, 122, - 217, 122, 214, 244, 243, 245, 61, 15, 128, 5, 117, 217, 120, 214, 244, - 243, 245, 61, 15, 128, 5, 122, 245, 146, 253, 146, 15, 128, 5, 122, 224, - 167, 253, 146, 15, 128, 5, 53, 253, 135, 122, 220, 43, 15, 128, 5, 53, - 253, 135, 122, 224, 166, 15, 225, 27, 5, 53, 253, 135, 213, 196, 247, - 124, 15, 225, 27, 5, 71, 249, 164, 15, 225, 27, 5, 247, 207, 249, 164, - 15, 225, 27, 5, 247, 207, 216, 179, 10, 11, 255, 58, 10, 11, 255, 57, 10, - 11, 255, 56, 10, 11, 255, 55, 10, 11, 255, 54, 10, 11, 255, 53, 10, 11, - 255, 52, 10, 11, 255, 51, 10, 11, 255, 50, 10, 11, 255, 49, 10, 11, 255, - 48, 10, 11, 255, 47, 10, 11, 255, 46, 10, 11, 255, 45, 10, 11, 255, 44, - 10, 11, 255, 43, 10, 11, 255, 42, 10, 11, 255, 41, 10, 11, 255, 40, 10, - 11, 255, 39, 10, 11, 255, 38, 10, 11, 255, 37, 10, 11, 255, 36, 10, 11, - 255, 35, 10, 11, 255, 34, 10, 11, 255, 33, 10, 11, 255, 32, 10, 11, 255, - 31, 10, 11, 255, 30, 10, 11, 255, 29, 10, 11, 255, 28, 10, 11, 255, 27, - 10, 11, 255, 26, 10, 11, 255, 25, 10, 11, 255, 24, 10, 11, 255, 23, 10, - 11, 255, 22, 10, 11, 255, 21, 10, 11, 255, 20, 10, 11, 255, 19, 10, 11, - 255, 18, 10, 11, 255, 17, 10, 11, 255, 16, 10, 11, 255, 15, 10, 11, 255, - 14, 10, 11, 255, 13, 10, 11, 255, 12, 10, 11, 255, 11, 10, 11, 255, 10, - 10, 11, 255, 9, 10, 11, 255, 8, 10, 11, 255, 7, 10, 11, 255, 6, 10, 11, - 255, 5, 10, 11, 255, 4, 10, 11, 255, 3, 10, 11, 255, 2, 10, 11, 255, 1, - 10, 11, 255, 0, 10, 11, 254, 255, 10, 11, 254, 254, 10, 11, 254, 253, 10, - 11, 254, 252, 10, 11, 254, 251, 10, 11, 254, 250, 10, 11, 254, 249, 10, - 11, 254, 248, 10, 11, 254, 247, 10, 11, 254, 246, 10, 11, 254, 245, 10, - 11, 254, 244, 10, 11, 254, 243, 10, 11, 254, 242, 10, 11, 254, 241, 10, - 11, 254, 240, 10, 11, 254, 239, 10, 11, 254, 238, 10, 11, 254, 237, 10, - 11, 254, 236, 10, 11, 254, 235, 10, 11, 253, 72, 10, 11, 253, 70, 10, 11, - 253, 68, 10, 11, 253, 66, 10, 11, 253, 64, 10, 11, 253, 63, 10, 11, 253, - 61, 10, 11, 253, 59, 10, 11, 253, 57, 10, 11, 253, 55, 10, 11, 250, 248, - 10, 11, 250, 247, 10, 11, 250, 246, 10, 11, 250, 245, 10, 11, 250, 244, - 10, 11, 250, 243, 10, 11, 250, 242, 10, 11, 250, 241, 10, 11, 250, 240, - 10, 11, 250, 239, 10, 11, 250, 238, 10, 11, 250, 237, 10, 11, 250, 236, - 10, 11, 250, 235, 10, 11, 250, 234, 10, 11, 250, 233, 10, 11, 250, 232, - 10, 11, 250, 231, 10, 11, 250, 230, 10, 11, 250, 229, 10, 11, 250, 228, - 10, 11, 250, 227, 10, 11, 250, 226, 10, 11, 250, 225, 10, 11, 250, 224, - 10, 11, 250, 223, 10, 11, 250, 222, 10, 11, 250, 221, 10, 11, 249, 2, 10, - 11, 249, 1, 10, 11, 249, 0, 10, 11, 248, 255, 10, 11, 248, 254, 10, 11, - 248, 253, 10, 11, 248, 252, 10, 11, 248, 251, 10, 11, 248, 250, 10, 11, - 248, 249, 10, 11, 248, 248, 10, 11, 248, 247, 10, 11, 248, 246, 10, 11, - 248, 245, 10, 11, 248, 244, 10, 11, 248, 243, 10, 11, 248, 242, 10, 11, - 248, 241, 10, 11, 248, 240, 10, 11, 248, 239, 10, 11, 248, 238, 10, 11, - 248, 237, 10, 11, 248, 236, 10, 11, 248, 235, 10, 11, 248, 234, 10, 11, - 248, 233, 10, 11, 248, 232, 10, 11, 248, 231, 10, 11, 248, 230, 10, 11, - 248, 229, 10, 11, 248, 228, 10, 11, 248, 227, 10, 11, 248, 226, 10, 11, - 248, 225, 10, 11, 248, 224, 10, 11, 248, 223, 10, 11, 248, 222, 10, 11, - 248, 221, 10, 11, 248, 220, 10, 11, 248, 219, 10, 11, 248, 218, 10, 11, - 248, 217, 10, 11, 248, 216, 10, 11, 248, 215, 10, 11, 248, 214, 10, 11, - 248, 213, 10, 11, 248, 212, 10, 11, 248, 211, 10, 11, 248, 210, 10, 11, - 248, 209, 10, 11, 248, 208, 10, 11, 248, 207, 10, 11, 248, 206, 10, 11, - 248, 205, 10, 11, 248, 204, 10, 11, 248, 203, 10, 11, 248, 202, 10, 11, - 248, 201, 10, 11, 248, 200, 10, 11, 248, 199, 10, 11, 248, 198, 10, 11, - 248, 197, 10, 11, 248, 196, 10, 11, 248, 195, 10, 11, 248, 194, 10, 11, - 248, 193, 10, 11, 248, 192, 10, 11, 248, 191, 10, 11, 248, 190, 10, 11, - 248, 189, 10, 11, 248, 188, 10, 11, 248, 187, 10, 11, 248, 186, 10, 11, - 248, 185, 10, 11, 248, 184, 10, 11, 248, 183, 10, 11, 248, 182, 10, 11, - 248, 181, 10, 11, 248, 180, 10, 11, 248, 179, 10, 11, 248, 178, 10, 11, - 248, 177, 10, 11, 248, 176, 10, 11, 248, 175, 10, 11, 248, 174, 10, 11, - 248, 173, 10, 11, 248, 172, 10, 11, 248, 171, 10, 11, 248, 170, 10, 11, - 248, 169, 10, 11, 248, 168, 10, 11, 248, 167, 10, 11, 245, 235, 10, 11, - 245, 234, 10, 11, 245, 233, 10, 11, 245, 232, 10, 11, 245, 231, 10, 11, - 245, 230, 10, 11, 245, 229, 10, 11, 245, 228, 10, 11, 245, 227, 10, 11, - 245, 226, 10, 11, 245, 225, 10, 11, 245, 224, 10, 11, 245, 223, 10, 11, - 245, 222, 10, 11, 245, 221, 10, 11, 245, 220, 10, 11, 245, 219, 10, 11, - 245, 218, 10, 11, 245, 217, 10, 11, 245, 216, 10, 11, 245, 215, 10, 11, - 245, 214, 10, 11, 245, 213, 10, 11, 245, 212, 10, 11, 245, 211, 10, 11, - 245, 210, 10, 11, 245, 209, 10, 11, 245, 208, 10, 11, 245, 207, 10, 11, - 245, 206, 10, 11, 245, 205, 10, 11, 245, 204, 10, 11, 245, 203, 10, 11, - 245, 202, 10, 11, 245, 201, 10, 11, 245, 200, 10, 11, 245, 199, 10, 11, - 245, 198, 10, 11, 245, 197, 10, 11, 245, 196, 10, 11, 245, 195, 10, 11, - 245, 194, 10, 11, 245, 193, 10, 11, 245, 192, 10, 11, 244, 229, 10, 11, - 244, 228, 10, 11, 244, 227, 10, 11, 244, 226, 10, 11, 244, 225, 10, 11, - 244, 224, 10, 11, 244, 223, 10, 11, 244, 222, 10, 11, 244, 221, 10, 11, - 244, 220, 10, 11, 244, 219, 10, 11, 244, 218, 10, 11, 244, 217, 10, 11, - 244, 216, 10, 11, 244, 215, 10, 11, 244, 214, 10, 11, 244, 213, 10, 11, - 244, 212, 10, 11, 244, 211, 10, 11, 244, 210, 10, 11, 244, 209, 10, 11, - 244, 208, 10, 11, 244, 207, 10, 11, 244, 206, 10, 11, 244, 205, 10, 11, - 244, 204, 10, 11, 244, 203, 10, 11, 244, 202, 10, 11, 244, 201, 10, 11, - 244, 200, 10, 11, 244, 199, 10, 11, 244, 198, 10, 11, 244, 197, 10, 11, - 244, 196, 10, 11, 244, 195, 10, 11, 244, 194, 10, 11, 244, 193, 10, 11, - 244, 192, 10, 11, 244, 191, 10, 11, 244, 190, 10, 11, 244, 189, 10, 11, - 244, 188, 10, 11, 244, 187, 10, 11, 244, 186, 10, 11, 244, 185, 10, 11, - 244, 184, 10, 11, 244, 183, 10, 11, 244, 182, 10, 11, 244, 181, 10, 11, - 244, 180, 10, 11, 244, 179, 10, 11, 244, 178, 10, 11, 244, 177, 10, 11, - 244, 176, 10, 11, 244, 175, 10, 11, 244, 174, 10, 11, 244, 173, 10, 11, - 244, 172, 10, 11, 244, 171, 10, 11, 244, 170, 10, 11, 244, 169, 10, 11, - 244, 168, 10, 11, 244, 167, 10, 11, 244, 166, 10, 11, 244, 165, 10, 11, - 243, 176, 10, 11, 243, 175, 10, 11, 243, 174, 10, 11, 243, 173, 10, 11, - 243, 172, 10, 11, 243, 171, 10, 11, 243, 170, 10, 11, 243, 169, 10, 11, - 243, 168, 10, 11, 243, 167, 10, 11, 243, 166, 10, 11, 243, 165, 10, 11, - 243, 164, 10, 11, 243, 163, 10, 11, 243, 162, 10, 11, 243, 161, 10, 11, - 243, 160, 10, 11, 243, 159, 10, 11, 243, 158, 10, 11, 243, 157, 10, 11, - 243, 156, 10, 11, 243, 155, 10, 11, 243, 154, 10, 11, 243, 153, 10, 11, - 243, 152, 10, 11, 243, 151, 10, 11, 243, 150, 10, 11, 243, 149, 10, 11, - 243, 148, 10, 11, 243, 147, 10, 11, 243, 146, 10, 11, 243, 145, 10, 11, - 243, 144, 10, 11, 243, 143, 10, 11, 243, 142, 10, 11, 243, 141, 10, 11, - 243, 140, 10, 11, 243, 139, 10, 11, 243, 138, 10, 11, 243, 137, 10, 11, - 243, 136, 10, 11, 243, 135, 10, 11, 243, 134, 10, 11, 243, 133, 10, 11, - 243, 132, 10, 11, 243, 131, 10, 11, 243, 130, 10, 11, 243, 129, 10, 11, - 243, 128, 10, 11, 243, 127, 10, 11, 243, 126, 10, 11, 243, 125, 10, 11, - 243, 124, 10, 11, 243, 123, 10, 11, 243, 122, 10, 11, 243, 121, 10, 11, - 243, 120, 10, 11, 243, 119, 10, 11, 243, 118, 10, 11, 243, 117, 10, 11, - 243, 116, 10, 11, 243, 115, 10, 11, 243, 114, 10, 11, 243, 113, 10, 11, - 242, 39, 10, 11, 242, 38, 10, 11, 242, 37, 10, 11, 242, 36, 10, 11, 242, - 35, 10, 11, 242, 34, 10, 11, 242, 33, 10, 11, 242, 32, 10, 11, 242, 31, - 10, 11, 240, 130, 10, 11, 240, 129, 10, 11, 240, 128, 10, 11, 240, 127, - 10, 11, 240, 126, 10, 11, 240, 125, 10, 11, 240, 124, 10, 11, 240, 123, - 10, 11, 240, 122, 10, 11, 240, 121, 10, 11, 240, 120, 10, 11, 240, 119, - 10, 11, 240, 118, 10, 11, 240, 117, 10, 11, 240, 116, 10, 11, 240, 115, - 10, 11, 240, 114, 10, 11, 240, 113, 10, 11, 240, 112, 10, 11, 235, 26, - 10, 11, 235, 25, 10, 11, 235, 24, 10, 11, 235, 23, 10, 11, 235, 22, 10, - 11, 235, 21, 10, 11, 235, 20, 10, 11, 235, 19, 10, 11, 233, 168, 10, 11, - 233, 167, 10, 11, 233, 166, 10, 11, 233, 165, 10, 11, 233, 164, 10, 11, - 233, 163, 10, 11, 233, 162, 10, 11, 233, 161, 10, 11, 233, 160, 10, 11, - 233, 159, 10, 11, 232, 109, 10, 11, 232, 108, 10, 11, 232, 107, 10, 11, - 232, 106, 10, 11, 232, 105, 10, 11, 232, 104, 10, 11, 232, 103, 10, 11, - 232, 102, 10, 11, 232, 101, 10, 11, 232, 100, 10, 11, 232, 99, 10, 11, - 232, 98, 10, 11, 232, 97, 10, 11, 232, 96, 10, 11, 232, 95, 10, 11, 232, - 94, 10, 11, 232, 93, 10, 11, 232, 92, 10, 11, 232, 91, 10, 11, 232, 90, - 10, 11, 232, 89, 10, 11, 232, 88, 10, 11, 232, 87, 10, 11, 232, 86, 10, - 11, 232, 85, 10, 11, 232, 84, 10, 11, 232, 83, 10, 11, 232, 82, 10, 11, - 232, 81, 10, 11, 232, 80, 10, 11, 232, 79, 10, 11, 232, 78, 10, 11, 232, - 77, 10, 11, 232, 76, 10, 11, 232, 75, 10, 11, 232, 74, 10, 11, 232, 73, - 10, 11, 232, 72, 10, 11, 232, 71, 10, 11, 232, 70, 10, 11, 232, 69, 10, - 11, 232, 68, 10, 11, 232, 67, 10, 11, 232, 66, 10, 11, 232, 65, 10, 11, - 232, 64, 10, 11, 232, 63, 10, 11, 232, 62, 10, 11, 232, 61, 10, 11, 232, - 60, 10, 11, 232, 59, 10, 11, 232, 58, 10, 11, 232, 57, 10, 11, 232, 56, - 10, 11, 232, 55, 10, 11, 232, 54, 10, 11, 232, 53, 10, 11, 232, 52, 10, - 11, 232, 51, 10, 11, 232, 50, 10, 11, 232, 49, 10, 11, 232, 48, 10, 11, - 232, 47, 10, 11, 232, 46, 10, 11, 232, 45, 10, 11, 232, 44, 10, 11, 230, - 95, 10, 11, 230, 94, 10, 11, 230, 93, 10, 11, 230, 92, 10, 11, 230, 91, - 10, 11, 230, 90, 10, 11, 230, 89, 10, 11, 230, 88, 10, 11, 230, 87, 10, - 11, 230, 86, 10, 11, 230, 85, 10, 11, 230, 84, 10, 11, 230, 83, 10, 11, - 230, 82, 10, 11, 230, 81, 10, 11, 230, 80, 10, 11, 230, 79, 10, 11, 230, - 78, 10, 11, 230, 77, 10, 11, 230, 76, 10, 11, 230, 75, 10, 11, 230, 74, - 10, 11, 230, 73, 10, 11, 230, 72, 10, 11, 230, 71, 10, 11, 230, 70, 10, - 11, 230, 69, 10, 11, 230, 68, 10, 11, 230, 67, 10, 11, 230, 66, 10, 11, - 230, 65, 10, 11, 230, 64, 10, 11, 230, 63, 10, 11, 230, 62, 10, 11, 230, - 61, 10, 11, 230, 60, 10, 11, 230, 59, 10, 11, 230, 58, 10, 11, 230, 57, - 10, 11, 230, 56, 10, 11, 230, 55, 10, 11, 230, 54, 10, 11, 230, 53, 10, - 11, 230, 52, 10, 11, 230, 51, 10, 11, 230, 50, 10, 11, 230, 49, 10, 11, - 230, 48, 10, 11, 230, 47, 10, 11, 228, 222, 10, 11, 228, 221, 10, 11, - 228, 220, 10, 11, 228, 219, 10, 11, 228, 218, 10, 11, 228, 217, 10, 11, - 228, 216, 10, 11, 228, 215, 10, 11, 228, 214, 10, 11, 228, 213, 10, 11, - 228, 212, 10, 11, 228, 211, 10, 11, 228, 210, 10, 11, 228, 209, 10, 11, - 228, 208, 10, 11, 228, 207, 10, 11, 228, 206, 10, 11, 228, 205, 10, 11, - 228, 204, 10, 11, 228, 203, 10, 11, 228, 202, 10, 11, 228, 201, 10, 11, - 228, 91, 10, 11, 228, 90, 10, 11, 228, 89, 10, 11, 228, 88, 10, 11, 228, - 87, 10, 11, 228, 86, 10, 11, 228, 85, 10, 11, 228, 84, 10, 11, 228, 83, - 10, 11, 228, 82, 10, 11, 228, 81, 10, 11, 228, 80, 10, 11, 228, 79, 10, - 11, 228, 78, 10, 11, 228, 77, 10, 11, 228, 76, 10, 11, 228, 75, 10, 11, - 228, 74, 10, 11, 228, 73, 10, 11, 228, 72, 10, 11, 228, 71, 10, 11, 228, - 70, 10, 11, 228, 69, 10, 11, 228, 68, 10, 11, 228, 67, 10, 11, 228, 66, + 0, 219, 225, 245, 119, 79, 224, 178, 79, 51, 53, 247, 207, 53, 226, 93, + 53, 254, 162, 254, 97, 43, 226, 168, 47, 226, 168, 254, 3, 95, 53, 250, + 23, 241, 20, 244, 64, 219, 83, 219, 250, 21, 212, 79, 21, 118, 21, 112, + 21, 170, 21, 167, 21, 185, 21, 192, 21, 200, 21, 198, 21, 203, 250, 30, + 221, 93, 233, 137, 53, 245, 182, 53, 242, 228, 53, 224, 193, 79, 250, 22, + 253, 249, 7, 6, 1, 63, 7, 6, 1, 253, 201, 7, 6, 1, 251, 121, 7, 6, 1, + 249, 125, 7, 6, 1, 77, 7, 6, 1, 245, 95, 7, 6, 1, 244, 41, 7, 6, 1, 242, + 162, 7, 6, 1, 75, 7, 6, 1, 236, 3, 7, 6, 1, 235, 141, 7, 6, 1, 155, 7, 6, + 1, 184, 7, 6, 1, 206, 7, 6, 1, 78, 7, 6, 1, 227, 11, 7, 6, 1, 225, 19, 7, + 6, 1, 152, 7, 6, 1, 196, 7, 6, 1, 218, 113, 7, 6, 1, 72, 7, 6, 1, 211, + 211, 7, 6, 1, 214, 85, 7, 6, 1, 213, 169, 7, 6, 1, 213, 108, 7, 6, 1, + 212, 152, 43, 42, 125, 223, 237, 219, 250, 47, 42, 125, 250, 91, 255, 46, + 117, 233, 83, 242, 234, 255, 46, 7, 4, 1, 63, 7, 4, 1, 253, 201, 7, 4, 1, + 251, 121, 7, 4, 1, 249, 125, 7, 4, 1, 77, 7, 4, 1, 245, 95, 7, 4, 1, 244, + 41, 7, 4, 1, 242, 162, 7, 4, 1, 75, 7, 4, 1, 236, 3, 7, 4, 1, 235, 141, + 7, 4, 1, 155, 7, 4, 1, 184, 7, 4, 1, 206, 7, 4, 1, 78, 7, 4, 1, 227, 11, + 7, 4, 1, 225, 19, 7, 4, 1, 152, 7, 4, 1, 196, 7, 4, 1, 218, 113, 7, 4, 1, + 72, 7, 4, 1, 211, 211, 7, 4, 1, 214, 85, 7, 4, 1, 213, 169, 7, 4, 1, 213, + 108, 7, 4, 1, 212, 152, 43, 249, 163, 125, 66, 233, 83, 47, 249, 163, + 125, 177, 228, 227, 219, 225, 236, 52, 245, 119, 79, 250, 233, 53, 225, + 144, 53, 249, 162, 53, 213, 32, 53, 251, 188, 134, 222, 115, 53, 248, 74, + 249, 225, 53, 244, 225, 227, 59, 236, 96, 233, 164, 52, 254, 146, 224, + 178, 79, 228, 206, 53, 219, 255, 241, 21, 224, 30, 53, 232, 110, 248, + 143, 53, 225, 191, 53, 218, 237, 112, 218, 237, 170, 255, 36, 255, 46, + 231, 111, 53, 225, 236, 53, 231, 107, 247, 195, 250, 240, 218, 237, 118, + 232, 26, 227, 59, 236, 96, 223, 178, 52, 254, 146, 224, 178, 79, 214, + 101, 244, 92, 124, 224, 201, 214, 101, 244, 92, 124, 242, 129, 214, 101, + 244, 92, 137, 224, 199, 236, 52, 224, 193, 79, 7, 6, 1, 111, 2, 209, 7, + 6, 1, 111, 2, 138, 7, 6, 1, 111, 2, 250, 90, 7, 6, 1, 111, 2, 177, 7, 6, + 1, 111, 2, 248, 74, 7, 6, 1, 111, 2, 223, 165, 50, 7, 6, 1, 255, 20, 7, + 6, 1, 251, 122, 2, 250, 240, 7, 6, 1, 154, 2, 209, 7, 6, 1, 154, 2, 138, + 7, 6, 1, 154, 2, 250, 90, 7, 6, 1, 154, 2, 248, 74, 7, 6, 1, 241, 7, 2, + 209, 7, 6, 1, 241, 7, 2, 138, 7, 6, 1, 241, 7, 2, 250, 90, 7, 6, 1, 241, + 7, 2, 248, 74, 7, 6, 1, 245, 146, 7, 6, 1, 230, 167, 2, 177, 7, 6, 1, + 141, 2, 209, 7, 6, 1, 141, 2, 138, 7, 6, 1, 141, 2, 250, 90, 7, 6, 1, + 141, 2, 177, 7, 6, 1, 141, 2, 248, 74, 230, 224, 53, 7, 6, 1, 141, 2, 91, + 7, 6, 1, 103, 2, 209, 7, 6, 1, 103, 2, 138, 7, 6, 1, 103, 2, 250, 90, 7, + 6, 1, 103, 2, 248, 74, 7, 6, 1, 213, 109, 2, 138, 7, 6, 1, 217, 117, 7, + 4, 1, 221, 21, 196, 7, 4, 1, 111, 2, 209, 7, 4, 1, 111, 2, 138, 7, 4, 1, + 111, 2, 250, 90, 7, 4, 1, 111, 2, 177, 7, 4, 1, 111, 2, 248, 74, 7, 4, 1, + 111, 2, 223, 165, 50, 7, 4, 1, 255, 20, 7, 4, 1, 251, 122, 2, 250, 240, + 7, 4, 1, 154, 2, 209, 7, 4, 1, 154, 2, 138, 7, 4, 1, 154, 2, 250, 90, 7, + 4, 1, 154, 2, 248, 74, 7, 4, 1, 241, 7, 2, 209, 7, 4, 1, 241, 7, 2, 138, + 7, 4, 1, 241, 7, 2, 250, 90, 7, 4, 1, 241, 7, 2, 248, 74, 7, 4, 1, 245, + 146, 7, 4, 1, 230, 167, 2, 177, 7, 4, 1, 141, 2, 209, 7, 4, 1, 141, 2, + 138, 7, 4, 1, 141, 2, 250, 90, 7, 4, 1, 141, 2, 177, 7, 4, 1, 141, 2, + 248, 74, 247, 242, 53, 7, 4, 1, 141, 2, 91, 7, 4, 1, 103, 2, 209, 7, 4, + 1, 103, 2, 138, 7, 4, 1, 103, 2, 250, 90, 7, 4, 1, 103, 2, 248, 74, 7, 4, + 1, 213, 109, 2, 138, 7, 4, 1, 217, 117, 7, 4, 1, 213, 109, 2, 248, 74, 7, + 6, 1, 111, 2, 232, 110, 7, 4, 1, 111, 2, 232, 110, 7, 6, 1, 111, 2, 251, + 199, 7, 4, 1, 111, 2, 251, 199, 7, 6, 1, 111, 2, 227, 127, 7, 4, 1, 111, + 2, 227, 127, 7, 6, 1, 251, 122, 2, 138, 7, 4, 1, 251, 122, 2, 138, 7, 6, + 1, 251, 122, 2, 250, 90, 7, 4, 1, 251, 122, 2, 250, 90, 7, 6, 1, 251, + 122, 2, 62, 50, 7, 4, 1, 251, 122, 2, 62, 50, 7, 6, 1, 251, 122, 2, 251, + 34, 7, 4, 1, 251, 122, 2, 251, 34, 7, 6, 1, 249, 126, 2, 251, 34, 7, 4, + 1, 249, 126, 2, 251, 34, 7, 6, 1, 249, 126, 2, 91, 7, 4, 1, 249, 126, 2, + 91, 7, 6, 1, 154, 2, 232, 110, 7, 4, 1, 154, 2, 232, 110, 7, 6, 1, 154, + 2, 251, 199, 7, 4, 1, 154, 2, 251, 199, 7, 6, 1, 154, 2, 62, 50, 7, 4, 1, + 154, 2, 62, 50, 7, 6, 1, 154, 2, 227, 127, 7, 4, 1, 154, 2, 227, 127, 7, + 6, 1, 154, 2, 251, 34, 7, 4, 1, 154, 2, 251, 34, 7, 6, 1, 244, 42, 2, + 250, 90, 7, 4, 1, 244, 42, 2, 250, 90, 7, 6, 1, 244, 42, 2, 251, 199, 7, + 4, 1, 244, 42, 2, 251, 199, 7, 6, 1, 244, 42, 2, 62, 50, 7, 4, 1, 244, + 42, 2, 62, 50, 7, 6, 1, 244, 42, 2, 250, 240, 7, 4, 1, 244, 42, 2, 250, + 240, 7, 6, 1, 242, 163, 2, 250, 90, 7, 4, 1, 242, 163, 2, 250, 90, 7, 6, + 1, 242, 163, 2, 91, 7, 4, 1, 242, 163, 2, 91, 7, 6, 1, 241, 7, 2, 177, 7, + 4, 1, 241, 7, 2, 177, 7, 6, 1, 241, 7, 2, 232, 110, 7, 4, 1, 241, 7, 2, + 232, 110, 7, 6, 1, 241, 7, 2, 251, 199, 7, 4, 1, 241, 7, 2, 251, 199, 7, + 6, 1, 241, 7, 2, 227, 127, 7, 4, 1, 241, 7, 2, 227, 127, 7, 6, 1, 241, 7, + 2, 62, 50, 7, 4, 1, 247, 194, 75, 7, 6, 26, 236, 143, 7, 4, 26, 236, 143, + 7, 6, 1, 236, 4, 2, 250, 90, 7, 4, 1, 236, 4, 2, 250, 90, 7, 6, 1, 235, + 142, 2, 250, 240, 7, 4, 1, 235, 142, 2, 250, 240, 7, 4, 1, 234, 103, 7, + 6, 1, 234, 13, 2, 138, 7, 4, 1, 234, 13, 2, 138, 7, 6, 1, 234, 13, 2, + 250, 240, 7, 4, 1, 234, 13, 2, 250, 240, 7, 6, 1, 234, 13, 2, 251, 34, 7, + 4, 1, 234, 13, 2, 251, 34, 7, 6, 1, 234, 13, 2, 231, 107, 247, 195, 7, 4, + 1, 234, 13, 2, 231, 107, 247, 195, 7, 6, 1, 234, 13, 2, 91, 7, 4, 1, 234, + 13, 2, 91, 7, 6, 1, 230, 167, 2, 138, 7, 4, 1, 230, 167, 2, 138, 7, 6, 1, + 230, 167, 2, 250, 240, 7, 4, 1, 230, 167, 2, 250, 240, 7, 6, 1, 230, 167, + 2, 251, 34, 7, 4, 1, 230, 167, 2, 251, 34, 7, 4, 1, 230, 167, 225, 120, + 251, 132, 254, 97, 7, 6, 1, 245, 217, 7, 4, 1, 245, 217, 7, 6, 1, 141, 2, + 232, 110, 7, 4, 1, 141, 2, 232, 110, 7, 6, 1, 141, 2, 251, 199, 7, 4, 1, + 141, 2, 251, 199, 7, 6, 1, 141, 2, 52, 138, 7, 4, 1, 141, 2, 52, 138, 7, + 6, 26, 227, 136, 7, 4, 26, 227, 136, 7, 6, 1, 224, 148, 2, 138, 7, 4, 1, + 224, 148, 2, 138, 7, 6, 1, 224, 148, 2, 250, 240, 7, 4, 1, 224, 148, 2, + 250, 240, 7, 6, 1, 224, 148, 2, 251, 34, 7, 4, 1, 224, 148, 2, 251, 34, + 7, 6, 1, 223, 29, 2, 138, 7, 4, 1, 223, 29, 2, 138, 7, 6, 1, 223, 29, 2, + 250, 90, 7, 4, 1, 223, 29, 2, 250, 90, 7, 6, 1, 223, 29, 2, 250, 240, 7, + 4, 1, 223, 29, 2, 250, 240, 7, 6, 1, 223, 29, 2, 251, 34, 7, 4, 1, 223, + 29, 2, 251, 34, 7, 6, 1, 218, 114, 2, 250, 240, 7, 4, 1, 218, 114, 2, + 250, 240, 7, 6, 1, 218, 114, 2, 251, 34, 7, 4, 1, 218, 114, 2, 251, 34, + 7, 6, 1, 218, 114, 2, 91, 7, 4, 1, 218, 114, 2, 91, 7, 6, 1, 103, 2, 177, + 7, 4, 1, 103, 2, 177, 7, 6, 1, 103, 2, 232, 110, 7, 4, 1, 103, 2, 232, + 110, 7, 6, 1, 103, 2, 251, 199, 7, 4, 1, 103, 2, 251, 199, 7, 6, 1, 103, + 2, 223, 165, 50, 7, 4, 1, 103, 2, 223, 165, 50, 7, 6, 1, 103, 2, 52, 138, + 7, 4, 1, 103, 2, 52, 138, 7, 6, 1, 103, 2, 227, 127, 7, 4, 1, 103, 2, + 227, 127, 7, 6, 1, 214, 86, 2, 250, 90, 7, 4, 1, 214, 86, 2, 250, 90, 7, + 6, 1, 213, 109, 2, 250, 90, 7, 4, 1, 213, 109, 2, 250, 90, 7, 6, 1, 213, + 109, 2, 248, 74, 7, 6, 1, 212, 153, 2, 138, 7, 4, 1, 212, 153, 2, 138, 7, + 6, 1, 212, 153, 2, 62, 50, 7, 4, 1, 212, 153, 2, 62, 50, 7, 6, 1, 212, + 153, 2, 251, 34, 7, 4, 1, 212, 153, 2, 251, 34, 7, 4, 1, 187, 196, 7, 4, + 1, 57, 2, 91, 7, 6, 1, 57, 2, 102, 7, 6, 1, 57, 2, 216, 237, 7, 4, 1, 57, + 2, 216, 237, 7, 6, 1, 161, 192, 7, 4, 1, 161, 192, 7, 6, 1, 210, 78, 7, + 6, 1, 251, 122, 2, 102, 7, 4, 1, 251, 122, 2, 102, 7, 6, 1, 254, 252, + 249, 125, 7, 6, 1, 249, 126, 2, 102, 7, 6, 1, 249, 126, 2, 216, 237, 7, + 4, 1, 249, 126, 2, 216, 237, 7, 4, 1, 216, 66, 248, 126, 7, 6, 1, 223, + 236, 77, 7, 6, 1, 222, 136, 7, 6, 1, 210, 77, 7, 6, 1, 245, 96, 2, 102, + 7, 4, 1, 245, 96, 2, 102, 7, 6, 1, 244, 42, 2, 102, 7, 6, 1, 243, 203, 7, + 4, 1, 241, 54, 7, 6, 1, 236, 44, 7, 6, 1, 241, 7, 2, 91, 7, 6, 1, 235, + 142, 2, 102, 7, 4, 1, 235, 142, 2, 102, 7, 4, 1, 234, 13, 2, 134, 7, 4, + 1, 233, 222, 2, 91, 7, 6, 1, 216, 66, 184, 7, 6, 1, 230, 167, 2, 43, 102, + 7, 4, 1, 230, 167, 2, 187, 47, 233, 158, 7, 6, 1, 141, 2, 231, 107, 177, + 7, 6, 1, 141, 2, 241, 97, 7, 4, 1, 141, 2, 241, 97, 7, 6, 1, 227, 122, 7, + 4, 1, 227, 122, 7, 6, 1, 227, 12, 2, 102, 7, 4, 1, 227, 12, 2, 102, 7, 1, + 212, 206, 7, 6, 1, 161, 112, 7, 4, 1, 161, 112, 7, 6, 1, 245, 161, 7, 1, + 223, 236, 245, 162, 232, 251, 7, 4, 1, 218, 114, 2, 226, 230, 102, 7, 6, + 1, 218, 114, 2, 102, 7, 4, 1, 218, 114, 2, 102, 7, 6, 1, 218, 114, 2, + 223, 241, 102, 7, 6, 1, 103, 2, 241, 97, 7, 4, 1, 103, 2, 241, 97, 7, 6, + 1, 215, 134, 7, 6, 1, 215, 86, 2, 102, 7, 6, 1, 213, 109, 2, 102, 7, 4, + 1, 213, 109, 2, 102, 7, 6, 1, 212, 153, 2, 91, 7, 4, 1, 212, 153, 2, 91, + 7, 6, 1, 245, 97, 7, 6, 1, 245, 98, 223, 235, 7, 4, 1, 245, 98, 223, 235, + 7, 4, 1, 245, 98, 2, 218, 40, 7, 1, 119, 2, 91, 7, 6, 1, 161, 185, 7, 4, + 1, 161, 185, 7, 1, 236, 52, 243, 20, 219, 84, 2, 91, 7, 1, 213, 172, 7, + 1, 248, 119, 250, 71, 7, 1, 233, 199, 250, 71, 7, 1, 254, 173, 250, 71, + 7, 1, 223, 241, 250, 71, 7, 6, 1, 246, 116, 2, 251, 34, 7, 6, 1, 249, + 126, 2, 4, 1, 212, 153, 2, 251, 34, 7, 4, 1, 246, 116, 2, 251, 34, 7, 6, + 1, 233, 58, 7, 6, 1, 234, 13, 2, 4, 1, 236, 3, 7, 4, 1, 233, 58, 7, 6, 1, + 229, 81, 7, 6, 1, 230, 167, 2, 4, 1, 236, 3, 7, 4, 1, 229, 81, 7, 6, 1, + 111, 2, 251, 34, 7, 4, 1, 111, 2, 251, 34, 7, 6, 1, 241, 7, 2, 251, 34, + 7, 4, 1, 241, 7, 2, 251, 34, 7, 6, 1, 141, 2, 251, 34, 7, 4, 1, 141, 2, + 251, 34, 7, 6, 1, 103, 2, 251, 34, 7, 4, 1, 103, 2, 251, 34, 7, 6, 1, + 103, 2, 248, 75, 22, 232, 110, 7, 4, 1, 103, 2, 248, 75, 22, 232, 110, 7, + 6, 1, 103, 2, 248, 75, 22, 138, 7, 4, 1, 103, 2, 248, 75, 22, 138, 7, 6, + 1, 103, 2, 248, 75, 22, 251, 34, 7, 4, 1, 103, 2, 248, 75, 22, 251, 34, + 7, 6, 1, 103, 2, 248, 75, 22, 209, 7, 4, 1, 103, 2, 248, 75, 22, 209, 7, + 4, 1, 216, 66, 77, 7, 6, 1, 111, 2, 248, 75, 22, 232, 110, 7, 4, 1, 111, + 2, 248, 75, 22, 232, 110, 7, 6, 1, 111, 2, 62, 74, 22, 232, 110, 7, 4, 1, + 111, 2, 62, 74, 22, 232, 110, 7, 6, 1, 255, 21, 2, 232, 110, 7, 4, 1, + 255, 21, 2, 232, 110, 7, 6, 1, 244, 42, 2, 91, 7, 4, 1, 244, 42, 2, 91, + 7, 6, 1, 244, 42, 2, 251, 34, 7, 4, 1, 244, 42, 2, 251, 34, 7, 6, 1, 235, + 142, 2, 251, 34, 7, 4, 1, 235, 142, 2, 251, 34, 7, 6, 1, 141, 2, 227, + 127, 7, 4, 1, 141, 2, 227, 127, 7, 6, 1, 141, 2, 227, 128, 22, 232, 110, + 7, 4, 1, 141, 2, 227, 128, 22, 232, 110, 7, 6, 1, 245, 98, 2, 251, 34, 7, + 4, 1, 245, 98, 2, 251, 34, 7, 4, 1, 236, 4, 2, 251, 34, 7, 6, 1, 246, + 115, 7, 6, 1, 249, 126, 2, 4, 1, 212, 152, 7, 4, 1, 246, 115, 7, 6, 1, + 244, 42, 2, 138, 7, 4, 1, 244, 42, 2, 138, 7, 6, 1, 241, 52, 7, 6, 1, + 213, 172, 7, 6, 1, 230, 167, 2, 209, 7, 4, 1, 230, 167, 2, 209, 7, 6, 1, + 111, 2, 223, 165, 74, 22, 138, 7, 4, 1, 111, 2, 223, 165, 74, 22, 138, 7, + 6, 1, 255, 21, 2, 138, 7, 4, 1, 255, 21, 2, 138, 7, 6, 1, 141, 2, 219, + 59, 22, 138, 7, 4, 1, 141, 2, 219, 59, 22, 138, 7, 6, 1, 111, 2, 52, 209, + 7, 4, 1, 111, 2, 52, 209, 7, 6, 1, 111, 2, 236, 52, 251, 199, 7, 4, 1, + 111, 2, 236, 52, 251, 199, 7, 6, 1, 154, 2, 52, 209, 7, 4, 1, 154, 2, 52, + 209, 7, 6, 1, 154, 2, 236, 52, 251, 199, 7, 4, 1, 154, 2, 236, 52, 251, + 199, 7, 6, 1, 241, 7, 2, 52, 209, 7, 4, 1, 241, 7, 2, 52, 209, 7, 6, 1, + 241, 7, 2, 236, 52, 251, 199, 7, 4, 1, 241, 7, 2, 236, 52, 251, 199, 7, + 6, 1, 141, 2, 52, 209, 7, 4, 1, 141, 2, 52, 209, 7, 6, 1, 141, 2, 236, + 52, 251, 199, 7, 4, 1, 141, 2, 236, 52, 251, 199, 7, 6, 1, 224, 148, 2, + 52, 209, 7, 4, 1, 224, 148, 2, 52, 209, 7, 6, 1, 224, 148, 2, 236, 52, + 251, 199, 7, 4, 1, 224, 148, 2, 236, 52, 251, 199, 7, 6, 1, 103, 2, 52, + 209, 7, 4, 1, 103, 2, 52, 209, 7, 6, 1, 103, 2, 236, 52, 251, 199, 7, 4, + 1, 103, 2, 236, 52, 251, 199, 7, 6, 1, 223, 29, 2, 250, 24, 55, 7, 4, 1, + 223, 29, 2, 250, 24, 55, 7, 6, 1, 218, 114, 2, 250, 24, 55, 7, 4, 1, 218, + 114, 2, 250, 24, 55, 7, 6, 1, 212, 223, 7, 4, 1, 212, 223, 7, 6, 1, 242, + 163, 2, 251, 34, 7, 4, 1, 242, 163, 2, 251, 34, 7, 6, 1, 230, 167, 2, + 187, 47, 233, 158, 7, 4, 1, 249, 126, 2, 249, 164, 7, 6, 1, 227, 40, 7, + 4, 1, 227, 40, 7, 6, 1, 212, 153, 2, 102, 7, 4, 1, 212, 153, 2, 102, 7, + 6, 1, 111, 2, 62, 50, 7, 4, 1, 111, 2, 62, 50, 7, 6, 1, 154, 2, 250, 240, + 7, 4, 1, 154, 2, 250, 240, 7, 6, 1, 141, 2, 248, 75, 22, 232, 110, 7, 4, + 1, 141, 2, 248, 75, 22, 232, 110, 7, 6, 1, 141, 2, 217, 56, 22, 232, 110, + 7, 4, 1, 141, 2, 217, 56, 22, 232, 110, 7, 6, 1, 141, 2, 62, 50, 7, 4, 1, + 141, 2, 62, 50, 7, 6, 1, 141, 2, 62, 74, 22, 232, 110, 7, 4, 1, 141, 2, + 62, 74, 22, 232, 110, 7, 6, 1, 213, 109, 2, 232, 110, 7, 4, 1, 213, 109, + 2, 232, 110, 7, 4, 1, 234, 13, 2, 249, 164, 7, 4, 1, 230, 167, 2, 249, + 164, 7, 4, 1, 218, 114, 2, 249, 164, 7, 4, 1, 247, 194, 236, 3, 7, 4, 1, + 248, 210, 248, 37, 7, 4, 1, 224, 211, 248, 37, 7, 6, 1, 111, 2, 91, 7, 6, + 1, 251, 122, 2, 91, 7, 4, 1, 251, 122, 2, 91, 7, 6, 1, 234, 13, 2, 134, + 7, 6, 1, 218, 114, 2, 248, 72, 91, 7, 4, 1, 223, 29, 2, 218, 209, 218, + 40, 7, 4, 1, 212, 153, 2, 218, 209, 218, 40, 7, 6, 1, 243, 20, 219, 83, + 7, 4, 1, 243, 20, 219, 83, 7, 6, 1, 57, 2, 91, 7, 6, 1, 103, 134, 7, 6, + 1, 216, 66, 211, 211, 7, 6, 1, 154, 2, 91, 7, 4, 1, 154, 2, 91, 7, 6, 1, + 236, 4, 2, 91, 7, 4, 1, 236, 4, 2, 91, 7, 6, 1, 4, 225, 20, 2, 241, 157, + 218, 40, 7, 4, 1, 225, 20, 2, 241, 157, 218, 40, 7, 6, 1, 224, 148, 2, + 91, 7, 4, 1, 224, 148, 2, 91, 7, 6, 1, 213, 109, 2, 91, 7, 4, 1, 213, + 109, 2, 91, 7, 4, 1, 216, 66, 63, 7, 4, 1, 254, 179, 7, 4, 1, 216, 66, + 254, 179, 7, 4, 1, 57, 2, 102, 7, 4, 1, 210, 78, 7, 4, 1, 251, 122, 2, + 249, 164, 7, 4, 1, 249, 126, 2, 218, 40, 7, 4, 1, 249, 126, 2, 102, 7, 4, + 1, 223, 236, 77, 7, 4, 1, 222, 136, 7, 4, 1, 222, 137, 2, 102, 7, 4, 1, + 210, 77, 7, 4, 1, 223, 236, 210, 77, 7, 4, 1, 223, 236, 210, 154, 2, 102, + 7, 4, 1, 250, 60, 223, 236, 210, 77, 7, 4, 1, 247, 194, 236, 4, 2, 91, 7, + 4, 1, 244, 42, 2, 102, 7, 4, 1, 115, 244, 41, 7, 1, 4, 6, 244, 41, 7, 4, + 1, 243, 203, 7, 4, 1, 224, 78, 241, 97, 7, 4, 1, 216, 66, 242, 162, 7, 4, + 1, 242, 163, 2, 102, 7, 4, 1, 242, 55, 2, 102, 7, 4, 1, 241, 7, 2, 91, 7, + 4, 1, 236, 44, 7, 1, 4, 6, 75, 7, 4, 1, 234, 13, 2, 231, 107, 177, 7, 4, + 1, 234, 13, 2, 252, 88, 7, 4, 1, 234, 13, 2, 223, 241, 102, 7, 4, 1, 233, + 125, 7, 4, 1, 216, 66, 184, 7, 4, 1, 216, 66, 232, 183, 2, 187, 233, 158, + 7, 4, 1, 232, 183, 2, 102, 7, 4, 1, 230, 167, 2, 43, 102, 7, 4, 1, 230, + 167, 2, 223, 241, 102, 7, 1, 4, 6, 206, 7, 4, 1, 252, 180, 78, 7, 1, 4, + 6, 227, 136, 7, 4, 1, 250, 60, 227, 104, 7, 4, 1, 226, 45, 7, 4, 1, 216, + 66, 152, 7, 4, 1, 216, 66, 224, 148, 2, 187, 233, 158, 7, 4, 1, 216, 66, + 224, 148, 2, 102, 7, 4, 1, 224, 148, 2, 187, 233, 158, 7, 4, 1, 224, 148, + 2, 218, 40, 7, 4, 1, 224, 148, 2, 244, 176, 7, 4, 1, 223, 236, 224, 148, + 2, 244, 176, 7, 1, 4, 6, 152, 7, 1, 4, 6, 236, 52, 152, 7, 4, 1, 223, 29, + 2, 102, 7, 4, 1, 245, 161, 7, 4, 1, 247, 194, 236, 4, 2, 219, 59, 22, + 102, 7, 4, 1, 219, 182, 223, 236, 245, 161, 7, 4, 1, 245, 162, 2, 249, + 164, 7, 4, 1, 216, 66, 218, 113, 7, 4, 1, 218, 114, 2, 223, 241, 102, 7, + 4, 1, 103, 134, 7, 4, 1, 215, 134, 7, 4, 1, 215, 86, 2, 102, 7, 4, 1, + 216, 66, 211, 211, 7, 4, 1, 216, 66, 214, 85, 7, 4, 1, 216, 66, 213, 108, + 7, 1, 4, 6, 213, 108, 7, 4, 1, 212, 153, 2, 223, 241, 102, 7, 4, 1, 212, + 153, 2, 249, 164, 7, 4, 1, 245, 97, 7, 4, 1, 245, 98, 2, 249, 164, 7, 1, + 243, 20, 219, 83, 7, 1, 226, 51, 214, 120, 244, 83, 7, 1, 236, 52, 243, + 20, 219, 83, 7, 1, 219, 64, 251, 121, 7, 1, 252, 38, 250, 71, 7, 1, 4, 6, + 253, 201, 7, 4, 1, 250, 60, 210, 77, 7, 1, 4, 6, 244, 42, 2, 102, 7, 1, + 4, 6, 242, 162, 7, 4, 1, 236, 4, 2, 249, 190, 7, 4, 1, 216, 66, 235, 141, + 7, 1, 4, 6, 155, 7, 4, 1, 225, 20, 2, 102, 7, 1, 243, 20, 219, 84, 2, 91, + 7, 1, 223, 236, 243, 20, 219, 84, 2, 91, 7, 4, 1, 246, 116, 248, 37, 7, + 4, 1, 248, 98, 248, 37, 7, 4, 1, 246, 116, 248, 38, 2, 249, 164, 7, 4, 1, + 216, 156, 248, 37, 7, 4, 1, 217, 201, 248, 37, 7, 4, 1, 217, 249, 248, + 38, 2, 249, 164, 7, 4, 1, 244, 223, 248, 37, 7, 4, 1, 232, 232, 248, 37, + 7, 4, 1, 232, 184, 248, 37, 7, 1, 252, 38, 226, 92, 7, 1, 252, 46, 226, + 92, 7, 4, 1, 216, 66, 242, 163, 2, 244, 176, 7, 4, 1, 216, 66, 242, 163, + 2, 244, 177, 22, 218, 40, 59, 1, 4, 242, 162, 59, 1, 4, 242, 163, 2, 102, + 59, 1, 4, 236, 3, 59, 1, 4, 152, 59, 1, 4, 216, 66, 152, 59, 1, 4, 216, + 66, 224, 148, 2, 102, 59, 1, 4, 6, 236, 52, 152, 59, 1, 4, 214, 85, 59, + 1, 4, 213, 108, 59, 1, 225, 107, 59, 1, 52, 225, 107, 59, 1, 216, 66, + 250, 23, 59, 1, 254, 97, 59, 1, 223, 236, 250, 23, 59, 1, 47, 157, 223, + 164, 59, 1, 43, 157, 223, 164, 59, 1, 243, 20, 219, 83, 59, 1, 223, 236, + 243, 20, 219, 83, 59, 1, 43, 254, 35, 59, 1, 47, 254, 35, 59, 1, 116, + 254, 35, 59, 1, 121, 254, 35, 59, 1, 250, 91, 255, 46, 251, 34, 59, 1, + 66, 233, 83, 59, 1, 232, 110, 59, 1, 255, 36, 255, 46, 59, 1, 242, 234, + 255, 46, 59, 1, 117, 66, 233, 83, 59, 1, 117, 232, 110, 59, 1, 117, 242, + 234, 255, 46, 59, 1, 117, 255, 36, 255, 46, 59, 1, 216, 193, 250, 30, 59, + 1, 157, 216, 193, 250, 30, 59, 1, 250, 230, 47, 157, 223, 164, 59, 1, + 250, 230, 43, 157, 223, 164, 59, 1, 116, 218, 50, 59, 1, 121, 218, 50, + 59, 1, 95, 53, 59, 1, 231, 65, 53, 251, 199, 62, 50, 223, 165, 50, 227, + 127, 4, 177, 52, 255, 36, 255, 46, 59, 1, 223, 223, 102, 59, 1, 249, 194, + 255, 46, 59, 1, 4, 243, 203, 59, 1, 4, 155, 59, 1, 4, 196, 59, 1, 4, 213, + 169, 59, 1, 4, 223, 236, 243, 20, 219, 83, 59, 1, 245, 109, 161, 134, 59, + 1, 127, 161, 134, 59, 1, 231, 108, 161, 134, 59, 1, 117, 161, 134, 59, 1, + 245, 108, 161, 134, 59, 1, 212, 246, 248, 116, 161, 79, 59, 1, 213, 61, + 248, 116, 161, 79, 59, 1, 214, 118, 59, 1, 215, 162, 59, 1, 52, 254, 97, + 59, 1, 117, 121, 254, 35, 59, 1, 117, 116, 254, 35, 59, 1, 117, 43, 254, + 35, 59, 1, 117, 47, 254, 35, 59, 1, 117, 223, 164, 59, 1, 231, 107, 242, + 234, 255, 46, 59, 1, 231, 107, 52, 242, 234, 255, 46, 59, 1, 231, 107, + 52, 255, 36, 255, 46, 59, 1, 117, 177, 59, 1, 224, 83, 250, 30, 59, 1, + 252, 104, 127, 216, 254, 59, 1, 245, 222, 127, 216, 254, 59, 1, 252, 104, + 117, 216, 254, 59, 1, 245, 222, 117, 216, 254, 59, 1, 220, 255, 59, 1, + 210, 220, 255, 59, 1, 117, 43, 71, 38, 242, 234, 255, 46, 38, 255, 36, + 255, 46, 38, 250, 91, 255, 46, 38, 177, 38, 232, 110, 38, 227, 25, 38, + 251, 199, 38, 62, 50, 38, 248, 74, 38, 241, 157, 50, 38, 223, 165, 50, + 38, 52, 255, 36, 255, 46, 38, 251, 34, 38, 66, 233, 84, 50, 38, 52, 66, + 233, 84, 50, 38, 52, 242, 234, 255, 46, 38, 251, 55, 38, 236, 52, 251, + 199, 38, 216, 66, 250, 24, 50, 38, 250, 24, 50, 38, 223, 236, 250, 24, + 50, 38, 250, 24, 74, 223, 182, 38, 242, 234, 255, 47, 55, 38, 255, 36, + 255, 47, 55, 38, 43, 218, 51, 55, 38, 47, 218, 51, 55, 38, 43, 254, 146, + 50, 38, 241, 97, 38, 43, 157, 223, 165, 55, 38, 116, 218, 51, 55, 38, + 121, 218, 51, 55, 38, 95, 5, 55, 38, 231, 65, 5, 55, 38, 226, 228, 241, + 157, 55, 38, 223, 241, 241, 157, 55, 38, 62, 55, 38, 248, 75, 55, 38, + 223, 165, 55, 38, 250, 24, 55, 38, 250, 240, 38, 227, 127, 38, 66, 233, + 84, 55, 38, 251, 193, 55, 38, 236, 52, 52, 254, 65, 55, 38, 251, 35, 55, + 38, 250, 91, 255, 47, 55, 38, 251, 200, 55, 38, 236, 52, 251, 200, 55, + 38, 217, 56, 55, 38, 232, 111, 55, 38, 117, 233, 83, 38, 52, 117, 233, + 83, 38, 217, 56, 227, 26, 38, 220, 196, 219, 59, 227, 26, 38, 187, 219, + 59, 227, 26, 38, 220, 196, 219, 251, 227, 26, 38, 187, 219, 251, 227, 26, + 38, 47, 157, 223, 165, 55, 38, 236, 52, 251, 193, 55, 38, 42, 55, 38, + 222, 122, 55, 38, 213, 170, 50, 38, 66, 177, 38, 52, 227, 25, 38, 242, + 234, 161, 79, 38, 255, 36, 161, 79, 38, 25, 226, 86, 38, 25, 234, 122, + 38, 25, 248, 69, 216, 244, 38, 25, 212, 211, 38, 251, 193, 50, 38, 245, + 182, 5, 55, 38, 52, 66, 233, 84, 55, 38, 43, 254, 146, 55, 38, 228, 206, + 217, 56, 50, 38, 241, 163, 50, 38, 254, 184, 126, 217, 10, 50, 38, 43, + 47, 80, 55, 38, 215, 130, 80, 55, 38, 242, 238, 235, 180, 38, 47, 254, + 36, 50, 38, 43, 157, 223, 165, 50, 38, 244, 220, 38, 213, 170, 55, 38, + 43, 254, 36, 55, 38, 47, 254, 36, 55, 38, 47, 254, 36, 22, 116, 254, 36, + 55, 38, 47, 157, 223, 165, 50, 38, 62, 74, 223, 182, 38, 254, 4, 55, 38, + 52, 223, 165, 55, 38, 212, 28, 50, 38, 52, 251, 200, 55, 38, 52, 251, + 199, 38, 52, 232, 110, 38, 52, 232, 111, 55, 38, 52, 177, 38, 52, 236, + 52, 251, 199, 38, 52, 96, 80, 55, 38, 7, 4, 1, 63, 38, 7, 4, 1, 77, 38, + 7, 4, 1, 75, 38, 7, 4, 1, 78, 38, 7, 4, 1, 72, 38, 7, 4, 1, 251, 121, 38, + 7, 4, 1, 249, 125, 38, 7, 4, 1, 242, 162, 38, 7, 4, 1, 184, 38, 7, 4, 1, + 152, 38, 7, 4, 1, 218, 113, 38, 7, 4, 1, 211, 211, 38, 7, 4, 1, 213, 169, + 25, 6, 1, 242, 44, 25, 4, 1, 242, 44, 25, 6, 1, 254, 64, 222, 185, 25, 4, + 1, 254, 64, 222, 185, 25, 228, 97, 53, 25, 232, 237, 228, 97, 53, 25, 6, + 1, 226, 215, 248, 44, 25, 4, 1, 226, 215, 248, 44, 25, 212, 211, 25, 4, + 223, 236, 232, 215, 220, 123, 88, 25, 4, 246, 193, 232, 215, 220, 123, + 88, 25, 4, 223, 236, 246, 193, 232, 215, 220, 123, 88, 25, 224, 193, 79, + 25, 216, 244, 25, 248, 69, 216, 244, 25, 6, 1, 254, 180, 2, 216, 244, 25, + 254, 135, 217, 224, 25, 6, 1, 245, 185, 2, 216, 244, 25, 6, 1, 245, 150, + 2, 216, 244, 25, 6, 1, 236, 45, 2, 216, 244, 25, 6, 1, 227, 103, 2, 216, + 244, 25, 6, 1, 215, 135, 2, 216, 244, 25, 6, 1, 227, 105, 2, 216, 244, + 25, 4, 1, 236, 45, 2, 248, 69, 22, 216, 244, 25, 6, 1, 254, 179, 25, 6, + 1, 252, 73, 25, 6, 1, 243, 203, 25, 6, 1, 248, 126, 25, 6, 1, 245, 184, + 25, 6, 1, 212, 78, 25, 6, 1, 245, 149, 25, 6, 1, 217, 145, 25, 6, 1, 236, + 44, 25, 6, 1, 235, 84, 25, 6, 1, 233, 220, 25, 6, 1, 230, 242, 25, 6, 1, + 228, 135, 25, 6, 1, 213, 148, 25, 6, 1, 227, 102, 25, 6, 1, 226, 20, 25, + 6, 1, 223, 224, 25, 6, 1, 220, 122, 25, 6, 1, 218, 5, 25, 6, 1, 215, 134, + 25, 6, 1, 226, 45, 25, 6, 1, 250, 170, 25, 6, 1, 225, 82, 25, 6, 1, 227, + 104, 25, 6, 1, 236, 45, 2, 248, 68, 25, 6, 1, 215, 135, 2, 248, 68, 25, + 4, 1, 254, 180, 2, 216, 244, 25, 4, 1, 245, 185, 2, 216, 244, 25, 4, 1, + 245, 150, 2, 216, 244, 25, 4, 1, 236, 45, 2, 216, 244, 25, 4, 1, 215, + 135, 2, 248, 69, 22, 216, 244, 25, 4, 1, 254, 179, 25, 4, 1, 252, 73, 25, + 4, 1, 243, 203, 25, 4, 1, 248, 126, 25, 4, 1, 245, 184, 25, 4, 1, 212, + 78, 25, 4, 1, 245, 149, 25, 4, 1, 217, 145, 25, 4, 1, 236, 44, 25, 4, 1, + 235, 84, 25, 4, 1, 233, 220, 25, 4, 1, 230, 242, 25, 4, 1, 228, 135, 25, + 4, 1, 213, 148, 25, 4, 1, 227, 102, 25, 4, 1, 226, 20, 25, 4, 1, 223, + 224, 25, 4, 1, 41, 220, 122, 25, 4, 1, 220, 122, 25, 4, 1, 218, 5, 25, 4, + 1, 215, 134, 25, 4, 1, 226, 45, 25, 4, 1, 250, 170, 25, 4, 1, 225, 82, + 25, 4, 1, 227, 104, 25, 4, 1, 236, 45, 2, 248, 68, 25, 4, 1, 215, 135, 2, + 248, 68, 25, 4, 1, 227, 103, 2, 216, 244, 25, 4, 1, 215, 135, 2, 216, + 244, 25, 4, 1, 227, 105, 2, 216, 244, 25, 6, 235, 109, 88, 25, 252, 74, + 88, 25, 217, 146, 88, 25, 215, 135, 2, 241, 157, 88, 25, 215, 135, 2, + 255, 36, 22, 241, 157, 88, 25, 215, 135, 2, 248, 75, 22, 241, 157, 88, + 25, 226, 46, 88, 25, 226, 21, 88, 25, 235, 109, 88, 25, 1, 254, 64, 234, + 126, 25, 4, 1, 254, 64, 234, 126, 25, 1, 219, 91, 25, 4, 1, 219, 91, 25, + 1, 248, 44, 25, 4, 1, 248, 44, 25, 1, 234, 126, 25, 4, 1, 234, 126, 25, + 1, 222, 185, 25, 4, 1, 222, 185, 81, 6, 1, 221, 0, 81, 4, 1, 221, 0, 81, + 6, 1, 244, 229, 81, 4, 1, 244, 229, 81, 6, 1, 234, 235, 81, 4, 1, 234, + 235, 81, 6, 1, 241, 150, 81, 4, 1, 241, 150, 81, 6, 1, 243, 198, 81, 4, + 1, 243, 198, 81, 6, 1, 220, 223, 81, 4, 1, 220, 223, 81, 6, 1, 248, 141, + 81, 4, 1, 248, 141, 25, 235, 85, 88, 25, 223, 225, 88, 25, 232, 215, 220, + 123, 88, 25, 1, 212, 216, 25, 6, 217, 146, 88, 25, 232, 215, 245, 185, + 88, 25, 223, 236, 232, 215, 245, 185, 88, 25, 6, 1, 220, 208, 25, 4, 1, + 220, 208, 25, 6, 232, 215, 220, 123, 88, 25, 6, 1, 222, 183, 25, 4, 1, + 222, 183, 25, 223, 225, 2, 219, 59, 88, 25, 6, 223, 236, 232, 215, 220, + 123, 88, 25, 6, 246, 193, 232, 215, 220, 123, 88, 25, 6, 223, 236, 246, + 193, 232, 215, 220, 123, 88, 33, 6, 1, 236, 173, 2, 209, 33, 6, 1, 236, + 48, 33, 6, 1, 247, 235, 33, 6, 1, 243, 27, 33, 6, 1, 215, 178, 236, 172, + 33, 6, 1, 246, 112, 33, 6, 1, 251, 130, 75, 33, 6, 1, 213, 0, 33, 6, 1, + 235, 242, 33, 6, 1, 233, 57, 33, 6, 1, 229, 73, 33, 6, 1, 216, 145, 33, + 6, 1, 234, 168, 33, 6, 1, 241, 7, 2, 209, 33, 6, 1, 220, 196, 72, 33, 6, + 1, 246, 108, 33, 6, 1, 63, 33, 6, 1, 252, 121, 33, 6, 1, 214, 237, 33, 6, + 1, 243, 76, 33, 6, 1, 248, 162, 33, 6, 1, 236, 172, 33, 6, 1, 212, 67, + 33, 6, 1, 212, 87, 33, 6, 1, 75, 33, 6, 1, 220, 196, 75, 33, 6, 1, 183, + 33, 6, 1, 245, 252, 33, 6, 1, 245, 238, 33, 6, 1, 245, 229, 33, 6, 1, 78, + 33, 6, 1, 226, 132, 33, 6, 1, 245, 176, 33, 6, 1, 245, 166, 33, 6, 1, + 217, 242, 33, 6, 1, 72, 33, 6, 1, 246, 24, 33, 6, 1, 162, 33, 6, 1, 216, + 149, 33, 6, 1, 250, 190, 33, 6, 1, 221, 47, 33, 6, 1, 221, 10, 33, 6, 1, + 242, 106, 53, 33, 6, 1, 213, 19, 33, 6, 1, 219, 255, 53, 33, 6, 1, 77, + 33, 6, 1, 212, 204, 33, 6, 1, 189, 33, 4, 1, 63, 33, 4, 1, 252, 121, 33, + 4, 1, 214, 237, 33, 4, 1, 243, 76, 33, 4, 1, 248, 162, 33, 4, 1, 236, + 172, 33, 4, 1, 212, 67, 33, 4, 1, 212, 87, 33, 4, 1, 75, 33, 4, 1, 220, + 196, 75, 33, 4, 1, 183, 33, 4, 1, 245, 252, 33, 4, 1, 245, 238, 33, 4, 1, + 245, 229, 33, 4, 1, 78, 33, 4, 1, 226, 132, 33, 4, 1, 245, 176, 33, 4, 1, + 245, 166, 33, 4, 1, 217, 242, 33, 4, 1, 72, 33, 4, 1, 246, 24, 33, 4, 1, + 162, 33, 4, 1, 216, 149, 33, 4, 1, 250, 190, 33, 4, 1, 221, 47, 33, 4, 1, + 221, 10, 33, 4, 1, 242, 106, 53, 33, 4, 1, 213, 19, 33, 4, 1, 219, 255, + 53, 33, 4, 1, 77, 33, 4, 1, 212, 204, 33, 4, 1, 189, 33, 4, 1, 236, 173, + 2, 209, 33, 4, 1, 236, 48, 33, 4, 1, 247, 235, 33, 4, 1, 243, 27, 33, 4, + 1, 215, 178, 236, 172, 33, 4, 1, 246, 112, 33, 4, 1, 251, 130, 75, 33, 4, + 1, 213, 0, 33, 4, 1, 235, 242, 33, 4, 1, 233, 57, 33, 4, 1, 229, 73, 33, + 4, 1, 216, 145, 33, 4, 1, 234, 168, 33, 4, 1, 241, 7, 2, 209, 33, 4, 1, + 220, 196, 72, 33, 4, 1, 246, 108, 33, 6, 1, 227, 104, 33, 4, 1, 227, 104, + 33, 6, 1, 213, 51, 33, 4, 1, 213, 51, 33, 6, 1, 236, 42, 77, 33, 4, 1, + 236, 42, 77, 33, 6, 1, 233, 62, 212, 175, 33, 4, 1, 233, 62, 212, 175, + 33, 6, 1, 236, 42, 233, 62, 212, 175, 33, 4, 1, 236, 42, 233, 62, 212, + 175, 33, 6, 1, 252, 41, 212, 175, 33, 4, 1, 252, 41, 212, 175, 33, 6, 1, + 236, 42, 252, 41, 212, 175, 33, 4, 1, 236, 42, 252, 41, 212, 175, 33, 6, + 1, 234, 97, 33, 4, 1, 234, 97, 33, 6, 1, 225, 82, 33, 4, 1, 225, 82, 33, + 6, 1, 244, 171, 33, 4, 1, 244, 171, 33, 6, 1, 236, 5, 33, 4, 1, 236, 5, + 33, 6, 1, 236, 6, 2, 52, 242, 234, 255, 46, 33, 4, 1, 236, 6, 2, 52, 242, + 234, 255, 46, 33, 6, 1, 215, 181, 33, 4, 1, 215, 181, 33, 6, 1, 223, 121, + 227, 104, 33, 4, 1, 223, 121, 227, 104, 33, 6, 1, 227, 105, 2, 217, 32, + 33, 4, 1, 227, 105, 2, 217, 32, 33, 6, 1, 227, 46, 33, 4, 1, 227, 46, 33, + 6, 1, 234, 126, 33, 4, 1, 234, 126, 33, 217, 112, 53, 38, 33, 217, 32, + 38, 33, 226, 229, 38, 33, 248, 221, 225, 188, 38, 33, 225, 76, 225, 188, + 38, 33, 225, 173, 38, 33, 241, 63, 217, 112, 53, 38, 33, 231, 74, 53, 33, + 6, 1, 220, 196, 241, 7, 2, 218, 40, 33, 4, 1, 220, 196, 241, 7, 2, 218, + 40, 33, 6, 1, 221, 89, 53, 33, 4, 1, 221, 89, 53, 33, 6, 1, 245, 177, 2, + 217, 81, 33, 4, 1, 245, 177, 2, 217, 81, 33, 6, 1, 243, 77, 2, 215, 133, + 33, 4, 1, 243, 77, 2, 215, 133, 33, 6, 1, 243, 77, 2, 91, 33, 4, 1, 243, + 77, 2, 91, 33, 6, 1, 243, 77, 2, 231, 107, 102, 33, 4, 1, 243, 77, 2, + 231, 107, 102, 33, 6, 1, 212, 68, 2, 248, 111, 33, 4, 1, 212, 68, 2, 248, + 111, 33, 6, 1, 212, 88, 2, 248, 111, 33, 4, 1, 212, 88, 2, 248, 111, 33, + 6, 1, 235, 131, 2, 248, 111, 33, 4, 1, 235, 131, 2, 248, 111, 33, 6, 1, + 235, 131, 2, 66, 91, 33, 4, 1, 235, 131, 2, 66, 91, 33, 6, 1, 235, 131, + 2, 91, 33, 4, 1, 235, 131, 2, 91, 33, 6, 1, 252, 170, 183, 33, 4, 1, 252, + 170, 183, 33, 6, 1, 245, 230, 2, 248, 111, 33, 4, 1, 245, 230, 2, 248, + 111, 33, 6, 26, 245, 230, 243, 76, 33, 4, 26, 245, 230, 243, 76, 33, 6, + 1, 226, 133, 2, 231, 107, 102, 33, 4, 1, 226, 133, 2, 231, 107, 102, 33, + 6, 1, 255, 52, 162, 33, 4, 1, 255, 52, 162, 33, 6, 1, 245, 167, 2, 248, + 111, 33, 4, 1, 245, 167, 2, 248, 111, 33, 6, 1, 217, 243, 2, 248, 111, + 33, 4, 1, 217, 243, 2, 248, 111, 33, 6, 1, 219, 75, 72, 33, 4, 1, 219, + 75, 72, 33, 6, 1, 219, 75, 103, 2, 91, 33, 4, 1, 219, 75, 103, 2, 91, 33, + 6, 1, 242, 151, 2, 248, 111, 33, 4, 1, 242, 151, 2, 248, 111, 33, 6, 26, + 217, 243, 216, 149, 33, 4, 26, 217, 243, 216, 149, 33, 6, 1, 250, 191, 2, + 248, 111, 33, 4, 1, 250, 191, 2, 248, 111, 33, 6, 1, 250, 191, 2, 66, 91, + 33, 4, 1, 250, 191, 2, 66, 91, 33, 6, 1, 220, 234, 33, 4, 1, 220, 234, + 33, 6, 1, 255, 52, 250, 190, 33, 4, 1, 255, 52, 250, 190, 33, 6, 1, 255, + 52, 250, 191, 2, 248, 111, 33, 4, 1, 255, 52, 250, 191, 2, 248, 111, 33, + 1, 226, 222, 33, 6, 1, 212, 68, 2, 251, 199, 33, 4, 1, 212, 68, 2, 251, + 199, 33, 6, 1, 235, 131, 2, 102, 33, 4, 1, 235, 131, 2, 102, 33, 6, 1, + 245, 253, 2, 218, 40, 33, 4, 1, 245, 253, 2, 218, 40, 33, 6, 1, 245, 230, + 2, 102, 33, 4, 1, 245, 230, 2, 102, 33, 6, 1, 245, 230, 2, 218, 40, 33, + 4, 1, 245, 230, 2, 218, 40, 33, 6, 1, 234, 245, 250, 190, 33, 4, 1, 234, + 245, 250, 190, 33, 6, 1, 245, 239, 2, 218, 40, 33, 4, 1, 245, 239, 2, + 218, 40, 33, 4, 1, 226, 222, 33, 6, 1, 111, 2, 251, 199, 33, 4, 1, 111, + 2, 251, 199, 33, 6, 1, 111, 2, 248, 74, 33, 4, 1, 111, 2, 248, 74, 33, 6, + 26, 111, 236, 172, 33, 4, 26, 111, 236, 172, 33, 6, 1, 236, 173, 2, 251, + 199, 33, 4, 1, 236, 173, 2, 251, 199, 33, 6, 1, 222, 136, 33, 4, 1, 222, + 136, 33, 6, 1, 222, 137, 2, 248, 74, 33, 4, 1, 222, 137, 2, 248, 74, 33, + 6, 1, 212, 68, 2, 248, 74, 33, 4, 1, 212, 68, 2, 248, 74, 33, 6, 1, 212, + 88, 2, 248, 74, 33, 4, 1, 212, 88, 2, 248, 74, 33, 6, 1, 255, 52, 246, + 112, 33, 4, 1, 255, 52, 246, 112, 33, 6, 1, 241, 7, 2, 232, 110, 33, 4, + 1, 241, 7, 2, 232, 110, 33, 6, 1, 241, 7, 2, 248, 74, 33, 4, 1, 241, 7, + 2, 248, 74, 33, 6, 1, 141, 2, 248, 74, 33, 4, 1, 141, 2, 248, 74, 33, 6, + 1, 252, 180, 78, 33, 4, 1, 252, 180, 78, 33, 6, 1, 252, 180, 141, 2, 248, + 74, 33, 4, 1, 252, 180, 141, 2, 248, 74, 33, 6, 1, 154, 2, 248, 74, 33, + 4, 1, 154, 2, 248, 74, 33, 6, 1, 103, 2, 232, 110, 33, 4, 1, 103, 2, 232, + 110, 33, 6, 1, 103, 2, 248, 74, 33, 4, 1, 103, 2, 248, 74, 33, 6, 1, 103, + 2, 52, 138, 33, 4, 1, 103, 2, 52, 138, 33, 6, 1, 250, 191, 2, 248, 74, + 33, 4, 1, 250, 191, 2, 248, 74, 33, 6, 1, 243, 77, 2, 248, 111, 33, 4, 1, + 243, 77, 2, 248, 111, 33, 6, 1, 213, 20, 2, 248, 74, 33, 4, 1, 213, 20, + 2, 248, 74, 33, 6, 1, 243, 77, 2, 219, 59, 22, 102, 33, 4, 1, 243, 77, 2, + 219, 59, 22, 102, 33, 6, 1, 242, 151, 2, 102, 33, 4, 1, 242, 151, 2, 102, + 33, 6, 1, 242, 151, 2, 91, 33, 4, 1, 242, 151, 2, 91, 33, 6, 1, 234, 134, + 248, 162, 33, 4, 1, 234, 134, 248, 162, 33, 6, 1, 234, 134, 247, 235, 33, + 4, 1, 234, 134, 247, 235, 33, 6, 1, 234, 134, 212, 20, 33, 4, 1, 234, + 134, 212, 20, 33, 6, 1, 234, 134, 246, 106, 33, 4, 1, 234, 134, 246, 106, + 33, 6, 1, 234, 134, 233, 57, 33, 4, 1, 234, 134, 233, 57, 33, 6, 1, 234, + 134, 229, 73, 33, 4, 1, 234, 134, 229, 73, 33, 6, 1, 234, 134, 220, 56, + 33, 4, 1, 234, 134, 220, 56, 33, 6, 1, 234, 134, 217, 27, 33, 4, 1, 234, + 134, 217, 27, 33, 6, 1, 223, 236, 212, 87, 33, 4, 1, 223, 236, 212, 87, + 33, 6, 1, 245, 253, 2, 102, 33, 4, 1, 245, 253, 2, 102, 33, 6, 1, 233, + 123, 33, 4, 1, 233, 123, 33, 6, 1, 223, 226, 33, 4, 1, 223, 226, 33, 6, + 1, 213, 83, 33, 4, 1, 213, 83, 33, 6, 1, 225, 11, 33, 4, 1, 225, 11, 33, + 6, 1, 214, 9, 33, 4, 1, 214, 9, 33, 6, 1, 254, 202, 183, 33, 4, 1, 254, + 202, 183, 33, 6, 1, 245, 253, 2, 231, 107, 102, 33, 4, 1, 245, 253, 2, + 231, 107, 102, 33, 6, 1, 245, 230, 2, 231, 107, 102, 33, 4, 1, 245, 230, + 2, 231, 107, 102, 33, 6, 1, 226, 133, 2, 248, 111, 33, 4, 1, 226, 133, 2, + 248, 111, 33, 6, 1, 220, 235, 2, 248, 111, 33, 4, 1, 220, 235, 2, 248, + 111, 146, 6, 1, 253, 207, 146, 6, 1, 252, 86, 146, 6, 1, 243, 43, 146, 6, + 1, 249, 30, 146, 6, 1, 246, 34, 146, 6, 1, 212, 109, 146, 6, 1, 246, 19, + 146, 6, 1, 245, 151, 146, 6, 1, 109, 146, 6, 1, 212, 67, 146, 6, 1, 236, + 85, 146, 6, 1, 233, 60, 146, 6, 1, 213, 151, 146, 6, 1, 251, 88, 146, 6, + 1, 235, 27, 146, 6, 1, 241, 173, 146, 6, 1, 236, 0, 146, 6, 1, 243, 86, + 146, 6, 1, 250, 185, 146, 6, 1, 231, 192, 146, 6, 1, 213, 0, 146, 6, 1, + 228, 193, 146, 6, 1, 221, 47, 146, 6, 1, 214, 123, 146, 6, 1, 250, 215, + 146, 6, 1, 226, 116, 146, 6, 1, 235, 227, 146, 6, 1, 208, 146, 6, 1, 222, + 103, 146, 6, 1, 214, 161, 146, 6, 1, 217, 29, 146, 6, 1, 224, 23, 146, 6, + 1, 250, 42, 146, 6, 1, 212, 241, 146, 6, 1, 225, 214, 146, 6, 1, 235, 38, + 146, 6, 1, 227, 125, 146, 6, 1, 244, 231, 146, 59, 1, 43, 157, 223, 164, + 146, 254, 97, 146, 245, 233, 79, 146, 245, 119, 79, 146, 250, 23, 146, + 224, 193, 79, 146, 255, 53, 79, 146, 4, 1, 253, 207, 146, 4, 1, 252, 86, + 146, 4, 1, 243, 43, 146, 4, 1, 249, 30, 146, 4, 1, 246, 34, 146, 4, 1, + 212, 109, 146, 4, 1, 246, 19, 146, 4, 1, 245, 151, 146, 4, 1, 109, 146, + 4, 1, 212, 67, 146, 4, 1, 236, 85, 146, 4, 1, 233, 60, 146, 4, 1, 213, + 151, 146, 4, 1, 251, 88, 146, 4, 1, 235, 27, 146, 4, 1, 241, 173, 146, 4, + 1, 236, 0, 146, 4, 1, 243, 86, 146, 4, 1, 250, 185, 146, 4, 1, 231, 192, + 146, 4, 1, 213, 0, 146, 4, 1, 228, 193, 146, 4, 1, 221, 47, 146, 4, 1, + 214, 123, 146, 4, 1, 250, 215, 146, 4, 1, 226, 116, 146, 4, 1, 235, 227, + 146, 4, 1, 208, 146, 4, 1, 222, 103, 146, 4, 1, 214, 161, 146, 4, 1, 217, + 29, 146, 4, 1, 224, 23, 146, 4, 1, 250, 42, 146, 4, 1, 212, 241, 146, 4, + 1, 225, 214, 146, 4, 1, 235, 38, 146, 4, 1, 227, 125, 146, 4, 1, 244, + 231, 146, 4, 26, 246, 35, 212, 241, 146, 244, 64, 219, 83, 146, 241, 21, + 94, 255, 47, 245, 144, 94, 255, 47, 222, 104, 94, 255, 47, 221, 33, 94, + 255, 47, 212, 97, 224, 250, 94, 255, 47, 212, 97, 243, 220, 94, 255, 47, + 217, 42, 94, 255, 47, 223, 234, 94, 255, 47, 212, 96, 94, 255, 47, 226, + 155, 94, 255, 47, 213, 12, 94, 255, 47, 217, 180, 94, 255, 47, 243, 137, + 94, 255, 47, 243, 138, 230, 209, 94, 255, 47, 243, 135, 94, 255, 47, 224, + 251, 226, 181, 94, 255, 47, 217, 219, 243, 152, 94, 255, 47, 226, 136, + 94, 255, 47, 253, 243, 242, 143, 94, 255, 47, 230, 219, 94, 255, 47, 232, + 86, 94, 255, 47, 231, 183, 94, 255, 47, 231, 184, 235, 39, 94, 255, 47, + 248, 230, 94, 255, 47, 225, 6, 94, 255, 47, 217, 219, 224, 246, 94, 255, + 47, 213, 22, 252, 87, 212, 222, 94, 255, 47, 227, 110, 94, 255, 47, 236, + 131, 94, 255, 47, 248, 142, 94, 255, 47, 212, 26, 94, 156, 232, 21, 250, + 95, 94, 225, 181, 220, 237, 94, 225, 181, 242, 97, 222, 104, 94, 225, + 181, 242, 97, 226, 149, 94, 225, 181, 242, 97, 224, 255, 94, 225, 181, + 242, 7, 94, 225, 181, 216, 147, 94, 225, 181, 222, 104, 94, 225, 181, + 226, 149, 94, 225, 181, 224, 255, 94, 225, 181, 241, 166, 94, 225, 181, + 241, 167, 242, 99, 31, 214, 241, 94, 225, 181, 224, 197, 94, 225, 181, + 249, 17, 171, 232, 49, 94, 225, 181, 231, 175, 94, 225, 63, 232, 46, 94, + 225, 181, 224, 94, 94, 225, 63, 226, 157, 94, 225, 181, 220, 222, 247, + 195, 94, 225, 181, 220, 104, 247, 195, 94, 225, 63, 220, 0, 226, 151, 94, + 156, 215, 137, 247, 195, 94, 156, 232, 237, 247, 195, 94, 225, 63, 228, + 94, 242, 142, 94, 225, 181, 225, 0, 224, 250, 94, 1, 254, 205, 94, 1, + 252, 75, 94, 1, 243, 41, 94, 1, 249, 0, 94, 1, 242, 85, 94, 1, 214, 241, + 94, 1, 212, 90, 94, 1, 242, 45, 94, 1, 217, 196, 94, 1, 212, 225, 94, 1, + 41, 235, 112, 94, 1, 235, 112, 94, 1, 233, 216, 94, 1, 41, 231, 199, 94, + 1, 231, 199, 94, 1, 41, 228, 93, 94, 1, 228, 93, 94, 1, 222, 188, 94, 1, + 253, 205, 94, 1, 41, 226, 132, 94, 1, 226, 132, 94, 1, 41, 216, 150, 94, + 1, 216, 150, 94, 1, 224, 219, 94, 1, 223, 253, 94, 1, 220, 221, 94, 1, + 218, 2, 94, 26, 212, 254, 52, 214, 241, 94, 26, 212, 254, 214, 242, 212, + 225, 94, 26, 212, 254, 52, 212, 225, 94, 225, 63, 243, 137, 94, 225, 63, + 243, 135, 12, 51, 53, 12, 5, 222, 182, 12, 244, 119, 232, 32, 12, 5, 222, + 217, 254, 78, 249, 173, 223, 129, 254, 78, 244, 94, 223, 129, 12, 224, + 61, 254, 78, 226, 94, 231, 76, 53, 254, 78, 226, 94, 217, 214, 217, 114, + 53, 254, 254, 53, 12, 250, 23, 12, 248, 217, 221, 80, 12, 225, 183, 214, + 223, 53, 12, 5, 231, 57, 12, 5, 222, 198, 254, 207, 214, 32, 12, 5, 254, + 207, 254, 8, 12, 5, 224, 93, 254, 206, 12, 5, 224, 100, 254, 188, 254, + 141, 12, 5, 218, 33, 12, 4, 127, 218, 43, 12, 4, 127, 26, 108, 2, 233, + 225, 2, 213, 35, 12, 4, 127, 212, 101, 12, 4, 244, 254, 12, 4, 248, 251, + 12, 4, 235, 67, 12, 221, 93, 12, 216, 182, 62, 225, 63, 79, 12, 224, 193, + 79, 12, 1, 235, 71, 213, 35, 12, 1, 242, 122, 12, 1, 108, 2, 232, 106, + 50, 12, 1, 108, 2, 194, 50, 12, 1, 214, 18, 2, 194, 50, 12, 1, 108, 2, + 194, 55, 12, 1, 76, 2, 194, 50, 12, 1, 254, 205, 12, 1, 252, 100, 12, 1, + 217, 229, 232, 42, 12, 1, 217, 228, 12, 1, 217, 158, 12, 1, 235, 239, 12, + 1, 242, 139, 12, 1, 234, 247, 12, 1, 249, 6, 12, 1, 217, 168, 12, 1, 224, + 23, 12, 1, 212, 101, 12, 1, 222, 108, 12, 1, 221, 4, 12, 1, 222, 220, 12, + 1, 249, 25, 12, 1, 218, 43, 12, 1, 212, 104, 12, 1, 254, 231, 12, 1, 243, + 84, 12, 1, 235, 37, 2, 119, 181, 50, 12, 1, 235, 37, 2, 137, 181, 55, 12, + 1, 245, 1, 76, 2, 236, 52, 211, 211, 12, 1, 245, 1, 76, 2, 119, 181, 50, + 12, 1, 245, 1, 76, 2, 137, 181, 50, 12, 218, 7, 12, 1, 244, 231, 12, 1, + 225, 4, 12, 1, 235, 112, 12, 1, 233, 224, 12, 1, 231, 213, 12, 1, 228, + 216, 12, 1, 242, 65, 12, 1, 214, 17, 12, 1, 108, 232, 70, 12, 1, 213, 35, + 12, 244, 252, 12, 248, 249, 12, 235, 65, 12, 244, 254, 12, 248, 251, 12, + 235, 67, 12, 221, 38, 12, 219, 4, 12, 232, 104, 50, 12, 194, 50, 12, 194, + 55, 12, 219, 24, 254, 205, 12, 236, 52, 248, 251, 12, 156, 228, 217, 243, + 58, 12, 211, 250, 12, 30, 5, 4, 215, 86, 50, 12, 30, 5, 236, 52, 4, 215, + 86, 50, 12, 30, 5, 62, 55, 12, 223, 236, 248, 251, 12, 244, 255, 2, 119, + 247, 193, 12, 214, 19, 194, 55, 254, 78, 21, 212, 79, 254, 78, 21, 118, + 254, 78, 21, 112, 254, 78, 21, 170, 254, 78, 21, 167, 254, 78, 21, 185, + 254, 78, 21, 192, 254, 78, 21, 200, 254, 78, 21, 198, 254, 78, 21, 203, + 12, 226, 93, 53, 12, 248, 155, 221, 80, 12, 217, 112, 221, 80, 12, 244, + 170, 225, 179, 219, 109, 12, 1, 247, 194, 252, 100, 12, 1, 247, 194, 225, + 4, 12, 1, 218, 237, 254, 205, 12, 1, 108, 214, 33, 12, 1, 108, 2, 214, + 19, 194, 50, 12, 1, 108, 2, 214, 19, 194, 55, 12, 1, 127, 242, 122, 12, + 1, 127, 194, 254, 205, 12, 1, 127, 194, 214, 17, 12, 1, 103, 2, 194, 50, + 12, 1, 127, 194, 213, 35, 12, 1, 216, 120, 12, 1, 216, 118, 12, 1, 252, + 110, 12, 1, 217, 229, 2, 223, 164, 12, 1, 217, 229, 2, 137, 181, 74, 246, + 178, 12, 1, 226, 116, 12, 1, 217, 226, 12, 1, 252, 98, 12, 1, 123, 2, + 194, 50, 12, 1, 123, 2, 119, 181, 66, 50, 12, 1, 228, 53, 12, 1, 246, + 119, 12, 1, 123, 2, 137, 181, 50, 12, 1, 217, 246, 12, 1, 217, 244, 12, + 1, 248, 202, 12, 1, 249, 7, 2, 223, 164, 12, 1, 249, 7, 2, 62, 55, 12, 1, + 249, 7, 2, 62, 252, 90, 22, 4, 218, 43, 12, 1, 249, 12, 12, 1, 248, 204, + 12, 1, 246, 146, 12, 1, 249, 7, 2, 137, 181, 74, 246, 178, 12, 1, 249, 7, + 2, 244, 101, 181, 50, 12, 1, 223, 107, 12, 1, 224, 24, 2, 4, 211, 211, + 12, 1, 224, 24, 2, 223, 164, 12, 1, 224, 24, 2, 62, 55, 12, 1, 224, 24, + 2, 4, 215, 86, 55, 12, 1, 224, 24, 2, 62, 252, 90, 22, 62, 50, 12, 1, + 224, 24, 2, 119, 181, 50, 12, 1, 235, 236, 12, 1, 224, 24, 2, 244, 101, + 181, 50, 12, 1, 222, 109, 2, 62, 252, 90, 22, 62, 50, 12, 1, 222, 109, 2, + 137, 181, 55, 12, 1, 222, 109, 2, 137, 181, 252, 90, 22, 137, 181, 50, + 12, 1, 222, 221, 2, 119, 181, 55, 12, 1, 222, 221, 2, 137, 181, 50, 12, + 1, 218, 44, 2, 137, 181, 50, 12, 1, 254, 232, 2, 137, 181, 50, 12, 1, + 247, 194, 244, 231, 12, 1, 244, 232, 2, 62, 230, 249, 55, 12, 1, 244, + 232, 2, 62, 55, 12, 1, 214, 230, 12, 1, 244, 232, 2, 137, 181, 55, 12, 1, + 226, 114, 12, 1, 225, 5, 2, 62, 50, 12, 1, 225, 5, 2, 137, 181, 50, 12, + 1, 235, 36, 12, 1, 218, 209, 235, 112, 12, 1, 235, 113, 2, 223, 164, 12, + 1, 235, 113, 2, 62, 50, 12, 1, 229, 228, 12, 1, 235, 113, 2, 137, 181, + 55, 12, 1, 243, 217, 12, 1, 243, 218, 2, 223, 164, 12, 1, 229, 153, 12, + 1, 243, 218, 2, 119, 181, 55, 12, 1, 242, 203, 12, 1, 243, 218, 2, 137, + 181, 50, 12, 1, 233, 225, 2, 4, 211, 211, 12, 1, 233, 225, 2, 62, 50, 12, + 1, 233, 225, 2, 137, 181, 50, 12, 1, 233, 225, 2, 137, 181, 55, 12, 1, + 228, 217, 2, 62, 55, 12, 1, 228, 217, 243, 58, 12, 1, 223, 149, 12, 1, + 228, 217, 2, 223, 164, 12, 1, 228, 217, 2, 137, 181, 50, 12, 1, 242, 66, + 247, 216, 12, 1, 217, 247, 2, 62, 50, 12, 1, 242, 66, 2, 76, 50, 12, 1, + 242, 66, 243, 11, 12, 1, 242, 66, 243, 12, 2, 194, 50, 12, 1, 217, 229, + 232, 43, 243, 11, 12, 1, 214, 18, 2, 223, 164, 12, 1, 234, 193, 227, 136, + 12, 1, 227, 136, 12, 1, 72, 12, 1, 212, 204, 12, 1, 234, 193, 212, 204, + 12, 1, 214, 18, 2, 119, 181, 50, 12, 1, 214, 237, 12, 1, 245, 1, 213, 35, + 12, 1, 76, 2, 218, 40, 12, 1, 76, 2, 4, 211, 211, 12, 1, 214, 18, 2, 62, + 50, 12, 1, 77, 12, 1, 76, 2, 137, 181, 55, 12, 1, 76, 252, 178, 12, 1, + 76, 252, 179, 2, 194, 50, 12, 244, 64, 219, 83, 12, 1, 255, 20, 12, 4, + 127, 26, 222, 221, 2, 233, 225, 2, 108, 232, 70, 12, 4, 127, 26, 225, 5, + 2, 233, 225, 2, 108, 232, 70, 12, 4, 127, 64, 73, 17, 12, 4, 127, 233, + 225, 254, 205, 12, 4, 127, 235, 239, 12, 4, 127, 137, 247, 193, 12, 4, + 127, 222, 108, 12, 245, 222, 68, 253, 209, 12, 219, 105, 68, 223, 75, + 245, 253, 242, 4, 12, 4, 127, 223, 119, 212, 79, 12, 4, 127, 215, 136, + 224, 42, 212, 79, 12, 4, 127, 247, 194, 242, 83, 68, 234, 247, 12, 4, + 127, 64, 49, 17, 12, 4, 117, 222, 108, 12, 4, 127, 232, 105, 12, 4, 214, + 17, 12, 4, 213, 35, 12, 4, 127, 213, 35, 12, 4, 127, 228, 216, 12, 225, + 209, 68, 222, 208, 12, 245, 231, 250, 232, 117, 219, 83, 12, 245, 231, + 250, 232, 127, 219, 83, 12, 223, 119, 127, 219, 84, 2, 244, 193, 250, + 231, 12, 4, 117, 231, 213, 12, 1, 249, 7, 2, 236, 52, 211, 211, 12, 1, + 224, 24, 2, 236, 52, 211, 211, 245, 111, 254, 78, 21, 212, 79, 245, 111, + 254, 78, 21, 118, 245, 111, 254, 78, 21, 112, 245, 111, 254, 78, 21, 170, + 245, 111, 254, 78, 21, 167, 245, 111, 254, 78, 21, 185, 245, 111, 254, + 78, 21, 192, 245, 111, 254, 78, 21, 200, 245, 111, 254, 78, 21, 198, 245, + 111, 254, 78, 21, 203, 12, 1, 221, 5, 2, 62, 55, 12, 1, 249, 26, 2, 62, + 55, 12, 1, 243, 85, 2, 62, 55, 12, 5, 220, 103, 254, 162, 12, 5, 220, + 103, 225, 151, 231, 192, 12, 1, 242, 66, 2, 236, 52, 211, 211, 180, 245, + 222, 68, 226, 179, 180, 218, 233, 244, 64, 219, 83, 180, 219, 26, 244, + 64, 219, 83, 180, 218, 233, 250, 30, 180, 219, 26, 250, 30, 180, 201, + 250, 30, 180, 250, 31, 220, 53, 233, 168, 180, 250, 31, 220, 53, 223, + 182, 180, 218, 233, 250, 31, 220, 53, 233, 168, 180, 219, 26, 250, 31, + 220, 53, 223, 182, 180, 249, 242, 180, 242, 104, 227, 151, 180, 242, 104, + 231, 173, 180, 242, 104, 254, 5, 180, 255, 53, 79, 180, 1, 254, 209, 180, + 1, 218, 237, 254, 209, 180, 1, 252, 72, 180, 1, 243, 209, 180, 1, 243, + 210, 243, 187, 180, 1, 249, 3, 180, 1, 247, 194, 249, 4, 223, 160, 180, + 1, 242, 85, 180, 1, 214, 17, 180, 1, 212, 101, 180, 1, 242, 43, 180, 1, + 217, 192, 180, 1, 217, 193, 243, 187, 180, 1, 212, 191, 180, 1, 212, 192, + 242, 85, 180, 1, 235, 87, 180, 1, 233, 223, 180, 1, 231, 73, 180, 1, 228, + 93, 180, 1, 221, 86, 180, 1, 41, 221, 86, 180, 1, 77, 180, 1, 226, 132, + 180, 1, 223, 236, 226, 132, 180, 1, 222, 218, 180, 1, 224, 254, 180, 1, + 223, 160, 180, 1, 220, 221, 180, 1, 218, 0, 180, 1, 226, 81, 252, 60, + 180, 1, 226, 81, 243, 82, 180, 1, 226, 81, 248, 93, 180, 225, 72, 50, + 180, 225, 72, 55, 180, 225, 72, 246, 192, 180, 212, 10, 50, 180, 212, 10, + 55, 180, 212, 10, 246, 192, 180, 224, 58, 50, 180, 224, 58, 55, 180, 246, + 193, 212, 17, 241, 149, 180, 246, 193, 212, 17, 254, 142, 180, 242, 88, + 50, 180, 242, 88, 55, 180, 242, 87, 246, 192, 180, 245, 164, 50, 180, + 245, 164, 55, 180, 223, 44, 180, 244, 225, 247, 195, 180, 224, 172, 180, + 223, 71, 180, 119, 66, 181, 50, 180, 119, 66, 181, 55, 180, 137, 181, 50, + 180, 137, 181, 55, 180, 227, 149, 233, 84, 50, 180, 227, 149, 233, 84, + 55, 180, 230, 196, 180, 252, 177, 180, 1, 219, 252, 212, 73, 180, 1, 219, + 252, 234, 240, 180, 1, 219, 252, 244, 243, 12, 1, 252, 101, 2, 137, 181, + 241, 99, 55, 12, 1, 252, 101, 2, 62, 252, 90, 22, 137, 181, 50, 12, 1, + 252, 101, 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 252, 101, 2, 137, + 181, 225, 177, 215, 130, 252, 90, 22, 119, 181, 50, 12, 1, 252, 101, 2, + 119, 181, 252, 90, 22, 62, 50, 12, 1, 252, 101, 2, 236, 52, 4, 215, 86, + 55, 12, 1, 252, 101, 2, 4, 211, 211, 12, 1, 123, 2, 119, 181, 50, 12, 1, + 123, 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 249, 7, 2, 119, 181, + 214, 171, 252, 90, 22, 4, 218, 43, 12, 1, 249, 7, 2, 236, 52, 4, 215, 86, + 55, 12, 1, 224, 24, 2, 91, 12, 1, 222, 109, 2, 244, 101, 181, 50, 12, 1, + 254, 232, 2, 119, 181, 50, 12, 1, 254, 232, 2, 137, 181, 225, 177, 246, + 179, 50, 12, 1, 254, 232, 2, 119, 181, 214, 171, 50, 12, 1, 244, 232, 2, + 119, 181, 55, 12, 1, 244, 232, 2, 137, 181, 225, 177, 215, 130, 55, 12, + 1, 235, 37, 2, 62, 50, 12, 1, 235, 37, 2, 137, 181, 50, 12, 1, 235, 37, + 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 64, 2, 62, 50, 12, 1, 64, 2, + 62, 55, 12, 1, 228, 217, 2, 119, 181, 55, 12, 1, 228, 217, 2, 4, 218, 43, + 12, 1, 228, 217, 2, 4, 211, 211, 12, 1, 233, 225, 2, 134, 12, 1, 224, 24, + 2, 119, 181, 214, 171, 50, 12, 1, 224, 24, 2, 194, 50, 12, 1, 222, 109, + 2, 119, 181, 214, 171, 50, 12, 1, 123, 2, 4, 12, 1, 218, 44, 55, 12, 1, + 123, 2, 4, 12, 1, 218, 44, 22, 119, 247, 193, 12, 1, 222, 109, 2, 4, 12, + 1, 218, 44, 22, 119, 247, 193, 12, 1, 224, 24, 2, 4, 12, 1, 218, 44, 22, + 119, 247, 193, 12, 1, 123, 2, 4, 12, 1, 218, 44, 50, 12, 1, 108, 2, 245, + 111, 254, 78, 21, 119, 50, 12, 1, 108, 2, 245, 111, 254, 78, 21, 137, 50, + 12, 1, 245, 1, 76, 2, 245, 111, 254, 78, 21, 119, 50, 12, 1, 245, 1, 76, + 2, 245, 111, 254, 78, 21, 137, 50, 12, 1, 245, 1, 76, 2, 245, 111, 254, + 78, 21, 244, 101, 55, 12, 1, 214, 18, 2, 245, 111, 254, 78, 21, 119, 50, + 12, 1, 214, 18, 2, 245, 111, 254, 78, 21, 137, 50, 12, 1, 76, 252, 179, + 2, 245, 111, 254, 78, 21, 119, 50, 12, 1, 76, 252, 179, 2, 245, 111, 254, + 78, 21, 137, 50, 12, 1, 123, 2, 245, 111, 254, 78, 21, 244, 101, 55, 12, + 1, 222, 109, 2, 245, 111, 254, 78, 21, 244, 101, 50, 12, 1, 222, 109, 2, + 236, 52, 211, 211, 12, 1, 235, 113, 2, 119, 181, 50, 217, 171, 1, 242, + 148, 217, 171, 1, 221, 13, 217, 171, 1, 228, 215, 217, 171, 1, 224, 109, + 217, 171, 1, 252, 233, 217, 171, 1, 233, 120, 217, 171, 1, 235, 126, 217, + 171, 1, 254, 195, 217, 171, 1, 215, 6, 217, 171, 1, 231, 212, 217, 171, + 1, 245, 27, 217, 171, 1, 248, 96, 217, 171, 1, 217, 173, 217, 171, 1, + 233, 251, 217, 171, 1, 243, 226, 217, 171, 1, 243, 17, 217, 171, 1, 222, + 107, 217, 171, 1, 248, 215, 217, 171, 1, 212, 93, 217, 171, 1, 218, 1, + 217, 171, 1, 213, 94, 217, 171, 1, 226, 143, 217, 171, 1, 235, 244, 217, + 171, 1, 250, 193, 217, 171, 1, 216, 127, 217, 171, 1, 242, 36, 217, 171, + 1, 234, 249, 217, 171, 1, 217, 172, 217, 171, 1, 212, 108, 217, 171, 1, + 221, 3, 217, 171, 1, 222, 224, 217, 171, 1, 249, 28, 217, 171, 1, 109, + 217, 171, 1, 212, 16, 217, 171, 1, 254, 228, 217, 171, 1, 243, 83, 217, + 171, 1, 225, 8, 217, 171, 1, 214, 50, 217, 171, 255, 54, 217, 171, 255, + 69, 217, 171, 240, 224, 217, 171, 246, 29, 217, 171, 215, 197, 217, 171, + 227, 85, 217, 171, 246, 37, 217, 171, 245, 105, 217, 171, 227, 148, 217, + 171, 227, 156, 217, 171, 219, 4, 217, 171, 1, 230, 112, 229, 32, 21, 212, + 79, 229, 32, 21, 118, 229, 32, 21, 112, 229, 32, 21, 170, 229, 32, 21, + 167, 229, 32, 21, 185, 229, 32, 21, 192, 229, 32, 21, 200, 229, 32, 21, + 198, 229, 32, 21, 203, 229, 32, 1, 63, 229, 32, 1, 246, 30, 229, 32, 1, + 75, 229, 32, 1, 77, 229, 32, 1, 72, 229, 32, 1, 227, 86, 229, 32, 1, 78, + 229, 32, 1, 249, 18, 229, 32, 1, 206, 229, 32, 1, 252, 234, 229, 32, 1, + 195, 229, 32, 1, 218, 66, 229, 32, 1, 236, 0, 229, 32, 1, 250, 215, 229, + 32, 1, 249, 30, 229, 32, 1, 208, 229, 32, 1, 223, 115, 229, 32, 1, 222, + 227, 229, 32, 1, 243, 175, 229, 32, 1, 245, 29, 229, 32, 1, 183, 229, 32, + 1, 233, 255, 229, 32, 1, 230, 115, 213, 213, 229, 32, 1, 191, 229, 32, 1, + 228, 64, 229, 32, 1, 207, 229, 32, 1, 162, 229, 32, 1, 214, 52, 229, 32, + 1, 189, 229, 32, 1, 228, 65, 213, 213, 229, 32, 1, 235, 178, 236, 0, 229, + 32, 1, 235, 178, 250, 215, 229, 32, 1, 235, 178, 208, 229, 32, 38, 220, + 196, 127, 216, 254, 229, 32, 38, 220, 196, 117, 216, 254, 229, 32, 38, + 220, 196, 223, 159, 216, 254, 229, 32, 38, 187, 248, 110, 216, 254, 229, + 32, 38, 187, 127, 216, 254, 229, 32, 38, 187, 117, 216, 254, 229, 32, 38, + 187, 223, 159, 216, 254, 229, 32, 38, 230, 81, 79, 229, 32, 38, 52, 62, + 50, 229, 32, 127, 161, 254, 97, 229, 32, 117, 161, 254, 97, 229, 32, 16, + 227, 87, 248, 122, 229, 32, 16, 243, 174, 229, 32, 250, 23, 229, 32, 245, + 119, 79, 229, 32, 233, 230, 222, 191, 1, 254, 211, 222, 191, 1, 252, 20, + 222, 191, 1, 243, 208, 222, 191, 1, 249, 5, 222, 191, 1, 236, 11, 222, + 191, 1, 252, 233, 222, 191, 1, 212, 82, 222, 191, 1, 236, 19, 222, 191, + 1, 217, 34, 222, 191, 1, 212, 174, 222, 191, 1, 235, 127, 222, 191, 1, + 233, 248, 222, 191, 1, 231, 73, 222, 191, 1, 228, 93, 222, 191, 1, 220, + 101, 222, 191, 1, 236, 112, 222, 191, 1, 244, 210, 222, 191, 1, 216, 152, + 222, 191, 1, 224, 190, 222, 191, 1, 223, 160, 222, 191, 1, 221, 30, 222, + 191, 1, 218, 62, 222, 191, 156, 236, 112, 222, 191, 156, 236, 111, 222, + 191, 156, 227, 144, 222, 191, 156, 249, 16, 222, 191, 59, 1, 245, 189, + 212, 174, 222, 191, 156, 245, 189, 212, 174, 222, 191, 30, 5, 187, 77, + 222, 191, 30, 5, 77, 222, 191, 30, 5, 227, 24, 255, 104, 222, 191, 30, 5, + 187, 255, 104, 222, 191, 30, 5, 255, 104, 222, 191, 30, 5, 227, 24, 63, + 222, 191, 30, 5, 187, 63, 222, 191, 30, 5, 63, 222, 191, 59, 1, 220, 196, + 63, 222, 191, 30, 5, 220, 196, 63, 222, 191, 30, 5, 187, 72, 222, 191, + 30, 5, 72, 222, 191, 59, 1, 75, 222, 191, 30, 5, 187, 75, 222, 191, 30, + 5, 75, 222, 191, 30, 5, 78, 222, 191, 30, 5, 219, 4, 222, 191, 156, 229, + 241, 222, 191, 225, 63, 229, 241, 222, 191, 225, 63, 254, 251, 222, 191, + 225, 63, 254, 150, 222, 191, 225, 63, 252, 160, 222, 191, 225, 63, 253, + 244, 222, 191, 225, 63, 220, 209, 222, 191, 255, 53, 79, 222, 191, 225, + 63, 231, 202, 224, 225, 222, 191, 225, 63, 212, 24, 222, 191, 225, 63, + 224, 225, 222, 191, 225, 63, 212, 107, 222, 191, 225, 63, 216, 62, 222, + 191, 225, 63, 254, 51, 222, 191, 225, 63, 220, 0, 232, 23, 222, 191, 225, + 63, 254, 138, 232, 60, 1, 242, 127, 232, 60, 1, 255, 57, 232, 60, 1, 254, + 249, 232, 60, 1, 255, 32, 232, 60, 1, 254, 242, 232, 60, 1, 215, 104, + 232, 60, 1, 253, 203, 232, 60, 1, 236, 19, 232, 60, 1, 253, 241, 232, 60, + 1, 254, 216, 232, 60, 1, 254, 221, 232, 60, 1, 254, 213, 232, 60, 1, 254, + 172, 232, 60, 1, 254, 159, 232, 60, 1, 254, 23, 232, 60, 1, 236, 112, + 232, 60, 1, 254, 110, 232, 60, 1, 253, 251, 232, 60, 1, 254, 86, 232, 60, + 1, 254, 82, 232, 60, 1, 254, 17, 232, 60, 1, 253, 249, 232, 60, 1, 246, + 131, 232, 60, 1, 235, 120, 232, 60, 1, 254, 231, 232, 60, 254, 255, 79, + 232, 60, 214, 121, 79, 232, 60, 243, 149, 79, 232, 60, 225, 62, 84, 5, + 236, 52, 251, 55, 84, 5, 251, 55, 84, 5, 254, 113, 84, 5, 214, 132, 84, + 1, 220, 196, 63, 84, 1, 63, 84, 1, 255, 104, 84, 1, 75, 84, 1, 236, 145, + 84, 1, 72, 84, 1, 215, 98, 84, 1, 165, 152, 84, 1, 165, 155, 84, 1, 251, + 58, 77, 84, 1, 220, 196, 77, 84, 1, 77, 84, 1, 254, 236, 84, 1, 251, 58, + 78, 84, 1, 220, 196, 78, 84, 1, 78, 84, 1, 253, 235, 84, 1, 183, 84, 1, + 234, 250, 84, 1, 243, 230, 84, 1, 243, 89, 84, 1, 229, 226, 84, 1, 251, + 88, 84, 1, 250, 215, 84, 1, 236, 0, 84, 1, 235, 230, 84, 1, 228, 64, 84, + 1, 216, 128, 84, 1, 216, 116, 84, 1, 248, 207, 84, 1, 248, 191, 84, 1, + 229, 6, 84, 1, 218, 66, 84, 1, 217, 174, 84, 1, 249, 30, 84, 1, 248, 97, + 84, 1, 207, 84, 1, 228, 246, 84, 1, 195, 84, 1, 226, 59, 84, 1, 252, 234, + 84, 1, 252, 65, 84, 1, 191, 84, 1, 189, 84, 1, 208, 84, 1, 223, 115, 84, + 1, 233, 255, 84, 1, 233, 54, 84, 1, 233, 45, 84, 1, 215, 8, 84, 1, 221, + 47, 84, 1, 219, 176, 84, 1, 222, 227, 84, 1, 162, 84, 30, 5, 227, 136, + 84, 30, 5, 227, 84, 84, 5, 228, 103, 84, 5, 253, 218, 84, 30, 5, 255, + 104, 84, 30, 5, 75, 84, 30, 5, 236, 145, 84, 30, 5, 72, 84, 30, 5, 215, + 98, 84, 30, 5, 165, 152, 84, 30, 5, 165, 223, 116, 84, 30, 5, 251, 58, + 77, 84, 30, 5, 220, 196, 77, 84, 30, 5, 77, 84, 30, 5, 254, 236, 84, 30, + 5, 251, 58, 78, 84, 30, 5, 220, 196, 78, 84, 30, 5, 78, 84, 30, 5, 253, + 235, 84, 5, 214, 137, 84, 30, 5, 225, 102, 77, 84, 30, 5, 253, 214, 84, + 227, 107, 84, 219, 65, 5, 215, 191, 84, 219, 65, 5, 254, 115, 84, 242, + 234, 255, 46, 84, 255, 36, 255, 46, 84, 30, 5, 251, 58, 187, 77, 84, 30, + 5, 215, 189, 84, 30, 5, 215, 97, 84, 1, 225, 11, 84, 1, 234, 233, 84, 1, + 243, 66, 84, 1, 212, 109, 84, 1, 248, 196, 84, 1, 223, 226, 84, 1, 245, + 29, 84, 1, 212, 160, 84, 1, 165, 223, 116, 84, 1, 165, 233, 55, 84, 30, + 5, 165, 155, 84, 30, 5, 165, 233, 55, 84, 248, 245, 84, 52, 248, 245, 84, + 21, 212, 79, 84, 21, 118, 84, 21, 112, 84, 21, 170, 84, 21, 167, 84, 21, + 185, 84, 21, 192, 84, 21, 200, 84, 21, 198, 84, 21, 203, 84, 255, 53, 53, + 84, 5, 127, 219, 224, 247, 195, 84, 1, 251, 58, 63, 84, 1, 227, 136, 84, + 1, 227, 84, 84, 1, 253, 214, 84, 1, 215, 189, 84, 1, 215, 97, 84, 1, 212, + 75, 84, 1, 110, 189, 84, 1, 243, 125, 84, 1, 235, 213, 84, 1, 243, 20, + 219, 83, 84, 1, 248, 197, 84, 1, 252, 157, 142, 5, 251, 55, 142, 5, 254, + 113, 142, 5, 214, 132, 142, 1, 63, 142, 1, 255, 104, 142, 1, 75, 142, 1, + 236, 145, 142, 1, 72, 142, 1, 215, 98, 142, 1, 165, 152, 142, 1, 165, + 155, 142, 1, 77, 142, 1, 254, 236, 142, 1, 78, 142, 1, 253, 235, 142, 1, + 183, 142, 1, 234, 250, 142, 1, 243, 230, 142, 1, 243, 89, 142, 1, 229, + 226, 142, 1, 251, 88, 142, 1, 250, 215, 142, 1, 236, 0, 142, 1, 235, 230, + 142, 1, 228, 64, 142, 1, 216, 128, 142, 1, 216, 116, 142, 1, 248, 207, + 142, 1, 248, 191, 142, 1, 229, 6, 142, 1, 218, 66, 142, 1, 217, 174, 142, + 1, 249, 30, 142, 1, 248, 97, 142, 1, 207, 142, 1, 195, 142, 1, 226, 59, + 142, 1, 252, 234, 142, 1, 252, 65, 142, 1, 191, 142, 1, 189, 142, 1, 208, + 142, 1, 233, 255, 142, 1, 221, 47, 142, 1, 219, 176, 142, 1, 222, 227, + 142, 1, 162, 142, 5, 228, 103, 142, 5, 253, 218, 142, 30, 5, 255, 104, + 142, 30, 5, 75, 142, 30, 5, 236, 145, 142, 30, 5, 72, 142, 30, 5, 215, + 98, 142, 30, 5, 165, 152, 142, 30, 5, 165, 223, 116, 142, 30, 5, 77, 142, + 30, 5, 254, 236, 142, 30, 5, 78, 142, 30, 5, 253, 235, 142, 5, 214, 137, + 142, 1, 234, 242, 218, 66, 142, 253, 236, 233, 145, 79, 142, 1, 223, 115, + 142, 1, 223, 226, 142, 1, 212, 160, 142, 1, 165, 223, 116, 142, 1, 165, + 233, 55, 142, 30, 5, 165, 155, 142, 30, 5, 165, 233, 55, 142, 21, 212, + 79, 142, 21, 118, 142, 21, 112, 142, 21, 170, 142, 21, 167, 142, 21, 185, + 142, 21, 192, 142, 21, 200, 142, 21, 198, 142, 21, 203, 142, 1, 224, 112, + 2, 231, 107, 248, 71, 142, 1, 224, 112, 2, 232, 237, 248, 71, 142, 223, + 55, 79, 142, 223, 55, 53, 142, 249, 162, 228, 96, 118, 142, 249, 162, + 228, 96, 112, 142, 249, 162, 228, 96, 170, 142, 249, 162, 228, 96, 167, + 142, 249, 162, 228, 96, 124, 233, 138, 217, 167, 217, 162, 248, 120, 142, + 249, 162, 248, 121, 220, 66, 142, 236, 20, 142, 243, 199, 79, 178, 5, + 255, 31, 252, 35, 178, 5, 252, 35, 178, 5, 214, 132, 178, 1, 63, 178, 1, + 255, 104, 178, 1, 75, 178, 1, 236, 145, 178, 1, 72, 178, 1, 215, 98, 178, + 1, 246, 30, 178, 1, 254, 236, 178, 1, 227, 86, 178, 1, 253, 235, 178, 1, + 183, 178, 1, 234, 250, 178, 1, 243, 230, 178, 1, 243, 89, 178, 1, 229, + 226, 178, 1, 251, 88, 178, 1, 250, 215, 178, 1, 236, 0, 178, 1, 235, 230, + 178, 1, 228, 64, 178, 1, 216, 128, 178, 1, 216, 116, 178, 1, 248, 207, + 178, 1, 248, 191, 178, 1, 229, 6, 178, 1, 218, 66, 178, 1, 217, 174, 178, + 1, 249, 30, 178, 1, 248, 97, 178, 1, 207, 178, 1, 195, 178, 1, 226, 59, + 178, 1, 252, 234, 178, 1, 252, 65, 178, 1, 191, 178, 1, 189, 178, 1, 208, + 178, 1, 233, 255, 178, 1, 233, 54, 178, 1, 215, 8, 178, 1, 221, 47, 178, + 1, 222, 227, 178, 1, 162, 178, 5, 228, 103, 178, 30, 5, 255, 104, 178, + 30, 5, 75, 178, 30, 5, 236, 145, 178, 30, 5, 72, 178, 30, 5, 215, 98, + 178, 30, 5, 246, 30, 178, 30, 5, 254, 236, 178, 30, 5, 227, 86, 178, 30, + 5, 253, 235, 178, 5, 214, 137, 178, 5, 215, 193, 178, 1, 234, 233, 178, + 1, 243, 66, 178, 1, 212, 109, 178, 1, 223, 115, 178, 1, 245, 29, 178, 21, + 212, 79, 178, 21, 118, 178, 21, 112, 178, 21, 170, 178, 21, 167, 178, 21, + 185, 178, 21, 192, 178, 21, 200, 178, 21, 198, 178, 21, 203, 178, 217, + 41, 178, 255, 30, 178, 236, 37, 178, 215, 123, 178, 246, 3, 227, 91, 178, + 5, 213, 69, 168, 5, 251, 55, 168, 5, 254, 113, 168, 5, 214, 132, 168, 1, + 63, 168, 1, 255, 104, 168, 1, 75, 168, 1, 236, 145, 168, 1, 72, 168, 1, + 215, 98, 168, 1, 165, 152, 168, 1, 165, 155, 168, 30, 251, 58, 77, 168, + 1, 77, 168, 1, 254, 236, 168, 30, 251, 58, 78, 168, 1, 78, 168, 1, 253, + 235, 168, 1, 183, 168, 1, 234, 250, 168, 1, 243, 230, 168, 1, 243, 89, + 168, 1, 229, 226, 168, 1, 251, 88, 168, 1, 250, 215, 168, 1, 236, 0, 168, + 1, 235, 230, 168, 1, 228, 64, 168, 1, 216, 128, 168, 1, 216, 116, 168, 1, + 248, 207, 168, 1, 248, 191, 168, 1, 229, 6, 168, 1, 218, 66, 168, 1, 217, + 174, 168, 1, 249, 30, 168, 1, 248, 97, 168, 1, 207, 168, 1, 195, 168, 1, + 226, 59, 168, 1, 252, 234, 168, 1, 252, 65, 168, 1, 191, 168, 1, 189, + 168, 1, 208, 168, 1, 233, 255, 168, 1, 233, 54, 168, 1, 215, 8, 168, 1, + 221, 47, 168, 1, 219, 176, 168, 1, 222, 227, 168, 1, 162, 168, 5, 228, + 103, 168, 5, 253, 218, 168, 30, 5, 255, 104, 168, 30, 5, 75, 168, 30, 5, + 236, 145, 168, 30, 5, 72, 168, 30, 5, 215, 98, 168, 30, 5, 165, 152, 168, + 30, 5, 165, 223, 116, 168, 30, 5, 251, 58, 77, 168, 30, 5, 77, 168, 30, + 5, 254, 236, 168, 30, 5, 251, 58, 78, 168, 30, 5, 78, 168, 30, 5, 253, + 235, 168, 5, 214, 137, 168, 227, 107, 168, 1, 165, 223, 116, 168, 1, 165, + 233, 55, 168, 30, 5, 165, 155, 168, 30, 5, 165, 233, 55, 168, 21, 212, + 79, 168, 21, 118, 168, 21, 112, 168, 21, 170, 168, 21, 167, 168, 21, 185, + 168, 21, 192, 168, 21, 200, 168, 21, 198, 168, 21, 203, 168, 223, 55, 53, + 151, 5, 251, 55, 151, 5, 254, 113, 151, 5, 214, 132, 151, 1, 63, 151, 1, + 255, 104, 151, 1, 75, 151, 1, 236, 145, 151, 1, 72, 151, 1, 215, 98, 151, + 1, 165, 152, 151, 1, 165, 155, 151, 1, 77, 151, 1, 254, 236, 151, 1, 78, + 151, 1, 253, 235, 151, 1, 183, 151, 1, 234, 250, 151, 1, 243, 230, 151, + 1, 243, 89, 151, 1, 229, 226, 151, 1, 251, 88, 151, 1, 250, 215, 151, 1, + 236, 0, 151, 1, 235, 230, 151, 1, 228, 64, 151, 1, 216, 128, 151, 1, 216, + 116, 151, 1, 248, 207, 151, 1, 248, 191, 151, 1, 229, 6, 151, 1, 218, 66, + 151, 1, 217, 174, 151, 1, 249, 30, 151, 1, 248, 97, 151, 1, 207, 151, 1, + 195, 151, 1, 226, 59, 151, 1, 252, 234, 151, 1, 252, 65, 151, 1, 191, + 151, 1, 189, 151, 1, 208, 151, 1, 233, 255, 151, 1, 233, 54, 151, 1, 215, + 8, 151, 1, 221, 47, 151, 1, 219, 176, 151, 1, 222, 227, 151, 1, 162, 151, + 5, 228, 103, 151, 5, 253, 218, 151, 30, 5, 255, 104, 151, 30, 5, 75, 151, + 30, 5, 236, 145, 151, 30, 5, 72, 151, 30, 5, 215, 98, 151, 30, 5, 165, + 152, 151, 30, 5, 165, 223, 116, 151, 30, 5, 77, 151, 30, 5, 254, 236, + 151, 30, 5, 78, 151, 30, 5, 253, 235, 151, 5, 214, 137, 151, 254, 237, + 233, 145, 79, 151, 253, 236, 233, 145, 79, 151, 1, 223, 115, 151, 1, 223, + 226, 151, 1, 212, 160, 151, 1, 165, 223, 116, 151, 1, 165, 233, 55, 151, + 30, 5, 165, 155, 151, 30, 5, 165, 233, 55, 151, 21, 212, 79, 151, 21, + 118, 151, 21, 112, 151, 21, 170, 151, 21, 167, 151, 21, 185, 151, 21, + 192, 151, 21, 200, 151, 21, 198, 151, 21, 203, 151, 236, 20, 151, 1, 214, + 52, 151, 244, 92, 124, 224, 201, 151, 244, 92, 124, 242, 129, 151, 244, + 92, 137, 224, 199, 151, 244, 92, 124, 220, 64, 151, 244, 92, 124, 246, + 10, 151, 244, 92, 137, 220, 63, 36, 5, 254, 113, 36, 5, 214, 132, 36, 1, + 63, 36, 1, 255, 104, 36, 1, 75, 36, 1, 236, 145, 36, 1, 72, 36, 1, 215, + 98, 36, 1, 77, 36, 1, 246, 30, 36, 1, 254, 236, 36, 1, 78, 36, 1, 227, + 86, 36, 1, 253, 235, 36, 1, 183, 36, 1, 229, 226, 36, 1, 251, 88, 36, 1, + 236, 0, 36, 1, 228, 64, 36, 1, 216, 128, 36, 1, 229, 6, 36, 1, 218, 66, + 36, 1, 207, 36, 1, 228, 246, 36, 1, 195, 36, 1, 191, 36, 1, 189, 36, 1, + 208, 36, 1, 223, 115, 36, 1, 233, 255, 36, 1, 233, 54, 36, 1, 233, 45, + 36, 1, 215, 8, 36, 1, 221, 47, 36, 1, 219, 176, 36, 1, 222, 227, 36, 1, + 162, 36, 30, 5, 255, 104, 36, 30, 5, 75, 36, 30, 5, 236, 145, 36, 30, 5, + 72, 36, 30, 5, 215, 98, 36, 30, 5, 77, 36, 30, 5, 246, 30, 36, 30, 5, + 254, 236, 36, 30, 5, 78, 36, 30, 5, 227, 86, 36, 30, 5, 253, 235, 36, 5, + 214, 137, 36, 227, 107, 36, 253, 236, 233, 145, 79, 36, 21, 212, 79, 36, + 21, 118, 36, 21, 112, 36, 21, 170, 36, 21, 167, 36, 21, 185, 36, 21, 192, + 36, 21, 200, 36, 21, 198, 36, 21, 203, 36, 51, 217, 213, 36, 51, 124, + 241, 62, 36, 51, 124, 217, 113, 36, 248, 213, 53, 36, 231, 19, 53, 36, + 213, 37, 53, 36, 248, 159, 53, 36, 249, 202, 53, 36, 254, 24, 74, 53, 36, + 223, 55, 53, 36, 51, 53, 145, 5, 251, 55, 145, 5, 254, 113, 145, 5, 214, + 132, 145, 1, 63, 145, 1, 255, 104, 145, 1, 75, 145, 1, 236, 145, 145, 1, + 72, 145, 1, 215, 98, 145, 1, 165, 152, 145, 1, 165, 155, 145, 1, 77, 145, + 1, 246, 30, 145, 1, 254, 236, 145, 1, 78, 145, 1, 227, 86, 145, 1, 253, + 235, 145, 1, 183, 145, 1, 234, 250, 145, 1, 243, 230, 145, 1, 243, 89, + 145, 1, 229, 226, 145, 1, 251, 88, 145, 1, 250, 215, 145, 1, 236, 0, 145, + 1, 235, 230, 145, 1, 228, 64, 145, 1, 216, 128, 145, 1, 216, 116, 145, 1, + 248, 207, 145, 1, 248, 191, 145, 1, 229, 6, 145, 1, 218, 66, 145, 1, 217, + 174, 145, 1, 249, 30, 145, 1, 248, 97, 145, 1, 207, 145, 1, 195, 145, 1, + 226, 59, 145, 1, 252, 234, 145, 1, 252, 65, 145, 1, 191, 145, 1, 189, + 145, 1, 208, 145, 1, 223, 115, 145, 1, 233, 255, 145, 1, 233, 54, 145, 1, + 215, 8, 145, 1, 221, 47, 145, 1, 219, 176, 145, 1, 222, 227, 145, 1, 162, + 145, 5, 253, 218, 145, 30, 5, 255, 104, 145, 30, 5, 75, 145, 30, 5, 236, + 145, 145, 30, 5, 72, 145, 30, 5, 215, 98, 145, 30, 5, 165, 152, 145, 30, + 5, 165, 223, 116, 145, 30, 5, 77, 145, 30, 5, 246, 30, 145, 30, 5, 254, + 236, 145, 30, 5, 78, 145, 30, 5, 227, 86, 145, 30, 5, 253, 235, 145, 5, + 214, 137, 145, 233, 145, 79, 145, 254, 237, 233, 145, 79, 145, 1, 216, + 154, 145, 1, 246, 114, 145, 1, 165, 223, 116, 145, 1, 165, 233, 55, 145, + 30, 5, 165, 155, 145, 30, 5, 165, 233, 55, 145, 21, 212, 79, 145, 21, + 118, 145, 21, 112, 145, 21, 170, 145, 21, 167, 145, 21, 185, 145, 21, + 192, 145, 21, 200, 145, 21, 198, 145, 21, 203, 145, 244, 92, 21, 212, 80, + 31, 227, 139, 225, 139, 68, 167, 145, 244, 92, 21, 124, 31, 227, 139, + 225, 139, 68, 167, 145, 244, 92, 21, 119, 31, 227, 139, 225, 139, 68, + 167, 145, 244, 92, 21, 137, 31, 227, 139, 225, 139, 68, 167, 145, 244, + 92, 21, 124, 31, 245, 130, 225, 139, 68, 167, 145, 244, 92, 21, 119, 31, + 245, 130, 225, 139, 68, 167, 145, 244, 92, 21, 137, 31, 245, 130, 225, + 139, 68, 167, 145, 5, 216, 56, 158, 5, 254, 113, 158, 5, 214, 132, 158, + 1, 63, 158, 1, 255, 104, 158, 1, 75, 158, 1, 236, 145, 158, 1, 72, 158, + 1, 215, 98, 158, 1, 165, 152, 158, 1, 165, 155, 158, 1, 77, 158, 1, 246, + 30, 158, 1, 254, 236, 158, 1, 78, 158, 1, 227, 86, 158, 1, 253, 235, 158, + 1, 183, 158, 1, 234, 250, 158, 1, 243, 230, 158, 1, 243, 89, 158, 1, 229, + 226, 158, 1, 251, 88, 158, 1, 250, 215, 158, 1, 236, 0, 158, 1, 235, 230, + 158, 1, 228, 64, 158, 1, 216, 128, 158, 1, 216, 116, 158, 1, 248, 207, + 158, 1, 248, 191, 158, 1, 229, 6, 158, 1, 218, 66, 158, 1, 217, 174, 158, + 1, 249, 30, 158, 1, 248, 97, 158, 1, 207, 158, 1, 195, 158, 1, 226, 59, + 158, 1, 252, 234, 158, 1, 252, 65, 158, 1, 191, 158, 1, 189, 158, 1, 208, + 158, 1, 223, 115, 158, 1, 233, 255, 158, 1, 233, 54, 158, 1, 215, 8, 158, + 1, 221, 47, 158, 1, 219, 176, 158, 1, 222, 227, 158, 1, 162, 158, 5, 228, + 103, 158, 5, 253, 218, 158, 30, 5, 255, 104, 158, 30, 5, 75, 158, 30, 5, + 236, 145, 158, 30, 5, 72, 158, 30, 5, 215, 98, 158, 30, 5, 165, 152, 158, + 30, 5, 165, 223, 116, 158, 30, 5, 77, 158, 30, 5, 246, 30, 158, 30, 5, + 254, 236, 158, 30, 5, 78, 158, 30, 5, 227, 86, 158, 30, 5, 253, 235, 158, + 5, 214, 137, 158, 233, 145, 79, 158, 254, 237, 233, 145, 79, 158, 1, 245, + 29, 158, 1, 165, 223, 116, 158, 1, 165, 233, 55, 158, 30, 5, 165, 155, + 158, 30, 5, 165, 233, 55, 158, 21, 212, 79, 158, 21, 118, 158, 21, 112, + 158, 21, 170, 158, 21, 167, 158, 21, 185, 158, 21, 192, 158, 21, 200, + 158, 21, 198, 158, 21, 203, 158, 5, 235, 219, 158, 5, 215, 138, 132, 5, + 254, 113, 132, 5, 214, 132, 132, 1, 63, 132, 1, 255, 104, 132, 1, 75, + 132, 1, 236, 145, 132, 1, 72, 132, 1, 215, 98, 132, 1, 165, 152, 132, 1, + 165, 155, 132, 1, 77, 132, 1, 246, 30, 132, 1, 254, 236, 132, 1, 78, 132, + 1, 227, 86, 132, 1, 253, 235, 132, 1, 183, 132, 1, 234, 250, 132, 1, 243, + 230, 132, 1, 243, 89, 132, 1, 229, 226, 132, 1, 251, 88, 132, 1, 250, + 215, 132, 1, 236, 0, 132, 1, 235, 230, 132, 1, 228, 64, 132, 1, 216, 128, + 132, 1, 216, 116, 132, 1, 248, 207, 132, 1, 248, 191, 132, 1, 229, 6, + 132, 1, 218, 66, 132, 1, 217, 174, 132, 1, 249, 30, 132, 1, 248, 97, 132, + 1, 207, 132, 1, 228, 246, 132, 1, 195, 132, 1, 226, 59, 132, 1, 252, 234, + 132, 1, 252, 65, 132, 1, 191, 132, 1, 189, 132, 1, 208, 132, 1, 223, 115, + 132, 1, 233, 255, 132, 1, 233, 54, 132, 1, 233, 45, 132, 1, 215, 8, 132, + 1, 221, 47, 132, 1, 219, 176, 132, 1, 222, 227, 132, 1, 162, 132, 1, 216, + 97, 132, 5, 253, 218, 132, 30, 5, 255, 104, 132, 30, 5, 75, 132, 30, 5, + 236, 145, 132, 30, 5, 72, 132, 30, 5, 215, 98, 132, 30, 5, 165, 152, 132, + 30, 5, 165, 223, 116, 132, 30, 5, 77, 132, 30, 5, 246, 30, 132, 30, 5, + 254, 236, 132, 30, 5, 78, 132, 30, 5, 227, 86, 132, 30, 5, 253, 235, 132, + 5, 214, 137, 132, 1, 62, 224, 3, 132, 253, 236, 233, 145, 79, 132, 1, + 165, 223, 116, 132, 1, 165, 233, 55, 132, 30, 5, 165, 155, 132, 30, 5, + 165, 233, 55, 132, 21, 212, 79, 132, 21, 118, 132, 21, 112, 132, 21, 170, + 132, 21, 167, 132, 21, 185, 132, 21, 192, 132, 21, 200, 132, 21, 198, + 132, 21, 203, 132, 51, 217, 213, 132, 51, 124, 241, 62, 132, 51, 124, + 217, 113, 132, 244, 92, 124, 224, 201, 132, 244, 92, 124, 242, 129, 132, + 244, 92, 137, 224, 199, 132, 248, 217, 79, 132, 1, 250, 159, 229, 7, 132, + 1, 250, 159, 206, 132, 1, 250, 159, 223, 116, 132, 1, 250, 159, 155, 132, + 1, 250, 159, 233, 55, 132, 1, 250, 159, 235, 141, 176, 5, 254, 112, 176, + 5, 214, 131, 176, 1, 253, 208, 176, 1, 255, 59, 176, 1, 255, 0, 176, 1, + 255, 15, 176, 1, 236, 10, 176, 1, 236, 144, 176, 1, 215, 90, 176, 1, 215, + 92, 176, 1, 236, 32, 176, 1, 236, 33, 176, 1, 236, 130, 176, 1, 236, 132, + 176, 1, 245, 106, 176, 1, 246, 26, 176, 1, 254, 223, 176, 1, 227, 14, + 176, 1, 227, 80, 176, 1, 253, 221, 176, 1, 254, 182, 235, 49, 176, 1, + 232, 87, 235, 49, 176, 1, 254, 182, 243, 178, 176, 1, 232, 87, 243, 178, + 176, 1, 235, 91, 230, 109, 176, 1, 222, 176, 243, 178, 176, 1, 254, 182, + 251, 16, 176, 1, 232, 87, 251, 16, 176, 1, 254, 182, 235, 243, 176, 1, + 232, 87, 235, 243, 176, 1, 218, 60, 230, 109, 176, 1, 218, 60, 222, 175, + 230, 110, 176, 1, 222, 176, 235, 243, 176, 1, 254, 182, 216, 124, 176, 1, + 232, 87, 216, 124, 176, 1, 254, 182, 248, 198, 176, 1, 232, 87, 248, 198, + 176, 1, 230, 193, 230, 69, 176, 1, 222, 176, 248, 198, 176, 1, 254, 182, + 217, 250, 176, 1, 232, 87, 217, 250, 176, 1, 254, 182, 248, 211, 176, 1, + 232, 87, 248, 211, 176, 1, 248, 241, 230, 69, 176, 1, 222, 176, 248, 211, + 176, 1, 254, 182, 226, 138, 176, 1, 232, 87, 226, 138, 176, 1, 254, 182, + 252, 158, 176, 1, 232, 87, 252, 158, 176, 1, 232, 9, 176, 1, 254, 167, + 252, 158, 176, 1, 213, 43, 176, 1, 224, 60, 176, 1, 248, 241, 233, 189, + 176, 1, 214, 239, 176, 1, 218, 60, 222, 151, 176, 1, 230, 193, 222, 151, + 176, 1, 248, 241, 222, 151, 176, 1, 242, 89, 176, 1, 230, 193, 233, 189, + 176, 1, 244, 245, 176, 5, 254, 212, 176, 30, 5, 255, 10, 176, 30, 5, 235, + 17, 255, 17, 176, 30, 5, 248, 45, 255, 17, 176, 30, 5, 235, 17, 236, 29, + 176, 30, 5, 248, 45, 236, 29, 176, 30, 5, 235, 17, 226, 250, 176, 30, 5, + 248, 45, 226, 250, 176, 30, 5, 243, 219, 176, 30, 5, 234, 135, 176, 30, + 5, 248, 45, 234, 135, 176, 30, 5, 234, 137, 248, 139, 176, 30, 5, 234, + 136, 242, 149, 255, 10, 176, 30, 5, 234, 136, 242, 149, 248, 45, 255, 10, + 176, 30, 5, 234, 136, 242, 149, 243, 177, 176, 30, 5, 243, 177, 176, 30, + 5, 248, 45, 243, 219, 176, 30, 5, 248, 45, 243, 177, 176, 225, 63, 234, + 71, 160, 143, 234, 149, 235, 108, 160, 143, 234, 225, 234, 246, 160, 143, + 234, 225, 234, 218, 160, 143, 234, 225, 234, 215, 160, 143, 234, 225, + 234, 222, 160, 143, 234, 225, 224, 81, 160, 143, 229, 156, 229, 143, 160, + 143, 250, 147, 250, 206, 160, 143, 250, 147, 250, 155, 160, 143, 250, + 147, 250, 205, 160, 143, 220, 6, 220, 5, 160, 143, 250, 147, 250, 143, + 160, 143, 212, 237, 212, 244, 160, 143, 247, 221, 250, 212, 160, 143, + 217, 10, 226, 148, 160, 143, 217, 123, 217, 166, 160, 143, 217, 123, 230, + 89, 160, 143, 217, 123, 226, 23, 160, 143, 228, 229, 229, 247, 160, 143, + 247, 221, 248, 140, 160, 143, 217, 10, 218, 19, 160, 143, 217, 123, 217, + 98, 160, 143, 217, 123, 217, 170, 160, 143, 217, 123, 217, 120, 160, 143, + 228, 229, 228, 135, 160, 143, 251, 254, 252, 210, 160, 143, 225, 187, + 225, 210, 160, 143, 226, 34, 226, 25, 160, 143, 244, 133, 245, 29, 160, + 143, 226, 34, 226, 53, 160, 143, 244, 133, 245, 6, 160, 143, 226, 34, + 222, 186, 160, 143, 231, 46, 191, 160, 143, 212, 237, 213, 70, 160, 143, + 223, 147, 223, 76, 160, 143, 223, 77, 160, 143, 233, 27, 233, 76, 160, + 143, 232, 230, 160, 143, 213, 218, 214, 48, 160, 143, 220, 6, 222, 201, + 160, 143, 220, 6, 223, 51, 160, 143, 220, 6, 219, 40, 160, 143, 241, 174, + 242, 8, 160, 143, 233, 27, 250, 128, 160, 143, 141, 254, 151, 160, 143, + 241, 174, 228, 224, 160, 143, 226, 232, 160, 143, 222, 170, 63, 160, 143, + 232, 82, 242, 120, 160, 143, 222, 170, 255, 104, 160, 143, 222, 170, 254, + 172, 160, 143, 222, 170, 75, 160, 143, 222, 170, 236, 145, 160, 143, 222, + 170, 215, 189, 160, 143, 222, 170, 215, 187, 160, 143, 222, 170, 72, 160, + 143, 222, 170, 215, 98, 160, 143, 226, 36, 160, 249, 162, 16, 252, 211, + 160, 143, 222, 170, 77, 160, 143, 222, 170, 255, 20, 160, 143, 222, 170, + 78, 160, 143, 222, 170, 254, 237, 232, 76, 160, 143, 222, 170, 254, 237, + 232, 77, 160, 143, 233, 228, 160, 143, 232, 73, 160, 143, 232, 74, 160, + 143, 232, 82, 246, 2, 160, 143, 232, 82, 217, 122, 160, 143, 232, 82, + 216, 199, 160, 143, 232, 82, 250, 194, 160, 143, 217, 164, 160, 143, 229, + 100, 160, 143, 213, 64, 160, 143, 244, 124, 160, 21, 212, 79, 160, 21, + 118, 160, 21, 112, 160, 21, 170, 160, 21, 167, 160, 21, 185, 160, 21, + 192, 160, 21, 200, 160, 21, 198, 160, 21, 203, 160, 143, 254, 147, 160, + 143, 234, 223, 202, 1, 234, 148, 202, 1, 234, 225, 218, 249, 202, 1, 234, + 225, 218, 26, 202, 1, 229, 155, 202, 1, 250, 42, 202, 1, 220, 6, 218, 26, + 202, 1, 228, 35, 202, 1, 247, 220, 202, 1, 109, 202, 1, 217, 123, 218, + 249, 202, 1, 217, 123, 218, 26, 202, 1, 228, 228, 202, 1, 251, 253, 202, + 1, 225, 186, 202, 1, 226, 34, 218, 249, 202, 1, 244, 133, 218, 26, 202, + 1, 226, 34, 218, 26, 202, 1, 244, 133, 218, 249, 202, 1, 231, 45, 202, 1, + 212, 236, 202, 1, 233, 27, 233, 76, 202, 1, 233, 27, 232, 250, 202, 1, + 213, 217, 202, 1, 220, 6, 218, 249, 202, 1, 241, 174, 218, 249, 202, 1, + 78, 202, 1, 241, 174, 218, 26, 202, 245, 241, 202, 30, 5, 63, 202, 30, 5, + 232, 82, 235, 96, 202, 30, 5, 255, 104, 202, 30, 5, 254, 172, 202, 30, 5, + 75, 202, 30, 5, 236, 145, 202, 30, 5, 213, 108, 202, 30, 5, 212, 161, + 202, 30, 5, 72, 202, 30, 5, 215, 98, 202, 30, 5, 232, 82, 234, 133, 202, + 221, 88, 5, 233, 26, 202, 221, 88, 5, 228, 35, 202, 30, 5, 77, 202, 30, + 5, 246, 17, 202, 30, 5, 78, 202, 30, 5, 253, 210, 202, 30, 5, 254, 236, + 202, 234, 149, 233, 255, 202, 161, 232, 82, 246, 2, 202, 161, 232, 82, + 217, 122, 202, 161, 232, 82, 217, 84, 202, 161, 232, 82, 251, 23, 202, + 251, 60, 79, 202, 229, 109, 202, 21, 212, 79, 202, 21, 118, 202, 21, 112, + 202, 21, 170, 202, 21, 167, 202, 21, 185, 202, 21, 192, 202, 21, 200, + 202, 21, 198, 202, 21, 203, 202, 241, 174, 228, 228, 202, 241, 174, 231, + 45, 61, 3, 227, 107, 61, 156, 242, 215, 212, 248, 231, 129, 216, 160, 63, + 61, 156, 242, 215, 212, 248, 231, 129, 255, 190, 223, 151, 252, 123, 191, + 61, 156, 242, 215, 212, 248, 231, 129, 255, 190, 242, 215, 216, 144, 191, + 61, 156, 73, 212, 248, 231, 129, 231, 228, 191, 61, 156, 250, 56, 212, + 248, 231, 129, 221, 53, 191, 61, 156, 251, 39, 212, 248, 231, 129, 226, + 24, 221, 41, 191, 61, 156, 212, 248, 231, 129, 216, 144, 221, 41, 191, + 61, 156, 222, 149, 221, 40, 61, 156, 251, 182, 212, 248, 231, 128, 61, + 156, 252, 15, 220, 204, 212, 248, 231, 128, 61, 156, 236, 55, 216, 143, + 61, 156, 248, 133, 216, 144, 251, 181, 61, 156, 221, 40, 61, 156, 228, + 40, 221, 40, 61, 156, 216, 144, 221, 40, 61, 156, 228, 40, 216, 144, 221, + 40, 61, 156, 223, 167, 250, 182, 219, 187, 221, 40, 61, 156, 223, 229, + 242, 242, 221, 40, 61, 156, 251, 39, 255, 194, 223, 81, 231, 227, 187, + 251, 63, 61, 156, 242, 215, 216, 143, 61, 233, 15, 5, 250, 213, 223, 80, + 61, 233, 15, 5, 233, 121, 223, 80, 61, 253, 255, 5, 221, 50, 243, 161, + 255, 195, 223, 80, 61, 253, 255, 5, 255, 192, 195, 61, 253, 255, 5, 222, + 124, 216, 139, 61, 5, 224, 57, 247, 232, 243, 160, 61, 5, 224, 57, 247, + 232, 243, 16, 61, 5, 224, 57, 247, 232, 242, 216, 61, 5, 224, 57, 230, + 106, 243, 160, 61, 5, 224, 57, 230, 106, 243, 16, 61, 5, 224, 57, 247, + 232, 224, 57, 230, 105, 61, 21, 212, 79, 61, 21, 118, 61, 21, 112, 61, + 21, 170, 61, 21, 167, 61, 21, 185, 61, 21, 192, 61, 21, 200, 61, 21, 198, + 61, 21, 203, 61, 21, 157, 118, 61, 21, 157, 112, 61, 21, 157, 170, 61, + 21, 157, 167, 61, 21, 157, 185, 61, 21, 157, 192, 61, 21, 157, 200, 61, + 21, 157, 198, 61, 21, 157, 203, 61, 21, 157, 212, 79, 61, 156, 251, 184, + 223, 80, 61, 156, 229, 218, 251, 123, 228, 50, 212, 18, 61, 156, 251, 39, + 255, 194, 223, 81, 251, 124, 231, 85, 251, 63, 61, 156, 229, 218, 251, + 123, 221, 51, 223, 80, 61, 156, 250, 191, 231, 128, 61, 156, 216, 155, + 255, 191, 61, 156, 242, 202, 223, 81, 242, 165, 61, 156, 242, 202, 223, + 81, 242, 171, 61, 156, 254, 152, 234, 241, 242, 165, 61, 156, 254, 152, + 234, 241, 242, 171, 61, 5, 213, 57, 216, 142, 61, 5, 232, 45, 216, 142, + 61, 1, 183, 61, 1, 234, 250, 61, 1, 243, 230, 61, 1, 243, 89, 61, 1, 229, + 226, 61, 1, 251, 88, 61, 1, 250, 215, 61, 1, 236, 0, 61, 1, 228, 64, 61, + 1, 216, 128, 61, 1, 216, 116, 61, 1, 248, 207, 61, 1, 248, 191, 61, 1, + 229, 6, 61, 1, 218, 66, 61, 1, 217, 174, 61, 1, 249, 30, 61, 1, 248, 97, + 61, 1, 207, 61, 1, 195, 61, 1, 226, 59, 61, 1, 252, 234, 61, 1, 252, 65, + 61, 1, 191, 61, 1, 216, 154, 61, 1, 216, 146, 61, 1, 246, 114, 61, 1, + 246, 109, 61, 1, 214, 52, 61, 1, 212, 75, 61, 1, 212, 109, 61, 1, 255, + 197, 61, 1, 189, 61, 1, 208, 61, 1, 233, 255, 61, 1, 221, 47, 61, 1, 219, + 176, 61, 1, 222, 227, 61, 1, 162, 61, 1, 63, 61, 1, 234, 95, 61, 1, 244, + 166, 208, 61, 1, 234, 166, 61, 1, 223, 115, 61, 30, 5, 255, 104, 61, 30, + 5, 75, 61, 30, 5, 236, 145, 61, 30, 5, 72, 61, 30, 5, 215, 98, 61, 30, 5, + 165, 152, 61, 30, 5, 165, 223, 116, 61, 30, 5, 165, 155, 61, 30, 5, 165, + 233, 55, 61, 30, 5, 77, 61, 30, 5, 246, 30, 61, 30, 5, 78, 61, 30, 5, + 227, 86, 61, 5, 223, 152, 219, 42, 229, 227, 223, 146, 61, 5, 223, 151, + 252, 122, 61, 30, 5, 223, 236, 75, 61, 30, 5, 223, 236, 236, 145, 61, 5, + 228, 50, 212, 19, 230, 113, 249, 30, 61, 5, 220, 18, 233, 182, 61, 156, + 242, 131, 61, 156, 226, 221, 61, 5, 233, 185, 223, 80, 61, 5, 213, 61, + 223, 80, 61, 5, 233, 186, 216, 155, 251, 63, 61, 5, 231, 229, 251, 63, + 61, 5, 242, 218, 251, 64, 223, 227, 61, 5, 242, 218, 231, 220, 223, 227, + 61, 5, 236, 52, 231, 229, 251, 63, 61, 219, 32, 5, 233, 186, 216, 155, + 251, 63, 61, 219, 32, 5, 231, 229, 251, 63, 61, 219, 32, 5, 236, 52, 231, + 229, 251, 63, 61, 219, 32, 1, 183, 61, 219, 32, 1, 234, 250, 61, 219, 32, + 1, 243, 230, 61, 219, 32, 1, 243, 89, 61, 219, 32, 1, 229, 226, 61, 219, + 32, 1, 251, 88, 61, 219, 32, 1, 250, 215, 61, 219, 32, 1, 236, 0, 61, + 219, 32, 1, 228, 64, 61, 219, 32, 1, 216, 128, 61, 219, 32, 1, 216, 116, + 61, 219, 32, 1, 248, 207, 61, 219, 32, 1, 248, 191, 61, 219, 32, 1, 229, + 6, 61, 219, 32, 1, 218, 66, 61, 219, 32, 1, 217, 174, 61, 219, 32, 1, + 249, 30, 61, 219, 32, 1, 248, 97, 61, 219, 32, 1, 207, 61, 219, 32, 1, + 195, 61, 219, 32, 1, 226, 59, 61, 219, 32, 1, 252, 234, 61, 219, 32, 1, + 252, 65, 61, 219, 32, 1, 191, 61, 219, 32, 1, 216, 154, 61, 219, 32, 1, + 216, 146, 61, 219, 32, 1, 246, 114, 61, 219, 32, 1, 246, 109, 61, 219, + 32, 1, 214, 52, 61, 219, 32, 1, 212, 75, 61, 219, 32, 1, 212, 109, 61, + 219, 32, 1, 255, 197, 61, 219, 32, 1, 189, 61, 219, 32, 1, 208, 61, 219, + 32, 1, 233, 255, 61, 219, 32, 1, 221, 47, 61, 219, 32, 1, 219, 176, 61, + 219, 32, 1, 222, 227, 61, 219, 32, 1, 162, 61, 219, 32, 1, 63, 61, 219, + 32, 1, 234, 95, 61, 219, 32, 1, 244, 166, 214, 52, 61, 219, 32, 1, 244, + 166, 189, 61, 219, 32, 1, 244, 166, 208, 61, 234, 82, 223, 78, 234, 250, + 61, 234, 82, 223, 78, 234, 251, 251, 124, 231, 85, 251, 63, 61, 251, 52, + 5, 110, 252, 116, 61, 251, 52, 5, 182, 252, 116, 61, 251, 52, 5, 251, 53, + 217, 241, 61, 251, 52, 5, 222, 148, 255, 196, 61, 16, 246, 167, 251, 179, + 61, 16, 224, 56, 223, 153, 61, 16, 226, 240, 243, 159, 61, 16, 224, 56, + 223, 154, 223, 229, 242, 241, 61, 16, 226, 24, 195, 61, 16, 228, 213, + 251, 179, 61, 16, 228, 213, 251, 180, 228, 40, 255, 193, 61, 16, 228, + 213, 251, 180, 242, 217, 255, 193, 61, 16, 228, 213, 251, 180, 251, 124, + 255, 193, 61, 5, 224, 57, 230, 106, 224, 57, 247, 231, 61, 5, 224, 57, + 230, 106, 242, 216, 61, 156, 251, 183, 220, 204, 243, 55, 231, 129, 223, + 228, 61, 156, 231, 47, 212, 248, 243, 55, 231, 129, 223, 228, 61, 156, + 228, 40, 216, 143, 61, 156, 73, 251, 204, 223, 148, 212, 248, 231, 129, + 231, 228, 191, 61, 156, 250, 56, 251, 204, 223, 148, 212, 248, 231, 129, + 221, 53, 191, 223, 181, 218, 214, 53, 233, 167, 218, 214, 53, 223, 181, + 218, 214, 5, 2, 247, 193, 233, 167, 218, 214, 5, 2, 247, 193, 61, 156, + 233, 177, 231, 230, 223, 80, 61, 156, 216, 220, 231, 230, 223, 80, 65, 1, + 183, 65, 1, 234, 250, 65, 1, 243, 230, 65, 1, 243, 89, 65, 1, 229, 226, + 65, 1, 251, 88, 65, 1, 250, 215, 65, 1, 236, 0, 65, 1, 235, 230, 65, 1, + 228, 64, 65, 1, 228, 230, 65, 1, 216, 128, 65, 1, 216, 116, 65, 1, 248, + 207, 65, 1, 248, 191, 65, 1, 229, 6, 65, 1, 218, 66, 65, 1, 217, 174, 65, + 1, 249, 30, 65, 1, 248, 97, 65, 1, 207, 65, 1, 195, 65, 1, 226, 59, 65, + 1, 252, 234, 65, 1, 252, 65, 65, 1, 191, 65, 1, 189, 65, 1, 208, 65, 1, + 233, 255, 65, 1, 214, 52, 65, 1, 222, 227, 65, 1, 162, 65, 1, 233, 54, + 65, 1, 63, 65, 1, 221, 31, 63, 65, 1, 75, 65, 1, 236, 145, 65, 1, 72, 65, + 1, 215, 98, 65, 1, 77, 65, 1, 231, 35, 77, 65, 1, 78, 65, 1, 253, 235, + 65, 30, 5, 218, 28, 255, 104, 65, 30, 5, 255, 104, 65, 30, 5, 75, 65, 30, + 5, 236, 145, 65, 30, 5, 72, 65, 30, 5, 215, 98, 65, 30, 5, 77, 65, 30, 5, + 254, 236, 65, 30, 5, 231, 35, 236, 145, 65, 30, 5, 231, 35, 78, 65, 30, + 5, 154, 50, 65, 5, 254, 113, 65, 5, 62, 55, 65, 5, 214, 132, 65, 5, 214, + 137, 65, 5, 254, 21, 65, 120, 5, 144, 189, 65, 120, 5, 144, 208, 65, 120, + 5, 144, 214, 52, 65, 120, 5, 144, 162, 65, 1, 242, 230, 222, 227, 65, 21, + 212, 79, 65, 21, 118, 65, 21, 112, 65, 21, 170, 65, 21, 167, 65, 21, 185, + 65, 21, 192, 65, 21, 200, 65, 21, 198, 65, 21, 203, 65, 5, 233, 62, 222, + 114, 65, 5, 222, 114, 65, 16, 233, 23, 65, 16, 250, 18, 65, 16, 254, 253, + 65, 16, 243, 144, 65, 1, 221, 47, 65, 1, 219, 176, 65, 1, 165, 152, 65, + 1, 165, 223, 116, 65, 1, 165, 155, 65, 1, 165, 233, 55, 65, 30, 5, 165, + 152, 65, 30, 5, 165, 223, 116, 65, 30, 5, 165, 155, 65, 30, 5, 165, 233, + 55, 65, 1, 231, 35, 229, 226, 65, 1, 231, 35, 235, 230, 65, 1, 231, 35, + 252, 157, 65, 1, 231, 35, 252, 152, 65, 120, 5, 231, 35, 144, 207, 65, + 120, 5, 231, 35, 144, 191, 65, 120, 5, 231, 35, 144, 233, 255, 65, 1, + 221, 52, 235, 75, 221, 47, 65, 30, 5, 221, 52, 235, 75, 245, 143, 65, + 161, 156, 221, 52, 235, 75, 242, 94, 65, 161, 156, 221, 52, 235, 75, 235, + 45, 226, 33, 65, 1, 213, 251, 225, 31, 235, 75, 217, 174, 65, 1, 213, + 251, 225, 31, 235, 75, 225, 37, 65, 30, 5, 213, 251, 225, 31, 235, 75, + 245, 143, 65, 30, 5, 213, 251, 225, 31, 235, 75, 215, 189, 65, 5, 213, + 251, 225, 31, 235, 75, 216, 253, 65, 5, 213, 251, 225, 31, 235, 75, 216, + 252, 65, 5, 213, 251, 225, 31, 235, 75, 216, 251, 65, 5, 213, 251, 225, + 31, 235, 75, 216, 250, 65, 5, 213, 251, 225, 31, 235, 75, 216, 249, 65, + 1, 246, 40, 225, 31, 235, 75, 229, 6, 65, 1, 246, 40, 225, 31, 235, 75, + 212, 168, 65, 1, 246, 40, 225, 31, 235, 75, 243, 57, 65, 30, 5, 243, 155, + 235, 75, 75, 65, 30, 5, 235, 50, 227, 136, 65, 30, 5, 235, 50, 72, 65, + 30, 5, 235, 50, 246, 30, 65, 1, 221, 31, 183, 65, 1, 221, 31, 234, 250, + 65, 1, 221, 31, 243, 230, 65, 1, 221, 31, 251, 88, 65, 1, 221, 31, 212, + 109, 65, 1, 221, 31, 228, 64, 65, 1, 221, 31, 249, 30, 65, 1, 221, 31, + 207, 65, 1, 221, 31, 226, 59, 65, 1, 221, 31, 245, 29, 65, 1, 221, 31, + 252, 234, 65, 1, 221, 31, 217, 174, 65, 1, 221, 31, 162, 65, 120, 5, 221, + 31, 144, 214, 52, 65, 30, 5, 221, 31, 255, 104, 65, 30, 5, 221, 31, 77, + 65, 30, 5, 221, 31, 154, 50, 65, 30, 5, 221, 31, 41, 213, 108, 65, 5, + 221, 31, 216, 252, 65, 5, 221, 31, 216, 251, 65, 5, 221, 31, 216, 249, + 65, 5, 221, 31, 216, 248, 65, 5, 221, 31, 249, 214, 216, 252, 65, 5, 221, + 31, 249, 214, 216, 251, 65, 5, 221, 31, 249, 214, 245, 232, 216, 254, 65, + 1, 223, 65, 226, 227, 245, 29, 65, 5, 223, 65, 226, 227, 216, 249, 65, + 221, 31, 21, 212, 79, 65, 221, 31, 21, 118, 65, 221, 31, 21, 112, 65, + 221, 31, 21, 170, 65, 221, 31, 21, 167, 65, 221, 31, 21, 185, 65, 221, + 31, 21, 192, 65, 221, 31, 21, 200, 65, 221, 31, 21, 198, 65, 221, 31, 21, + 203, 65, 5, 234, 244, 216, 253, 65, 5, 234, 244, 216, 251, 65, 30, 5, + 254, 225, 63, 65, 30, 5, 254, 225, 254, 236, 65, 16, 221, 31, 118, 65, + 16, 221, 31, 245, 118, 99, 6, 1, 254, 159, 99, 6, 1, 252, 198, 99, 6, 1, + 243, 202, 99, 6, 1, 247, 203, 99, 6, 1, 245, 229, 99, 6, 1, 214, 145, 99, + 6, 1, 212, 82, 99, 6, 1, 218, 24, 99, 6, 1, 236, 112, 99, 6, 1, 235, 96, + 99, 6, 1, 233, 203, 99, 6, 1, 232, 63, 99, 6, 1, 230, 83, 99, 6, 1, 227, + 99, 99, 6, 1, 226, 182, 99, 6, 1, 212, 71, 99, 6, 1, 224, 96, 99, 6, 1, + 222, 183, 99, 6, 1, 218, 14, 99, 6, 1, 215, 166, 99, 6, 1, 226, 52, 99, + 6, 1, 234, 239, 99, 6, 1, 243, 81, 99, 6, 1, 224, 252, 99, 6, 1, 220, + 221, 99, 6, 1, 250, 157, 99, 6, 1, 251, 63, 99, 6, 1, 235, 217, 99, 6, 1, + 250, 100, 99, 6, 1, 250, 202, 99, 6, 1, 213, 154, 99, 6, 1, 235, 228, 99, + 6, 1, 242, 145, 99, 6, 1, 242, 85, 99, 6, 1, 242, 23, 99, 6, 1, 214, 9, + 99, 6, 1, 242, 107, 99, 6, 1, 241, 170, 99, 1, 254, 159, 99, 1, 252, 198, + 99, 1, 243, 202, 99, 1, 247, 203, 99, 1, 245, 229, 99, 1, 214, 145, 99, + 1, 212, 82, 99, 1, 218, 24, 99, 1, 236, 112, 99, 1, 235, 96, 99, 1, 233, + 203, 99, 1, 232, 63, 99, 1, 230, 83, 99, 1, 227, 99, 99, 1, 226, 182, 99, + 1, 212, 71, 99, 1, 224, 96, 99, 1, 222, 183, 99, 1, 218, 14, 99, 1, 215, + 166, 99, 1, 226, 52, 99, 1, 234, 239, 99, 1, 243, 81, 99, 1, 224, 252, + 99, 1, 220, 221, 99, 1, 250, 157, 99, 1, 251, 63, 99, 1, 235, 217, 99, 1, + 250, 100, 99, 1, 250, 202, 99, 1, 213, 154, 99, 1, 235, 228, 99, 1, 242, + 145, 99, 1, 242, 85, 99, 1, 242, 23, 99, 1, 214, 9, 99, 1, 242, 107, 99, + 1, 241, 170, 99, 1, 244, 210, 99, 1, 212, 238, 99, 1, 245, 243, 99, 1, + 216, 66, 243, 202, 99, 1, 254, 231, 99, 226, 180, 221, 80, 59, 1, 99, + 230, 83, 24, 98, 234, 178, 24, 98, 219, 168, 24, 98, 229, 121, 24, 98, + 217, 68, 24, 98, 219, 157, 24, 98, 223, 213, 24, 98, 231, 100, 24, 98, + 226, 7, 24, 98, 219, 165, 24, 98, 220, 95, 24, 98, 219, 162, 24, 98, 236, + 168, 24, 98, 250, 106, 24, 98, 219, 172, 24, 98, 250, 166, 24, 98, 234, + 228, 24, 98, 217, 139, 24, 98, 226, 43, 24, 98, 242, 21, 24, 98, 229, + 117, 24, 98, 219, 166, 24, 98, 229, 111, 24, 98, 229, 115, 24, 98, 217, + 65, 24, 98, 223, 201, 24, 98, 219, 164, 24, 98, 223, 211, 24, 98, 235, + 80, 24, 98, 231, 93, 24, 98, 235, 83, 24, 98, 226, 2, 24, 98, 226, 0, 24, + 98, 225, 244, 24, 98, 225, 252, 24, 98, 225, 250, 24, 98, 225, 247, 24, + 98, 225, 249, 24, 98, 225, 246, 24, 98, 225, 251, 24, 98, 226, 5, 24, 98, + 226, 6, 24, 98, 225, 245, 24, 98, 225, 255, 24, 98, 235, 81, 24, 98, 235, + 79, 24, 98, 220, 88, 24, 98, 220, 86, 24, 98, 220, 78, 24, 98, 220, 81, + 24, 98, 220, 87, 24, 98, 220, 83, 24, 98, 220, 82, 24, 98, 220, 80, 24, + 98, 220, 91, 24, 98, 220, 93, 24, 98, 220, 94, 24, 98, 220, 89, 24, 98, + 220, 79, 24, 98, 220, 84, 24, 98, 220, 92, 24, 98, 250, 150, 24, 98, 250, + 148, 24, 98, 250, 225, 24, 98, 250, 223, 24, 98, 226, 197, 24, 98, 236, + 163, 24, 98, 236, 154, 24, 98, 236, 162, 24, 98, 236, 159, 24, 98, 236, + 157, 24, 98, 236, 161, 24, 98, 219, 169, 24, 98, 236, 166, 24, 98, 236, + 167, 24, 98, 236, 155, 24, 98, 236, 160, 24, 98, 213, 18, 24, 98, 250, + 105, 24, 98, 250, 151, 24, 98, 250, 149, 24, 98, 250, 226, 24, 98, 250, + 224, 24, 98, 250, 164, 24, 98, 250, 165, 24, 98, 250, 152, 24, 98, 250, + 227, 24, 98, 226, 41, 24, 98, 235, 82, 24, 98, 219, 170, 24, 98, 213, 24, + 24, 98, 234, 169, 24, 98, 229, 113, 24, 98, 229, 119, 24, 98, 229, 118, + 24, 98, 217, 62, 24, 98, 244, 192, 24, 139, 244, 192, 24, 139, 63, 24, + 139, 255, 20, 24, 139, 189, 24, 139, 213, 83, 24, 139, 245, 197, 24, 139, + 77, 24, 139, 213, 28, 24, 139, 213, 39, 24, 139, 78, 24, 139, 214, 52, + 24, 139, 214, 49, 24, 139, 227, 136, 24, 139, 212, 236, 24, 139, 72, 24, + 139, 213, 255, 24, 139, 214, 9, 24, 139, 213, 238, 24, 139, 212, 204, 24, + 139, 245, 143, 24, 139, 213, 0, 24, 139, 75, 24, 139, 255, 188, 24, 139, + 255, 187, 24, 139, 213, 97, 24, 139, 213, 95, 24, 139, 245, 195, 24, 139, + 245, 194, 24, 139, 245, 196, 24, 139, 213, 27, 24, 139, 213, 26, 24, 139, + 227, 241, 24, 139, 227, 242, 24, 139, 227, 235, 24, 139, 227, 240, 24, + 139, 227, 238, 24, 139, 212, 230, 24, 139, 212, 229, 24, 139, 212, 228, + 24, 139, 212, 231, 24, 139, 212, 232, 24, 139, 216, 3, 24, 139, 216, 2, + 24, 139, 216, 0, 24, 139, 215, 253, 24, 139, 215, 254, 24, 139, 212, 203, + 24, 139, 212, 200, 24, 139, 212, 201, 24, 139, 212, 195, 24, 139, 212, + 196, 24, 139, 212, 197, 24, 139, 212, 199, 24, 139, 245, 137, 24, 139, + 245, 139, 24, 139, 212, 255, 24, 139, 241, 6, 24, 139, 240, 254, 24, 139, + 241, 1, 24, 139, 240, 255, 24, 139, 241, 3, 24, 139, 241, 5, 24, 139, + 254, 75, 24, 139, 254, 72, 24, 139, 254, 70, 24, 139, 254, 71, 24, 139, + 219, 173, 24, 139, 255, 189, 24, 139, 213, 96, 24, 139, 213, 25, 24, 139, + 227, 237, 24, 139, 227, 236, 24, 90, 234, 178, 24, 90, 219, 168, 24, 90, + 234, 171, 24, 90, 229, 121, 24, 90, 229, 119, 24, 90, 229, 118, 24, 90, + 217, 68, 24, 90, 223, 213, 24, 90, 223, 208, 24, 90, 223, 205, 24, 90, + 223, 198, 24, 90, 223, 193, 24, 90, 223, 188, 24, 90, 223, 199, 24, 90, + 223, 211, 24, 90, 231, 100, 24, 90, 226, 7, 24, 90, 225, 252, 24, 90, + 220, 95, 24, 90, 219, 162, 24, 90, 236, 168, 24, 90, 250, 106, 24, 90, + 250, 166, 24, 90, 234, 228, 24, 90, 217, 139, 24, 90, 226, 43, 24, 90, + 242, 21, 24, 90, 234, 172, 24, 90, 234, 170, 24, 90, 229, 117, 24, 90, + 229, 111, 24, 90, 229, 113, 24, 90, 229, 116, 24, 90, 229, 112, 24, 90, + 217, 65, 24, 90, 217, 62, 24, 90, 223, 206, 24, 90, 223, 201, 24, 90, + 223, 187, 24, 90, 223, 186, 24, 90, 219, 164, 24, 90, 223, 203, 24, 90, + 223, 202, 24, 90, 223, 195, 24, 90, 223, 197, 24, 90, 223, 210, 24, 90, + 223, 190, 24, 90, 223, 200, 24, 90, 223, 209, 24, 90, 223, 185, 24, 90, + 231, 96, 24, 90, 231, 91, 24, 90, 231, 93, 24, 90, 231, 90, 24, 90, 231, + 88, 24, 90, 231, 94, 24, 90, 231, 99, 24, 90, 231, 97, 24, 90, 235, 83, + 24, 90, 225, 254, 24, 90, 225, 255, 24, 90, 226, 4, 24, 90, 235, 81, 24, + 90, 220, 88, 24, 90, 220, 78, 24, 90, 220, 81, 24, 90, 220, 83, 24, 90, + 226, 197, 24, 90, 236, 163, 24, 90, 236, 156, 24, 90, 219, 169, 24, 90, + 236, 164, 24, 90, 213, 18, 24, 90, 213, 14, 24, 90, 213, 15, 24, 90, 226, + 41, 24, 90, 235, 82, 24, 90, 242, 19, 24, 90, 242, 17, 24, 90, 242, 20, + 24, 90, 242, 18, 24, 90, 213, 24, 24, 90, 234, 174, 24, 90, 234, 173, 24, + 90, 234, 177, 24, 90, 234, 175, 24, 90, 234, 176, 24, 90, 219, 166, 28, + 3, 162, 28, 3, 241, 74, 28, 3, 242, 28, 28, 3, 242, 148, 28, 3, 242, 67, + 28, 3, 242, 85, 28, 3, 241, 173, 28, 3, 241, 172, 28, 3, 233, 255, 28, 3, + 232, 230, 28, 3, 233, 111, 28, 3, 233, 254, 28, 3, 233, 172, 28, 3, 233, + 180, 28, 3, 233, 26, 28, 3, 232, 202, 28, 3, 242, 37, 28, 3, 242, 31, 28, + 3, 242, 33, 28, 3, 242, 36, 28, 3, 242, 34, 28, 3, 242, 35, 28, 3, 242, + 32, 28, 3, 242, 30, 28, 3, 191, 28, 3, 230, 242, 28, 3, 231, 112, 28, 3, + 232, 114, 28, 3, 231, 215, 28, 3, 231, 226, 28, 3, 231, 45, 28, 3, 230, + 183, 28, 3, 218, 124, 28, 3, 218, 118, 28, 3, 218, 120, 28, 3, 218, 123, + 28, 3, 218, 121, 28, 3, 218, 122, 28, 3, 218, 119, 28, 3, 218, 117, 28, + 3, 208, 28, 3, 223, 77, 28, 3, 223, 222, 28, 3, 224, 109, 28, 3, 224, 35, + 28, 3, 224, 55, 28, 3, 223, 146, 28, 3, 223, 46, 28, 3, 222, 227, 28, 3, + 219, 41, 28, 3, 220, 136, 28, 3, 222, 225, 28, 3, 222, 112, 28, 3, 222, + 123, 28, 3, 220, 5, 28, 3, 218, 212, 28, 3, 221, 47, 28, 3, 220, 170, 28, + 3, 220, 233, 28, 3, 221, 43, 28, 3, 221, 6, 28, 3, 221, 8, 28, 3, 220, + 208, 28, 3, 220, 153, 28, 3, 225, 11, 28, 3, 224, 210, 28, 3, 224, 233, + 28, 3, 225, 10, 28, 3, 224, 247, 28, 3, 224, 248, 28, 3, 224, 222, 28, 3, + 224, 221, 28, 3, 224, 166, 28, 3, 224, 162, 28, 3, 224, 165, 28, 3, 224, + 163, 28, 3, 224, 164, 28, 3, 224, 245, 28, 3, 224, 239, 28, 3, 224, 241, + 28, 3, 224, 244, 28, 3, 224, 242, 28, 3, 224, 243, 28, 3, 224, 240, 28, + 3, 224, 238, 28, 3, 224, 234, 28, 3, 224, 237, 28, 3, 224, 235, 28, 3, + 224, 236, 28, 3, 252, 234, 28, 3, 251, 179, 28, 3, 252, 54, 28, 3, 252, + 233, 28, 3, 252, 112, 28, 3, 252, 121, 28, 3, 251, 253, 28, 3, 251, 137, + 28, 3, 215, 8, 28, 3, 214, 103, 28, 3, 214, 159, 28, 3, 215, 7, 28, 3, + 214, 232, 28, 3, 214, 237, 28, 3, 214, 123, 28, 3, 214, 94, 28, 3, 218, + 66, 28, 3, 216, 90, 28, 3, 217, 84, 28, 3, 218, 63, 28, 3, 217, 232, 28, + 3, 217, 242, 28, 3, 109, 28, 3, 216, 52, 28, 3, 251, 88, 28, 3, 249, 176, + 28, 3, 250, 111, 28, 3, 251, 87, 28, 3, 250, 239, 28, 3, 250, 247, 28, 3, + 250, 42, 28, 3, 249, 146, 28, 3, 213, 156, 28, 3, 213, 132, 28, 3, 213, + 148, 28, 3, 213, 155, 28, 3, 213, 152, 28, 3, 213, 153, 28, 3, 213, 139, + 28, 3, 213, 138, 28, 3, 213, 127, 28, 3, 213, 123, 28, 3, 213, 126, 28, + 3, 213, 124, 28, 3, 213, 125, 28, 3, 207, 28, 3, 228, 135, 28, 3, 229, + 128, 28, 3, 230, 112, 28, 3, 229, 251, 28, 3, 229, 254, 28, 3, 228, 228, + 28, 3, 228, 73, 28, 3, 228, 64, 28, 3, 228, 29, 28, 3, 228, 49, 28, 3, + 228, 63, 28, 3, 228, 55, 28, 3, 228, 56, 28, 3, 228, 35, 28, 3, 228, 20, + 28, 3, 243, 20, 63, 28, 3, 243, 20, 72, 28, 3, 243, 20, 75, 28, 3, 243, + 20, 255, 104, 28, 3, 243, 20, 246, 30, 28, 3, 243, 20, 77, 28, 3, 243, + 20, 78, 28, 3, 243, 20, 214, 52, 28, 3, 183, 28, 3, 234, 81, 28, 3, 234, + 212, 28, 3, 235, 128, 28, 3, 235, 43, 28, 3, 235, 44, 28, 3, 234, 148, + 28, 3, 234, 147, 28, 3, 234, 46, 28, 3, 234, 40, 28, 3, 234, 45, 28, 3, + 234, 41, 28, 3, 234, 42, 28, 3, 234, 35, 28, 3, 234, 29, 28, 3, 234, 31, + 28, 3, 234, 34, 28, 3, 234, 32, 28, 3, 234, 33, 28, 3, 234, 30, 28, 3, + 234, 28, 28, 3, 234, 24, 28, 3, 234, 27, 28, 3, 234, 25, 28, 3, 234, 26, + 28, 3, 214, 52, 28, 3, 213, 186, 28, 3, 213, 238, 28, 3, 214, 51, 28, 3, + 214, 4, 28, 3, 214, 9, 28, 3, 213, 217, 28, 3, 213, 216, 28, 3, 226, 51, + 63, 28, 3, 226, 51, 72, 28, 3, 226, 51, 75, 28, 3, 226, 51, 255, 104, 28, + 3, 226, 51, 246, 30, 28, 3, 226, 51, 77, 28, 3, 226, 51, 78, 28, 3, 212, + 109, 28, 3, 212, 8, 28, 3, 212, 37, 28, 3, 212, 108, 28, 3, 212, 85, 28, + 3, 212, 87, 28, 3, 212, 16, 28, 3, 211, 251, 28, 3, 212, 75, 28, 3, 212, + 55, 28, 3, 212, 62, 28, 3, 212, 74, 28, 3, 212, 66, 28, 3, 212, 67, 28, + 3, 212, 60, 28, 3, 212, 46, 28, 3, 189, 28, 3, 212, 204, 28, 3, 213, 0, + 28, 3, 213, 94, 28, 3, 213, 36, 28, 3, 213, 39, 28, 3, 212, 236, 28, 3, + 212, 227, 28, 3, 249, 30, 28, 3, 246, 154, 28, 3, 248, 76, 28, 3, 249, + 29, 28, 3, 248, 149, 28, 3, 248, 162, 28, 3, 247, 220, 28, 3, 246, 123, + 28, 3, 248, 207, 28, 3, 248, 172, 28, 3, 248, 184, 28, 3, 248, 206, 28, + 3, 248, 194, 28, 3, 248, 195, 28, 3, 248, 177, 28, 3, 248, 163, 28, 3, + 236, 0, 28, 3, 235, 168, 28, 3, 235, 225, 28, 3, 235, 255, 28, 3, 235, + 240, 28, 3, 235, 242, 28, 3, 235, 185, 28, 3, 235, 149, 28, 3, 243, 230, + 28, 3, 242, 213, 28, 3, 243, 54, 28, 3, 243, 227, 28, 3, 243, 151, 28, 3, + 243, 158, 28, 3, 243, 14, 28, 3, 243, 13, 28, 3, 242, 180, 28, 3, 242, + 176, 28, 3, 242, 179, 28, 3, 242, 177, 28, 3, 242, 178, 28, 3, 243, 125, + 28, 3, 243, 105, 28, 3, 243, 115, 28, 3, 243, 124, 28, 3, 243, 119, 28, + 3, 243, 120, 28, 3, 243, 109, 28, 3, 243, 94, 28, 3, 217, 174, 28, 3, + 217, 103, 28, 3, 217, 141, 28, 3, 217, 173, 28, 3, 217, 160, 28, 3, 217, + 161, 28, 3, 217, 122, 28, 3, 217, 95, 28, 3, 250, 215, 28, 3, 250, 129, + 28, 3, 250, 170, 28, 3, 250, 214, 28, 3, 250, 187, 28, 3, 250, 190, 28, + 3, 250, 146, 28, 3, 250, 118, 28, 3, 226, 59, 28, 3, 226, 26, 28, 3, 226, + 45, 28, 3, 226, 58, 28, 3, 226, 47, 28, 3, 226, 48, 28, 3, 226, 33, 28, + 3, 226, 22, 28, 3, 216, 154, 28, 3, 216, 135, 28, 3, 216, 138, 28, 3, + 216, 153, 28, 3, 216, 148, 28, 3, 216, 149, 28, 3, 216, 137, 28, 3, 216, + 133, 28, 3, 216, 12, 28, 3, 216, 4, 28, 3, 216, 8, 28, 3, 216, 11, 28, 3, + 216, 9, 28, 3, 216, 10, 28, 3, 216, 6, 28, 3, 216, 5, 28, 3, 245, 29, 28, + 3, 244, 69, 28, 3, 244, 210, 28, 3, 245, 28, 28, 3, 244, 236, 28, 3, 244, + 243, 28, 3, 244, 132, 28, 3, 244, 52, 28, 3, 195, 28, 3, 225, 71, 28, 3, + 226, 20, 28, 3, 226, 251, 28, 3, 226, 122, 28, 3, 226, 132, 28, 3, 225, + 186, 28, 3, 225, 37, 28, 3, 223, 36, 28, 3, 230, 172, 28, 3, 244, 46, 28, + 38, 243, 149, 22, 30, 233, 145, 79, 28, 38, 30, 233, 145, 79, 28, 38, + 243, 149, 79, 28, 222, 115, 79, 28, 213, 198, 28, 244, 64, 219, 83, 28, + 250, 23, 28, 221, 93, 28, 250, 30, 28, 225, 115, 250, 30, 28, 224, 193, + 79, 28, 226, 180, 221, 80, 28, 21, 118, 28, 21, 112, 28, 21, 170, 28, 21, + 167, 28, 21, 185, 28, 21, 192, 28, 21, 200, 28, 21, 198, 28, 21, 203, 28, + 51, 217, 213, 28, 51, 216, 45, 28, 51, 217, 128, 28, 51, 244, 104, 28, + 51, 244, 203, 28, 51, 220, 58, 28, 51, 221, 60, 28, 51, 246, 6, 28, 51, + 229, 90, 28, 51, 241, 62, 28, 51, 217, 214, 217, 113, 28, 3, 222, 119, + 230, 183, 28, 3, 230, 179, 28, 3, 230, 180, 28, 3, 230, 181, 28, 3, 222, + 119, 251, 137, 28, 3, 251, 134, 28, 3, 251, 135, 28, 3, 251, 136, 28, 3, + 222, 119, 244, 52, 28, 3, 244, 48, 28, 3, 244, 49, 28, 3, 244, 50, 28, 3, + 222, 119, 225, 37, 28, 3, 225, 33, 28, 3, 225, 34, 28, 3, 225, 35, 28, + 216, 255, 156, 212, 239, 28, 216, 255, 156, 248, 113, 28, 216, 255, 156, + 223, 169, 28, 216, 255, 156, 220, 196, 223, 169, 28, 216, 255, 156, 248, + 52, 28, 216, 255, 156, 235, 26, 28, 216, 255, 156, 250, 154, 28, 216, + 255, 156, 242, 25, 28, 216, 255, 156, 248, 112, 28, 216, 255, 156, 234, + 58, 164, 1, 63, 164, 1, 77, 164, 1, 75, 164, 1, 78, 164, 1, 72, 164, 1, + 211, 211, 164, 1, 243, 230, 164, 1, 183, 164, 1, 243, 158, 164, 1, 243, + 54, 164, 1, 243, 14, 164, 1, 242, 213, 164, 1, 242, 181, 164, 1, 162, + 164, 1, 242, 85, 164, 1, 242, 28, 164, 1, 241, 173, 164, 1, 241, 74, 164, + 1, 241, 54, 164, 1, 233, 255, 164, 1, 233, 180, 164, 1, 233, 111, 164, 1, + 233, 26, 164, 1, 232, 230, 164, 1, 232, 203, 164, 1, 191, 164, 1, 231, + 226, 164, 1, 231, 112, 164, 1, 231, 45, 164, 1, 230, 242, 164, 1, 207, + 164, 1, 241, 195, 164, 1, 230, 100, 164, 1, 229, 254, 164, 1, 229, 128, + 164, 1, 228, 228, 164, 1, 228, 135, 164, 1, 228, 75, 164, 1, 224, 209, + 164, 1, 224, 196, 164, 1, 224, 189, 164, 1, 224, 181, 164, 1, 224, 170, + 164, 1, 224, 168, 164, 1, 222, 227, 164, 1, 196, 164, 1, 222, 123, 164, + 1, 220, 136, 164, 1, 220, 5, 164, 1, 219, 41, 164, 1, 218, 217, 164, 1, + 249, 30, 164, 1, 218, 66, 164, 1, 248, 162, 164, 1, 217, 242, 164, 1, + 248, 76, 164, 1, 217, 84, 164, 1, 247, 220, 164, 1, 246, 154, 164, 1, + 246, 126, 164, 1, 247, 229, 164, 1, 217, 26, 164, 1, 217, 25, 164, 1, + 217, 15, 164, 1, 217, 14, 164, 1, 217, 13, 164, 1, 217, 12, 164, 1, 216, + 154, 164, 1, 216, 149, 164, 1, 216, 138, 164, 1, 216, 137, 164, 1, 216, + 135, 164, 1, 216, 134, 164, 1, 214, 52, 164, 1, 214, 9, 164, 1, 213, 238, + 164, 1, 213, 217, 164, 1, 213, 186, 164, 1, 213, 174, 164, 1, 189, 164, + 1, 213, 39, 164, 1, 213, 0, 164, 1, 212, 236, 164, 1, 212, 204, 164, 1, + 212, 169, 18, 19, 241, 21, 18, 19, 77, 18, 19, 255, 68, 18, 19, 75, 18, + 19, 236, 145, 18, 19, 78, 18, 19, 227, 86, 18, 19, 213, 107, 227, 86, 18, + 19, 70, 246, 30, 18, 19, 70, 75, 18, 19, 63, 18, 19, 255, 104, 18, 19, + 214, 9, 18, 19, 153, 214, 9, 18, 19, 213, 238, 18, 19, 153, 213, 238, 18, + 19, 213, 230, 18, 19, 153, 213, 230, 18, 19, 213, 217, 18, 19, 153, 213, + 217, 18, 19, 213, 205, 18, 19, 153, 213, 205, 18, 19, 230, 79, 213, 205, + 18, 19, 214, 52, 18, 19, 153, 214, 52, 18, 19, 214, 51, 18, 19, 153, 214, + 51, 18, 19, 230, 79, 214, 51, 18, 19, 254, 236, 18, 19, 213, 107, 214, + 85, 18, 19, 243, 20, 219, 83, 18, 19, 41, 138, 18, 19, 41, 209, 18, 19, + 41, 251, 226, 157, 223, 164, 18, 19, 41, 216, 240, 157, 223, 164, 18, 19, + 41, 47, 157, 223, 164, 18, 19, 41, 223, 164, 18, 19, 41, 52, 138, 18, 19, + 41, 52, 220, 196, 66, 219, 46, 18, 19, 41, 231, 107, 247, 195, 18, 19, + 41, 220, 196, 201, 91, 18, 19, 41, 225, 192, 18, 19, 41, 121, 218, 50, + 18, 19, 245, 229, 18, 19, 236, 112, 18, 19, 227, 99, 18, 19, 254, 159, + 18, 19, 226, 132, 18, 19, 226, 249, 18, 19, 226, 20, 18, 19, 225, 239, + 18, 19, 225, 186, 18, 19, 225, 165, 18, 19, 213, 107, 225, 165, 18, 19, + 70, 242, 67, 18, 19, 70, 242, 28, 18, 19, 195, 18, 19, 226, 251, 18, 19, + 225, 35, 18, 19, 153, 225, 35, 18, 19, 225, 33, 18, 19, 153, 225, 33, 18, + 19, 225, 32, 18, 19, 153, 225, 32, 18, 19, 225, 30, 18, 19, 153, 225, 30, + 18, 19, 225, 29, 18, 19, 153, 225, 29, 18, 19, 225, 37, 18, 19, 153, 225, + 37, 18, 19, 225, 36, 18, 19, 153, 225, 36, 18, 19, 213, 107, 225, 36, 18, + 19, 227, 11, 18, 19, 153, 227, 11, 18, 19, 70, 242, 162, 18, 19, 217, + 242, 18, 19, 218, 61, 18, 19, 217, 84, 18, 19, 217, 70, 18, 19, 109, 18, + 19, 216, 243, 18, 19, 213, 107, 216, 243, 18, 19, 70, 248, 149, 18, 19, + 70, 248, 76, 18, 19, 218, 66, 18, 19, 218, 63, 18, 19, 216, 50, 18, 19, + 153, 216, 50, 18, 19, 216, 34, 18, 19, 153, 216, 34, 18, 19, 216, 33, 18, + 19, 153, 216, 33, 18, 19, 112, 18, 19, 153, 112, 18, 19, 216, 27, 18, 19, + 153, 216, 27, 18, 19, 216, 52, 18, 19, 153, 216, 52, 18, 19, 216, 51, 18, + 19, 153, 216, 51, 18, 19, 230, 79, 216, 51, 18, 19, 218, 113, 18, 19, + 216, 123, 18, 19, 216, 107, 18, 19, 216, 105, 18, 19, 216, 128, 18, 19, + 235, 44, 18, 19, 235, 125, 18, 19, 234, 212, 18, 19, 234, 203, 18, 19, + 234, 148, 18, 19, 234, 130, 18, 19, 213, 107, 234, 130, 18, 19, 183, 18, + 19, 235, 128, 18, 19, 234, 42, 18, 19, 153, 234, 42, 18, 19, 234, 40, 18, + 19, 153, 234, 40, 18, 19, 234, 39, 18, 19, 153, 234, 39, 18, 19, 234, 38, + 18, 19, 153, 234, 38, 18, 19, 234, 37, 18, 19, 153, 234, 37, 18, 19, 234, + 46, 18, 19, 153, 234, 46, 18, 19, 234, 45, 18, 19, 153, 234, 45, 18, 19, + 230, 79, 234, 45, 18, 19, 235, 141, 18, 19, 234, 47, 18, 19, 219, 233, + 235, 38, 18, 19, 219, 233, 234, 204, 18, 19, 219, 233, 234, 143, 18, 19, + 219, 233, 235, 110, 18, 19, 250, 247, 18, 19, 251, 86, 18, 19, 250, 111, + 18, 19, 250, 101, 18, 19, 250, 42, 18, 19, 249, 236, 18, 19, 213, 107, + 249, 236, 18, 19, 251, 88, 18, 19, 251, 87, 18, 19, 249, 144, 18, 19, + 153, 249, 144, 18, 19, 249, 142, 18, 19, 153, 249, 142, 18, 19, 249, 141, + 18, 19, 153, 249, 141, 18, 19, 249, 140, 18, 19, 153, 249, 140, 18, 19, + 249, 139, 18, 19, 153, 249, 139, 18, 19, 249, 146, 18, 19, 153, 249, 146, + 18, 19, 249, 145, 18, 19, 153, 249, 145, 18, 19, 230, 79, 249, 145, 18, + 19, 251, 121, 18, 19, 222, 150, 217, 176, 18, 19, 231, 226, 18, 19, 232, + 113, 18, 19, 231, 112, 18, 19, 231, 84, 18, 19, 231, 45, 18, 19, 231, 16, + 18, 19, 213, 107, 231, 16, 18, 19, 191, 18, 19, 232, 114, 18, 19, 230, + 181, 18, 19, 153, 230, 181, 18, 19, 230, 179, 18, 19, 153, 230, 179, 18, + 19, 230, 178, 18, 19, 153, 230, 178, 18, 19, 230, 177, 18, 19, 153, 230, + 177, 18, 19, 230, 176, 18, 19, 153, 230, 176, 18, 19, 230, 183, 18, 19, + 153, 230, 183, 18, 19, 230, 182, 18, 19, 153, 230, 182, 18, 19, 230, 79, + 230, 182, 18, 19, 184, 18, 19, 153, 184, 18, 19, 231, 115, 18, 19, 253, + 248, 184, 18, 19, 222, 150, 184, 18, 19, 229, 254, 18, 19, 230, 111, 18, + 19, 229, 128, 18, 19, 229, 103, 18, 19, 228, 228, 18, 19, 228, 218, 18, + 19, 213, 107, 228, 218, 18, 19, 207, 18, 19, 230, 112, 18, 19, 228, 71, + 18, 19, 153, 228, 71, 18, 19, 228, 73, 18, 19, 153, 228, 73, 18, 19, 228, + 72, 18, 19, 153, 228, 72, 18, 19, 230, 79, 228, 72, 18, 19, 206, 18, 19, + 70, 229, 228, 18, 19, 229, 133, 18, 19, 233, 180, 18, 19, 233, 253, 18, + 19, 233, 111, 18, 19, 233, 97, 18, 19, 233, 26, 18, 19, 232, 254, 18, 19, + 213, 107, 232, 254, 18, 19, 233, 255, 18, 19, 233, 254, 18, 19, 232, 200, + 18, 19, 153, 232, 200, 18, 19, 232, 199, 18, 19, 153, 232, 199, 18, 19, + 232, 198, 18, 19, 153, 232, 198, 18, 19, 232, 197, 18, 19, 153, 232, 197, + 18, 19, 232, 196, 18, 19, 153, 232, 196, 18, 19, 232, 202, 18, 19, 153, + 232, 202, 18, 19, 232, 201, 18, 19, 153, 232, 201, 18, 19, 155, 18, 19, + 153, 155, 18, 19, 144, 155, 18, 19, 222, 123, 18, 19, 222, 223, 18, 19, + 220, 136, 18, 19, 220, 120, 18, 19, 220, 5, 18, 19, 219, 245, 18, 19, + 213, 107, 219, 245, 18, 19, 222, 227, 18, 19, 222, 225, 18, 19, 218, 208, + 18, 19, 153, 218, 208, 18, 19, 218, 202, 18, 19, 153, 218, 202, 18, 19, + 218, 201, 18, 19, 153, 218, 201, 18, 19, 218, 197, 18, 19, 153, 218, 197, + 18, 19, 218, 196, 18, 19, 153, 218, 196, 18, 19, 218, 212, 18, 19, 153, + 218, 212, 18, 19, 218, 211, 18, 19, 153, 218, 211, 18, 19, 230, 79, 218, + 211, 18, 19, 196, 18, 19, 253, 248, 196, 18, 19, 218, 213, 18, 19, 252, + 10, 196, 18, 19, 231, 11, 220, 55, 18, 19, 230, 79, 220, 46, 18, 19, 230, + 79, 223, 27, 18, 19, 230, 79, 219, 186, 18, 19, 230, 79, 219, 43, 18, 19, + 230, 79, 220, 45, 18, 19, 230, 79, 222, 126, 18, 19, 221, 8, 18, 19, 220, + 233, 18, 19, 220, 228, 18, 19, 220, 208, 18, 19, 220, 202, 18, 19, 221, + 47, 18, 19, 221, 43, 18, 19, 220, 151, 18, 19, 153, 220, 151, 18, 19, + 220, 150, 18, 19, 153, 220, 150, 18, 19, 220, 149, 18, 19, 153, 220, 149, + 18, 19, 220, 148, 18, 19, 153, 220, 148, 18, 19, 220, 147, 18, 19, 153, + 220, 147, 18, 19, 220, 153, 18, 19, 153, 220, 153, 18, 19, 220, 152, 18, + 19, 153, 220, 152, 18, 19, 221, 49, 18, 19, 213, 39, 18, 19, 213, 92, 18, + 19, 213, 0, 18, 19, 212, 247, 18, 19, 212, 236, 18, 19, 212, 221, 18, 19, + 213, 107, 212, 221, 18, 19, 189, 18, 19, 213, 94, 18, 19, 212, 166, 18, + 19, 153, 212, 166, 18, 19, 212, 165, 18, 19, 153, 212, 165, 18, 19, 212, + 164, 18, 19, 153, 212, 164, 18, 19, 212, 163, 18, 19, 153, 212, 163, 18, + 19, 212, 162, 18, 19, 153, 212, 162, 18, 19, 212, 168, 18, 19, 153, 212, + 168, 18, 19, 212, 167, 18, 19, 153, 212, 167, 18, 19, 230, 79, 212, 167, + 18, 19, 213, 108, 18, 19, 252, 52, 213, 108, 18, 19, 153, 213, 108, 18, + 19, 222, 150, 213, 0, 18, 19, 224, 55, 18, 19, 224, 147, 224, 55, 18, 19, + 153, 233, 180, 18, 19, 224, 108, 18, 19, 223, 222, 18, 19, 223, 170, 18, + 19, 223, 146, 18, 19, 223, 133, 18, 19, 153, 233, 26, 18, 19, 208, 18, + 19, 224, 109, 18, 19, 153, 233, 255, 18, 19, 223, 45, 18, 19, 153, 223, + 45, 18, 19, 152, 18, 19, 153, 152, 18, 19, 144, 152, 18, 19, 244, 243, + 18, 19, 245, 26, 18, 19, 244, 210, 18, 19, 244, 197, 18, 19, 244, 132, + 18, 19, 244, 123, 18, 19, 245, 29, 18, 19, 245, 28, 18, 19, 244, 51, 18, + 19, 153, 244, 51, 18, 19, 245, 95, 18, 19, 217, 161, 18, 19, 230, 165, + 217, 161, 18, 19, 217, 141, 18, 19, 230, 165, 217, 141, 18, 19, 217, 137, + 18, 19, 230, 165, 217, 137, 18, 19, 217, 122, 18, 19, 217, 119, 18, 19, + 217, 174, 18, 19, 217, 173, 18, 19, 217, 94, 18, 19, 153, 217, 94, 18, + 19, 217, 176, 18, 19, 216, 114, 18, 19, 216, 112, 18, 19, 216, 111, 18, + 19, 216, 116, 18, 19, 216, 117, 18, 19, 216, 25, 18, 19, 216, 24, 18, 19, + 216, 23, 18, 19, 216, 26, 18, 19, 228, 92, 242, 85, 18, 19, 228, 92, 242, + 28, 18, 19, 228, 92, 242, 10, 18, 19, 228, 92, 241, 173, 18, 19, 228, 92, + 241, 158, 18, 19, 228, 92, 162, 18, 19, 228, 92, 242, 148, 18, 19, 228, + 92, 242, 162, 18, 19, 228, 91, 242, 162, 18, 19, 242, 3, 18, 19, 225, 7, + 18, 19, 224, 233, 18, 19, 224, 228, 18, 19, 224, 222, 18, 19, 224, 217, + 18, 19, 225, 11, 18, 19, 225, 10, 18, 19, 225, 19, 18, 19, 217, 22, 18, + 19, 217, 20, 18, 19, 217, 19, 18, 19, 217, 23, 18, 19, 153, 224, 55, 18, + 19, 153, 223, 222, 18, 19, 153, 223, 146, 18, 19, 153, 208, 18, 19, 229, + 224, 18, 19, 229, 178, 18, 19, 229, 174, 18, 19, 229, 155, 18, 19, 229, + 150, 18, 19, 229, 226, 18, 19, 229, 225, 18, 19, 229, 228, 18, 19, 229, + 0, 18, 19, 222, 150, 221, 8, 18, 19, 222, 150, 220, 233, 18, 19, 222, + 150, 220, 208, 18, 19, 222, 150, 221, 47, 18, 19, 213, 203, 217, 161, 18, + 19, 213, 203, 217, 141, 18, 19, 213, 203, 217, 122, 18, 19, 213, 203, + 217, 174, 18, 19, 213, 203, 217, 176, 18, 19, 233, 117, 18, 19, 233, 116, + 18, 19, 233, 115, 18, 19, 233, 114, 18, 19, 233, 123, 18, 19, 233, 122, + 18, 19, 233, 124, 18, 19, 217, 175, 217, 161, 18, 19, 217, 175, 217, 141, + 18, 19, 217, 175, 217, 137, 18, 19, 217, 175, 217, 122, 18, 19, 217, 175, + 217, 119, 18, 19, 217, 175, 217, 174, 18, 19, 217, 175, 217, 173, 18, 19, + 217, 175, 217, 176, 18, 19, 254, 224, 253, 201, 18, 19, 252, 10, 77, 18, + 19, 252, 10, 75, 18, 19, 252, 10, 78, 18, 19, 252, 10, 63, 18, 19, 252, + 10, 214, 9, 18, 19, 252, 10, 213, 238, 18, 19, 252, 10, 213, 217, 18, 19, + 252, 10, 214, 52, 18, 19, 252, 10, 229, 254, 18, 19, 252, 10, 229, 128, + 18, 19, 252, 10, 228, 228, 18, 19, 252, 10, 207, 18, 19, 252, 10, 235, + 44, 18, 19, 252, 10, 234, 212, 18, 19, 252, 10, 234, 148, 18, 19, 252, + 10, 183, 18, 19, 222, 150, 242, 85, 18, 19, 222, 150, 242, 28, 18, 19, + 222, 150, 241, 173, 18, 19, 222, 150, 162, 18, 19, 70, 243, 60, 18, 19, + 70, 243, 64, 18, 19, 70, 243, 76, 18, 19, 70, 243, 75, 18, 19, 70, 243, + 65, 18, 19, 70, 243, 89, 18, 19, 70, 223, 77, 18, 19, 70, 223, 146, 18, + 19, 70, 224, 55, 18, 19, 70, 224, 35, 18, 19, 70, 223, 222, 18, 19, 70, + 208, 18, 19, 70, 213, 186, 18, 19, 70, 213, 217, 18, 19, 70, 214, 9, 18, + 19, 70, 214, 4, 18, 19, 70, 213, 238, 18, 19, 70, 214, 52, 18, 19, 70, + 241, 47, 18, 19, 70, 241, 48, 18, 19, 70, 241, 51, 18, 19, 70, 241, 50, + 18, 19, 70, 241, 49, 18, 19, 70, 241, 53, 18, 19, 70, 217, 103, 18, 19, + 70, 217, 122, 18, 19, 70, 217, 161, 18, 19, 70, 217, 160, 18, 19, 70, + 217, 141, 18, 19, 70, 217, 174, 18, 19, 70, 216, 95, 18, 19, 70, 216, + 105, 18, 19, 70, 216, 123, 18, 19, 70, 216, 122, 18, 19, 70, 216, 107, + 18, 19, 70, 216, 128, 18, 19, 70, 225, 71, 18, 19, 70, 225, 186, 18, 19, + 70, 226, 132, 18, 19, 70, 226, 122, 18, 19, 70, 226, 20, 18, 19, 70, 195, + 18, 19, 70, 227, 11, 18, 19, 70, 242, 213, 18, 19, 70, 243, 14, 18, 19, + 70, 243, 158, 18, 19, 70, 243, 151, 18, 19, 70, 243, 54, 18, 19, 70, 243, + 230, 18, 19, 70, 234, 219, 18, 19, 70, 234, 224, 18, 19, 70, 234, 237, + 18, 19, 70, 234, 236, 18, 19, 70, 234, 230, 18, 19, 70, 234, 250, 18, 19, + 70, 234, 161, 18, 19, 70, 234, 162, 18, 19, 70, 234, 165, 18, 19, 70, + 234, 164, 18, 19, 70, 234, 163, 18, 19, 70, 234, 166, 18, 19, 70, 234, + 167, 18, 19, 70, 228, 135, 18, 19, 70, 228, 228, 18, 19, 70, 229, 254, + 18, 19, 70, 229, 251, 18, 19, 70, 229, 128, 18, 19, 70, 207, 18, 19, 70, + 230, 242, 18, 19, 70, 231, 45, 18, 19, 70, 231, 226, 18, 19, 70, 231, + 215, 18, 19, 70, 231, 112, 18, 19, 70, 191, 18, 19, 70, 212, 204, 18, 19, + 70, 212, 236, 18, 19, 70, 213, 39, 18, 19, 70, 213, 36, 18, 19, 70, 213, + 0, 18, 19, 70, 189, 18, 19, 70, 235, 168, 18, 19, 222, 150, 235, 168, 18, + 19, 70, 235, 185, 18, 19, 70, 235, 242, 18, 19, 70, 235, 240, 18, 19, 70, + 235, 225, 18, 19, 222, 150, 235, 225, 18, 19, 70, 236, 0, 18, 19, 70, + 235, 198, 18, 19, 70, 235, 202, 18, 19, 70, 235, 212, 18, 19, 70, 235, + 211, 18, 19, 70, 235, 210, 18, 19, 70, 235, 213, 18, 19, 70, 232, 230, + 18, 19, 70, 233, 26, 18, 19, 70, 233, 180, 18, 19, 70, 233, 172, 18, 19, + 70, 233, 111, 18, 19, 70, 233, 255, 18, 19, 70, 247, 224, 18, 19, 70, + 247, 225, 18, 19, 70, 247, 228, 18, 19, 70, 247, 227, 18, 19, 70, 247, + 226, 18, 19, 70, 247, 229, 18, 19, 70, 233, 113, 18, 19, 70, 233, 115, + 18, 19, 70, 233, 119, 18, 19, 70, 233, 118, 18, 19, 70, 233, 117, 18, 19, + 70, 233, 123, 18, 19, 70, 217, 17, 18, 19, 70, 217, 19, 18, 19, 70, 217, + 22, 18, 19, 70, 217, 21, 18, 19, 70, 217, 20, 18, 19, 70, 217, 23, 18, + 19, 70, 217, 13, 18, 19, 70, 217, 14, 18, 19, 70, 217, 25, 18, 19, 70, + 217, 24, 18, 19, 70, 217, 15, 18, 19, 70, 217, 26, 18, 19, 70, 212, 8, + 18, 19, 70, 212, 16, 18, 19, 70, 212, 87, 18, 19, 70, 212, 85, 18, 19, + 70, 212, 37, 18, 19, 70, 212, 109, 18, 19, 70, 212, 152, 18, 19, 70, 73, + 212, 152, 18, 19, 70, 246, 104, 18, 19, 70, 246, 105, 18, 19, 70, 246, + 112, 18, 19, 70, 246, 111, 18, 19, 70, 246, 107, 18, 19, 70, 246, 114, + 18, 19, 70, 219, 41, 18, 19, 70, 220, 5, 18, 19, 70, 222, 123, 18, 19, + 70, 222, 112, 18, 19, 70, 220, 136, 18, 19, 70, 222, 227, 18, 19, 70, + 220, 170, 18, 19, 70, 220, 208, 18, 19, 70, 221, 8, 18, 19, 70, 221, 6, + 18, 19, 70, 220, 233, 18, 19, 70, 221, 47, 18, 19, 70, 221, 49, 18, 19, + 70, 216, 135, 18, 19, 70, 216, 137, 18, 19, 70, 216, 149, 18, 19, 70, + 216, 148, 18, 19, 70, 216, 138, 18, 19, 70, 216, 154, 18, 19, 70, 250, + 129, 18, 19, 70, 250, 146, 18, 19, 70, 250, 190, 18, 19, 70, 250, 187, + 18, 19, 70, 250, 170, 18, 19, 70, 250, 215, 18, 19, 70, 216, 98, 18, 19, + 70, 216, 99, 18, 19, 70, 216, 102, 18, 19, 70, 216, 101, 18, 19, 70, 216, + 100, 18, 19, 70, 216, 103, 18, 19, 250, 171, 53, 18, 19, 244, 64, 219, + 83, 18, 19, 225, 3, 18, 19, 229, 223, 18, 19, 228, 253, 18, 19, 228, 252, + 18, 19, 228, 251, 18, 19, 228, 250, 18, 19, 228, 255, 18, 19, 228, 254, + 18, 19, 213, 203, 217, 92, 18, 19, 213, 203, 217, 91, 18, 19, 213, 203, + 217, 90, 18, 19, 213, 203, 217, 89, 18, 19, 213, 203, 217, 88, 18, 19, + 213, 203, 217, 95, 18, 19, 213, 203, 217, 94, 18, 19, 213, 203, 41, 217, + 176, 18, 19, 252, 10, 214, 85, 227, 129, 219, 226, 79, 227, 129, 1, 252, + 94, 227, 129, 1, 232, 219, 227, 129, 1, 244, 240, 227, 129, 1, 222, 210, + 227, 129, 1, 229, 88, 227, 129, 1, 215, 201, 227, 129, 1, 249, 8, 227, + 129, 1, 217, 47, 227, 129, 1, 250, 33, 227, 129, 1, 250, 237, 227, 129, + 1, 230, 231, 227, 129, 1, 242, 252, 227, 129, 1, 229, 213, 227, 129, 1, + 219, 76, 227, 129, 1, 223, 72, 227, 129, 1, 254, 233, 227, 129, 1, 227, + 90, 227, 129, 1, 215, 127, 227, 129, 1, 246, 52, 227, 129, 1, 236, 47, + 227, 129, 1, 246, 53, 227, 129, 1, 227, 62, 227, 129, 1, 215, 182, 227, + 129, 1, 236, 151, 227, 129, 1, 246, 50, 227, 129, 1, 226, 113, 227, 129, + 244, 239, 79, 227, 129, 223, 236, 244, 239, 79, 172, 1, 244, 230, 244, + 222, 244, 244, 245, 95, 172, 1, 211, 211, 172, 1, 215, 112, 215, 128, 72, + 172, 1, 212, 206, 172, 1, 213, 108, 172, 1, 214, 85, 172, 1, 217, 97, + 217, 96, 217, 117, 172, 1, 245, 146, 172, 1, 254, 131, 63, 172, 1, 227, + 48, 78, 172, 1, 255, 49, 63, 172, 1, 255, 4, 172, 1, 233, 4, 78, 172, 1, + 220, 189, 78, 172, 1, 78, 172, 1, 227, 136, 172, 1, 227, 99, 172, 1, 224, + 90, 224, 102, 224, 22, 152, 172, 1, 235, 55, 172, 1, 250, 234, 172, 1, + 235, 56, 235, 141, 172, 1, 244, 41, 172, 1, 245, 217, 172, 1, 243, 154, + 242, 168, 244, 41, 172, 1, 243, 192, 172, 1, 213, 179, 213, 173, 214, 85, + 172, 1, 242, 140, 242, 162, 172, 1, 242, 144, 242, 162, 172, 1, 233, 6, + 242, 162, 172, 1, 220, 192, 242, 162, 172, 1, 230, 74, 228, 57, 230, 75, + 206, 172, 1, 220, 190, 206, 172, 1, 246, 190, 172, 1, 236, 27, 236, 31, + 236, 21, 75, 172, 1, 77, 172, 1, 235, 233, 236, 3, 172, 1, 243, 139, 172, + 1, 233, 7, 255, 20, 172, 1, 220, 194, 63, 172, 1, 236, 13, 245, 193, 172, + 1, 226, 76, 226, 97, 227, 11, 172, 1, 254, 199, 245, 192, 172, 1, 219, + 230, 196, 172, 1, 220, 124, 233, 3, 196, 172, 1, 220, 188, 196, 172, 1, + 251, 121, 172, 1, 212, 152, 172, 1, 217, 30, 217, 40, 216, 14, 218, 113, + 172, 1, 220, 187, 218, 113, 172, 1, 249, 125, 172, 1, 252, 78, 252, 81, + 252, 16, 253, 201, 172, 1, 220, 193, 253, 201, 172, 1, 246, 189, 172, 1, + 227, 74, 172, 1, 246, 18, 246, 20, 77, 172, 1, 232, 56, 232, 64, 184, + 172, 1, 233, 5, 184, 172, 1, 220, 191, 184, 172, 1, 233, 195, 233, 235, + 233, 14, 155, 172, 1, 246, 191, 172, 1, 236, 88, 172, 1, 236, 89, 172, 1, + 249, 19, 249, 24, 249, 125, 172, 1, 227, 44, 245, 145, 78, 172, 1, 246, + 48, 172, 1, 236, 46, 172, 1, 249, 143, 172, 1, 251, 73, 172, 1, 250, 246, + 172, 1, 219, 114, 172, 1, 233, 2, 172, 1, 220, 186, 172, 1, 240, 220, + 172, 1, 225, 19, 172, 1, 213, 169, 172, 220, 100, 225, 62, 172, 230, 225, + 225, 62, 172, 249, 194, 225, 62, 172, 254, 48, 88, 172, 216, 54, 88, 172, + 252, 93, 88, 218, 46, 1, 63, 218, 46, 1, 75, 218, 46, 1, 72, 218, 46, 1, + 183, 218, 46, 1, 243, 230, 218, 46, 1, 229, 226, 218, 46, 1, 218, 66, + 218, 46, 1, 249, 30, 218, 46, 1, 207, 218, 46, 1, 195, 218, 46, 1, 252, + 234, 218, 46, 1, 191, 218, 46, 1, 189, 218, 46, 1, 233, 255, 218, 46, 1, + 214, 52, 218, 46, 1, 222, 227, 218, 46, 1, 162, 218, 46, 30, 5, 75, 218, + 46, 30, 5, 72, 218, 46, 5, 214, 137, 242, 110, 1, 63, 242, 110, 1, 75, + 242, 110, 1, 72, 242, 110, 1, 183, 242, 110, 1, 243, 230, 242, 110, 1, + 229, 226, 242, 110, 1, 218, 66, 242, 110, 1, 249, 30, 242, 110, 1, 207, + 242, 110, 1, 195, 242, 110, 1, 252, 234, 242, 110, 1, 191, 242, 110, 1, + 189, 242, 110, 1, 208, 242, 110, 1, 233, 255, 242, 110, 1, 214, 52, 242, + 110, 1, 222, 227, 242, 110, 1, 162, 242, 110, 30, 5, 75, 242, 110, 30, 5, + 72, 242, 110, 5, 226, 213, 226, 38, 220, 100, 225, 62, 226, 38, 52, 225, + 62, 251, 174, 1, 63, 251, 174, 1, 75, 251, 174, 1, 72, 251, 174, 1, 183, + 251, 174, 1, 243, 230, 251, 174, 1, 229, 226, 251, 174, 1, 218, 66, 251, + 174, 1, 249, 30, 251, 174, 1, 207, 251, 174, 1, 195, 251, 174, 1, 252, + 234, 251, 174, 1, 191, 251, 174, 1, 189, 251, 174, 1, 208, 251, 174, 1, + 233, 255, 251, 174, 1, 214, 52, 251, 174, 1, 222, 227, 251, 174, 1, 162, + 251, 174, 30, 5, 75, 251, 174, 30, 5, 72, 218, 45, 1, 63, 218, 45, 1, 75, + 218, 45, 1, 72, 218, 45, 1, 183, 218, 45, 1, 243, 230, 218, 45, 1, 229, + 226, 218, 45, 1, 218, 66, 218, 45, 1, 249, 30, 218, 45, 1, 207, 218, 45, + 1, 195, 218, 45, 1, 252, 234, 218, 45, 1, 191, 218, 45, 1, 189, 218, 45, + 1, 233, 255, 218, 45, 1, 214, 52, 218, 45, 1, 222, 227, 218, 45, 30, 5, + 75, 218, 45, 30, 5, 72, 67, 1, 183, 67, 1, 234, 250, 67, 1, 234, 148, 67, + 1, 234, 224, 67, 1, 229, 155, 67, 1, 251, 88, 67, 1, 250, 215, 67, 1, + 250, 42, 67, 1, 250, 146, 67, 1, 228, 35, 67, 1, 249, 30, 67, 1, 216, + 116, 67, 1, 247, 220, 67, 1, 216, 111, 67, 1, 228, 234, 67, 1, 218, 66, + 67, 1, 217, 174, 67, 1, 109, 67, 1, 217, 122, 67, 1, 228, 228, 67, 1, + 252, 234, 67, 1, 226, 59, 67, 1, 225, 186, 67, 1, 226, 33, 67, 1, 231, + 45, 67, 1, 212, 236, 67, 1, 223, 146, 67, 1, 233, 26, 67, 1, 214, 123, + 67, 1, 221, 47, 67, 1, 219, 137, 67, 1, 222, 227, 67, 1, 162, 67, 1, 233, + 255, 67, 1, 225, 11, 67, 236, 101, 30, 224, 253, 67, 236, 101, 30, 225, + 10, 67, 236, 101, 30, 224, 233, 67, 236, 101, 30, 224, 228, 67, 236, 101, + 30, 224, 210, 67, 236, 101, 30, 224, 182, 67, 236, 101, 30, 224, 170, 67, + 236, 101, 30, 224, 169, 67, 236, 101, 30, 223, 37, 67, 236, 101, 30, 223, + 30, 67, 236, 101, 30, 232, 194, 67, 236, 101, 30, 232, 185, 67, 236, 101, + 30, 224, 248, 67, 236, 101, 30, 225, 3, 67, 236, 101, 30, 224, 218, 216, + 22, 118, 67, 236, 101, 30, 224, 218, 216, 22, 112, 67, 236, 101, 30, 224, + 249, 67, 30, 236, 87, 254, 86, 67, 30, 236, 87, 255, 104, 67, 30, 5, 255, + 104, 67, 30, 5, 75, 67, 30, 5, 236, 145, 67, 30, 5, 213, 108, 67, 30, 5, + 212, 161, 67, 30, 5, 72, 67, 30, 5, 215, 98, 67, 30, 5, 215, 202, 67, 30, + 5, 227, 136, 67, 30, 5, 189, 67, 30, 5, 236, 172, 67, 30, 5, 77, 67, 30, + 5, 255, 20, 67, 30, 5, 254, 236, 67, 30, 5, 227, 86, 67, 30, 5, 253, 235, + 67, 5, 229, 101, 67, 5, 224, 53, 67, 5, 212, 172, 67, 5, 230, 192, 67, 5, + 216, 184, 67, 5, 252, 189, 67, 5, 223, 141, 67, 5, 217, 8, 67, 5, 235, + 103, 67, 5, 254, 238, 67, 5, 222, 184, 222, 178, 67, 5, 214, 134, 67, 5, + 250, 36, 67, 5, 252, 163, 67, 5, 234, 243, 67, 5, 252, 183, 67, 5, 251, + 65, 225, 240, 234, 51, 67, 5, 233, 152, 216, 243, 67, 5, 252, 67, 67, 5, + 226, 35, 230, 239, 67, 5, 234, 129, 67, 249, 162, 16, 223, 215, 67, 5, + 253, 217, 67, 5, 253, 238, 67, 21, 212, 79, 67, 21, 118, 67, 21, 112, 67, + 21, 170, 67, 21, 167, 67, 21, 185, 67, 21, 192, 67, 21, 200, 67, 21, 198, + 67, 21, 203, 67, 16, 233, 152, 253, 240, 219, 248, 67, 16, 233, 152, 253, + 240, 230, 211, 67, 16, 233, 152, 253, 240, 225, 239, 67, 16, 233, 152, + 253, 240, 252, 95, 67, 16, 233, 152, 253, 240, 251, 157, 67, 16, 233, + 152, 253, 240, 225, 131, 67, 16, 233, 152, 253, 240, 225, 125, 67, 16, + 233, 152, 253, 240, 225, 123, 67, 16, 233, 152, 253, 240, 225, 129, 67, + 16, 233, 152, 253, 240, 225, 127, 83, 252, 28, 83, 245, 241, 83, 250, 23, + 83, 244, 64, 219, 83, 83, 250, 30, 83, 244, 101, 247, 193, 83, 217, 7, + 219, 255, 241, 21, 83, 220, 135, 3, 251, 223, 232, 32, 83, 232, 61, 250, + 23, 83, 232, 61, 244, 64, 219, 83, 83, 229, 86, 83, 244, 87, 44, 222, + 100, 118, 83, 244, 87, 44, 222, 100, 112, 83, 244, 87, 44, 222, 100, 170, + 83, 30, 221, 80, 83, 21, 212, 79, 83, 21, 118, 83, 21, 112, 83, 21, 170, + 83, 21, 167, 83, 21, 185, 83, 21, 192, 83, 21, 200, 83, 21, 198, 83, 21, + 203, 83, 1, 63, 83, 1, 77, 83, 1, 75, 83, 1, 78, 83, 1, 72, 83, 1, 227, + 136, 83, 1, 215, 189, 83, 1, 246, 30, 83, 1, 207, 83, 1, 254, 151, 83, 1, + 252, 234, 83, 1, 195, 83, 1, 225, 11, 83, 1, 243, 230, 83, 1, 191, 83, 1, + 233, 255, 83, 1, 222, 227, 83, 1, 221, 47, 83, 1, 218, 66, 83, 1, 249, + 30, 83, 1, 250, 215, 83, 1, 236, 0, 83, 1, 189, 83, 1, 208, 83, 1, 214, + 52, 83, 1, 245, 29, 83, 1, 183, 83, 1, 234, 250, 83, 1, 216, 154, 83, 1, + 212, 109, 83, 1, 242, 148, 83, 1, 212, 9, 83, 1, 233, 123, 83, 1, 212, + 62, 83, 1, 250, 170, 83, 1, 217, 7, 187, 30, 53, 83, 1, 217, 7, 77, 83, + 1, 217, 7, 75, 83, 1, 217, 7, 78, 83, 1, 217, 7, 72, 83, 1, 217, 7, 227, + 136, 83, 1, 217, 7, 215, 189, 83, 1, 217, 7, 254, 151, 83, 1, 217, 7, + 252, 234, 83, 1, 217, 7, 195, 83, 1, 217, 7, 225, 11, 83, 1, 217, 7, 243, + 230, 83, 1, 217, 7, 191, 83, 1, 217, 7, 218, 66, 83, 1, 217, 7, 249, 30, + 83, 1, 217, 7, 250, 215, 83, 1, 217, 7, 236, 0, 83, 1, 217, 7, 216, 154, + 83, 1, 217, 7, 189, 83, 1, 217, 7, 214, 52, 83, 1, 217, 7, 183, 83, 1, + 217, 7, 243, 227, 83, 1, 217, 7, 242, 148, 83, 1, 217, 7, 235, 224, 83, + 1, 217, 7, 229, 126, 83, 1, 217, 7, 246, 114, 83, 1, 220, 135, 77, 83, 1, + 220, 135, 75, 83, 1, 220, 135, 236, 11, 83, 1, 220, 135, 215, 189, 83, 1, + 220, 135, 72, 83, 1, 220, 135, 254, 151, 83, 1, 220, 135, 183, 83, 1, + 220, 135, 243, 230, 83, 1, 220, 135, 162, 83, 1, 220, 135, 195, 83, 1, + 220, 135, 221, 47, 83, 1, 220, 135, 218, 66, 83, 1, 220, 135, 249, 30, + 83, 1, 220, 135, 236, 0, 83, 1, 220, 135, 245, 29, 83, 1, 220, 135, 243, + 227, 83, 1, 220, 135, 242, 148, 83, 1, 220, 135, 216, 154, 83, 1, 220, + 135, 212, 109, 83, 1, 220, 135, 224, 109, 83, 1, 220, 135, 250, 215, 83, + 1, 220, 135, 212, 75, 83, 1, 232, 61, 75, 83, 1, 232, 61, 183, 83, 1, + 232, 61, 208, 83, 1, 232, 61, 245, 29, 83, 1, 232, 61, 212, 75, 83, 1, + 254, 198, 243, 212, 254, 114, 118, 83, 1, 254, 198, 243, 212, 214, 133, + 118, 83, 1, 254, 198, 243, 212, 248, 253, 83, 1, 254, 198, 243, 212, 215, + 199, 83, 1, 254, 198, 243, 212, 236, 52, 215, 199, 83, 1, 254, 198, 243, + 212, 252, 201, 83, 1, 254, 198, 243, 212, 137, 252, 201, 83, 1, 254, 198, + 243, 212, 63, 83, 1, 254, 198, 243, 212, 75, 83, 1, 254, 198, 243, 212, + 183, 83, 1, 254, 198, 243, 212, 229, 226, 83, 1, 254, 198, 243, 212, 251, + 88, 83, 1, 254, 198, 243, 212, 216, 128, 83, 1, 254, 198, 243, 212, 216, + 116, 83, 1, 254, 198, 243, 212, 248, 207, 83, 1, 254, 198, 243, 212, 229, + 6, 83, 1, 254, 198, 243, 212, 218, 66, 83, 1, 254, 198, 243, 212, 249, + 30, 83, 1, 254, 198, 243, 212, 195, 83, 1, 254, 198, 243, 212, 226, 59, + 83, 1, 254, 198, 243, 212, 219, 176, 83, 1, 254, 198, 243, 212, 212, 75, + 83, 1, 254, 198, 243, 212, 212, 109, 83, 1, 254, 198, 243, 212, 254, 242, + 83, 1, 217, 7, 254, 198, 243, 212, 218, 66, 83, 1, 217, 7, 254, 198, 243, + 212, 212, 75, 83, 1, 232, 61, 254, 198, 243, 212, 243, 89, 83, 1, 232, + 61, 254, 198, 243, 212, 229, 226, 83, 1, 232, 61, 254, 198, 243, 212, + 251, 88, 83, 1, 232, 61, 254, 198, 243, 212, 235, 230, 83, 1, 232, 61, + 254, 198, 243, 212, 216, 128, 83, 1, 232, 61, 254, 198, 243, 212, 248, + 191, 83, 1, 232, 61, 254, 198, 243, 212, 218, 66, 83, 1, 232, 61, 254, + 198, 243, 212, 248, 97, 83, 1, 232, 61, 254, 198, 243, 212, 219, 176, 83, + 1, 232, 61, 254, 198, 243, 212, 249, 137, 83, 1, 232, 61, 254, 198, 243, + 212, 212, 75, 83, 1, 232, 61, 254, 198, 243, 212, 212, 109, 83, 1, 254, + 198, 243, 212, 157, 72, 83, 1, 254, 198, 243, 212, 157, 189, 83, 1, 232, + 61, 254, 198, 243, 212, 252, 65, 83, 1, 254, 198, 243, 212, 249, 20, 83, + 1, 232, 61, 254, 198, 243, 212, 233, 123, 18, 19, 227, 15, 18, 19, 253, + 210, 18, 19, 255, 60, 18, 19, 214, 12, 18, 19, 225, 137, 18, 19, 226, + 139, 18, 19, 225, 28, 18, 19, 217, 251, 18, 19, 235, 51, 18, 19, 234, 43, + 18, 19, 232, 10, 18, 19, 228, 191, 18, 19, 230, 70, 18, 19, 233, 190, 18, + 19, 219, 228, 18, 19, 222, 152, 18, 19, 220, 177, 18, 19, 221, 11, 18, + 19, 220, 146, 18, 19, 212, 212, 18, 19, 213, 44, 18, 19, 224, 61, 18, 19, + 228, 70, 18, 19, 227, 119, 228, 70, 18, 19, 228, 69, 18, 19, 227, 119, + 228, 69, 18, 19, 228, 68, 18, 19, 227, 119, 228, 68, 18, 19, 228, 67, 18, + 19, 227, 119, 228, 67, 18, 19, 223, 42, 18, 19, 223, 41, 18, 19, 223, 40, + 18, 19, 223, 39, 18, 19, 223, 38, 18, 19, 223, 46, 18, 19, 227, 119, 227, + 11, 18, 19, 227, 119, 218, 113, 18, 19, 227, 119, 235, 141, 18, 19, 227, + 119, 251, 121, 18, 19, 227, 119, 184, 18, 19, 227, 119, 206, 18, 19, 227, + 119, 196, 18, 19, 227, 119, 221, 49, 18, 19, 246, 40, 214, 85, 18, 19, + 213, 251, 214, 85, 18, 19, 41, 4, 223, 164, 18, 19, 41, 224, 83, 247, + 195, 18, 19, 224, 147, 223, 43, 18, 19, 153, 232, 254, 18, 19, 153, 233, + 254, 18, 19, 217, 93, 18, 19, 217, 95, 18, 19, 216, 108, 18, 19, 216, + 110, 18, 19, 216, 115, 18, 19, 217, 16, 18, 19, 217, 18, 18, 19, 222, + 150, 220, 151, 18, 19, 222, 150, 220, 202, 18, 19, 222, 150, 241, 158, + 18, 19, 70, 242, 175, 18, 19, 70, 248, 124, 243, 151, 18, 19, 70, 243, + 227, 18, 19, 70, 242, 180, 18, 19, 222, 150, 235, 151, 18, 19, 70, 235, + 149, 18, 19, 252, 114, 248, 124, 155, 18, 19, 252, 114, 248, 124, 152, + 18, 19, 70, 248, 119, 196, 233, 93, 214, 107, 233, 132, 233, 93, 1, 183, + 233, 93, 1, 234, 250, 233, 93, 1, 243, 230, 233, 93, 1, 243, 89, 233, 93, + 1, 229, 226, 233, 93, 1, 251, 88, 233, 93, 1, 250, 215, 233, 93, 1, 236, + 0, 233, 93, 1, 235, 230, 233, 93, 1, 213, 62, 233, 93, 1, 218, 66, 233, + 93, 1, 217, 174, 233, 93, 1, 249, 30, 233, 93, 1, 248, 97, 233, 93, 1, + 207, 233, 93, 1, 195, 233, 93, 1, 226, 59, 233, 93, 1, 252, 234, 233, 93, + 1, 252, 65, 233, 93, 1, 191, 233, 93, 1, 189, 233, 93, 1, 208, 233, 93, + 1, 233, 255, 233, 93, 1, 214, 52, 233, 93, 1, 221, 47, 233, 93, 1, 219, + 176, 233, 93, 1, 222, 227, 233, 93, 1, 162, 233, 93, 30, 5, 63, 233, 93, + 30, 5, 75, 233, 93, 30, 5, 72, 233, 93, 30, 5, 246, 30, 233, 93, 30, 5, + 254, 236, 233, 93, 30, 5, 227, 86, 233, 93, 30, 5, 253, 235, 233, 93, 30, + 5, 77, 233, 93, 30, 5, 78, 233, 93, 219, 32, 1, 189, 233, 93, 219, 32, 1, + 208, 233, 93, 219, 32, 1, 214, 52, 233, 93, 4, 1, 183, 233, 93, 4, 1, + 229, 226, 233, 93, 4, 1, 254, 113, 233, 93, 4, 1, 218, 66, 233, 93, 4, 1, + 207, 233, 93, 4, 1, 195, 233, 93, 4, 1, 191, 233, 93, 4, 1, 208, 233, 93, + 4, 1, 233, 255, 233, 93, 5, 230, 229, 233, 93, 5, 235, 33, 233, 93, 5, + 222, 226, 233, 93, 5, 232, 254, 233, 93, 245, 119, 79, 233, 93, 224, 193, + 79, 233, 93, 21, 212, 79, 233, 93, 21, 118, 233, 93, 21, 112, 233, 93, + 21, 170, 233, 93, 21, 167, 233, 93, 21, 185, 233, 93, 21, 192, 233, 93, + 21, 200, 233, 93, 21, 198, 233, 93, 21, 203, 39, 233, 181, 1, 183, 39, + 233, 181, 1, 213, 156, 39, 233, 181, 1, 229, 226, 39, 233, 181, 1, 216, + 154, 39, 233, 181, 1, 222, 227, 39, 233, 181, 1, 189, 39, 233, 181, 1, + 218, 66, 39, 233, 181, 1, 217, 174, 39, 233, 181, 1, 233, 255, 39, 233, + 181, 1, 195, 39, 233, 181, 1, 226, 59, 39, 233, 181, 1, 191, 39, 233, + 181, 1, 245, 29, 39, 233, 181, 1, 215, 8, 39, 233, 181, 1, 162, 39, 233, + 181, 1, 225, 11, 39, 233, 181, 1, 234, 250, 39, 233, 181, 1, 216, 146, + 39, 233, 181, 1, 207, 39, 233, 181, 1, 63, 39, 233, 181, 1, 75, 39, 233, + 181, 1, 246, 30, 39, 233, 181, 1, 246, 19, 39, 233, 181, 1, 72, 39, 233, + 181, 1, 227, 86, 39, 233, 181, 1, 78, 39, 233, 181, 1, 215, 189, 39, 233, + 181, 1, 77, 39, 233, 181, 1, 253, 233, 39, 233, 181, 1, 254, 236, 39, + 233, 181, 1, 216, 252, 39, 233, 181, 1, 216, 251, 39, 233, 181, 1, 216, + 250, 39, 233, 181, 1, 216, 249, 39, 233, 181, 1, 216, 248, 163, 39, 169, + 1, 127, 225, 11, 163, 39, 169, 1, 117, 225, 11, 163, 39, 169, 1, 127, + 183, 163, 39, 169, 1, 127, 213, 156, 163, 39, 169, 1, 127, 229, 226, 163, + 39, 169, 1, 117, 183, 163, 39, 169, 1, 117, 213, 156, 163, 39, 169, 1, + 117, 229, 226, 163, 39, 169, 1, 127, 216, 154, 163, 39, 169, 1, 127, 222, + 227, 163, 39, 169, 1, 127, 189, 163, 39, 169, 1, 117, 216, 154, 163, 39, + 169, 1, 117, 222, 227, 163, 39, 169, 1, 117, 189, 163, 39, 169, 1, 127, + 218, 66, 163, 39, 169, 1, 127, 217, 174, 163, 39, 169, 1, 127, 207, 163, + 39, 169, 1, 117, 218, 66, 163, 39, 169, 1, 117, 217, 174, 163, 39, 169, + 1, 117, 207, 163, 39, 169, 1, 127, 195, 163, 39, 169, 1, 127, 226, 59, + 163, 39, 169, 1, 127, 191, 163, 39, 169, 1, 117, 195, 163, 39, 169, 1, + 117, 226, 59, 163, 39, 169, 1, 117, 191, 163, 39, 169, 1, 127, 245, 29, + 163, 39, 169, 1, 127, 215, 8, 163, 39, 169, 1, 127, 233, 255, 163, 39, + 169, 1, 117, 245, 29, 163, 39, 169, 1, 117, 215, 8, 163, 39, 169, 1, 117, + 233, 255, 163, 39, 169, 1, 127, 162, 163, 39, 169, 1, 127, 249, 30, 163, + 39, 169, 1, 127, 252, 234, 163, 39, 169, 1, 117, 162, 163, 39, 169, 1, + 117, 249, 30, 163, 39, 169, 1, 117, 252, 234, 163, 39, 169, 1, 127, 234, + 48, 163, 39, 169, 1, 127, 213, 129, 163, 39, 169, 1, 117, 234, 48, 163, + 39, 169, 1, 117, 213, 129, 163, 39, 169, 1, 127, 219, 40, 163, 39, 169, + 1, 117, 219, 40, 163, 39, 169, 30, 5, 30, 220, 184, 163, 39, 169, 30, 5, + 255, 104, 163, 39, 169, 30, 5, 236, 145, 163, 39, 169, 30, 5, 72, 163, + 39, 169, 30, 5, 215, 98, 163, 39, 169, 30, 5, 77, 163, 39, 169, 30, 5, + 255, 20, 163, 39, 169, 30, 5, 78, 163, 39, 169, 30, 5, 227, 157, 163, 39, + 169, 30, 5, 215, 189, 163, 39, 169, 30, 5, 253, 210, 163, 39, 169, 30, 5, + 255, 60, 163, 39, 169, 30, 5, 215, 91, 163, 39, 169, 30, 5, 227, 15, 163, + 39, 169, 30, 5, 227, 154, 163, 39, 169, 30, 5, 215, 186, 163, 39, 169, + 30, 5, 236, 11, 163, 39, 169, 1, 41, 211, 211, 163, 39, 169, 1, 41, 229, + 228, 163, 39, 169, 1, 41, 206, 163, 39, 169, 1, 41, 184, 163, 39, 169, 1, + 41, 235, 141, 163, 39, 169, 1, 41, 249, 125, 163, 39, 169, 1, 41, 253, + 201, 163, 39, 169, 161, 232, 36, 163, 39, 169, 161, 232, 35, 163, 39, + 169, 21, 212, 79, 163, 39, 169, 21, 118, 163, 39, 169, 21, 112, 163, 39, + 169, 21, 170, 163, 39, 169, 21, 167, 163, 39, 169, 21, 185, 163, 39, 169, + 21, 192, 163, 39, 169, 21, 200, 163, 39, 169, 21, 198, 163, 39, 169, 21, + 203, 163, 39, 169, 89, 21, 118, 163, 39, 169, 5, 233, 241, 163, 39, 169, + 5, 233, 240, 67, 16, 226, 146, 67, 16, 230, 212, 234, 145, 67, 16, 225, + 240, 234, 145, 67, 16, 252, 96, 234, 145, 67, 16, 251, 158, 234, 145, 67, + 16, 225, 132, 234, 145, 67, 16, 225, 126, 234, 145, 67, 16, 225, 124, + 234, 145, 67, 16, 225, 130, 234, 145, 67, 16, 225, 128, 234, 145, 67, 16, + 248, 240, 234, 145, 67, 16, 248, 236, 234, 145, 67, 16, 248, 235, 234, + 145, 67, 16, 248, 238, 234, 145, 67, 16, 248, 237, 234, 145, 67, 16, 248, + 234, 234, 145, 67, 16, 216, 59, 67, 16, 230, 212, 223, 140, 67, 16, 225, + 240, 223, 140, 67, 16, 252, 96, 223, 140, 67, 16, 251, 158, 223, 140, 67, + 16, 225, 132, 223, 140, 67, 16, 225, 126, 223, 140, 67, 16, 225, 124, + 223, 140, 67, 16, 225, 130, 223, 140, 67, 16, 225, 128, 223, 140, 67, 16, + 248, 240, 223, 140, 67, 16, 248, 236, 223, 140, 67, 16, 248, 235, 223, + 140, 67, 16, 248, 238, 223, 140, 67, 16, 248, 237, 223, 140, 67, 16, 248, + 234, 223, 140, 251, 175, 1, 183, 251, 175, 1, 243, 230, 251, 175, 1, 229, + 226, 251, 175, 1, 229, 173, 251, 175, 1, 195, 251, 175, 1, 252, 234, 251, + 175, 1, 191, 251, 175, 1, 230, 245, 251, 175, 1, 218, 66, 251, 175, 1, + 249, 30, 251, 175, 1, 207, 251, 175, 1, 228, 190, 251, 175, 1, 251, 88, + 251, 175, 1, 236, 0, 251, 175, 1, 228, 64, 251, 175, 1, 228, 58, 251, + 175, 1, 189, 251, 175, 1, 208, 251, 175, 1, 233, 255, 251, 175, 1, 215, + 8, 251, 175, 1, 222, 227, 251, 175, 1, 63, 251, 175, 1, 162, 251, 175, + 30, 5, 75, 251, 175, 30, 5, 72, 251, 175, 30, 5, 77, 251, 175, 30, 5, 78, + 251, 175, 30, 5, 255, 20, 251, 175, 226, 224, 251, 175, 245, 222, 68, + 222, 114, 39, 89, 1, 127, 183, 39, 89, 1, 127, 234, 250, 39, 89, 1, 127, + 234, 35, 39, 89, 1, 117, 183, 39, 89, 1, 117, 234, 35, 39, 89, 1, 117, + 234, 250, 39, 89, 1, 229, 226, 39, 89, 1, 127, 251, 88, 39, 89, 1, 127, + 250, 215, 39, 89, 1, 117, 251, 88, 39, 89, 1, 117, 222, 227, 39, 89, 1, + 117, 250, 215, 39, 89, 1, 228, 64, 39, 89, 1, 224, 67, 39, 89, 1, 127, + 224, 65, 39, 89, 1, 249, 30, 39, 89, 1, 117, 224, 65, 39, 89, 1, 224, 76, + 39, 89, 1, 127, 218, 66, 39, 89, 1, 127, 217, 174, 39, 89, 1, 117, 218, + 66, 39, 89, 1, 117, 217, 174, 39, 89, 1, 207, 39, 89, 1, 252, 234, 39, + 89, 1, 127, 195, 39, 89, 1, 127, 226, 59, 39, 89, 1, 127, 245, 29, 39, + 89, 1, 117, 195, 39, 89, 1, 117, 245, 29, 39, 89, 1, 117, 226, 59, 39, + 89, 1, 191, 39, 89, 1, 117, 189, 39, 89, 1, 127, 189, 39, 89, 1, 208, 39, + 89, 1, 223, 74, 39, 89, 1, 233, 255, 39, 89, 1, 232, 225, 39, 89, 1, 214, + 52, 39, 89, 1, 127, 221, 47, 39, 89, 1, 127, 219, 176, 39, 89, 1, 127, + 222, 227, 39, 89, 1, 127, 162, 39, 89, 1, 233, 54, 39, 89, 1, 63, 39, 89, + 1, 117, 162, 39, 89, 1, 75, 39, 89, 1, 236, 145, 39, 89, 1, 72, 39, 89, + 1, 215, 98, 39, 89, 1, 246, 30, 39, 89, 1, 227, 86, 39, 89, 1, 233, 241, + 39, 89, 1, 242, 230, 222, 227, 39, 89, 120, 5, 144, 208, 39, 89, 120, 5, + 144, 233, 255, 39, 89, 120, 5, 234, 0, 218, 22, 233, 231, 39, 89, 5, 232, + 82, 235, 93, 233, 231, 39, 89, 120, 5, 41, 229, 226, 39, 89, 120, 5, 117, + 195, 39, 89, 120, 5, 127, 224, 66, 171, 117, 195, 39, 89, 120, 5, 191, + 39, 89, 120, 5, 252, 234, 39, 89, 120, 5, 222, 227, 39, 89, 5, 222, 205, + 39, 89, 30, 5, 63, 39, 89, 30, 5, 232, 82, 222, 166, 39, 89, 30, 5, 255, + 104, 39, 89, 30, 5, 218, 28, 255, 104, 39, 89, 30, 5, 75, 39, 89, 30, 5, + 236, 145, 39, 89, 30, 5, 215, 189, 39, 89, 30, 5, 215, 97, 39, 89, 30, 5, + 72, 39, 89, 30, 5, 215, 98, 39, 89, 30, 5, 78, 39, 89, 30, 5, 227, 158, + 55, 39, 89, 30, 5, 227, 15, 39, 89, 30, 5, 77, 39, 89, 30, 5, 255, 20, + 39, 89, 30, 5, 227, 86, 39, 89, 30, 5, 254, 236, 39, 89, 30, 5, 89, 254, + 236, 39, 89, 30, 5, 227, 158, 50, 39, 89, 5, 232, 82, 235, 92, 39, 89, 5, + 216, 253, 39, 89, 5, 216, 252, 39, 89, 5, 234, 217, 216, 251, 39, 89, 5, + 234, 217, 216, 250, 39, 89, 5, 234, 217, 216, 249, 39, 89, 5, 224, 112, + 242, 147, 39, 89, 5, 232, 82, 222, 192, 39, 89, 5, 234, 216, 235, 77, 39, + 89, 38, 249, 178, 247, 195, 39, 89, 241, 151, 21, 212, 79, 39, 89, 241, + 151, 21, 118, 39, 89, 241, 151, 21, 112, 39, 89, 241, 151, 21, 170, 39, + 89, 241, 151, 21, 167, 39, 89, 241, 151, 21, 185, 39, 89, 241, 151, 21, + 192, 39, 89, 241, 151, 21, 200, 39, 89, 241, 151, 21, 198, 39, 89, 241, + 151, 21, 203, 39, 89, 89, 21, 212, 79, 39, 89, 89, 21, 118, 39, 89, 89, + 21, 112, 39, 89, 89, 21, 170, 39, 89, 89, 21, 167, 39, 89, 89, 21, 185, + 39, 89, 89, 21, 192, 39, 89, 89, 21, 200, 39, 89, 89, 21, 198, 39, 89, + 89, 21, 203, 39, 89, 5, 213, 237, 39, 89, 5, 213, 236, 39, 89, 5, 222, + 156, 39, 89, 5, 235, 22, 39, 89, 5, 241, 81, 39, 89, 5, 247, 209, 39, 89, + 5, 223, 236, 223, 123, 224, 76, 39, 89, 5, 232, 82, 213, 63, 39, 89, 5, + 235, 124, 39, 89, 5, 235, 123, 39, 89, 5, 222, 163, 39, 89, 5, 222, 162, + 39, 89, 5, 242, 112, 39, 89, 5, 251, 85, 101, 5, 215, 176, 223, 217, 101, + 5, 215, 176, 251, 57, 101, 5, 250, 243, 101, 5, 218, 229, 101, 5, 252, + 25, 101, 1, 254, 219, 101, 1, 254, 220, 217, 234, 101, 1, 236, 141, 101, + 1, 236, 142, 217, 234, 101, 1, 215, 179, 101, 1, 215, 180, 217, 234, 101, + 1, 224, 112, 224, 7, 101, 1, 224, 112, 224, 8, 217, 234, 101, 1, 234, 0, + 233, 146, 101, 1, 234, 0, 233, 147, 217, 234, 101, 1, 246, 1, 101, 1, + 254, 234, 101, 1, 227, 115, 101, 1, 227, 116, 217, 234, 101, 1, 183, 101, + 1, 235, 131, 232, 85, 101, 1, 243, 230, 101, 1, 243, 231, 243, 1, 101, 1, + 229, 226, 101, 1, 251, 88, 101, 1, 251, 89, 233, 244, 101, 1, 236, 0, + 101, 1, 236, 1, 235, 234, 101, 1, 228, 64, 101, 1, 218, 67, 233, 198, + 101, 1, 218, 67, 230, 207, 232, 85, 101, 1, 249, 31, 230, 207, 254, 181, + 101, 1, 249, 31, 230, 207, 232, 85, 101, 1, 230, 115, 224, 79, 101, 1, + 218, 66, 101, 1, 218, 67, 217, 255, 101, 1, 249, 30, 101, 1, 249, 31, + 232, 103, 101, 1, 207, 101, 1, 195, 101, 1, 226, 252, 235, 88, 101, 1, + 252, 234, 101, 1, 252, 235, 235, 34, 101, 1, 191, 101, 1, 189, 101, 1, + 208, 101, 1, 233, 255, 101, 1, 214, 52, 101, 1, 222, 228, 222, 214, 101, + 1, 222, 228, 222, 173, 101, 1, 222, 227, 101, 1, 162, 101, 5, 224, 0, + 101, 30, 5, 217, 234, 101, 30, 5, 215, 175, 101, 30, 5, 215, 176, 222, + 169, 101, 30, 5, 219, 6, 101, 30, 5, 219, 7, 236, 133, 101, 30, 5, 224, + 112, 224, 7, 101, 30, 5, 224, 112, 224, 8, 217, 234, 101, 30, 5, 234, 0, + 233, 146, 101, 30, 5, 234, 0, 233, 147, 217, 234, 101, 30, 5, 218, 29, + 101, 30, 5, 218, 30, 224, 7, 101, 30, 5, 218, 30, 217, 234, 101, 30, 5, + 218, 30, 224, 8, 217, 234, 101, 30, 5, 226, 95, 101, 30, 5, 226, 96, 217, + 234, 101, 255, 27, 255, 26, 101, 1, 235, 113, 222, 168, 101, 1, 234, 221, + 222, 168, 101, 1, 216, 7, 222, 168, 101, 1, 246, 25, 222, 168, 101, 1, + 214, 238, 222, 168, 101, 1, 212, 100, 222, 168, 101, 1, 253, 252, 222, + 168, 101, 21, 212, 79, 101, 21, 118, 101, 21, 112, 101, 21, 170, 101, 21, + 167, 101, 21, 185, 101, 21, 192, 101, 21, 200, 101, 21, 198, 101, 21, + 203, 101, 226, 194, 101, 226, 219, 101, 213, 226, 101, 251, 36, 226, 212, + 101, 251, 36, 220, 117, 101, 251, 36, 226, 167, 101, 226, 218, 101, 27, + 16, 247, 201, 101, 27, 16, 248, 123, 101, 27, 16, 246, 140, 101, 27, 16, + 248, 243, 101, 27, 16, 248, 244, 218, 229, 101, 27, 16, 248, 22, 101, 27, + 16, 249, 23, 101, 27, 16, 248, 105, 101, 27, 16, 249, 9, 101, 27, 16, + 248, 244, 243, 153, 101, 27, 16, 38, 217, 230, 101, 27, 16, 38, 245, 220, + 101, 27, 16, 38, 235, 29, 101, 27, 16, 38, 235, 31, 101, 27, 16, 38, 235, + 238, 101, 27, 16, 38, 235, 30, 2, 235, 238, 101, 27, 16, 38, 235, 32, 2, + 235, 238, 101, 27, 16, 38, 252, 84, 101, 27, 16, 38, 243, 5, 101, 27, 16, + 223, 180, 210, 246, 150, 101, 27, 16, 223, 180, 210, 249, 21, 101, 27, + 16, 223, 180, 250, 60, 216, 83, 101, 27, 16, 223, 180, 250, 60, 218, 36, + 101, 27, 16, 233, 166, 210, 226, 207, 101, 27, 16, 233, 166, 210, 225, + 61, 101, 27, 16, 233, 166, 250, 60, 225, 206, 101, 27, 16, 233, 166, 250, + 60, 225, 196, 101, 27, 16, 233, 166, 210, 225, 229, 218, 251, 5, 226, + 191, 218, 251, 5, 226, 203, 218, 251, 5, 226, 200, 218, 251, 1, 63, 218, + 251, 1, 75, 218, 251, 1, 72, 218, 251, 1, 255, 20, 218, 251, 1, 78, 218, + 251, 1, 77, 218, 251, 1, 245, 143, 218, 251, 1, 183, 218, 251, 1, 225, + 11, 218, 251, 1, 243, 230, 218, 251, 1, 229, 226, 218, 251, 1, 251, 88, + 218, 251, 1, 236, 0, 218, 251, 1, 212, 109, 218, 251, 1, 228, 64, 218, + 251, 1, 218, 66, 218, 251, 1, 249, 30, 218, 251, 1, 207, 218, 251, 1, + 195, 218, 251, 1, 245, 29, 218, 251, 1, 215, 8, 218, 251, 1, 252, 234, + 218, 251, 1, 191, 218, 251, 1, 189, 218, 251, 1, 208, 218, 251, 1, 233, + 255, 218, 251, 1, 214, 52, 218, 251, 1, 222, 227, 218, 251, 1, 213, 156, + 218, 251, 1, 162, 218, 251, 120, 5, 226, 216, 218, 251, 120, 5, 226, 193, + 218, 251, 120, 5, 226, 190, 218, 251, 30, 5, 226, 206, 218, 251, 30, 5, + 226, 189, 218, 251, 30, 5, 226, 210, 218, 251, 30, 5, 226, 199, 218, 251, + 30, 5, 226, 217, 218, 251, 30, 5, 226, 208, 218, 251, 5, 226, 220, 218, + 251, 1, 234, 250, 218, 251, 1, 218, 190, 218, 251, 21, 212, 79, 218, 251, + 21, 118, 218, 251, 21, 112, 218, 251, 21, 170, 218, 251, 21, 167, 218, + 251, 21, 185, 218, 251, 21, 192, 218, 251, 21, 200, 218, 251, 21, 198, + 218, 251, 21, 203, 252, 166, 1, 63, 252, 166, 1, 220, 109, 63, 252, 166, + 1, 162, 252, 166, 1, 220, 109, 162, 252, 166, 1, 232, 59, 162, 252, 166, + 1, 252, 234, 252, 166, 1, 235, 74, 252, 234, 252, 166, 1, 195, 252, 166, + 1, 220, 109, 195, 252, 166, 1, 207, 252, 166, 1, 232, 59, 207, 252, 166, + 1, 214, 52, 252, 166, 1, 220, 109, 214, 52, 252, 166, 1, 226, 231, 214, + 52, 252, 166, 1, 243, 230, 252, 166, 1, 220, 109, 243, 230, 252, 166, 1, + 236, 0, 252, 166, 1, 249, 30, 252, 166, 1, 208, 252, 166, 1, 220, 109, + 208, 252, 166, 1, 191, 252, 166, 1, 220, 109, 191, 252, 166, 1, 219, 232, + 218, 66, 252, 166, 1, 228, 209, 218, 66, 252, 166, 1, 222, 227, 252, 166, + 1, 220, 109, 222, 227, 252, 166, 1, 232, 59, 222, 227, 252, 166, 1, 189, + 252, 166, 1, 220, 109, 189, 252, 166, 1, 229, 226, 252, 166, 1, 233, 255, + 252, 166, 1, 220, 109, 233, 255, 252, 166, 1, 228, 64, 252, 166, 1, 251, + 88, 252, 166, 1, 230, 39, 252, 166, 1, 232, 1, 252, 166, 1, 75, 252, 166, + 1, 72, 252, 166, 5, 217, 1, 252, 166, 30, 5, 77, 252, 166, 30, 5, 226, + 231, 77, 252, 166, 30, 5, 246, 30, 252, 166, 30, 5, 75, 252, 166, 30, 5, + 235, 74, 75, 252, 166, 30, 5, 78, 252, 166, 30, 5, 235, 74, 78, 252, 166, + 30, 5, 72, 252, 166, 30, 5, 103, 31, 220, 109, 222, 227, 252, 166, 120, + 5, 229, 228, 252, 166, 120, 5, 242, 162, 252, 166, 226, 202, 252, 166, + 226, 198, 252, 166, 16, 252, 33, 230, 115, 231, 174, 252, 166, 16, 252, + 33, 225, 232, 252, 166, 16, 252, 33, 235, 165, 252, 166, 16, 252, 33, + 226, 202, 186, 1, 183, 186, 1, 234, 159, 186, 1, 234, 250, 186, 1, 243, + 230, 186, 1, 243, 26, 186, 1, 229, 226, 186, 1, 251, 88, 186, 1, 250, + 215, 186, 1, 236, 0, 186, 1, 228, 64, 186, 1, 218, 66, 186, 1, 217, 174, + 186, 1, 249, 30, 186, 1, 207, 186, 1, 195, 186, 1, 225, 210, 186, 1, 226, + 59, 186, 1, 245, 29, 186, 1, 244, 164, 186, 1, 252, 234, 186, 1, 252, 14, + 186, 1, 191, 186, 1, 231, 51, 186, 1, 216, 154, 186, 1, 216, 146, 186, 1, + 246, 114, 186, 1, 189, 186, 1, 208, 186, 1, 233, 255, 186, 1, 162, 186, + 1, 242, 2, 186, 1, 215, 8, 186, 1, 222, 227, 186, 1, 221, 47, 186, 1, + 214, 52, 186, 1, 63, 186, 219, 32, 1, 189, 186, 219, 32, 1, 208, 186, 30, + 5, 255, 104, 186, 30, 5, 75, 186, 30, 5, 78, 186, 30, 5, 227, 86, 186, + 30, 5, 72, 186, 30, 5, 215, 98, 186, 30, 5, 77, 186, 120, 5, 235, 141, + 186, 120, 5, 184, 186, 120, 5, 155, 186, 120, 5, 206, 186, 120, 5, 227, + 11, 186, 120, 5, 152, 186, 120, 5, 218, 113, 186, 120, 5, 228, 43, 186, + 120, 5, 235, 92, 186, 5, 224, 77, 186, 5, 228, 103, 186, 225, 63, 218, + 65, 186, 225, 63, 228, 52, 217, 87, 218, 65, 186, 225, 63, 250, 221, 186, + 225, 63, 216, 141, 250, 221, 186, 225, 63, 216, 140, 186, 21, 212, 79, + 186, 21, 118, 186, 21, 112, 186, 21, 170, 186, 21, 167, 186, 21, 185, + 186, 21, 192, 186, 21, 200, 186, 21, 198, 186, 21, 203, 186, 1, 216, 128, + 186, 1, 216, 116, 186, 1, 248, 207, 227, 113, 250, 163, 21, 212, 79, 227, + 113, 250, 163, 21, 118, 227, 113, 250, 163, 21, 112, 227, 113, 250, 163, + 21, 170, 227, 113, 250, 163, 21, 167, 227, 113, 250, 163, 21, 185, 227, + 113, 250, 163, 21, 192, 227, 113, 250, 163, 21, 200, 227, 113, 250, 163, + 21, 198, 227, 113, 250, 163, 21, 203, 227, 113, 250, 163, 1, 233, 255, + 227, 113, 250, 163, 1, 253, 249, 227, 113, 250, 163, 1, 254, 249, 227, + 113, 250, 163, 1, 254, 151, 227, 113, 250, 163, 1, 254, 213, 227, 113, + 250, 163, 1, 233, 254, 227, 113, 250, 163, 1, 255, 66, 227, 113, 250, + 163, 1, 255, 67, 227, 113, 250, 163, 1, 255, 65, 227, 113, 250, 163, 1, + 255, 61, 227, 113, 250, 163, 1, 233, 111, 227, 113, 250, 163, 1, 236, 30, + 227, 113, 250, 163, 1, 236, 146, 227, 113, 250, 163, 1, 236, 49, 227, + 113, 250, 163, 1, 236, 38, 227, 113, 250, 163, 1, 232, 230, 227, 113, + 250, 163, 1, 215, 196, 227, 113, 250, 163, 1, 215, 194, 227, 113, 250, + 163, 1, 215, 145, 227, 113, 250, 163, 1, 215, 91, 227, 113, 250, 163, 1, + 233, 180, 227, 113, 250, 163, 1, 245, 191, 227, 113, 250, 163, 1, 246, + 33, 227, 113, 250, 163, 1, 245, 229, 227, 113, 250, 163, 1, 245, 170, + 227, 113, 250, 163, 1, 233, 26, 227, 113, 250, 163, 1, 227, 43, 227, 113, + 250, 163, 1, 227, 153, 227, 113, 250, 163, 1, 227, 31, 227, 113, 250, + 163, 1, 227, 125, 227, 113, 250, 163, 230, 243, 216, 93, 227, 113, 250, + 163, 243, 225, 216, 94, 227, 113, 250, 163, 230, 241, 216, 94, 227, 113, + 250, 163, 224, 20, 227, 113, 250, 163, 226, 57, 227, 113, 250, 163, 254, + 241, 227, 113, 250, 163, 225, 63, 230, 238, 227, 113, 250, 163, 225, 63, + 52, 230, 238, 214, 234, 161, 235, 72, 214, 234, 161, 221, 22, 214, 234, + 161, 225, 114, 214, 234, 5, 229, 104, 214, 234, 5, 213, 71, 231, 105, + 218, 215, 214, 234, 161, 213, 71, 254, 246, 236, 101, 218, 215, 214, 234, + 161, 213, 71, 236, 101, 218, 215, 214, 234, 161, 213, 71, 235, 60, 236, + 101, 218, 215, 214, 234, 161, 251, 58, 55, 214, 234, 161, 213, 71, 235, + 60, 236, 101, 218, 216, 222, 138, 214, 234, 161, 52, 218, 215, 214, 234, + 161, 216, 182, 218, 215, 214, 234, 161, 235, 60, 254, 115, 214, 234, 161, + 62, 55, 214, 234, 161, 119, 181, 55, 214, 234, 161, 137, 181, 55, 214, + 234, 161, 223, 171, 235, 71, 236, 101, 218, 215, 214, 234, 161, 253, 247, + 236, 101, 218, 215, 214, 234, 5, 214, 133, 218, 215, 214, 234, 5, 214, + 133, 215, 191, 214, 234, 5, 223, 236, 214, 133, 215, 191, 214, 234, 5, + 214, 133, 254, 115, 214, 234, 5, 223, 236, 214, 133, 254, 115, 214, 234, + 5, 214, 133, 215, 192, 2, 218, 40, 214, 234, 5, 214, 133, 254, 116, 2, + 218, 40, 214, 234, 5, 254, 114, 254, 129, 214, 234, 5, 254, 114, 252, + 212, 214, 234, 5, 254, 114, 215, 2, 214, 234, 5, 254, 114, 215, 3, 2, + 218, 40, 214, 234, 5, 217, 35, 214, 234, 5, 242, 39, 187, 254, 113, 214, + 234, 5, 187, 254, 113, 214, 234, 5, 223, 79, 187, 254, 113, 214, 234, 5, + 254, 114, 215, 198, 230, 230, 214, 234, 5, 254, 61, 7, 1, 4, 6, 63, 7, 1, + 4, 6, 255, 20, 7, 4, 1, 216, 66, 255, 20, 7, 1, 4, 6, 252, 180, 253, 201, + 7, 1, 4, 6, 251, 121, 7, 1, 4, 6, 249, 125, 7, 1, 4, 6, 245, 146, 7, 1, + 4, 6, 77, 7, 4, 1, 216, 66, 210, 77, 7, 4, 1, 216, 66, 75, 7, 1, 4, 6, + 236, 3, 7, 1, 4, 6, 235, 141, 7, 1, 4, 6, 234, 13, 2, 91, 7, 1, 4, 6, + 184, 7, 1, 4, 6, 223, 236, 206, 7, 1, 4, 6, 78, 7, 1, 4, 6, 210, 78, 7, + 4, 1, 220, 132, 78, 7, 4, 1, 220, 132, 210, 78, 7, 4, 1, 220, 132, 141, + 2, 91, 7, 4, 1, 216, 66, 227, 136, 7, 1, 4, 6, 227, 40, 7, 4, 1, 216, + 240, 157, 78, 7, 4, 1, 251, 226, 157, 78, 7, 1, 4, 6, 227, 11, 7, 1, 4, + 6, 223, 236, 152, 7, 1, 4, 6, 216, 66, 152, 7, 1, 4, 6, 218, 113, 7, 1, + 4, 6, 72, 7, 4, 1, 220, 132, 72, 7, 4, 1, 220, 132, 248, 73, 72, 7, 4, 1, + 220, 132, 216, 66, 184, 7, 1, 4, 6, 211, 211, 7, 1, 4, 6, 214, 85, 7, 1, + 4, 6, 212, 152, 7, 1, 4, 6, 245, 97, 7, 1, 214, 120, 233, 204, 219, 201, + 7, 1, 254, 231, 25, 1, 4, 6, 243, 203, 25, 1, 4, 6, 233, 220, 25, 1, 4, + 6, 226, 20, 25, 1, 4, 6, 223, 224, 25, 1, 4, 6, 225, 82, 33, 1, 4, 6, + 245, 252, 59, 1, 6, 63, 59, 1, 6, 255, 20, 59, 1, 6, 253, 201, 59, 1, 6, + 252, 180, 253, 201, 59, 1, 6, 249, 125, 59, 1, 6, 77, 59, 1, 6, 223, 236, + 77, 59, 1, 6, 244, 41, 59, 1, 6, 242, 162, 59, 1, 6, 75, 59, 1, 6, 236, + 3, 59, 1, 6, 235, 141, 59, 1, 6, 155, 59, 1, 6, 184, 59, 1, 6, 206, 59, + 1, 6, 223, 236, 206, 59, 1, 6, 78, 59, 1, 6, 227, 40, 59, 1, 6, 227, 11, + 59, 1, 6, 152, 59, 1, 6, 218, 113, 59, 1, 6, 72, 59, 1, 6, 214, 85, 59, + 1, 4, 63, 59, 1, 4, 216, 66, 63, 59, 1, 4, 254, 179, 59, 1, 4, 216, 66, + 255, 20, 59, 1, 4, 253, 201, 59, 1, 4, 249, 125, 59, 1, 4, 77, 59, 1, 4, + 222, 136, 59, 1, 4, 210, 77, 59, 1, 4, 216, 66, 210, 77, 59, 1, 4, 244, + 41, 59, 1, 4, 216, 66, 75, 59, 1, 4, 235, 141, 59, 1, 4, 184, 59, 1, 4, + 245, 217, 59, 1, 4, 78, 59, 1, 4, 210, 78, 59, 1, 4, 216, 240, 157, 78, + 59, 1, 4, 251, 226, 157, 78, 59, 1, 4, 227, 11, 59, 1, 4, 218, 113, 59, + 1, 4, 72, 59, 1, 4, 220, 132, 72, 59, 1, 4, 216, 66, 184, 59, 1, 4, 211, + 211, 59, 1, 4, 254, 231, 59, 1, 4, 252, 73, 59, 1, 4, 25, 243, 203, 59, + 1, 4, 248, 126, 59, 1, 4, 25, 226, 45, 59, 1, 4, 250, 170, 7, 219, 24, 4, + 1, 75, 7, 219, 24, 4, 1, 152, 7, 219, 24, 4, 1, 72, 7, 219, 24, 4, 1, + 211, 211, 25, 219, 24, 4, 1, 252, 73, 25, 219, 24, 4, 1, 243, 203, 25, + 219, 24, 4, 1, 223, 224, 25, 219, 24, 4, 1, 226, 45, 25, 219, 24, 4, 1, + 250, 170, 7, 4, 1, 215, 189, 7, 4, 1, 57, 2, 231, 107, 177, 7, 4, 1, 249, + 126, 2, 231, 107, 177, 7, 4, 1, 245, 96, 2, 231, 107, 177, 7, 4, 1, 232, + 183, 2, 231, 107, 177, 7, 4, 1, 230, 167, 2, 231, 107, 177, 7, 4, 1, 227, + 12, 2, 231, 107, 177, 7, 4, 1, 224, 148, 2, 231, 107, 177, 7, 4, 1, 224, + 148, 2, 244, 177, 22, 231, 107, 177, 7, 4, 1, 223, 29, 2, 231, 107, 177, + 7, 4, 1, 218, 114, 2, 231, 107, 177, 7, 4, 1, 212, 153, 2, 231, 107, 177, + 7, 4, 1, 216, 66, 244, 41, 59, 1, 33, 245, 229, 7, 4, 1, 236, 71, 244, + 41, 7, 4, 1, 217, 177, 2, 219, 61, 7, 4, 6, 1, 241, 7, 2, 91, 7, 4, 1, + 236, 45, 2, 91, 7, 4, 1, 227, 12, 2, 91, 7, 4, 6, 1, 103, 2, 91, 7, 4, 1, + 215, 135, 2, 91, 7, 4, 1, 57, 2, 226, 230, 102, 7, 4, 1, 249, 126, 2, + 226, 230, 102, 7, 4, 1, 245, 96, 2, 226, 230, 102, 7, 4, 1, 244, 42, 2, + 226, 230, 102, 7, 4, 1, 235, 142, 2, 226, 230, 102, 7, 4, 1, 234, 13, 2, + 226, 230, 102, 7, 4, 1, 232, 183, 2, 226, 230, 102, 7, 4, 1, 230, 167, 2, + 226, 230, 102, 7, 4, 1, 227, 12, 2, 226, 230, 102, 7, 4, 1, 224, 148, 2, + 226, 230, 102, 7, 4, 1, 223, 29, 2, 226, 230, 102, 7, 4, 1, 245, 162, 2, + 226, 230, 102, 7, 4, 1, 215, 86, 2, 226, 230, 102, 7, 4, 1, 213, 170, 2, + 226, 230, 102, 7, 4, 1, 212, 153, 2, 226, 230, 102, 7, 4, 1, 111, 2, 223, + 241, 102, 7, 4, 1, 254, 180, 2, 223, 241, 102, 7, 4, 1, 249, 126, 2, 241, + 157, 22, 218, 40, 7, 4, 1, 154, 2, 223, 241, 102, 7, 4, 1, 210, 154, 2, + 223, 241, 102, 7, 4, 1, 223, 236, 210, 154, 2, 223, 241, 102, 7, 4, 1, + 222, 137, 2, 223, 241, 102, 7, 4, 1, 241, 7, 2, 223, 241, 102, 7, 4, 1, + 210, 141, 2, 223, 241, 102, 7, 4, 1, 245, 162, 2, 223, 241, 102, 7, 4, 1, + 103, 2, 223, 241, 102, 7, 4, 1, 245, 98, 2, 223, 241, 102, 59, 1, 4, 216, + 66, 254, 179, 59, 1, 4, 251, 121, 59, 1, 4, 251, 122, 2, 249, 164, 59, 1, + 4, 245, 146, 59, 1, 4, 223, 236, 210, 77, 59, 1, 4, 245, 95, 59, 1, 4, + 247, 194, 236, 4, 2, 91, 59, 1, 4, 115, 244, 41, 59, 1, 4, 216, 66, 242, + 162, 59, 1, 4, 241, 7, 2, 91, 59, 1, 4, 236, 44, 59, 1, 4, 6, 75, 59, 1, + 4, 6, 241, 7, 2, 91, 59, 1, 4, 236, 4, 2, 249, 190, 59, 1, 4, 234, 13, 2, + 223, 241, 102, 59, 1, 4, 234, 13, 2, 226, 230, 102, 59, 1, 4, 6, 155, 59, + 1, 4, 232, 183, 2, 102, 59, 1, 4, 216, 66, 232, 183, 2, 187, 233, 158, + 59, 1, 4, 230, 167, 2, 43, 102, 59, 1, 4, 230, 167, 2, 223, 241, 102, 59, + 1, 4, 6, 206, 59, 1, 4, 252, 180, 78, 59, 1, 4, 226, 45, 59, 1, 4, 223, + 29, 2, 102, 59, 1, 4, 245, 161, 59, 1, 4, 218, 114, 2, 226, 230, 102, 59, + 1, 4, 103, 134, 59, 1, 4, 215, 134, 59, 1, 4, 6, 72, 59, 1, 4, 215, 86, + 2, 102, 59, 1, 4, 216, 66, 211, 211, 59, 1, 4, 212, 152, 59, 1, 4, 212, + 153, 2, 223, 241, 102, 59, 1, 4, 212, 153, 2, 249, 164, 59, 1, 4, 245, + 97, 59, 1, 4, 217, 145, 38, 246, 193, 242, 234, 255, 46, 38, 246, 193, + 255, 36, 255, 46, 38, 220, 16, 55, 38, 218, 221, 79, 38, 232, 109, 38, + 242, 232, 38, 232, 107, 38, 255, 34, 38, 242, 233, 38, 255, 35, 38, 7, 4, + 1, 224, 148, 55, 38, 251, 198, 38, 232, 108, 38, 52, 250, 91, 50, 38, + 227, 128, 50, 38, 212, 28, 55, 38, 236, 31, 55, 38, 215, 128, 50, 38, + 215, 111, 50, 38, 7, 4, 1, 244, 152, 210, 111, 50, 38, 7, 4, 1, 255, 20, + 38, 7, 4, 1, 254, 111, 38, 7, 4, 1, 253, 219, 38, 7, 4, 1, 251, 122, 250, + 240, 38, 7, 4, 1, 236, 71, 249, 125, 38, 7, 4, 1, 245, 146, 38, 7, 4, 1, + 244, 41, 38, 7, 1, 4, 6, 244, 41, 38, 7, 4, 1, 235, 141, 38, 7, 4, 1, + 155, 38, 7, 1, 4, 6, 155, 38, 7, 1, 4, 6, 184, 38, 7, 4, 1, 206, 38, 7, + 1, 4, 6, 206, 38, 7, 1, 4, 6, 152, 38, 7, 4, 1, 224, 148, 223, 122, 38, + 7, 4, 1, 196, 38, 7, 4, 1, 187, 196, 38, 7, 4, 1, 212, 152, 38, 52, 236, + 52, 251, 200, 55, 38, 254, 184, 126, 217, 10, 55, 38, 43, 254, 36, 50, + 38, 47, 254, 36, 22, 121, 254, 36, 55, 7, 6, 1, 111, 2, 223, 165, 55, 7, + 4, 1, 111, 2, 223, 165, 55, 7, 6, 1, 57, 2, 62, 50, 7, 4, 1, 57, 2, 62, + 50, 7, 6, 1, 57, 2, 62, 55, 7, 4, 1, 57, 2, 62, 55, 7, 6, 1, 57, 2, 233, + 84, 55, 7, 4, 1, 57, 2, 233, 84, 55, 7, 6, 1, 251, 122, 2, 250, 241, 22, + 138, 7, 4, 1, 251, 122, 2, 250, 241, 22, 138, 7, 6, 1, 249, 126, 2, 62, + 50, 7, 4, 1, 249, 126, 2, 62, 50, 7, 6, 1, 249, 126, 2, 62, 55, 7, 4, 1, + 249, 126, 2, 62, 55, 7, 6, 1, 249, 126, 2, 233, 84, 55, 7, 4, 1, 249, + 126, 2, 233, 84, 55, 7, 6, 1, 249, 126, 2, 250, 240, 7, 4, 1, 249, 126, + 2, 250, 240, 7, 6, 1, 249, 126, 2, 250, 91, 55, 7, 4, 1, 249, 126, 2, + 250, 91, 55, 7, 6, 1, 154, 2, 232, 111, 22, 209, 7, 4, 1, 154, 2, 232, + 111, 22, 209, 7, 6, 1, 154, 2, 232, 111, 22, 138, 7, 4, 1, 154, 2, 232, + 111, 22, 138, 7, 6, 1, 154, 2, 250, 91, 55, 7, 4, 1, 154, 2, 250, 91, 55, + 7, 6, 1, 154, 2, 217, 56, 55, 7, 4, 1, 154, 2, 217, 56, 55, 7, 6, 1, 154, + 2, 250, 241, 22, 251, 199, 7, 4, 1, 154, 2, 250, 241, 22, 251, 199, 7, 6, + 1, 245, 96, 2, 62, 50, 7, 4, 1, 245, 96, 2, 62, 50, 7, 6, 1, 244, 42, 2, + 232, 110, 7, 4, 1, 244, 42, 2, 232, 110, 7, 6, 1, 242, 163, 2, 62, 50, 7, + 4, 1, 242, 163, 2, 62, 50, 7, 6, 1, 242, 163, 2, 62, 55, 7, 4, 1, 242, + 163, 2, 62, 55, 7, 6, 1, 242, 163, 2, 248, 74, 7, 4, 1, 242, 163, 2, 248, + 74, 7, 6, 1, 242, 163, 2, 250, 240, 7, 4, 1, 242, 163, 2, 250, 240, 7, 6, + 1, 242, 163, 2, 251, 200, 55, 7, 4, 1, 242, 163, 2, 251, 200, 55, 7, 6, + 1, 241, 7, 2, 217, 56, 55, 7, 4, 1, 241, 7, 2, 217, 56, 55, 7, 6, 1, 241, + 7, 2, 248, 75, 22, 138, 7, 4, 1, 241, 7, 2, 248, 75, 22, 138, 7, 6, 1, + 235, 142, 2, 138, 7, 4, 1, 235, 142, 2, 138, 7, 6, 1, 235, 142, 2, 62, + 55, 7, 4, 1, 235, 142, 2, 62, 55, 7, 6, 1, 235, 142, 2, 233, 84, 55, 7, + 4, 1, 235, 142, 2, 233, 84, 55, 7, 6, 1, 234, 13, 2, 62, 55, 7, 4, 1, + 234, 13, 2, 62, 55, 7, 6, 1, 234, 13, 2, 62, 252, 90, 22, 232, 110, 7, 4, + 1, 234, 13, 2, 62, 252, 90, 22, 232, 110, 7, 6, 1, 234, 13, 2, 233, 84, + 55, 7, 4, 1, 234, 13, 2, 233, 84, 55, 7, 6, 1, 234, 13, 2, 250, 91, 55, + 7, 4, 1, 234, 13, 2, 250, 91, 55, 7, 6, 1, 232, 183, 2, 138, 7, 4, 1, + 232, 183, 2, 138, 7, 6, 1, 232, 183, 2, 62, 50, 7, 4, 1, 232, 183, 2, 62, + 50, 7, 6, 1, 232, 183, 2, 62, 55, 7, 4, 1, 232, 183, 2, 62, 55, 7, 6, 1, + 230, 167, 2, 62, 50, 7, 4, 1, 230, 167, 2, 62, 50, 7, 6, 1, 230, 167, 2, + 62, 55, 7, 4, 1, 230, 167, 2, 62, 55, 7, 6, 1, 230, 167, 2, 233, 84, 55, + 7, 4, 1, 230, 167, 2, 233, 84, 55, 7, 6, 1, 230, 167, 2, 250, 91, 55, 7, + 4, 1, 230, 167, 2, 250, 91, 55, 7, 6, 1, 141, 2, 217, 56, 22, 138, 7, 4, + 1, 141, 2, 217, 56, 22, 138, 7, 6, 1, 141, 2, 217, 56, 22, 248, 74, 7, 4, + 1, 141, 2, 217, 56, 22, 248, 74, 7, 6, 1, 141, 2, 232, 111, 22, 209, 7, + 4, 1, 141, 2, 232, 111, 22, 209, 7, 6, 1, 141, 2, 232, 111, 22, 138, 7, + 4, 1, 141, 2, 232, 111, 22, 138, 7, 6, 1, 227, 12, 2, 138, 7, 4, 1, 227, + 12, 2, 138, 7, 6, 1, 227, 12, 2, 62, 50, 7, 4, 1, 227, 12, 2, 62, 50, 7, + 6, 1, 224, 148, 2, 62, 50, 7, 4, 1, 224, 148, 2, 62, 50, 7, 6, 1, 224, + 148, 2, 62, 55, 7, 4, 1, 224, 148, 2, 62, 55, 7, 6, 1, 224, 148, 2, 62, + 252, 90, 22, 232, 110, 7, 4, 1, 224, 148, 2, 62, 252, 90, 22, 232, 110, + 7, 6, 1, 224, 148, 2, 233, 84, 55, 7, 4, 1, 224, 148, 2, 233, 84, 55, 7, + 6, 1, 223, 29, 2, 62, 50, 7, 4, 1, 223, 29, 2, 62, 50, 7, 6, 1, 223, 29, + 2, 62, 55, 7, 4, 1, 223, 29, 2, 62, 55, 7, 6, 1, 223, 29, 2, 255, 36, 22, + 62, 50, 7, 4, 1, 223, 29, 2, 255, 36, 22, 62, 50, 7, 6, 1, 223, 29, 2, + 251, 35, 22, 62, 50, 7, 4, 1, 223, 29, 2, 251, 35, 22, 62, 50, 7, 6, 1, + 223, 29, 2, 62, 252, 90, 22, 62, 50, 7, 4, 1, 223, 29, 2, 62, 252, 90, + 22, 62, 50, 7, 6, 1, 218, 114, 2, 62, 50, 7, 4, 1, 218, 114, 2, 62, 50, + 7, 6, 1, 218, 114, 2, 62, 55, 7, 4, 1, 218, 114, 2, 62, 55, 7, 6, 1, 218, + 114, 2, 233, 84, 55, 7, 4, 1, 218, 114, 2, 233, 84, 55, 7, 6, 1, 218, + 114, 2, 250, 91, 55, 7, 4, 1, 218, 114, 2, 250, 91, 55, 7, 6, 1, 103, 2, + 248, 75, 55, 7, 4, 1, 103, 2, 248, 75, 55, 7, 6, 1, 103, 2, 217, 56, 55, + 7, 4, 1, 103, 2, 217, 56, 55, 7, 6, 1, 103, 2, 250, 91, 55, 7, 4, 1, 103, + 2, 250, 91, 55, 7, 6, 1, 103, 2, 217, 56, 22, 138, 7, 4, 1, 103, 2, 217, + 56, 22, 138, 7, 6, 1, 103, 2, 232, 111, 22, 248, 74, 7, 4, 1, 103, 2, + 232, 111, 22, 248, 74, 7, 6, 1, 215, 86, 2, 177, 7, 4, 1, 215, 86, 2, + 177, 7, 6, 1, 215, 86, 2, 62, 55, 7, 4, 1, 215, 86, 2, 62, 55, 7, 6, 1, + 214, 86, 2, 209, 7, 4, 1, 214, 86, 2, 209, 7, 6, 1, 214, 86, 2, 138, 7, + 4, 1, 214, 86, 2, 138, 7, 6, 1, 214, 86, 2, 248, 74, 7, 4, 1, 214, 86, 2, + 248, 74, 7, 6, 1, 214, 86, 2, 62, 50, 7, 4, 1, 214, 86, 2, 62, 50, 7, 6, + 1, 214, 86, 2, 62, 55, 7, 4, 1, 214, 86, 2, 62, 55, 7, 6, 1, 213, 170, 2, + 62, 50, 7, 4, 1, 213, 170, 2, 62, 50, 7, 6, 1, 213, 170, 2, 248, 74, 7, + 4, 1, 213, 170, 2, 248, 74, 7, 6, 1, 213, 109, 2, 62, 50, 7, 4, 1, 213, + 109, 2, 62, 50, 7, 6, 1, 212, 153, 2, 250, 90, 7, 4, 1, 212, 153, 2, 250, + 90, 7, 6, 1, 212, 153, 2, 62, 55, 7, 4, 1, 212, 153, 2, 62, 55, 7, 6, 1, + 212, 153, 2, 233, 84, 55, 7, 4, 1, 212, 153, 2, 233, 84, 55, 7, 4, 1, + 242, 163, 2, 233, 84, 55, 7, 4, 1, 218, 114, 2, 248, 74, 7, 4, 1, 214, + 86, 2, 223, 165, 50, 7, 4, 1, 213, 109, 2, 223, 165, 50, 7, 4, 1, 111, 2, + 47, 157, 223, 164, 7, 4, 1, 187, 223, 29, 2, 62, 50, 7, 4, 1, 187, 223, + 29, 2, 248, 72, 91, 7, 4, 1, 187, 223, 29, 2, 127, 91, 7, 6, 1, 221, 21, + 196, 7, 4, 1, 248, 126, 7, 6, 1, 111, 2, 62, 55, 7, 4, 1, 111, 2, 62, 55, + 7, 6, 1, 111, 2, 241, 157, 50, 7, 4, 1, 111, 2, 241, 157, 50, 7, 6, 1, + 111, 2, 250, 91, 22, 138, 7, 4, 1, 111, 2, 250, 91, 22, 138, 7, 6, 1, + 111, 2, 250, 91, 22, 209, 7, 4, 1, 111, 2, 250, 91, 22, 209, 7, 6, 1, + 111, 2, 250, 91, 22, 241, 157, 50, 7, 4, 1, 111, 2, 250, 91, 22, 241, + 157, 50, 7, 6, 1, 111, 2, 250, 91, 22, 177, 7, 4, 1, 111, 2, 250, 91, 22, + 177, 7, 6, 1, 111, 2, 250, 91, 22, 62, 55, 7, 4, 1, 111, 2, 250, 91, 22, + 62, 55, 7, 6, 1, 111, 2, 251, 200, 22, 138, 7, 4, 1, 111, 2, 251, 200, + 22, 138, 7, 6, 1, 111, 2, 251, 200, 22, 209, 7, 4, 1, 111, 2, 251, 200, + 22, 209, 7, 6, 1, 111, 2, 251, 200, 22, 241, 157, 50, 7, 4, 1, 111, 2, + 251, 200, 22, 241, 157, 50, 7, 6, 1, 111, 2, 251, 200, 22, 177, 7, 4, 1, + 111, 2, 251, 200, 22, 177, 7, 6, 1, 111, 2, 251, 200, 22, 62, 55, 7, 4, + 1, 111, 2, 251, 200, 22, 62, 55, 7, 6, 1, 154, 2, 62, 55, 7, 4, 1, 154, + 2, 62, 55, 7, 6, 1, 154, 2, 241, 157, 50, 7, 4, 1, 154, 2, 241, 157, 50, + 7, 6, 1, 154, 2, 177, 7, 4, 1, 154, 2, 177, 7, 6, 1, 154, 2, 250, 91, 22, + 138, 7, 4, 1, 154, 2, 250, 91, 22, 138, 7, 6, 1, 154, 2, 250, 91, 22, + 209, 7, 4, 1, 154, 2, 250, 91, 22, 209, 7, 6, 1, 154, 2, 250, 91, 22, + 241, 157, 50, 7, 4, 1, 154, 2, 250, 91, 22, 241, 157, 50, 7, 6, 1, 154, + 2, 250, 91, 22, 177, 7, 4, 1, 154, 2, 250, 91, 22, 177, 7, 6, 1, 154, 2, + 250, 91, 22, 62, 55, 7, 4, 1, 154, 2, 250, 91, 22, 62, 55, 7, 6, 1, 241, + 7, 2, 241, 157, 50, 7, 4, 1, 241, 7, 2, 241, 157, 50, 7, 6, 1, 241, 7, 2, + 62, 55, 7, 4, 1, 241, 7, 2, 62, 55, 7, 6, 1, 141, 2, 62, 55, 7, 4, 1, + 141, 2, 62, 55, 7, 6, 1, 141, 2, 241, 157, 50, 7, 4, 1, 141, 2, 241, 157, + 50, 7, 6, 1, 141, 2, 250, 91, 22, 138, 7, 4, 1, 141, 2, 250, 91, 22, 138, + 7, 6, 1, 141, 2, 250, 91, 22, 209, 7, 4, 1, 141, 2, 250, 91, 22, 209, 7, + 6, 1, 141, 2, 250, 91, 22, 241, 157, 50, 7, 4, 1, 141, 2, 250, 91, 22, + 241, 157, 50, 7, 6, 1, 141, 2, 250, 91, 22, 177, 7, 4, 1, 141, 2, 250, + 91, 22, 177, 7, 6, 1, 141, 2, 250, 91, 22, 62, 55, 7, 4, 1, 141, 2, 250, + 91, 22, 62, 55, 7, 6, 1, 141, 2, 241, 98, 22, 138, 7, 4, 1, 141, 2, 241, + 98, 22, 138, 7, 6, 1, 141, 2, 241, 98, 22, 209, 7, 4, 1, 141, 2, 241, 98, + 22, 209, 7, 6, 1, 141, 2, 241, 98, 22, 241, 157, 50, 7, 4, 1, 141, 2, + 241, 98, 22, 241, 157, 50, 7, 6, 1, 141, 2, 241, 98, 22, 177, 7, 4, 1, + 141, 2, 241, 98, 22, 177, 7, 6, 1, 141, 2, 241, 98, 22, 62, 55, 7, 4, 1, + 141, 2, 241, 98, 22, 62, 55, 7, 6, 1, 103, 2, 62, 55, 7, 4, 1, 103, 2, + 62, 55, 7, 6, 1, 103, 2, 241, 157, 50, 7, 4, 1, 103, 2, 241, 157, 50, 7, + 6, 1, 103, 2, 241, 98, 22, 138, 7, 4, 1, 103, 2, 241, 98, 22, 138, 7, 6, + 1, 103, 2, 241, 98, 22, 209, 7, 4, 1, 103, 2, 241, 98, 22, 209, 7, 6, 1, + 103, 2, 241, 98, 22, 241, 157, 50, 7, 4, 1, 103, 2, 241, 98, 22, 241, + 157, 50, 7, 6, 1, 103, 2, 241, 98, 22, 177, 7, 4, 1, 103, 2, 241, 98, 22, + 177, 7, 6, 1, 103, 2, 241, 98, 22, 62, 55, 7, 4, 1, 103, 2, 241, 98, 22, + 62, 55, 7, 6, 1, 213, 109, 2, 209, 7, 4, 1, 213, 109, 2, 209, 7, 6, 1, + 213, 109, 2, 62, 55, 7, 4, 1, 213, 109, 2, 62, 55, 7, 6, 1, 213, 109, 2, + 241, 157, 50, 7, 4, 1, 213, 109, 2, 241, 157, 50, 7, 6, 1, 213, 109, 2, + 177, 7, 4, 1, 213, 109, 2, 177, 7, 6, 1, 231, 106, 233, 55, 7, 4, 1, 231, + 106, 233, 55, 7, 6, 1, 231, 106, 211, 211, 7, 4, 1, 231, 106, 211, 211, + 7, 6, 1, 213, 109, 2, 232, 251, 7, 4, 1, 213, 109, 2, 232, 251, 25, 4, 1, + 254, 180, 2, 225, 75, 25, 4, 1, 254, 180, 2, 248, 220, 25, 4, 1, 254, + 180, 2, 225, 76, 22, 214, 251, 25, 4, 1, 254, 180, 2, 248, 221, 22, 214, + 251, 25, 4, 1, 254, 180, 2, 225, 76, 22, 227, 16, 25, 4, 1, 254, 180, 2, + 248, 221, 22, 227, 16, 25, 4, 1, 254, 180, 2, 225, 76, 22, 226, 86, 25, + 4, 1, 254, 180, 2, 248, 221, 22, 226, 86, 25, 6, 1, 254, 180, 2, 225, 75, + 25, 6, 1, 254, 180, 2, 248, 220, 25, 6, 1, 254, 180, 2, 225, 76, 22, 214, + 251, 25, 6, 1, 254, 180, 2, 248, 221, 22, 214, 251, 25, 6, 1, 254, 180, + 2, 225, 76, 22, 227, 16, 25, 6, 1, 254, 180, 2, 248, 221, 22, 227, 16, + 25, 6, 1, 254, 180, 2, 225, 76, 22, 226, 86, 25, 6, 1, 254, 180, 2, 248, + 221, 22, 226, 86, 25, 4, 1, 245, 185, 2, 225, 75, 25, 4, 1, 245, 185, 2, + 248, 220, 25, 4, 1, 245, 185, 2, 225, 76, 22, 214, 251, 25, 4, 1, 245, + 185, 2, 248, 221, 22, 214, 251, 25, 4, 1, 245, 185, 2, 225, 76, 22, 227, + 16, 25, 4, 1, 245, 185, 2, 248, 221, 22, 227, 16, 25, 6, 1, 245, 185, 2, + 225, 75, 25, 6, 1, 245, 185, 2, 248, 220, 25, 6, 1, 245, 185, 2, 225, 76, + 22, 214, 251, 25, 6, 1, 245, 185, 2, 248, 221, 22, 214, 251, 25, 6, 1, + 245, 185, 2, 225, 76, 22, 227, 16, 25, 6, 1, 245, 185, 2, 248, 221, 22, + 227, 16, 25, 4, 1, 245, 150, 2, 225, 75, 25, 4, 1, 245, 150, 2, 248, 220, + 25, 4, 1, 245, 150, 2, 225, 76, 22, 214, 251, 25, 4, 1, 245, 150, 2, 248, + 221, 22, 214, 251, 25, 4, 1, 245, 150, 2, 225, 76, 22, 227, 16, 25, 4, 1, + 245, 150, 2, 248, 221, 22, 227, 16, 25, 4, 1, 245, 150, 2, 225, 76, 22, + 226, 86, 25, 4, 1, 245, 150, 2, 248, 221, 22, 226, 86, 25, 6, 1, 245, + 150, 2, 225, 75, 25, 6, 1, 245, 150, 2, 248, 220, 25, 6, 1, 245, 150, 2, + 225, 76, 22, 214, 251, 25, 6, 1, 245, 150, 2, 248, 221, 22, 214, 251, 25, + 6, 1, 245, 150, 2, 225, 76, 22, 227, 16, 25, 6, 1, 245, 150, 2, 248, 221, + 22, 227, 16, 25, 6, 1, 245, 150, 2, 225, 76, 22, 226, 86, 25, 6, 1, 245, + 150, 2, 248, 221, 22, 226, 86, 25, 4, 1, 236, 45, 2, 225, 75, 25, 4, 1, + 236, 45, 2, 248, 220, 25, 4, 1, 236, 45, 2, 225, 76, 22, 214, 251, 25, 4, + 1, 236, 45, 2, 248, 221, 22, 214, 251, 25, 4, 1, 236, 45, 2, 225, 76, 22, + 227, 16, 25, 4, 1, 236, 45, 2, 248, 221, 22, 227, 16, 25, 4, 1, 236, 45, + 2, 225, 76, 22, 226, 86, 25, 4, 1, 236, 45, 2, 248, 221, 22, 226, 86, 25, + 6, 1, 236, 45, 2, 225, 75, 25, 6, 1, 236, 45, 2, 248, 220, 25, 6, 1, 236, + 45, 2, 225, 76, 22, 214, 251, 25, 6, 1, 236, 45, 2, 248, 221, 22, 214, + 251, 25, 6, 1, 236, 45, 2, 225, 76, 22, 227, 16, 25, 6, 1, 236, 45, 2, + 248, 221, 22, 227, 16, 25, 6, 1, 236, 45, 2, 225, 76, 22, 226, 86, 25, 6, + 1, 236, 45, 2, 248, 221, 22, 226, 86, 25, 4, 1, 227, 103, 2, 225, 75, 25, + 4, 1, 227, 103, 2, 248, 220, 25, 4, 1, 227, 103, 2, 225, 76, 22, 214, + 251, 25, 4, 1, 227, 103, 2, 248, 221, 22, 214, 251, 25, 4, 1, 227, 103, + 2, 225, 76, 22, 227, 16, 25, 4, 1, 227, 103, 2, 248, 221, 22, 227, 16, + 25, 6, 1, 227, 103, 2, 225, 75, 25, 6, 1, 227, 103, 2, 248, 220, 25, 6, + 1, 227, 103, 2, 225, 76, 22, 214, 251, 25, 6, 1, 227, 103, 2, 248, 221, + 22, 214, 251, 25, 6, 1, 227, 103, 2, 225, 76, 22, 227, 16, 25, 6, 1, 227, + 103, 2, 248, 221, 22, 227, 16, 25, 4, 1, 215, 135, 2, 225, 75, 25, 4, 1, + 215, 135, 2, 248, 220, 25, 4, 1, 215, 135, 2, 225, 76, 22, 214, 251, 25, + 4, 1, 215, 135, 2, 248, 221, 22, 214, 251, 25, 4, 1, 215, 135, 2, 225, + 76, 22, 227, 16, 25, 4, 1, 215, 135, 2, 248, 221, 22, 227, 16, 25, 4, 1, + 215, 135, 2, 225, 76, 22, 226, 86, 25, 4, 1, 215, 135, 2, 248, 221, 22, + 226, 86, 25, 6, 1, 215, 135, 2, 248, 220, 25, 6, 1, 215, 135, 2, 248, + 221, 22, 214, 251, 25, 6, 1, 215, 135, 2, 248, 221, 22, 227, 16, 25, 6, + 1, 215, 135, 2, 248, 221, 22, 226, 86, 25, 4, 1, 227, 105, 2, 225, 75, + 25, 4, 1, 227, 105, 2, 248, 220, 25, 4, 1, 227, 105, 2, 225, 76, 22, 214, + 251, 25, 4, 1, 227, 105, 2, 248, 221, 22, 214, 251, 25, 4, 1, 227, 105, + 2, 225, 76, 22, 227, 16, 25, 4, 1, 227, 105, 2, 248, 221, 22, 227, 16, + 25, 4, 1, 227, 105, 2, 225, 76, 22, 226, 86, 25, 4, 1, 227, 105, 2, 248, + 221, 22, 226, 86, 25, 6, 1, 227, 105, 2, 225, 75, 25, 6, 1, 227, 105, 2, + 248, 220, 25, 6, 1, 227, 105, 2, 225, 76, 22, 214, 251, 25, 6, 1, 227, + 105, 2, 248, 221, 22, 214, 251, 25, 6, 1, 227, 105, 2, 225, 76, 22, 227, + 16, 25, 6, 1, 227, 105, 2, 248, 221, 22, 227, 16, 25, 6, 1, 227, 105, 2, + 225, 76, 22, 226, 86, 25, 6, 1, 227, 105, 2, 248, 221, 22, 226, 86, 25, + 4, 1, 254, 180, 2, 214, 251, 25, 4, 1, 254, 180, 2, 227, 16, 25, 4, 1, + 245, 185, 2, 214, 251, 25, 4, 1, 245, 185, 2, 227, 16, 25, 4, 1, 245, + 150, 2, 214, 251, 25, 4, 1, 245, 150, 2, 227, 16, 25, 4, 1, 236, 45, 2, + 214, 251, 25, 4, 1, 236, 45, 2, 227, 16, 25, 4, 1, 227, 103, 2, 214, 251, + 25, 4, 1, 227, 103, 2, 227, 16, 25, 4, 1, 215, 135, 2, 214, 251, 25, 4, + 1, 215, 135, 2, 227, 16, 25, 4, 1, 227, 105, 2, 214, 251, 25, 4, 1, 227, + 105, 2, 227, 16, 25, 4, 1, 254, 180, 2, 225, 76, 22, 212, 211, 25, 4, 1, + 254, 180, 2, 248, 221, 22, 212, 211, 25, 4, 1, 254, 180, 2, 225, 76, 22, + 214, 252, 22, 212, 211, 25, 4, 1, 254, 180, 2, 248, 221, 22, 214, 252, + 22, 212, 211, 25, 4, 1, 254, 180, 2, 225, 76, 22, 227, 17, 22, 212, 211, + 25, 4, 1, 254, 180, 2, 248, 221, 22, 227, 17, 22, 212, 211, 25, 4, 1, + 254, 180, 2, 225, 76, 22, 226, 87, 22, 212, 211, 25, 4, 1, 254, 180, 2, + 248, 221, 22, 226, 87, 22, 212, 211, 25, 6, 1, 254, 180, 2, 225, 76, 22, + 225, 87, 25, 6, 1, 254, 180, 2, 248, 221, 22, 225, 87, 25, 6, 1, 254, + 180, 2, 225, 76, 22, 214, 252, 22, 225, 87, 25, 6, 1, 254, 180, 2, 248, + 221, 22, 214, 252, 22, 225, 87, 25, 6, 1, 254, 180, 2, 225, 76, 22, 227, + 17, 22, 225, 87, 25, 6, 1, 254, 180, 2, 248, 221, 22, 227, 17, 22, 225, + 87, 25, 6, 1, 254, 180, 2, 225, 76, 22, 226, 87, 22, 225, 87, 25, 6, 1, + 254, 180, 2, 248, 221, 22, 226, 87, 22, 225, 87, 25, 4, 1, 245, 150, 2, + 225, 76, 22, 212, 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 212, 211, 25, + 4, 1, 245, 150, 2, 225, 76, 22, 214, 252, 22, 212, 211, 25, 4, 1, 245, + 150, 2, 248, 221, 22, 214, 252, 22, 212, 211, 25, 4, 1, 245, 150, 2, 225, + 76, 22, 227, 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 227, + 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 225, 76, 22, 226, 87, 22, 212, + 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 226, 87, 22, 212, 211, 25, 6, + 1, 245, 150, 2, 225, 76, 22, 225, 87, 25, 6, 1, 245, 150, 2, 248, 221, + 22, 225, 87, 25, 6, 1, 245, 150, 2, 225, 76, 22, 214, 252, 22, 225, 87, + 25, 6, 1, 245, 150, 2, 248, 221, 22, 214, 252, 22, 225, 87, 25, 6, 1, + 245, 150, 2, 225, 76, 22, 227, 17, 22, 225, 87, 25, 6, 1, 245, 150, 2, + 248, 221, 22, 227, 17, 22, 225, 87, 25, 6, 1, 245, 150, 2, 225, 76, 22, + 226, 87, 22, 225, 87, 25, 6, 1, 245, 150, 2, 248, 221, 22, 226, 87, 22, + 225, 87, 25, 4, 1, 227, 105, 2, 225, 76, 22, 212, 211, 25, 4, 1, 227, + 105, 2, 248, 221, 22, 212, 211, 25, 4, 1, 227, 105, 2, 225, 76, 22, 214, + 252, 22, 212, 211, 25, 4, 1, 227, 105, 2, 248, 221, 22, 214, 252, 22, + 212, 211, 25, 4, 1, 227, 105, 2, 225, 76, 22, 227, 17, 22, 212, 211, 25, + 4, 1, 227, 105, 2, 248, 221, 22, 227, 17, 22, 212, 211, 25, 4, 1, 227, + 105, 2, 225, 76, 22, 226, 87, 22, 212, 211, 25, 4, 1, 227, 105, 2, 248, + 221, 22, 226, 87, 22, 212, 211, 25, 6, 1, 227, 105, 2, 225, 76, 22, 225, + 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, 225, 87, 25, 6, 1, 227, 105, 2, + 225, 76, 22, 214, 252, 22, 225, 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, + 214, 252, 22, 225, 87, 25, 6, 1, 227, 105, 2, 225, 76, 22, 227, 17, 22, + 225, 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, 227, 17, 22, 225, 87, 25, + 6, 1, 227, 105, 2, 225, 76, 22, 226, 87, 22, 225, 87, 25, 6, 1, 227, 105, + 2, 248, 221, 22, 226, 87, 22, 225, 87, 25, 4, 1, 254, 180, 2, 214, 105, + 25, 4, 1, 254, 180, 2, 232, 110, 25, 4, 1, 254, 180, 2, 214, 252, 22, + 212, 211, 25, 4, 1, 254, 180, 2, 212, 211, 25, 4, 1, 254, 180, 2, 227, + 17, 22, 212, 211, 25, 4, 1, 254, 180, 2, 226, 86, 25, 4, 1, 254, 180, 2, + 226, 87, 22, 212, 211, 25, 6, 1, 254, 180, 2, 214, 105, 25, 6, 1, 254, + 180, 2, 232, 110, 25, 6, 1, 254, 180, 2, 214, 251, 25, 6, 1, 254, 180, 2, + 227, 16, 25, 6, 1, 254, 180, 2, 225, 87, 25, 234, 122, 25, 225, 87, 25, + 225, 75, 25, 226, 86, 25, 248, 69, 22, 226, 86, 25, 4, 1, 245, 150, 2, + 214, 252, 22, 212, 211, 25, 4, 1, 245, 150, 2, 212, 211, 25, 4, 1, 245, + 150, 2, 227, 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 226, 86, 25, 4, 1, + 245, 150, 2, 226, 87, 22, 212, 211, 25, 6, 1, 245, 185, 2, 214, 251, 25, + 6, 1, 245, 185, 2, 227, 16, 25, 6, 1, 245, 150, 2, 214, 251, 25, 6, 1, + 245, 150, 2, 227, 16, 25, 6, 1, 245, 150, 2, 225, 87, 25, 225, 76, 22, + 214, 251, 25, 225, 76, 22, 227, 16, 25, 225, 76, 22, 226, 86, 25, 4, 1, + 236, 45, 2, 214, 105, 25, 4, 1, 236, 45, 2, 232, 110, 25, 4, 1, 236, 45, + 2, 248, 69, 22, 214, 251, 25, 4, 1, 236, 45, 2, 248, 69, 22, 227, 16, 25, + 4, 1, 236, 45, 2, 226, 86, 25, 4, 1, 236, 45, 2, 248, 69, 22, 226, 86, + 25, 6, 1, 236, 45, 2, 214, 105, 25, 6, 1, 236, 45, 2, 232, 110, 25, 6, 1, + 236, 45, 2, 214, 251, 25, 6, 1, 236, 45, 2, 227, 16, 25, 248, 221, 22, + 214, 251, 25, 248, 221, 22, 227, 16, 25, 248, 221, 22, 226, 86, 25, 4, 1, + 215, 135, 2, 214, 105, 25, 4, 1, 215, 135, 2, 232, 110, 25, 4, 1, 215, + 135, 2, 248, 69, 22, 214, 251, 25, 4, 1, 215, 135, 2, 248, 69, 22, 227, + 16, 25, 4, 1, 223, 225, 2, 225, 75, 25, 4, 1, 223, 225, 2, 248, 220, 25, + 4, 1, 215, 135, 2, 226, 86, 25, 4, 1, 215, 135, 2, 248, 69, 22, 226, 86, + 25, 6, 1, 215, 135, 2, 214, 105, 25, 6, 1, 215, 135, 2, 232, 110, 25, 6, + 1, 215, 135, 2, 214, 251, 25, 6, 1, 215, 135, 2, 227, 16, 25, 6, 1, 223, + 225, 2, 248, 220, 25, 248, 69, 22, 214, 251, 25, 248, 69, 22, 227, 16, + 25, 214, 251, 25, 4, 1, 227, 105, 2, 214, 252, 22, 212, 211, 25, 4, 1, + 227, 105, 2, 212, 211, 25, 4, 1, 227, 105, 2, 227, 17, 22, 212, 211, 25, + 4, 1, 227, 105, 2, 226, 86, 25, 4, 1, 227, 105, 2, 226, 87, 22, 212, 211, + 25, 6, 1, 227, 103, 2, 214, 251, 25, 6, 1, 227, 103, 2, 227, 16, 25, 6, + 1, 227, 105, 2, 214, 251, 25, 6, 1, 227, 105, 2, 227, 16, 25, 6, 1, 227, + 105, 2, 225, 87, 25, 227, 16, 25, 248, 220, 245, 230, 224, 207, 245, 239, + 224, 207, 245, 230, 219, 225, 245, 239, 219, 225, 217, 108, 219, 225, + 244, 99, 219, 225, 220, 70, 219, 225, 244, 201, 219, 225, 225, 63, 219, + 225, 217, 136, 219, 225, 242, 137, 219, 225, 212, 80, 213, 233, 219, 225, + 212, 80, 213, 233, 228, 221, 212, 80, 213, 233, 235, 180, 233, 160, 79, + 223, 174, 79, 241, 21, 228, 222, 241, 21, 244, 201, 248, 223, 245, 230, + 248, 223, 245, 239, 248, 223, 201, 134, 52, 66, 233, 83, 52, 117, 233, + 83, 43, 220, 100, 224, 178, 79, 47, 220, 100, 224, 178, 79, 220, 100, + 232, 238, 224, 178, 79, 220, 100, 242, 12, 224, 178, 79, 43, 52, 224, + 178, 79, 47, 52, 224, 178, 79, 52, 232, 238, 224, 178, 79, 52, 242, 12, + 224, 178, 79, 249, 15, 52, 249, 15, 251, 167, 216, 193, 251, 167, 124, + 62, 233, 178, 119, 62, 233, 178, 201, 245, 241, 241, 19, 225, 180, 233, + 84, 221, 80, 226, 180, 221, 80, 233, 160, 245, 237, 223, 174, 245, 237, + 225, 162, 248, 13, 244, 108, 233, 160, 227, 23, 223, 174, 227, 23, 230, + 82, 228, 227, 219, 225, 226, 94, 231, 76, 53, 226, 94, 217, 214, 217, + 114, 53, 225, 107, 52, 225, 107, 216, 182, 225, 107, 223, 236, 225, 107, + 223, 236, 52, 225, 107, 223, 236, 216, 182, 225, 107, 251, 38, 220, 100, + 233, 164, 254, 146, 224, 178, 79, 220, 100, 223, 178, 254, 146, 224, 178, + 79, 224, 34, 79, 52, 245, 119, 79, 236, 59, 227, 25, 215, 156, 143, 217, + 78, 251, 39, 236, 74, 225, 180, 254, 1, 241, 22, 251, 167, 244, 92, 220, + 42, 43, 42, 251, 210, 2, 224, 187, 47, 42, 251, 210, 2, 224, 187, 52, + 224, 193, 79, 224, 193, 245, 119, 79, 245, 119, 224, 193, 79, 217, 37, 5, + 245, 151, 223, 236, 225, 236, 53, 85, 135, 251, 167, 85, 96, 251, 167, + 117, 254, 3, 223, 236, 221, 93, 250, 61, 215, 140, 119, 254, 2, 254, 194, + 214, 170, 250, 22, 231, 65, 53, 218, 193, 248, 223, 236, 52, 215, 156, + 244, 141, 225, 63, 79, 137, 62, 225, 62, 224, 204, 225, 107, 244, 101, + 62, 225, 62, 244, 170, 62, 225, 62, 119, 62, 225, 62, 244, 101, 62, 79, + 246, 193, 249, 193, 216, 192, 66, 244, 101, 247, 193, 231, 217, 14, 219, + 225, 213, 199, 235, 180, 244, 62, 254, 93, 236, 50, 217, 52, 236, 50, + 221, 80, 236, 50, 225, 192, 236, 86, 218, 141, 218, 210, 255, 38, 218, + 141, 218, 210, 236, 86, 12, 244, 109, 221, 25, 255, 38, 12, 244, 109, + 221, 25, 230, 78, 21, 221, 26, 228, 223, 21, 221, 26, 218, 237, 212, 79, + 218, 237, 7, 4, 1, 75, 218, 237, 167, 218, 237, 185, 218, 237, 192, 218, + 237, 200, 218, 237, 198, 218, 237, 203, 218, 237, 95, 53, 218, 237, 231, + 64, 218, 237, 245, 182, 53, 218, 237, 43, 226, 168, 218, 237, 47, 226, + 168, 218, 237, 7, 4, 1, 206, 219, 24, 212, 79, 219, 24, 118, 219, 24, + 112, 219, 24, 170, 219, 24, 167, 219, 24, 185, 219, 24, 192, 219, 24, + 200, 219, 24, 198, 219, 24, 203, 219, 24, 95, 53, 219, 24, 231, 64, 219, + 24, 245, 182, 53, 219, 24, 43, 226, 168, 219, 24, 47, 226, 168, 7, 219, + 24, 4, 1, 63, 7, 219, 24, 4, 1, 77, 7, 219, 24, 4, 1, 78, 7, 219, 24, 4, + 1, 213, 169, 7, 219, 24, 4, 1, 222, 136, 7, 219, 24, 4, 1, 242, 162, 7, + 219, 24, 4, 1, 235, 141, 7, 219, 24, 4, 1, 155, 7, 219, 24, 4, 1, 184, 7, + 219, 24, 4, 1, 206, 7, 219, 24, 4, 1, 227, 11, 7, 219, 24, 4, 1, 196, 7, + 219, 24, 4, 1, 218, 113, 245, 134, 53, 250, 31, 53, 249, 180, 53, 244, + 85, 244, 88, 53, 233, 68, 53, 231, 77, 53, 230, 97, 53, 226, 74, 53, 223, + 55, 53, 213, 207, 53, 163, 220, 250, 53, 247, 202, 53, 245, 135, 53, 234, + 196, 53, 216, 84, 53, 246, 176, 53, 243, 136, 226, 104, 53, 226, 72, 53, + 242, 209, 53, 253, 225, 53, 241, 77, 53, 250, 242, 53, 233, 61, 216, 229, + 53, 219, 207, 53, 217, 211, 53, 236, 99, 223, 55, 53, 38, 43, 242, 102, + 50, 38, 47, 242, 102, 50, 38, 187, 66, 233, 84, 227, 26, 38, 220, 196, + 66, 233, 84, 227, 26, 38, 254, 126, 80, 50, 38, 250, 62, 80, 50, 38, 43, + 80, 50, 38, 47, 80, 50, 38, 223, 165, 227, 26, 38, 250, 62, 223, 165, + 227, 26, 38, 254, 126, 223, 165, 227, 26, 38, 137, 181, 50, 38, 244, 101, + 181, 50, 38, 245, 225, 250, 95, 38, 245, 225, 219, 185, 38, 245, 225, + 248, 65, 38, 245, 225, 250, 96, 252, 224, 38, 43, 47, 80, 50, 38, 245, + 225, 222, 130, 38, 245, 225, 234, 253, 38, 245, 225, 215, 132, 225, 177, + 216, 196, 38, 223, 237, 219, 251, 227, 26, 38, 52, 66, 219, 59, 227, 26, + 38, 254, 136, 88, 38, 216, 182, 215, 158, 38, 213, 235, 251, 193, 50, 38, + 135, 80, 227, 26, 38, 187, 52, 219, 251, 227, 26, 38, 96, 242, 102, 2, + 252, 185, 246, 178, 38, 135, 242, 102, 2, 252, 185, 246, 178, 38, 43, 80, + 55, 38, 47, 80, 55, 38, 254, 4, 50, 255, 43, 227, 134, 255, 28, 217, 10, + 217, 162, 219, 33, 190, 6, 251, 121, 248, 143, 250, 235, 250, 232, 233, + 84, 88, 251, 40, 227, 134, 251, 81, 215, 165, 245, 136, 249, 253, 222, + 127, 248, 143, 245, 12, 115, 4, 244, 41, 115, 6, 242, 162, 252, 11, 6, + 242, 162, 190, 6, 242, 162, 225, 205, 249, 253, 225, 205, 249, 254, 113, + 119, 226, 20, 115, 6, 75, 252, 11, 6, 75, 115, 6, 155, 115, 4, 155, 234, + 13, 57, 252, 187, 88, 190, 6, 206, 228, 95, 53, 219, 237, 224, 46, 249, + 224, 115, 6, 227, 11, 190, 6, 227, 11, 190, 6, 225, 19, 115, 6, 152, 252, + 11, 6, 152, 190, 6, 152, 225, 112, 218, 34, 223, 248, 221, 76, 79, 217, + 223, 53, 216, 223, 156, 53, 214, 222, 190, 6, 212, 152, 227, 39, 53, 227, + 124, 53, 236, 52, 227, 124, 53, 252, 11, 6, 212, 152, 216, 66, 25, 4, 1, + 236, 44, 235, 35, 53, 254, 143, 53, 115, 6, 253, 201, 252, 11, 6, 251, + 121, 245, 154, 88, 115, 4, 77, 115, 6, 77, 115, 6, 245, 95, 216, 66, 6, + 245, 95, 115, 6, 184, 115, 4, 78, 108, 88, 252, 76, 88, 243, 42, 88, 249, + 1, 88, 236, 90, 219, 235, 223, 123, 6, 225, 19, 245, 15, 53, 190, 4, 226, + 20, 190, 4, 243, 203, 190, 6, 243, 203, 190, 6, 226, 20, 190, 230, 166, + 218, 255, 216, 66, 35, 6, 244, 41, 216, 66, 35, 6, 155, 223, 236, 35, 6, + 155, 216, 66, 35, 6, 213, 108, 190, 32, 6, 249, 125, 190, 32, 4, 249, + 125, 190, 32, 4, 77, 190, 32, 4, 75, 190, 32, 4, 236, 3, 225, 90, 233, + 83, 216, 66, 254, 162, 226, 94, 53, 254, 215, 216, 66, 4, 245, 95, 16, + 31, 222, 191, 219, 235, 214, 101, 244, 92, 124, 221, 62, 214, 101, 244, + 92, 124, 229, 89, 214, 101, 244, 92, 124, 217, 207, 214, 101, 244, 92, + 124, 217, 134, 214, 101, 244, 92, 119, 217, 132, 214, 101, 244, 92, 124, + 244, 206, 214, 101, 244, 92, 119, 244, 205, 214, 101, 244, 92, 137, 244, + 205, 214, 101, 244, 92, 244, 101, 244, 205, 214, 101, 244, 92, 124, 220, + 62, 214, 101, 244, 92, 244, 170, 220, 60, 214, 101, 244, 92, 124, 246, + 10, 214, 101, 244, 92, 137, 246, 8, 214, 101, 244, 92, 244, 170, 246, 8, + 214, 101, 244, 92, 221, 66, 246, 8, 244, 92, 228, 96, 118, 223, 134, 228, + 97, 118, 223, 134, 228, 97, 112, 223, 134, 228, 97, 170, 223, 134, 228, + 97, 167, 223, 134, 228, 97, 185, 223, 134, 228, 97, 192, 223, 134, 228, + 97, 200, 223, 134, 228, 97, 198, 223, 134, 228, 97, 203, 223, 134, 228, + 97, 217, 213, 223, 134, 228, 97, 245, 245, 223, 134, 228, 97, 216, 48, + 223, 134, 228, 97, 244, 203, 223, 134, 228, 97, 124, 241, 62, 223, 134, + 228, 97, 244, 170, 241, 62, 223, 134, 228, 97, 124, 217, 113, 4, 223, + 134, 228, 97, 118, 4, 223, 134, 228, 97, 112, 4, 223, 134, 228, 97, 170, + 4, 223, 134, 228, 97, 167, 4, 223, 134, 228, 97, 185, 4, 223, 134, 228, + 97, 192, 4, 223, 134, 228, 97, 200, 4, 223, 134, 228, 97, 198, 4, 223, + 134, 228, 97, 203, 4, 223, 134, 228, 97, 217, 213, 4, 223, 134, 228, 97, + 245, 245, 4, 223, 134, 228, 97, 216, 48, 4, 223, 134, 228, 97, 244, 203, + 4, 223, 134, 228, 97, 124, 241, 62, 4, 223, 134, 228, 97, 244, 170, 241, + 62, 4, 223, 134, 228, 97, 124, 217, 113, 223, 134, 228, 97, 124, 217, + 114, 251, 122, 249, 125, 223, 134, 228, 97, 244, 170, 217, 113, 223, 134, + 228, 97, 217, 214, 217, 113, 223, 134, 228, 97, 223, 236, 124, 241, 62, + 7, 4, 1, 223, 236, 251, 121, 223, 134, 228, 97, 220, 72, 233, 200, 17, + 223, 134, 228, 97, 244, 204, 246, 47, 17, 223, 134, 228, 97, 244, 204, + 217, 113, 223, 134, 228, 97, 124, 241, 63, 217, 113, 214, 101, 244, 92, + 212, 80, 217, 132, 135, 71, 215, 130, 71, 96, 71, 246, 179, 71, 43, 47, + 71, 116, 121, 71, 228, 210, 213, 253, 71, 228, 210, 246, 41, 71, 219, + 234, 246, 41, 71, 219, 234, 213, 253, 71, 135, 80, 2, 91, 96, 80, 2, 91, + 135, 214, 23, 71, 96, 214, 23, 71, 135, 119, 242, 81, 71, 215, 130, 119, + 242, 81, 71, 96, 119, 242, 81, 71, 246, 179, 119, 242, 81, 71, 135, 80, + 2, 218, 40, 96, 80, 2, 218, 40, 135, 80, 244, 77, 134, 215, 130, 80, 244, + 77, 134, 96, 80, 244, 77, 134, 246, 179, 80, 244, 77, 134, 116, 121, 80, + 2, 252, 173, 135, 80, 2, 102, 96, 80, 2, 102, 135, 80, 2, 232, 251, 96, + 80, 2, 232, 251, 43, 47, 214, 23, 71, 43, 47, 80, 2, 91, 246, 179, 212, + 28, 71, 215, 130, 80, 2, 217, 44, 233, 159, 215, 130, 80, 2, 217, 44, + 223, 172, 246, 179, 80, 2, 217, 44, 233, 159, 246, 179, 80, 2, 217, 44, + 223, 172, 96, 80, 2, 249, 223, 246, 178, 246, 179, 80, 2, 249, 223, 233, + 159, 254, 126, 216, 240, 221, 96, 71, 250, 62, 216, 240, 221, 96, 71, + 228, 210, 213, 253, 80, 217, 10, 187, 134, 135, 80, 217, 10, 252, 187, + 113, 96, 80, 217, 10, 134, 254, 126, 210, 250, 96, 71, 250, 62, 210, 250, + 96, 71, 135, 242, 102, 2, 252, 185, 215, 129, 135, 242, 102, 2, 252, 185, + 246, 178, 215, 130, 242, 102, 2, 252, 185, 223, 172, 215, 130, 242, 102, + 2, 252, 185, 233, 159, 96, 242, 102, 2, 252, 185, 215, 129, 96, 242, 102, + 2, 252, 185, 246, 178, 246, 179, 242, 102, 2, 252, 185, 223, 172, 246, + 179, 242, 102, 2, 252, 185, 233, 159, 96, 80, 113, 135, 71, 215, 130, 80, + 135, 68, 246, 179, 71, 135, 80, 113, 96, 71, 135, 226, 234, 254, 33, 215, + 130, 226, 234, 254, 33, 96, 226, 234, 254, 33, 246, 179, 226, 234, 254, + 33, 135, 242, 102, 113, 96, 242, 101, 96, 242, 102, 113, 135, 242, 101, + 135, 52, 80, 2, 91, 43, 47, 52, 80, 2, 91, 96, 52, 80, 2, 91, 135, 52, + 71, 215, 130, 52, 71, 96, 52, 71, 246, 179, 52, 71, 43, 47, 52, 71, 116, + 121, 52, 71, 228, 210, 213, 253, 52, 71, 228, 210, 246, 41, 52, 71, 219, + 234, 246, 41, 52, 71, 219, 234, 213, 253, 52, 71, 135, 216, 182, 71, 96, + 216, 182, 71, 135, 219, 181, 71, 96, 219, 181, 71, 215, 130, 80, 2, 52, + 91, 246, 179, 80, 2, 52, 91, 135, 248, 222, 71, 215, 130, 248, 222, 71, + 96, 248, 222, 71, 246, 179, 248, 222, 71, 135, 80, 217, 10, 134, 96, 80, + 217, 10, 134, 135, 69, 71, 215, 130, 69, 71, 96, 69, 71, 246, 179, 69, + 71, 215, 130, 69, 80, 244, 77, 134, 215, 130, 69, 80, 227, 100, 226, 125, + 215, 130, 69, 80, 227, 100, 226, 126, 2, 201, 134, 215, 130, 69, 80, 227, + 100, 226, 126, 2, 66, 134, 215, 130, 69, 52, 71, 215, 130, 69, 52, 80, + 227, 100, 226, 125, 96, 69, 80, 244, 77, 214, 43, 228, 210, 213, 253, 80, + 217, 10, 249, 222, 219, 234, 246, 41, 80, 217, 10, 249, 222, 116, 121, + 69, 71, 47, 80, 2, 4, 250, 95, 246, 179, 80, 135, 68, 215, 130, 71, 137, + 96, 254, 33, 135, 80, 2, 66, 91, 96, 80, 2, 66, 91, 43, 47, 80, 2, 66, + 91, 135, 80, 2, 52, 66, 91, 96, 80, 2, 52, 66, 91, 43, 47, 80, 2, 52, 66, + 91, 135, 227, 76, 71, 96, 227, 76, 71, 43, 47, 227, 76, 71, 31, 254, 190, + 250, 19, 226, 162, 248, 50, 217, 153, 245, 115, 217, 153, 247, 213, 228, + 206, 245, 116, 245, 231, 221, 71, 236, 102, 230, 108, 245, 248, 227, 134, + 228, 206, 254, 160, 245, 248, 227, 134, 4, 245, 248, 227, 134, 249, 248, + 254, 24, 231, 196, 247, 213, 228, 206, 249, 250, 254, 24, 231, 196, 4, + 249, 248, 254, 24, 231, 196, 245, 222, 68, 225, 92, 230, 166, 225, 99, + 230, 166, 249, 227, 230, 166, 218, 255, 231, 65, 53, 231, 63, 53, 62, + 225, 192, 247, 242, 220, 42, 221, 72, 231, 64, 254, 4, 227, 71, 223, 165, + 227, 71, 251, 168, 227, 71, 42, 223, 129, 249, 173, 223, 129, 244, 94, + 223, 129, 225, 88, 109, 236, 92, 47, 254, 145, 254, 145, 231, 223, 254, + 145, 219, 206, 254, 145, 247, 244, 247, 213, 228, 206, 247, 247, 226, + 173, 109, 228, 206, 226, 173, 109, 233, 17, 254, 154, 233, 17, 227, 62, + 236, 56, 215, 152, 236, 69, 52, 236, 69, 216, 182, 236, 69, 249, 244, + 236, 69, 218, 227, 236, 69, 214, 114, 236, 69, 250, 62, 236, 69, 250, 62, + 249, 244, 236, 69, 254, 126, 249, 244, 236, 69, 217, 152, 252, 113, 224, + 64, 225, 89, 62, 231, 64, 245, 121, 243, 142, 225, 89, 241, 162, 217, 56, + 227, 71, 223, 236, 177, 236, 52, 233, 187, 196, 220, 102, 214, 22, 213, + 191, 225, 99, 228, 206, 177, 231, 65, 177, 253, 253, 126, 109, 228, 206, + 253, 253, 126, 109, 254, 89, 126, 109, 254, 89, 251, 142, 228, 206, 255, + 37, 126, 109, 229, 248, 254, 89, 228, 213, 255, 37, 126, 109, 254, 184, + 126, 109, 228, 206, 254, 184, 126, 109, 254, 184, 126, 171, 126, 109, + 216, 182, 177, 254, 191, 126, 109, 245, 178, 109, 243, 141, 245, 178, + 109, 248, 51, 252, 70, 254, 91, 217, 162, 233, 91, 243, 141, 126, 109, + 254, 89, 126, 217, 10, 171, 217, 162, 236, 127, 227, 134, 236, 127, 68, + 171, 254, 89, 126, 109, 250, 31, 245, 181, 245, 182, 250, 30, 223, 165, + 236, 113, 126, 109, 223, 165, 126, 109, 249, 216, 109, 245, 153, 245, + 180, 109, 219, 110, 245, 181, 248, 127, 126, 109, 126, 217, 10, 251, 132, + 248, 144, 231, 223, 251, 131, 224, 191, 126, 109, 228, 206, 126, 109, + 240, 214, 109, 228, 206, 240, 214, 109, 219, 63, 245, 178, 109, 233, 137, + 171, 126, 109, 242, 228, 171, 126, 109, 233, 137, 113, 126, 109, 242, + 228, 113, 126, 109, 233, 137, 251, 142, 228, 206, 126, 109, 242, 228, + 251, 142, 228, 206, 126, 109, 230, 237, 233, 136, 230, 237, 242, 227, + 252, 70, 228, 206, 245, 178, 109, 228, 206, 233, 136, 228, 206, 242, 227, + 229, 248, 233, 137, 228, 213, 126, 109, 229, 248, 242, 228, 228, 213, + 126, 109, 233, 137, 171, 245, 178, 109, 242, 228, 171, 245, 178, 109, + 229, 248, 233, 137, 228, 213, 245, 178, 109, 229, 248, 242, 228, 228, + 213, 245, 178, 109, 233, 137, 171, 242, 227, 242, 228, 171, 233, 136, + 229, 248, 233, 137, 228, 213, 242, 227, 229, 248, 242, 228, 228, 213, + 233, 136, 225, 118, 219, 14, 225, 119, 171, 126, 109, 219, 15, 171, 126, + 109, 225, 119, 171, 245, 178, 109, 219, 15, 171, 245, 178, 109, 247, 213, + 228, 206, 225, 121, 247, 213, 228, 206, 219, 16, 219, 23, 227, 134, 218, + 236, 227, 134, 228, 206, 111, 219, 23, 227, 134, 228, 206, 111, 218, 236, + 227, 134, 219, 23, 68, 171, 126, 109, 218, 236, 68, 171, 126, 109, 229, + 248, 111, 219, 23, 68, 228, 213, 126, 109, 229, 248, 111, 218, 236, 68, + 228, 213, 126, 109, 219, 23, 68, 2, 228, 206, 126, 109, 218, 236, 68, 2, + 228, 206, 126, 109, 230, 221, 230, 222, 230, 223, 230, 222, 215, 152, 42, + 236, 127, 227, 134, 42, 227, 55, 227, 134, 42, 236, 127, 68, 171, 126, + 109, 42, 227, 55, 68, 171, 126, 109, 42, 251, 51, 42, 249, 166, 37, 225, + 192, 37, 231, 64, 37, 217, 52, 37, 247, 242, 220, 42, 37, 62, 227, 71, + 37, 223, 165, 227, 71, 37, 254, 4, 227, 71, 37, 245, 181, 37, 248, 223, + 92, 225, 192, 92, 231, 64, 92, 217, 52, 92, 62, 227, 71, 47, 218, 50, 43, + 218, 50, 121, 218, 50, 116, 218, 50, 254, 7, 231, 40, 216, 162, 244, 114, + 216, 182, 66, 252, 187, 47, 216, 65, 52, 66, 252, 187, 52, 47, 216, 65, + 247, 213, 228, 206, 225, 84, 228, 206, 216, 162, 247, 213, 228, 206, 244, + 115, 229, 250, 52, 66, 252, 187, 52, 47, 216, 65, 225, 119, 215, 160, + 224, 19, 219, 15, 215, 160, 224, 19, 228, 211, 219, 36, 227, 134, 249, + 248, 254, 24, 228, 211, 219, 35, 228, 211, 219, 36, 68, 171, 126, 109, + 249, 248, 254, 24, 228, 211, 219, 36, 171, 126, 109, 227, 55, 227, 134, + 236, 127, 227, 134, 230, 227, 242, 48, 250, 2, 232, 15, 236, 66, 213, + 136, 230, 90, 228, 212, 47, 254, 146, 2, 254, 66, 47, 216, 196, 230, 166, + 233, 17, 254, 154, 230, 166, 233, 17, 227, 62, 230, 166, 236, 56, 230, + 166, 215, 152, 248, 66, 227, 71, 62, 227, 71, 219, 110, 227, 71, 247, + 242, 217, 52, 251, 215, 43, 228, 211, 245, 14, 221, 92, 225, 99, 47, 228, + 211, 245, 14, 221, 92, 225, 99, 43, 221, 92, 225, 99, 47, 221, 92, 225, + 99, 223, 236, 217, 56, 245, 181, 249, 163, 233, 17, 227, 62, 249, 163, + 233, 17, 254, 154, 52, 219, 22, 52, 218, 235, 52, 236, 56, 52, 215, 152, + 225, 215, 126, 22, 226, 173, 109, 233, 137, 2, 247, 195, 242, 228, 2, + 247, 195, 214, 169, 230, 237, 233, 136, 214, 169, 230, 237, 242, 227, + 233, 137, 126, 217, 10, 171, 242, 227, 242, 228, 126, 217, 10, 171, 233, + 136, 126, 217, 10, 171, 233, 136, 126, 217, 10, 171, 242, 227, 126, 217, + 10, 171, 225, 118, 126, 217, 10, 171, 219, 14, 247, 213, 228, 206, 225, + 122, 171, 245, 183, 247, 213, 228, 206, 219, 17, 171, 245, 183, 228, 206, + 42, 236, 127, 68, 171, 126, 109, 228, 206, 42, 227, 55, 68, 171, 126, + 109, 42, 236, 127, 68, 171, 228, 206, 126, 109, 42, 227, 55, 68, 171, + 228, 206, 126, 109, 233, 137, 251, 142, 228, 206, 245, 178, 109, 242, + 228, 251, 142, 228, 206, 245, 178, 109, 225, 119, 251, 142, 228, 206, + 245, 178, 109, 219, 15, 251, 142, 228, 206, 245, 178, 109, 228, 206, 228, + 211, 219, 36, 227, 134, 247, 213, 228, 206, 249, 250, 254, 24, 228, 211, + 219, 35, 228, 206, 228, 211, 219, 36, 68, 171, 126, 109, 247, 213, 228, + 206, 249, 250, 254, 24, 228, 211, 219, 36, 171, 245, 183, 66, 245, 241, + 231, 105, 201, 245, 241, 116, 47, 248, 72, 245, 241, 121, 47, 248, 72, + 245, 241, 245, 248, 68, 2, 187, 201, 91, 245, 248, 68, 2, 66, 252, 187, + 253, 250, 245, 222, 68, 201, 91, 4, 245, 248, 68, 2, 66, 252, 187, 253, + 250, 245, 222, 68, 201, 91, 245, 248, 68, 2, 62, 50, 245, 248, 68, 2, + 227, 29, 4, 245, 248, 68, 2, 227, 29, 245, 248, 68, 2, 215, 159, 245, + 248, 68, 2, 119, 201, 219, 46, 249, 248, 2, 187, 201, 91, 249, 248, 2, + 66, 252, 187, 253, 250, 245, 222, 68, 201, 91, 4, 249, 248, 2, 66, 252, + 187, 253, 250, 245, 222, 68, 201, 91, 249, 248, 2, 227, 29, 4, 249, 248, + 2, 227, 29, 212, 153, 179, 252, 218, 231, 195, 248, 67, 53, 245, 250, 71, + 241, 83, 116, 254, 35, 121, 254, 35, 225, 95, 226, 77, 214, 19, 233, 83, + 43, 250, 238, 47, 250, 238, 43, 244, 146, 47, 244, 146, 251, 226, 47, + 249, 195, 251, 226, 43, 249, 195, 216, 240, 47, 249, 195, 216, 240, 43, + 249, 195, 223, 236, 228, 206, 53, 42, 232, 233, 254, 66, 222, 106, 222, + 113, 217, 223, 224, 47, 225, 157, 236, 96, 214, 150, 219, 185, 225, 209, + 68, 236, 65, 53, 216, 66, 228, 206, 53, 214, 29, 241, 85, 216, 240, 43, + 249, 222, 216, 240, 47, 249, 222, 251, 226, 43, 249, 222, 251, 226, 47, + 249, 222, 216, 240, 157, 236, 69, 251, 226, 157, 236, 69, 244, 74, 220, + 22, 116, 254, 36, 252, 71, 119, 201, 252, 175, 227, 64, 235, 0, 245, 174, + 217, 10, 217, 162, 223, 182, 213, 170, 236, 113, 111, 224, 44, 251, 214, + 234, 255, 233, 164, 254, 146, 125, 223, 178, 254, 146, 125, 245, 174, + 217, 10, 217, 162, 233, 168, 252, 82, 223, 164, 249, 135, 254, 191, 254, + 43, 218, 140, 216, 230, 223, 60, 248, 32, 227, 56, 250, 4, 218, 16, 220, + 33, 249, 213, 249, 212, 197, 199, 16, 241, 4, 197, 199, 16, 219, 179, + 224, 207, 197, 199, 16, 224, 208, 245, 183, 197, 199, 16, 224, 208, 247, + 247, 197, 199, 16, 224, 208, 248, 65, 197, 199, 16, 224, 208, 235, 173, + 197, 199, 16, 224, 208, 250, 95, 197, 199, 16, 250, 96, 219, 89, 197, + 199, 16, 250, 96, 235, 173, 197, 199, 16, 220, 43, 134, 197, 199, 16, + 252, 225, 134, 197, 199, 16, 224, 208, 220, 42, 197, 199, 16, 224, 208, + 252, 224, 197, 199, 16, 224, 208, 233, 136, 197, 199, 16, 224, 208, 242, + 227, 197, 199, 16, 135, 215, 1, 197, 199, 16, 96, 215, 1, 197, 199, 16, + 224, 208, 135, 71, 197, 199, 16, 224, 208, 96, 71, 197, 199, 16, 250, 96, + 252, 224, 197, 199, 16, 121, 218, 51, 215, 159, 197, 199, 16, 248, 127, + 219, 89, 197, 199, 16, 224, 208, 121, 251, 38, 197, 199, 16, 224, 208, + 248, 126, 197, 199, 16, 121, 218, 51, 235, 173, 197, 199, 16, 215, 130, + 215, 1, 197, 199, 16, 224, 208, 215, 130, 71, 197, 199, 16, 116, 218, 51, + 227, 29, 197, 199, 16, 248, 138, 219, 89, 197, 199, 16, 224, 208, 116, + 251, 38, 197, 199, 16, 224, 208, 248, 137, 197, 199, 16, 116, 218, 51, + 235, 173, 197, 199, 16, 246, 179, 215, 1, 197, 199, 16, 224, 208, 246, + 179, 71, 197, 199, 16, 224, 177, 215, 159, 197, 199, 16, 248, 127, 215, + 159, 197, 199, 16, 248, 66, 215, 159, 197, 199, 16, 235, 174, 215, 159, + 197, 199, 16, 250, 96, 215, 159, 197, 199, 16, 116, 220, 206, 235, 173, + 197, 199, 16, 224, 177, 224, 207, 197, 199, 16, 250, 96, 219, 109, 197, + 199, 16, 224, 208, 250, 30, 197, 199, 16, 116, 218, 51, 248, 74, 197, + 199, 16, 248, 138, 248, 74, 197, 199, 16, 219, 110, 248, 74, 197, 199, + 16, 235, 174, 248, 74, 197, 199, 16, 250, 96, 248, 74, 197, 199, 16, 121, + 220, 206, 219, 89, 197, 199, 16, 43, 220, 206, 219, 89, 197, 199, 16, + 217, 56, 248, 74, 197, 199, 16, 242, 228, 248, 74, 197, 199, 16, 250, 24, + 134, 197, 199, 16, 248, 138, 177, 197, 199, 16, 212, 27, 197, 199, 16, + 219, 90, 177, 197, 199, 16, 221, 94, 215, 159, 197, 199, 16, 224, 208, + 228, 206, 245, 183, 197, 199, 16, 224, 208, 224, 192, 197, 199, 16, 121, + 251, 39, 177, 197, 199, 16, 116, 251, 39, 177, 197, 199, 16, 236, 44, + 197, 199, 16, 223, 224, 197, 199, 16, 227, 104, 197, 199, 16, 254, 180, + 215, 159, 197, 199, 16, 245, 185, 215, 159, 197, 199, 16, 236, 45, 215, + 159, 197, 199, 16, 227, 105, 215, 159, 197, 199, 16, 254, 179, 228, 206, + 250, 189, 79, 47, 254, 146, 2, 246, 179, 212, 28, 71, 220, 180, 210, 251, + 214, 252, 92, 88, 66, 233, 84, 2, 231, 107, 247, 195, 236, 74, 88, 249, + 245, 215, 157, 88, 248, 6, 215, 157, 88, 245, 233, 88, 250, 15, 88, 69, + 42, 2, 250, 232, 66, 233, 83, 245, 210, 88, 254, 175, 235, 1, 88, 242, + 60, 88, 37, 201, 252, 187, 2, 228, 204, 37, 216, 197, 246, 181, 251, 188, + 250, 96, 2, 228, 208, 71, 215, 155, 88, 231, 21, 88, 241, 17, 88, 227, + 77, 242, 161, 88, 227, 77, 234, 11, 88, 226, 154, 88, 226, 153, 88, 248, + 14, 249, 161, 16, 244, 109, 112, 219, 253, 88, 197, 199, 16, 224, 207, + 248, 155, 221, 81, 235, 1, 88, 225, 109, 226, 238, 229, 231, 226, 238, + 225, 105, 222, 131, 88, 250, 77, 222, 131, 88, 43, 226, 169, 215, 137, + 102, 43, 226, 169, 245, 110, 43, 226, 169, 232, 237, 102, 47, 226, 169, + 215, 137, 102, 47, 226, 169, 245, 110, 47, 226, 169, 232, 237, 102, 43, + 42, 251, 210, 215, 137, 249, 222, 43, 42, 251, 210, 245, 110, 43, 42, + 251, 210, 232, 237, 249, 222, 47, 42, 251, 210, 215, 137, 249, 222, 47, + 42, 251, 210, 245, 110, 47, 42, 251, 210, 232, 237, 249, 222, 43, 249, + 163, 251, 210, 215, 137, 102, 43, 249, 163, 251, 210, 231, 107, 226, 13, + 43, 249, 163, 251, 210, 232, 237, 102, 249, 163, 251, 210, 245, 110, 47, + 249, 163, 251, 210, 215, 137, 102, 47, 249, 163, 251, 210, 231, 107, 226, + 13, 47, 249, 163, 251, 210, 232, 237, 102, 236, 70, 245, 110, 201, 233, + 84, 245, 110, 215, 137, 43, 171, 232, 237, 47, 249, 163, 251, 210, 222, + 114, 215, 137, 47, 171, 232, 237, 43, 249, 163, 251, 210, 222, 114, 219, + 0, 216, 239, 219, 0, 251, 225, 216, 240, 42, 125, 251, 226, 42, 125, 251, + 226, 42, 251, 210, 113, 216, 240, 42, 125, 34, 16, 251, 225, 43, 66, 93, + 233, 83, 47, 66, 93, 233, 83, 201, 222, 146, 233, 82, 201, 222, 146, 233, + 81, 201, 222, 146, 233, 80, 201, 222, 146, 233, 79, 248, 118, 16, 182, + 66, 22, 216, 240, 223, 182, 248, 118, 16, 182, 66, 22, 251, 226, 223, + 182, 248, 118, 16, 182, 66, 2, 250, 95, 248, 118, 16, 182, 121, 22, 201, + 2, 250, 95, 248, 118, 16, 182, 116, 22, 201, 2, 250, 95, 248, 118, 16, + 182, 66, 2, 216, 196, 248, 118, 16, 182, 121, 22, 201, 2, 216, 196, 248, + 118, 16, 182, 116, 22, 201, 2, 216, 196, 248, 118, 16, 182, 66, 22, 214, + 22, 248, 118, 16, 182, 121, 22, 201, 2, 214, 22, 248, 118, 16, 182, 116, + 22, 201, 2, 214, 22, 248, 118, 16, 182, 121, 22, 241, 149, 248, 118, 16, + 182, 116, 22, 241, 149, 248, 118, 16, 182, 66, 22, 216, 240, 233, 168, + 248, 118, 16, 182, 66, 22, 251, 226, 233, 168, 42, 244, 121, 223, 240, + 88, 246, 4, 88, 66, 233, 84, 245, 110, 231, 170, 251, 199, 231, 170, 187, + 113, 220, 195, 231, 170, 220, 196, 113, 233, 8, 231, 170, 187, 113, 119, + 220, 182, 231, 170, 119, 220, 183, 113, 233, 8, 231, 170, 119, 220, 183, + 235, 181, 231, 170, 216, 179, 231, 170, 217, 189, 231, 170, 226, 99, 246, + 45, 242, 221, 244, 55, 216, 240, 226, 168, 251, 226, 226, 168, 216, 240, + 249, 163, 125, 251, 226, 249, 163, 125, 216, 240, 216, 232, 220, 254, + 125, 251, 226, 216, 232, 220, 254, 125, 69, 216, 210, 252, 82, 223, 165, + 2, 250, 95, 219, 74, 244, 153, 255, 49, 249, 160, 245, 249, 236, 56, 248, + 155, 245, 112, 88, 85, 223, 178, 52, 216, 196, 85, 233, 164, 52, 216, + 196, 85, 215, 139, 52, 216, 196, 85, 246, 180, 52, 216, 196, 85, 223, + 178, 52, 216, 197, 2, 66, 134, 85, 233, 164, 52, 216, 197, 2, 66, 134, + 85, 223, 178, 216, 197, 2, 52, 66, 134, 254, 208, 250, 63, 219, 80, 217, + 53, 250, 63, 241, 86, 2, 244, 139, 222, 181, 16, 31, 228, 101, 16, 31, + 219, 105, 68, 242, 80, 16, 31, 219, 105, 68, 217, 178, 16, 31, 245, 222, + 68, 217, 178, 16, 31, 245, 222, 68, 216, 213, 16, 31, 245, 212, 16, 31, + 255, 40, 16, 31, 252, 91, 16, 31, 252, 223, 16, 31, 201, 218, 52, 16, 31, + 233, 84, 244, 234, 16, 31, 66, 218, 52, 16, 31, 244, 109, 244, 234, 16, + 31, 251, 30, 223, 239, 16, 31, 220, 229, 227, 36, 16, 31, 220, 229, 236, + 112, 16, 31, 248, 218, 233, 74, 245, 163, 16, 31, 248, 103, 249, 240, + 118, 16, 31, 248, 103, 249, 240, 112, 16, 31, 248, 103, 249, 240, 170, + 16, 31, 248, 103, 249, 240, 167, 16, 31, 150, 255, 40, 16, 31, 218, 137, + 236, 174, 16, 31, 245, 222, 68, 216, 214, 252, 5, 16, 31, 251, 61, 16, + 31, 245, 222, 68, 231, 216, 16, 31, 219, 20, 16, 31, 245, 163, 16, 31, + 244, 196, 221, 80, 16, 31, 242, 220, 221, 80, 16, 31, 224, 48, 221, 80, + 16, 31, 215, 151, 221, 80, 16, 31, 219, 225, 16, 31, 248, 135, 252, 8, + 88, 210, 251, 214, 16, 31, 229, 234, 16, 31, 248, 136, 244, 109, 112, 16, + 31, 219, 21, 244, 109, 112, 227, 142, 102, 227, 142, 250, 210, 227, 142, + 244, 112, 227, 142, 236, 52, 244, 112, 227, 142, 252, 89, 251, 178, 227, + 142, 251, 221, 217, 78, 227, 142, 251, 207, 252, 192, 240, 213, 227, 142, + 254, 163, 68, 250, 188, 227, 142, 248, 223, 227, 142, 249, 152, 255, 43, + 228, 99, 227, 142, 52, 252, 224, 37, 21, 118, 37, 21, 112, 37, 21, 170, + 37, 21, 167, 37, 21, 185, 37, 21, 192, 37, 21, 200, 37, 21, 198, 37, 21, + 203, 37, 51, 217, 213, 37, 51, 245, 245, 37, 51, 216, 48, 37, 51, 217, + 130, 37, 51, 244, 95, 37, 51, 244, 207, 37, 51, 220, 66, 37, 51, 221, 63, + 37, 51, 246, 12, 37, 51, 229, 92, 37, 51, 216, 45, 87, 21, 118, 87, 21, + 112, 87, 21, 170, 87, 21, 167, 87, 21, 185, 87, 21, 192, 87, 21, 200, 87, + 21, 198, 87, 21, 203, 87, 51, 217, 213, 87, 51, 245, 245, 87, 51, 216, + 48, 87, 51, 217, 130, 87, 51, 244, 95, 87, 51, 244, 207, 87, 51, 220, 66, + 87, 51, 221, 63, 87, 51, 246, 12, 87, 51, 229, 92, 87, 51, 216, 45, 21, + 124, 244, 64, 219, 83, 21, 119, 244, 64, 219, 83, 21, 137, 244, 64, 219, + 83, 21, 244, 101, 244, 64, 219, 83, 21, 244, 170, 244, 64, 219, 83, 21, + 220, 72, 244, 64, 219, 83, 21, 221, 66, 244, 64, 219, 83, 21, 246, 15, + 244, 64, 219, 83, 21, 229, 95, 244, 64, 219, 83, 51, 217, 214, 244, 64, + 219, 83, 51, 245, 246, 244, 64, 219, 83, 51, 216, 49, 244, 64, 219, 83, + 51, 217, 131, 244, 64, 219, 83, 51, 244, 96, 244, 64, 219, 83, 51, 244, + 208, 244, 64, 219, 83, 51, 220, 67, 244, 64, 219, 83, 51, 221, 64, 244, + 64, 219, 83, 51, 246, 13, 244, 64, 219, 83, 51, 229, 93, 244, 64, 219, + 83, 51, 216, 46, 244, 64, 219, 83, 87, 7, 4, 1, 63, 87, 7, 4, 1, 253, + 201, 87, 7, 4, 1, 251, 121, 87, 7, 4, 1, 249, 125, 87, 7, 4, 1, 77, 87, + 7, 4, 1, 245, 95, 87, 7, 4, 1, 244, 41, 87, 7, 4, 1, 242, 162, 87, 7, 4, + 1, 75, 87, 7, 4, 1, 236, 3, 87, 7, 4, 1, 235, 141, 87, 7, 4, 1, 155, 87, + 7, 4, 1, 184, 87, 7, 4, 1, 206, 87, 7, 4, 1, 78, 87, 7, 4, 1, 227, 11, + 87, 7, 4, 1, 225, 19, 87, 7, 4, 1, 152, 87, 7, 4, 1, 196, 87, 7, 4, 1, + 218, 113, 87, 7, 4, 1, 72, 87, 7, 4, 1, 211, 211, 87, 7, 4, 1, 214, 85, + 87, 7, 4, 1, 213, 169, 87, 7, 4, 1, 213, 108, 87, 7, 4, 1, 212, 152, 37, + 7, 6, 1, 63, 37, 7, 6, 1, 253, 201, 37, 7, 6, 1, 251, 121, 37, 7, 6, 1, + 249, 125, 37, 7, 6, 1, 77, 37, 7, 6, 1, 245, 95, 37, 7, 6, 1, 244, 41, + 37, 7, 6, 1, 242, 162, 37, 7, 6, 1, 75, 37, 7, 6, 1, 236, 3, 37, 7, 6, 1, + 235, 141, 37, 7, 6, 1, 155, 37, 7, 6, 1, 184, 37, 7, 6, 1, 206, 37, 7, 6, + 1, 78, 37, 7, 6, 1, 227, 11, 37, 7, 6, 1, 225, 19, 37, 7, 6, 1, 152, 37, + 7, 6, 1, 196, 37, 7, 6, 1, 218, 113, 37, 7, 6, 1, 72, 37, 7, 6, 1, 211, + 211, 37, 7, 6, 1, 214, 85, 37, 7, 6, 1, 213, 169, 37, 7, 6, 1, 213, 108, + 37, 7, 6, 1, 212, 152, 37, 7, 4, 1, 63, 37, 7, 4, 1, 253, 201, 37, 7, 4, + 1, 251, 121, 37, 7, 4, 1, 249, 125, 37, 7, 4, 1, 77, 37, 7, 4, 1, 245, + 95, 37, 7, 4, 1, 244, 41, 37, 7, 4, 1, 242, 162, 37, 7, 4, 1, 75, 37, 7, + 4, 1, 236, 3, 37, 7, 4, 1, 235, 141, 37, 7, 4, 1, 155, 37, 7, 4, 1, 184, + 37, 7, 4, 1, 206, 37, 7, 4, 1, 78, 37, 7, 4, 1, 227, 11, 37, 7, 4, 1, + 225, 19, 37, 7, 4, 1, 152, 37, 7, 4, 1, 196, 37, 7, 4, 1, 218, 113, 37, + 7, 4, 1, 72, 37, 7, 4, 1, 211, 211, 37, 7, 4, 1, 214, 85, 37, 7, 4, 1, + 213, 169, 37, 7, 4, 1, 213, 108, 37, 7, 4, 1, 212, 152, 37, 21, 212, 79, + 150, 37, 51, 245, 245, 150, 37, 51, 216, 48, 150, 37, 51, 217, 130, 150, + 37, 51, 244, 95, 150, 37, 51, 244, 207, 150, 37, 51, 220, 66, 150, 37, + 51, 221, 63, 150, 37, 51, 246, 12, 150, 37, 51, 229, 92, 150, 37, 51, + 216, 45, 52, 37, 21, 118, 52, 37, 21, 112, 52, 37, 21, 170, 52, 37, 21, + 167, 52, 37, 21, 185, 52, 37, 21, 192, 52, 37, 21, 200, 52, 37, 21, 198, + 52, 37, 21, 203, 52, 37, 51, 217, 213, 150, 37, 21, 212, 79, 93, 97, 182, + 241, 149, 93, 97, 110, 241, 149, 93, 97, 182, 214, 221, 93, 97, 110, 214, + 221, 93, 97, 182, 216, 182, 248, 224, 241, 149, 93, 97, 110, 216, 182, + 248, 224, 241, 149, 93, 97, 182, 216, 182, 248, 224, 214, 221, 93, 97, + 110, 216, 182, 248, 224, 214, 221, 93, 97, 182, 224, 204, 248, 224, 241, + 149, 93, 97, 110, 224, 204, 248, 224, 241, 149, 93, 97, 182, 224, 204, + 248, 224, 214, 221, 93, 97, 110, 224, 204, 248, 224, 214, 221, 93, 97, + 182, 121, 22, 223, 182, 93, 97, 121, 182, 22, 47, 242, 68, 93, 97, 121, + 110, 22, 47, 233, 100, 93, 97, 110, 121, 22, 223, 182, 93, 97, 182, 121, + 22, 233, 168, 93, 97, 121, 182, 22, 43, 242, 68, 93, 97, 121, 110, 22, + 43, 233, 100, 93, 97, 110, 121, 22, 233, 168, 93, 97, 182, 116, 22, 223, + 182, 93, 97, 116, 182, 22, 47, 242, 68, 93, 97, 116, 110, 22, 47, 233, + 100, 93, 97, 110, 116, 22, 223, 182, 93, 97, 182, 116, 22, 233, 168, 93, + 97, 116, 182, 22, 43, 242, 68, 93, 97, 116, 110, 22, 43, 233, 100, 93, + 97, 110, 116, 22, 233, 168, 93, 97, 182, 66, 22, 223, 182, 93, 97, 66, + 182, 22, 47, 242, 68, 93, 97, 116, 110, 22, 47, 121, 233, 100, 93, 97, + 121, 110, 22, 47, 116, 233, 100, 93, 97, 66, 110, 22, 47, 233, 100, 93, + 97, 121, 182, 22, 47, 116, 242, 68, 93, 97, 116, 182, 22, 47, 121, 242, + 68, 93, 97, 110, 66, 22, 223, 182, 93, 97, 182, 66, 22, 233, 168, 93, 97, + 66, 182, 22, 43, 242, 68, 93, 97, 116, 110, 22, 43, 121, 233, 100, 93, + 97, 121, 110, 22, 43, 116, 233, 100, 93, 97, 66, 110, 22, 43, 233, 100, + 93, 97, 121, 182, 22, 43, 116, 242, 68, 93, 97, 116, 182, 22, 43, 121, + 242, 68, 93, 97, 110, 66, 22, 233, 168, 93, 97, 182, 121, 22, 241, 149, + 93, 97, 43, 110, 22, 47, 121, 233, 100, 93, 97, 47, 110, 22, 43, 121, + 233, 100, 93, 97, 121, 182, 22, 201, 242, 68, 93, 97, 121, 110, 22, 201, + 233, 100, 93, 97, 47, 182, 22, 43, 121, 242, 68, 93, 97, 43, 182, 22, 47, + 121, 242, 68, 93, 97, 110, 121, 22, 241, 149, 93, 97, 182, 116, 22, 241, + 149, 93, 97, 43, 110, 22, 47, 116, 233, 100, 93, 97, 47, 110, 22, 43, + 116, 233, 100, 93, 97, 116, 182, 22, 201, 242, 68, 93, 97, 116, 110, 22, + 201, 233, 100, 93, 97, 47, 182, 22, 43, 116, 242, 68, 93, 97, 43, 182, + 22, 47, 116, 242, 68, 93, 97, 110, 116, 22, 241, 149, 93, 97, 182, 66, + 22, 241, 149, 93, 97, 43, 110, 22, 47, 66, 233, 100, 93, 97, 47, 110, 22, + 43, 66, 233, 100, 93, 97, 66, 182, 22, 201, 242, 68, 93, 97, 116, 110, + 22, 121, 201, 233, 100, 93, 97, 121, 110, 22, 116, 201, 233, 100, 93, 97, + 66, 110, 22, 201, 233, 100, 93, 97, 43, 116, 110, 22, 47, 121, 233, 100, + 93, 97, 47, 116, 110, 22, 43, 121, 233, 100, 93, 97, 43, 121, 110, 22, + 47, 116, 233, 100, 93, 97, 47, 121, 110, 22, 43, 116, 233, 100, 93, 97, + 121, 182, 22, 116, 201, 242, 68, 93, 97, 116, 182, 22, 121, 201, 242, 68, + 93, 97, 47, 182, 22, 43, 66, 242, 68, 93, 97, 43, 182, 22, 47, 66, 242, + 68, 93, 97, 110, 66, 22, 241, 149, 93, 97, 182, 52, 248, 224, 241, 149, + 93, 97, 110, 52, 248, 224, 241, 149, 93, 97, 182, 52, 248, 224, 214, 221, + 93, 97, 110, 52, 248, 224, 214, 221, 93, 97, 52, 241, 149, 93, 97, 52, + 214, 221, 93, 97, 121, 220, 100, 22, 47, 246, 188, 93, 97, 121, 52, 22, + 47, 220, 99, 93, 97, 52, 121, 22, 223, 182, 93, 97, 121, 220, 100, 22, + 43, 246, 188, 93, 97, 121, 52, 22, 43, 220, 99, 93, 97, 52, 121, 22, 233, + 168, 93, 97, 116, 220, 100, 22, 47, 246, 188, 93, 97, 116, 52, 22, 47, + 220, 99, 93, 97, 52, 116, 22, 223, 182, 93, 97, 116, 220, 100, 22, 43, + 246, 188, 93, 97, 116, 52, 22, 43, 220, 99, 93, 97, 52, 116, 22, 233, + 168, 93, 97, 66, 220, 100, 22, 47, 246, 188, 93, 97, 66, 52, 22, 47, 220, + 99, 93, 97, 52, 66, 22, 223, 182, 93, 97, 66, 220, 100, 22, 43, 246, 188, + 93, 97, 66, 52, 22, 43, 220, 99, 93, 97, 52, 66, 22, 233, 168, 93, 97, + 121, 220, 100, 22, 201, 246, 188, 93, 97, 121, 52, 22, 201, 220, 99, 93, + 97, 52, 121, 22, 241, 149, 93, 97, 116, 220, 100, 22, 201, 246, 188, 93, + 97, 116, 52, 22, 201, 220, 99, 93, 97, 52, 116, 22, 241, 149, 93, 97, 66, + 220, 100, 22, 201, 246, 188, 93, 97, 66, 52, 22, 201, 220, 99, 93, 97, + 52, 66, 22, 241, 149, 93, 97, 182, 254, 67, 121, 22, 223, 182, 93, 97, + 182, 254, 67, 121, 22, 233, 168, 93, 97, 182, 254, 67, 116, 22, 233, 168, + 93, 97, 182, 254, 67, 116, 22, 223, 182, 93, 97, 182, 248, 72, 215, 137, + 47, 217, 10, 232, 237, 233, 168, 93, 97, 182, 248, 72, 215, 137, 43, 217, + 10, 232, 237, 223, 182, 93, 97, 182, 248, 72, 249, 193, 93, 97, 182, 233, + 168, 93, 97, 182, 215, 140, 93, 97, 182, 223, 182, 93, 97, 182, 246, 181, + 93, 97, 110, 233, 168, 93, 97, 110, 215, 140, 93, 97, 110, 223, 182, 93, + 97, 110, 246, 181, 93, 97, 182, 43, 22, 110, 223, 182, 93, 97, 182, 116, + 22, 110, 246, 181, 93, 97, 110, 43, 22, 182, 223, 182, 93, 97, 110, 116, + 22, 182, 246, 181, 215, 137, 157, 252, 5, 232, 237, 124, 246, 11, 252, 5, + 232, 237, 124, 224, 202, 252, 5, 232, 237, 137, 246, 9, 252, 5, 232, 237, + 157, 252, 5, 232, 237, 244, 170, 246, 9, 252, 5, 232, 237, 137, 224, 200, + 252, 5, 232, 237, 221, 66, 246, 9, 252, 5, 244, 64, 252, 5, 43, 221, 66, + 246, 9, 252, 5, 43, 137, 224, 200, 252, 5, 43, 244, 170, 246, 9, 252, 5, + 43, 157, 252, 5, 43, 137, 246, 9, 252, 5, 43, 124, 224, 202, 252, 5, 43, + 124, 246, 11, 252, 5, 47, 157, 252, 5, 182, 221, 37, 231, 217, 221, 37, + 248, 229, 221, 37, 215, 137, 124, 246, 11, 252, 5, 47, 124, 246, 11, 252, + 5, 224, 206, 232, 237, 233, 168, 224, 206, 232, 237, 223, 182, 224, 206, + 215, 137, 233, 168, 224, 206, 215, 137, 43, 22, 232, 237, 43, 22, 232, + 237, 223, 182, 224, 206, 215, 137, 43, 22, 232, 237, 223, 182, 224, 206, + 215, 137, 43, 22, 215, 137, 47, 22, 232, 237, 233, 168, 224, 206, 215, + 137, 43, 22, 215, 137, 47, 22, 232, 237, 223, 182, 224, 206, 215, 137, + 223, 182, 224, 206, 215, 137, 47, 22, 232, 237, 233, 168, 224, 206, 215, + 137, 47, 22, 232, 237, 43, 22, 232, 237, 223, 182, 85, 219, 185, 69, 219, + 185, 69, 42, 2, 223, 119, 249, 221, 69, 42, 249, 249, 85, 4, 219, 185, + 42, 2, 201, 244, 194, 42, 2, 66, 244, 194, 42, 2, 227, 49, 249, 189, 244, + 194, 42, 2, 215, 137, 43, 217, 10, 232, 237, 47, 244, 194, 42, 2, 215, + 137, 47, 217, 10, 232, 237, 43, 244, 194, 42, 2, 248, 72, 249, 189, 244, + 194, 85, 4, 219, 185, 69, 4, 219, 185, 85, 224, 43, 69, 224, 43, 85, 66, + 224, 43, 69, 66, 224, 43, 85, 226, 171, 69, 226, 171, 85, 215, 139, 216, + 196, 69, 215, 139, 216, 196, 85, 215, 139, 4, 216, 196, 69, 215, 139, 4, + 216, 196, 85, 223, 178, 216, 196, 69, 223, 178, 216, 196, 85, 223, 178, + 4, 216, 196, 69, 223, 178, 4, 216, 196, 85, 223, 178, 225, 178, 69, 223, + 178, 225, 178, 85, 246, 180, 216, 196, 69, 246, 180, 216, 196, 85, 246, + 180, 4, 216, 196, 69, 246, 180, 4, 216, 196, 85, 233, 164, 216, 196, 69, + 233, 164, 216, 196, 85, 233, 164, 4, 216, 196, 69, 233, 164, 4, 216, 196, + 85, 233, 164, 225, 178, 69, 233, 164, 225, 178, 85, 248, 65, 69, 248, 65, + 69, 248, 66, 249, 249, 85, 4, 248, 65, 244, 178, 232, 233, 69, 250, 95, + 246, 193, 250, 95, 250, 96, 2, 66, 244, 194, 251, 165, 85, 250, 95, 250, + 96, 2, 43, 157, 252, 13, 250, 96, 2, 47, 157, 252, 13, 250, 96, 2, 232, + 237, 157, 252, 13, 250, 96, 2, 215, 137, 157, 252, 13, 250, 96, 2, 215, + 137, 47, 224, 206, 252, 13, 250, 96, 2, 254, 191, 251, 142, 215, 137, 43, + 224, 206, 252, 13, 43, 157, 85, 250, 95, 47, 157, 85, 250, 95, 236, 53, + 251, 167, 236, 53, 69, 250, 95, 215, 137, 157, 236, 53, 69, 250, 95, 232, + 237, 157, 236, 53, 69, 250, 95, 215, 137, 43, 224, 206, 250, 93, 254, 66, + 215, 137, 47, 224, 206, 250, 93, 254, 66, 232, 237, 47, 224, 206, 250, + 93, 254, 66, 232, 237, 43, 224, 206, 250, 93, 254, 66, 215, 137, 157, + 250, 95, 232, 237, 157, 250, 95, 85, 232, 237, 47, 216, 196, 85, 232, + 237, 43, 216, 196, 85, 215, 137, 43, 216, 196, 85, 215, 137, 47, 216, + 196, 69, 251, 167, 42, 2, 43, 157, 252, 13, 42, 2, 47, 157, 252, 13, 42, + 2, 215, 137, 43, 248, 72, 157, 252, 13, 42, 2, 232, 237, 47, 248, 72, + 157, 252, 13, 69, 42, 2, 66, 252, 24, 233, 83, 69, 215, 139, 216, 197, 2, + 247, 195, 215, 139, 216, 197, 2, 43, 157, 252, 13, 215, 139, 216, 197, 2, + 47, 157, 252, 13, 233, 207, 250, 95, 69, 42, 2, 215, 137, 43, 224, 205, + 69, 42, 2, 232, 237, 43, 224, 205, 69, 42, 2, 232, 237, 47, 224, 205, 69, + 42, 2, 215, 137, 47, 224, 205, 69, 250, 96, 2, 215, 137, 43, 224, 205, + 69, 250, 96, 2, 232, 237, 43, 224, 205, 69, 250, 96, 2, 232, 237, 47, + 224, 205, 69, 250, 96, 2, 215, 137, 47, 224, 205, 215, 137, 43, 216, 196, + 215, 137, 47, 216, 196, 232, 237, 43, 216, 196, 69, 231, 217, 219, 185, + 85, 231, 217, 219, 185, 69, 231, 217, 4, 219, 185, 85, 231, 217, 4, 219, + 185, 232, 237, 47, 216, 196, 85, 218, 253, 2, 224, 59, 250, 51, 215, 170, + 220, 7, 250, 26, 85, 219, 109, 69, 219, 109, 233, 98, 217, 99, 218, 252, + 254, 20, 228, 225, 248, 110, 228, 225, 250, 1, 227, 67, 85, 217, 222, 69, + 217, 222, 252, 202, 251, 214, 252, 202, 93, 2, 250, 188, 252, 202, 93, 2, + 213, 169, 222, 193, 215, 171, 2, 224, 86, 246, 160, 241, 92, 252, 69, 69, + 220, 203, 226, 13, 85, 220, 203, 226, 13, 221, 32, 223, 236, 223, 123, + 244, 144, 242, 75, 251, 167, 85, 43, 225, 177, 236, 100, 85, 47, 225, + 177, 236, 100, 69, 43, 225, 177, 236, 100, 69, 116, 225, 177, 236, 100, + 69, 47, 225, 177, 236, 100, 69, 121, 225, 177, 236, 100, 220, 48, 22, + 249, 192, 251, 19, 53, 224, 97, 53, 252, 31, 53, 251, 80, 254, 140, 227, + 50, 249, 193, 250, 171, 223, 224, 249, 194, 68, 232, 247, 249, 194, 68, + 235, 232, 219, 110, 22, 249, 199, 245, 1, 88, 255, 25, 221, 34, 242, 125, + 22, 220, 134, 226, 131, 88, 212, 246, 213, 60, 216, 186, 31, 242, 70, + 216, 186, 31, 233, 229, 216, 186, 31, 244, 185, 216, 186, 31, 217, 100, + 216, 186, 31, 213, 227, 216, 186, 31, 214, 27, 216, 186, 31, 230, 255, + 216, 186, 31, 246, 44, 213, 245, 68, 248, 91, 69, 244, 73, 245, 23, 69, + 220, 21, 245, 23, 85, 220, 21, 245, 23, 69, 218, 253, 2, 224, 59, 244, + 181, 224, 202, 231, 12, 233, 202, 224, 202, 231, 12, 231, 188, 244, 227, + 53, 246, 44, 232, 68, 53, 235, 155, 222, 161, 215, 122, 229, 242, 225, + 190, 254, 54, 218, 4, 243, 148, 251, 59, 233, 141, 214, 135, 233, 108, + 222, 133, 222, 213, 251, 48, 254, 83, 225, 220, 69, 250, 177, 234, 198, + 69, 250, 177, 224, 194, 69, 250, 177, 223, 131, 69, 250, 177, 252, 23, + 69, 250, 177, 234, 150, 69, 250, 177, 226, 141, 85, 250, 177, 234, 198, + 85, 250, 177, 224, 194, 85, 250, 177, 223, 131, 85, 250, 177, 252, 23, + 85, 250, 177, 234, 150, 85, 250, 177, 226, 141, 85, 219, 223, 219, 9, 69, + 242, 75, 219, 9, 69, 248, 66, 219, 9, 85, 250, 49, 219, 9, 69, 219, 223, + 219, 9, 85, 242, 75, 219, 9, 85, 248, 66, 219, 9, 69, 250, 49, 219, 9, + 241, 92, 219, 189, 224, 202, 228, 201, 246, 11, 228, 201, 252, 119, 246, + 11, 228, 196, 252, 119, 220, 65, 228, 196, 230, 197, 244, 155, 53, 230, + 197, 230, 77, 53, 230, 197, 221, 21, 53, 213, 253, 180, 249, 193, 246, + 41, 180, 249, 193, 215, 148, 224, 39, 88, 224, 39, 16, 31, 216, 21, 225, + 202, 224, 39, 16, 31, 216, 20, 225, 202, 224, 39, 16, 31, 216, 19, 225, + 202, 224, 39, 16, 31, 216, 18, 225, 202, 224, 39, 16, 31, 216, 17, 225, + 202, 224, 39, 16, 31, 216, 16, 225, 202, 224, 39, 16, 31, 216, 15, 225, + 202, 224, 39, 16, 31, 243, 146, 232, 16, 85, 215, 148, 224, 39, 88, 224, + 40, 226, 185, 88, 226, 161, 226, 185, 88, 226, 85, 226, 185, 53, 213, + 243, 88, 248, 58, 245, 22, 248, 58, 245, 21, 248, 58, 245, 20, 248, 58, + 245, 19, 248, 58, 245, 18, 248, 58, 245, 17, 69, 250, 96, 2, 62, 223, + 182, 69, 250, 96, 2, 119, 247, 193, 85, 250, 96, 2, 69, 62, 223, 182, 85, + 250, 96, 2, 119, 69, 247, 193, 231, 26, 31, 213, 60, 231, 26, 31, 212, + 245, 248, 41, 31, 242, 229, 213, 60, 248, 41, 31, 233, 135, 212, 245, + 248, 41, 31, 233, 135, 213, 60, 248, 41, 31, 242, 229, 212, 245, 69, 244, + 162, 85, 244, 162, 242, 125, 22, 226, 16, 254, 156, 249, 191, 218, 194, + 219, 117, 68, 255, 3, 222, 147, 254, 204, 244, 140, 243, 156, 219, 117, + 68, 242, 50, 253, 242, 88, 244, 151, 227, 32, 69, 219, 109, 137, 233, 78, + 249, 237, 223, 182, 137, 233, 78, 249, 237, 233, 168, 214, 37, 53, 127, + 214, 115, 53, 246, 185, 244, 227, 53, 246, 185, 232, 68, 53, 236, 61, + 244, 227, 22, 232, 68, 53, 232, 68, 22, 244, 227, 53, 232, 68, 2, 219, + 59, 53, 232, 68, 2, 219, 59, 22, 232, 68, 22, 244, 227, 53, 66, 232, 68, + 2, 219, 59, 53, 201, 232, 68, 2, 219, 59, 53, 231, 217, 69, 250, 95, 231, + 217, 85, 250, 95, 231, 217, 4, 69, 250, 95, 232, 31, 88, 247, 240, 88, + 215, 146, 226, 160, 88, 250, 35, 244, 60, 215, 118, 229, 237, 250, 218, + 226, 225, 235, 161, 214, 167, 250, 153, 85, 231, 13, 233, 95, 221, 56, + 221, 90, 224, 185, 221, 74, 220, 2, 252, 205, 252, 172, 92, 235, 0, 69, + 246, 169, 232, 63, 69, 246, 169, 234, 198, 85, 246, 169, 232, 63, 85, + 246, 169, 234, 198, 220, 8, 213, 219, 220, 11, 218, 253, 252, 97, 250, + 51, 224, 85, 85, 220, 7, 217, 101, 250, 52, 22, 224, 85, 216, 66, 69, + 220, 203, 226, 13, 216, 66, 85, 220, 203, 226, 13, 69, 248, 66, 236, 113, + 219, 185, 249, 188, 233, 213, 248, 10, 251, 44, 227, 70, 226, 16, 251, + 45, 220, 35, 242, 59, 2, 69, 249, 193, 37, 249, 188, 233, 213, 250, 211, + 228, 229, 245, 204, 254, 177, 227, 94, 43, 214, 13, 216, 221, 85, 216, + 28, 43, 214, 13, 216, 221, 69, 216, 28, 43, 214, 13, 216, 221, 85, 43, + 233, 214, 231, 187, 69, 43, 233, 214, 231, 187, 246, 165, 220, 29, 53, + 110, 69, 246, 180, 216, 196, 43, 250, 60, 245, 204, 92, 222, 193, 245, 8, + 248, 72, 236, 113, 69, 250, 96, 236, 113, 85, 219, 185, 85, 216, 163, + 223, 246, 43, 245, 203, 223, 246, 43, 245, 202, 253, 254, 16, 31, 215, + 122, 110, 250, 96, 2, 219, 59, 22, 119, 181, 50, 226, 100, 223, 179, 236, + 63, 226, 100, 233, 165, 236, 63, 226, 100, 236, 52, 226, 100, 85, 249, + 194, 227, 100, 220, 230, 220, 218, 220, 174, 250, 121, 251, 26, 242, 6, + 220, 73, 243, 157, 213, 219, 241, 72, 243, 157, 2, 242, 115, 232, 51, 16, + 31, 233, 99, 230, 255, 215, 171, 227, 100, 242, 221, 244, 102, 244, 163, + 236, 113, 241, 164, 244, 218, 222, 209, 42, 244, 101, 249, 221, 220, 51, + 240, 222, 220, 54, 226, 80, 2, 252, 205, 217, 208, 235, 247, 252, 192, + 88, 242, 78, 242, 231, 88, 244, 67, 225, 64, 249, 167, 227, 100, 85, 219, + 185, 69, 244, 163, 2, 201, 231, 107, 85, 219, 60, 215, 137, 252, 9, 222, + 135, 85, 222, 135, 232, 237, 252, 9, 222, 135, 69, 222, 135, 69, 110, + 250, 189, 79, 217, 223, 233, 24, 53, 218, 17, 246, 164, 254, 226, 245, + 199, 224, 83, 244, 174, 224, 83, 242, 118, 214, 157, 242, 118, 213, 189, + 242, 118, 232, 237, 47, 226, 109, 226, 109, 215, 137, 47, 226, 109, 69, + 229, 125, 85, 229, 125, 250, 189, 79, 110, 250, 189, 79, 230, 224, 213, + 169, 110, 230, 224, 213, 169, 252, 202, 213, 169, 110, 252, 202, 213, + 169, 227, 32, 25, 249, 193, 110, 25, 249, 193, 210, 250, 232, 249, 193, + 110, 210, 250, 232, 249, 193, 7, 249, 193, 221, 36, 69, 7, 249, 193, 227, + 32, 7, 249, 193, 232, 65, 249, 193, 219, 110, 68, 248, 216, 244, 101, + 217, 236, 254, 3, 244, 101, 252, 203, 254, 3, 110, 244, 101, 252, 203, + 254, 3, 244, 101, 250, 47, 254, 3, 85, 244, 101, 225, 179, 219, 109, 69, + 244, 101, 225, 179, 219, 109, 219, 218, 219, 65, 227, 32, 69, 219, 109, + 37, 69, 219, 109, 210, 250, 232, 85, 219, 109, 85, 250, 232, 69, 219, + 109, 227, 32, 85, 219, 109, 110, 227, 32, 85, 219, 109, 225, 228, 219, + 109, 221, 36, 69, 219, 109, 110, 254, 3, 210, 250, 232, 254, 3, 246, 15, + 219, 195, 254, 3, 246, 15, 225, 179, 85, 219, 109, 246, 15, 225, 179, + 225, 228, 219, 109, 220, 72, 225, 179, 85, 219, 109, 246, 15, 225, 179, + 224, 41, 85, 219, 109, 110, 246, 15, 225, 179, 224, 41, 85, 219, 109, + 216, 49, 225, 179, 85, 219, 109, 220, 67, 225, 179, 254, 3, 217, 236, + 254, 3, 210, 250, 232, 217, 236, 254, 3, 110, 217, 236, 254, 3, 220, 72, + 226, 69, 85, 22, 69, 244, 143, 85, 244, 143, 69, 244, 143, 246, 15, 226, + 69, 227, 32, 85, 244, 143, 37, 210, 250, 232, 246, 15, 225, 179, 219, + 109, 110, 217, 236, 225, 228, 254, 3, 220, 9, 217, 72, 216, 189, 220, 9, + 110, 250, 174, 220, 9, 219, 220, 110, 219, 220, 252, 203, 254, 3, 246, + 15, 217, 236, 225, 91, 254, 3, 110, 246, 15, 217, 236, 225, 91, 254, 3, + 249, 194, 79, 221, 36, 69, 250, 95, 150, 92, 249, 194, 79, 232, 237, 47, + 246, 162, 69, 219, 185, 215, 137, 47, 246, 162, 69, 219, 185, 232, 237, + 47, 221, 36, 69, 219, 185, 215, 137, 47, 221, 36, 69, 219, 185, 85, 224, + 193, 156, 227, 52, 69, 224, 193, 156, 227, 52, 69, 245, 119, 156, 227, + 52, 85, 248, 66, 231, 65, 69, 213, 169, 110, 245, 119, 156, 88, 182, 66, + 134, 231, 217, 66, 134, 110, 66, 134, 110, 220, 100, 216, 66, 250, 24, + 224, 178, 156, 227, 52, 110, 220, 100, 250, 24, 224, 178, 156, 227, 52, + 110, 52, 216, 66, 250, 24, 224, 178, 156, 227, 52, 110, 52, 250, 24, 224, + 178, 156, 227, 52, 110, 117, 220, 100, 250, 24, 224, 178, 156, 227, 52, + 110, 117, 52, 250, 24, 224, 178, 156, 227, 52, 249, 156, 219, 94, 226, + 180, 5, 227, 52, 110, 245, 119, 156, 227, 52, 110, 242, 75, 245, 119, + 156, 227, 52, 110, 85, 242, 74, 223, 123, 110, 85, 242, 75, 251, 167, + 244, 144, 242, 74, 223, 123, 244, 144, 242, 75, 251, 167, 231, 217, 43, + 226, 169, 227, 52, 231, 217, 47, 226, 169, 227, 52, 231, 217, 244, 152, + 43, 226, 169, 227, 52, 231, 217, 244, 152, 47, 226, 169, 227, 52, 231, + 217, 233, 164, 254, 146, 251, 210, 227, 52, 231, 217, 223, 178, 254, 146, + 251, 210, 227, 52, 110, 233, 164, 254, 146, 224, 178, 156, 227, 52, 110, + 223, 178, 254, 146, 224, 178, 156, 227, 52, 110, 233, 164, 254, 146, 251, + 210, 227, 52, 110, 223, 178, 254, 146, 251, 210, 227, 52, 182, 43, 216, + 232, 220, 254, 251, 210, 227, 52, 182, 47, 216, 232, 220, 254, 251, 210, + 227, 52, 231, 217, 43, 249, 163, 251, 210, 227, 52, 231, 217, 47, 249, + 163, 251, 210, 227, 52, 248, 21, 150, 37, 21, 118, 248, 21, 150, 37, 21, + 112, 248, 21, 150, 37, 21, 170, 248, 21, 150, 37, 21, 167, 248, 21, 150, + 37, 21, 185, 248, 21, 150, 37, 21, 192, 248, 21, 150, 37, 21, 200, 248, + 21, 150, 37, 21, 198, 248, 21, 150, 37, 21, 203, 248, 21, 150, 37, 51, + 217, 213, 248, 21, 37, 35, 21, 118, 248, 21, 37, 35, 21, 112, 248, 21, + 37, 35, 21, 170, 248, 21, 37, 35, 21, 167, 248, 21, 37, 35, 21, 185, 248, + 21, 37, 35, 21, 192, 248, 21, 37, 35, 21, 200, 248, 21, 37, 35, 21, 198, + 248, 21, 37, 35, 21, 203, 248, 21, 37, 35, 51, 217, 213, 248, 21, 150, + 37, 35, 21, 118, 248, 21, 150, 37, 35, 21, 112, 248, 21, 150, 37, 35, 21, + 170, 248, 21, 150, 37, 35, 21, 167, 248, 21, 150, 37, 35, 21, 185, 248, + 21, 150, 37, 35, 21, 192, 248, 21, 150, 37, 35, 21, 200, 248, 21, 150, + 37, 35, 21, 198, 248, 21, 150, 37, 35, 21, 203, 248, 21, 150, 37, 35, 51, + 217, 213, 110, 213, 234, 96, 71, 110, 95, 53, 110, 231, 65, 53, 110, 247, + 242, 53, 110, 219, 234, 246, 41, 71, 110, 96, 71, 110, 228, 210, 246, 41, + 71, 246, 173, 225, 181, 96, 71, 110, 223, 120, 96, 71, 216, 195, 96, 71, + 110, 216, 195, 96, 71, 248, 222, 216, 195, 96, 71, 110, 248, 222, 216, + 195, 96, 71, 85, 96, 71, 217, 110, 216, 238, 96, 254, 35, 217, 110, 251, + 224, 96, 254, 35, 85, 96, 254, 35, 110, 85, 249, 156, 246, 179, 22, 96, + 71, 110, 85, 249, 156, 215, 130, 22, 96, 71, 219, 182, 85, 96, 71, 110, + 250, 11, 85, 96, 71, 223, 177, 69, 96, 71, 233, 163, 69, 96, 71, 252, + 227, 221, 36, 69, 96, 71, 244, 75, 221, 36, 69, 96, 71, 110, 232, 237, + 223, 176, 69, 96, 71, 110, 215, 137, 223, 176, 69, 96, 71, 228, 203, 232, + 237, 223, 176, 69, 96, 71, 249, 163, 232, 251, 228, 203, 215, 137, 223, + 176, 69, 96, 71, 37, 110, 69, 96, 71, 213, 240, 96, 71, 252, 12, 219, + 234, 246, 41, 71, 252, 12, 96, 71, 252, 12, 228, 210, 246, 41, 71, 110, + 252, 12, 219, 234, 246, 41, 71, 110, 252, 12, 96, 71, 110, 252, 12, 228, + 210, 246, 41, 71, 217, 238, 96, 71, 110, 217, 237, 96, 71, 214, 5, 96, + 71, 110, 214, 5, 96, 71, 227, 75, 96, 71, 52, 249, 163, 232, 251, 137, + 248, 31, 254, 145, 69, 216, 197, 249, 249, 4, 69, 216, 196, 226, 83, 210, + 219, 22, 210, 218, 235, 43, 223, 28, 252, 218, 248, 132, 47, 223, 28, + 252, 218, 248, 132, 171, 2, 62, 236, 73, 223, 237, 219, 251, 225, 117, + 219, 22, 218, 236, 225, 117, 219, 250, 66, 252, 187, 2, 201, 91, 187, + 247, 241, 92, 233, 17, 254, 154, 92, 233, 17, 227, 62, 69, 248, 66, 2, + 250, 230, 247, 195, 22, 2, 247, 195, 245, 248, 68, 227, 73, 215, 129, + 232, 237, 47, 249, 223, 2, 247, 195, 215, 137, 43, 249, 223, 2, 247, 195, + 43, 227, 34, 235, 183, 47, 227, 34, 235, 183, 244, 64, 227, 34, 235, 183, + 233, 207, 116, 218, 50, 233, 207, 121, 218, 50, 43, 22, 47, 52, 216, 65, + 43, 22, 47, 218, 50, 43, 230, 227, 187, 47, 218, 50, 187, 43, 218, 50, + 116, 218, 51, 2, 250, 96, 50, 232, 234, 247, 246, 251, 132, 201, 223, 70, + 69, 250, 10, 248, 65, 69, 250, 10, 248, 66, 2, 135, 217, 81, 69, 250, 10, + 248, 66, 2, 96, 217, 81, 69, 42, 2, 135, 217, 81, 69, 42, 2, 96, 217, 81, + 14, 43, 69, 42, 125, 14, 47, 69, 42, 125, 14, 43, 254, 146, 125, 14, 47, + 254, 146, 125, 14, 43, 52, 254, 146, 125, 14, 47, 52, 254, 146, 125, 14, + 43, 69, 216, 232, 220, 254, 125, 14, 47, 69, 216, 232, 220, 254, 125, 14, + 43, 244, 152, 226, 168, 14, 47, 244, 152, 226, 168, 215, 130, 224, 204, + 71, 246, 179, 224, 204, 71, 254, 126, 243, 194, 250, 96, 71, 250, 62, + 243, 194, 250, 96, 71, 47, 80, 2, 37, 225, 192, 187, 135, 71, 187, 96, + 71, 187, 43, 47, 71, 187, 135, 52, 71, 187, 96, 52, 71, 187, 43, 47, 52, + 71, 187, 135, 80, 244, 77, 134, 187, 96, 80, 244, 77, 134, 187, 135, 52, + 80, 244, 77, 134, 187, 96, 52, 80, 244, 77, 134, 187, 96, 219, 181, 71, + 45, 46, 252, 7, 45, 46, 247, 192, 45, 46, 247, 64, 45, 46, 247, 191, 45, + 46, 247, 0, 45, 46, 247, 127, 45, 46, 247, 63, 45, 46, 247, 190, 45, 46, + 246, 224, 45, 46, 247, 95, 45, 46, 247, 31, 45, 46, 247, 158, 45, 46, + 246, 255, 45, 46, 247, 126, 45, 46, 247, 62, 45, 46, 247, 189, 45, 46, + 246, 208, 45, 46, 247, 79, 45, 46, 247, 15, 45, 46, 247, 142, 45, 46, + 246, 239, 45, 46, 247, 110, 45, 46, 247, 46, 45, 46, 247, 173, 45, 46, + 246, 223, 45, 46, 247, 94, 45, 46, 247, 30, 45, 46, 247, 157, 45, 46, + 246, 254, 45, 46, 247, 125, 45, 46, 247, 61, 45, 46, 247, 188, 45, 46, + 246, 200, 45, 46, 247, 71, 45, 46, 247, 7, 45, 46, 247, 134, 45, 46, 246, + 231, 45, 46, 247, 102, 45, 46, 247, 38, 45, 46, 247, 165, 45, 46, 246, + 215, 45, 46, 247, 86, 45, 46, 247, 22, 45, 46, 247, 149, 45, 46, 246, + 246, 45, 46, 247, 117, 45, 46, 247, 53, 45, 46, 247, 180, 45, 46, 246, + 207, 45, 46, 247, 78, 45, 46, 247, 14, 45, 46, 247, 141, 45, 46, 246, + 238, 45, 46, 247, 109, 45, 46, 247, 45, 45, 46, 247, 172, 45, 46, 246, + 222, 45, 46, 247, 93, 45, 46, 247, 29, 45, 46, 247, 156, 45, 46, 246, + 253, 45, 46, 247, 124, 45, 46, 247, 60, 45, 46, 247, 187, 45, 46, 246, + 196, 45, 46, 247, 67, 45, 46, 247, 3, 45, 46, 247, 130, 45, 46, 246, 227, + 45, 46, 247, 98, 45, 46, 247, 34, 45, 46, 247, 161, 45, 46, 246, 211, 45, + 46, 247, 82, 45, 46, 247, 18, 45, 46, 247, 145, 45, 46, 246, 242, 45, 46, + 247, 113, 45, 46, 247, 49, 45, 46, 247, 176, 45, 46, 246, 203, 45, 46, + 247, 74, 45, 46, 247, 10, 45, 46, 247, 137, 45, 46, 246, 234, 45, 46, + 247, 105, 45, 46, 247, 41, 45, 46, 247, 168, 45, 46, 246, 218, 45, 46, + 247, 89, 45, 46, 247, 25, 45, 46, 247, 152, 45, 46, 246, 249, 45, 46, + 247, 120, 45, 46, 247, 56, 45, 46, 247, 183, 45, 46, 246, 199, 45, 46, + 247, 70, 45, 46, 247, 6, 45, 46, 247, 133, 45, 46, 246, 230, 45, 46, 247, + 101, 45, 46, 247, 37, 45, 46, 247, 164, 45, 46, 246, 214, 45, 46, 247, + 85, 45, 46, 247, 21, 45, 46, 247, 148, 45, 46, 246, 245, 45, 46, 247, + 116, 45, 46, 247, 52, 45, 46, 247, 179, 45, 46, 246, 206, 45, 46, 247, + 77, 45, 46, 247, 13, 45, 46, 247, 140, 45, 46, 246, 237, 45, 46, 247, + 108, 45, 46, 247, 44, 45, 46, 247, 171, 45, 46, 246, 221, 45, 46, 247, + 92, 45, 46, 247, 28, 45, 46, 247, 155, 45, 46, 246, 252, 45, 46, 247, + 123, 45, 46, 247, 59, 45, 46, 247, 186, 45, 46, 246, 194, 45, 46, 247, + 65, 45, 46, 247, 1, 45, 46, 247, 128, 45, 46, 246, 225, 45, 46, 247, 96, + 45, 46, 247, 32, 45, 46, 247, 159, 45, 46, 246, 209, 45, 46, 247, 80, 45, + 46, 247, 16, 45, 46, 247, 143, 45, 46, 246, 240, 45, 46, 247, 111, 45, + 46, 247, 47, 45, 46, 247, 174, 45, 46, 246, 201, 45, 46, 247, 72, 45, 46, + 247, 8, 45, 46, 247, 135, 45, 46, 246, 232, 45, 46, 247, 103, 45, 46, + 247, 39, 45, 46, 247, 166, 45, 46, 246, 216, 45, 46, 247, 87, 45, 46, + 247, 23, 45, 46, 247, 150, 45, 46, 246, 247, 45, 46, 247, 118, 45, 46, + 247, 54, 45, 46, 247, 181, 45, 46, 246, 197, 45, 46, 247, 68, 45, 46, + 247, 4, 45, 46, 247, 131, 45, 46, 246, 228, 45, 46, 247, 99, 45, 46, 247, + 35, 45, 46, 247, 162, 45, 46, 246, 212, 45, 46, 247, 83, 45, 46, 247, 19, + 45, 46, 247, 146, 45, 46, 246, 243, 45, 46, 247, 114, 45, 46, 247, 50, + 45, 46, 247, 177, 45, 46, 246, 204, 45, 46, 247, 75, 45, 46, 247, 11, 45, + 46, 247, 138, 45, 46, 246, 235, 45, 46, 247, 106, 45, 46, 247, 42, 45, + 46, 247, 169, 45, 46, 246, 219, 45, 46, 247, 90, 45, 46, 247, 26, 45, 46, + 247, 153, 45, 46, 246, 250, 45, 46, 247, 121, 45, 46, 247, 57, 45, 46, + 247, 184, 45, 46, 246, 195, 45, 46, 247, 66, 45, 46, 247, 2, 45, 46, 247, + 129, 45, 46, 246, 226, 45, 46, 247, 97, 45, 46, 247, 33, 45, 46, 247, + 160, 45, 46, 246, 210, 45, 46, 247, 81, 45, 46, 247, 17, 45, 46, 247, + 144, 45, 46, 246, 241, 45, 46, 247, 112, 45, 46, 247, 48, 45, 46, 247, + 175, 45, 46, 246, 202, 45, 46, 247, 73, 45, 46, 247, 9, 45, 46, 247, 136, + 45, 46, 246, 233, 45, 46, 247, 104, 45, 46, 247, 40, 45, 46, 247, 167, + 45, 46, 246, 217, 45, 46, 247, 88, 45, 46, 247, 24, 45, 46, 247, 151, 45, + 46, 246, 248, 45, 46, 247, 119, 45, 46, 247, 55, 45, 46, 247, 182, 45, + 46, 246, 198, 45, 46, 247, 69, 45, 46, 247, 5, 45, 46, 247, 132, 45, 46, + 246, 229, 45, 46, 247, 100, 45, 46, 247, 36, 45, 46, 247, 163, 45, 46, + 246, 213, 45, 46, 247, 84, 45, 46, 247, 20, 45, 46, 247, 147, 45, 46, + 246, 244, 45, 46, 247, 115, 45, 46, 247, 51, 45, 46, 247, 178, 45, 46, + 246, 205, 45, 46, 247, 76, 45, 46, 247, 12, 45, 46, 247, 139, 45, 46, + 246, 236, 45, 46, 247, 107, 45, 46, 247, 43, 45, 46, 247, 170, 45, 46, + 246, 220, 45, 46, 247, 91, 45, 46, 247, 27, 45, 46, 247, 154, 45, 46, + 246, 251, 45, 46, 247, 122, 45, 46, 247, 58, 45, 46, 247, 185, 96, 216, + 31, 80, 2, 66, 91, 96, 216, 31, 80, 2, 52, 66, 91, 135, 52, 80, 2, 66, + 91, 96, 52, 80, 2, 66, 91, 43, 47, 52, 80, 2, 66, 91, 96, 216, 31, 80, + 244, 77, 134, 135, 52, 80, 244, 77, 134, 96, 52, 80, 244, 77, 134, 246, + 179, 80, 2, 201, 91, 215, 130, 80, 2, 201, 91, 215, 130, 216, 182, 71, + 246, 179, 216, 182, 71, 135, 52, 248, 224, 71, 96, 52, 248, 224, 71, 135, + 216, 182, 248, 224, 71, 96, 216, 182, 248, 224, 71, 96, 216, 31, 216, + 182, 248, 224, 71, 96, 80, 2, 246, 193, 219, 93, 215, 130, 80, 217, 10, + 134, 246, 179, 80, 217, 10, 134, 96, 80, 2, 218, 41, 2, 66, 91, 96, 80, + 2, 218, 41, 2, 52, 66, 91, 96, 216, 31, 80, 2, 218, 40, 96, 216, 31, 80, + 2, 218, 41, 2, 66, 91, 96, 216, 31, 80, 2, 218, 41, 2, 52, 66, 91, 135, + 254, 37, 96, 254, 37, 135, 52, 254, 37, 96, 52, 254, 37, 135, 80, 217, + 10, 85, 248, 65, 96, 80, 217, 10, 85, 248, 65, 135, 80, 244, 77, 252, + 187, 217, 10, 85, 248, 65, 96, 80, 244, 77, 252, 187, 217, 10, 85, 248, + 65, 228, 210, 213, 253, 22, 219, 234, 246, 41, 71, 228, 210, 246, 41, 22, + 219, 234, 213, 253, 71, 228, 210, 213, 253, 80, 2, 102, 228, 210, 246, + 41, 80, 2, 102, 219, 234, 246, 41, 80, 2, 102, 219, 234, 213, 253, 80, 2, + 102, 228, 210, 213, 253, 80, 22, 228, 210, 246, 41, 71, 228, 210, 246, + 41, 80, 22, 219, 234, 246, 41, 71, 219, 234, 246, 41, 80, 22, 219, 234, + 213, 253, 71, 219, 234, 213, 253, 80, 22, 228, 210, 213, 253, 71, 223, + 159, 248, 72, 249, 188, 245, 8, 248, 71, 245, 8, 248, 72, 249, 188, 223, + 159, 248, 71, 219, 234, 246, 41, 80, 249, 188, 228, 210, 246, 41, 71, + 228, 210, 246, 41, 80, 249, 188, 219, 234, 246, 41, 71, 245, 8, 248, 72, + 249, 188, 228, 210, 246, 41, 71, 223, 159, 248, 72, 249, 188, 219, 234, + 246, 41, 71, 228, 210, 246, 41, 80, 249, 188, 228, 210, 213, 253, 71, + 228, 210, 213, 253, 80, 249, 188, 228, 210, 246, 41, 71, 214, 23, 80, + 225, 177, 248, 12, 223, 182, 80, 225, 177, 96, 217, 154, 249, 155, 215, + 129, 80, 225, 177, 96, 217, 154, 249, 155, 246, 178, 80, 225, 177, 246, + 179, 217, 154, 249, 155, 233, 159, 80, 225, 177, 246, 179, 217, 154, 249, + 155, 223, 172, 223, 175, 254, 67, 250, 62, 71, 233, 162, 254, 67, 254, + 126, 71, 216, 240, 254, 67, 254, 126, 71, 251, 226, 254, 67, 254, 126, + 71, 216, 240, 254, 67, 250, 62, 80, 2, 231, 64, 216, 240, 254, 67, 254, + 126, 80, 2, 225, 192, 232, 237, 47, 221, 95, 250, 62, 71, 232, 237, 43, + 221, 95, 254, 126, 71, 254, 126, 250, 60, 250, 96, 71, 250, 62, 250, 60, + 250, 96, 71, 96, 80, 74, 220, 196, 135, 71, 135, 80, 74, 220, 196, 96, + 71, 220, 196, 96, 80, 74, 135, 71, 96, 80, 2, 95, 55, 135, 80, 2, 95, 55, + 96, 80, 217, 106, 213, 169, 43, 47, 80, 217, 106, 4, 250, 95, 215, 130, + 216, 31, 80, 244, 77, 4, 250, 95, 43, 252, 185, 116, 47, 252, 185, 121, + 242, 101, 43, 252, 185, 121, 47, 252, 185, 116, 242, 101, 116, 252, 185, + 47, 121, 252, 185, 43, 242, 101, 116, 252, 185, 43, 121, 252, 185, 47, + 242, 101, 43, 252, 185, 116, 47, 252, 185, 116, 242, 101, 116, 252, 185, + 47, 121, 252, 185, 47, 242, 101, 43, 252, 185, 121, 47, 252, 185, 121, + 242, 101, 116, 252, 185, 43, 121, 252, 185, 43, 242, 101, 135, 242, 102, + 2, 252, 185, 116, 217, 10, 134, 96, 242, 102, 2, 252, 185, 116, 217, 10, + 134, 215, 130, 242, 102, 2, 252, 185, 47, 217, 10, 134, 246, 179, 242, + 102, 2, 252, 185, 47, 217, 10, 134, 135, 242, 102, 2, 252, 185, 121, 217, + 10, 134, 96, 242, 102, 2, 252, 185, 121, 217, 10, 134, 215, 130, 242, + 102, 2, 252, 185, 43, 217, 10, 134, 246, 179, 242, 102, 2, 252, 185, 43, + 217, 10, 134, 135, 242, 102, 2, 252, 185, 116, 244, 77, 134, 96, 242, + 102, 2, 252, 185, 116, 244, 77, 134, 215, 130, 242, 102, 2, 252, 185, 47, + 244, 77, 134, 246, 179, 242, 102, 2, 252, 185, 47, 244, 77, 134, 135, + 242, 102, 2, 252, 185, 121, 244, 77, 134, 96, 242, 102, 2, 252, 185, 121, + 244, 77, 134, 215, 130, 242, 102, 2, 252, 185, 43, 244, 77, 134, 246, + 179, 242, 102, 2, 252, 185, 43, 244, 77, 134, 135, 242, 102, 2, 252, 185, + 116, 74, 135, 242, 102, 2, 252, 185, 246, 181, 215, 130, 242, 102, 2, + 252, 185, 43, 252, 77, 215, 130, 242, 102, 2, 252, 185, 223, 182, 96, + 242, 102, 2, 252, 185, 116, 74, 96, 242, 102, 2, 252, 185, 246, 181, 246, + 179, 242, 102, 2, 252, 185, 43, 252, 77, 246, 179, 242, 102, 2, 252, 185, + 223, 182, 135, 242, 102, 2, 252, 185, 116, 74, 96, 242, 102, 2, 252, 185, + 215, 140, 135, 242, 102, 2, 252, 185, 121, 74, 96, 242, 102, 2, 252, 185, + 246, 181, 96, 242, 102, 2, 252, 185, 116, 74, 135, 242, 102, 2, 252, 185, + 215, 140, 96, 242, 102, 2, 252, 185, 121, 74, 135, 242, 102, 2, 252, 185, + 246, 181, 135, 242, 102, 2, 252, 185, 116, 74, 187, 248, 223, 135, 242, + 102, 2, 252, 185, 121, 252, 90, 187, 248, 223, 96, 242, 102, 2, 252, 185, + 116, 74, 187, 248, 223, 96, 242, 102, 2, 252, 185, 121, 252, 90, 187, + 248, 223, 215, 130, 242, 102, 2, 252, 185, 43, 252, 77, 246, 179, 242, + 102, 2, 252, 185, 223, 182, 246, 179, 242, 102, 2, 252, 185, 43, 252, 77, + 215, 130, 242, 102, 2, 252, 185, 223, 182, 47, 52, 80, 2, 223, 119, 242, + 82, 245, 182, 5, 74, 96, 71, 217, 56, 227, 72, 74, 96, 71, 135, 80, 74, + 217, 56, 227, 71, 96, 80, 74, 217, 56, 227, 71, 96, 80, 74, 254, 184, + 126, 109, 233, 137, 74, 135, 71, 135, 80, 217, 106, 233, 136, 242, 228, + 74, 96, 71, 219, 23, 74, 96, 71, 135, 80, 217, 106, 219, 22, 218, 236, + 74, 135, 71, 43, 244, 180, 218, 40, 47, 244, 180, 218, 40, 116, 244, 180, + 218, 40, 121, 244, 180, 218, 40, 216, 182, 66, 252, 187, 248, 132, 212, + 153, 179, 219, 193, 212, 153, 179, 216, 22, 250, 30, 43, 69, 249, 163, + 125, 47, 69, 249, 163, 125, 43, 69, 226, 168, 47, 69, 226, 168, 212, 153, + 179, 43, 236, 127, 125, 212, 153, 179, 47, 236, 127, 125, 212, 153, 179, + 43, 252, 34, 125, 212, 153, 179, 47, 252, 34, 125, 43, 42, 251, 210, 2, + 215, 159, 47, 42, 251, 210, 2, 215, 159, 43, 42, 251, 210, 2, 217, 82, + 236, 113, 216, 240, 249, 222, 47, 42, 251, 210, 2, 217, 82, 236, 113, + 251, 226, 249, 222, 43, 42, 251, 210, 2, 217, 82, 236, 113, 251, 226, + 249, 222, 47, 42, 251, 210, 2, 217, 82, 236, 113, 216, 240, 249, 222, 43, + 254, 146, 251, 210, 2, 247, 195, 47, 254, 146, 251, 210, 2, 247, 195, 43, + 254, 67, 233, 137, 125, 47, 254, 67, 242, 228, 125, 52, 43, 254, 67, 242, + 228, 125, 52, 47, 254, 67, 233, 137, 125, 43, 85, 216, 232, 220, 254, + 125, 47, 85, 216, 232, 220, 254, 125, 246, 193, 244, 224, 66, 212, 28, + 233, 83, 231, 223, 254, 146, 227, 73, 233, 168, 47, 254, 146, 214, 250, + 2, 219, 185, 231, 223, 47, 254, 146, 2, 247, 195, 254, 146, 2, 223, 29, + 236, 73, 255, 36, 254, 145, 219, 206, 254, 146, 227, 73, 233, 168, 219, + 206, 254, 146, 227, 73, 215, 140, 216, 66, 254, 145, 223, 236, 254, 145, + 254, 146, 2, 215, 159, 223, 236, 254, 146, 2, 215, 159, 227, 149, 254, + 146, 227, 73, 215, 140, 227, 149, 254, 146, 227, 73, 246, 181, 231, 223, + 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 116, 22, + 223, 182, 231, 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, + 225, 177, 116, 22, 233, 168, 231, 223, 254, 146, 2, 210, 254, 47, 245, + 219, 236, 113, 80, 225, 177, 121, 22, 223, 182, 231, 223, 254, 146, 2, + 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 121, 22, 233, 168, 231, + 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 47, 22, + 215, 140, 231, 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, + 225, 177, 43, 22, 215, 140, 231, 223, 254, 146, 2, 210, 254, 47, 245, + 219, 236, 113, 80, 225, 177, 47, 22, 246, 181, 231, 223, 254, 146, 2, + 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 43, 22, 246, 181, 223, + 236, 245, 231, 221, 71, 245, 231, 221, 72, 2, 227, 29, 245, 231, 221, 72, + 2, 4, 250, 96, 50, 245, 231, 221, 72, 2, 47, 80, 50, 245, 231, 221, 72, + 2, 43, 80, 50, 250, 96, 2, 201, 134, 37, 66, 134, 37, 226, 172, 37, 223, + 237, 219, 250, 37, 226, 83, 250, 96, 247, 246, 251, 132, 201, 252, 187, + 22, 216, 240, 157, 247, 246, 251, 132, 66, 134, 250, 96, 2, 218, 238, + 213, 169, 37, 254, 125, 247, 242, 53, 116, 80, 217, 106, 250, 95, 37, 69, + 251, 167, 37, 251, 167, 37, 233, 136, 37, 242, 227, 250, 96, 2, 4, 250, + 96, 217, 10, 217, 162, 223, 182, 250, 96, 2, 119, 201, 219, 47, 217, 10, + 217, 162, 223, 182, 92, 223, 159, 248, 72, 220, 42, 92, 245, 8, 248, 72, + 220, 42, 92, 254, 3, 92, 4, 250, 95, 92, 219, 185, 119, 235, 182, 219, + 183, 216, 197, 2, 62, 50, 216, 197, 2, 215, 159, 223, 29, 236, 113, 216, + 196, 216, 197, 2, 221, 78, 253, 250, 251, 225, 47, 216, 197, 74, 43, 216, + 196, 43, 216, 197, 252, 77, 66, 134, 66, 252, 187, 252, 77, 47, 216, 196, + 251, 216, 2, 43, 157, 252, 13, 251, 216, 2, 47, 157, 252, 13, 85, 251, + 215, 29, 2, 43, 157, 252, 13, 29, 2, 47, 157, 252, 13, 69, 241, 85, 85, + 241, 85, 43, 213, 232, 244, 224, 47, 213, 232, 244, 224, 43, 52, 213, + 232, 244, 224, 47, 52, 213, 232, 244, 224, 236, 105, 236, 92, 217, 79, + 113, 236, 92, 236, 93, 229, 250, 2, 66, 134, 246, 187, 230, 227, 42, 2, + 249, 243, 227, 33, 236, 103, 254, 23, 220, 164, 225, 99, 245, 182, 5, 22, + 220, 44, 226, 172, 245, 182, 5, 22, 220, 44, 226, 173, 2, 217, 56, 50, + 240, 214, 217, 10, 22, 220, 44, 226, 172, 243, 23, 219, 108, 217, 151, + 246, 180, 216, 197, 2, 43, 157, 252, 13, 246, 180, 216, 197, 2, 47, 157, + 252, 13, 85, 248, 66, 2, 121, 71, 85, 232, 233, 69, 250, 96, 2, 121, 71, + 85, 250, 96, 2, 121, 71, 245, 169, 69, 219, 185, 245, 169, 85, 219, 185, + 245, 169, 69, 248, 65, 245, 169, 85, 248, 65, 245, 169, 69, 250, 95, 245, + 169, 85, 250, 95, 223, 69, 223, 237, 219, 251, 227, 71, 219, 251, 2, 227, + 29, 223, 237, 219, 251, 2, 201, 91, 252, 41, 219, 250, 252, 41, 223, 237, + 219, 250, 52, 225, 192, 216, 182, 225, 192, 233, 164, 249, 156, 254, 146, + 125, 223, 178, 249, 156, 254, 146, 125, 217, 45, 231, 62, 230, 166, 37, + 62, 227, 71, 230, 166, 37, 95, 227, 71, 230, 166, 37, 29, 227, 71, 230, + 166, 215, 153, 227, 72, 2, 247, 195, 230, 166, 215, 153, 227, 72, 2, 225, + 192, 230, 166, 42, 236, 57, 227, 71, 230, 166, 42, 215, 153, 227, 71, + 119, 233, 17, 22, 227, 71, 119, 233, 17, 171, 227, 71, 230, 166, 29, 227, + 71, 231, 38, 119, 219, 2, 219, 0, 2, 236, 69, 224, 204, 236, 70, 227, 71, + 244, 188, 226, 164, 236, 69, 236, 70, 2, 52, 91, 236, 70, 253, 216, 2, + 220, 42, 250, 92, 244, 61, 254, 126, 236, 67, 233, 84, 236, 68, 2, 224, + 42, 226, 147, 254, 44, 225, 171, 233, 84, 236, 68, 2, 221, 95, 226, 147, + 254, 44, 225, 171, 233, 84, 236, 68, 228, 206, 236, 107, 217, 162, 225, + 171, 236, 70, 254, 44, 111, 225, 181, 227, 71, 224, 198, 236, 70, 227, + 71, 236, 70, 2, 135, 80, 2, 102, 236, 70, 2, 29, 53, 236, 70, 2, 236, 56, + 236, 70, 2, 215, 152, 236, 70, 2, 227, 29, 236, 70, 2, 215, 159, 235, + 183, 233, 207, 43, 216, 197, 227, 71, 212, 153, 179, 222, 142, 250, 14, + 212, 153, 179, 222, 142, 225, 224, 212, 153, 179, 222, 142, 225, 96, 95, + 5, 2, 4, 250, 96, 50, 95, 5, 2, 250, 91, 255, 47, 50, 95, 5, 2, 217, 56, + 50, 95, 5, 2, 62, 55, 95, 5, 2, 217, 56, 55, 95, 5, 2, 219, 24, 112, 95, + 5, 2, 85, 216, 196, 231, 65, 5, 2, 250, 24, 50, 231, 65, 5, 2, 62, 55, + 231, 65, 5, 2, 245, 8, 247, 193, 231, 65, 5, 2, 223, 159, 247, 193, 95, + 5, 236, 113, 43, 157, 250, 95, 95, 5, 236, 113, 47, 157, 250, 95, 214, + 236, 171, 249, 194, 225, 99, 230, 224, 5, 2, 62, 50, 230, 224, 5, 2, 215, + 159, 221, 92, 225, 100, 2, 251, 226, 250, 59, 220, 24, 225, 99, 230, 224, + 5, 236, 113, 43, 157, 250, 95, 230, 224, 5, 236, 113, 47, 157, 250, 95, + 37, 230, 224, 5, 2, 250, 91, 255, 46, 230, 224, 5, 236, 113, 52, 250, 95, + 37, 247, 242, 53, 95, 5, 236, 113, 216, 196, 231, 65, 5, 236, 113, 216, + 196, 230, 224, 5, 236, 113, 216, 196, 236, 64, 225, 99, 223, 173, 236, + 64, 225, 99, 212, 153, 179, 224, 18, 250, 14, 254, 170, 171, 249, 227, + 236, 57, 2, 247, 195, 215, 153, 2, 231, 65, 53, 215, 153, 2, 227, 29, + 236, 57, 2, 227, 29, 236, 57, 2, 233, 17, 254, 154, 215, 153, 2, 233, 17, + 227, 62, 215, 153, 74, 236, 56, 236, 57, 74, 215, 152, 215, 153, 74, 252, + 187, 74, 236, 56, 236, 57, 74, 252, 187, 74, 215, 152, 215, 153, 252, 77, + 22, 235, 182, 2, 215, 152, 236, 57, 252, 77, 22, 235, 182, 2, 236, 56, + 250, 60, 215, 153, 2, 221, 77, 250, 60, 236, 57, 2, 221, 77, 52, 42, 236, + 56, 52, 42, 215, 152, 250, 60, 215, 153, 2, 221, 78, 22, 220, 24, 225, + 99, 233, 17, 22, 2, 62, 50, 233, 17, 171, 2, 62, 50, 52, 233, 17, 254, + 154, 52, 233, 17, 227, 62, 119, 236, 58, 233, 17, 254, 154, 119, 236, 58, + 233, 17, 227, 62, 220, 32, 233, 207, 227, 62, 220, 32, 233, 207, 254, + 154, 233, 17, 171, 227, 27, 233, 17, 254, 154, 233, 17, 22, 2, 231, 107, + 219, 93, 233, 17, 171, 2, 231, 107, 219, 93, 233, 17, 22, 2, 201, 248, + 223, 233, 17, 171, 2, 201, 248, 223, 233, 17, 22, 2, 52, 227, 29, 233, + 17, 22, 2, 215, 159, 233, 17, 22, 2, 52, 215, 159, 4, 214, 233, 2, 215, + 159, 233, 17, 171, 2, 52, 227, 29, 233, 17, 171, 2, 52, 215, 159, 212, + 153, 179, 247, 204, 254, 117, 212, 153, 179, 224, 75, 254, 117, 245, 182, + 5, 2, 62, 55, 240, 214, 2, 62, 50, 216, 182, 201, 252, 187, 2, 52, 66, + 91, 216, 182, 201, 252, 187, 2, 216, 182, 66, 91, 217, 56, 227, 72, 2, + 62, 50, 217, 56, 227, 72, 2, 223, 159, 247, 193, 220, 107, 231, 65, 220, + 106, 250, 5, 2, 62, 50, 245, 182, 2, 254, 3, 254, 184, 126, 217, 10, 2, + 250, 91, 255, 46, 254, 89, 126, 171, 126, 109, 245, 182, 5, 74, 95, 53, + 95, 5, 74, 245, 182, 53, 245, 182, 5, 74, 217, 56, 227, 71, 52, 250, 31, + 245, 183, 119, 250, 0, 245, 182, 220, 121, 137, 250, 0, 245, 182, 220, + 121, 245, 182, 5, 2, 119, 181, 74, 22, 119, 181, 55, 245, 178, 2, 244, + 101, 181, 50, 233, 137, 2, 250, 96, 236, 73, 242, 228, 2, 250, 96, 236, + 73, 233, 137, 2, 224, 193, 156, 50, 242, 228, 2, 224, 193, 156, 50, 233, + 137, 171, 220, 44, 126, 109, 242, 228, 171, 220, 44, 126, 109, 233, 137, + 171, 220, 44, 126, 217, 10, 2, 62, 236, 73, 242, 228, 171, 220, 44, 126, + 217, 10, 2, 62, 236, 73, 233, 137, 171, 220, 44, 126, 217, 10, 2, 62, 50, + 242, 228, 171, 220, 44, 126, 217, 10, 2, 62, 50, 233, 137, 171, 220, 44, + 126, 217, 10, 2, 62, 74, 223, 182, 242, 228, 171, 220, 44, 126, 217, 10, + 2, 62, 74, 233, 168, 233, 137, 171, 254, 90, 242, 228, 171, 254, 90, 233, + 137, 22, 220, 98, 228, 206, 126, 109, 242, 228, 22, 220, 98, 228, 206, + 126, 109, 233, 137, 22, 228, 206, 254, 90, 242, 228, 22, 228, 206, 254, + 90, 233, 137, 74, 246, 186, 126, 74, 242, 227, 242, 228, 74, 246, 186, + 126, 74, 233, 136, 233, 137, 74, 220, 107, 171, 245, 183, 242, 228, 74, + 220, 107, 171, 245, 183, 233, 137, 74, 220, 107, 74, 242, 227, 242, 228, + 74, 220, 107, 74, 233, 136, 233, 137, 74, 242, 228, 74, 246, 186, 245, + 183, 242, 228, 74, 233, 137, 74, 246, 186, 245, 183, 233, 137, 74, 220, + 44, 126, 74, 242, 228, 74, 220, 44, 245, 183, 242, 228, 74, 220, 44, 126, + 74, 233, 137, 74, 220, 44, 245, 183, 220, 44, 126, 217, 10, 171, 233, + 136, 220, 44, 126, 217, 10, 171, 242, 227, 220, 44, 126, 217, 10, 171, + 233, 137, 2, 62, 236, 73, 220, 44, 126, 217, 10, 171, 242, 228, 2, 62, + 236, 73, 246, 186, 126, 217, 10, 171, 233, 136, 246, 186, 126, 217, 10, + 171, 242, 227, 246, 186, 220, 44, 126, 217, 10, 171, 233, 136, 246, 186, + 220, 44, 126, 217, 10, 171, 242, 227, 220, 107, 171, 233, 136, 220, 107, + 171, 242, 227, 220, 107, 74, 233, 137, 74, 245, 182, 53, 220, 107, 74, + 242, 228, 74, 245, 182, 53, 52, 229, 240, 233, 136, 52, 229, 240, 242, + 227, 52, 229, 240, 233, 137, 2, 215, 159, 242, 228, 227, 27, 233, 136, + 242, 228, 252, 77, 233, 136, 233, 137, 250, 60, 251, 132, 249, 157, 242, + 228, 250, 60, 251, 132, 249, 157, 233, 137, 250, 60, 251, 132, 249, 158, + 74, 220, 44, 245, 183, 242, 228, 250, 60, 251, 132, 249, 158, 74, 220, + 44, 245, 183, 220, 25, 217, 166, 233, 205, 217, 166, 220, 25, 217, 167, + 171, 126, 109, 233, 205, 217, 167, 171, 126, 109, 245, 182, 5, 2, 251, + 162, 50, 225, 119, 74, 220, 98, 245, 182, 53, 219, 15, 74, 220, 98, 245, + 182, 53, 225, 119, 74, 220, 98, 228, 206, 126, 109, 219, 15, 74, 220, 98, + 228, 206, 126, 109, 225, 119, 74, 245, 182, 53, 219, 15, 74, 245, 182, + 53, 225, 119, 74, 228, 206, 126, 109, 219, 15, 74, 228, 206, 126, 109, + 225, 119, 74, 254, 184, 126, 109, 219, 15, 74, 254, 184, 126, 109, 225, + 119, 74, 228, 206, 254, 184, 126, 109, 219, 15, 74, 228, 206, 254, 184, + 126, 109, 52, 225, 118, 52, 219, 14, 219, 23, 2, 247, 195, 218, 236, 2, + 247, 195, 219, 23, 2, 95, 5, 55, 218, 236, 2, 95, 5, 55, 219, 23, 2, 230, + 224, 5, 55, 218, 236, 2, 230, 224, 5, 55, 219, 23, 68, 171, 126, 217, 10, + 2, 62, 50, 218, 236, 68, 171, 126, 217, 10, 2, 62, 50, 219, 23, 68, 74, + 245, 182, 53, 218, 236, 68, 74, 245, 182, 53, 219, 23, 68, 74, 217, 56, + 227, 71, 218, 236, 68, 74, 217, 56, 227, 71, 219, 23, 68, 74, 254, 184, + 126, 109, 218, 236, 68, 74, 254, 184, 126, 109, 219, 23, 68, 74, 228, + 206, 126, 109, 218, 236, 68, 74, 228, 206, 126, 109, 42, 43, 210, 93, + 227, 71, 42, 47, 210, 93, 227, 71, 250, 60, 219, 22, 250, 60, 218, 235, + 250, 60, 219, 23, 171, 126, 109, 250, 60, 218, 236, 171, 126, 109, 219, + 23, 74, 218, 235, 218, 236, 74, 219, 22, 219, 23, 74, 219, 22, 218, 236, + 74, 218, 235, 218, 236, 252, 77, 219, 22, 218, 236, 252, 77, 22, 235, + 182, 251, 132, 248, 224, 2, 219, 22, 245, 248, 68, 227, 73, 246, 178, + 225, 216, 2, 217, 233, 216, 239, 216, 211, 236, 56, 244, 110, 228, 219, + 220, 196, 43, 218, 50, 220, 196, 121, 218, 50, 220, 196, 116, 218, 50, + 226, 84, 2, 196, 66, 252, 187, 216, 182, 47, 216, 65, 52, 66, 252, 187, + 43, 216, 65, 66, 252, 187, 52, 43, 216, 65, 52, 66, 252, 187, 52, 43, + 216, 65, 187, 248, 224, 244, 77, 43, 231, 197, 68, 52, 214, 221, 220, + 196, 121, 218, 51, 2, 227, 29, 220, 196, 116, 218, 51, 2, 215, 159, 220, + 196, 116, 218, 51, 74, 220, 196, 121, 218, 50, 52, 121, 218, 50, 52, 116, + 218, 50, 52, 219, 59, 228, 206, 53, 223, 236, 52, 219, 59, 228, 206, 53, + 247, 213, 228, 206, 247, 248, 2, 223, 236, 229, 249, 220, 42, 66, 233, + 84, 2, 250, 96, 50, 66, 233, 84, 2, 250, 96, 55, 121, 218, 51, 2, 250, + 96, 55, 226, 173, 2, 201, 91, 226, 173, 2, 217, 56, 227, 71, 216, 182, + 66, 252, 187, 252, 36, 224, 19, 216, 182, 66, 252, 187, 2, 201, 91, 216, + 182, 250, 31, 227, 71, 216, 182, 229, 240, 233, 136, 216, 182, 229, 240, + 242, 227, 246, 186, 220, 44, 233, 137, 171, 126, 109, 246, 186, 220, 44, + 242, 228, 171, 126, 109, 216, 182, 219, 251, 252, 36, 224, 19, 233, 207, + 216, 182, 66, 252, 187, 227, 71, 52, 219, 251, 227, 71, 69, 66, 134, 230, + 166, 69, 66, 134, 228, 210, 246, 41, 69, 71, 228, 210, 213, 253, 69, 71, + 219, 234, 246, 41, 69, 71, 219, 234, 213, 253, 69, 71, 43, 47, 69, 71, + 135, 85, 71, 215, 130, 85, 71, 246, 179, 85, 71, 228, 210, 246, 41, 85, + 71, 228, 210, 213, 253, 85, 71, 219, 234, 246, 41, 85, 71, 219, 234, 213, + 253, 85, 71, 43, 47, 85, 71, 116, 121, 85, 71, 96, 80, 2, 217, 44, 246, + 178, 96, 80, 2, 217, 44, 215, 129, 135, 80, 2, 217, 44, 246, 178, 135, + 80, 2, 217, 44, 215, 129, 42, 2, 216, 240, 157, 252, 13, 42, 2, 251, 226, + 157, 252, 13, 42, 2, 215, 137, 47, 248, 72, 157, 252, 13, 42, 2, 232, + 237, 43, 248, 72, 157, 252, 13, 248, 66, 2, 43, 157, 252, 13, 248, 66, 2, + 47, 157, 252, 13, 248, 66, 2, 216, 240, 157, 252, 13, 248, 66, 2, 251, + 226, 157, 252, 13, 246, 193, 219, 185, 85, 233, 207, 219, 185, 69, 233, + 207, 219, 185, 85, 214, 169, 4, 219, 185, 69, 214, 169, 4, 219, 185, 85, + 226, 101, 69, 226, 101, 69, 242, 41, 85, 242, 41, 201, 85, 242, 41, 85, + 233, 207, 250, 95, 85, 231, 217, 248, 65, 69, 231, 217, 248, 65, 85, 231, + 217, 232, 233, 69, 231, 217, 232, 233, 85, 4, 248, 65, 85, 4, 232, 233, + 69, 4, 232, 233, 85, 201, 245, 242, 69, 201, 245, 242, 85, 66, 245, 242, + 69, 66, 245, 242, 43, 80, 2, 4, 250, 95, 137, 135, 254, 33, 43, 80, 2, + 37, 225, 192, 187, 135, 219, 181, 71, 135, 216, 31, 80, 2, 66, 91, 135, + 216, 31, 80, 2, 52, 66, 91, 135, 216, 31, 80, 244, 77, 134, 135, 216, 31, + 216, 182, 248, 224, 71, 135, 80, 2, 246, 193, 219, 93, 135, 80, 2, 218, + 41, 2, 66, 91, 135, 80, 2, 218, 41, 2, 52, 66, 91, 135, 216, 31, 80, 2, + 218, 40, 135, 216, 31, 80, 2, 218, 41, 2, 66, 91, 135, 216, 31, 80, 2, + 218, 41, 2, 52, 66, 91, 135, 80, 217, 106, 213, 169, 214, 23, 80, 225, + 177, 248, 12, 233, 168, 245, 182, 5, 74, 135, 71, 223, 237, 217, 56, 227, + 72, 74, 135, 71, 135, 80, 74, 223, 237, 254, 184, 126, 109, 96, 80, 217, + 106, 242, 227, 96, 80, 217, 106, 218, 235, 135, 224, 204, 71, 96, 224, + 204, 71, 223, 237, 217, 56, 227, 72, 74, 96, 71, 96, 80, 74, 223, 237, + 254, 184, 126, 109, 217, 56, 227, 72, 74, 135, 71, 135, 80, 74, 254, 184, + 126, 109, 135, 80, 74, 223, 237, 217, 56, 227, 71, 96, 80, 74, 223, 237, + 217, 56, 227, 71, 69, 231, 217, 219, 109, 85, 4, 219, 109, 69, 4, 219, + 109, 85, 223, 178, 226, 101, 69, 223, 178, 226, 101, 110, 233, 207, 250, + 95, 110, 227, 30, 2, 227, 30, 236, 73, 110, 250, 96, 2, 250, 96, 236, 73, + 110, 250, 95, 110, 37, 222, 193, 140, 6, 1, 253, 202, 140, 6, 1, 251, + 171, 140, 6, 1, 214, 235, 140, 6, 1, 243, 25, 140, 6, 1, 247, 215, 140, + 6, 1, 213, 13, 140, 6, 1, 212, 61, 140, 6, 1, 246, 110, 140, 6, 1, 212, + 84, 140, 6, 1, 236, 7, 140, 6, 1, 73, 236, 7, 140, 6, 1, 75, 140, 6, 1, + 247, 233, 140, 6, 1, 235, 102, 140, 6, 1, 233, 56, 140, 6, 1, 230, 170, + 140, 6, 1, 230, 80, 140, 6, 1, 227, 88, 140, 6, 1, 225, 174, 140, 6, 1, + 223, 158, 140, 6, 1, 220, 30, 140, 6, 1, 216, 53, 140, 6, 1, 215, 177, + 140, 6, 1, 244, 80, 140, 6, 1, 242, 47, 140, 6, 1, 227, 41, 140, 6, 1, + 226, 132, 140, 6, 1, 220, 173, 140, 6, 1, 216, 138, 140, 6, 1, 250, 135, + 140, 6, 1, 221, 47, 140, 6, 1, 213, 19, 140, 6, 1, 213, 21, 140, 6, 1, + 213, 49, 140, 6, 1, 219, 204, 162, 140, 6, 1, 212, 204, 140, 6, 1, 4, + 212, 175, 140, 6, 1, 4, 212, 176, 2, 218, 40, 140, 6, 1, 212, 236, 140, + 6, 1, 236, 43, 4, 212, 175, 140, 6, 1, 252, 41, 212, 175, 140, 6, 1, 236, + 43, 252, 41, 212, 175, 140, 6, 1, 244, 171, 140, 6, 1, 236, 5, 140, 6, 1, + 220, 172, 140, 6, 1, 216, 173, 63, 140, 6, 1, 233, 197, 230, 170, 140, 4, + 1, 253, 202, 140, 4, 1, 251, 171, 140, 4, 1, 214, 235, 140, 4, 1, 243, + 25, 140, 4, 1, 247, 215, 140, 4, 1, 213, 13, 140, 4, 1, 212, 61, 140, 4, + 1, 246, 110, 140, 4, 1, 212, 84, 140, 4, 1, 236, 7, 140, 4, 1, 73, 236, + 7, 140, 4, 1, 75, 140, 4, 1, 247, 233, 140, 4, 1, 235, 102, 140, 4, 1, + 233, 56, 140, 4, 1, 230, 170, 140, 4, 1, 230, 80, 140, 4, 1, 227, 88, + 140, 4, 1, 225, 174, 140, 4, 1, 223, 158, 140, 4, 1, 220, 30, 140, 4, 1, + 216, 53, 140, 4, 1, 215, 177, 140, 4, 1, 244, 80, 140, 4, 1, 242, 47, + 140, 4, 1, 227, 41, 140, 4, 1, 226, 132, 140, 4, 1, 220, 173, 140, 4, 1, + 216, 138, 140, 4, 1, 250, 135, 140, 4, 1, 221, 47, 140, 4, 1, 213, 19, + 140, 4, 1, 213, 21, 140, 4, 1, 213, 49, 140, 4, 1, 219, 204, 162, 140, 4, + 1, 212, 204, 140, 4, 1, 4, 212, 175, 140, 4, 1, 4, 212, 176, 2, 218, 40, + 140, 4, 1, 212, 236, 140, 4, 1, 236, 43, 4, 212, 175, 140, 4, 1, 252, 41, + 212, 175, 140, 4, 1, 236, 43, 252, 41, 212, 175, 140, 4, 1, 244, 171, + 140, 4, 1, 236, 5, 140, 4, 1, 220, 172, 140, 4, 1, 216, 173, 63, 140, 4, + 1, 233, 197, 230, 170, 7, 6, 1, 234, 13, 2, 52, 134, 7, 4, 1, 234, 13, 2, + 52, 134, 7, 6, 1, 234, 13, 2, 231, 107, 177, 7, 6, 1, 227, 12, 2, 91, 7, + 6, 1, 224, 148, 2, 218, 40, 7, 4, 1, 111, 2, 91, 7, 4, 1, 218, 114, 2, + 248, 72, 91, 7, 6, 1, 242, 163, 2, 248, 111, 7, 4, 1, 242, 163, 2, 248, + 111, 7, 6, 1, 235, 142, 2, 248, 111, 7, 4, 1, 235, 142, 2, 248, 111, 7, + 6, 1, 212, 153, 2, 248, 111, 7, 4, 1, 212, 153, 2, 248, 111, 7, 6, 1, + 254, 179, 7, 6, 1, 232, 183, 2, 102, 7, 6, 1, 216, 66, 63, 7, 6, 1, 216, + 66, 254, 179, 7, 4, 1, 215, 86, 2, 47, 102, 7, 6, 1, 214, 86, 2, 102, 7, + 4, 1, 214, 86, 2, 102, 7, 4, 1, 215, 86, 2, 249, 164, 7, 6, 1, 157, 242, + 162, 7, 4, 1, 157, 242, 162, 7, 4, 1, 218, 38, 226, 45, 7, 4, 1, 154, 2, + 228, 204, 7, 4, 1, 216, 66, 224, 148, 2, 218, 40, 7, 4, 1, 141, 2, 117, + 223, 165, 236, 73, 7, 1, 4, 6, 216, 66, 77, 7, 219, 24, 4, 1, 236, 3, 59, + 1, 6, 211, 211, 7, 6, 1, 223, 29, 2, 218, 209, 218, 40, 7, 6, 1, 212, + 153, 2, 218, 209, 218, 40, 81, 6, 1, 254, 200, 81, 4, 1, 254, 200, 81, 6, + 1, 214, 156, 81, 4, 1, 214, 156, 81, 6, 1, 243, 203, 81, 4, 1, 243, 203, + 81, 6, 1, 249, 2, 81, 4, 1, 249, 2, 81, 6, 1, 246, 16, 81, 4, 1, 246, 16, + 81, 6, 1, 219, 239, 81, 4, 1, 219, 239, 81, 6, 1, 212, 94, 81, 4, 1, 212, + 94, 81, 6, 1, 242, 95, 81, 4, 1, 242, 95, 81, 6, 1, 217, 143, 81, 4, 1, + 217, 143, 81, 6, 1, 240, 226, 81, 4, 1, 240, 226, 81, 6, 1, 235, 89, 81, + 4, 1, 235, 89, 81, 6, 1, 233, 194, 81, 4, 1, 233, 194, 81, 6, 1, 231, + 112, 81, 4, 1, 231, 112, 81, 6, 1, 229, 128, 81, 4, 1, 229, 128, 81, 6, + 1, 234, 97, 81, 4, 1, 234, 97, 81, 6, 1, 78, 81, 4, 1, 78, 81, 6, 1, 226, + 20, 81, 4, 1, 226, 20, 81, 6, 1, 223, 146, 81, 4, 1, 223, 146, 81, 6, 1, + 220, 110, 81, 4, 1, 220, 110, 81, 6, 1, 218, 5, 81, 4, 1, 218, 5, 81, 6, + 1, 215, 202, 81, 4, 1, 215, 202, 81, 6, 1, 244, 210, 81, 4, 1, 244, 210, + 81, 6, 1, 234, 230, 81, 4, 1, 234, 230, 81, 6, 1, 225, 82, 81, 4, 1, 225, + 82, 81, 6, 1, 227, 81, 81, 4, 1, 227, 81, 81, 6, 1, 248, 70, 254, 205, + 81, 4, 1, 248, 70, 254, 205, 81, 6, 1, 54, 81, 254, 231, 81, 4, 1, 54, + 81, 254, 231, 81, 6, 1, 249, 178, 246, 16, 81, 4, 1, 249, 178, 246, 16, + 81, 6, 1, 248, 70, 235, 89, 81, 4, 1, 248, 70, 235, 89, 81, 6, 1, 248, + 70, 229, 128, 81, 4, 1, 248, 70, 229, 128, 81, 6, 1, 249, 178, 229, 128, + 81, 4, 1, 249, 178, 229, 128, 81, 6, 1, 54, 81, 227, 81, 81, 4, 1, 54, + 81, 227, 81, 81, 6, 1, 222, 185, 81, 4, 1, 222, 185, 81, 6, 1, 249, 191, + 221, 0, 81, 4, 1, 249, 191, 221, 0, 81, 6, 1, 54, 81, 221, 0, 81, 4, 1, + 54, 81, 221, 0, 81, 6, 1, 54, 81, 245, 161, 81, 4, 1, 54, 81, 245, 161, + 81, 6, 1, 254, 217, 234, 235, 81, 4, 1, 254, 217, 234, 235, 81, 6, 1, + 248, 70, 241, 150, 81, 4, 1, 248, 70, 241, 150, 81, 6, 1, 54, 81, 241, + 150, 81, 4, 1, 54, 81, 241, 150, 81, 6, 1, 54, 81, 162, 81, 4, 1, 54, 81, + 162, 81, 6, 1, 234, 12, 162, 81, 4, 1, 234, 12, 162, 81, 6, 1, 54, 81, + 242, 64, 81, 4, 1, 54, 81, 242, 64, 81, 6, 1, 54, 81, 242, 98, 81, 4, 1, + 54, 81, 242, 98, 81, 6, 1, 54, 81, 243, 198, 81, 4, 1, 54, 81, 243, 198, + 81, 6, 1, 54, 81, 247, 236, 81, 4, 1, 54, 81, 247, 236, 81, 6, 1, 54, 81, + 220, 223, 81, 4, 1, 54, 81, 220, 223, 81, 6, 1, 54, 228, 106, 220, 223, + 81, 4, 1, 54, 228, 106, 220, 223, 81, 6, 1, 54, 228, 106, 229, 178, 81, + 4, 1, 54, 228, 106, 229, 178, 81, 6, 1, 54, 228, 106, 228, 49, 81, 4, 1, + 54, 228, 106, 228, 49, 81, 6, 1, 54, 228, 106, 214, 24, 81, 4, 1, 54, + 228, 106, 214, 24, 81, 16, 235, 108, 81, 16, 231, 113, 223, 146, 81, 16, + 226, 21, 223, 146, 81, 16, 219, 101, 81, 16, 218, 6, 223, 146, 81, 16, + 234, 231, 223, 146, 81, 16, 220, 224, 220, 110, 81, 6, 1, 249, 178, 221, + 0, 81, 4, 1, 249, 178, 221, 0, 81, 6, 1, 249, 178, 243, 198, 81, 4, 1, + 249, 178, 243, 198, 81, 38, 229, 129, 50, 81, 38, 219, 198, 254, 10, 81, + 38, 219, 198, 233, 143, 81, 54, 228, 106, 244, 64, 219, 83, 81, 54, 228, + 106, 248, 14, 224, 193, 79, 81, 54, 228, 106, 236, 95, 224, 193, 79, 81, + 54, 228, 106, 214, 223, 247, 245, 81, 244, 92, 124, 242, 129, 81, 244, + 64, 219, 83, 81, 231, 8, 247, 245, 99, 4, 1, 254, 159, 99, 4, 1, 252, + 198, 99, 4, 1, 243, 202, 99, 4, 1, 247, 203, 99, 4, 1, 245, 229, 99, 4, + 1, 214, 145, 99, 4, 1, 212, 82, 99, 4, 1, 218, 24, 99, 4, 1, 236, 112, + 99, 4, 1, 235, 96, 99, 4, 1, 233, 203, 99, 4, 1, 232, 63, 99, 4, 1, 230, + 83, 99, 4, 1, 227, 99, 99, 4, 1, 226, 182, 99, 4, 1, 212, 71, 99, 4, 1, + 224, 96, 99, 4, 1, 222, 183, 99, 4, 1, 218, 14, 99, 4, 1, 215, 166, 99, + 4, 1, 226, 52, 99, 4, 1, 234, 239, 99, 4, 1, 243, 81, 99, 4, 1, 224, 252, + 99, 4, 1, 220, 221, 99, 4, 1, 250, 157, 99, 4, 1, 251, 63, 99, 4, 1, 235, + 217, 99, 4, 1, 250, 100, 99, 4, 1, 250, 202, 99, 4, 1, 213, 154, 99, 4, + 1, 235, 228, 99, 4, 1, 242, 145, 99, 4, 1, 242, 85, 99, 4, 1, 242, 23, + 99, 4, 1, 214, 9, 99, 4, 1, 242, 107, 99, 4, 1, 241, 170, 217, 75, 1, + 189, 217, 75, 1, 213, 90, 217, 75, 1, 213, 89, 217, 75, 1, 213, 79, 217, + 75, 1, 213, 77, 217, 75, 1, 252, 79, 255, 48, 213, 72, 217, 75, 1, 213, + 72, 217, 75, 1, 213, 87, 217, 75, 1, 213, 84, 217, 75, 1, 213, 86, 217, + 75, 1, 213, 85, 217, 75, 1, 213, 4, 217, 75, 1, 213, 81, 217, 75, 1, 213, + 70, 217, 75, 1, 216, 87, 213, 70, 217, 75, 1, 213, 67, 217, 75, 1, 213, + 75, 217, 75, 1, 252, 79, 255, 48, 213, 75, 217, 75, 1, 216, 87, 213, 75, + 217, 75, 1, 213, 74, 217, 75, 1, 213, 94, 217, 75, 1, 213, 68, 217, 75, + 1, 216, 87, 213, 68, 217, 75, 1, 213, 58, 217, 75, 1, 216, 87, 213, 58, + 217, 75, 1, 213, 0, 217, 75, 1, 213, 41, 217, 75, 1, 254, 240, 213, 41, + 217, 75, 1, 216, 87, 213, 41, 217, 75, 1, 213, 66, 217, 75, 1, 213, 65, + 217, 75, 1, 213, 62, 217, 75, 1, 216, 87, 213, 76, 217, 75, 1, 216, 87, + 213, 60, 217, 75, 1, 213, 59, 217, 75, 1, 212, 204, 217, 75, 1, 213, 56, + 217, 75, 1, 213, 55, 217, 75, 1, 213, 78, 217, 75, 1, 216, 87, 213, 78, + 217, 75, 1, 253, 206, 213, 78, 217, 75, 1, 213, 54, 217, 75, 1, 213, 52, + 217, 75, 1, 213, 53, 217, 75, 1, 213, 51, 217, 75, 1, 213, 50, 217, 75, + 1, 213, 88, 217, 75, 1, 213, 48, 217, 75, 1, 213, 46, 217, 75, 1, 213, + 45, 217, 75, 1, 213, 44, 217, 75, 1, 213, 42, 217, 75, 1, 217, 254, 213, + 42, 217, 75, 1, 213, 40, 217, 75, 59, 1, 233, 247, 79, 217, 75, 221, 81, + 79, 217, 75, 120, 235, 180, 28, 3, 233, 25, 28, 3, 231, 44, 28, 3, 223, + 144, 28, 3, 220, 4, 28, 3, 220, 207, 28, 3, 251, 252, 28, 3, 217, 9, 28, + 3, 250, 41, 28, 3, 228, 226, 28, 3, 228, 34, 28, 3, 243, 20, 227, 157, + 28, 3, 212, 15, 28, 3, 247, 218, 28, 3, 248, 176, 28, 3, 235, 184, 28, 3, + 217, 121, 28, 3, 250, 145, 28, 3, 226, 32, 28, 3, 225, 185, 28, 3, 243, + 95, 28, 3, 243, 91, 28, 3, 243, 92, 28, 3, 243, 93, 28, 3, 219, 176, 28, + 3, 219, 132, 28, 3, 219, 145, 28, 3, 219, 175, 28, 3, 219, 149, 28, 3, + 219, 150, 28, 3, 219, 137, 28, 3, 251, 13, 28, 3, 250, 249, 28, 3, 250, + 251, 28, 3, 251, 12, 28, 3, 251, 10, 28, 3, 251, 11, 28, 3, 250, 250, 28, + 3, 211, 242, 28, 3, 211, 222, 28, 3, 211, 233, 28, 3, 211, 241, 28, 3, + 211, 236, 28, 3, 211, 237, 28, 3, 211, 225, 28, 3, 251, 9, 28, 3, 250, + 252, 28, 3, 250, 254, 28, 3, 251, 8, 28, 3, 251, 6, 28, 3, 251, 7, 28, 3, + 250, 253, 28, 3, 224, 160, 28, 3, 224, 150, 28, 3, 224, 156, 28, 3, 224, + 159, 28, 3, 224, 157, 28, 3, 224, 158, 28, 3, 224, 155, 28, 3, 234, 23, + 28, 3, 234, 15, 28, 3, 234, 18, 28, 3, 234, 22, 28, 3, 234, 19, 28, 3, + 234, 20, 28, 3, 234, 16, 28, 3, 213, 121, 28, 3, 213, 111, 28, 3, 213, + 117, 28, 3, 213, 120, 28, 3, 213, 118, 28, 3, 213, 119, 28, 3, 213, 116, + 28, 3, 242, 173, 28, 3, 242, 164, 28, 3, 242, 167, 28, 3, 242, 172, 28, + 3, 242, 169, 28, 3, 242, 170, 28, 3, 242, 166, 38, 33, 1, 252, 121, 38, + 33, 1, 214, 237, 38, 33, 1, 243, 76, 38, 33, 1, 248, 162, 38, 33, 1, 212, + 67, 38, 33, 1, 212, 87, 38, 33, 1, 183, 38, 33, 1, 245, 252, 38, 33, 1, + 245, 238, 38, 33, 1, 245, 229, 38, 33, 1, 78, 38, 33, 1, 226, 132, 38, + 33, 1, 245, 176, 38, 33, 1, 245, 166, 38, 33, 1, 217, 242, 38, 33, 1, + 162, 38, 33, 1, 216, 149, 38, 33, 1, 250, 190, 38, 33, 1, 221, 47, 38, + 33, 1, 221, 10, 38, 33, 1, 244, 171, 38, 33, 1, 245, 165, 38, 33, 1, 63, + 38, 33, 1, 236, 172, 38, 33, 1, 247, 234, 38, 33, 1, 231, 24, 215, 181, + 38, 33, 1, 213, 51, 38, 33, 1, 212, 204, 38, 33, 1, 236, 42, 63, 38, 33, + 1, 233, 62, 212, 175, 38, 33, 1, 252, 41, 212, 175, 38, 33, 1, 236, 42, + 252, 41, 212, 175, 47, 254, 146, 219, 19, 232, 32, 47, 254, 146, 246, + 193, 219, 19, 232, 32, 43, 219, 19, 125, 47, 219, 19, 125, 43, 246, 193, + 219, 19, 125, 47, 246, 193, 219, 19, 125, 224, 83, 236, 60, 232, 32, 224, + 83, 246, 193, 236, 60, 232, 32, 246, 193, 216, 212, 232, 32, 43, 216, + 212, 125, 47, 216, 212, 125, 224, 83, 219, 185, 43, 224, 83, 227, 101, + 125, 47, 224, 83, 227, 101, 125, 246, 31, 249, 220, 226, 178, 244, 111, + 226, 178, 223, 236, 244, 111, 226, 178, 241, 18, 246, 193, 227, 152, 246, + 179, 254, 155, 215, 130, 254, 155, 246, 193, 223, 178, 254, 145, 52, 227, + 149, 241, 21, 236, 52, 236, 59, 226, 223, 251, 206, 241, 22, 2, 248, 74, + 217, 56, 2, 223, 165, 50, 43, 117, 226, 170, 125, 47, 117, 226, 170, 125, + 217, 56, 2, 62, 50, 217, 56, 2, 62, 55, 43, 66, 252, 187, 2, 224, 187, + 47, 66, 252, 187, 2, 224, 187, 216, 240, 43, 157, 125, 216, 240, 47, 157, + 125, 251, 226, 43, 157, 125, 251, 226, 47, 157, 125, 43, 220, 132, 103, + 125, 47, 220, 132, 103, 125, 43, 52, 226, 168, 47, 52, 226, 168, 119, + 181, 113, 124, 62, 225, 62, 124, 62, 113, 119, 181, 225, 62, 92, 244, + 101, 62, 225, 62, 244, 170, 62, 79, 223, 236, 224, 193, 79, 66, 177, 223, + 165, 225, 180, 213, 199, 221, 81, 231, 107, 247, 195, 9, 34, 224, 5, 9, + 34, 250, 70, 9, 34, 222, 118, 118, 9, 34, 222, 118, 112, 9, 34, 222, 118, + 170, 9, 34, 226, 79, 9, 34, 251, 214, 9, 34, 218, 54, 9, 34, 234, 153, + 118, 9, 34, 234, 153, 112, 9, 34, 247, 243, 9, 34, 222, 121, 9, 34, 4, + 118, 9, 34, 4, 112, 9, 34, 233, 219, 118, 9, 34, 233, 219, 112, 9, 34, + 233, 219, 170, 9, 34, 233, 219, 167, 9, 34, 220, 15, 9, 34, 217, 111, 9, + 34, 220, 13, 118, 9, 34, 220, 13, 112, 9, 34, 242, 75, 118, 9, 34, 242, + 75, 112, 9, 34, 242, 118, 9, 34, 224, 74, 9, 34, 250, 142, 9, 34, 218, + 252, 9, 34, 231, 12, 9, 34, 248, 160, 9, 34, 231, 4, 9, 34, 250, 85, 9, + 34, 214, 28, 118, 9, 34, 214, 28, 112, 9, 34, 244, 185, 9, 34, 226, 142, + 118, 9, 34, 226, 142, 112, 9, 34, 220, 105, 157, 216, 207, 216, 159, 9, + 34, 249, 207, 9, 34, 247, 211, 9, 34, 235, 252, 9, 34, 251, 247, 68, 250, + 54, 9, 34, 245, 104, 9, 34, 219, 200, 118, 9, 34, 219, 200, 112, 9, 34, + 252, 200, 9, 34, 220, 112, 9, 34, 251, 118, 220, 112, 9, 34, 229, 239, + 118, 9, 34, 229, 239, 112, 9, 34, 229, 239, 170, 9, 34, 229, 239, 167, 9, + 34, 231, 181, 9, 34, 221, 2, 9, 34, 224, 80, 9, 34, 245, 125, 9, 34, 227, + 112, 9, 34, 251, 186, 118, 9, 34, 251, 186, 112, 9, 34, 231, 221, 9, 34, + 231, 7, 9, 34, 242, 237, 118, 9, 34, 242, 237, 112, 9, 34, 242, 237, 170, + 9, 34, 217, 73, 9, 34, 250, 53, 9, 34, 213, 253, 118, 9, 34, 213, 253, + 112, 9, 34, 251, 118, 222, 112, 9, 34, 220, 105, 241, 97, 9, 34, 241, 97, + 9, 34, 251, 118, 219, 209, 9, 34, 251, 118, 220, 253, 9, 34, 244, 121, 9, + 34, 251, 118, 251, 28, 9, 34, 220, 105, 214, 44, 9, 34, 214, 45, 118, 9, + 34, 214, 45, 112, 9, 34, 250, 87, 9, 34, 251, 118, 243, 6, 9, 34, 187, + 118, 9, 34, 187, 112, 9, 34, 251, 118, 233, 8, 9, 34, 251, 118, 243, 184, + 9, 34, 231, 3, 118, 9, 34, 231, 3, 112, 9, 34, 224, 85, 9, 34, 251, 255, + 9, 34, 251, 118, 218, 20, 233, 174, 9, 34, 251, 118, 233, 175, 9, 34, + 251, 118, 213, 227, 9, 34, 251, 118, 244, 135, 9, 34, 246, 39, 118, 9, + 34, 246, 39, 112, 9, 34, 246, 39, 170, 9, 34, 251, 118, 246, 38, 9, 34, + 242, 82, 9, 34, 251, 118, 241, 94, 9, 34, 251, 244, 9, 34, 243, 62, 9, + 34, 251, 118, 244, 179, 9, 34, 251, 118, 252, 29, 9, 34, 251, 118, 222, + 196, 9, 34, 220, 105, 213, 246, 9, 34, 220, 105, 213, 33, 9, 34, 251, + 118, 244, 78, 9, 34, 236, 2, 245, 129, 9, 34, 251, 118, 245, 129, 9, 34, + 236, 2, 216, 241, 9, 34, 251, 118, 216, 241, 9, 34, 236, 2, 246, 171, 9, + 34, 251, 118, 246, 171, 9, 34, 216, 63, 9, 34, 236, 2, 216, 63, 9, 34, + 251, 118, 216, 63, 58, 34, 118, 58, 34, 233, 83, 58, 34, 247, 195, 58, + 34, 220, 42, 58, 34, 222, 117, 58, 34, 102, 58, 34, 112, 58, 34, 233, + 107, 58, 34, 232, 63, 58, 34, 233, 155, 58, 34, 245, 209, 58, 34, 198, + 58, 34, 121, 251, 214, 58, 34, 249, 209, 58, 34, 240, 221, 58, 34, 218, + 54, 58, 34, 210, 251, 214, 58, 34, 234, 152, 58, 34, 225, 140, 58, 34, + 213, 193, 58, 34, 219, 194, 58, 34, 47, 210, 251, 214, 58, 34, 242, 24, + 245, 224, 58, 34, 217, 213, 58, 34, 247, 243, 58, 34, 222, 121, 58, 34, + 250, 70, 58, 34, 225, 101, 58, 34, 254, 248, 58, 34, 230, 250, 58, 34, + 245, 224, 58, 34, 246, 44, 58, 34, 222, 141, 58, 34, 243, 14, 58, 34, + 243, 15, 220, 28, 58, 34, 245, 128, 58, 34, 252, 40, 58, 34, 213, 211, + 58, 34, 250, 161, 58, 34, 223, 132, 58, 34, 236, 108, 58, 34, 220, 26, + 58, 34, 233, 218, 58, 34, 249, 218, 58, 34, 219, 188, 58, 34, 230, 255, + 58, 34, 223, 155, 58, 34, 213, 196, 58, 34, 227, 93, 58, 34, 216, 69, 58, + 34, 246, 156, 58, 34, 220, 196, 217, 111, 58, 34, 246, 193, 250, 70, 58, + 34, 187, 219, 62, 58, 34, 119, 242, 113, 58, 34, 220, 201, 58, 34, 251, + 220, 58, 34, 220, 12, 58, 34, 251, 190, 58, 34, 219, 92, 58, 34, 242, 74, + 58, 34, 242, 130, 58, 34, 247, 198, 58, 34, 242, 118, 58, 34, 251, 206, + 58, 34, 224, 74, 58, 34, 222, 129, 58, 34, 248, 16, 58, 34, 253, 211, 58, + 34, 219, 185, 58, 34, 228, 205, 58, 34, 218, 252, 58, 34, 222, 152, 58, + 34, 231, 12, 58, 34, 216, 206, 58, 34, 233, 243, 58, 34, 219, 83, 58, 34, + 248, 160, 58, 34, 214, 8, 58, 34, 247, 221, 228, 205, 58, 34, 250, 20, + 58, 34, 244, 58, 58, 34, 250, 81, 58, 34, 219, 96, 58, 34, 214, 27, 58, + 34, 244, 185, 58, 34, 250, 78, 58, 34, 244, 250, 58, 34, 52, 213, 169, + 58, 34, 157, 216, 207, 216, 159, 58, 34, 220, 36, 58, 34, 245, 4, 58, 34, + 249, 207, 58, 34, 247, 211, 58, 34, 225, 98, 58, 34, 235, 252, 58, 34, + 231, 201, 58, 34, 217, 55, 58, 34, 218, 204, 58, 34, 233, 101, 58, 34, + 215, 109, 58, 34, 244, 209, 58, 34, 251, 247, 68, 250, 54, 58, 34, 220, + 133, 58, 34, 246, 193, 217, 208, 58, 34, 213, 241, 58, 34, 220, 50, 58, + 34, 248, 4, 58, 34, 245, 104, 58, 34, 219, 212, 58, 34, 71, 58, 34, 219, + 85, 58, 34, 219, 199, 58, 34, 216, 225, 58, 34, 242, 243, 58, 34, 251, + 18, 58, 34, 219, 113, 58, 34, 252, 200, 58, 34, 223, 218, 58, 34, 220, + 112, 58, 34, 235, 246, 58, 34, 229, 238, 58, 34, 221, 2, 58, 34, 244, + 238, 58, 34, 227, 112, 58, 34, 254, 154, 58, 34, 225, 198, 58, 34, 246, + 48, 58, 34, 251, 185, 58, 34, 231, 221, 58, 34, 231, 66, 58, 34, 221, 99, + 58, 34, 254, 38, 58, 34, 231, 7, 58, 34, 216, 245, 58, 34, 227, 69, 58, + 34, 251, 249, 58, 34, 219, 81, 58, 34, 250, 29, 58, 34, 242, 236, 58, 34, + 217, 73, 58, 34, 236, 75, 58, 34, 252, 3, 58, 34, 214, 45, 245, 224, 58, + 34, 250, 53, 58, 34, 213, 252, 58, 34, 222, 112, 58, 34, 241, 97, 58, 34, + 219, 209, 58, 34, 215, 4, 58, 34, 252, 118, 58, 34, 225, 241, 58, 34, + 252, 219, 58, 34, 220, 253, 58, 34, 224, 37, 58, 34, 223, 63, 58, 34, + 244, 121, 58, 34, 251, 248, 58, 34, 251, 28, 58, 34, 252, 18, 58, 34, + 231, 9, 58, 34, 214, 44, 58, 34, 250, 87, 58, 34, 213, 224, 58, 34, 247, + 253, 58, 34, 214, 146, 58, 34, 243, 6, 58, 34, 233, 8, 58, 34, 243, 184, + 58, 34, 231, 2, 58, 34, 220, 41, 58, 34, 220, 196, 218, 39, 252, 29, 58, + 34, 224, 85, 58, 34, 251, 255, 58, 34, 213, 188, 58, 34, 245, 23, 58, 34, + 233, 174, 58, 34, 218, 20, 233, 174, 58, 34, 233, 170, 58, 34, 219, 236, + 58, 34, 233, 175, 58, 34, 213, 227, 58, 34, 244, 135, 58, 34, 246, 38, + 58, 34, 242, 82, 58, 34, 244, 90, 58, 34, 241, 94, 58, 34, 251, 244, 58, + 34, 218, 27, 58, 34, 242, 136, 58, 34, 244, 202, 58, 34, 222, 222, 213, + 224, 58, 34, 251, 20, 58, 34, 243, 62, 58, 34, 244, 179, 58, 34, 252, 29, + 58, 34, 222, 196, 58, 34, 248, 146, 58, 34, 213, 246, 58, 34, 242, 57, + 58, 34, 213, 33, 58, 34, 231, 75, 58, 34, 252, 13, 58, 34, 245, 234, 58, + 34, 244, 78, 58, 34, 216, 180, 58, 34, 246, 158, 58, 34, 224, 68, 58, 34, + 228, 207, 58, 34, 245, 129, 58, 34, 216, 241, 58, 34, 246, 171, 58, 34, + 216, 63, 58, 34, 244, 137, 107, 248, 109, 143, 43, 217, 10, 223, 182, + 107, 248, 109, 143, 74, 217, 10, 55, 107, 248, 109, 143, 43, 217, 10, + 231, 107, 22, 223, 182, 107, 248, 109, 143, 74, 217, 10, 231, 107, 22, + 55, 107, 248, 109, 143, 244, 64, 218, 224, 107, 248, 109, 143, 218, 225, + 244, 77, 50, 107, 248, 109, 143, 218, 225, 244, 77, 55, 107, 248, 109, + 143, 218, 225, 244, 77, 233, 168, 107, 248, 109, 143, 218, 225, 244, 77, + 215, 137, 233, 168, 107, 248, 109, 143, 218, 225, 244, 77, 215, 137, 223, + 182, 107, 248, 109, 143, 218, 225, 244, 77, 232, 237, 233, 168, 107, 248, + 109, 143, 227, 28, 107, 219, 225, 107, 250, 23, 107, 244, 64, 219, 83, + 247, 250, 79, 235, 247, 236, 94, 219, 112, 88, 107, 236, 17, 79, 107, + 250, 56, 79, 107, 51, 212, 79, 43, 254, 146, 125, 47, 254, 146, 125, 43, + 52, 254, 146, 125, 47, 52, 254, 146, 125, 43, 249, 223, 125, 47, 249, + 223, 125, 43, 69, 249, 223, 125, 47, 69, 249, 223, 125, 43, 85, 233, 142, + 125, 47, 85, 233, 142, 125, 225, 153, 79, 243, 128, 79, 43, 216, 232, + 220, 254, 125, 47, 216, 232, 220, 254, 125, 43, 69, 233, 142, 125, 47, + 69, 233, 142, 125, 43, 69, 216, 232, 220, 254, 125, 47, 69, 216, 232, + 220, 254, 125, 43, 69, 42, 125, 47, 69, 42, 125, 214, 23, 248, 223, 223, + 236, 52, 225, 108, 224, 178, 79, 52, 225, 108, 224, 178, 79, 117, 52, + 225, 108, 224, 178, 79, 225, 153, 156, 245, 23, 242, 111, 228, 97, 118, + 242, 111, 228, 97, 112, 242, 111, 228, 97, 170, 242, 111, 228, 97, 167, + 242, 111, 228, 97, 185, 242, 111, 228, 97, 192, 242, 111, 228, 97, 200, + 242, 111, 228, 97, 198, 242, 111, 228, 97, 203, 107, 233, 127, 161, 79, + 107, 223, 159, 161, 79, 107, 248, 116, 161, 79, 107, 245, 208, 161, 79, + 24, 220, 100, 62, 161, 79, 24, 52, 62, 161, 79, 214, 19, 248, 223, 66, + 235, 95, 224, 6, 79, 66, 235, 95, 224, 6, 2, 214, 120, 219, 237, 79, 66, + 235, 95, 224, 6, 156, 215, 137, 242, 129, 66, 235, 95, 224, 6, 2, 214, + 120, 219, 237, 156, 215, 137, 242, 129, 66, 235, 95, 224, 6, 156, 232, + 237, 242, 129, 37, 225, 153, 79, 107, 204, 233, 84, 244, 235, 221, 81, + 88, 242, 111, 228, 97, 217, 213, 242, 111, 228, 97, 216, 45, 242, 111, + 228, 97, 217, 128, 66, 107, 236, 17, 79, 232, 18, 79, 226, 164, 254, 176, + 79, 107, 44, 236, 96, 107, 157, 244, 195, 219, 225, 136, 1, 4, 63, 136, + 1, 63, 136, 1, 4, 75, 136, 1, 75, 136, 1, 4, 72, 136, 1, 72, 136, 1, 4, + 77, 136, 1, 77, 136, 1, 4, 78, 136, 1, 78, 136, 1, 183, 136, 1, 243, 230, + 136, 1, 234, 212, 136, 1, 243, 54, 136, 1, 234, 81, 136, 1, 242, 213, + 136, 1, 235, 44, 136, 1, 243, 158, 136, 1, 234, 148, 136, 1, 243, 14, + 136, 1, 222, 227, 136, 1, 212, 109, 136, 1, 220, 136, 136, 1, 212, 37, + 136, 1, 219, 41, 136, 1, 212, 8, 136, 1, 222, 123, 136, 1, 212, 87, 136, + 1, 220, 5, 136, 1, 212, 16, 136, 1, 218, 66, 136, 1, 249, 30, 136, 1, + 217, 84, 136, 1, 248, 76, 136, 1, 4, 216, 90, 136, 1, 216, 90, 136, 1, + 246, 154, 136, 1, 217, 242, 136, 1, 248, 162, 136, 1, 109, 136, 1, 247, + 220, 136, 1, 207, 136, 1, 229, 128, 136, 1, 228, 135, 136, 1, 229, 254, + 136, 1, 228, 228, 136, 1, 162, 136, 1, 252, 234, 136, 1, 195, 136, 1, + 242, 28, 136, 1, 252, 54, 136, 1, 226, 20, 136, 1, 241, 74, 136, 1, 251, + 179, 136, 1, 225, 71, 136, 1, 242, 85, 136, 1, 252, 121, 136, 1, 226, + 132, 136, 1, 241, 173, 136, 1, 251, 253, 136, 1, 225, 186, 136, 1, 191, + 136, 1, 231, 112, 136, 1, 230, 242, 136, 1, 231, 226, 136, 1, 231, 45, + 136, 1, 4, 189, 136, 1, 189, 136, 1, 4, 212, 204, 136, 1, 212, 204, 136, + 1, 4, 212, 236, 136, 1, 212, 236, 136, 1, 208, 136, 1, 223, 222, 136, 1, + 223, 77, 136, 1, 224, 55, 136, 1, 223, 146, 136, 1, 4, 214, 52, 136, 1, + 214, 52, 136, 1, 213, 238, 136, 1, 214, 9, 136, 1, 213, 217, 136, 1, 206, + 136, 1, 214, 103, 136, 1, 4, 183, 136, 1, 4, 235, 44, 38, 235, 63, 214, + 120, 219, 237, 79, 38, 235, 63, 221, 98, 219, 237, 79, 235, 63, 214, 120, + 219, 237, 79, 235, 63, 221, 98, 219, 237, 79, 136, 236, 17, 79, 136, 214, + 120, 236, 17, 79, 136, 248, 38, 212, 217, 235, 63, 52, 241, 21, 56, 1, 4, + 63, 56, 1, 63, 56, 1, 4, 75, 56, 1, 75, 56, 1, 4, 72, 56, 1, 72, 56, 1, + 4, 77, 56, 1, 77, 56, 1, 4, 78, 56, 1, 78, 56, 1, 183, 56, 1, 243, 230, + 56, 1, 234, 212, 56, 1, 243, 54, 56, 1, 234, 81, 56, 1, 242, 213, 56, 1, + 235, 44, 56, 1, 243, 158, 56, 1, 234, 148, 56, 1, 243, 14, 56, 1, 222, + 227, 56, 1, 212, 109, 56, 1, 220, 136, 56, 1, 212, 37, 56, 1, 219, 41, + 56, 1, 212, 8, 56, 1, 222, 123, 56, 1, 212, 87, 56, 1, 220, 5, 56, 1, + 212, 16, 56, 1, 218, 66, 56, 1, 249, 30, 56, 1, 217, 84, 56, 1, 248, 76, + 56, 1, 4, 216, 90, 56, 1, 216, 90, 56, 1, 246, 154, 56, 1, 217, 242, 56, + 1, 248, 162, 56, 1, 109, 56, 1, 247, 220, 56, 1, 207, 56, 1, 229, 128, + 56, 1, 228, 135, 56, 1, 229, 254, 56, 1, 228, 228, 56, 1, 162, 56, 1, + 252, 234, 56, 1, 195, 56, 1, 242, 28, 56, 1, 252, 54, 56, 1, 226, 20, 56, + 1, 241, 74, 56, 1, 251, 179, 56, 1, 225, 71, 56, 1, 242, 85, 56, 1, 252, + 121, 56, 1, 226, 132, 56, 1, 241, 173, 56, 1, 251, 253, 56, 1, 225, 186, + 56, 1, 191, 56, 1, 231, 112, 56, 1, 230, 242, 56, 1, 231, 226, 56, 1, + 231, 45, 56, 1, 4, 189, 56, 1, 189, 56, 1, 4, 212, 204, 56, 1, 212, 204, + 56, 1, 4, 212, 236, 56, 1, 212, 236, 56, 1, 208, 56, 1, 223, 222, 56, 1, + 223, 77, 56, 1, 224, 55, 56, 1, 223, 146, 56, 1, 4, 214, 52, 56, 1, 214, + 52, 56, 1, 213, 238, 56, 1, 214, 9, 56, 1, 213, 217, 56, 1, 206, 56, 1, + 214, 103, 56, 1, 4, 183, 56, 1, 4, 235, 44, 56, 1, 215, 8, 56, 1, 214, + 159, 56, 1, 214, 237, 56, 1, 214, 123, 56, 231, 107, 247, 195, 235, 63, + 225, 93, 219, 237, 79, 56, 236, 17, 79, 56, 214, 120, 236, 17, 79, 56, + 248, 38, 234, 119, 205, 1, 253, 201, 205, 1, 227, 11, 205, 1, 184, 205, + 1, 245, 95, 205, 1, 249, 125, 205, 1, 218, 113, 205, 1, 206, 205, 1, 155, + 205, 1, 244, 41, 205, 1, 235, 141, 205, 1, 242, 162, 205, 1, 236, 3, 205, + 1, 225, 19, 205, 1, 213, 169, 205, 1, 212, 76, 205, 1, 250, 216, 205, 1, + 221, 49, 205, 1, 152, 205, 1, 212, 152, 205, 1, 251, 121, 205, 1, 196, + 205, 1, 63, 205, 1, 78, 205, 1, 77, 205, 1, 246, 19, 205, 1, 254, 236, + 205, 1, 246, 17, 205, 1, 253, 235, 205, 1, 227, 40, 205, 1, 254, 159, + 205, 1, 245, 229, 205, 1, 254, 151, 205, 1, 245, 217, 205, 1, 245, 176, + 205, 1, 75, 205, 1, 72, 205, 1, 236, 15, 205, 1, 211, 211, 205, 1, 229, + 228, 205, 1, 243, 18, 205, 1, 236, 146, 24, 1, 234, 178, 24, 1, 219, 168, + 24, 1, 234, 171, 24, 1, 229, 121, 24, 1, 229, 119, 24, 1, 229, 118, 24, + 1, 217, 68, 24, 1, 219, 157, 24, 1, 223, 213, 24, 1, 223, 208, 24, 1, + 223, 205, 24, 1, 223, 198, 24, 1, 223, 193, 24, 1, 223, 188, 24, 1, 223, + 199, 24, 1, 223, 211, 24, 1, 231, 100, 24, 1, 226, 7, 24, 1, 219, 165, + 24, 1, 225, 252, 24, 1, 220, 95, 24, 1, 219, 162, 24, 1, 236, 168, 24, 1, + 250, 106, 24, 1, 219, 172, 24, 1, 250, 166, 24, 1, 234, 228, 24, 1, 217, + 139, 24, 1, 226, 43, 24, 1, 242, 21, 24, 1, 63, 24, 1, 255, 20, 24, 1, + 189, 24, 1, 213, 83, 24, 1, 245, 197, 24, 1, 77, 24, 1, 213, 28, 24, 1, + 213, 39, 24, 1, 78, 24, 1, 214, 52, 24, 1, 214, 49, 24, 1, 227, 136, 24, + 1, 212, 236, 24, 1, 72, 24, 1, 213, 255, 24, 1, 214, 9, 24, 1, 213, 238, + 24, 1, 212, 204, 24, 1, 245, 143, 24, 1, 213, 0, 24, 1, 75, 24, 244, 192, + 24, 1, 219, 166, 24, 1, 229, 111, 24, 1, 229, 113, 24, 1, 229, 116, 24, + 1, 223, 206, 24, 1, 223, 187, 24, 1, 223, 195, 24, 1, 223, 200, 24, 1, + 223, 185, 24, 1, 231, 93, 24, 1, 231, 90, 24, 1, 231, 94, 24, 1, 235, 83, + 24, 1, 226, 2, 24, 1, 225, 244, 24, 1, 225, 250, 24, 1, 225, 247, 24, 1, + 226, 5, 24, 1, 225, 245, 24, 1, 235, 81, 24, 1, 235, 79, 24, 1, 220, 88, + 24, 1, 220, 86, 24, 1, 220, 78, 24, 1, 220, 83, 24, 1, 220, 93, 24, 1, + 226, 197, 24, 1, 219, 169, 24, 1, 213, 18, 24, 1, 213, 14, 24, 1, 213, + 15, 24, 1, 235, 82, 24, 1, 219, 170, 24, 1, 213, 24, 24, 1, 212, 230, 24, + 1, 212, 229, 24, 1, 212, 232, 24, 1, 212, 195, 24, 1, 212, 196, 24, 1, + 212, 199, 24, 1, 254, 75, 24, 1, 254, 69, 107, 254, 137, 233, 73, 79, + 107, 254, 137, 223, 237, 79, 107, 254, 137, 124, 79, 107, 254, 137, 119, + 79, 107, 254, 137, 137, 79, 107, 254, 137, 244, 101, 79, 107, 254, 137, + 216, 240, 79, 107, 254, 137, 231, 107, 79, 107, 254, 137, 251, 226, 79, + 107, 254, 137, 244, 181, 79, 107, 254, 137, 222, 118, 79, 107, 254, 137, + 217, 135, 79, 107, 254, 137, 244, 94, 79, 107, 254, 137, 242, 71, 79, + 107, 254, 137, 246, 45, 79, 107, 254, 137, 232, 64, 79, 205, 1, 251, 179, + 205, 1, 212, 37, 205, 1, 235, 225, 205, 1, 242, 213, 205, 1, 246, 30, + 205, 1, 245, 214, 205, 1, 227, 86, 205, 1, 227, 90, 205, 1, 236, 38, 205, + 1, 254, 139, 205, 1, 236, 82, 205, 1, 215, 145, 205, 1, 236, 128, 205, 1, + 229, 207, 205, 1, 254, 230, 205, 1, 253, 230, 205, 1, 254, 172, 205, 1, + 227, 107, 205, 1, 227, 92, 205, 1, 236, 79, 205, 41, 1, 227, 11, 205, 41, + 1, 218, 113, 205, 41, 1, 235, 141, 205, 41, 1, 242, 162, 205, 1, 243, 90, + 205, 1, 233, 124, 205, 1, 211, 249, 9, 219, 59, 218, 113, 9, 219, 59, + 213, 248, 9, 219, 59, 213, 149, 9, 219, 59, 251, 133, 9, 219, 59, 218, + 213, 9, 219, 59, 241, 11, 9, 219, 59, 241, 15, 9, 219, 59, 241, 80, 9, + 219, 59, 241, 12, 9, 219, 59, 218, 116, 9, 219, 59, 241, 14, 9, 219, 59, + 241, 10, 9, 219, 59, 241, 78, 9, 219, 59, 241, 13, 9, 219, 59, 241, 9, 9, + 219, 59, 206, 9, 219, 59, 242, 162, 9, 219, 59, 196, 9, 219, 59, 227, 11, + 9, 219, 59, 219, 227, 9, 219, 59, 249, 125, 9, 219, 59, 241, 16, 9, 219, + 59, 242, 38, 9, 219, 59, 218, 125, 9, 219, 59, 218, 192, 9, 219, 59, 219, + 121, 9, 219, 59, 221, 54, 9, 219, 59, 226, 134, 9, 219, 59, 225, 21, 9, + 219, 59, 217, 11, 9, 219, 59, 218, 115, 9, 219, 59, 218, 203, 9, 219, 59, + 241, 23, 9, 219, 59, 241, 8, 9, 219, 59, 226, 61, 9, 219, 59, 225, 19, + 56, 1, 4, 234, 81, 56, 1, 4, 220, 136, 56, 1, 4, 219, 41, 56, 1, 4, 109, + 56, 1, 4, 228, 135, 56, 1, 4, 162, 56, 1, 4, 242, 28, 56, 1, 4, 241, 74, + 56, 1, 4, 242, 85, 56, 1, 4, 241, 173, 56, 1, 4, 230, 242, 56, 1, 4, 208, + 56, 1, 4, 223, 222, 56, 1, 4, 223, 77, 56, 1, 4, 224, 55, 56, 1, 4, 223, + 146, 87, 24, 234, 178, 87, 24, 229, 121, 87, 24, 217, 68, 87, 24, 223, + 213, 87, 24, 231, 100, 87, 24, 226, 7, 87, 24, 220, 95, 87, 24, 236, 168, + 87, 24, 250, 106, 87, 24, 250, 166, 87, 24, 234, 228, 87, 24, 217, 139, + 87, 24, 226, 43, 87, 24, 242, 21, 87, 24, 234, 179, 63, 87, 24, 229, 122, + 63, 87, 24, 217, 69, 63, 87, 24, 223, 214, 63, 87, 24, 231, 101, 63, 87, + 24, 226, 8, 63, 87, 24, 220, 96, 63, 87, 24, 236, 169, 63, 87, 24, 250, + 107, 63, 87, 24, 250, 167, 63, 87, 24, 234, 229, 63, 87, 24, 217, 140, + 63, 87, 24, 226, 44, 63, 87, 24, 242, 22, 63, 87, 24, 250, 107, 72, 87, + 234, 123, 143, 227, 120, 87, 234, 123, 143, 141, 241, 74, 87, 147, 118, + 87, 147, 112, 87, 147, 170, 87, 147, 167, 87, 147, 185, 87, 147, 192, 87, + 147, 200, 87, 147, 198, 87, 147, 203, 87, 147, 217, 213, 87, 147, 231, + 12, 87, 147, 244, 185, 87, 147, 214, 27, 87, 147, 213, 204, 87, 147, 231, + 176, 87, 147, 246, 44, 87, 147, 218, 252, 87, 147, 219, 86, 87, 147, 242, + 91, 87, 147, 220, 1, 87, 147, 230, 92, 87, 147, 219, 211, 87, 147, 244, + 191, 87, 147, 250, 6, 87, 147, 233, 246, 87, 147, 224, 1, 87, 147, 251, + 71, 87, 147, 219, 44, 87, 147, 218, 234, 87, 147, 245, 207, 87, 147, 223, + 249, 87, 147, 254, 186, 87, 147, 244, 217, 87, 147, 223, 247, 87, 147, + 221, 99, 87, 147, 224, 54, 37, 147, 224, 192, 37, 147, 234, 200, 37, 147, + 222, 139, 37, 147, 234, 119, 37, 51, 217, 214, 227, 100, 85, 219, 185, + 37, 51, 216, 46, 227, 100, 85, 219, 185, 37, 51, 217, 129, 227, 100, 85, + 219, 185, 37, 51, 244, 105, 227, 100, 85, 219, 185, 37, 51, 244, 204, + 227, 100, 85, 219, 185, 37, 51, 220, 59, 227, 100, 85, 219, 185, 37, 51, + 221, 61, 227, 100, 85, 219, 185, 37, 51, 246, 7, 227, 100, 85, 219, 185, + 226, 160, 53, 37, 51, 216, 46, 118, 37, 51, 216, 46, 112, 37, 51, 216, + 46, 170, 37, 51, 216, 46, 167, 37, 51, 216, 46, 185, 37, 51, 216, 46, + 192, 37, 51, 216, 46, 200, 37, 51, 216, 46, 198, 37, 51, 216, 46, 203, + 37, 51, 217, 128, 37, 51, 217, 129, 118, 37, 51, 217, 129, 112, 37, 51, + 217, 129, 170, 37, 51, 217, 129, 167, 37, 51, 217, 129, 185, 37, 24, 234, + 178, 37, 24, 229, 121, 37, 24, 217, 68, 37, 24, 223, 213, 37, 24, 231, + 100, 37, 24, 226, 7, 37, 24, 220, 95, 37, 24, 236, 168, 37, 24, 250, 106, + 37, 24, 250, 166, 37, 24, 234, 228, 37, 24, 217, 139, 37, 24, 226, 43, + 37, 24, 242, 21, 37, 24, 234, 179, 63, 37, 24, 229, 122, 63, 37, 24, 217, + 69, 63, 37, 24, 223, 214, 63, 37, 24, 231, 101, 63, 37, 24, 226, 8, 63, + 37, 24, 220, 96, 63, 37, 24, 236, 169, 63, 37, 24, 250, 107, 63, 37, 24, + 250, 167, 63, 37, 24, 234, 229, 63, 37, 24, 217, 140, 63, 37, 24, 226, + 44, 63, 37, 24, 242, 22, 63, 37, 234, 123, 143, 250, 207, 37, 234, 123, + 143, 235, 164, 37, 24, 236, 169, 72, 234, 123, 219, 112, 88, 37, 147, + 118, 37, 147, 112, 37, 147, 170, 37, 147, 167, 37, 147, 185, 37, 147, + 192, 37, 147, 200, 37, 147, 198, 37, 147, 203, 37, 147, 217, 213, 37, + 147, 231, 12, 37, 147, 244, 185, 37, 147, 214, 27, 37, 147, 213, 204, 37, + 147, 231, 176, 37, 147, 246, 44, 37, 147, 218, 252, 37, 147, 219, 86, 37, + 147, 242, 91, 37, 147, 220, 1, 37, 147, 230, 92, 37, 147, 219, 211, 37, + 147, 244, 191, 37, 147, 250, 6, 37, 147, 233, 246, 37, 147, 222, 116, 37, + 147, 232, 67, 37, 147, 244, 226, 37, 147, 219, 8, 37, 147, 245, 122, 37, + 147, 225, 104, 37, 147, 253, 239, 37, 147, 236, 18, 37, 147, 223, 247, + 37, 147, 249, 226, 37, 147, 249, 217, 37, 147, 242, 14, 37, 147, 250, + 231, 37, 147, 232, 239, 37, 147, 233, 168, 37, 147, 223, 182, 37, 147, + 231, 218, 37, 147, 224, 15, 37, 147, 219, 44, 37, 147, 218, 234, 37, 147, + 245, 207, 37, 147, 223, 249, 37, 147, 254, 186, 37, 147, 229, 107, 37, + 51, 217, 129, 192, 37, 51, 217, 129, 200, 37, 51, 217, 129, 198, 37, 51, + 217, 129, 203, 37, 51, 244, 104, 37, 51, 244, 105, 118, 37, 51, 244, 105, + 112, 37, 51, 244, 105, 170, 37, 51, 244, 105, 167, 37, 51, 244, 105, 185, + 37, 51, 244, 105, 192, 37, 51, 244, 105, 200, 37, 51, 244, 105, 198, 37, + 51, 244, 105, 203, 37, 51, 244, 203, 107, 204, 16, 31, 235, 249, 107, + 204, 16, 31, 244, 237, 107, 204, 16, 31, 232, 38, 107, 204, 16, 31, 254, + 88, 107, 204, 16, 31, 232, 10, 107, 204, 16, 31, 235, 162, 107, 204, 16, + 31, 235, 163, 107, 204, 16, 31, 253, 231, 107, 204, 16, 31, 221, 79, 107, + 204, 16, 31, 227, 141, 107, 204, 16, 31, 228, 194, 107, 204, 16, 31, 248, + 157, 42, 242, 38, 42, 245, 172, 42, 245, 131, 233, 89, 233, 110, 53, 37, + 56, 63, 37, 56, 75, 37, 56, 72, 37, 56, 77, 37, 56, 78, 37, 56, 183, 37, + 56, 234, 212, 37, 56, 234, 81, 37, 56, 235, 44, 37, 56, 234, 148, 37, 56, + 222, 227, 37, 56, 220, 136, 37, 56, 219, 41, 37, 56, 222, 123, 37, 56, + 220, 5, 37, 56, 218, 66, 37, 56, 217, 84, 37, 56, 216, 90, 37, 56, 217, + 242, 37, 56, 109, 37, 56, 207, 37, 56, 229, 128, 37, 56, 228, 135, 37, + 56, 229, 254, 37, 56, 228, 228, 37, 56, 162, 37, 56, 242, 28, 37, 56, + 241, 74, 37, 56, 242, 85, 37, 56, 241, 173, 37, 56, 191, 37, 56, 231, + 112, 37, 56, 230, 242, 37, 56, 231, 226, 37, 56, 231, 45, 37, 56, 189, + 37, 56, 212, 204, 37, 56, 212, 236, 37, 56, 208, 37, 56, 223, 222, 37, + 56, 223, 77, 37, 56, 224, 55, 37, 56, 223, 146, 37, 56, 214, 52, 37, 56, + 213, 238, 37, 56, 214, 9, 37, 56, 213, 217, 42, 254, 109, 42, 254, 25, + 42, 254, 133, 42, 255, 62, 42, 236, 84, 42, 236, 54, 42, 215, 143, 42, + 245, 152, 42, 246, 28, 42, 227, 89, 42, 227, 83, 42, 235, 107, 42, 235, + 76, 42, 235, 73, 42, 243, 188, 42, 243, 197, 42, 243, 44, 42, 243, 40, + 42, 234, 14, 42, 243, 33, 42, 234, 192, 42, 234, 191, 42, 234, 190, 42, + 234, 189, 42, 242, 188, 42, 242, 187, 42, 234, 57, 42, 234, 59, 42, 235, + 40, 42, 234, 121, 42, 234, 128, 42, 222, 211, 42, 222, 177, 42, 220, 76, + 42, 221, 84, 42, 221, 83, 42, 249, 27, 42, 248, 108, 42, 247, 196, 42, + 217, 0, 42, 230, 88, 42, 228, 195, 42, 242, 134, 42, 226, 246, 42, 226, + 245, 42, 252, 232, 42, 226, 17, 42, 225, 237, 42, 225, 238, 42, 252, 26, + 42, 241, 73, 42, 241, 69, 42, 251, 145, 42, 241, 56, 42, 242, 62, 42, + 226, 71, 42, 226, 105, 42, 242, 46, 42, 226, 102, 42, 226, 118, 42, 252, + 107, 42, 225, 176, 42, 251, 231, 42, 241, 161, 42, 225, 166, 42, 241, + 153, 42, 241, 155, 42, 232, 79, 42, 232, 75, 42, 232, 84, 42, 232, 28, + 42, 232, 53, 42, 231, 80, 42, 231, 59, 42, 231, 58, 42, 231, 208, 42, + 231, 205, 42, 231, 209, 42, 213, 93, 42, 213, 91, 42, 212, 193, 42, 223, + 157, 42, 223, 161, 42, 223, 54, 42, 223, 48, 42, 224, 13, 42, 224, 10, + 42, 214, 25, 107, 204, 16, 31, 241, 88, 212, 79, 107, 204, 16, 31, 241, + 88, 118, 107, 204, 16, 31, 241, 88, 112, 107, 204, 16, 31, 241, 88, 170, + 107, 204, 16, 31, 241, 88, 167, 107, 204, 16, 31, 241, 88, 185, 107, 204, + 16, 31, 241, 88, 192, 107, 204, 16, 31, 241, 88, 200, 107, 204, 16, 31, + 241, 88, 198, 107, 204, 16, 31, 241, 88, 203, 107, 204, 16, 31, 241, 88, + 217, 213, 107, 204, 16, 31, 241, 88, 245, 245, 107, 204, 16, 31, 241, 88, + 216, 48, 107, 204, 16, 31, 241, 88, 217, 130, 107, 204, 16, 31, 241, 88, + 244, 95, 107, 204, 16, 31, 241, 88, 244, 207, 107, 204, 16, 31, 241, 88, + 220, 66, 107, 204, 16, 31, 241, 88, 221, 63, 107, 204, 16, 31, 241, 88, + 246, 12, 107, 204, 16, 31, 241, 88, 229, 92, 107, 204, 16, 31, 241, 88, + 216, 45, 107, 204, 16, 31, 241, 88, 216, 39, 107, 204, 16, 31, 241, 88, + 216, 35, 107, 204, 16, 31, 241, 88, 216, 36, 107, 204, 16, 31, 241, 88, + 216, 41, 42, 241, 79, 42, 249, 30, 42, 253, 235, 42, 134, 42, 227, 31, + 42, 226, 135, 42, 247, 222, 42, 247, 223, 219, 184, 42, 247, 223, 249, + 172, 42, 236, 15, 42, 245, 175, 230, 93, 242, 63, 42, 245, 175, 230, 93, + 218, 134, 42, 245, 175, 230, 93, 218, 37, 42, 245, 175, 230, 93, 231, + 204, 42, 249, 219, 42, 226, 252, 254, 161, 42, 207, 42, 230, 243, 63, 42, + 191, 42, 183, 42, 235, 47, 42, 232, 6, 42, 243, 176, 42, 251, 74, 42, + 235, 46, 42, 226, 62, 42, 229, 230, 42, 230, 243, 245, 95, 42, 230, 243, + 244, 41, 42, 231, 152, 42, 234, 252, 42, 241, 16, 42, 234, 214, 42, 231, + 114, 42, 243, 56, 42, 217, 86, 42, 230, 243, 155, 42, 231, 52, 42, 247, + 230, 42, 234, 160, 42, 244, 134, 42, 229, 8, 42, 230, 243, 184, 42, 231, + 49, 42, 250, 43, 42, 234, 154, 42, 231, 50, 219, 184, 42, 250, 44, 219, + 184, 42, 232, 183, 219, 184, 42, 234, 155, 219, 184, 42, 231, 50, 249, + 172, 42, 250, 44, 249, 172, 42, 232, 183, 249, 172, 42, 234, 155, 249, + 172, 42, 232, 183, 113, 196, 42, 232, 183, 113, 223, 29, 219, 184, 42, + 195, 42, 234, 115, 42, 230, 245, 42, 242, 247, 42, 224, 101, 42, 224, + 102, 113, 196, 42, 224, 102, 113, 223, 29, 219, 184, 42, 225, 83, 42, + 228, 167, 42, 230, 243, 196, 42, 230, 244, 42, 225, 39, 42, 228, 75, 42, + 230, 243, 211, 211, 42, 230, 189, 42, 234, 49, 42, 230, 190, 231, 208, + 42, 225, 38, 42, 228, 74, 42, 230, 243, 214, 85, 42, 230, 184, 42, 234, + 47, 42, 230, 185, 231, 208, 42, 235, 142, 227, 123, 42, 232, 183, 227, + 123, 42, 254, 172, 42, 251, 212, 42, 251, 14, 42, 250, 248, 42, 251, 122, + 113, 234, 252, 42, 250, 42, 42, 248, 209, 42, 242, 174, 42, 162, 42, 241, + 80, 42, 236, 112, 42, 234, 167, 42, 234, 155, 251, 50, 42, 234, 83, 42, + 233, 29, 42, 233, 28, 42, 233, 18, 42, 232, 195, 42, 232, 7, 220, 26, 42, + 231, 79, 42, 231, 36, 42, 226, 60, 42, 225, 189, 42, 225, 135, 42, 225, + 133, 42, 219, 178, 42, 218, 217, 42, 214, 11, 42, 215, 86, 113, 184, 42, + 111, 113, 184, 107, 204, 16, 31, 248, 213, 118, 107, 204, 16, 31, 248, + 213, 112, 107, 204, 16, 31, 248, 213, 170, 107, 204, 16, 31, 248, 213, + 167, 107, 204, 16, 31, 248, 213, 185, 107, 204, 16, 31, 248, 213, 192, + 107, 204, 16, 31, 248, 213, 200, 107, 204, 16, 31, 248, 213, 198, 107, + 204, 16, 31, 248, 213, 203, 107, 204, 16, 31, 248, 213, 217, 213, 107, + 204, 16, 31, 248, 213, 245, 245, 107, 204, 16, 31, 248, 213, 216, 48, + 107, 204, 16, 31, 248, 213, 217, 130, 107, 204, 16, 31, 248, 213, 244, + 95, 107, 204, 16, 31, 248, 213, 244, 207, 107, 204, 16, 31, 248, 213, + 220, 66, 107, 204, 16, 31, 248, 213, 221, 63, 107, 204, 16, 31, 248, 213, + 246, 12, 107, 204, 16, 31, 248, 213, 229, 92, 107, 204, 16, 31, 248, 213, + 216, 45, 107, 204, 16, 31, 248, 213, 216, 39, 107, 204, 16, 31, 248, 213, + 216, 35, 107, 204, 16, 31, 248, 213, 216, 36, 107, 204, 16, 31, 248, 213, + 216, 41, 107, 204, 16, 31, 248, 213, 216, 42, 107, 204, 16, 31, 248, 213, + 216, 37, 107, 204, 16, 31, 248, 213, 216, 38, 107, 204, 16, 31, 248, 213, + 216, 44, 107, 204, 16, 31, 248, 213, 216, 40, 107, 204, 16, 31, 248, 213, + 217, 128, 107, 204, 16, 31, 248, 213, 217, 127, 42, 243, 214, 242, 40, + 31, 217, 162, 249, 203, 242, 70, 242, 40, 31, 217, 162, 224, 49, 246, 44, + 242, 40, 31, 248, 48, 253, 250, 217, 162, 252, 102, 242, 40, 31, 212, + 215, 244, 127, 242, 40, 31, 214, 46, 242, 40, 31, 250, 8, 242, 40, 31, + 217, 162, 254, 45, 242, 40, 31, 241, 165, 217, 6, 242, 40, 31, 4, 218, + 25, 242, 40, 31, 216, 208, 242, 40, 31, 226, 130, 242, 40, 31, 219, 111, + 242, 40, 31, 244, 228, 242, 40, 31, 242, 230, 225, 156, 242, 40, 31, 231, + 39, 242, 40, 31, 245, 206, 242, 40, 31, 244, 128, 242, 40, 31, 213, 197, + 227, 100, 217, 162, 248, 158, 242, 40, 31, 254, 92, 242, 40, 31, 249, + 247, 242, 40, 31, 252, 19, 217, 105, 242, 40, 31, 242, 245, 242, 40, 31, + 219, 196, 254, 108, 242, 40, 31, 223, 239, 242, 40, 31, 236, 78, 242, 40, + 31, 242, 230, 218, 25, 242, 40, 31, 230, 251, 249, 221, 242, 40, 31, 242, + 230, 225, 113, 242, 40, 31, 217, 162, 255, 50, 214, 27, 242, 40, 31, 217, + 162, 250, 68, 244, 185, 242, 40, 31, 236, 91, 242, 40, 31, 246, 133, 242, + 40, 31, 223, 242, 242, 40, 31, 242, 230, 225, 140, 242, 40, 31, 225, 97, + 242, 40, 31, 248, 228, 68, 217, 162, 233, 100, 242, 40, 31, 217, 162, + 245, 7, 242, 40, 31, 227, 67, 242, 40, 31, 227, 145, 242, 40, 31, 248, + 131, 242, 40, 31, 248, 151, 242, 40, 31, 236, 104, 242, 40, 31, 251, 202, + 242, 40, 31, 250, 25, 217, 10, 231, 211, 242, 40, 31, 243, 183, 217, 6, + 242, 40, 31, 225, 48, 215, 131, 242, 40, 31, 227, 66, 242, 40, 31, 217, + 162, 214, 1, 242, 40, 31, 223, 232, 242, 40, 31, 217, 162, 251, 20, 242, + 40, 31, 217, 162, 254, 41, 217, 100, 242, 40, 31, 217, 162, 235, 41, 219, + 88, 230, 255, 242, 40, 31, 248, 104, 242, 40, 31, 217, 162, 232, 30, 232, + 80, 242, 40, 31, 255, 51, 242, 40, 31, 217, 162, 214, 41, 242, 40, 31, + 217, 162, 243, 143, 213, 227, 242, 40, 31, 217, 162, 235, 169, 233, 229, + 242, 40, 31, 248, 1, 242, 40, 31, 233, 90, 242, 40, 31, 236, 81, 216, + 158, 242, 40, 31, 4, 225, 113, 242, 40, 31, 254, 250, 250, 17, 242, 40, + 31, 252, 105, 250, 17, 8, 3, 236, 19, 8, 3, 236, 12, 8, 3, 75, 8, 3, 236, + 41, 8, 3, 236, 170, 8, 3, 236, 153, 8, 3, 236, 172, 8, 3, 236, 171, 8, 3, + 253, 249, 8, 3, 253, 212, 8, 3, 63, 8, 3, 254, 110, 8, 3, 215, 141, 8, 3, + 215, 144, 8, 3, 215, 142, 8, 3, 227, 46, 8, 3, 227, 20, 8, 3, 78, 8, 3, + 227, 78, 8, 3, 245, 123, 8, 3, 77, 8, 3, 213, 186, 8, 3, 252, 20, 8, 3, + 252, 17, 8, 3, 252, 54, 8, 3, 252, 30, 8, 3, 252, 43, 8, 3, 252, 42, 8, + 3, 252, 45, 8, 3, 252, 44, 8, 3, 252, 167, 8, 3, 252, 159, 8, 3, 252, + 234, 8, 3, 252, 188, 8, 3, 251, 155, 8, 3, 251, 159, 8, 3, 251, 156, 8, + 3, 251, 230, 8, 3, 251, 214, 8, 3, 251, 253, 8, 3, 251, 235, 8, 3, 252, + 68, 8, 3, 252, 121, 8, 3, 252, 80, 8, 3, 251, 141, 8, 3, 251, 138, 8, 3, + 251, 179, 8, 3, 251, 154, 8, 3, 251, 148, 8, 3, 251, 152, 8, 3, 251, 126, + 8, 3, 251, 125, 8, 3, 251, 131, 8, 3, 251, 129, 8, 3, 251, 127, 8, 3, + 251, 128, 8, 3, 225, 217, 8, 3, 225, 213, 8, 3, 226, 20, 8, 3, 225, 227, + 8, 3, 225, 243, 8, 3, 226, 14, 8, 3, 226, 10, 8, 3, 226, 150, 8, 3, 226, + 140, 8, 3, 195, 8, 3, 226, 186, 8, 3, 225, 57, 8, 3, 225, 59, 8, 3, 225, + 58, 8, 3, 225, 149, 8, 3, 225, 138, 8, 3, 225, 186, 8, 3, 225, 161, 8, 3, + 225, 44, 8, 3, 225, 40, 8, 3, 225, 71, 8, 3, 225, 56, 8, 3, 225, 49, 8, + 3, 225, 54, 8, 3, 225, 23, 8, 3, 225, 22, 8, 3, 225, 27, 8, 3, 225, 26, + 8, 3, 225, 24, 8, 3, 225, 25, 8, 3, 252, 142, 8, 3, 252, 141, 8, 3, 252, + 148, 8, 3, 252, 143, 8, 3, 252, 145, 8, 3, 252, 144, 8, 3, 252, 147, 8, + 3, 252, 146, 8, 3, 252, 154, 8, 3, 252, 153, 8, 3, 252, 157, 8, 3, 252, + 155, 8, 3, 252, 133, 8, 3, 252, 135, 8, 3, 252, 134, 8, 3, 252, 138, 8, + 3, 252, 137, 8, 3, 252, 140, 8, 3, 252, 139, 8, 3, 252, 149, 8, 3, 252, + 152, 8, 3, 252, 150, 8, 3, 252, 129, 8, 3, 252, 128, 8, 3, 252, 136, 8, + 3, 252, 132, 8, 3, 252, 130, 8, 3, 252, 131, 8, 3, 252, 125, 8, 3, 252, + 124, 8, 3, 252, 127, 8, 3, 252, 126, 8, 3, 230, 59, 8, 3, 230, 58, 8, 3, + 230, 64, 8, 3, 230, 60, 8, 3, 230, 61, 8, 3, 230, 63, 8, 3, 230, 62, 8, + 3, 230, 66, 8, 3, 230, 65, 8, 3, 230, 68, 8, 3, 230, 67, 8, 3, 230, 55, + 8, 3, 230, 54, 8, 3, 230, 57, 8, 3, 230, 56, 8, 3, 230, 49, 8, 3, 230, + 48, 8, 3, 230, 53, 8, 3, 230, 52, 8, 3, 230, 50, 8, 3, 230, 51, 8, 3, + 230, 43, 8, 3, 230, 42, 8, 3, 230, 47, 8, 3, 230, 46, 8, 3, 230, 44, 8, + 3, 230, 45, 8, 3, 241, 215, 8, 3, 241, 214, 8, 3, 241, 220, 8, 3, 241, + 216, 8, 3, 241, 217, 8, 3, 241, 219, 8, 3, 241, 218, 8, 3, 241, 223, 8, + 3, 241, 222, 8, 3, 241, 225, 8, 3, 241, 224, 8, 3, 241, 206, 8, 3, 241, + 208, 8, 3, 241, 207, 8, 3, 241, 211, 8, 3, 241, 210, 8, 3, 241, 213, 8, + 3, 241, 212, 8, 3, 241, 202, 8, 3, 241, 201, 8, 3, 241, 209, 8, 3, 241, + 205, 8, 3, 241, 203, 8, 3, 241, 204, 8, 3, 241, 196, 8, 3, 241, 200, 8, + 3, 241, 199, 8, 3, 241, 197, 8, 3, 241, 198, 8, 3, 231, 55, 8, 3, 231, + 54, 8, 3, 231, 112, 8, 3, 231, 61, 8, 3, 231, 86, 8, 3, 231, 104, 8, 3, + 231, 102, 8, 3, 232, 17, 8, 3, 232, 12, 8, 3, 191, 8, 3, 232, 50, 8, 3, + 230, 214, 8, 3, 230, 213, 8, 3, 230, 217, 8, 3, 230, 215, 8, 3, 231, 5, + 8, 3, 230, 247, 8, 3, 231, 45, 8, 3, 231, 10, 8, 3, 231, 163, 8, 3, 231, + 226, 8, 3, 230, 195, 8, 3, 230, 191, 8, 3, 230, 242, 8, 3, 230, 210, 8, + 3, 230, 203, 8, 3, 230, 208, 8, 3, 230, 169, 8, 3, 230, 168, 8, 3, 230, + 174, 8, 3, 230, 171, 8, 3, 244, 172, 8, 3, 244, 167, 8, 3, 244, 210, 8, + 3, 244, 187, 8, 3, 245, 0, 8, 3, 244, 247, 8, 3, 245, 29, 8, 3, 245, 3, + 8, 3, 244, 93, 8, 3, 244, 132, 8, 3, 244, 116, 8, 3, 244, 54, 8, 3, 244, + 53, 8, 3, 244, 69, 8, 3, 244, 59, 8, 3, 244, 57, 8, 3, 244, 58, 8, 3, + 244, 44, 8, 3, 244, 43, 8, 3, 244, 47, 8, 3, 244, 45, 8, 3, 214, 129, 8, + 3, 214, 124, 8, 3, 214, 159, 8, 3, 214, 138, 8, 3, 214, 151, 8, 3, 214, + 148, 8, 3, 214, 153, 8, 3, 214, 152, 8, 3, 214, 245, 8, 3, 214, 240, 8, + 3, 215, 8, 8, 3, 215, 0, 8, 3, 214, 110, 8, 3, 214, 106, 8, 3, 214, 123, + 8, 3, 214, 111, 8, 3, 214, 160, 8, 3, 214, 226, 8, 3, 214, 97, 8, 3, 214, + 95, 8, 3, 214, 103, 8, 3, 214, 100, 8, 3, 214, 98, 8, 3, 214, 99, 8, 3, + 214, 89, 8, 3, 214, 88, 8, 3, 214, 93, 8, 3, 214, 92, 8, 3, 214, 90, 8, + 3, 214, 91, 8, 3, 247, 251, 8, 3, 247, 239, 8, 3, 248, 76, 8, 3, 248, 20, + 8, 3, 248, 53, 8, 3, 248, 57, 8, 3, 248, 56, 8, 3, 248, 219, 8, 3, 248, + 214, 8, 3, 249, 30, 8, 3, 248, 239, 8, 3, 246, 138, 8, 3, 246, 139, 8, 3, + 247, 195, 8, 3, 246, 177, 8, 3, 247, 220, 8, 3, 247, 197, 8, 3, 248, 102, + 8, 3, 248, 162, 8, 3, 248, 117, 8, 3, 246, 129, 8, 3, 246, 127, 8, 3, + 246, 154, 8, 3, 246, 137, 8, 3, 246, 132, 8, 3, 246, 135, 8, 3, 217, 34, + 8, 3, 217, 28, 8, 3, 217, 84, 8, 3, 217, 43, 8, 3, 217, 76, 8, 3, 217, + 78, 8, 3, 217, 77, 8, 3, 218, 10, 8, 3, 217, 253, 8, 3, 218, 66, 8, 3, + 218, 18, 8, 3, 216, 74, 8, 3, 216, 73, 8, 3, 216, 76, 8, 3, 216, 75, 8, + 3, 216, 231, 8, 3, 216, 227, 8, 3, 109, 8, 3, 216, 239, 8, 3, 217, 179, + 8, 3, 217, 242, 8, 3, 217, 203, 8, 3, 216, 60, 8, 3, 216, 55, 8, 3, 216, + 90, 8, 3, 216, 72, 8, 3, 216, 61, 8, 3, 216, 70, 8, 3, 248, 179, 8, 3, + 248, 178, 8, 3, 248, 184, 8, 3, 248, 180, 8, 3, 248, 181, 8, 3, 248, 183, + 8, 3, 248, 182, 8, 3, 248, 200, 8, 3, 248, 199, 8, 3, 248, 207, 8, 3, + 248, 201, 8, 3, 248, 169, 8, 3, 248, 171, 8, 3, 248, 170, 8, 3, 248, 174, + 8, 3, 248, 173, 8, 3, 248, 177, 8, 3, 248, 175, 8, 3, 248, 192, 8, 3, + 248, 195, 8, 3, 248, 193, 8, 3, 248, 165, 8, 3, 248, 164, 8, 3, 248, 172, + 8, 3, 248, 168, 8, 3, 248, 166, 8, 3, 248, 167, 8, 3, 230, 17, 8, 3, 230, + 16, 8, 3, 230, 24, 8, 3, 230, 19, 8, 3, 230, 20, 8, 3, 230, 21, 8, 3, + 230, 33, 8, 3, 230, 32, 8, 3, 230, 39, 8, 3, 230, 34, 8, 3, 230, 9, 8, 3, + 230, 8, 8, 3, 230, 15, 8, 3, 230, 10, 8, 3, 230, 25, 8, 3, 230, 31, 8, 3, + 230, 29, 8, 3, 230, 1, 8, 3, 230, 0, 8, 3, 230, 6, 8, 3, 230, 4, 8, 3, + 230, 2, 8, 3, 230, 3, 8, 3, 241, 182, 8, 3, 241, 181, 8, 3, 241, 188, 8, + 3, 241, 183, 8, 3, 241, 185, 8, 3, 241, 184, 8, 3, 241, 187, 8, 3, 241, + 186, 8, 3, 241, 193, 8, 3, 241, 192, 8, 3, 241, 195, 8, 3, 241, 194, 8, + 3, 241, 176, 8, 3, 241, 177, 8, 3, 241, 179, 8, 3, 241, 178, 8, 3, 241, + 180, 8, 3, 241, 189, 8, 3, 241, 191, 8, 3, 241, 190, 8, 3, 241, 175, 8, + 3, 229, 84, 8, 3, 229, 82, 8, 3, 229, 128, 8, 3, 229, 87, 8, 3, 229, 110, + 8, 3, 229, 124, 8, 3, 229, 123, 8, 3, 230, 72, 8, 3, 207, 8, 3, 230, 85, + 8, 3, 228, 85, 8, 3, 228, 87, 8, 3, 228, 86, 8, 3, 228, 205, 8, 3, 228, + 192, 8, 3, 228, 228, 8, 3, 228, 214, 8, 3, 229, 232, 8, 3, 229, 254, 8, + 3, 229, 243, 8, 3, 228, 80, 8, 3, 228, 76, 8, 3, 228, 135, 8, 3, 228, 84, + 8, 3, 228, 82, 8, 3, 228, 83, 8, 3, 241, 246, 8, 3, 241, 245, 8, 3, 241, + 251, 8, 3, 241, 247, 8, 3, 241, 248, 8, 3, 241, 250, 8, 3, 241, 249, 8, + 3, 242, 0, 8, 3, 241, 255, 8, 3, 242, 2, 8, 3, 242, 1, 8, 3, 241, 238, 8, + 3, 241, 240, 8, 3, 241, 239, 8, 3, 241, 242, 8, 3, 241, 244, 8, 3, 241, + 243, 8, 3, 241, 252, 8, 3, 241, 254, 8, 3, 241, 253, 8, 3, 241, 234, 8, + 3, 241, 233, 8, 3, 241, 241, 8, 3, 241, 237, 8, 3, 241, 235, 8, 3, 241, + 236, 8, 3, 241, 228, 8, 3, 241, 227, 8, 3, 241, 232, 8, 3, 241, 231, 8, + 3, 241, 229, 8, 3, 241, 230, 8, 3, 233, 65, 8, 3, 233, 59, 8, 3, 233, + 111, 8, 3, 233, 72, 8, 3, 233, 103, 8, 3, 233, 102, 8, 3, 233, 106, 8, 3, + 233, 104, 8, 3, 233, 201, 8, 3, 233, 191, 8, 3, 233, 255, 8, 3, 233, 210, + 8, 3, 232, 211, 8, 3, 232, 210, 8, 3, 232, 213, 8, 3, 232, 212, 8, 3, + 232, 245, 8, 3, 232, 235, 8, 3, 233, 26, 8, 3, 232, 249, 8, 3, 233, 126, + 8, 3, 233, 180, 8, 3, 233, 139, 8, 3, 232, 206, 8, 3, 232, 204, 8, 3, + 232, 230, 8, 3, 232, 209, 8, 3, 232, 207, 8, 3, 232, 208, 8, 3, 232, 187, + 8, 3, 232, 186, 8, 3, 232, 194, 8, 3, 232, 190, 8, 3, 232, 188, 8, 3, + 232, 189, 8, 3, 243, 29, 8, 3, 243, 28, 8, 3, 243, 54, 8, 3, 243, 39, 8, + 3, 243, 46, 8, 3, 243, 45, 8, 3, 243, 48, 8, 3, 243, 47, 8, 3, 243, 185, + 8, 3, 243, 180, 8, 3, 243, 230, 8, 3, 243, 195, 8, 3, 242, 193, 8, 3, + 242, 192, 8, 3, 242, 195, 8, 3, 242, 194, 8, 3, 242, 250, 8, 3, 242, 248, + 8, 3, 243, 14, 8, 3, 243, 2, 8, 3, 243, 129, 8, 3, 243, 127, 8, 3, 243, + 158, 8, 3, 243, 140, 8, 3, 242, 183, 8, 3, 242, 182, 8, 3, 242, 213, 8, + 3, 242, 191, 8, 3, 242, 184, 8, 3, 242, 190, 8, 3, 234, 181, 8, 3, 234, + 180, 8, 3, 234, 212, 8, 3, 234, 195, 8, 3, 234, 205, 8, 3, 234, 208, 8, + 3, 234, 206, 8, 3, 235, 64, 8, 3, 235, 52, 8, 3, 183, 8, 3, 235, 90, 8, + 3, 234, 64, 8, 3, 234, 69, 8, 3, 234, 66, 8, 3, 234, 120, 8, 3, 234, 116, + 8, 3, 234, 148, 8, 3, 234, 127, 8, 3, 235, 18, 8, 3, 235, 2, 8, 3, 235, + 44, 8, 3, 235, 21, 8, 3, 234, 53, 8, 3, 234, 50, 8, 3, 234, 81, 8, 3, + 234, 63, 8, 3, 234, 56, 8, 3, 234, 60, 8, 3, 243, 111, 8, 3, 243, 110, 8, + 3, 243, 115, 8, 3, 243, 112, 8, 3, 243, 114, 8, 3, 243, 113, 8, 3, 243, + 122, 8, 3, 243, 121, 8, 3, 243, 125, 8, 3, 243, 123, 8, 3, 243, 102, 8, + 3, 243, 101, 8, 3, 243, 104, 8, 3, 243, 103, 8, 3, 243, 107, 8, 3, 243, + 106, 8, 3, 243, 109, 8, 3, 243, 108, 8, 3, 243, 117, 8, 3, 243, 116, 8, + 3, 243, 120, 8, 3, 243, 118, 8, 3, 243, 97, 8, 3, 243, 96, 8, 3, 243, + 105, 8, 3, 243, 100, 8, 3, 243, 98, 8, 3, 243, 99, 8, 3, 231, 130, 8, 3, + 231, 131, 8, 3, 231, 149, 8, 3, 231, 148, 8, 3, 231, 151, 8, 3, 231, 150, + 8, 3, 231, 121, 8, 3, 231, 123, 8, 3, 231, 122, 8, 3, 231, 126, 8, 3, + 231, 125, 8, 3, 231, 128, 8, 3, 231, 127, 8, 3, 231, 132, 8, 3, 231, 134, + 8, 3, 231, 133, 8, 3, 231, 117, 8, 3, 231, 116, 8, 3, 231, 124, 8, 3, + 231, 120, 8, 3, 231, 118, 8, 3, 231, 119, 8, 3, 241, 33, 8, 3, 241, 32, + 8, 3, 241, 39, 8, 3, 241, 34, 8, 3, 241, 36, 8, 3, 241, 35, 8, 3, 241, + 38, 8, 3, 241, 37, 8, 3, 241, 44, 8, 3, 241, 43, 8, 3, 241, 46, 8, 3, + 241, 45, 8, 3, 241, 25, 8, 3, 241, 24, 8, 3, 241, 27, 8, 3, 241, 26, 8, + 3, 241, 29, 8, 3, 241, 28, 8, 3, 241, 31, 8, 3, 241, 30, 8, 3, 241, 40, + 8, 3, 241, 42, 8, 3, 241, 41, 8, 3, 229, 175, 8, 3, 229, 177, 8, 3, 229, + 176, 8, 3, 229, 217, 8, 3, 229, 215, 8, 3, 229, 226, 8, 3, 229, 220, 8, + 3, 229, 138, 8, 3, 229, 137, 8, 3, 229, 139, 8, 3, 229, 147, 8, 3, 229, + 144, 8, 3, 229, 155, 8, 3, 229, 149, 8, 3, 229, 208, 8, 3, 229, 214, 8, + 3, 229, 210, 8, 3, 242, 5, 8, 3, 242, 15, 8, 3, 242, 23, 8, 3, 242, 98, + 8, 3, 242, 90, 8, 3, 162, 8, 3, 242, 109, 8, 3, 241, 58, 8, 3, 241, 57, + 8, 3, 241, 60, 8, 3, 241, 59, 8, 3, 241, 91, 8, 3, 241, 82, 8, 3, 241, + 173, 8, 3, 241, 152, 8, 3, 242, 42, 8, 3, 242, 85, 8, 3, 242, 53, 8, 3, + 214, 30, 8, 3, 214, 15, 8, 3, 214, 52, 8, 3, 214, 38, 8, 3, 213, 176, 8, + 3, 213, 178, 8, 3, 213, 177, 8, 3, 213, 194, 8, 3, 213, 217, 8, 3, 213, + 200, 8, 3, 213, 249, 8, 3, 214, 9, 8, 3, 213, 254, 8, 3, 212, 23, 8, 3, + 212, 22, 8, 3, 212, 37, 8, 3, 212, 25, 8, 3, 212, 30, 8, 3, 212, 32, 8, + 3, 212, 31, 8, 3, 212, 95, 8, 3, 212, 92, 8, 3, 212, 109, 8, 3, 212, 98, + 8, 3, 212, 1, 8, 3, 212, 3, 8, 3, 212, 2, 8, 3, 212, 12, 8, 3, 212, 11, + 8, 3, 212, 16, 8, 3, 212, 13, 8, 3, 212, 77, 8, 3, 212, 87, 8, 3, 212, + 81, 8, 3, 211, 253, 8, 3, 211, 252, 8, 3, 212, 8, 8, 3, 212, 0, 8, 3, + 211, 254, 8, 3, 211, 255, 8, 3, 211, 244, 8, 3, 211, 243, 8, 3, 211, 249, + 8, 3, 211, 247, 8, 3, 211, 245, 8, 3, 211, 246, 8, 3, 250, 88, 8, 3, 250, + 84, 8, 3, 250, 111, 8, 3, 250, 97, 8, 3, 250, 108, 8, 3, 250, 102, 8, 3, + 250, 110, 8, 3, 250, 109, 8, 3, 251, 24, 8, 3, 251, 17, 8, 3, 251, 88, 8, + 3, 251, 51, 8, 3, 249, 168, 8, 3, 249, 170, 8, 3, 249, 169, 8, 3, 249, + 215, 8, 3, 249, 206, 8, 3, 250, 42, 8, 3, 249, 231, 8, 3, 250, 217, 8, 3, + 250, 247, 8, 3, 250, 222, 8, 3, 249, 149, 8, 3, 249, 147, 8, 3, 249, 176, + 8, 3, 249, 166, 8, 3, 249, 154, 8, 3, 249, 165, 8, 3, 249, 128, 8, 3, + 249, 127, 8, 3, 249, 138, 8, 3, 249, 134, 8, 3, 249, 129, 8, 3, 249, 131, + 8, 3, 211, 227, 8, 3, 211, 226, 8, 3, 211, 233, 8, 3, 211, 228, 8, 3, + 211, 230, 8, 3, 211, 229, 8, 3, 211, 232, 8, 3, 211, 231, 8, 3, 211, 239, + 8, 3, 211, 238, 8, 3, 211, 242, 8, 3, 211, 240, 8, 3, 211, 223, 8, 3, + 211, 225, 8, 3, 211, 224, 8, 3, 211, 234, 8, 3, 211, 237, 8, 3, 211, 235, + 8, 3, 211, 218, 8, 3, 211, 222, 8, 3, 211, 221, 8, 3, 211, 219, 8, 3, + 211, 220, 8, 3, 211, 213, 8, 3, 211, 212, 8, 3, 211, 217, 8, 3, 211, 216, + 8, 3, 211, 214, 8, 3, 211, 215, 8, 3, 228, 5, 8, 3, 228, 4, 8, 3, 228, + 10, 8, 3, 228, 6, 8, 3, 228, 7, 8, 3, 228, 9, 8, 3, 228, 8, 8, 3, 228, + 15, 8, 3, 228, 14, 8, 3, 228, 18, 8, 3, 228, 17, 8, 3, 227, 254, 8, 3, + 227, 255, 8, 3, 228, 2, 8, 3, 228, 3, 8, 3, 228, 11, 8, 3, 228, 13, 8, 3, + 227, 249, 8, 3, 228, 1, 8, 3, 227, 253, 8, 3, 227, 250, 8, 3, 227, 251, + 8, 3, 227, 244, 8, 3, 227, 243, 8, 3, 227, 248, 8, 3, 227, 247, 8, 3, + 227, 245, 8, 3, 227, 246, 8, 3, 220, 74, 8, 3, 192, 8, 3, 220, 136, 8, 3, + 220, 77, 8, 3, 220, 128, 8, 3, 220, 131, 8, 3, 220, 129, 8, 3, 222, 166, + 8, 3, 222, 155, 8, 3, 222, 227, 8, 3, 222, 174, 8, 3, 218, 242, 8, 3, + 218, 244, 8, 3, 218, 243, 8, 3, 219, 240, 8, 3, 219, 229, 8, 3, 220, 5, + 8, 3, 219, 243, 8, 3, 221, 58, 8, 3, 222, 123, 8, 3, 221, 82, 8, 3, 218, + 220, 8, 3, 218, 218, 8, 3, 219, 41, 8, 3, 218, 241, 8, 3, 218, 223, 8, 3, + 218, 231, 8, 3, 218, 127, 8, 3, 218, 126, 8, 3, 218, 191, 8, 3, 218, 133, + 8, 3, 218, 128, 8, 3, 218, 132, 8, 3, 219, 139, 8, 3, 219, 138, 8, 3, + 219, 145, 8, 3, 219, 140, 8, 3, 219, 142, 8, 3, 219, 144, 8, 3, 219, 143, + 8, 3, 219, 153, 8, 3, 219, 151, 8, 3, 219, 176, 8, 3, 219, 154, 8, 3, + 219, 134, 8, 3, 219, 133, 8, 3, 219, 137, 8, 3, 219, 135, 8, 3, 219, 147, + 8, 3, 219, 150, 8, 3, 219, 148, 8, 3, 219, 130, 8, 3, 219, 128, 8, 3, + 219, 132, 8, 3, 219, 131, 8, 3, 219, 123, 8, 3, 219, 122, 8, 3, 219, 127, + 8, 3, 219, 126, 8, 3, 219, 124, 8, 3, 219, 125, 8, 3, 212, 70, 8, 3, 212, + 69, 8, 3, 212, 75, 8, 3, 212, 72, 8, 3, 212, 52, 8, 3, 212, 54, 8, 3, + 212, 53, 8, 3, 212, 57, 8, 3, 212, 56, 8, 3, 212, 60, 8, 3, 212, 58, 8, + 3, 212, 64, 8, 3, 212, 63, 8, 3, 212, 67, 8, 3, 212, 65, 8, 3, 212, 48, + 8, 3, 212, 47, 8, 3, 212, 55, 8, 3, 212, 51, 8, 3, 212, 49, 8, 3, 212, + 50, 8, 3, 212, 40, 8, 3, 212, 39, 8, 3, 212, 44, 8, 3, 212, 43, 8, 3, + 212, 41, 8, 3, 212, 42, 8, 3, 250, 195, 8, 3, 250, 192, 8, 3, 250, 215, + 8, 3, 250, 203, 8, 3, 250, 125, 8, 3, 250, 124, 8, 3, 250, 127, 8, 3, + 250, 126, 8, 3, 250, 139, 8, 3, 250, 138, 8, 3, 250, 146, 8, 3, 250, 141, + 8, 3, 250, 175, 8, 3, 250, 173, 8, 3, 250, 190, 8, 3, 250, 181, 8, 3, + 250, 119, 8, 3, 250, 129, 8, 3, 250, 123, 8, 3, 250, 120, 8, 3, 250, 122, + 8, 3, 250, 113, 8, 3, 250, 112, 8, 3, 250, 117, 8, 3, 250, 116, 8, 3, + 250, 114, 8, 3, 250, 115, 8, 3, 223, 111, 8, 3, 223, 115, 8, 3, 223, 94, + 8, 3, 223, 95, 8, 3, 223, 98, 8, 3, 223, 97, 8, 3, 223, 101, 8, 3, 223, + 99, 8, 3, 223, 105, 8, 3, 223, 104, 8, 3, 223, 110, 8, 3, 223, 106, 8, 3, + 223, 90, 8, 3, 223, 88, 8, 3, 223, 96, 8, 3, 223, 93, 8, 3, 223, 91, 8, + 3, 223, 92, 8, 3, 223, 83, 8, 3, 223, 82, 8, 3, 223, 87, 8, 3, 223, 86, + 8, 3, 223, 84, 8, 3, 223, 85, 8, 3, 228, 188, 8, 3, 228, 187, 8, 3, 228, + 190, 8, 3, 228, 189, 8, 3, 228, 180, 8, 3, 228, 182, 8, 3, 228, 181, 8, + 3, 228, 184, 8, 3, 228, 183, 8, 3, 228, 186, 8, 3, 228, 185, 8, 3, 228, + 175, 8, 3, 228, 174, 8, 3, 228, 179, 8, 3, 228, 178, 8, 3, 228, 176, 8, + 3, 228, 177, 8, 3, 228, 169, 8, 3, 228, 168, 8, 3, 228, 173, 8, 3, 228, + 172, 8, 3, 228, 170, 8, 3, 228, 171, 8, 3, 221, 17, 8, 3, 221, 12, 8, 3, + 221, 47, 8, 3, 221, 28, 8, 3, 220, 160, 8, 3, 220, 162, 8, 3, 220, 161, + 8, 3, 220, 181, 8, 3, 220, 178, 8, 3, 220, 208, 8, 3, 220, 199, 8, 3, + 220, 243, 8, 3, 220, 236, 8, 3, 221, 8, 8, 3, 220, 251, 8, 3, 220, 156, + 8, 3, 220, 154, 8, 3, 220, 170, 8, 3, 220, 159, 8, 3, 220, 157, 8, 3, + 220, 158, 8, 3, 220, 139, 8, 3, 220, 138, 8, 3, 220, 145, 8, 3, 220, 142, + 8, 3, 220, 140, 8, 3, 220, 141, 8, 3, 224, 68, 8, 3, 224, 62, 8, 3, 208, + 8, 3, 224, 74, 8, 3, 223, 57, 8, 3, 223, 59, 8, 3, 223, 58, 8, 3, 223, + 124, 8, 3, 223, 117, 8, 3, 223, 146, 8, 3, 223, 128, 8, 3, 223, 230, 8, + 3, 224, 55, 8, 3, 224, 9, 8, 3, 223, 50, 8, 3, 223, 47, 8, 3, 223, 77, 8, + 3, 223, 56, 8, 3, 223, 52, 8, 3, 223, 53, 8, 3, 223, 32, 8, 3, 223, 31, + 8, 3, 223, 37, 8, 3, 223, 35, 8, 3, 223, 33, 8, 3, 223, 34, 8, 3, 235, + 215, 8, 3, 235, 214, 8, 3, 235, 225, 8, 3, 235, 216, 8, 3, 235, 221, 8, + 3, 235, 220, 8, 3, 235, 223, 8, 3, 235, 222, 8, 3, 235, 158, 8, 3, 235, + 157, 8, 3, 235, 160, 8, 3, 235, 159, 8, 3, 235, 173, 8, 3, 235, 171, 8, + 3, 235, 185, 8, 3, 235, 175, 8, 3, 235, 152, 8, 3, 235, 150, 8, 3, 235, + 168, 8, 3, 235, 156, 8, 3, 235, 153, 8, 3, 235, 154, 8, 3, 235, 144, 8, + 3, 235, 143, 8, 3, 235, 148, 8, 3, 235, 147, 8, 3, 235, 145, 8, 3, 235, + 146, 8, 3, 224, 226, 8, 3, 224, 224, 8, 3, 224, 233, 8, 3, 224, 227, 8, + 3, 224, 230, 8, 3, 224, 229, 8, 3, 224, 232, 8, 3, 224, 231, 8, 3, 224, + 179, 8, 3, 224, 176, 8, 3, 224, 181, 8, 3, 224, 180, 8, 3, 224, 213, 8, + 3, 224, 212, 8, 3, 224, 222, 8, 3, 224, 216, 8, 3, 224, 171, 8, 3, 224, + 167, 8, 3, 224, 210, 8, 3, 224, 175, 8, 3, 224, 173, 8, 3, 224, 174, 8, + 3, 224, 151, 8, 3, 224, 149, 8, 3, 224, 161, 8, 3, 224, 154, 8, 3, 224, + 152, 8, 3, 224, 153, 8, 3, 235, 204, 8, 3, 235, 203, 8, 3, 235, 210, 8, + 3, 235, 205, 8, 3, 235, 207, 8, 3, 235, 206, 8, 3, 235, 209, 8, 3, 235, + 208, 8, 3, 235, 195, 8, 3, 235, 197, 8, 3, 235, 196, 8, 3, 235, 200, 8, + 3, 235, 199, 8, 3, 235, 202, 8, 3, 235, 201, 8, 3, 235, 191, 8, 3, 235, + 190, 8, 3, 235, 198, 8, 3, 235, 194, 8, 3, 235, 192, 8, 3, 235, 193, 8, + 3, 235, 187, 8, 3, 235, 186, 8, 3, 235, 189, 8, 3, 235, 188, 8, 3, 229, + 57, 8, 3, 229, 56, 8, 3, 229, 64, 8, 3, 229, 58, 8, 3, 229, 60, 8, 3, + 229, 59, 8, 3, 229, 63, 8, 3, 229, 61, 8, 3, 229, 46, 8, 3, 229, 47, 8, + 3, 229, 52, 8, 3, 229, 51, 8, 3, 229, 55, 8, 3, 229, 53, 8, 3, 229, 41, + 8, 3, 229, 50, 8, 3, 229, 45, 8, 3, 229, 42, 8, 3, 229, 43, 8, 3, 229, + 36, 8, 3, 229, 35, 8, 3, 229, 40, 8, 3, 229, 39, 8, 3, 229, 37, 8, 3, + 229, 38, 8, 3, 228, 38, 8, 3, 228, 37, 8, 3, 228, 49, 8, 3, 228, 42, 8, + 3, 228, 46, 8, 3, 228, 45, 8, 3, 228, 48, 8, 3, 228, 47, 8, 3, 228, 25, + 8, 3, 228, 27, 8, 3, 228, 26, 8, 3, 228, 31, 8, 3, 228, 30, 8, 3, 228, + 35, 8, 3, 228, 32, 8, 3, 228, 23, 8, 3, 228, 21, 8, 3, 228, 29, 8, 3, + 228, 24, 8, 3, 213, 141, 8, 3, 213, 140, 8, 3, 213, 148, 8, 3, 213, 143, + 8, 3, 213, 145, 8, 3, 213, 144, 8, 3, 213, 147, 8, 3, 213, 146, 8, 3, + 213, 130, 8, 3, 213, 131, 8, 3, 213, 135, 8, 3, 213, 134, 8, 3, 213, 139, + 8, 3, 213, 137, 8, 3, 213, 112, 8, 3, 213, 110, 8, 3, 213, 122, 8, 3, + 213, 115, 8, 3, 213, 113, 8, 3, 213, 114, 8, 3, 212, 242, 8, 3, 212, 240, + 8, 3, 213, 0, 8, 3, 212, 243, 8, 3, 212, 250, 8, 3, 212, 249, 8, 3, 212, + 253, 8, 3, 212, 251, 8, 3, 212, 183, 8, 3, 212, 182, 8, 3, 212, 186, 8, + 3, 212, 184, 8, 3, 212, 216, 8, 3, 212, 213, 8, 3, 212, 236, 8, 3, 212, + 220, 8, 3, 212, 174, 8, 3, 212, 170, 8, 3, 212, 204, 8, 3, 212, 181, 8, + 3, 212, 177, 8, 3, 212, 178, 8, 3, 212, 155, 8, 3, 212, 154, 8, 3, 212, + 161, 8, 3, 212, 158, 8, 3, 212, 156, 8, 3, 212, 157, 8, 34, 224, 213, 8, + 34, 233, 111, 8, 34, 234, 181, 8, 34, 228, 42, 8, 34, 249, 134, 8, 34, + 219, 145, 8, 34, 243, 108, 8, 34, 243, 140, 8, 34, 231, 112, 8, 34, 241, + 33, 8, 34, 232, 189, 8, 34, 252, 129, 8, 34, 231, 10, 8, 34, 212, 236, 8, + 34, 225, 44, 8, 34, 241, 27, 8, 34, 218, 10, 8, 34, 243, 230, 8, 34, 212, + 0, 8, 34, 249, 128, 8, 34, 248, 167, 8, 34, 251, 152, 8, 34, 243, 104, 8, + 34, 228, 32, 8, 34, 216, 90, 8, 34, 227, 78, 8, 34, 235, 191, 8, 34, 212, + 12, 8, 34, 225, 23, 8, 34, 241, 213, 8, 34, 212, 242, 8, 34, 214, 99, 8, + 34, 220, 145, 8, 34, 214, 226, 8, 34, 212, 109, 8, 34, 235, 185, 8, 34, + 227, 253, 8, 34, 235, 189, 8, 34, 242, 250, 8, 34, 235, 209, 8, 34, 213, + 217, 8, 34, 246, 154, 8, 34, 220, 158, 8, 34, 233, 106, 8, 34, 249, 138, + 8, 34, 249, 169, 8, 34, 250, 97, 8, 34, 241, 30, 8, 34, 221, 17, 8, 34, + 211, 255, 8, 34, 220, 199, 8, 34, 250, 190, 8, 34, 211, 230, 8, 34, 230, + 63, 8, 34, 235, 44, 233, 66, 1, 252, 234, 233, 66, 1, 195, 233, 66, 1, + 226, 59, 233, 66, 1, 249, 30, 233, 66, 1, 218, 66, 233, 66, 1, 217, 174, + 233, 66, 1, 243, 230, 233, 66, 1, 183, 233, 66, 1, 234, 250, 233, 66, 1, + 236, 0, 233, 66, 1, 251, 88, 233, 66, 1, 250, 215, 233, 66, 1, 246, 114, + 233, 66, 1, 216, 154, 233, 66, 1, 216, 146, 233, 66, 1, 191, 233, 66, 1, + 207, 233, 66, 1, 233, 255, 233, 66, 1, 222, 227, 233, 66, 1, 212, 75, + 233, 66, 1, 212, 109, 233, 66, 1, 229, 226, 233, 66, 1, 162, 233, 66, 1, + 213, 156, 233, 66, 1, 242, 37, 233, 66, 1, 245, 29, 233, 66, 1, 214, 52, + 233, 66, 1, 221, 47, 233, 66, 1, 189, 233, 66, 1, 243, 89, 233, 66, 1, + 63, 233, 66, 1, 255, 20, 233, 66, 1, 77, 233, 66, 1, 245, 143, 233, 66, + 1, 75, 233, 66, 1, 78, 233, 66, 1, 72, 233, 66, 1, 215, 189, 233, 66, 1, + 215, 184, 233, 66, 1, 227, 136, 233, 66, 1, 161, 230, 173, 217, 84, 233, + 66, 1, 161, 230, 115, 225, 186, 233, 66, 1, 161, 230, 173, 249, 137, 233, + 66, 1, 161, 230, 173, 251, 253, 233, 66, 1, 161, 230, 173, 207, 233, 66, + 1, 161, 230, 173, 235, 231, 233, 66, 225, 63, 250, 23, 233, 66, 225, 63, + 244, 64, 219, 83, 40, 3, 246, 30, 40, 3, 246, 27, 40, 3, 242, 67, 40, 3, + 214, 4, 40, 3, 214, 3, 40, 3, 226, 122, 40, 3, 252, 61, 40, 3, 252, 112, + 40, 3, 231, 249, 40, 3, 234, 111, 40, 3, 231, 143, 40, 3, 243, 171, 40, + 3, 244, 236, 40, 3, 214, 232, 40, 3, 217, 232, 40, 3, 217, 160, 40, 3, + 248, 89, 40, 3, 248, 86, 40, 3, 233, 172, 40, 3, 224, 35, 40, 3, 248, + 149, 40, 3, 230, 30, 40, 3, 222, 112, 40, 3, 221, 6, 40, 3, 212, 85, 40, + 3, 212, 66, 40, 3, 250, 239, 40, 3, 235, 240, 40, 3, 229, 71, 40, 3, 213, + 36, 40, 3, 235, 43, 40, 3, 229, 201, 40, 3, 243, 151, 40, 3, 231, 215, + 40, 3, 229, 251, 40, 3, 228, 55, 40, 3, 75, 40, 3, 236, 112, 40, 3, 242, + 28, 40, 3, 242, 9, 40, 3, 213, 238, 40, 3, 213, 229, 40, 3, 226, 20, 40, + 3, 252, 59, 40, 3, 252, 54, 40, 3, 231, 242, 40, 3, 234, 108, 40, 3, 231, + 140, 40, 3, 243, 167, 40, 3, 244, 210, 40, 3, 214, 159, 40, 3, 217, 84, + 40, 3, 217, 141, 40, 3, 248, 81, 40, 3, 248, 85, 40, 3, 233, 111, 40, 3, + 223, 222, 40, 3, 248, 76, 40, 3, 230, 24, 40, 3, 220, 136, 40, 3, 220, + 233, 40, 3, 212, 37, 40, 3, 212, 62, 40, 3, 250, 111, 40, 3, 235, 225, + 40, 3, 229, 64, 40, 3, 213, 0, 40, 3, 234, 212, 40, 3, 229, 193, 40, 3, + 243, 54, 40, 3, 231, 112, 40, 3, 229, 128, 40, 3, 228, 49, 40, 3, 63, 40, + 3, 254, 159, 40, 3, 229, 222, 40, 3, 162, 40, 3, 242, 121, 40, 3, 214, + 52, 40, 3, 214, 42, 40, 3, 195, 40, 3, 252, 65, 40, 3, 252, 234, 40, 3, + 232, 1, 40, 3, 234, 115, 40, 3, 234, 114, 40, 3, 231, 147, 40, 3, 243, + 175, 40, 3, 245, 29, 40, 3, 215, 8, 40, 3, 218, 66, 40, 3, 217, 174, 40, + 3, 248, 97, 40, 3, 248, 88, 40, 3, 233, 255, 40, 3, 208, 40, 3, 249, 30, + 40, 3, 230, 39, 40, 3, 222, 227, 40, 3, 221, 47, 40, 3, 212, 109, 40, 3, + 212, 75, 40, 3, 251, 88, 40, 3, 236, 0, 40, 3, 229, 80, 40, 3, 189, 40, + 3, 183, 40, 3, 235, 96, 40, 3, 229, 206, 40, 3, 243, 230, 40, 3, 191, 40, + 3, 207, 40, 3, 228, 64, 40, 3, 227, 86, 40, 3, 227, 82, 40, 3, 241, 158, + 40, 3, 213, 205, 40, 3, 213, 201, 40, 3, 225, 165, 40, 3, 252, 57, 40, 3, + 251, 243, 40, 3, 231, 237, 40, 3, 234, 106, 40, 3, 231, 136, 40, 3, 243, + 163, 40, 3, 244, 123, 40, 3, 214, 112, 40, 3, 216, 243, 40, 3, 217, 119, + 40, 3, 248, 79, 40, 3, 248, 83, 40, 3, 232, 254, 40, 3, 223, 133, 40, 3, + 247, 200, 40, 3, 230, 11, 40, 3, 219, 245, 40, 3, 220, 202, 40, 3, 212, + 14, 40, 3, 212, 59, 40, 3, 249, 236, 40, 3, 235, 176, 40, 3, 229, 54, 40, + 3, 212, 221, 40, 3, 234, 130, 40, 3, 229, 191, 40, 3, 243, 4, 40, 3, 231, + 16, 40, 3, 228, 218, 40, 3, 228, 33, 40, 3, 72, 40, 3, 215, 166, 40, 3, + 241, 74, 40, 3, 241, 64, 40, 3, 213, 186, 40, 3, 213, 180, 40, 3, 225, + 71, 40, 3, 252, 56, 40, 3, 251, 179, 40, 3, 231, 236, 40, 3, 234, 104, + 40, 3, 231, 135, 40, 3, 243, 162, 40, 3, 244, 69, 40, 3, 214, 103, 40, 3, + 216, 90, 40, 3, 217, 103, 40, 3, 248, 77, 40, 3, 248, 82, 40, 3, 232, + 230, 40, 3, 223, 77, 40, 3, 246, 154, 40, 3, 230, 6, 40, 3, 219, 41, 40, + 3, 220, 170, 40, 3, 212, 8, 40, 3, 212, 55, 40, 3, 249, 176, 40, 3, 235, + 168, 40, 3, 229, 50, 40, 3, 212, 204, 40, 3, 234, 81, 40, 3, 229, 190, + 40, 3, 242, 213, 40, 3, 230, 242, 40, 3, 228, 135, 40, 3, 228, 29, 40, 3, + 78, 40, 3, 227, 99, 40, 3, 229, 151, 40, 3, 241, 173, 40, 3, 241, 161, + 40, 3, 213, 217, 40, 3, 213, 206, 40, 3, 225, 186, 40, 3, 252, 58, 40, 3, + 251, 253, 40, 3, 231, 238, 40, 3, 234, 107, 40, 3, 231, 138, 40, 3, 243, + 165, 40, 3, 243, 164, 40, 3, 244, 132, 40, 3, 214, 123, 40, 3, 109, 40, + 3, 217, 122, 40, 3, 248, 80, 40, 3, 248, 84, 40, 3, 233, 26, 40, 3, 223, + 146, 40, 3, 247, 220, 40, 3, 230, 15, 40, 3, 220, 5, 40, 3, 220, 208, 40, + 3, 212, 16, 40, 3, 212, 60, 40, 3, 250, 42, 40, 3, 235, 185, 40, 3, 229, + 55, 40, 3, 212, 236, 40, 3, 234, 148, 40, 3, 229, 192, 40, 3, 243, 14, + 40, 3, 231, 45, 40, 3, 228, 228, 40, 3, 228, 35, 40, 3, 77, 40, 3, 245, + 229, 40, 3, 229, 211, 40, 3, 242, 85, 40, 3, 242, 56, 40, 3, 214, 9, 40, + 3, 214, 0, 40, 3, 226, 132, 40, 3, 252, 62, 40, 3, 252, 121, 40, 3, 231, + 250, 40, 3, 234, 112, 40, 3, 234, 110, 40, 3, 231, 144, 40, 3, 243, 172, + 40, 3, 243, 170, 40, 3, 244, 243, 40, 3, 214, 237, 40, 3, 217, 242, 40, + 3, 217, 161, 40, 3, 248, 90, 40, 3, 248, 87, 40, 3, 233, 180, 40, 3, 224, + 55, 40, 3, 248, 162, 40, 3, 230, 31, 40, 3, 222, 123, 40, 3, 221, 8, 40, + 3, 212, 87, 40, 3, 212, 67, 40, 3, 250, 247, 40, 3, 235, 242, 40, 3, 229, + 73, 40, 3, 213, 39, 40, 3, 235, 44, 40, 3, 229, 202, 40, 3, 229, 198, 40, + 3, 243, 158, 40, 3, 243, 147, 40, 3, 231, 226, 40, 3, 229, 254, 40, 3, + 228, 56, 40, 3, 229, 228, 40, 3, 233, 144, 40, 250, 23, 40, 244, 64, 219, + 83, 40, 224, 193, 79, 40, 3, 230, 14, 245, 29, 40, 3, 230, 14, 183, 40, + 3, 230, 14, 219, 245, 40, 16, 244, 233, 40, 16, 235, 42, 40, 16, 217, 48, + 40, 16, 229, 103, 40, 16, 252, 193, 40, 16, 245, 28, 40, 16, 218, 63, 40, + 16, 248, 243, 40, 16, 247, 199, 40, 16, 234, 70, 40, 16, 216, 247, 40, + 16, 247, 219, 40, 16, 235, 177, 40, 21, 212, 79, 40, 21, 118, 40, 21, + 112, 40, 21, 170, 40, 21, 167, 40, 21, 185, 40, 21, 192, 40, 21, 200, 40, + 21, 198, 40, 21, 203, 40, 3, 230, 14, 191, 40, 3, 230, 14, 247, 220, 33, + 6, 1, 212, 83, 33, 4, 1, 212, 83, 33, 6, 1, 246, 110, 33, 4, 1, 246, 110, + 33, 6, 1, 223, 236, 246, 112, 33, 4, 1, 223, 236, 246, 112, 33, 6, 1, + 236, 44, 33, 4, 1, 236, 44, 33, 6, 1, 247, 234, 33, 4, 1, 247, 234, 33, + 6, 1, 231, 24, 215, 181, 33, 4, 1, 231, 24, 215, 181, 33, 6, 1, 251, 189, + 227, 104, 33, 4, 1, 251, 189, 227, 104, 33, 6, 1, 229, 236, 213, 23, 33, + 4, 1, 229, 236, 213, 23, 33, 6, 1, 213, 20, 2, 252, 229, 213, 23, 33, 4, + 1, 213, 20, 2, 252, 229, 213, 23, 33, 6, 1, 236, 42, 213, 51, 33, 4, 1, + 236, 42, 213, 51, 33, 6, 1, 223, 236, 212, 204, 33, 4, 1, 223, 236, 212, + 204, 33, 6, 1, 236, 42, 63, 33, 4, 1, 236, 42, 63, 33, 6, 1, 250, 60, + 233, 62, 212, 175, 33, 4, 1, 250, 60, 233, 62, 212, 175, 33, 6, 1, 252, + 6, 212, 175, 33, 4, 1, 252, 6, 212, 175, 33, 6, 1, 236, 42, 250, 60, 233, + 62, 212, 175, 33, 4, 1, 236, 42, 250, 60, 233, 62, 212, 175, 33, 6, 1, + 212, 238, 33, 4, 1, 212, 238, 33, 6, 1, 223, 236, 216, 149, 33, 4, 1, + 223, 236, 216, 149, 33, 6, 1, 219, 255, 248, 162, 33, 4, 1, 219, 255, + 248, 162, 33, 6, 1, 219, 255, 245, 252, 33, 4, 1, 219, 255, 245, 252, 33, + 6, 1, 219, 255, 245, 238, 33, 4, 1, 219, 255, 245, 238, 33, 6, 1, 231, + 28, 78, 33, 4, 1, 231, 28, 78, 33, 6, 1, 252, 32, 78, 33, 4, 1, 252, 32, + 78, 33, 6, 1, 52, 231, 28, 78, 33, 4, 1, 52, 231, 28, 78, 33, 1, 230, + 226, 78, 38, 33, 214, 87, 38, 33, 217, 214, 231, 74, 53, 38, 33, 241, 63, + 231, 74, 53, 38, 33, 217, 114, 231, 74, 53, 220, 40, 254, 3, 38, 33, 235, + 54, 38, 33, 226, 137, 33, 235, 54, 33, 226, 137, 33, 6, 1, 246, 122, 33, + 4, 1, 246, 122, 33, 6, 1, 246, 103, 33, 4, 1, 246, 103, 33, 6, 1, 212, + 45, 33, 4, 1, 212, 45, 33, 6, 1, 251, 7, 33, 4, 1, 251, 7, 33, 6, 1, 246, + 102, 33, 4, 1, 246, 102, 33, 6, 1, 217, 243, 2, 231, 107, 102, 33, 4, 1, + 217, 243, 2, 231, 107, 102, 33, 6, 1, 216, 50, 33, 4, 1, 216, 50, 33, 6, + 1, 216, 132, 33, 4, 1, 216, 132, 33, 6, 1, 216, 136, 33, 4, 1, 216, 136, + 33, 6, 1, 217, 248, 33, 4, 1, 217, 248, 33, 6, 1, 241, 51, 33, 4, 1, 241, + 51, 33, 6, 1, 220, 151, 33, 4, 1, 220, 151, 20, 1, 63, 20, 1, 183, 20, 1, + 72, 20, 1, 234, 81, 20, 1, 246, 30, 20, 1, 224, 35, 20, 1, 218, 49, 20, + 1, 78, 20, 1, 228, 49, 20, 1, 75, 20, 1, 233, 255, 20, 1, 195, 20, 1, + 223, 170, 20, 1, 223, 216, 20, 1, 233, 171, 20, 1, 231, 214, 20, 1, 218, + 63, 20, 1, 230, 37, 20, 1, 229, 78, 20, 1, 184, 20, 1, 218, 219, 20, 1, + 230, 242, 20, 1, 220, 228, 20, 1, 220, 136, 20, 1, 220, 238, 20, 1, 221, + 67, 20, 1, 234, 19, 20, 1, 235, 18, 20, 1, 228, 107, 20, 1, 228, 135, 20, + 1, 229, 49, 20, 1, 212, 218, 20, 1, 220, 170, 20, 1, 212, 179, 20, 1, + 189, 20, 1, 228, 163, 20, 1, 235, 4, 20, 1, 226, 63, 20, 1, 229, 71, 20, + 1, 228, 144, 20, 1, 225, 66, 20, 1, 213, 183, 20, 1, 226, 122, 20, 1, + 244, 236, 20, 1, 223, 77, 20, 1, 232, 230, 20, 1, 231, 112, 20, 1, 229, + 128, 20, 1, 223, 238, 20, 1, 224, 96, 20, 1, 235, 27, 20, 1, 229, 158, + 20, 1, 229, 206, 20, 1, 229, 226, 20, 1, 220, 208, 20, 1, 225, 69, 20, 1, + 244, 69, 20, 1, 244, 126, 20, 1, 214, 52, 20, 1, 207, 20, 1, 233, 111, + 20, 1, 226, 20, 20, 1, 232, 248, 20, 1, 234, 148, 20, 1, 231, 247, 20, 1, + 224, 11, 20, 1, 231, 192, 20, 1, 191, 20, 1, 217, 84, 20, 1, 234, 212, + 20, 1, 231, 45, 20, 1, 231, 255, 20, 1, 217, 196, 20, 1, 234, 115, 20, 1, + 217, 213, 20, 1, 228, 136, 20, 1, 222, 190, 20, 1, 245, 25, 20, 1, 234, + 117, 20, 1, 234, 144, 20, 38, 156, 234, 125, 20, 38, 156, 216, 82, 20, + 229, 77, 20, 244, 64, 219, 83, 20, 250, 30, 20, 250, 23, 20, 221, 93, 20, + 224, 193, 79, 59, 1, 250, 156, 161, 212, 246, 225, 229, 59, 1, 250, 156, + 161, 213, 61, 225, 229, 59, 1, 250, 156, 161, 212, 246, 221, 29, 59, 1, + 250, 156, 161, 213, 61, 221, 29, 59, 1, 250, 156, 161, 212, 246, 224, + 210, 59, 1, 250, 156, 161, 213, 61, 224, 210, 59, 1, 250, 156, 161, 212, + 246, 223, 77, 59, 1, 250, 156, 161, 213, 61, 223, 77, 59, 1, 245, 109, + 246, 193, 161, 134, 59, 1, 127, 246, 193, 161, 134, 59, 1, 231, 108, 246, + 193, 161, 134, 59, 1, 117, 246, 193, 161, 134, 59, 1, 245, 108, 246, 193, + 161, 134, 59, 1, 245, 109, 246, 193, 233, 161, 161, 134, 59, 1, 127, 246, + 193, 233, 161, 161, 134, 59, 1, 231, 108, 246, 193, 233, 161, 161, 134, + 59, 1, 117, 246, 193, 233, 161, 161, 134, 59, 1, 245, 108, 246, 193, 233, + 161, 161, 134, 59, 1, 245, 109, 233, 161, 161, 134, 59, 1, 127, 233, 161, + 161, 134, 59, 1, 231, 108, 233, 161, 161, 134, 59, 1, 117, 233, 161, 161, + 134, 59, 1, 245, 108, 233, 161, 161, 134, 59, 1, 62, 66, 134, 59, 1, 62, + 220, 42, 59, 1, 62, 201, 134, 59, 1, 232, 237, 47, 249, 223, 254, 145, + 59, 1, 224, 83, 116, 71, 59, 1, 224, 83, 121, 71, 59, 1, 224, 83, 245, + 119, 79, 59, 1, 224, 83, 236, 52, 245, 119, 79, 59, 1, 117, 236, 52, 245, + 119, 79, 59, 1, 219, 65, 22, 127, 216, 254, 59, 1, 219, 65, 22, 117, 216, + 254, 7, 6, 1, 246, 21, 254, 205, 7, 4, 1, 246, 21, 254, 205, 7, 6, 1, + 246, 21, 254, 231, 7, 4, 1, 246, 21, 254, 231, 7, 6, 1, 242, 54, 7, 4, 1, + 242, 54, 7, 6, 1, 216, 13, 7, 4, 1, 216, 13, 7, 6, 1, 216, 200, 7, 4, 1, + 216, 200, 7, 6, 1, 249, 174, 7, 4, 1, 249, 174, 7, 6, 1, 249, 175, 2, + 250, 23, 7, 4, 1, 249, 175, 2, 250, 23, 7, 1, 4, 6, 245, 95, 7, 1, 4, 6, + 196, 7, 6, 1, 255, 104, 7, 4, 1, 255, 104, 7, 6, 1, 254, 111, 7, 4, 1, + 254, 111, 7, 6, 1, 253, 235, 7, 4, 1, 253, 235, 7, 6, 1, 253, 219, 7, 4, + 1, 253, 219, 7, 6, 1, 253, 220, 2, 201, 134, 7, 4, 1, 253, 220, 2, 201, + 134, 7, 6, 1, 253, 210, 7, 4, 1, 253, 210, 7, 6, 1, 223, 236, 251, 122, + 2, 247, 195, 7, 4, 1, 223, 236, 251, 122, 2, 247, 195, 7, 6, 1, 235, 142, + 2, 91, 7, 4, 1, 235, 142, 2, 91, 7, 6, 1, 235, 142, 2, 248, 72, 91, 7, 4, + 1, 235, 142, 2, 248, 72, 91, 7, 6, 1, 235, 142, 2, 219, 59, 22, 248, 72, + 91, 7, 4, 1, 235, 142, 2, 219, 59, 22, 248, 72, 91, 7, 6, 1, 251, 188, + 155, 7, 4, 1, 251, 188, 155, 7, 6, 1, 234, 13, 2, 127, 91, 7, 4, 1, 234, + 13, 2, 127, 91, 7, 6, 1, 141, 2, 187, 219, 59, 227, 26, 7, 4, 1, 141, 2, + 187, 219, 59, 227, 26, 7, 6, 1, 141, 2, 232, 251, 7, 4, 1, 141, 2, 232, + 251, 7, 6, 1, 227, 86, 7, 4, 1, 227, 86, 7, 6, 1, 227, 12, 2, 219, 59, + 217, 106, 248, 111, 7, 4, 1, 227, 12, 2, 219, 59, 217, 106, 248, 111, 7, + 6, 1, 227, 12, 2, 244, 142, 7, 4, 1, 227, 12, 2, 244, 142, 7, 6, 1, 227, + 12, 2, 219, 180, 218, 40, 7, 4, 1, 227, 12, 2, 219, 180, 218, 40, 7, 6, + 1, 225, 20, 2, 219, 59, 217, 106, 248, 111, 7, 4, 1, 225, 20, 2, 219, 59, + 217, 106, 248, 111, 7, 6, 1, 225, 20, 2, 248, 72, 91, 7, 4, 1, 225, 20, + 2, 248, 72, 91, 7, 6, 1, 224, 148, 223, 122, 7, 4, 1, 224, 148, 223, 122, + 7, 6, 1, 223, 67, 223, 122, 7, 4, 1, 223, 67, 223, 122, 7, 6, 1, 215, 86, + 2, 248, 72, 91, 7, 4, 1, 215, 86, 2, 248, 72, 91, 7, 6, 1, 214, 93, 7, 4, + 1, 214, 93, 7, 6, 1, 214, 130, 212, 152, 7, 4, 1, 214, 130, 212, 152, 7, + 6, 1, 217, 118, 2, 91, 7, 4, 1, 217, 118, 2, 91, 7, 6, 1, 217, 118, 2, + 219, 59, 217, 106, 248, 111, 7, 4, 1, 217, 118, 2, 219, 59, 217, 106, + 248, 111, 7, 6, 1, 214, 227, 7, 4, 1, 214, 227, 7, 6, 1, 245, 151, 7, 4, + 1, 245, 151, 7, 6, 1, 236, 30, 7, 4, 1, 236, 30, 7, 6, 1, 250, 12, 7, 4, + 1, 250, 12, 59, 1, 215, 110, 7, 4, 1, 246, 145, 7, 4, 1, 232, 216, 7, 4, + 1, 230, 220, 7, 4, 1, 228, 100, 7, 4, 1, 223, 66, 7, 1, 4, 6, 223, 66, 7, + 4, 1, 216, 80, 7, 4, 1, 215, 173, 7, 6, 1, 236, 71, 249, 125, 7, 4, 1, + 236, 71, 249, 125, 7, 6, 1, 236, 71, 245, 95, 7, 4, 1, 236, 71, 245, 95, + 7, 6, 1, 236, 71, 244, 41, 7, 6, 1, 216, 66, 236, 71, 244, 41, 7, 4, 1, + 216, 66, 236, 71, 244, 41, 7, 6, 1, 216, 66, 155, 7, 4, 1, 216, 66, 155, + 7, 6, 1, 236, 71, 152, 7, 4, 1, 236, 71, 152, 7, 6, 1, 236, 71, 196, 7, + 4, 1, 236, 71, 196, 7, 6, 1, 236, 71, 218, 113, 7, 4, 1, 236, 71, 218, + 113, 59, 1, 117, 250, 91, 255, 46, 59, 1, 250, 30, 59, 1, 220, 196, 245, + 182, 53, 7, 6, 1, 222, 194, 7, 4, 1, 222, 194, 7, 6, 1, 216, 66, 242, + 162, 7, 4, 1, 234, 13, 2, 223, 241, 241, 157, 22, 252, 88, 7, 6, 1, 230, + 167, 2, 248, 111, 7, 4, 1, 230, 167, 2, 248, 111, 7, 6, 1, 244, 42, 2, + 227, 149, 91, 7, 4, 1, 244, 42, 2, 227, 149, 91, 7, 6, 1, 235, 142, 2, + 227, 149, 91, 7, 4, 1, 235, 142, 2, 227, 149, 91, 7, 6, 1, 230, 167, 2, + 227, 149, 91, 7, 4, 1, 230, 167, 2, 227, 149, 91, 7, 6, 1, 224, 148, 2, + 227, 149, 91, 7, 4, 1, 224, 148, 2, 227, 149, 91, 7, 6, 1, 223, 29, 2, + 227, 149, 91, 7, 4, 1, 223, 29, 2, 227, 149, 91, 7, 1, 4, 6, 216, 66, + 184, 7, 245, 187, 1, 223, 236, 245, 95, 7, 245, 187, 1, 223, 236, 227, + 11, 7, 245, 187, 1, 236, 52, 184, 7, 245, 187, 1, 241, 7, 233, 0, 7, 245, + 187, 1, 254, 64, 184, 218, 189, 230, 101, 1, 63, 218, 189, 230, 101, 1, + 75, 218, 189, 230, 101, 5, 246, 124, 218, 189, 230, 101, 1, 72, 218, 189, + 230, 101, 1, 77, 218, 189, 230, 101, 1, 78, 218, 189, 230, 101, 5, 242, + 100, 218, 189, 230, 101, 1, 234, 148, 218, 189, 230, 101, 1, 234, 224, + 218, 189, 230, 101, 1, 243, 14, 218, 189, 230, 101, 1, 243, 64, 218, 189, + 230, 101, 5, 254, 113, 218, 189, 230, 101, 1, 250, 42, 218, 189, 230, + 101, 1, 250, 146, 218, 189, 230, 101, 1, 235, 185, 218, 189, 230, 101, 1, + 235, 226, 218, 189, 230, 101, 1, 216, 105, 218, 189, 230, 101, 1, 216, + 111, 218, 189, 230, 101, 1, 248, 177, 218, 189, 230, 101, 1, 248, 186, + 218, 189, 230, 101, 1, 109, 218, 189, 230, 101, 1, 217, 122, 218, 189, + 230, 101, 1, 247, 220, 218, 189, 230, 101, 1, 248, 80, 218, 189, 230, + 101, 1, 228, 228, 218, 189, 230, 101, 1, 225, 186, 218, 189, 230, 101, 1, + 226, 33, 218, 189, 230, 101, 1, 251, 253, 218, 189, 230, 101, 1, 252, 58, + 218, 189, 230, 101, 1, 231, 45, 218, 189, 230, 101, 1, 223, 146, 218, + 189, 230, 101, 1, 233, 26, 218, 189, 230, 101, 1, 223, 101, 218, 189, + 230, 101, 1, 220, 5, 218, 189, 230, 101, 1, 241, 173, 218, 189, 230, 101, + 30, 5, 63, 218, 189, 230, 101, 30, 5, 75, 218, 189, 230, 101, 30, 5, 72, + 218, 189, 230, 101, 30, 5, 77, 218, 189, 230, 101, 30, 5, 227, 86, 218, + 189, 230, 101, 225, 182, 232, 36, 218, 189, 230, 101, 225, 182, 232, 35, + 218, 189, 230, 101, 225, 182, 232, 34, 218, 189, 230, 101, 225, 182, 232, + 33, 228, 210, 236, 98, 244, 92, 124, 224, 201, 228, 210, 236, 98, 244, + 92, 124, 242, 129, 228, 210, 236, 98, 244, 92, 137, 224, 199, 228, 210, + 236, 98, 244, 92, 124, 220, 64, 228, 210, 236, 98, 244, 92, 124, 246, 10, + 228, 210, 236, 98, 244, 92, 137, 220, 63, 228, 210, 236, 98, 224, 202, + 79, 228, 210, 236, 98, 225, 208, 79, 228, 210, 236, 98, 223, 55, 79, 228, + 210, 236, 98, 224, 203, 79, 226, 56, 1, 183, 226, 56, 1, 234, 250, 226, + 56, 1, 243, 230, 226, 56, 1, 229, 226, 226, 56, 1, 251, 88, 226, 56, 1, + 250, 215, 226, 56, 1, 236, 0, 226, 56, 1, 228, 64, 226, 56, 1, 218, 66, + 226, 56, 1, 217, 174, 226, 56, 1, 249, 30, 226, 56, 1, 207, 226, 56, 1, + 195, 226, 56, 1, 226, 59, 226, 56, 1, 252, 234, 226, 56, 1, 191, 226, 56, + 1, 216, 154, 226, 56, 1, 216, 146, 226, 56, 1, 246, 114, 226, 56, 1, 214, + 52, 226, 56, 1, 212, 75, 226, 56, 1, 212, 109, 226, 56, 1, 4, 63, 226, + 56, 1, 189, 226, 56, 1, 208, 226, 56, 1, 233, 255, 226, 56, 1, 221, 47, + 226, 56, 1, 222, 227, 226, 56, 1, 162, 226, 56, 1, 63, 226, 56, 1, 75, + 226, 56, 1, 72, 226, 56, 1, 77, 226, 56, 1, 78, 226, 56, 1, 225, 11, 226, + 56, 1, 213, 156, 226, 56, 1, 245, 29, 226, 56, 1, 243, 125, 226, 56, 1, + 246, 30, 226, 56, 219, 32, 1, 214, 52, 226, 56, 219, 32, 1, 189, 226, 56, + 1, 216, 128, 226, 56, 1, 216, 116, 226, 56, 1, 248, 207, 226, 56, 1, 229, + 6, 226, 56, 1, 254, 177, 189, 226, 56, 1, 214, 119, 221, 47, 226, 56, 1, + 214, 120, 162, 226, 56, 1, 254, 9, 245, 29, 226, 56, 219, 32, 1, 208, + 226, 56, 218, 239, 1, 208, 226, 56, 1, 251, 55, 226, 56, 220, 100, 242, + 83, 79, 226, 56, 52, 242, 83, 79, 226, 56, 156, 221, 40, 226, 56, 156, + 52, 221, 40, 173, 5, 254, 113, 173, 5, 214, 132, 173, 1, 63, 173, 1, 255, + 104, 173, 1, 75, 173, 1, 236, 145, 173, 1, 72, 173, 1, 215, 98, 173, 1, + 165, 152, 173, 1, 165, 223, 116, 173, 1, 165, 155, 173, 1, 165, 233, 55, + 173, 1, 77, 173, 1, 246, 30, 173, 1, 254, 236, 173, 1, 78, 173, 1, 227, + 86, 173, 1, 253, 235, 173, 1, 183, 173, 1, 234, 250, 173, 1, 243, 230, + 173, 1, 243, 89, 173, 1, 229, 226, 173, 1, 251, 88, 173, 1, 250, 215, + 173, 1, 236, 0, 173, 1, 235, 230, 173, 1, 228, 64, 173, 1, 216, 128, 173, + 1, 216, 116, 173, 1, 248, 207, 173, 1, 248, 191, 173, 1, 229, 6, 173, 1, + 218, 66, 173, 1, 217, 174, 173, 1, 249, 30, 173, 1, 248, 97, 173, 1, 207, + 173, 1, 195, 173, 1, 226, 59, 173, 1, 252, 234, 173, 1, 252, 65, 173, 1, + 191, 173, 1, 189, 173, 1, 208, 173, 1, 233, 255, 173, 1, 215, 8, 173, 1, + 221, 47, 173, 1, 219, 176, 173, 1, 222, 227, 173, 1, 162, 173, 1, 233, + 54, 173, 120, 5, 242, 146, 173, 30, 5, 255, 104, 173, 30, 5, 75, 173, 30, + 5, 236, 145, 173, 30, 5, 72, 173, 30, 5, 215, 98, 173, 30, 5, 165, 152, + 173, 30, 5, 165, 223, 116, 173, 30, 5, 165, 155, 173, 30, 5, 165, 233, + 55, 173, 30, 5, 77, 173, 30, 5, 246, 30, 173, 30, 5, 254, 236, 173, 30, + 5, 78, 173, 30, 5, 227, 86, 173, 30, 5, 253, 235, 173, 5, 214, 137, 173, + 248, 245, 173, 52, 248, 245, 173, 21, 212, 79, 173, 21, 118, 173, 21, + 112, 173, 21, 170, 173, 21, 167, 173, 21, 185, 173, 21, 192, 173, 21, + 200, 173, 21, 198, 173, 21, 203, 38, 84, 21, 212, 79, 38, 84, 21, 118, + 38, 84, 21, 112, 38, 84, 21, 170, 38, 84, 21, 167, 38, 84, 21, 185, 38, + 84, 21, 192, 38, 84, 21, 200, 38, 84, 21, 198, 38, 84, 21, 203, 38, 84, + 1, 63, 38, 84, 1, 72, 38, 84, 1, 183, 38, 84, 1, 207, 38, 84, 1, 195, 38, + 84, 1, 208, 38, 84, 1, 214, 159, 38, 84, 5, 253, 218, 84, 5, 219, 224, + 251, 55, 84, 5, 251, 56, 214, 137, 84, 5, 52, 251, 56, 214, 137, 84, 5, + 251, 56, 112, 84, 5, 251, 56, 170, 84, 5, 251, 56, 253, 218, 84, 5, 225, + 47, 84, 243, 196, 244, 192, 84, 251, 38, 84, 242, 77, 235, 50, 233, 112, + 21, 212, 79, 235, 50, 233, 112, 21, 118, 235, 50, 233, 112, 21, 112, 235, + 50, 233, 112, 21, 170, 235, 50, 233, 112, 21, 167, 235, 50, 233, 112, 21, + 185, 235, 50, 233, 112, 21, 192, 235, 50, 233, 112, 21, 200, 235, 50, + 233, 112, 21, 198, 235, 50, 233, 112, 21, 203, 235, 50, 233, 112, 1, 183, + 235, 50, 233, 112, 1, 234, 250, 235, 50, 233, 112, 1, 243, 230, 235, 50, + 233, 112, 1, 229, 226, 235, 50, 233, 112, 1, 222, 227, 235, 50, 233, 112, + 1, 221, 47, 235, 50, 233, 112, 1, 212, 109, 235, 50, 233, 112, 1, 228, + 64, 235, 50, 233, 112, 1, 218, 66, 235, 50, 233, 112, 1, 241, 76, 235, + 50, 233, 112, 1, 207, 235, 50, 233, 112, 1, 195, 235, 50, 233, 112, 1, + 226, 59, 235, 50, 233, 112, 1, 191, 235, 50, 233, 112, 1, 249, 30, 235, + 50, 233, 112, 1, 252, 234, 235, 50, 233, 112, 1, 208, 235, 50, 233, 112, + 1, 189, 235, 50, 233, 112, 1, 233, 255, 235, 50, 233, 112, 1, 214, 52, + 235, 50, 233, 112, 1, 217, 174, 235, 50, 233, 112, 1, 162, 235, 50, 233, + 112, 1, 215, 8, 235, 50, 233, 112, 1, 251, 88, 235, 50, 233, 112, 1, 63, + 235, 50, 233, 112, 1, 227, 136, 235, 50, 233, 112, 1, 75, 235, 50, 233, + 112, 1, 227, 86, 235, 50, 233, 112, 30, 215, 189, 235, 50, 233, 112, 30, + 77, 235, 50, 233, 112, 30, 72, 235, 50, 233, 112, 30, 246, 30, 235, 50, + 233, 112, 30, 78, 235, 50, 233, 112, 161, 225, 199, 235, 50, 233, 112, + 161, 251, 68, 235, 50, 233, 112, 161, 251, 69, 225, 199, 235, 50, 233, + 112, 5, 249, 142, 235, 50, 233, 112, 5, 220, 144, 224, 21, 1, 183, 224, + 21, 1, 243, 230, 224, 21, 1, 229, 226, 224, 21, 1, 218, 66, 224, 21, 1, + 249, 30, 224, 21, 1, 207, 224, 21, 1, 195, 224, 21, 1, 252, 234, 224, 21, + 1, 191, 224, 21, 1, 251, 88, 224, 21, 1, 236, 0, 224, 21, 1, 228, 64, + 224, 21, 1, 222, 227, 224, 21, 1, 208, 224, 21, 1, 233, 255, 224, 21, 1, + 189, 224, 21, 1, 214, 52, 224, 21, 1, 162, 224, 21, 1, 232, 1, 224, 21, + 1, 229, 206, 224, 21, 1, 230, 39, 224, 21, 1, 228, 36, 224, 21, 1, 63, + 224, 21, 30, 5, 75, 224, 21, 30, 5, 72, 224, 21, 30, 5, 77, 224, 21, 30, + 5, 254, 236, 224, 21, 30, 5, 78, 224, 21, 30, 5, 253, 235, 224, 21, 30, + 5, 245, 143, 224, 21, 30, 5, 246, 54, 224, 21, 120, 5, 229, 228, 224, 21, + 120, 5, 206, 224, 21, 120, 5, 152, 224, 21, 120, 5, 242, 162, 224, 21, + 214, 137, 224, 21, 222, 115, 79, 24, 98, 217, 64, 24, 98, 217, 63, 24, + 98, 217, 61, 24, 98, 217, 66, 24, 98, 223, 208, 24, 98, 223, 192, 24, 98, + 223, 187, 24, 98, 223, 189, 24, 98, 223, 205, 24, 98, 223, 198, 24, 98, + 223, 191, 24, 98, 223, 210, 24, 98, 223, 193, 24, 98, 223, 212, 24, 98, + 223, 209, 24, 98, 231, 96, 24, 98, 231, 87, 24, 98, 231, 90, 24, 98, 225, + 248, 24, 98, 226, 3, 24, 98, 226, 4, 24, 98, 219, 160, 24, 98, 236, 158, + 24, 98, 236, 165, 24, 98, 219, 171, 24, 98, 219, 158, 24, 98, 226, 42, + 24, 98, 242, 16, 24, 98, 219, 155, 148, 5, 226, 192, 148, 5, 250, 244, + 148, 5, 233, 188, 148, 5, 213, 231, 148, 1, 63, 148, 1, 241, 7, 235, 53, + 148, 1, 75, 148, 1, 236, 145, 148, 1, 72, 148, 1, 226, 252, 250, 220, + 148, 1, 229, 227, 233, 150, 148, 1, 229, 227, 233, 151, 224, 69, 148, 1, + 77, 148, 1, 254, 236, 148, 1, 78, 148, 1, 183, 148, 1, 235, 131, 222, + 168, 148, 1, 235, 131, 230, 206, 148, 1, 243, 230, 148, 1, 243, 231, 230, + 206, 148, 1, 229, 226, 148, 1, 251, 88, 148, 1, 251, 89, 230, 206, 148, + 1, 236, 0, 148, 1, 228, 65, 230, 206, 148, 1, 236, 1, 232, 85, 148, 1, + 228, 64, 148, 1, 216, 128, 148, 1, 216, 129, 232, 85, 148, 1, 248, 207, + 148, 1, 248, 208, 232, 85, 148, 1, 230, 115, 230, 206, 148, 1, 218, 66, + 148, 1, 218, 67, 230, 206, 148, 1, 249, 30, 148, 1, 249, 31, 232, 85, + 148, 1, 207, 148, 1, 195, 148, 1, 226, 252, 230, 206, 148, 1, 252, 234, + 148, 1, 252, 235, 230, 206, 148, 1, 191, 148, 1, 189, 148, 1, 208, 148, + 1, 224, 112, 254, 243, 148, 1, 233, 255, 148, 1, 214, 52, 148, 1, 222, + 228, 230, 206, 148, 1, 222, 228, 232, 85, 148, 1, 222, 227, 148, 1, 162, + 148, 5, 250, 245, 217, 216, 148, 30, 5, 218, 11, 148, 30, 5, 217, 3, 148, + 30, 5, 213, 181, 148, 30, 5, 213, 182, 231, 203, 148, 30, 5, 219, 6, 148, + 30, 5, 219, 7, 231, 191, 148, 30, 5, 218, 29, 148, 30, 5, 248, 11, 230, + 205, 148, 30, 5, 226, 95, 148, 120, 5, 235, 20, 148, 120, 5, 226, 107, + 148, 120, 5, 251, 75, 148, 226, 204, 148, 43, 223, 255, 148, 47, 223, + 255, 148, 226, 241, 254, 153, 148, 226, 241, 232, 102, 148, 226, 241, + 232, 220, 148, 226, 241, 213, 226, 148, 226, 241, 226, 205, 148, 226, + 241, 233, 75, 148, 226, 241, 232, 214, 148, 226, 241, 255, 26, 148, 226, + 241, 255, 27, 255, 26, 148, 226, 241, 225, 219, 148, 216, 66, 226, 241, + 225, 219, 148, 226, 201, 148, 21, 212, 79, 148, 21, 118, 148, 21, 112, + 148, 21, 170, 148, 21, 167, 148, 21, 185, 148, 21, 192, 148, 21, 200, + 148, 21, 198, 148, 21, 203, 148, 226, 241, 217, 36, 216, 78, 148, 226, + 241, 236, 26, 166, 1, 63, 166, 1, 75, 166, 1, 72, 166, 1, 77, 166, 1, + 254, 236, 166, 1, 78, 166, 1, 183, 166, 1, 234, 250, 166, 1, 243, 230, + 166, 1, 243, 89, 166, 1, 229, 140, 166, 1, 229, 226, 166, 1, 250, 215, + 166, 1, 250, 172, 166, 1, 236, 0, 166, 1, 235, 230, 166, 1, 229, 130, + 166, 1, 229, 132, 166, 1, 229, 131, 166, 1, 218, 66, 166, 1, 217, 174, + 166, 1, 249, 30, 166, 1, 248, 97, 166, 1, 228, 105, 166, 1, 207, 166, 1, + 248, 207, 166, 1, 195, 166, 1, 225, 136, 166, 1, 226, 59, 166, 1, 252, + 234, 166, 1, 252, 65, 166, 1, 230, 235, 166, 1, 191, 166, 1, 252, 157, + 166, 1, 189, 166, 1, 208, 166, 1, 233, 255, 166, 1, 215, 8, 166, 1, 219, + 176, 166, 1, 222, 227, 166, 1, 162, 166, 30, 5, 255, 104, 166, 30, 5, 75, + 166, 30, 5, 236, 145, 166, 30, 5, 246, 17, 166, 30, 5, 72, 166, 30, 5, + 227, 136, 166, 30, 5, 78, 166, 30, 5, 254, 236, 166, 30, 5, 253, 235, + 166, 30, 5, 215, 189, 166, 120, 5, 189, 166, 120, 5, 208, 166, 120, 5, + 233, 255, 166, 120, 5, 214, 52, 166, 1, 41, 235, 141, 166, 1, 41, 244, + 41, 166, 1, 41, 229, 228, 166, 120, 5, 41, 229, 228, 166, 1, 41, 250, + 216, 166, 1, 41, 218, 113, 166, 1, 41, 206, 166, 1, 41, 227, 11, 166, 1, + 41, 213, 108, 166, 1, 41, 152, 166, 1, 41, 155, 166, 1, 41, 219, 177, + 166, 120, 5, 41, 184, 166, 120, 5, 41, 242, 162, 166, 21, 212, 79, 166, + 21, 118, 166, 21, 112, 166, 21, 170, 166, 21, 167, 166, 21, 185, 166, 21, + 192, 166, 21, 200, 166, 21, 198, 166, 21, 203, 166, 225, 63, 219, 202, + 166, 225, 63, 248, 245, 166, 225, 63, 52, 248, 245, 166, 225, 63, 216, + 182, 248, 245, 65, 1, 234, 244, 243, 230, 65, 1, 234, 244, 251, 88, 65, + 1, 234, 244, 250, 215, 65, 1, 234, 244, 236, 0, 65, 1, 234, 244, 235, + 230, 65, 1, 234, 244, 228, 64, 65, 1, 234, 244, 216, 128, 65, 1, 234, + 244, 216, 116, 65, 1, 234, 244, 248, 207, 65, 1, 234, 244, 248, 191, 65, + 1, 234, 244, 248, 97, 65, 1, 234, 244, 207, 65, 1, 234, 244, 222, 227, + 65, 1, 234, 244, 162, 65, 1, 234, 244, 242, 37, 65, 1, 234, 244, 245, 29, + 65, 59, 1, 234, 244, 224, 36, 65, 1, 234, 244, 213, 156, 65, 1, 234, 244, + 212, 109, 65, 1, 234, 244, 208, 65, 233, 16, 234, 244, 227, 154, 65, 233, + 16, 234, 244, 224, 223, 65, 233, 16, 234, 244, 241, 226, 65, 16, 254, + 225, 245, 118, 65, 16, 254, 225, 118, 65, 16, 254, 225, 112, 65, 1, 254, + 225, 208, 65, 5, 226, 188, 235, 75, 216, 254, 39, 193, 1, 117, 234, 148, + 39, 193, 1, 127, 234, 148, 39, 193, 1, 117, 234, 224, 39, 193, 1, 127, + 234, 224, 39, 193, 1, 117, 234, 232, 39, 193, 1, 127, 234, 232, 39, 193, + 1, 117, 243, 14, 39, 193, 1, 127, 243, 14, 39, 193, 1, 117, 229, 155, 39, + 193, 1, 127, 229, 155, 39, 193, 1, 117, 250, 42, 39, 193, 1, 127, 250, + 42, 39, 193, 1, 117, 250, 146, 39, 193, 1, 127, 250, 146, 39, 193, 1, + 117, 220, 5, 39, 193, 1, 127, 220, 5, 39, 193, 1, 117, 228, 35, 39, 193, + 1, 127, 228, 35, 39, 193, 1, 117, 247, 220, 39, 193, 1, 127, 247, 220, + 39, 193, 1, 117, 109, 39, 193, 1, 127, 109, 39, 193, 1, 117, 217, 122, + 39, 193, 1, 127, 217, 122, 39, 193, 1, 117, 228, 228, 39, 193, 1, 127, + 228, 228, 39, 193, 1, 117, 251, 253, 39, 193, 1, 127, 251, 253, 39, 193, + 1, 117, 225, 186, 39, 193, 1, 127, 225, 186, 39, 193, 1, 117, 226, 33, + 39, 193, 1, 127, 226, 33, 39, 193, 1, 117, 244, 132, 39, 193, 1, 127, + 244, 132, 39, 193, 1, 117, 231, 45, 39, 193, 1, 127, 231, 45, 39, 193, 1, + 117, 212, 236, 39, 193, 1, 127, 212, 236, 39, 193, 1, 117, 223, 146, 39, + 193, 1, 127, 223, 146, 39, 193, 1, 117, 233, 26, 39, 193, 1, 127, 233, + 26, 39, 193, 1, 117, 214, 123, 39, 193, 1, 127, 214, 123, 39, 193, 1, + 117, 241, 173, 39, 193, 1, 127, 241, 173, 39, 193, 1, 117, 78, 39, 193, + 1, 127, 78, 39, 193, 232, 82, 235, 92, 39, 193, 30, 255, 104, 39, 193, + 30, 75, 39, 193, 30, 215, 189, 39, 193, 30, 72, 39, 193, 30, 77, 39, 193, + 30, 78, 39, 193, 232, 82, 234, 226, 39, 193, 30, 240, 228, 39, 193, 30, + 215, 188, 39, 193, 30, 215, 202, 39, 193, 30, 253, 233, 39, 193, 30, 253, + 210, 39, 193, 30, 254, 159, 39, 193, 30, 254, 172, 39, 193, 161, 232, 82, + 246, 2, 39, 193, 161, 232, 82, 228, 104, 39, 193, 161, 232, 82, 217, 122, + 39, 193, 161, 232, 82, 219, 247, 39, 193, 16, 234, 133, 39, 193, 16, 228, + 104, 39, 193, 16, 222, 192, 39, 193, 16, 241, 174, 241, 169, 39, 193, 16, + 234, 142, 234, 141, 28, 3, 216, 109, 28, 3, 216, 112, 28, 3, 216, 115, + 28, 3, 216, 113, 28, 3, 216, 114, 28, 3, 216, 111, 28, 3, 248, 185, 28, + 3, 248, 187, 28, 3, 248, 190, 28, 3, 248, 188, 28, 3, 248, 189, 28, 3, + 248, 186, 28, 3, 246, 104, 28, 3, 246, 107, 28, 3, 246, 113, 28, 3, 246, + 111, 28, 3, 246, 112, 28, 3, 246, 105, 28, 3, 251, 5, 28, 3, 250, 255, + 28, 3, 251, 1, 28, 3, 251, 4, 28, 3, 251, 2, 28, 3, 251, 3, 28, 3, 251, + 0, 28, 3, 252, 157, 28, 3, 252, 136, 28, 3, 252, 148, 28, 3, 252, 156, + 28, 3, 252, 151, 28, 3, 252, 152, 28, 3, 252, 140, 231, 210, 232, 8, 1, + 234, 139, 231, 210, 232, 8, 1, 222, 192, 231, 210, 232, 8, 1, 233, 231, + 231, 210, 232, 8, 1, 231, 55, 231, 210, 232, 8, 1, 195, 231, 210, 232, 8, + 1, 207, 231, 210, 232, 8, 1, 250, 162, 231, 210, 232, 8, 1, 217, 57, 231, + 210, 232, 8, 1, 234, 220, 231, 210, 232, 8, 1, 229, 145, 231, 210, 232, + 8, 1, 217, 116, 231, 210, 232, 8, 1, 214, 47, 231, 210, 232, 8, 1, 213, + 60, 231, 210, 232, 8, 1, 241, 68, 231, 210, 232, 8, 1, 215, 166, 231, + 210, 232, 8, 1, 75, 231, 210, 232, 8, 1, 226, 54, 231, 210, 232, 8, 1, + 253, 245, 231, 210, 232, 8, 1, 243, 7, 231, 210, 232, 8, 1, 235, 229, + 231, 210, 232, 8, 1, 224, 92, 231, 210, 232, 8, 1, 252, 234, 231, 210, + 232, 8, 1, 235, 217, 231, 210, 232, 8, 1, 248, 36, 231, 210, 232, 8, 1, + 243, 61, 231, 210, 232, 8, 1, 248, 78, 231, 210, 232, 8, 1, 252, 64, 231, + 210, 232, 8, 1, 234, 140, 232, 255, 231, 210, 232, 8, 1, 233, 232, 232, + 255, 231, 210, 232, 8, 1, 231, 56, 232, 255, 231, 210, 232, 8, 1, 226, + 252, 232, 255, 231, 210, 232, 8, 1, 230, 115, 232, 255, 231, 210, 232, 8, + 1, 217, 58, 232, 255, 231, 210, 232, 8, 1, 229, 146, 232, 255, 231, 210, + 232, 8, 1, 241, 7, 232, 255, 231, 210, 232, 8, 30, 5, 227, 98, 231, 210, + 232, 8, 30, 5, 236, 110, 231, 210, 232, 8, 30, 5, 254, 158, 231, 210, + 232, 8, 30, 5, 213, 30, 231, 210, 232, 8, 30, 5, 219, 238, 231, 210, 232, + 8, 30, 5, 215, 163, 231, 210, 232, 8, 30, 5, 250, 183, 231, 210, 232, 8, + 30, 5, 228, 90, 231, 210, 232, 8, 250, 184, 231, 210, 232, 8, 232, 217, + 236, 9, 231, 210, 232, 8, 254, 87, 236, 9, 231, 210, 232, 8, 21, 212, 79, + 231, 210, 232, 8, 21, 118, 231, 210, 232, 8, 21, 112, 231, 210, 232, 8, + 21, 170, 231, 210, 232, 8, 21, 167, 231, 210, 232, 8, 21, 185, 231, 210, + 232, 8, 21, 192, 231, 210, 232, 8, 21, 200, 231, 210, 232, 8, 21, 198, + 231, 210, 232, 8, 21, 203, 24, 139, 227, 234, 24, 139, 227, 239, 24, 139, + 212, 235, 24, 139, 212, 234, 24, 139, 212, 233, 24, 139, 215, 252, 24, + 139, 215, 255, 24, 139, 212, 202, 24, 139, 212, 198, 24, 139, 245, 142, + 24, 139, 245, 140, 24, 139, 245, 141, 24, 139, 245, 138, 24, 139, 240, + 253, 24, 139, 240, 252, 24, 139, 240, 250, 24, 139, 240, 251, 24, 139, + 241, 0, 24, 139, 240, 249, 24, 139, 240, 248, 24, 139, 241, 2, 24, 139, + 254, 74, 24, 139, 254, 73, 24, 90, 229, 114, 24, 90, 229, 120, 24, 90, + 219, 157, 24, 90, 219, 156, 24, 90, 217, 63, 24, 90, 217, 61, 24, 90, + 217, 60, 24, 90, 217, 66, 24, 90, 217, 67, 24, 90, 217, 59, 24, 90, 223, + 192, 24, 90, 223, 207, 24, 90, 219, 163, 24, 90, 223, 204, 24, 90, 223, + 194, 24, 90, 223, 196, 24, 90, 223, 183, 24, 90, 223, 184, 24, 90, 235, + 80, 24, 90, 231, 95, 24, 90, 231, 89, 24, 90, 219, 167, 24, 90, 231, 92, + 24, 90, 231, 98, 24, 90, 225, 244, 24, 90, 225, 253, 24, 90, 226, 1, 24, + 90, 219, 165, 24, 90, 225, 247, 24, 90, 226, 5, 24, 90, 226, 6, 24, 90, + 220, 87, 24, 90, 220, 90, 24, 90, 219, 161, 24, 90, 219, 159, 24, 90, + 220, 85, 24, 90, 220, 93, 24, 90, 220, 94, 24, 90, 220, 79, 24, 90, 220, + 92, 24, 90, 226, 195, 24, 90, 226, 196, 24, 90, 213, 16, 24, 90, 213, 17, + 24, 90, 250, 104, 24, 90, 250, 103, 24, 90, 219, 172, 24, 90, 226, 40, + 24, 90, 226, 39, 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, + 13, 238, 131, 9, 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, + 238, 127, 9, 13, 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, + 123, 9, 13, 238, 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, + 9, 13, 238, 118, 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, + 13, 238, 114, 9, 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, + 238, 110, 9, 13, 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, + 106, 9, 13, 238, 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, + 9, 13, 238, 101, 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, + 238, 97, 9, 13, 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, + 9, 13, 238, 92, 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, + 238, 88, 9, 13, 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, + 9, 13, 238, 83, 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, + 238, 79, 9, 13, 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, + 9, 13, 238, 74, 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, + 238, 70, 9, 13, 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, + 9, 13, 238, 65, 9, 13, 238, 64, 9, 13, 238, 63, 9, 13, 238, 62, 9, 13, + 238, 61, 9, 13, 238, 60, 9, 13, 238, 59, 9, 13, 238, 58, 9, 13, 238, 57, + 9, 13, 238, 56, 9, 13, 238, 55, 9, 13, 238, 54, 9, 13, 238, 53, 9, 13, + 238, 52, 9, 13, 238, 51, 9, 13, 238, 50, 9, 13, 238, 49, 9, 13, 238, 48, + 9, 13, 238, 47, 9, 13, 238, 46, 9, 13, 238, 45, 9, 13, 238, 44, 9, 13, + 238, 43, 9, 13, 238, 42, 9, 13, 238, 41, 9, 13, 238, 40, 9, 13, 238, 39, + 9, 13, 238, 38, 9, 13, 238, 37, 9, 13, 238, 36, 9, 13, 238, 35, 9, 13, + 238, 34, 9, 13, 238, 33, 9, 13, 238, 32, 9, 13, 238, 31, 9, 13, 238, 30, + 9, 13, 238, 29, 9, 13, 238, 28, 9, 13, 238, 27, 9, 13, 238, 26, 9, 13, + 238, 25, 9, 13, 238, 24, 9, 13, 238, 23, 9, 13, 238, 22, 9, 13, 238, 21, + 9, 13, 238, 20, 9, 13, 238, 19, 9, 13, 238, 18, 9, 13, 238, 17, 9, 13, + 238, 16, 9, 13, 238, 15, 9, 13, 238, 14, 9, 13, 238, 13, 9, 13, 238, 12, + 9, 13, 238, 11, 9, 13, 238, 10, 9, 13, 238, 9, 9, 13, 238, 8, 9, 13, 238, + 7, 9, 13, 238, 6, 9, 13, 238, 5, 9, 13, 238, 4, 9, 13, 238, 3, 9, 13, + 238, 2, 9, 13, 238, 1, 9, 13, 238, 0, 9, 13, 237, 255, 9, 13, 237, 254, + 9, 13, 237, 253, 9, 13, 237, 252, 9, 13, 237, 251, 9, 13, 237, 250, 9, + 13, 237, 249, 9, 13, 237, 248, 9, 13, 237, 247, 9, 13, 237, 246, 9, 13, + 237, 245, 9, 13, 237, 244, 9, 13, 237, 243, 9, 13, 237, 242, 9, 13, 237, + 241, 9, 13, 237, 240, 9, 13, 237, 239, 9, 13, 237, 238, 9, 13, 237, 237, + 9, 13, 237, 236, 9, 13, 237, 235, 9, 13, 237, 234, 9, 13, 237, 233, 9, + 13, 237, 232, 9, 13, 237, 231, 9, 13, 237, 230, 9, 13, 237, 229, 9, 13, + 237, 228, 9, 13, 237, 227, 9, 13, 237, 226, 9, 13, 237, 225, 9, 13, 237, + 224, 9, 13, 237, 223, 9, 13, 237, 222, 9, 13, 237, 221, 9, 13, 237, 220, + 9, 13, 237, 219, 9, 13, 237, 218, 9, 13, 237, 217, 9, 13, 237, 216, 9, + 13, 237, 215, 9, 13, 237, 214, 9, 13, 237, 213, 9, 13, 237, 212, 9, 13, + 237, 211, 9, 13, 237, 210, 9, 13, 237, 209, 9, 13, 237, 208, 9, 13, 237, + 207, 9, 13, 237, 206, 9, 13, 237, 205, 9, 13, 237, 204, 9, 13, 237, 203, + 9, 13, 237, 202, 9, 13, 237, 201, 9, 13, 237, 200, 9, 13, 237, 199, 9, + 13, 237, 198, 9, 13, 237, 197, 9, 13, 237, 196, 9, 13, 237, 195, 9, 13, + 237, 194, 9, 13, 237, 193, 9, 13, 237, 192, 9, 13, 237, 191, 9, 13, 237, + 190, 9, 13, 237, 189, 9, 13, 237, 188, 9, 13, 237, 187, 9, 13, 237, 186, + 9, 13, 237, 185, 9, 13, 237, 184, 9, 13, 237, 183, 9, 13, 237, 182, 9, + 13, 237, 181, 9, 13, 237, 180, 9, 13, 237, 179, 9, 13, 237, 178, 9, 13, + 237, 177, 9, 13, 237, 176, 9, 13, 237, 175, 9, 13, 237, 174, 9, 13, 237, + 173, 9, 13, 237, 172, 9, 13, 237, 171, 9, 13, 237, 170, 9, 13, 237, 169, + 9, 13, 237, 168, 9, 13, 237, 167, 9, 13, 237, 166, 9, 13, 237, 165, 9, + 13, 237, 164, 9, 13, 237, 163, 9, 13, 237, 162, 9, 13, 237, 161, 9, 13, + 237, 160, 9, 13, 237, 159, 9, 13, 237, 158, 9, 13, 237, 157, 9, 13, 237, + 156, 9, 13, 237, 155, 9, 13, 237, 154, 9, 13, 237, 153, 9, 13, 237, 152, + 9, 13, 237, 151, 9, 13, 237, 150, 9, 13, 237, 149, 9, 13, 237, 148, 9, + 13, 237, 147, 9, 13, 237, 146, 9, 13, 237, 145, 9, 13, 237, 144, 9, 13, + 237, 143, 9, 13, 237, 142, 9, 13, 237, 141, 9, 13, 237, 140, 9, 13, 237, + 139, 9, 13, 237, 138, 9, 13, 237, 137, 9, 13, 237, 136, 9, 13, 237, 135, + 9, 13, 237, 134, 9, 13, 237, 133, 9, 13, 237, 132, 9, 13, 237, 131, 9, + 13, 237, 130, 9, 13, 237, 129, 9, 13, 237, 128, 9, 13, 237, 127, 9, 13, + 237, 126, 9, 13, 237, 125, 9, 13, 237, 124, 9, 13, 237, 123, 9, 13, 237, + 122, 9, 13, 237, 121, 9, 13, 237, 120, 9, 13, 237, 119, 9, 13, 237, 118, + 9, 13, 237, 117, 9, 13, 237, 116, 9, 13, 237, 115, 9, 13, 237, 114, 9, + 13, 237, 113, 9, 13, 237, 112, 9, 13, 237, 111, 9, 13, 237, 110, 9, 13, + 237, 109, 9, 13, 237, 108, 9, 13, 237, 107, 9, 13, 237, 106, 9, 13, 237, + 105, 9, 13, 237, 104, 9, 13, 237, 103, 9, 13, 237, 102, 9, 13, 237, 101, + 9, 13, 237, 100, 9, 13, 237, 99, 9, 13, 237, 98, 9, 13, 237, 97, 9, 13, + 237, 96, 9, 13, 237, 95, 9, 13, 237, 94, 9, 13, 237, 93, 9, 13, 237, 92, + 9, 13, 237, 91, 9, 13, 237, 90, 9, 13, 237, 89, 9, 13, 237, 88, 9, 13, + 237, 87, 9, 13, 237, 86, 9, 13, 237, 85, 9, 13, 237, 84, 9, 13, 237, 83, + 9, 13, 237, 82, 9, 13, 237, 81, 9, 13, 237, 80, 9, 13, 237, 79, 9, 13, + 237, 78, 9, 13, 237, 77, 9, 13, 237, 76, 9, 13, 237, 75, 9, 13, 237, 74, + 9, 13, 237, 73, 9, 13, 237, 72, 9, 13, 237, 71, 9, 13, 237, 70, 9, 13, + 237, 69, 9, 13, 237, 68, 9, 13, 237, 67, 9, 13, 237, 66, 9, 13, 237, 65, + 9, 13, 237, 64, 9, 13, 237, 63, 9, 13, 237, 62, 9, 13, 237, 61, 9, 13, + 237, 60, 9, 13, 237, 59, 9, 13, 237, 58, 9, 13, 237, 57, 9, 13, 237, 56, + 9, 13, 237, 55, 9, 13, 237, 54, 9, 13, 237, 53, 9, 13, 237, 52, 9, 13, + 237, 51, 9, 13, 237, 50, 9, 13, 237, 49, 9, 13, 237, 48, 9, 13, 237, 47, + 9, 13, 237, 46, 9, 13, 237, 45, 9, 13, 237, 44, 9, 13, 237, 43, 9, 13, + 237, 42, 9, 13, 237, 41, 9, 13, 237, 40, 9, 13, 237, 39, 9, 13, 237, 38, + 9, 13, 237, 37, 9, 13, 237, 36, 9, 13, 237, 35, 9, 13, 237, 34, 9, 13, + 237, 33, 9, 13, 237, 32, 9, 13, 237, 31, 9, 13, 237, 30, 9, 13, 237, 29, + 9, 13, 237, 28, 9, 13, 237, 27, 9, 13, 237, 26, 9, 13, 237, 25, 9, 13, + 237, 24, 9, 13, 237, 23, 9, 13, 237, 22, 9, 13, 237, 21, 9, 13, 237, 20, + 9, 13, 237, 19, 9, 13, 237, 18, 9, 13, 237, 17, 9, 13, 237, 16, 9, 13, + 237, 15, 9, 13, 237, 14, 9, 13, 237, 13, 9, 13, 237, 12, 9, 13, 237, 11, + 9, 13, 237, 10, 9, 13, 237, 9, 9, 13, 237, 8, 9, 13, 237, 7, 9, 13, 237, + 6, 9, 13, 237, 5, 9, 13, 237, 4, 9, 13, 237, 3, 9, 13, 237, 2, 9, 13, + 237, 1, 9, 13, 237, 0, 9, 13, 236, 255, 9, 13, 236, 254, 9, 13, 236, 253, + 9, 13, 236, 252, 9, 13, 236, 251, 9, 13, 236, 250, 9, 13, 236, 249, 9, + 13, 236, 248, 9, 13, 236, 247, 9, 13, 236, 246, 9, 13, 236, 245, 9, 13, + 236, 244, 9, 13, 236, 243, 9, 13, 236, 242, 9, 13, 236, 241, 9, 13, 236, + 240, 9, 13, 236, 239, 9, 13, 236, 238, 9, 13, 236, 237, 9, 13, 236, 236, + 9, 13, 236, 235, 9, 13, 236, 234, 9, 13, 236, 233, 9, 13, 236, 232, 9, + 13, 236, 231, 9, 13, 236, 230, 9, 13, 236, 229, 9, 13, 236, 228, 9, 13, + 236, 227, 9, 13, 236, 226, 9, 13, 236, 225, 9, 13, 236, 224, 9, 13, 236, + 223, 9, 13, 236, 222, 9, 13, 236, 221, 9, 13, 236, 220, 9, 13, 236, 219, + 9, 13, 236, 218, 9, 13, 236, 217, 9, 13, 236, 216, 9, 13, 236, 215, 9, + 13, 236, 214, 9, 13, 236, 213, 9, 13, 236, 212, 9, 13, 236, 211, 9, 13, + 236, 210, 9, 13, 236, 209, 9, 13, 236, 208, 9, 13, 236, 207, 9, 13, 236, + 206, 9, 13, 236, 205, 9, 13, 236, 204, 9, 13, 236, 203, 9, 13, 236, 202, + 9, 13, 236, 201, 9, 13, 236, 200, 9, 13, 236, 199, 9, 13, 236, 198, 9, + 13, 236, 197, 9, 13, 236, 196, 9, 13, 236, 195, 9, 13, 236, 194, 9, 13, + 236, 193, 9, 13, 236, 192, 9, 13, 236, 191, 9, 13, 236, 190, 9, 13, 236, + 189, 9, 13, 236, 188, 9, 13, 236, 187, 9, 13, 236, 186, 9, 13, 236, 185, + 9, 13, 236, 184, 9, 13, 236, 183, 9, 13, 236, 182, 9, 13, 236, 181, 9, + 13, 236, 180, 9, 13, 236, 179, 9, 13, 236, 178, 9, 13, 236, 177, 7, 4, + 26, 244, 214, 7, 4, 26, 244, 210, 7, 4, 26, 244, 165, 7, 4, 26, 244, 213, + 7, 4, 26, 244, 212, 7, 4, 26, 187, 223, 29, 218, 113, 7, 4, 26, 219, 121, + 146, 4, 26, 231, 193, 228, 193, 146, 4, 26, 231, 193, 246, 34, 146, 4, + 26, 231, 193, 236, 85, 146, 4, 26, 214, 162, 228, 193, 146, 4, 26, 231, + 193, 213, 151, 94, 1, 212, 226, 2, 242, 7, 94, 225, 181, 235, 167, 214, + 249, 94, 26, 212, 254, 212, 226, 212, 226, 226, 149, 94, 1, 254, 175, + 253, 205, 94, 1, 213, 235, 254, 205, 94, 1, 213, 235, 249, 0, 94, 1, 213, + 235, 242, 85, 94, 1, 213, 235, 235, 112, 94, 1, 213, 235, 233, 216, 94, + 1, 213, 235, 41, 231, 199, 94, 1, 213, 235, 223, 253, 94, 1, 213, 235, + 218, 2, 94, 1, 254, 175, 95, 53, 94, 1, 220, 222, 2, 220, 222, 247, 195, + 94, 1, 220, 222, 2, 220, 104, 247, 195, 94, 1, 220, 222, 2, 249, 17, 22, + 220, 222, 247, 195, 94, 1, 220, 222, 2, 249, 17, 22, 220, 104, 247, 195, + 94, 1, 108, 2, 226, 149, 94, 1, 108, 2, 224, 255, 94, 1, 108, 2, 232, 49, + 94, 1, 252, 76, 2, 249, 16, 94, 1, 243, 42, 2, 249, 16, 94, 1, 249, 1, 2, + 249, 16, 94, 1, 242, 86, 2, 232, 49, 94, 1, 214, 242, 2, 249, 16, 94, 1, + 212, 91, 2, 249, 16, 94, 1, 217, 197, 2, 249, 16, 94, 1, 212, 226, 2, + 249, 16, 94, 1, 41, 235, 113, 2, 249, 16, 94, 1, 235, 113, 2, 249, 16, + 94, 1, 233, 217, 2, 249, 16, 94, 1, 231, 200, 2, 249, 16, 94, 1, 228, 94, + 2, 249, 16, 94, 1, 222, 189, 2, 249, 16, 94, 1, 41, 226, 133, 2, 249, 16, + 94, 1, 226, 133, 2, 249, 16, 94, 1, 216, 151, 2, 249, 16, 94, 1, 224, + 220, 2, 249, 16, 94, 1, 223, 254, 2, 249, 16, 94, 1, 220, 222, 2, 249, + 16, 94, 1, 218, 3, 2, 249, 16, 94, 1, 214, 242, 2, 241, 166, 94, 1, 252, + 76, 2, 224, 94, 94, 1, 235, 113, 2, 224, 94, 94, 1, 226, 133, 2, 224, 94, + 94, 26, 108, 233, 216, 12, 1, 108, 214, 34, 49, 17, 12, 1, 108, 214, 34, + 41, 17, 12, 1, 252, 111, 49, 17, 12, 1, 252, 111, 41, 17, 12, 1, 252, + 111, 73, 17, 12, 1, 252, 111, 144, 17, 12, 1, 226, 117, 49, 17, 12, 1, + 226, 117, 41, 17, 12, 1, 226, 117, 73, 17, 12, 1, 226, 117, 144, 17, 12, + 1, 252, 99, 49, 17, 12, 1, 252, 99, 41, 17, 12, 1, 252, 99, 73, 17, 12, + 1, 252, 99, 144, 17, 12, 1, 216, 119, 49, 17, 12, 1, 216, 119, 41, 17, + 12, 1, 216, 119, 73, 17, 12, 1, 216, 119, 144, 17, 12, 1, 217, 227, 49, + 17, 12, 1, 217, 227, 41, 17, 12, 1, 217, 227, 73, 17, 12, 1, 217, 227, + 144, 17, 12, 1, 216, 121, 49, 17, 12, 1, 216, 121, 41, 17, 12, 1, 216, + 121, 73, 17, 12, 1, 216, 121, 144, 17, 12, 1, 214, 231, 49, 17, 12, 1, + 214, 231, 41, 17, 12, 1, 214, 231, 73, 17, 12, 1, 214, 231, 144, 17, 12, + 1, 226, 115, 49, 17, 12, 1, 226, 115, 41, 17, 12, 1, 226, 115, 73, 17, + 12, 1, 226, 115, 144, 17, 12, 1, 246, 120, 49, 17, 12, 1, 246, 120, 41, + 17, 12, 1, 246, 120, 73, 17, 12, 1, 246, 120, 144, 17, 12, 1, 228, 54, + 49, 17, 12, 1, 228, 54, 41, 17, 12, 1, 228, 54, 73, 17, 12, 1, 228, 54, + 144, 17, 12, 1, 217, 247, 49, 17, 12, 1, 217, 247, 41, 17, 12, 1, 217, + 247, 73, 17, 12, 1, 217, 247, 144, 17, 12, 1, 217, 245, 49, 17, 12, 1, + 217, 245, 41, 17, 12, 1, 217, 245, 73, 17, 12, 1, 217, 245, 144, 17, 12, + 1, 248, 205, 49, 17, 12, 1, 248, 205, 41, 17, 12, 1, 249, 13, 49, 17, 12, + 1, 249, 13, 41, 17, 12, 1, 246, 147, 49, 17, 12, 1, 246, 147, 41, 17, 12, + 1, 248, 203, 49, 17, 12, 1, 248, 203, 41, 17, 12, 1, 235, 237, 49, 17, + 12, 1, 235, 237, 41, 17, 12, 1, 223, 108, 49, 17, 12, 1, 223, 108, 41, + 17, 12, 1, 235, 37, 49, 17, 12, 1, 235, 37, 41, 17, 12, 1, 235, 37, 73, + 17, 12, 1, 235, 37, 144, 17, 12, 1, 243, 218, 49, 17, 12, 1, 243, 218, + 41, 17, 12, 1, 243, 218, 73, 17, 12, 1, 243, 218, 144, 17, 12, 1, 242, + 204, 49, 17, 12, 1, 242, 204, 41, 17, 12, 1, 242, 204, 73, 17, 12, 1, + 242, 204, 144, 17, 12, 1, 229, 154, 49, 17, 12, 1, 229, 154, 41, 17, 12, + 1, 229, 154, 73, 17, 12, 1, 229, 154, 144, 17, 12, 1, 228, 217, 243, 59, + 49, 17, 12, 1, 228, 217, 243, 59, 41, 17, 12, 1, 223, 150, 49, 17, 12, 1, + 223, 150, 41, 17, 12, 1, 223, 150, 73, 17, 12, 1, 223, 150, 144, 17, 12, + 1, 242, 66, 2, 76, 74, 49, 17, 12, 1, 242, 66, 2, 76, 74, 41, 17, 12, 1, + 242, 66, 243, 12, 49, 17, 12, 1, 242, 66, 243, 12, 41, 17, 12, 1, 242, + 66, 243, 12, 73, 17, 12, 1, 242, 66, 243, 12, 144, 17, 12, 1, 242, 66, + 247, 217, 49, 17, 12, 1, 242, 66, 247, 217, 41, 17, 12, 1, 242, 66, 247, + 217, 73, 17, 12, 1, 242, 66, 247, 217, 144, 17, 12, 1, 76, 252, 179, 49, + 17, 12, 1, 76, 252, 179, 41, 17, 12, 1, 76, 252, 179, 2, 194, 74, 49, 17, + 12, 1, 76, 252, 179, 2, 194, 74, 41, 17, 12, 16, 62, 50, 12, 16, 62, 55, + 12, 16, 119, 181, 50, 12, 16, 119, 181, 55, 12, 16, 137, 181, 50, 12, 16, + 137, 181, 55, 12, 16, 137, 181, 225, 177, 246, 179, 50, 12, 16, 137, 181, + 225, 177, 246, 179, 55, 12, 16, 244, 101, 181, 50, 12, 16, 244, 101, 181, + 55, 12, 16, 52, 66, 252, 187, 55, 12, 16, 119, 181, 214, 171, 50, 12, 16, + 119, 181, 214, 171, 55, 12, 16, 223, 164, 12, 16, 4, 218, 44, 50, 12, 16, + 4, 218, 44, 55, 12, 1, 229, 229, 49, 17, 12, 1, 229, 229, 41, 17, 12, 1, + 229, 229, 73, 17, 12, 1, 229, 229, 144, 17, 12, 1, 103, 49, 17, 12, 1, + 103, 41, 17, 12, 1, 227, 137, 49, 17, 12, 1, 227, 137, 41, 17, 12, 1, + 212, 205, 49, 17, 12, 1, 212, 205, 41, 17, 12, 1, 103, 2, 194, 74, 49, + 17, 12, 1, 214, 238, 49, 17, 12, 1, 214, 238, 41, 17, 12, 1, 234, 193, + 227, 137, 49, 17, 12, 1, 234, 193, 227, 137, 41, 17, 12, 1, 234, 193, + 212, 205, 49, 17, 12, 1, 234, 193, 212, 205, 41, 17, 12, 1, 154, 49, 17, + 12, 1, 154, 41, 17, 12, 1, 154, 73, 17, 12, 1, 154, 144, 17, 12, 1, 215, + 183, 235, 48, 234, 193, 108, 232, 71, 73, 17, 12, 1, 215, 183, 235, 48, + 234, 193, 108, 232, 71, 144, 17, 12, 26, 76, 2, 194, 74, 2, 108, 49, 17, + 12, 26, 76, 2, 194, 74, 2, 108, 41, 17, 12, 26, 76, 2, 194, 74, 2, 255, + 21, 49, 17, 12, 26, 76, 2, 194, 74, 2, 255, 21, 41, 17, 12, 26, 76, 2, + 194, 74, 2, 214, 18, 49, 17, 12, 26, 76, 2, 194, 74, 2, 214, 18, 41, 17, + 12, 26, 76, 2, 194, 74, 2, 103, 49, 17, 12, 26, 76, 2, 194, 74, 2, 103, + 41, 17, 12, 26, 76, 2, 194, 74, 2, 227, 137, 49, 17, 12, 26, 76, 2, 194, + 74, 2, 227, 137, 41, 17, 12, 26, 76, 2, 194, 74, 2, 212, 205, 49, 17, 12, + 26, 76, 2, 194, 74, 2, 212, 205, 41, 17, 12, 26, 76, 2, 194, 74, 2, 154, + 49, 17, 12, 26, 76, 2, 194, 74, 2, 154, 41, 17, 12, 26, 76, 2, 194, 74, + 2, 154, 73, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, + 71, 49, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, 71, + 41, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, 71, 73, + 17, 12, 1, 245, 1, 76, 49, 17, 12, 1, 245, 1, 76, 41, 17, 12, 1, 245, 1, + 76, 73, 17, 12, 1, 245, 1, 76, 144, 17, 12, 26, 76, 2, 194, 74, 2, 149, + 49, 17, 12, 26, 76, 2, 194, 74, 2, 123, 49, 17, 12, 26, 76, 2, 194, 74, + 2, 64, 49, 17, 12, 26, 76, 2, 194, 74, 2, 108, 232, 71, 49, 17, 12, 26, + 76, 2, 194, 74, 2, 76, 49, 17, 12, 26, 252, 101, 2, 149, 49, 17, 12, 26, + 252, 101, 2, 123, 49, 17, 12, 26, 252, 101, 2, 234, 248, 49, 17, 12, 26, + 252, 101, 2, 64, 49, 17, 12, 26, 252, 101, 2, 108, 232, 71, 49, 17, 12, + 26, 252, 101, 2, 76, 49, 17, 12, 26, 217, 229, 2, 149, 49, 17, 12, 26, + 217, 229, 2, 123, 49, 17, 12, 26, 217, 229, 2, 234, 248, 49, 17, 12, 26, + 217, 229, 2, 64, 49, 17, 12, 26, 217, 229, 2, 108, 232, 71, 49, 17, 12, + 26, 217, 229, 2, 76, 49, 17, 12, 26, 217, 159, 2, 149, 49, 17, 12, 26, + 217, 159, 2, 64, 49, 17, 12, 26, 217, 159, 2, 108, 232, 71, 49, 17, 12, + 26, 217, 159, 2, 76, 49, 17, 12, 26, 149, 2, 123, 49, 17, 12, 26, 149, 2, + 64, 49, 17, 12, 26, 123, 2, 149, 49, 17, 12, 26, 123, 2, 64, 49, 17, 12, + 26, 234, 248, 2, 149, 49, 17, 12, 26, 234, 248, 2, 123, 49, 17, 12, 26, + 234, 248, 2, 64, 49, 17, 12, 26, 222, 109, 2, 149, 49, 17, 12, 26, 222, + 109, 2, 123, 49, 17, 12, 26, 222, 109, 2, 234, 248, 49, 17, 12, 26, 222, + 109, 2, 64, 49, 17, 12, 26, 222, 221, 2, 123, 49, 17, 12, 26, 222, 221, + 2, 64, 49, 17, 12, 26, 249, 26, 2, 149, 49, 17, 12, 26, 249, 26, 2, 123, + 49, 17, 12, 26, 249, 26, 2, 234, 248, 49, 17, 12, 26, 249, 26, 2, 64, 49, + 17, 12, 26, 218, 44, 2, 123, 49, 17, 12, 26, 218, 44, 2, 64, 49, 17, 12, + 26, 212, 105, 2, 64, 49, 17, 12, 26, 254, 232, 2, 149, 49, 17, 12, 26, + 254, 232, 2, 64, 49, 17, 12, 26, 243, 85, 2, 149, 49, 17, 12, 26, 243, + 85, 2, 64, 49, 17, 12, 26, 244, 232, 2, 149, 49, 17, 12, 26, 244, 232, 2, + 123, 49, 17, 12, 26, 244, 232, 2, 234, 248, 49, 17, 12, 26, 244, 232, 2, + 64, 49, 17, 12, 26, 244, 232, 2, 108, 232, 71, 49, 17, 12, 26, 244, 232, + 2, 76, 49, 17, 12, 26, 225, 5, 2, 123, 49, 17, 12, 26, 225, 5, 2, 64, 49, + 17, 12, 26, 225, 5, 2, 108, 232, 71, 49, 17, 12, 26, 225, 5, 2, 76, 49, + 17, 12, 26, 235, 113, 2, 108, 49, 17, 12, 26, 235, 113, 2, 149, 49, 17, + 12, 26, 235, 113, 2, 123, 49, 17, 12, 26, 235, 113, 2, 234, 248, 49, 17, + 12, 26, 235, 113, 2, 233, 225, 49, 17, 12, 26, 235, 113, 2, 64, 49, 17, + 12, 26, 235, 113, 2, 108, 232, 71, 49, 17, 12, 26, 235, 113, 2, 76, 49, + 17, 12, 26, 233, 225, 2, 149, 49, 17, 12, 26, 233, 225, 2, 123, 49, 17, + 12, 26, 233, 225, 2, 234, 248, 49, 17, 12, 26, 233, 225, 2, 64, 49, 17, + 12, 26, 233, 225, 2, 108, 232, 71, 49, 17, 12, 26, 233, 225, 2, 76, 49, + 17, 12, 26, 64, 2, 149, 49, 17, 12, 26, 64, 2, 123, 49, 17, 12, 26, 64, + 2, 234, 248, 49, 17, 12, 26, 64, 2, 64, 49, 17, 12, 26, 64, 2, 108, 232, + 71, 49, 17, 12, 26, 64, 2, 76, 49, 17, 12, 26, 228, 217, 2, 149, 49, 17, + 12, 26, 228, 217, 2, 123, 49, 17, 12, 26, 228, 217, 2, 234, 248, 49, 17, + 12, 26, 228, 217, 2, 64, 49, 17, 12, 26, 228, 217, 2, 108, 232, 71, 49, + 17, 12, 26, 228, 217, 2, 76, 49, 17, 12, 26, 242, 66, 2, 149, 49, 17, 12, + 26, 242, 66, 2, 64, 49, 17, 12, 26, 242, 66, 2, 108, 232, 71, 49, 17, 12, + 26, 242, 66, 2, 76, 49, 17, 12, 26, 76, 2, 149, 49, 17, 12, 26, 76, 2, + 123, 49, 17, 12, 26, 76, 2, 234, 248, 49, 17, 12, 26, 76, 2, 64, 49, 17, + 12, 26, 76, 2, 108, 232, 71, 49, 17, 12, 26, 76, 2, 76, 49, 17, 12, 26, + 217, 169, 2, 218, 237, 108, 49, 17, 12, 26, 224, 24, 2, 218, 237, 108, + 49, 17, 12, 26, 108, 232, 71, 2, 218, 237, 108, 49, 17, 12, 26, 221, 39, + 2, 248, 250, 49, 17, 12, 26, 221, 39, 2, 235, 66, 49, 17, 12, 26, 221, + 39, 2, 244, 255, 49, 17, 12, 26, 221, 39, 2, 248, 252, 49, 17, 12, 26, + 221, 39, 2, 235, 68, 49, 17, 12, 26, 221, 39, 2, 218, 237, 108, 49, 17, + 12, 26, 76, 2, 194, 74, 2, 224, 24, 41, 17, 12, 26, 76, 2, 194, 74, 2, + 212, 102, 41, 17, 12, 26, 76, 2, 194, 74, 2, 64, 41, 17, 12, 26, 76, 2, + 194, 74, 2, 228, 217, 41, 17, 12, 26, 76, 2, 194, 74, 2, 108, 232, 71, + 41, 17, 12, 26, 76, 2, 194, 74, 2, 76, 41, 17, 12, 26, 252, 101, 2, 224, + 24, 41, 17, 12, 26, 252, 101, 2, 212, 102, 41, 17, 12, 26, 252, 101, 2, + 64, 41, 17, 12, 26, 252, 101, 2, 228, 217, 41, 17, 12, 26, 252, 101, 2, + 108, 232, 71, 41, 17, 12, 26, 252, 101, 2, 76, 41, 17, 12, 26, 217, 229, + 2, 224, 24, 41, 17, 12, 26, 217, 229, 2, 212, 102, 41, 17, 12, 26, 217, + 229, 2, 64, 41, 17, 12, 26, 217, 229, 2, 228, 217, 41, 17, 12, 26, 217, + 229, 2, 108, 232, 71, 41, 17, 12, 26, 217, 229, 2, 76, 41, 17, 12, 26, + 217, 159, 2, 224, 24, 41, 17, 12, 26, 217, 159, 2, 212, 102, 41, 17, 12, + 26, 217, 159, 2, 64, 41, 17, 12, 26, 217, 159, 2, 228, 217, 41, 17, 12, + 26, 217, 159, 2, 108, 232, 71, 41, 17, 12, 26, 217, 159, 2, 76, 41, 17, + 12, 26, 244, 232, 2, 108, 232, 71, 41, 17, 12, 26, 244, 232, 2, 76, 41, + 17, 12, 26, 225, 5, 2, 108, 232, 71, 41, 17, 12, 26, 225, 5, 2, 76, 41, + 17, 12, 26, 235, 113, 2, 108, 41, 17, 12, 26, 235, 113, 2, 233, 225, 41, + 17, 12, 26, 235, 113, 2, 64, 41, 17, 12, 26, 235, 113, 2, 108, 232, 71, + 41, 17, 12, 26, 235, 113, 2, 76, 41, 17, 12, 26, 233, 225, 2, 64, 41, 17, + 12, 26, 233, 225, 2, 108, 232, 71, 41, 17, 12, 26, 233, 225, 2, 76, 41, + 17, 12, 26, 64, 2, 108, 41, 17, 12, 26, 64, 2, 64, 41, 17, 12, 26, 228, + 217, 2, 224, 24, 41, 17, 12, 26, 228, 217, 2, 212, 102, 41, 17, 12, 26, + 228, 217, 2, 64, 41, 17, 12, 26, 228, 217, 2, 228, 217, 41, 17, 12, 26, + 228, 217, 2, 108, 232, 71, 41, 17, 12, 26, 228, 217, 2, 76, 41, 17, 12, + 26, 108, 232, 71, 2, 218, 237, 108, 41, 17, 12, 26, 76, 2, 224, 24, 41, + 17, 12, 26, 76, 2, 212, 102, 41, 17, 12, 26, 76, 2, 64, 41, 17, 12, 26, + 76, 2, 228, 217, 41, 17, 12, 26, 76, 2, 108, 232, 71, 41, 17, 12, 26, 76, + 2, 76, 41, 17, 12, 26, 76, 2, 194, 74, 2, 149, 73, 17, 12, 26, 76, 2, + 194, 74, 2, 123, 73, 17, 12, 26, 76, 2, 194, 74, 2, 234, 248, 73, 17, 12, + 26, 76, 2, 194, 74, 2, 64, 73, 17, 12, 26, 76, 2, 194, 74, 2, 242, 66, + 73, 17, 12, 26, 252, 101, 2, 149, 73, 17, 12, 26, 252, 101, 2, 123, 73, + 17, 12, 26, 252, 101, 2, 234, 248, 73, 17, 12, 26, 252, 101, 2, 64, 73, + 17, 12, 26, 252, 101, 2, 242, 66, 73, 17, 12, 26, 217, 229, 2, 149, 73, + 17, 12, 26, 217, 229, 2, 123, 73, 17, 12, 26, 217, 229, 2, 234, 248, 73, + 17, 12, 26, 217, 229, 2, 64, 73, 17, 12, 26, 217, 229, 2, 242, 66, 73, + 17, 12, 26, 217, 159, 2, 64, 73, 17, 12, 26, 149, 2, 123, 73, 17, 12, 26, + 149, 2, 64, 73, 17, 12, 26, 123, 2, 149, 73, 17, 12, 26, 123, 2, 64, 73, + 17, 12, 26, 234, 248, 2, 149, 73, 17, 12, 26, 234, 248, 2, 64, 73, 17, + 12, 26, 222, 109, 2, 149, 73, 17, 12, 26, 222, 109, 2, 123, 73, 17, 12, + 26, 222, 109, 2, 234, 248, 73, 17, 12, 26, 222, 109, 2, 64, 73, 17, 12, + 26, 222, 221, 2, 123, 73, 17, 12, 26, 222, 221, 2, 234, 248, 73, 17, 12, + 26, 222, 221, 2, 64, 73, 17, 12, 26, 249, 26, 2, 149, 73, 17, 12, 26, + 249, 26, 2, 123, 73, 17, 12, 26, 249, 26, 2, 234, 248, 73, 17, 12, 26, + 249, 26, 2, 64, 73, 17, 12, 26, 218, 44, 2, 123, 73, 17, 12, 26, 212, + 105, 2, 64, 73, 17, 12, 26, 254, 232, 2, 149, 73, 17, 12, 26, 254, 232, + 2, 64, 73, 17, 12, 26, 243, 85, 2, 149, 73, 17, 12, 26, 243, 85, 2, 64, + 73, 17, 12, 26, 244, 232, 2, 149, 73, 17, 12, 26, 244, 232, 2, 123, 73, + 17, 12, 26, 244, 232, 2, 234, 248, 73, 17, 12, 26, 244, 232, 2, 64, 73, + 17, 12, 26, 225, 5, 2, 123, 73, 17, 12, 26, 225, 5, 2, 64, 73, 17, 12, + 26, 235, 113, 2, 149, 73, 17, 12, 26, 235, 113, 2, 123, 73, 17, 12, 26, + 235, 113, 2, 234, 248, 73, 17, 12, 26, 235, 113, 2, 233, 225, 73, 17, 12, + 26, 235, 113, 2, 64, 73, 17, 12, 26, 233, 225, 2, 149, 73, 17, 12, 26, + 233, 225, 2, 123, 73, 17, 12, 26, 233, 225, 2, 234, 248, 73, 17, 12, 26, + 233, 225, 2, 64, 73, 17, 12, 26, 233, 225, 2, 242, 66, 73, 17, 12, 26, + 64, 2, 149, 73, 17, 12, 26, 64, 2, 123, 73, 17, 12, 26, 64, 2, 234, 248, + 73, 17, 12, 26, 64, 2, 64, 73, 17, 12, 26, 228, 217, 2, 149, 73, 17, 12, + 26, 228, 217, 2, 123, 73, 17, 12, 26, 228, 217, 2, 234, 248, 73, 17, 12, + 26, 228, 217, 2, 64, 73, 17, 12, 26, 228, 217, 2, 242, 66, 73, 17, 12, + 26, 242, 66, 2, 149, 73, 17, 12, 26, 242, 66, 2, 64, 73, 17, 12, 26, 242, + 66, 2, 218, 237, 108, 73, 17, 12, 26, 76, 2, 149, 73, 17, 12, 26, 76, 2, + 123, 73, 17, 12, 26, 76, 2, 234, 248, 73, 17, 12, 26, 76, 2, 64, 73, 17, + 12, 26, 76, 2, 242, 66, 73, 17, 12, 26, 76, 2, 194, 74, 2, 64, 144, 17, + 12, 26, 76, 2, 194, 74, 2, 242, 66, 144, 17, 12, 26, 252, 101, 2, 64, + 144, 17, 12, 26, 252, 101, 2, 242, 66, 144, 17, 12, 26, 217, 229, 2, 64, + 144, 17, 12, 26, 217, 229, 2, 242, 66, 144, 17, 12, 26, 217, 159, 2, 64, + 144, 17, 12, 26, 217, 159, 2, 242, 66, 144, 17, 12, 26, 222, 109, 2, 64, + 144, 17, 12, 26, 222, 109, 2, 242, 66, 144, 17, 12, 26, 221, 5, 2, 64, + 144, 17, 12, 26, 221, 5, 2, 242, 66, 144, 17, 12, 26, 235, 113, 2, 233, + 225, 144, 17, 12, 26, 235, 113, 2, 64, 144, 17, 12, 26, 233, 225, 2, 64, + 144, 17, 12, 26, 228, 217, 2, 64, 144, 17, 12, 26, 228, 217, 2, 242, 66, + 144, 17, 12, 26, 76, 2, 64, 144, 17, 12, 26, 76, 2, 242, 66, 144, 17, 12, + 26, 221, 39, 2, 244, 255, 144, 17, 12, 26, 221, 39, 2, 248, 252, 144, 17, + 12, 26, 221, 39, 2, 235, 68, 144, 17, 12, 26, 218, 44, 2, 108, 232, 71, + 49, 17, 12, 26, 218, 44, 2, 76, 49, 17, 12, 26, 254, 232, 2, 108, 232, + 71, 49, 17, 12, 26, 254, 232, 2, 76, 49, 17, 12, 26, 243, 85, 2, 108, + 232, 71, 49, 17, 12, 26, 243, 85, 2, 76, 49, 17, 12, 26, 222, 109, 2, + 108, 232, 71, 49, 17, 12, 26, 222, 109, 2, 76, 49, 17, 12, 26, 221, 5, 2, + 108, 232, 71, 49, 17, 12, 26, 221, 5, 2, 76, 49, 17, 12, 26, 123, 2, 108, + 232, 71, 49, 17, 12, 26, 123, 2, 76, 49, 17, 12, 26, 149, 2, 108, 232, + 71, 49, 17, 12, 26, 149, 2, 76, 49, 17, 12, 26, 234, 248, 2, 108, 232, + 71, 49, 17, 12, 26, 234, 248, 2, 76, 49, 17, 12, 26, 222, 221, 2, 108, + 232, 71, 49, 17, 12, 26, 222, 221, 2, 76, 49, 17, 12, 26, 249, 26, 2, + 108, 232, 71, 49, 17, 12, 26, 249, 26, 2, 76, 49, 17, 12, 26, 221, 5, 2, + 149, 49, 17, 12, 26, 221, 5, 2, 123, 49, 17, 12, 26, 221, 5, 2, 234, 248, + 49, 17, 12, 26, 221, 5, 2, 64, 49, 17, 12, 26, 221, 5, 2, 224, 24, 49, + 17, 12, 26, 222, 109, 2, 224, 24, 49, 17, 12, 26, 222, 221, 2, 224, 24, + 49, 17, 12, 26, 249, 26, 2, 224, 24, 49, 17, 12, 26, 218, 44, 2, 108, + 232, 71, 41, 17, 12, 26, 218, 44, 2, 76, 41, 17, 12, 26, 254, 232, 2, + 108, 232, 71, 41, 17, 12, 26, 254, 232, 2, 76, 41, 17, 12, 26, 243, 85, + 2, 108, 232, 71, 41, 17, 12, 26, 243, 85, 2, 76, 41, 17, 12, 26, 222, + 109, 2, 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 76, 41, 17, 12, 26, + 221, 5, 2, 108, 232, 71, 41, 17, 12, 26, 221, 5, 2, 76, 41, 17, 12, 26, + 123, 2, 108, 232, 71, 41, 17, 12, 26, 123, 2, 76, 41, 17, 12, 26, 149, 2, + 108, 232, 71, 41, 17, 12, 26, 149, 2, 76, 41, 17, 12, 26, 234, 248, 2, + 108, 232, 71, 41, 17, 12, 26, 234, 248, 2, 76, 41, 17, 12, 26, 222, 221, + 2, 108, 232, 71, 41, 17, 12, 26, 222, 221, 2, 76, 41, 17, 12, 26, 249, + 26, 2, 108, 232, 71, 41, 17, 12, 26, 249, 26, 2, 76, 41, 17, 12, 26, 221, + 5, 2, 149, 41, 17, 12, 26, 221, 5, 2, 123, 41, 17, 12, 26, 221, 5, 2, + 234, 248, 41, 17, 12, 26, 221, 5, 2, 64, 41, 17, 12, 26, 221, 5, 2, 224, + 24, 41, 17, 12, 26, 222, 109, 2, 224, 24, 41, 17, 12, 26, 222, 221, 2, + 224, 24, 41, 17, 12, 26, 249, 26, 2, 224, 24, 41, 17, 12, 26, 221, 5, 2, + 149, 73, 17, 12, 26, 221, 5, 2, 123, 73, 17, 12, 26, 221, 5, 2, 234, 248, + 73, 17, 12, 26, 221, 5, 2, 64, 73, 17, 12, 26, 222, 109, 2, 242, 66, 73, + 17, 12, 26, 221, 5, 2, 242, 66, 73, 17, 12, 26, 218, 44, 2, 64, 73, 17, + 12, 26, 222, 109, 2, 149, 144, 17, 12, 26, 222, 109, 2, 123, 144, 17, 12, + 26, 222, 109, 2, 234, 248, 144, 17, 12, 26, 221, 5, 2, 149, 144, 17, 12, + 26, 221, 5, 2, 123, 144, 17, 12, 26, 221, 5, 2, 234, 248, 144, 17, 12, + 26, 218, 44, 2, 64, 144, 17, 12, 26, 212, 105, 2, 64, 144, 17, 12, 26, + 108, 2, 244, 253, 41, 17, 12, 26, 108, 2, 244, 253, 49, 17, 227, 51, 43, + 226, 168, 227, 51, 47, 226, 168, 12, 26, 217, 229, 2, 149, 2, 64, 73, 17, + 12, 26, 217, 229, 2, 123, 2, 149, 41, 17, 12, 26, 217, 229, 2, 123, 2, + 149, 73, 17, 12, 26, 217, 229, 2, 123, 2, 64, 73, 17, 12, 26, 217, 229, + 2, 234, 248, 2, 64, 73, 17, 12, 26, 217, 229, 2, 64, 2, 149, 73, 17, 12, + 26, 217, 229, 2, 64, 2, 123, 73, 17, 12, 26, 217, 229, 2, 64, 2, 234, + 248, 73, 17, 12, 26, 149, 2, 64, 2, 123, 41, 17, 12, 26, 149, 2, 64, 2, + 123, 73, 17, 12, 26, 123, 2, 64, 2, 76, 41, 17, 12, 26, 123, 2, 64, 2, + 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 123, 2, 149, 73, 17, 12, 26, + 222, 109, 2, 149, 2, 123, 73, 17, 12, 26, 222, 109, 2, 149, 2, 108, 232, + 71, 41, 17, 12, 26, 222, 109, 2, 64, 2, 123, 41, 17, 12, 26, 222, 109, 2, + 64, 2, 123, 73, 17, 12, 26, 222, 109, 2, 64, 2, 149, 73, 17, 12, 26, 222, + 109, 2, 64, 2, 64, 41, 17, 12, 26, 222, 109, 2, 64, 2, 64, 73, 17, 12, + 26, 222, 221, 2, 123, 2, 123, 41, 17, 12, 26, 222, 221, 2, 123, 2, 123, + 73, 17, 12, 26, 222, 221, 2, 64, 2, 64, 41, 17, 12, 26, 221, 5, 2, 123, + 2, 64, 41, 17, 12, 26, 221, 5, 2, 123, 2, 64, 73, 17, 12, 26, 221, 5, 2, + 149, 2, 76, 41, 17, 12, 26, 221, 5, 2, 64, 2, 234, 248, 41, 17, 12, 26, + 221, 5, 2, 64, 2, 234, 248, 73, 17, 12, 26, 221, 5, 2, 64, 2, 64, 41, 17, + 12, 26, 221, 5, 2, 64, 2, 64, 73, 17, 12, 26, 249, 26, 2, 123, 2, 108, + 232, 71, 41, 17, 12, 26, 249, 26, 2, 234, 248, 2, 64, 41, 17, 12, 26, + 249, 26, 2, 234, 248, 2, 64, 73, 17, 12, 26, 218, 44, 2, 64, 2, 123, 41, + 17, 12, 26, 218, 44, 2, 64, 2, 123, 73, 17, 12, 26, 218, 44, 2, 64, 2, + 64, 73, 17, 12, 26, 218, 44, 2, 64, 2, 76, 41, 17, 12, 26, 254, 232, 2, + 149, 2, 64, 41, 17, 12, 26, 254, 232, 2, 64, 2, 64, 41, 17, 12, 26, 254, + 232, 2, 64, 2, 64, 73, 17, 12, 26, 254, 232, 2, 64, 2, 108, 232, 71, 41, + 17, 12, 26, 243, 85, 2, 64, 2, 64, 41, 17, 12, 26, 243, 85, 2, 64, 2, 76, + 41, 17, 12, 26, 243, 85, 2, 64, 2, 108, 232, 71, 41, 17, 12, 26, 244, + 232, 2, 234, 248, 2, 64, 41, 17, 12, 26, 244, 232, 2, 234, 248, 2, 64, + 73, 17, 12, 26, 225, 5, 2, 64, 2, 123, 41, 17, 12, 26, 225, 5, 2, 64, 2, + 64, 41, 17, 12, 26, 233, 225, 2, 123, 2, 64, 41, 17, 12, 26, 233, 225, 2, + 123, 2, 76, 41, 17, 12, 26, 233, 225, 2, 123, 2, 108, 232, 71, 41, 17, + 12, 26, 233, 225, 2, 149, 2, 149, 73, 17, 12, 26, 233, 225, 2, 149, 2, + 149, 41, 17, 12, 26, 233, 225, 2, 234, 248, 2, 64, 41, 17, 12, 26, 233, + 225, 2, 234, 248, 2, 64, 73, 17, 12, 26, 233, 225, 2, 64, 2, 123, 41, 17, + 12, 26, 233, 225, 2, 64, 2, 123, 73, 17, 12, 26, 64, 2, 123, 2, 149, 73, + 17, 12, 26, 64, 2, 123, 2, 64, 73, 17, 12, 26, 64, 2, 123, 2, 76, 41, 17, + 12, 26, 64, 2, 149, 2, 123, 73, 17, 12, 26, 64, 2, 149, 2, 64, 73, 17, + 12, 26, 64, 2, 234, 248, 2, 149, 73, 17, 12, 26, 64, 2, 234, 248, 2, 64, + 73, 17, 12, 26, 64, 2, 149, 2, 234, 248, 73, 17, 12, 26, 242, 66, 2, 64, + 2, 149, 73, 17, 12, 26, 242, 66, 2, 64, 2, 64, 73, 17, 12, 26, 228, 217, + 2, 123, 2, 64, 73, 17, 12, 26, 228, 217, 2, 123, 2, 108, 232, 71, 41, 17, + 12, 26, 228, 217, 2, 149, 2, 64, 41, 17, 12, 26, 228, 217, 2, 149, 2, 64, + 73, 17, 12, 26, 228, 217, 2, 149, 2, 108, 232, 71, 41, 17, 12, 26, 228, + 217, 2, 64, 2, 76, 41, 17, 12, 26, 228, 217, 2, 64, 2, 108, 232, 71, 41, + 17, 12, 26, 76, 2, 64, 2, 64, 41, 17, 12, 26, 76, 2, 64, 2, 64, 73, 17, + 12, 26, 252, 101, 2, 234, 248, 2, 76, 41, 17, 12, 26, 217, 229, 2, 149, + 2, 76, 41, 17, 12, 26, 217, 229, 2, 149, 2, 108, 232, 71, 41, 17, 12, 26, + 217, 229, 2, 234, 248, 2, 76, 41, 17, 12, 26, 217, 229, 2, 234, 248, 2, + 108, 232, 71, 41, 17, 12, 26, 217, 229, 2, 64, 2, 76, 41, 17, 12, 26, + 217, 229, 2, 64, 2, 108, 232, 71, 41, 17, 12, 26, 149, 2, 64, 2, 76, 41, + 17, 12, 26, 149, 2, 123, 2, 108, 232, 71, 41, 17, 12, 26, 149, 2, 64, 2, + 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 234, 248, 2, 108, 232, 71, 41, + 17, 12, 26, 222, 221, 2, 123, 2, 76, 41, 17, 12, 26, 221, 5, 2, 123, 2, + 76, 41, 17, 12, 26, 249, 26, 2, 123, 2, 76, 41, 17, 12, 26, 233, 225, 2, + 149, 2, 76, 41, 17, 12, 26, 233, 225, 2, 64, 2, 76, 41, 17, 12, 26, 76, + 2, 123, 2, 76, 41, 17, 12, 26, 76, 2, 149, 2, 76, 41, 17, 12, 26, 76, 2, + 64, 2, 76, 41, 17, 12, 26, 64, 2, 64, 2, 76, 41, 17, 12, 26, 225, 5, 2, + 64, 2, 76, 41, 17, 12, 26, 228, 217, 2, 123, 2, 76, 41, 17, 12, 26, 225, + 5, 2, 64, 2, 123, 73, 17, 12, 26, 233, 225, 2, 123, 2, 64, 73, 17, 12, + 26, 254, 232, 2, 64, 2, 76, 41, 17, 12, 26, 235, 113, 2, 64, 2, 76, 41, + 17, 12, 26, 228, 217, 2, 149, 2, 123, 73, 17, 12, 26, 64, 2, 234, 248, 2, + 76, 41, 17, 12, 26, 233, 225, 2, 149, 2, 64, 73, 17, 12, 26, 235, 113, 2, + 64, 2, 64, 41, 17, 12, 26, 233, 225, 2, 149, 2, 64, 41, 17, 12, 26, 228, + 217, 2, 149, 2, 123, 41, 17, 12, 26, 149, 2, 123, 2, 76, 41, 17, 12, 26, + 123, 2, 149, 2, 76, 41, 17, 12, 26, 64, 2, 149, 2, 76, 41, 17, 12, 26, + 244, 232, 2, 64, 2, 76, 41, 17, 12, 26, 252, 101, 2, 123, 2, 76, 41, 17, + 12, 26, 235, 113, 2, 64, 2, 64, 73, 17, 12, 26, 254, 232, 2, 149, 2, 64, + 73, 17, 12, 26, 222, 221, 2, 64, 2, 64, 73, 17, 12, 26, 222, 109, 2, 234, + 248, 2, 76, 41, 17, 12, 26, 228, 217, 2, 149, 2, 76, 41, 17, 12, 26, 222, + 199, 215, 108, 254, 24, 234, 124, 219, 84, 5, 49, 17, 12, 26, 225, 1, + 215, 108, 254, 24, 234, 124, 219, 84, 5, 49, 17, 12, 26, 254, 189, 49, + 17, 12, 26, 254, 218, 49, 17, 12, 26, 231, 37, 49, 17, 12, 26, 222, 200, + 49, 17, 12, 26, 224, 70, 49, 17, 12, 26, 254, 207, 49, 17, 12, 26, 214, + 36, 49, 17, 12, 26, 222, 199, 49, 17, 12, 26, 222, 198, 254, 207, 214, + 35, 12, 26, 235, 250, 223, 221, 53, 12, 26, 252, 22, 254, 80, 254, 81, + 44, 222, 99, 44, 221, 244, 44, 221, 176, 44, 221, 165, 44, 221, 154, 44, + 221, 143, 44, 221, 132, 44, 221, 121, 44, 221, 110, 44, 222, 98, 44, 222, + 87, 44, 222, 76, 44, 222, 65, 44, 222, 54, 44, 222, 43, 44, 222, 32, 225, + 110, 244, 109, 31, 66, 250, 23, 225, 110, 244, 109, 31, 66, 107, 250, 23, + 225, 110, 244, 109, 31, 66, 107, 244, 64, 219, 83, 225, 110, 244, 109, + 31, 66, 250, 30, 225, 110, 244, 109, 31, 66, 221, 93, 225, 110, 244, 109, + 31, 66, 245, 119, 79, 225, 110, 244, 109, 31, 66, 224, 193, 79, 225, 110, + 244, 109, 31, 66, 43, 69, 233, 142, 125, 225, 110, 244, 109, 31, 66, 47, + 69, 233, 142, 251, 208, 225, 110, 244, 109, 31, 66, 201, 245, 241, 38, + 26, 43, 242, 129, 38, 26, 47, 242, 129, 38, 52, 217, 56, 43, 242, 129, + 38, 52, 217, 56, 47, 242, 129, 38, 232, 111, 43, 242, 129, 38, 232, 111, + 47, 242, 129, 38, 250, 3, 232, 110, 225, 110, 244, 109, 31, 66, 119, 62, + 233, 178, 225, 110, 244, 109, 31, 66, 245, 239, 248, 223, 225, 110, 244, + 109, 31, 66, 245, 230, 248, 223, 225, 110, 244, 109, 31, 66, 117, 233, + 83, 225, 110, 244, 109, 31, 66, 214, 19, 117, 233, 83, 225, 110, 244, + 109, 31, 66, 43, 226, 168, 225, 110, 244, 109, 31, 66, 47, 226, 168, 225, + 110, 244, 109, 31, 66, 43, 249, 163, 125, 225, 110, 244, 109, 31, 66, 47, + 249, 163, 125, 225, 110, 244, 109, 31, 66, 43, 216, 232, 220, 254, 125, + 225, 110, 244, 109, 31, 66, 47, 216, 232, 220, 254, 125, 225, 110, 244, + 109, 31, 66, 43, 85, 233, 142, 125, 225, 110, 244, 109, 31, 66, 47, 85, + 233, 142, 125, 225, 110, 244, 109, 31, 66, 43, 52, 254, 146, 125, 225, + 110, 244, 109, 31, 66, 47, 52, 254, 146, 125, 225, 110, 244, 109, 31, 66, + 43, 254, 146, 125, 225, 110, 244, 109, 31, 66, 47, 254, 146, 125, 225, + 110, 244, 109, 31, 66, 43, 249, 223, 125, 225, 110, 244, 109, 31, 66, 47, + 249, 223, 125, 225, 110, 244, 109, 31, 66, 43, 69, 249, 223, 125, 225, + 110, 244, 109, 31, 66, 47, 69, 249, 223, 125, 221, 75, 247, 195, 69, 221, + 75, 247, 195, 225, 110, 244, 109, 31, 66, 43, 42, 125, 225, 110, 244, + 109, 31, 66, 47, 42, 125, 248, 222, 227, 25, 250, 229, 227, 25, 214, 19, + 227, 25, 52, 214, 19, 227, 25, 248, 222, 117, 233, 83, 250, 229, 117, + 233, 83, 214, 19, 117, 233, 83, 4, 250, 23, 4, 107, 250, 23, 4, 244, 64, + 219, 83, 4, 221, 93, 4, 250, 30, 4, 224, 193, 79, 4, 245, 119, 79, 4, + 245, 239, 248, 223, 4, 43, 226, 168, 4, 47, 226, 168, 4, 43, 249, 163, + 125, 4, 47, 249, 163, 125, 4, 43, 216, 232, 220, 254, 125, 4, 47, 216, + 232, 220, 254, 125, 4, 51, 53, 4, 254, 162, 4, 254, 3, 4, 95, 53, 4, 241, + 20, 4, 233, 137, 53, 4, 242, 228, 53, 4, 245, 182, 53, 4, 223, 237, 219, + 250, 4, 247, 207, 53, 4, 226, 93, 53, 4, 250, 22, 253, 249, 12, 244, 253, + 49, 17, 12, 218, 8, 2, 244, 253, 50, 12, 248, 250, 49, 17, 12, 218, 41, + 244, 91, 12, 235, 66, 49, 17, 12, 244, 255, 49, 17, 12, 244, 255, 144, + 17, 12, 248, 252, 49, 17, 12, 248, 252, 144, 17, 12, 235, 68, 49, 17, 12, + 235, 68, 144, 17, 12, 221, 39, 49, 17, 12, 221, 39, 144, 17, 12, 219, 5, + 49, 17, 12, 219, 5, 144, 17, 12, 1, 194, 49, 17, 12, 1, 108, 2, 232, 106, + 74, 49, 17, 12, 1, 108, 2, 232, 106, 74, 41, 17, 12, 1, 108, 2, 194, 74, + 49, 17, 12, 1, 108, 2, 194, 74, 41, 17, 12, 1, 214, 18, 2, 194, 74, 49, + 17, 12, 1, 214, 18, 2, 194, 74, 41, 17, 12, 1, 108, 2, 194, 252, 90, 49, + 17, 12, 1, 108, 2, 194, 252, 90, 41, 17, 12, 1, 76, 2, 194, 74, 49, 17, + 12, 1, 76, 2, 194, 74, 41, 17, 12, 1, 76, 2, 194, 74, 73, 17, 12, 1, 76, + 2, 194, 74, 144, 17, 12, 1, 108, 49, 17, 12, 1, 108, 41, 17, 12, 1, 252, + 101, 49, 17, 12, 1, 252, 101, 41, 17, 12, 1, 252, 101, 73, 17, 12, 1, + 252, 101, 144, 17, 12, 1, 217, 229, 232, 43, 49, 17, 12, 1, 217, 229, + 232, 43, 41, 17, 12, 1, 217, 229, 49, 17, 12, 1, 217, 229, 41, 17, 12, 1, + 217, 229, 73, 17, 12, 1, 217, 229, 144, 17, 12, 1, 217, 159, 49, 17, 12, + 1, 217, 159, 41, 17, 12, 1, 217, 159, 73, 17, 12, 1, 217, 159, 144, 17, + 12, 1, 149, 49, 17, 12, 1, 149, 41, 17, 12, 1, 149, 73, 17, 12, 1, 149, + 144, 17, 12, 1, 123, 49, 17, 12, 1, 123, 41, 17, 12, 1, 123, 73, 17, 12, + 1, 123, 144, 17, 12, 1, 234, 248, 49, 17, 12, 1, 234, 248, 41, 17, 12, 1, + 234, 248, 73, 17, 12, 1, 234, 248, 144, 17, 12, 1, 249, 7, 49, 17, 12, 1, + 249, 7, 41, 17, 12, 1, 217, 169, 49, 17, 12, 1, 217, 169, 41, 17, 12, 1, + 224, 24, 49, 17, 12, 1, 224, 24, 41, 17, 12, 1, 212, 102, 49, 17, 12, 1, + 212, 102, 41, 17, 12, 1, 222, 109, 49, 17, 12, 1, 222, 109, 41, 17, 12, + 1, 222, 109, 73, 17, 12, 1, 222, 109, 144, 17, 12, 1, 221, 5, 49, 17, 12, + 1, 221, 5, 41, 17, 12, 1, 221, 5, 73, 17, 12, 1, 221, 5, 144, 17, 12, 1, + 222, 221, 49, 17, 12, 1, 222, 221, 41, 17, 12, 1, 222, 221, 73, 17, 12, + 1, 222, 221, 144, 17, 12, 1, 249, 26, 49, 17, 12, 1, 249, 26, 41, 17, 12, + 1, 249, 26, 73, 17, 12, 1, 249, 26, 144, 17, 12, 1, 218, 44, 49, 17, 12, + 1, 218, 44, 41, 17, 12, 1, 218, 44, 73, 17, 12, 1, 218, 44, 144, 17, 12, + 1, 212, 105, 49, 17, 12, 1, 212, 105, 41, 17, 12, 1, 212, 105, 73, 17, + 12, 1, 212, 105, 144, 17, 12, 1, 254, 232, 49, 17, 12, 1, 254, 232, 41, + 17, 12, 1, 254, 232, 73, 17, 12, 1, 254, 232, 144, 17, 12, 1, 243, 85, + 49, 17, 12, 1, 243, 85, 41, 17, 12, 1, 243, 85, 73, 17, 12, 1, 243, 85, + 144, 17, 12, 1, 244, 232, 49, 17, 12, 1, 244, 232, 41, 17, 12, 1, 244, + 232, 73, 17, 12, 1, 244, 232, 144, 17, 12, 1, 225, 5, 49, 17, 12, 1, 225, + 5, 41, 17, 12, 1, 225, 5, 73, 17, 12, 1, 225, 5, 144, 17, 12, 1, 235, + 113, 49, 17, 12, 1, 235, 113, 41, 17, 12, 1, 235, 113, 73, 17, 12, 1, + 235, 113, 144, 17, 12, 1, 233, 225, 49, 17, 12, 1, 233, 225, 41, 17, 12, + 1, 233, 225, 73, 17, 12, 1, 233, 225, 144, 17, 12, 1, 64, 49, 17, 12, 1, + 64, 41, 17, 12, 1, 64, 73, 17, 12, 1, 64, 144, 17, 12, 1, 228, 217, 49, + 17, 12, 1, 228, 217, 41, 17, 12, 1, 228, 217, 73, 17, 12, 1, 228, 217, + 144, 17, 12, 1, 242, 66, 49, 17, 12, 1, 242, 66, 41, 17, 12, 1, 242, 66, + 73, 17, 12, 1, 242, 66, 144, 17, 12, 1, 214, 18, 49, 17, 12, 1, 214, 18, + 41, 17, 12, 1, 108, 232, 71, 49, 17, 12, 1, 108, 232, 71, 41, 17, 12, 1, + 76, 49, 17, 12, 1, 76, 41, 17, 12, 1, 76, 73, 17, 12, 1, 76, 144, 17, 12, + 26, 233, 225, 2, 108, 2, 232, 106, 74, 49, 17, 12, 26, 233, 225, 2, 108, + 2, 232, 106, 74, 41, 17, 12, 26, 233, 225, 2, 108, 2, 194, 74, 49, 17, + 12, 26, 233, 225, 2, 108, 2, 194, 74, 41, 17, 12, 26, 233, 225, 2, 108, + 2, 194, 252, 90, 49, 17, 12, 26, 233, 225, 2, 108, 2, 194, 252, 90, 41, + 17, 12, 26, 233, 225, 2, 108, 49, 17, 12, 26, 233, 225, 2, 108, 41, 17, + 212, 80, 213, 233, 228, 227, 219, 225, 122, 245, 119, 79, 122, 224, 178, + 79, 122, 51, 53, 122, 247, 207, 53, 122, 226, 93, 53, 122, 254, 162, 122, + 254, 97, 122, 43, 226, 168, 122, 47, 226, 168, 122, 254, 3, 122, 95, 53, + 122, 250, 23, 122, 241, 20, 122, 244, 64, 219, 83, 122, 219, 250, 122, + 21, 212, 79, 122, 21, 118, 122, 21, 112, 122, 21, 170, 122, 21, 167, 122, + 21, 185, 122, 21, 192, 122, 21, 200, 122, 21, 198, 122, 21, 203, 122, + 250, 30, 122, 221, 93, 122, 233, 137, 53, 122, 245, 182, 53, 122, 242, + 228, 53, 122, 224, 193, 79, 122, 250, 22, 253, 249, 122, 7, 6, 1, 63, + 122, 7, 6, 1, 253, 201, 122, 7, 6, 1, 251, 121, 122, 7, 6, 1, 249, 125, + 122, 7, 6, 1, 77, 122, 7, 6, 1, 245, 95, 122, 7, 6, 1, 244, 41, 122, 7, + 6, 1, 242, 162, 122, 7, 6, 1, 75, 122, 7, 6, 1, 236, 3, 122, 7, 6, 1, + 235, 141, 122, 7, 6, 1, 155, 122, 7, 6, 1, 184, 122, 7, 6, 1, 206, 122, + 7, 6, 1, 78, 122, 7, 6, 1, 227, 11, 122, 7, 6, 1, 225, 19, 122, 7, 6, 1, + 152, 122, 7, 6, 1, 196, 122, 7, 6, 1, 218, 113, 122, 7, 6, 1, 72, 122, 7, + 6, 1, 211, 211, 122, 7, 6, 1, 214, 85, 122, 7, 6, 1, 213, 169, 122, 7, 6, + 1, 213, 108, 122, 7, 6, 1, 212, 152, 122, 43, 42, 125, 122, 223, 237, + 219, 250, 122, 47, 42, 125, 122, 250, 91, 255, 46, 122, 117, 233, 83, + 122, 242, 234, 255, 46, 122, 7, 4, 1, 63, 122, 7, 4, 1, 253, 201, 122, 7, + 4, 1, 251, 121, 122, 7, 4, 1, 249, 125, 122, 7, 4, 1, 77, 122, 7, 4, 1, + 245, 95, 122, 7, 4, 1, 244, 41, 122, 7, 4, 1, 242, 162, 122, 7, 4, 1, 75, + 122, 7, 4, 1, 236, 3, 122, 7, 4, 1, 235, 141, 122, 7, 4, 1, 155, 122, 7, + 4, 1, 184, 122, 7, 4, 1, 206, 122, 7, 4, 1, 78, 122, 7, 4, 1, 227, 11, + 122, 7, 4, 1, 225, 19, 122, 7, 4, 1, 152, 122, 7, 4, 1, 196, 122, 7, 4, + 1, 218, 113, 122, 7, 4, 1, 72, 122, 7, 4, 1, 211, 211, 122, 7, 4, 1, 214, + 85, 122, 7, 4, 1, 213, 169, 122, 7, 4, 1, 213, 108, 122, 7, 4, 1, 212, + 152, 122, 43, 249, 163, 125, 122, 66, 233, 83, 122, 47, 249, 163, 125, + 122, 177, 122, 43, 69, 226, 168, 122, 47, 69, 226, 168, 100, 107, 244, + 64, 219, 83, 100, 43, 249, 223, 125, 100, 47, 249, 223, 125, 100, 107, + 250, 23, 100, 56, 231, 107, 247, 195, 100, 56, 1, 213, 217, 100, 56, 1, + 4, 63, 100, 56, 1, 4, 75, 100, 56, 1, 4, 72, 100, 56, 1, 4, 77, 100, 56, + 1, 4, 78, 100, 56, 1, 4, 189, 100, 56, 1, 4, 212, 204, 100, 56, 1, 4, + 212, 236, 100, 56, 1, 4, 216, 90, 100, 235, 63, 225, 93, 219, 237, 79, + 100, 56, 1, 63, 100, 56, 1, 75, 100, 56, 1, 72, 100, 56, 1, 77, 100, 56, + 1, 78, 100, 56, 1, 183, 100, 56, 1, 234, 212, 100, 56, 1, 234, 81, 100, + 56, 1, 235, 44, 100, 56, 1, 234, 148, 100, 56, 1, 222, 227, 100, 56, 1, + 220, 136, 100, 56, 1, 219, 41, 100, 56, 1, 222, 123, 100, 56, 1, 220, 5, + 100, 56, 1, 218, 66, 100, 56, 1, 217, 84, 100, 56, 1, 216, 90, 100, 56, + 1, 217, 242, 100, 56, 1, 109, 100, 56, 1, 207, 100, 56, 1, 229, 128, 100, + 56, 1, 228, 135, 100, 56, 1, 229, 254, 100, 56, 1, 228, 228, 100, 56, 1, + 162, 100, 56, 1, 242, 28, 100, 56, 1, 241, 74, 100, 56, 1, 242, 85, 100, + 56, 1, 241, 173, 100, 56, 1, 191, 100, 56, 1, 231, 112, 100, 56, 1, 230, + 242, 100, 56, 1, 231, 226, 100, 56, 1, 231, 45, 100, 56, 1, 189, 100, 56, + 1, 212, 204, 100, 56, 1, 212, 236, 100, 56, 1, 208, 100, 56, 1, 223, 222, + 100, 56, 1, 223, 77, 100, 56, 1, 224, 55, 100, 56, 1, 223, 146, 100, 56, + 1, 214, 52, 100, 56, 1, 206, 100, 56, 214, 120, 219, 237, 79, 100, 56, + 221, 98, 219, 237, 79, 100, 24, 244, 192, 100, 24, 1, 234, 178, 100, 24, + 1, 219, 168, 100, 24, 1, 234, 171, 100, 24, 1, 229, 121, 100, 24, 1, 229, + 119, 100, 24, 1, 229, 118, 100, 24, 1, 217, 68, 100, 24, 1, 219, 157, + 100, 24, 1, 223, 213, 100, 24, 1, 223, 208, 100, 24, 1, 223, 205, 100, + 24, 1, 223, 198, 100, 24, 1, 223, 193, 100, 24, 1, 223, 188, 100, 24, 1, + 223, 199, 100, 24, 1, 223, 211, 100, 24, 1, 231, 100, 100, 24, 1, 226, 7, + 100, 24, 1, 219, 165, 100, 24, 1, 225, 252, 100, 24, 1, 220, 95, 100, 24, + 1, 219, 162, 100, 24, 1, 236, 168, 100, 24, 1, 250, 106, 100, 24, 1, 219, + 172, 100, 24, 1, 250, 166, 100, 24, 1, 234, 228, 100, 24, 1, 217, 139, + 100, 24, 1, 226, 43, 100, 24, 1, 242, 21, 100, 24, 1, 63, 100, 24, 1, + 255, 20, 100, 24, 1, 189, 100, 24, 1, 213, 83, 100, 24, 1, 245, 197, 100, + 24, 1, 77, 100, 24, 1, 213, 28, 100, 24, 1, 213, 39, 100, 24, 1, 78, 100, + 24, 1, 214, 52, 100, 24, 1, 214, 49, 100, 24, 1, 227, 136, 100, 24, 1, + 212, 236, 100, 24, 1, 72, 100, 24, 1, 213, 255, 100, 24, 1, 214, 9, 100, + 24, 1, 213, 238, 100, 24, 1, 212, 204, 100, 24, 1, 245, 143, 100, 24, 1, + 213, 0, 100, 24, 1, 75, 122, 250, 233, 53, 122, 225, 144, 53, 122, 228, + 206, 53, 122, 232, 110, 122, 251, 188, 134, 122, 213, 32, 53, 122, 213, + 207, 53, 100, 244, 107, 182, 214, 221, 100, 135, 71, 100, 215, 130, 71, + 100, 96, 71, 100, 246, 179, 71, 100, 85, 219, 185, 100, 69, 250, 95, 236, + 62, 254, 137, 254, 156, 236, 62, 254, 137, 221, 80, 236, 62, 254, 137, + 217, 202, 227, 150, 224, 2, 250, 201, 224, 2, 250, 201, 60, 57, 3, 253, + 185, 63, 60, 57, 3, 253, 154, 77, 60, 57, 3, 253, 163, 75, 60, 57, 3, + 253, 131, 78, 60, 57, 3, 253, 181, 72, 60, 57, 3, 253, 200, 249, 30, 60, + 57, 3, 253, 147, 248, 162, 60, 57, 3, 253, 187, 248, 76, 60, 57, 3, 253, + 177, 247, 220, 60, 57, 3, 253, 141, 246, 154, 60, 57, 3, 253, 135, 236, + 0, 60, 57, 3, 253, 146, 235, 242, 60, 57, 3, 253, 156, 235, 185, 60, 57, + 3, 253, 127, 235, 168, 60, 57, 3, 253, 115, 183, 60, 57, 3, 253, 148, + 235, 44, 60, 57, 3, 253, 125, 234, 212, 60, 57, 3, 253, 122, 234, 148, + 60, 57, 3, 253, 111, 234, 81, 60, 57, 3, 253, 112, 191, 60, 57, 3, 253, + 178, 231, 226, 60, 57, 3, 253, 119, 231, 112, 60, 57, 3, 253, 176, 231, + 45, 60, 57, 3, 253, 168, 230, 242, 60, 57, 3, 253, 189, 207, 60, 57, 3, + 253, 167, 229, 254, 60, 57, 3, 253, 161, 229, 128, 60, 57, 3, 253, 140, + 228, 228, 60, 57, 3, 253, 137, 228, 135, 60, 57, 3, 253, 196, 195, 60, + 57, 3, 253, 120, 226, 132, 60, 57, 3, 253, 153, 226, 20, 60, 57, 3, 253, + 180, 225, 186, 60, 57, 3, 253, 142, 225, 71, 60, 57, 3, 253, 175, 225, + 11, 60, 57, 3, 253, 114, 224, 248, 60, 57, 3, 253, 170, 224, 233, 60, 57, + 3, 253, 159, 224, 222, 60, 57, 3, 253, 132, 208, 60, 57, 3, 253, 164, + 224, 55, 60, 57, 3, 253, 139, 223, 222, 60, 57, 3, 253, 198, 223, 146, + 60, 57, 3, 253, 165, 223, 77, 60, 57, 3, 253, 160, 222, 227, 60, 57, 3, + 253, 183, 222, 123, 60, 57, 3, 253, 151, 220, 136, 60, 57, 3, 253, 179, + 220, 5, 60, 57, 3, 253, 134, 219, 41, 60, 57, 3, 253, 133, 218, 66, 60, + 57, 3, 253, 194, 217, 242, 60, 57, 3, 253, 155, 217, 84, 60, 57, 3, 253, + 192, 109, 60, 57, 3, 253, 123, 216, 90, 60, 57, 3, 253, 138, 214, 52, 60, + 57, 3, 253, 117, 214, 9, 60, 57, 3, 253, 152, 213, 238, 60, 57, 3, 253, + 150, 213, 217, 60, 57, 3, 253, 174, 212, 109, 60, 57, 3, 253, 118, 212, + 87, 60, 57, 3, 253, 171, 212, 16, 60, 57, 3, 253, 166, 255, 106, 60, 57, + 3, 253, 149, 255, 105, 60, 57, 3, 253, 108, 253, 235, 60, 57, 3, 253, + 121, 246, 122, 60, 57, 3, 253, 104, 246, 121, 60, 57, 3, 253, 144, 228, + 73, 60, 57, 3, 253, 162, 225, 70, 60, 57, 3, 253, 130, 225, 73, 60, 57, + 3, 253, 116, 224, 111, 60, 57, 3, 253, 158, 224, 110, 60, 57, 3, 253, + 124, 223, 145, 60, 57, 3, 253, 126, 218, 64, 60, 57, 3, 253, 106, 216, + 50, 60, 57, 3, 253, 103, 112, 60, 57, 16, 253, 173, 60, 57, 16, 253, 172, + 60, 57, 16, 253, 169, 60, 57, 16, 253, 157, 60, 57, 16, 253, 145, 60, 57, + 16, 253, 143, 60, 57, 16, 253, 136, 60, 57, 16, 253, 129, 60, 57, 16, + 253, 128, 60, 57, 16, 253, 113, 60, 57, 16, 253, 110, 60, 57, 16, 253, + 109, 60, 57, 16, 253, 107, 60, 57, 16, 253, 105, 60, 57, 104, 253, 102, + 232, 63, 60, 57, 104, 253, 101, 213, 211, 60, 57, 104, 253, 100, 248, + 146, 60, 57, 104, 253, 99, 245, 179, 60, 57, 104, 253, 98, 232, 37, 60, + 57, 104, 253, 97, 219, 115, 60, 57, 104, 253, 96, 245, 125, 60, 57, 104, + 253, 95, 224, 80, 60, 57, 104, 253, 94, 221, 7, 60, 57, 104, 253, 93, + 242, 84, 60, 57, 104, 253, 92, 219, 231, 60, 57, 104, 253, 91, 251, 251, + 60, 57, 104, 253, 90, 249, 207, 60, 57, 104, 253, 89, 251, 169, 60, 57, + 104, 253, 88, 213, 246, 60, 57, 104, 253, 87, 252, 182, 60, 57, 104, 253, + 86, 227, 108, 60, 57, 104, 253, 85, 219, 205, 60, 57, 104, 253, 84, 249, + 133, 60, 57, 231, 26, 253, 83, 235, 86, 60, 57, 231, 26, 253, 82, 235, + 94, 60, 57, 104, 253, 81, 227, 121, 60, 57, 104, 253, 80, 213, 224, 60, + 57, 104, 253, 79, 60, 57, 231, 26, 253, 78, 254, 59, 60, 57, 231, 26, + 253, 77, 231, 186, 60, 57, 104, 253, 76, 251, 187, 60, 57, 104, 253, 75, + 243, 6, 60, 57, 104, 253, 74, 60, 57, 104, 253, 73, 213, 202, 60, 57, + 104, 253, 72, 60, 57, 104, 253, 71, 60, 57, 104, 253, 70, 241, 97, 60, + 57, 104, 253, 69, 60, 57, 104, 253, 68, 60, 57, 104, 253, 67, 60, 57, + 231, 26, 253, 65, 216, 64, 60, 57, 104, 253, 64, 60, 57, 104, 253, 63, + 60, 57, 104, 253, 62, 250, 54, 60, 57, 104, 253, 61, 60, 57, 104, 253, + 60, 60, 57, 104, 253, 59, 243, 189, 60, 57, 104, 253, 58, 254, 46, 60, + 57, 104, 253, 57, 60, 57, 104, 253, 56, 60, 57, 104, 253, 55, 60, 57, + 104, 253, 54, 60, 57, 104, 253, 53, 60, 57, 104, 253, 52, 60, 57, 104, + 253, 51, 60, 57, 104, 253, 50, 60, 57, 104, 253, 49, 60, 57, 104, 253, + 48, 231, 18, 60, 57, 104, 253, 47, 60, 57, 104, 253, 46, 216, 206, 60, + 57, 104, 253, 45, 60, 57, 104, 253, 44, 60, 57, 104, 253, 43, 60, 57, + 104, 253, 42, 60, 57, 104, 253, 41, 60, 57, 104, 253, 40, 60, 57, 104, + 253, 39, 60, 57, 104, 253, 38, 60, 57, 104, 253, 37, 60, 57, 104, 253, + 36, 60, 57, 104, 253, 35, 60, 57, 104, 253, 34, 242, 58, 60, 57, 104, + 253, 13, 244, 117, 60, 57, 104, 253, 10, 252, 162, 60, 57, 104, 253, 5, + 219, 212, 60, 57, 104, 253, 4, 71, 60, 57, 104, 253, 3, 60, 57, 104, 253, + 2, 218, 195, 60, 57, 104, 253, 1, 60, 57, 104, 253, 0, 60, 57, 104, 252, + 255, 213, 242, 250, 198, 60, 57, 104, 252, 254, 250, 198, 60, 57, 104, + 252, 253, 250, 199, 244, 89, 60, 57, 104, 252, 252, 213, 244, 60, 57, + 104, 252, 251, 60, 57, 104, 252, 250, 60, 57, 231, 26, 252, 249, 248, 15, + 60, 57, 104, 252, 248, 60, 57, 104, 252, 247, 60, 57, 104, 252, 245, 60, + 57, 104, 252, 244, 60, 57, 104, 252, 243, 60, 57, 104, 252, 242, 248, + 226, 60, 57, 104, 252, 241, 60, 57, 104, 252, 240, 60, 57, 104, 252, 239, + 60, 57, 104, 252, 238, 60, 57, 104, 252, 237, 60, 57, 104, 214, 168, 253, + 66, 60, 57, 104, 214, 168, 253, 33, 60, 57, 104, 214, 168, 253, 32, 60, + 57, 104, 214, 168, 253, 31, 60, 57, 104, 214, 168, 253, 30, 60, 57, 104, + 214, 168, 253, 29, 60, 57, 104, 214, 168, 253, 28, 60, 57, 104, 214, 168, + 253, 27, 60, 57, 104, 214, 168, 253, 26, 60, 57, 104, 214, 168, 253, 25, + 60, 57, 104, 214, 168, 253, 24, 60, 57, 104, 214, 168, 253, 23, 60, 57, + 104, 214, 168, 253, 22, 60, 57, 104, 214, 168, 253, 21, 60, 57, 104, 214, + 168, 253, 20, 60, 57, 104, 214, 168, 253, 19, 60, 57, 104, 214, 168, 253, + 18, 60, 57, 104, 214, 168, 253, 17, 60, 57, 104, 214, 168, 253, 16, 60, + 57, 104, 214, 168, 253, 15, 60, 57, 104, 214, 168, 253, 14, 60, 57, 104, + 214, 168, 253, 12, 60, 57, 104, 214, 168, 253, 11, 60, 57, 104, 214, 168, + 253, 9, 60, 57, 104, 214, 168, 253, 8, 60, 57, 104, 214, 168, 253, 7, 60, + 57, 104, 214, 168, 253, 6, 60, 57, 104, 214, 168, 252, 246, 60, 57, 104, + 214, 168, 252, 236, 255, 13, 213, 199, 221, 81, 233, 83, 255, 13, 213, + 199, 221, 81, 247, 195, 255, 13, 250, 189, 79, 255, 13, 51, 118, 255, 13, + 51, 112, 255, 13, 51, 170, 255, 13, 51, 167, 255, 13, 51, 185, 255, 13, + 51, 192, 255, 13, 51, 200, 255, 13, 51, 198, 255, 13, 51, 203, 255, 13, + 51, 217, 213, 255, 13, 51, 216, 45, 255, 13, 51, 217, 128, 255, 13, 51, + 244, 104, 255, 13, 51, 244, 203, 255, 13, 51, 220, 58, 255, 13, 51, 221, + 60, 255, 13, 51, 246, 6, 255, 13, 51, 229, 90, 255, 13, 51, 124, 241, 62, + 255, 13, 51, 119, 241, 62, 255, 13, 51, 137, 241, 62, 255, 13, 51, 244, + 101, 241, 62, 255, 13, 51, 244, 170, 241, 62, 255, 13, 51, 220, 72, 241, + 62, 255, 13, 51, 221, 66, 241, 62, 255, 13, 51, 246, 15, 241, 62, 255, + 13, 51, 229, 95, 241, 62, 255, 13, 51, 124, 217, 113, 255, 13, 51, 119, + 217, 113, 255, 13, 51, 137, 217, 113, 255, 13, 51, 244, 101, 217, 113, + 255, 13, 51, 244, 170, 217, 113, 255, 13, 51, 220, 72, 217, 113, 255, 13, + 51, 221, 66, 217, 113, 255, 13, 51, 246, 15, 217, 113, 255, 13, 51, 229, + 95, 217, 113, 255, 13, 51, 217, 214, 217, 113, 255, 13, 51, 216, 46, 217, + 113, 255, 13, 51, 217, 129, 217, 113, 255, 13, 51, 244, 105, 217, 113, + 255, 13, 51, 244, 204, 217, 113, 255, 13, 51, 220, 59, 217, 113, 255, 13, + 51, 221, 61, 217, 113, 255, 13, 51, 246, 7, 217, 113, 255, 13, 51, 229, + 91, 217, 113, 255, 13, 214, 2, 252, 174, 215, 150, 255, 13, 214, 2, 244, + 181, 219, 18, 255, 13, 214, 2, 222, 118, 219, 18, 255, 13, 214, 2, 217, + 135, 219, 18, 255, 13, 214, 2, 244, 94, 219, 18, 255, 13, 246, 157, 231, + 225, 244, 181, 219, 18, 255, 13, 233, 69, 231, 225, 244, 181, 219, 18, + 255, 13, 231, 225, 222, 118, 219, 18, 255, 13, 231, 225, 217, 135, 219, + 18, 25, 255, 39, 253, 237, 124, 224, 201, 25, 255, 39, 253, 237, 124, + 242, 129, 25, 255, 39, 253, 237, 124, 246, 175, 25, 255, 39, 253, 237, + 185, 25, 255, 39, 253, 237, 244, 203, 25, 255, 39, 253, 237, 244, 170, + 241, 62, 25, 255, 39, 253, 237, 244, 170, 217, 113, 25, 255, 39, 253, + 237, 244, 204, 217, 113, 25, 255, 39, 253, 237, 244, 170, 218, 31, 25, + 255, 39, 253, 237, 217, 214, 218, 31, 25, 255, 39, 253, 237, 244, 204, + 218, 31, 25, 255, 39, 253, 237, 124, 241, 63, 218, 31, 25, 255, 39, 253, + 237, 244, 170, 241, 63, 218, 31, 25, 255, 39, 253, 237, 124, 217, 114, + 218, 31, 25, 255, 39, 253, 237, 244, 170, 217, 114, 218, 31, 25, 255, 39, + 253, 237, 244, 170, 219, 104, 25, 255, 39, 253, 237, 217, 214, 219, 104, + 25, 255, 39, 253, 237, 244, 204, 219, 104, 25, 255, 39, 253, 237, 124, + 241, 63, 219, 104, 25, 255, 39, 253, 237, 244, 170, 241, 63, 219, 104, + 25, 255, 39, 253, 237, 124, 217, 114, 219, 104, 25, 255, 39, 253, 237, + 217, 214, 217, 114, 219, 104, 25, 255, 39, 253, 237, 244, 204, 217, 114, + 219, 104, 25, 255, 39, 253, 237, 217, 214, 231, 48, 25, 255, 39, 242, 52, + 124, 225, 200, 25, 255, 39, 217, 147, 118, 25, 255, 39, 242, 49, 118, 25, + 255, 39, 245, 188, 112, 25, 255, 39, 217, 147, 112, 25, 255, 39, 249, + 130, 119, 246, 174, 25, 255, 39, 245, 188, 119, 246, 174, 25, 255, 39, + 216, 174, 185, 25, 255, 39, 216, 174, 217, 213, 25, 255, 39, 216, 174, + 217, 214, 254, 177, 17, 25, 255, 39, 242, 49, 217, 213, 25, 255, 39, 231, + 178, 217, 213, 25, 255, 39, 217, 147, 217, 213, 25, 255, 39, 217, 147, + 217, 128, 25, 255, 39, 216, 174, 244, 203, 25, 255, 39, 216, 174, 244, + 204, 254, 177, 17, 25, 255, 39, 242, 49, 244, 203, 25, 255, 39, 217, 147, + 244, 203, 25, 255, 39, 217, 147, 124, 241, 62, 25, 255, 39, 217, 147, + 137, 241, 62, 25, 255, 39, 245, 188, 244, 170, 241, 62, 25, 255, 39, 216, + 174, 244, 170, 241, 62, 25, 255, 39, 217, 147, 244, 170, 241, 62, 25, + 255, 39, 251, 27, 244, 170, 241, 62, 25, 255, 39, 230, 71, 244, 170, 241, + 62, 25, 255, 39, 217, 147, 124, 217, 113, 25, 255, 39, 217, 147, 244, + 170, 217, 113, 25, 255, 39, 248, 129, 244, 170, 231, 48, 25, 255, 39, + 219, 72, 244, 204, 231, 48, 25, 124, 157, 53, 25, 124, 157, 5, 254, 177, + 17, 25, 119, 217, 133, 53, 25, 137, 224, 200, 53, 25, 213, 37, 53, 25, + 218, 32, 53, 25, 246, 176, 53, 25, 227, 147, 53, 25, 119, 227, 146, 53, + 25, 137, 227, 146, 53, 25, 244, 101, 227, 146, 53, 25, 244, 170, 227, + 146, 53, 25, 231, 172, 53, 25, 234, 21, 252, 174, 53, 25, 233, 64, 53, + 25, 227, 37, 53, 25, 213, 150, 53, 25, 254, 29, 53, 25, 254, 42, 53, 25, + 242, 240, 53, 25, 216, 157, 252, 174, 53, 25, 212, 80, 53, 223, 134, 221, + 57, 53, 223, 134, 215, 161, 53, 223, 134, 221, 85, 53, 223, 134, 221, 55, + 53, 223, 134, 248, 30, 221, 55, 53, 223, 134, 220, 113, 53, 223, 134, + 248, 125, 53, 223, 134, 224, 186, 53, 223, 134, 221, 73, 53, 223, 134, + 246, 136, 53, 223, 134, 254, 24, 53, 223, 134, 250, 228, 53, 226, 55, + 248, 8, 5, 226, 124, 226, 55, 248, 8, 5, 225, 194, 242, 82, 226, 55, 248, + 8, 5, 218, 9, 242, 82, 226, 55, 248, 8, 5, 251, 47, 226, 55, 248, 8, 5, + 250, 161, 226, 55, 248, 8, 5, 213, 211, 226, 55, 248, 8, 5, 242, 58, 226, + 55, 248, 8, 5, 243, 181, 226, 55, 248, 8, 5, 217, 83, 226, 55, 248, 8, 5, + 71, 226, 55, 248, 8, 5, 251, 220, 226, 55, 248, 8, 5, 220, 230, 226, 55, + 248, 8, 5, 250, 48, 226, 55, 248, 8, 5, 232, 62, 226, 55, 248, 8, 5, 232, + 14, 226, 55, 248, 8, 5, 222, 157, 226, 55, 248, 8, 5, 233, 107, 226, 55, + 248, 8, 5, 251, 238, 226, 55, 248, 8, 5, 251, 31, 225, 203, 226, 55, 248, + 8, 5, 247, 208, 226, 55, 248, 8, 5, 250, 27, 226, 55, 248, 8, 5, 220, 34, + 226, 55, 248, 8, 5, 250, 28, 226, 55, 248, 8, 5, 252, 109, 226, 55, 248, + 8, 5, 220, 217, 226, 55, 248, 8, 5, 241, 97, 226, 55, 248, 8, 5, 242, 26, + 226, 55, 248, 8, 5, 251, 166, 233, 158, 226, 55, 248, 8, 5, 251, 24, 226, + 55, 248, 8, 5, 224, 80, 226, 55, 248, 8, 5, 246, 51, 226, 55, 248, 8, 5, + 246, 182, 226, 55, 248, 8, 5, 216, 77, 226, 55, 248, 8, 5, 252, 112, 226, + 55, 248, 8, 5, 225, 204, 216, 206, 226, 55, 248, 8, 5, 214, 144, 226, 55, + 248, 8, 5, 226, 183, 226, 55, 248, 8, 5, 223, 126, 226, 55, 248, 8, 5, + 233, 94, 226, 55, 248, 8, 5, 227, 21, 252, 228, 226, 55, 248, 8, 5, 244, + 137, 226, 55, 248, 8, 5, 242, 235, 226, 55, 248, 8, 5, 219, 73, 226, 55, + 248, 8, 5, 4, 253, 211, 226, 55, 248, 8, 5, 214, 19, 252, 194, 226, 55, + 248, 8, 5, 38, 227, 149, 91, 232, 193, 1, 63, 232, 193, 1, 77, 232, 193, + 1, 253, 201, 232, 193, 1, 252, 66, 232, 193, 1, 244, 41, 232, 193, 1, + 249, 125, 232, 193, 1, 75, 232, 193, 1, 214, 85, 232, 193, 1, 212, 152, + 232, 193, 1, 217, 176, 232, 193, 1, 236, 3, 232, 193, 1, 235, 141, 232, + 193, 1, 225, 19, 232, 193, 1, 155, 232, 193, 1, 184, 232, 193, 1, 206, + 232, 193, 1, 231, 49, 232, 193, 1, 229, 7, 232, 193, 1, 72, 232, 193, 1, + 227, 11, 232, 193, 1, 234, 167, 232, 193, 1, 152, 232, 193, 1, 196, 232, + 193, 1, 218, 113, 232, 193, 1, 216, 131, 232, 193, 1, 254, 159, 232, 193, + 1, 245, 229, 232, 193, 1, 242, 162, 232, 193, 1, 213, 169, 251, 37, 1, + 63, 251, 37, 1, 226, 253, 251, 37, 1, 249, 125, 251, 37, 1, 155, 251, 37, + 1, 215, 96, 251, 37, 1, 152, 251, 37, 1, 233, 184, 251, 37, 1, 255, 106, + 251, 37, 1, 225, 19, 251, 37, 1, 253, 201, 251, 37, 1, 184, 251, 37, 1, + 78, 251, 37, 1, 249, 32, 251, 37, 1, 218, 113, 251, 37, 1, 221, 49, 251, + 37, 1, 221, 48, 251, 37, 1, 196, 251, 37, 1, 251, 120, 251, 37, 1, 72, + 251, 37, 1, 229, 7, 251, 37, 1, 213, 169, 251, 37, 1, 206, 251, 37, 1, + 216, 130, 251, 37, 1, 227, 11, 251, 37, 1, 219, 177, 251, 37, 1, 75, 251, + 37, 1, 77, 251, 37, 1, 215, 93, 251, 37, 1, 235, 141, 251, 37, 1, 235, + 132, 251, 37, 1, 230, 41, 251, 37, 1, 215, 98, 251, 37, 1, 244, 41, 251, + 37, 1, 243, 232, 251, 37, 1, 219, 121, 251, 37, 1, 219, 120, 251, 37, 1, + 229, 228, 251, 37, 1, 236, 145, 251, 37, 1, 251, 119, 251, 37, 1, 216, + 131, 251, 37, 1, 215, 95, 251, 37, 1, 223, 116, 251, 37, 1, 232, 6, 251, + 37, 1, 232, 5, 251, 37, 1, 232, 4, 251, 37, 1, 232, 3, 251, 37, 1, 233, + 183, 251, 37, 1, 246, 55, 251, 37, 1, 215, 94, 54, 32, 1, 63, 54, 32, 1, + 252, 121, 54, 32, 1, 235, 44, 54, 32, 1, 248, 162, 54, 32, 1, 77, 54, 32, + 1, 214, 237, 54, 32, 1, 212, 87, 54, 32, 1, 242, 85, 54, 32, 1, 217, 161, + 54, 32, 1, 75, 54, 32, 1, 183, 54, 32, 1, 245, 252, 54, 32, 1, 245, 238, + 54, 32, 1, 245, 229, 54, 32, 1, 245, 161, 54, 32, 1, 78, 54, 32, 1, 226, + 132, 54, 32, 1, 221, 8, 54, 32, 1, 234, 81, 54, 32, 1, 245, 176, 54, 32, + 1, 245, 166, 54, 32, 1, 217, 242, 54, 32, 1, 72, 54, 32, 1, 245, 255, 54, + 32, 1, 226, 48, 54, 32, 1, 234, 237, 54, 32, 1, 246, 24, 54, 32, 1, 245, + 168, 54, 32, 1, 250, 190, 54, 32, 1, 236, 145, 54, 32, 1, 215, 98, 54, + 32, 228, 97, 118, 54, 32, 228, 97, 185, 54, 32, 228, 97, 217, 213, 54, + 32, 228, 97, 244, 203, 242, 249, 1, 254, 239, 242, 249, 1, 252, 209, 242, + 249, 1, 243, 51, 242, 249, 1, 249, 14, 242, 249, 1, 254, 235, 242, 249, + 1, 225, 2, 242, 249, 1, 236, 14, 242, 249, 1, 242, 141, 242, 249, 1, 217, + 124, 242, 249, 1, 246, 5, 242, 249, 1, 234, 54, 242, 249, 1, 233, 234, + 242, 249, 1, 232, 57, 242, 249, 1, 230, 73, 242, 249, 1, 235, 235, 242, + 249, 1, 215, 113, 242, 249, 1, 226, 233, 242, 249, 1, 229, 90, 242, 249, + 1, 224, 91, 242, 249, 1, 222, 159, 242, 249, 1, 217, 225, 242, 249, 1, + 213, 222, 242, 249, 1, 245, 11, 242, 249, 1, 236, 149, 242, 249, 1, 241, + 52, 242, 249, 1, 227, 45, 242, 249, 1, 229, 95, 241, 62, 215, 185, 1, + 254, 183, 215, 185, 1, 252, 73, 215, 185, 1, 243, 204, 215, 185, 1, 234, + 250, 215, 185, 1, 248, 126, 215, 185, 1, 241, 173, 215, 185, 1, 213, 217, + 215, 185, 1, 212, 78, 215, 185, 1, 241, 90, 215, 185, 1, 217, 196, 215, + 185, 1, 212, 225, 215, 185, 1, 235, 112, 215, 185, 1, 220, 221, 215, 185, + 1, 233, 220, 215, 185, 1, 231, 199, 215, 185, 1, 248, 94, 215, 185, 1, + 228, 93, 215, 185, 1, 212, 8, 215, 185, 1, 222, 187, 215, 185, 1, 254, + 231, 215, 185, 1, 225, 71, 215, 185, 1, 222, 219, 215, 185, 1, 224, 215, + 215, 185, 1, 224, 71, 215, 185, 1, 217, 165, 215, 185, 1, 243, 84, 215, + 185, 1, 109, 215, 185, 1, 75, 215, 185, 1, 72, 215, 185, 1, 219, 132, + 215, 185, 213, 199, 247, 245, 54, 226, 81, 5, 63, 54, 226, 81, 5, 75, 54, + 226, 81, 5, 72, 54, 226, 81, 5, 183, 54, 226, 81, 5, 234, 81, 54, 226, + 81, 5, 243, 230, 54, 226, 81, 5, 242, 213, 54, 226, 81, 5, 213, 156, 54, + 226, 81, 5, 251, 88, 54, 226, 81, 5, 236, 0, 54, 226, 81, 5, 235, 225, + 54, 226, 81, 5, 218, 66, 54, 226, 81, 5, 216, 90, 54, 226, 81, 5, 249, + 30, 54, 226, 81, 5, 248, 76, 54, 226, 81, 5, 246, 154, 54, 226, 81, 5, + 217, 174, 54, 226, 81, 5, 195, 54, 226, 81, 5, 252, 234, 54, 226, 81, 5, + 245, 29, 54, 226, 81, 5, 207, 54, 226, 81, 5, 228, 135, 54, 226, 81, 5, + 191, 54, 226, 81, 5, 231, 112, 54, 226, 81, 5, 230, 242, 54, 226, 81, 5, + 189, 54, 226, 81, 5, 215, 8, 54, 226, 81, 5, 214, 159, 54, 226, 81, 5, + 208, 54, 226, 81, 5, 223, 77, 54, 226, 81, 5, 233, 255, 54, 226, 81, 5, + 222, 227, 54, 226, 81, 5, 212, 109, 54, 226, 81, 5, 221, 47, 54, 226, 81, + 5, 219, 176, 54, 226, 81, 5, 162, 54, 226, 81, 5, 253, 229, 54, 226, 81, + 5, 253, 228, 54, 226, 81, 5, 253, 227, 54, 226, 81, 5, 213, 133, 54, 226, + 81, 5, 249, 11, 54, 226, 81, 5, 249, 10, 54, 226, 81, 5, 252, 215, 54, + 226, 81, 5, 251, 139, 54, 226, 81, 213, 199, 247, 245, 54, 226, 81, 51, + 118, 54, 226, 81, 51, 112, 54, 226, 81, 51, 217, 213, 54, 226, 81, 51, + 216, 45, 54, 226, 81, 51, 241, 62, 175, 6, 1, 187, 75, 175, 6, 1, 187, + 77, 175, 6, 1, 187, 63, 175, 6, 1, 187, 254, 242, 175, 6, 1, 187, 78, + 175, 6, 1, 187, 227, 86, 175, 6, 1, 220, 196, 75, 175, 6, 1, 220, 196, + 77, 175, 6, 1, 220, 196, 63, 175, 6, 1, 220, 196, 254, 242, 175, 6, 1, + 220, 196, 78, 175, 6, 1, 220, 196, 227, 86, 175, 6, 1, 253, 210, 175, 6, + 1, 227, 22, 175, 6, 1, 213, 186, 175, 6, 1, 213, 36, 175, 6, 1, 242, 162, + 175, 6, 1, 226, 122, 175, 6, 1, 252, 112, 175, 6, 1, 217, 232, 175, 6, 1, + 248, 149, 175, 6, 1, 250, 187, 175, 6, 1, 235, 240, 175, 6, 1, 235, 51, + 175, 6, 1, 243, 179, 175, 6, 1, 246, 24, 175, 6, 1, 214, 232, 175, 6, 1, + 245, 146, 175, 6, 1, 217, 160, 175, 6, 1, 245, 166, 175, 6, 1, 212, 85, + 175, 6, 1, 245, 161, 175, 6, 1, 212, 66, 175, 6, 1, 245, 176, 175, 6, 1, + 245, 252, 175, 6, 1, 245, 238, 175, 6, 1, 245, 229, 175, 6, 1, 245, 217, + 175, 6, 1, 227, 122, 175, 6, 1, 245, 126, 175, 4, 1, 187, 75, 175, 4, 1, + 187, 77, 175, 4, 1, 187, 63, 175, 4, 1, 187, 254, 242, 175, 4, 1, 187, + 78, 175, 4, 1, 187, 227, 86, 175, 4, 1, 220, 196, 75, 175, 4, 1, 220, + 196, 77, 175, 4, 1, 220, 196, 63, 175, 4, 1, 220, 196, 254, 242, 175, 4, + 1, 220, 196, 78, 175, 4, 1, 220, 196, 227, 86, 175, 4, 1, 253, 210, 175, + 4, 1, 227, 22, 175, 4, 1, 213, 186, 175, 4, 1, 213, 36, 175, 4, 1, 242, + 162, 175, 4, 1, 226, 122, 175, 4, 1, 252, 112, 175, 4, 1, 217, 232, 175, + 4, 1, 248, 149, 175, 4, 1, 250, 187, 175, 4, 1, 235, 240, 175, 4, 1, 235, + 51, 175, 4, 1, 243, 179, 175, 4, 1, 246, 24, 175, 4, 1, 214, 232, 175, 4, + 1, 245, 146, 175, 4, 1, 217, 160, 175, 4, 1, 245, 166, 175, 4, 1, 212, + 85, 175, 4, 1, 245, 161, 175, 4, 1, 212, 66, 175, 4, 1, 245, 176, 175, 4, + 1, 245, 252, 175, 4, 1, 245, 238, 175, 4, 1, 245, 229, 175, 4, 1, 245, + 217, 175, 4, 1, 227, 122, 175, 4, 1, 245, 126, 221, 14, 1, 226, 120, 221, + 14, 1, 216, 231, 221, 14, 1, 234, 211, 221, 14, 1, 244, 236, 221, 14, 1, + 217, 138, 221, 14, 1, 220, 5, 221, 14, 1, 218, 228, 221, 14, 1, 250, 121, + 221, 14, 1, 213, 38, 221, 14, 1, 241, 61, 221, 14, 1, 252, 53, 221, 14, + 1, 248, 161, 221, 14, 1, 243, 216, 221, 14, 1, 214, 108, 221, 14, 1, 217, + 142, 221, 14, 1, 212, 14, 221, 14, 1, 231, 224, 221, 14, 1, 235, 166, + 221, 14, 1, 213, 215, 221, 14, 1, 242, 150, 221, 14, 1, 233, 13, 221, 14, + 1, 231, 72, 221, 14, 1, 236, 152, 221, 14, 1, 246, 23, 221, 14, 1, 254, + 17, 221, 14, 1, 255, 24, 221, 14, 1, 227, 99, 221, 14, 1, 213, 202, 221, + 14, 1, 227, 36, 221, 14, 1, 254, 242, 221, 14, 1, 223, 143, 221, 14, 1, + 228, 93, 221, 14, 1, 246, 38, 221, 14, 1, 254, 247, 221, 14, 1, 240, 221, + 221, 14, 1, 215, 140, 221, 14, 1, 227, 155, 221, 14, 1, 227, 79, 221, 14, + 1, 227, 121, 221, 14, 1, 253, 213, 221, 14, 1, 254, 60, 221, 14, 1, 227, + 62, 221, 14, 1, 254, 227, 221, 14, 1, 245, 170, 221, 14, 1, 254, 39, 221, + 14, 1, 246, 48, 221, 14, 1, 240, 227, 221, 14, 1, 213, 5, 227, 47, 1, + 254, 205, 227, 47, 1, 252, 234, 227, 47, 1, 218, 66, 227, 47, 1, 236, 0, + 227, 47, 1, 213, 156, 227, 47, 1, 234, 250, 227, 47, 1, 248, 148, 227, + 47, 1, 208, 227, 47, 1, 222, 227, 227, 47, 1, 220, 227, 227, 47, 1, 248, + 97, 227, 47, 1, 251, 15, 227, 47, 1, 243, 230, 227, 47, 1, 245, 29, 227, + 47, 1, 225, 9, 227, 47, 1, 235, 127, 227, 47, 1, 233, 250, 227, 47, 1, + 231, 83, 227, 47, 1, 228, 77, 227, 47, 1, 214, 17, 227, 47, 1, 162, 227, + 47, 1, 189, 227, 47, 1, 63, 227, 47, 1, 77, 227, 47, 1, 75, 227, 47, 1, + 78, 227, 47, 1, 72, 227, 47, 1, 255, 104, 227, 47, 1, 246, 30, 227, 47, + 1, 227, 86, 227, 47, 21, 212, 79, 227, 47, 21, 118, 227, 47, 21, 112, + 227, 47, 21, 170, 227, 47, 21, 167, 227, 47, 21, 185, 227, 47, 21, 192, + 227, 47, 21, 200, 227, 47, 21, 198, 227, 47, 21, 203, 249, 132, 3, 63, + 249, 132, 3, 77, 249, 132, 3, 75, 249, 132, 3, 78, 249, 132, 3, 72, 249, + 132, 3, 236, 0, 249, 132, 3, 235, 185, 249, 132, 3, 183, 249, 132, 3, + 235, 44, 249, 132, 3, 234, 212, 249, 132, 3, 234, 148, 249, 132, 3, 234, + 81, 249, 132, 3, 233, 255, 249, 132, 3, 233, 180, 249, 132, 3, 233, 111, + 249, 132, 3, 233, 26, 249, 132, 3, 232, 230, 249, 132, 3, 191, 249, 132, + 3, 231, 226, 249, 132, 3, 231, 112, 249, 132, 3, 231, 45, 249, 132, 3, + 230, 242, 249, 132, 3, 207, 249, 132, 3, 229, 254, 249, 132, 3, 229, 128, + 249, 132, 3, 228, 228, 249, 132, 3, 228, 135, 249, 132, 3, 195, 249, 132, + 3, 226, 132, 249, 132, 3, 226, 20, 249, 132, 3, 225, 186, 249, 132, 3, + 225, 71, 249, 132, 3, 208, 249, 132, 3, 224, 55, 249, 132, 3, 223, 222, + 249, 132, 3, 223, 146, 249, 132, 3, 223, 77, 249, 132, 3, 222, 227, 249, + 132, 3, 222, 123, 249, 132, 3, 220, 136, 249, 132, 3, 220, 5, 249, 132, + 3, 219, 41, 249, 132, 3, 218, 66, 249, 132, 3, 217, 242, 249, 132, 3, + 217, 84, 249, 132, 3, 109, 249, 132, 3, 216, 90, 249, 132, 3, 214, 52, + 249, 132, 3, 214, 9, 249, 132, 3, 213, 238, 249, 132, 3, 213, 217, 249, + 132, 3, 213, 156, 249, 132, 3, 213, 153, 249, 132, 3, 212, 109, 249, 132, + 3, 212, 16, 236, 114, 254, 68, 1, 254, 203, 236, 114, 254, 68, 1, 252, + 72, 236, 114, 254, 68, 1, 243, 41, 236, 114, 254, 68, 1, 248, 255, 236, + 114, 254, 68, 1, 242, 85, 236, 114, 254, 68, 1, 214, 17, 236, 114, 254, + 68, 1, 212, 90, 236, 114, 254, 68, 1, 242, 43, 236, 114, 254, 68, 1, 217, + 192, 236, 114, 254, 68, 1, 212, 224, 236, 114, 254, 68, 1, 235, 87, 236, + 114, 254, 68, 1, 233, 215, 236, 114, 254, 68, 1, 231, 199, 236, 114, 254, + 68, 1, 228, 93, 236, 114, 254, 68, 1, 222, 188, 236, 114, 254, 68, 1, + 253, 205, 236, 114, 254, 68, 1, 226, 132, 236, 114, 254, 68, 1, 222, 218, + 236, 114, 254, 68, 1, 224, 214, 236, 114, 254, 68, 1, 223, 253, 236, 114, + 254, 68, 1, 220, 221, 236, 114, 254, 68, 1, 218, 0, 236, 114, 254, 68, + 222, 115, 53, 236, 114, 254, 68, 51, 118, 236, 114, 254, 68, 51, 112, + 236, 114, 254, 68, 51, 170, 236, 114, 254, 68, 51, 217, 213, 236, 114, + 254, 68, 51, 216, 45, 236, 114, 254, 68, 51, 124, 241, 62, 236, 114, 254, + 68, 51, 124, 217, 113, 236, 114, 254, 68, 51, 217, 214, 217, 113, 226, + 31, 1, 254, 201, 226, 31, 1, 252, 75, 226, 31, 1, 243, 205, 226, 31, 1, + 248, 128, 226, 31, 1, 242, 85, 226, 31, 1, 214, 24, 226, 31, 1, 212, 103, + 226, 31, 1, 242, 45, 226, 31, 1, 217, 196, 226, 31, 1, 212, 225, 226, 31, + 1, 235, 112, 226, 31, 1, 233, 221, 226, 31, 1, 231, 199, 226, 31, 1, 228, + 93, 226, 31, 1, 221, 87, 226, 31, 1, 254, 231, 226, 31, 1, 226, 132, 226, + 31, 1, 222, 219, 226, 31, 1, 224, 219, 226, 31, 1, 223, 125, 226, 31, 1, + 220, 221, 226, 31, 1, 218, 5, 226, 31, 51, 118, 226, 31, 51, 217, 213, + 226, 31, 51, 216, 45, 226, 31, 51, 124, 241, 62, 226, 31, 51, 112, 226, + 31, 51, 170, 226, 31, 213, 199, 221, 80, 232, 192, 1, 63, 232, 192, 1, + 253, 201, 232, 192, 1, 244, 41, 232, 192, 1, 249, 125, 232, 192, 1, 77, + 232, 192, 1, 211, 211, 232, 192, 1, 75, 232, 192, 1, 213, 108, 232, 192, + 1, 235, 141, 232, 192, 1, 155, 232, 192, 1, 184, 232, 192, 1, 206, 232, + 192, 1, 78, 232, 192, 1, 152, 232, 192, 1, 219, 177, 232, 192, 1, 218, + 113, 232, 192, 1, 72, 232, 192, 1, 245, 95, 232, 192, 1, 225, 19, 232, + 192, 1, 196, 232, 192, 1, 216, 131, 232, 192, 1, 254, 159, 232, 192, 1, + 245, 229, 232, 192, 1, 232, 194, 232, 192, 1, 229, 7, 232, 192, 1, 251, + 121, 232, 192, 216, 193, 79, 234, 238, 1, 63, 234, 238, 30, 5, 75, 234, + 238, 30, 5, 72, 234, 238, 30, 5, 165, 152, 234, 238, 30, 5, 77, 234, 238, + 30, 5, 78, 234, 238, 30, 233, 145, 79, 234, 238, 5, 52, 223, 165, 55, + 234, 238, 5, 254, 113, 234, 238, 5, 214, 132, 234, 238, 1, 183, 234, 238, + 1, 234, 250, 234, 238, 1, 243, 230, 234, 238, 1, 243, 89, 234, 238, 1, + 251, 88, 234, 238, 1, 250, 215, 234, 238, 1, 236, 0, 234, 238, 1, 228, + 64, 234, 238, 1, 216, 128, 234, 238, 1, 216, 116, 234, 238, 1, 248, 207, + 234, 238, 1, 248, 191, 234, 238, 1, 229, 6, 234, 238, 1, 218, 66, 234, + 238, 1, 217, 174, 234, 238, 1, 249, 30, 234, 238, 1, 248, 97, 234, 238, + 1, 207, 234, 238, 1, 195, 234, 238, 1, 226, 59, 234, 238, 1, 252, 234, + 234, 238, 1, 252, 65, 234, 238, 1, 191, 234, 238, 1, 189, 234, 238, 1, + 208, 234, 238, 1, 233, 255, 234, 238, 1, 215, 8, 234, 238, 1, 221, 47, + 234, 238, 1, 219, 176, 234, 238, 1, 222, 227, 234, 238, 1, 212, 109, 234, + 238, 1, 162, 234, 238, 1, 234, 166, 234, 238, 1, 216, 96, 234, 238, 5, + 252, 187, 50, 234, 238, 5, 251, 21, 234, 238, 5, 62, 55, 234, 238, 214, + 137, 234, 238, 21, 118, 234, 238, 21, 112, 234, 238, 21, 170, 234, 238, + 21, 167, 234, 238, 51, 217, 213, 234, 238, 51, 216, 45, 234, 238, 51, + 124, 241, 62, 234, 238, 51, 124, 217, 113, 234, 238, 225, 63, 247, 195, + 234, 238, 225, 63, 4, 250, 95, 234, 238, 225, 63, 250, 95, 234, 238, 225, + 63, 249, 200, 134, 234, 238, 225, 63, 232, 58, 234, 238, 225, 63, 232, + 244, 234, 238, 225, 63, 248, 245, 234, 238, 225, 63, 52, 248, 245, 234, + 238, 225, 63, 233, 77, 54, 219, 234, 254, 79, 1, 242, 85, 54, 219, 234, + 254, 79, 1, 233, 215, 54, 219, 234, 254, 79, 1, 242, 43, 54, 219, 234, + 254, 79, 1, 231, 199, 54, 219, 234, 254, 79, 1, 224, 214, 54, 219, 234, + 254, 79, 1, 214, 17, 54, 219, 234, 254, 79, 1, 220, 221, 54, 219, 234, + 254, 79, 1, 223, 253, 54, 219, 234, 254, 79, 1, 252, 72, 54, 219, 234, + 254, 79, 1, 218, 0, 54, 219, 234, 254, 79, 1, 222, 166, 54, 219, 234, + 254, 79, 1, 235, 87, 54, 219, 234, 254, 79, 1, 228, 93, 54, 219, 234, + 254, 79, 1, 234, 234, 54, 219, 234, 254, 79, 1, 222, 218, 54, 219, 234, + 254, 79, 1, 222, 188, 54, 219, 234, 254, 79, 1, 244, 243, 54, 219, 234, + 254, 79, 1, 254, 205, 54, 219, 234, 254, 79, 1, 253, 204, 54, 219, 234, + 254, 79, 1, 248, 95, 54, 219, 234, 254, 79, 1, 243, 41, 54, 219, 234, + 254, 79, 1, 248, 255, 54, 219, 234, 254, 79, 1, 243, 78, 54, 219, 234, + 254, 79, 1, 217, 192, 54, 219, 234, 254, 79, 1, 212, 89, 54, 219, 234, + 254, 79, 1, 248, 92, 54, 219, 234, 254, 79, 1, 212, 224, 54, 219, 234, + 254, 79, 1, 217, 163, 54, 219, 234, 254, 79, 1, 217, 144, 54, 219, 234, + 254, 79, 51, 118, 54, 219, 234, 254, 79, 51, 244, 203, 54, 219, 234, 254, + 79, 130, 236, 96, 253, 215, 1, 63, 253, 215, 1, 255, 104, 253, 215, 1, + 254, 111, 253, 215, 1, 255, 63, 253, 215, 1, 254, 159, 253, 215, 1, 255, + 64, 253, 215, 1, 255, 20, 253, 215, 1, 255, 16, 253, 215, 1, 77, 253, + 215, 1, 246, 30, 253, 215, 1, 78, 253, 215, 1, 227, 86, 253, 215, 1, 75, + 253, 215, 1, 236, 145, 253, 215, 1, 72, 253, 215, 1, 215, 98, 253, 215, + 1, 235, 44, 253, 215, 1, 213, 153, 253, 215, 1, 213, 119, 253, 215, 1, + 213, 128, 253, 215, 1, 243, 158, 253, 215, 1, 243, 120, 253, 215, 1, 243, + 76, 253, 215, 1, 250, 247, 253, 215, 1, 235, 242, 253, 215, 1, 217, 242, + 253, 215, 1, 217, 161, 253, 215, 1, 248, 162, 253, 215, 1, 248, 90, 253, + 215, 1, 216, 123, 253, 215, 1, 226, 132, 253, 215, 1, 244, 243, 253, 215, + 1, 252, 121, 253, 215, 1, 252, 62, 253, 215, 1, 229, 214, 253, 215, 1, + 229, 134, 253, 215, 1, 229, 135, 253, 215, 1, 229, 254, 253, 215, 1, 228, + 56, 253, 215, 1, 229, 2, 253, 215, 1, 231, 226, 253, 215, 1, 241, 221, + 253, 215, 1, 212, 159, 253, 215, 1, 213, 39, 253, 215, 1, 214, 237, 253, + 215, 1, 224, 55, 253, 215, 1, 233, 180, 253, 215, 1, 222, 123, 253, 215, + 1, 212, 87, 253, 215, 1, 221, 8, 253, 215, 1, 212, 67, 253, 215, 1, 220, + 143, 253, 215, 1, 219, 146, 253, 215, 1, 242, 85, 253, 215, 255, 53, 79, + 217, 46, 119, 181, 113, 124, 62, 225, 62, 4, 119, 181, 113, 124, 62, 225, + 62, 233, 207, 119, 181, 113, 124, 62, 225, 62, 233, 207, 124, 62, 113, + 119, 181, 225, 62, 233, 207, 119, 223, 163, 113, 124, 223, 165, 225, 62, + 233, 207, 124, 223, 165, 113, 119, 223, 163, 225, 62, 236, 76, 226, 163, + 1, 254, 203, 236, 76, 226, 163, 1, 252, 72, 236, 76, 226, 163, 1, 243, + 41, 236, 76, 226, 163, 1, 248, 255, 236, 76, 226, 163, 1, 242, 85, 236, + 76, 226, 163, 1, 214, 17, 236, 76, 226, 163, 1, 212, 90, 236, 76, 226, + 163, 1, 242, 43, 236, 76, 226, 163, 1, 217, 192, 236, 76, 226, 163, 1, + 212, 224, 236, 76, 226, 163, 1, 235, 87, 236, 76, 226, 163, 1, 233, 215, + 236, 76, 226, 163, 1, 231, 199, 236, 76, 226, 163, 1, 228, 93, 236, 76, + 226, 163, 1, 222, 188, 236, 76, 226, 163, 1, 253, 205, 236, 76, 226, 163, + 1, 226, 132, 236, 76, 226, 163, 1, 222, 218, 236, 76, 226, 163, 1, 224, + 214, 236, 76, 226, 163, 1, 223, 253, 236, 76, 226, 163, 1, 220, 221, 236, + 76, 226, 163, 1, 218, 0, 236, 76, 226, 163, 51, 118, 236, 76, 226, 163, + 51, 112, 236, 76, 226, 163, 51, 170, 236, 76, 226, 163, 51, 167, 236, 76, + 226, 163, 51, 217, 213, 236, 76, 226, 163, 51, 216, 45, 236, 76, 226, + 163, 51, 124, 241, 62, 236, 76, 226, 163, 51, 124, 217, 113, 236, 76, + 226, 236, 1, 254, 203, 236, 76, 226, 236, 1, 252, 72, 236, 76, 226, 236, + 1, 243, 41, 236, 76, 226, 236, 1, 248, 255, 236, 76, 226, 236, 1, 242, + 85, 236, 76, 226, 236, 1, 214, 16, 236, 76, 226, 236, 1, 212, 90, 236, + 76, 226, 236, 1, 242, 43, 236, 76, 226, 236, 1, 217, 192, 236, 76, 226, + 236, 1, 212, 224, 236, 76, 226, 236, 1, 235, 87, 236, 76, 226, 236, 1, + 233, 215, 236, 76, 226, 236, 1, 231, 198, 236, 76, 226, 236, 1, 228, 93, + 236, 76, 226, 236, 1, 222, 188, 236, 76, 226, 236, 1, 226, 132, 236, 76, + 226, 236, 1, 222, 218, 236, 76, 226, 236, 1, 220, 221, 236, 76, 226, 236, + 1, 218, 0, 236, 76, 226, 236, 51, 118, 236, 76, 226, 236, 51, 112, 236, + 76, 226, 236, 51, 170, 236, 76, 226, 236, 51, 167, 236, 76, 226, 236, 51, + 217, 213, 236, 76, 226, 236, 51, 216, 45, 236, 76, 226, 236, 51, 124, + 241, 62, 236, 76, 226, 236, 51, 124, 217, 113, 54, 188, 1, 227, 54, 63, + 54, 188, 1, 213, 29, 63, 54, 188, 1, 213, 29, 255, 20, 54, 188, 1, 227, + 54, 75, 54, 188, 1, 213, 29, 75, 54, 188, 1, 213, 29, 77, 54, 188, 1, + 227, 54, 78, 54, 188, 1, 227, 54, 227, 136, 54, 188, 1, 213, 29, 227, + 136, 54, 188, 1, 227, 54, 255, 57, 54, 188, 1, 213, 29, 255, 57, 54, 188, + 1, 227, 54, 255, 19, 54, 188, 1, 213, 29, 255, 19, 54, 188, 1, 227, 54, + 254, 249, 54, 188, 1, 213, 29, 254, 249, 54, 188, 1, 227, 54, 255, 14, + 54, 188, 1, 213, 29, 255, 14, 54, 188, 1, 227, 54, 255, 32, 54, 188, 1, + 213, 29, 255, 32, 54, 188, 1, 227, 54, 255, 18, 54, 188, 1, 227, 54, 245, + 101, 54, 188, 1, 213, 29, 245, 101, 54, 188, 1, 227, 54, 253, 210, 54, + 188, 1, 213, 29, 253, 210, 54, 188, 1, 227, 54, 255, 1, 54, 188, 1, 213, + 29, 255, 1, 54, 188, 1, 227, 54, 255, 12, 54, 188, 1, 213, 29, 255, 12, + 54, 188, 1, 227, 54, 227, 135, 54, 188, 1, 213, 29, 227, 135, 54, 188, 1, + 227, 54, 254, 213, 54, 188, 1, 213, 29, 254, 213, 54, 188, 1, 227, 54, + 255, 11, 54, 188, 1, 227, 54, 245, 240, 54, 188, 1, 227, 54, 245, 238, + 54, 188, 1, 227, 54, 254, 159, 54, 188, 1, 227, 54, 255, 9, 54, 188, 1, + 213, 29, 255, 9, 54, 188, 1, 227, 54, 245, 211, 54, 188, 1, 213, 29, 245, + 211, 54, 188, 1, 227, 54, 245, 226, 54, 188, 1, 213, 29, 245, 226, 54, + 188, 1, 227, 54, 245, 198, 54, 188, 1, 213, 29, 245, 198, 54, 188, 1, + 213, 29, 254, 151, 54, 188, 1, 227, 54, 245, 217, 54, 188, 1, 213, 29, + 255, 8, 54, 188, 1, 227, 54, 245, 191, 54, 188, 1, 227, 54, 227, 78, 54, + 188, 1, 227, 54, 240, 223, 54, 188, 1, 227, 54, 246, 36, 54, 188, 1, 213, + 29, 246, 36, 54, 188, 1, 227, 54, 254, 86, 54, 188, 1, 213, 29, 254, 86, + 54, 188, 1, 227, 54, 236, 40, 54, 188, 1, 213, 29, 236, 40, 54, 188, 1, + 227, 54, 227, 63, 54, 188, 1, 213, 29, 227, 63, 54, 188, 1, 227, 54, 254, + 82, 54, 188, 1, 213, 29, 254, 82, 54, 188, 1, 227, 54, 255, 7, 54, 188, + 1, 227, 54, 254, 23, 54, 188, 1, 227, 54, 255, 5, 54, 188, 1, 227, 54, + 254, 17, 54, 188, 1, 213, 29, 254, 17, 54, 188, 1, 227, 54, 245, 161, 54, + 188, 1, 213, 29, 245, 161, 54, 188, 1, 227, 54, 253, 249, 54, 188, 1, + 213, 29, 253, 249, 54, 188, 1, 227, 54, 255, 2, 54, 188, 1, 213, 29, 255, + 2, 54, 188, 1, 227, 54, 227, 46, 54, 188, 1, 227, 54, 252, 171, 223, 64, + 21, 118, 223, 64, 21, 112, 223, 64, 21, 170, 223, 64, 21, 167, 223, 64, + 21, 185, 223, 64, 21, 192, 223, 64, 21, 200, 223, 64, 21, 198, 223, 64, + 21, 203, 223, 64, 51, 217, 213, 223, 64, 51, 216, 45, 223, 64, 51, 217, + 128, 223, 64, 51, 244, 104, 223, 64, 51, 244, 203, 223, 64, 51, 220, 58, + 223, 64, 51, 221, 60, 223, 64, 51, 246, 6, 223, 64, 51, 229, 90, 223, 64, + 51, 124, 241, 62, 223, 64, 51, 119, 241, 62, 223, 64, 51, 137, 241, 62, + 223, 64, 51, 244, 101, 241, 62, 223, 64, 51, 244, 170, 241, 62, 223, 64, + 51, 220, 72, 241, 62, 223, 64, 51, 221, 66, 241, 62, 223, 64, 51, 246, + 15, 241, 62, 223, 64, 51, 229, 95, 241, 62, 223, 64, 244, 92, 124, 242, + 129, 223, 64, 244, 92, 124, 224, 201, 223, 64, 244, 92, 124, 217, 134, + 223, 64, 244, 92, 119, 217, 132, 114, 5, 251, 55, 114, 5, 254, 113, 114, + 5, 214, 132, 114, 5, 235, 219, 114, 5, 215, 138, 114, 1, 63, 114, 1, 255, + 104, 114, 1, 75, 114, 1, 236, 145, 114, 1, 72, 114, 1, 215, 98, 114, 1, + 165, 152, 114, 1, 165, 223, 116, 114, 1, 165, 155, 114, 1, 165, 233, 55, + 114, 1, 77, 114, 1, 254, 236, 114, 1, 78, 114, 1, 253, 235, 114, 1, 183, + 114, 1, 234, 250, 114, 1, 243, 230, 114, 1, 243, 89, 114, 1, 229, 226, + 114, 1, 251, 88, 114, 1, 250, 215, 114, 1, 236, 0, 114, 1, 235, 230, 114, + 1, 228, 64, 114, 1, 216, 128, 114, 1, 216, 116, 114, 1, 248, 207, 114, 1, + 248, 191, 114, 1, 229, 6, 114, 1, 218, 66, 114, 1, 217, 174, 114, 1, 249, + 30, 114, 1, 248, 97, 114, 1, 207, 114, 1, 195, 114, 1, 226, 59, 114, 1, + 252, 234, 114, 1, 252, 65, 114, 1, 191, 114, 1, 189, 114, 1, 208, 114, 1, + 233, 255, 114, 1, 215, 8, 114, 1, 221, 47, 114, 1, 219, 176, 114, 1, 222, + 227, 114, 1, 162, 114, 1, 233, 54, 114, 1, 54, 36, 233, 45, 114, 1, 54, + 36, 223, 115, 114, 1, 54, 36, 228, 246, 114, 30, 5, 255, 104, 114, 30, 5, + 252, 63, 255, 104, 114, 30, 5, 75, 114, 30, 5, 236, 145, 114, 30, 5, 72, + 114, 30, 5, 215, 98, 114, 30, 5, 165, 152, 114, 30, 5, 165, 223, 116, + 114, 30, 5, 165, 155, 114, 30, 5, 165, 233, 55, 114, 30, 5, 77, 114, 30, + 5, 254, 236, 114, 30, 5, 78, 114, 30, 5, 253, 235, 114, 214, 137, 114, + 248, 245, 114, 52, 248, 245, 114, 225, 63, 247, 195, 114, 225, 63, 52, + 247, 195, 114, 225, 63, 233, 83, 114, 225, 63, 249, 200, 134, 114, 225, + 63, 232, 244, 114, 51, 118, 114, 51, 112, 114, 51, 170, 114, 51, 167, + 114, 51, 185, 114, 51, 192, 114, 51, 200, 114, 51, 198, 114, 51, 203, + 114, 51, 217, 213, 114, 51, 216, 45, 114, 51, 217, 128, 114, 51, 244, + 104, 114, 51, 244, 203, 114, 51, 220, 58, 114, 51, 221, 60, 114, 51, 246, + 6, 114, 51, 229, 90, 114, 51, 124, 241, 62, 114, 51, 124, 217, 113, 114, + 21, 212, 79, 114, 21, 118, 114, 21, 112, 114, 21, 170, 114, 21, 167, 114, + 21, 185, 114, 21, 192, 114, 21, 200, 114, 21, 198, 114, 21, 203, 235, + 106, 5, 251, 55, 235, 106, 5, 254, 113, 235, 106, 5, 214, 132, 235, 106, + 1, 63, 235, 106, 1, 255, 104, 235, 106, 1, 75, 235, 106, 1, 236, 145, + 235, 106, 1, 72, 235, 106, 1, 215, 98, 235, 106, 1, 77, 235, 106, 1, 254, + 236, 235, 106, 1, 78, 235, 106, 1, 253, 235, 235, 106, 1, 183, 235, 106, + 1, 234, 250, 235, 106, 1, 243, 230, 235, 106, 1, 243, 89, 235, 106, 1, + 229, 226, 235, 106, 1, 251, 88, 235, 106, 1, 250, 215, 235, 106, 1, 236, + 0, 235, 106, 1, 235, 230, 235, 106, 1, 228, 64, 235, 106, 1, 216, 128, + 235, 106, 1, 216, 116, 235, 106, 1, 248, 207, 235, 106, 1, 248, 196, 235, + 106, 1, 248, 191, 235, 106, 1, 223, 226, 235, 106, 1, 229, 6, 235, 106, + 1, 218, 66, 235, 106, 1, 217, 174, 235, 106, 1, 249, 30, 235, 106, 1, + 248, 97, 235, 106, 1, 207, 235, 106, 1, 195, 235, 106, 1, 226, 59, 235, + 106, 1, 252, 234, 235, 106, 1, 252, 65, 235, 106, 1, 191, 235, 106, 1, + 189, 235, 106, 1, 208, 235, 106, 1, 233, 255, 235, 106, 1, 215, 8, 235, + 106, 1, 221, 47, 235, 106, 1, 219, 176, 235, 106, 1, 222, 227, 235, 106, + 1, 162, 235, 106, 30, 5, 255, 104, 235, 106, 30, 5, 75, 235, 106, 30, 5, + 236, 145, 235, 106, 30, 5, 72, 235, 106, 30, 5, 215, 98, 235, 106, 30, 5, + 77, 235, 106, 30, 5, 254, 236, 235, 106, 30, 5, 78, 235, 106, 30, 5, 253, + 235, 235, 106, 5, 214, 137, 235, 106, 5, 228, 103, 235, 106, 255, 53, 53, + 235, 106, 245, 201, 53, 235, 106, 51, 53, 235, 106, 222, 115, 79, 235, + 106, 52, 222, 115, 79, 235, 106, 248, 245, 235, 106, 52, 248, 245, 15, 5, + 63, 15, 5, 111, 29, 63, 15, 5, 111, 29, 252, 221, 15, 5, 111, 29, 243, + 201, 217, 205, 15, 5, 111, 29, 162, 15, 5, 111, 29, 236, 147, 15, 5, 111, + 29, 233, 237, 242, 196, 15, 5, 111, 29, 230, 201, 15, 5, 111, 29, 222, + 215, 15, 5, 255, 106, 15, 5, 255, 57, 15, 5, 255, 58, 29, 254, 15, 15, 5, + 255, 58, 29, 246, 143, 242, 196, 15, 5, 255, 58, 29, 243, 214, 15, 5, + 255, 58, 29, 243, 201, 217, 205, 15, 5, 255, 58, 29, 162, 15, 5, 255, 58, + 29, 236, 148, 242, 196, 15, 5, 255, 58, 29, 236, 121, 15, 5, 255, 58, 29, + 233, 238, 15, 5, 255, 58, 29, 220, 249, 15, 5, 255, 58, 29, 103, 95, 103, + 95, 72, 15, 5, 255, 58, 242, 196, 15, 5, 255, 55, 15, 5, 255, 56, 29, + 252, 206, 15, 5, 255, 56, 29, 243, 201, 217, 205, 15, 5, 255, 56, 29, + 231, 227, 95, 245, 229, 15, 5, 255, 56, 29, 221, 45, 15, 5, 255, 56, 29, + 218, 35, 15, 5, 255, 32, 15, 5, 254, 221, 15, 5, 254, 222, 29, 245, 171, + 15, 5, 254, 222, 29, 220, 211, 95, 243, 30, 15, 5, 254, 213, 15, 5, 254, + 214, 29, 254, 213, 15, 5, 254, 214, 29, 248, 33, 15, 5, 254, 214, 29, + 243, 30, 15, 5, 254, 214, 29, 162, 15, 5, 254, 214, 29, 235, 117, 15, 5, + 254, 214, 29, 234, 212, 15, 5, 254, 214, 29, 221, 8, 15, 5, 254, 214, 29, + 215, 106, 15, 5, 254, 210, 15, 5, 254, 203, 15, 5, 254, 168, 15, 5, 254, + 169, 29, 221, 8, 15, 5, 254, 159, 15, 5, 254, 160, 113, 254, 159, 15, 5, + 254, 160, 137, 217, 52, 15, 5, 254, 160, 95, 230, 104, 227, 68, 254, 160, + 95, 230, 103, 15, 5, 254, 160, 95, 230, 104, 219, 184, 15, 5, 254, 132, + 15, 5, 254, 106, 15, 5, 254, 76, 15, 5, 254, 77, 29, 234, 60, 15, 5, 254, + 50, 15, 5, 254, 22, 15, 5, 254, 17, 15, 5, 254, 18, 212, 33, 217, 205, + 15, 5, 254, 18, 235, 121, 217, 205, 15, 5, 254, 18, 113, 254, 18, 216, + 86, 113, 216, 86, 216, 86, 113, 216, 86, 226, 186, 15, 5, 254, 18, 113, + 254, 18, 113, 254, 17, 15, 5, 254, 18, 113, 254, 18, 113, 254, 18, 249, + 188, 254, 18, 113, 254, 18, 113, 254, 17, 15, 5, 254, 15, 15, 5, 254, 12, + 15, 5, 252, 234, 15, 5, 252, 221, 15, 5, 252, 216, 15, 5, 252, 213, 15, + 5, 252, 207, 15, 5, 252, 208, 113, 252, 207, 15, 5, 252, 206, 15, 5, 134, + 15, 5, 252, 186, 15, 5, 252, 54, 15, 5, 252, 55, 29, 63, 15, 5, 252, 55, + 29, 243, 192, 15, 5, 252, 55, 29, 236, 148, 242, 196, 15, 5, 251, 179, + 15, 5, 251, 180, 113, 251, 180, 255, 57, 15, 5, 251, 180, 113, 251, 180, + 215, 166, 15, 5, 251, 180, 249, 188, 251, 179, 15, 5, 251, 163, 15, 5, + 251, 164, 113, 251, 163, 15, 5, 251, 152, 15, 5, 251, 151, 15, 5, 249, + 30, 15, 5, 249, 21, 15, 5, 249, 22, 234, 186, 29, 111, 95, 232, 25, 15, + 5, 249, 22, 234, 186, 29, 254, 168, 15, 5, 249, 22, 234, 186, 29, 252, + 206, 15, 5, 249, 22, 234, 186, 29, 252, 54, 15, 5, 249, 22, 234, 186, 29, + 243, 230, 15, 5, 249, 22, 234, 186, 29, 243, 231, 95, 232, 25, 15, 5, + 249, 22, 234, 186, 29, 243, 54, 15, 5, 249, 22, 234, 186, 29, 243, 37, + 15, 5, 249, 22, 234, 186, 29, 242, 205, 15, 5, 249, 22, 234, 186, 29, + 162, 15, 5, 249, 22, 234, 186, 29, 236, 38, 15, 5, 249, 22, 234, 186, 29, + 236, 39, 95, 232, 230, 15, 5, 249, 22, 234, 186, 29, 235, 104, 15, 5, + 249, 22, 234, 186, 29, 233, 255, 15, 5, 249, 22, 234, 186, 29, 232, 230, + 15, 5, 249, 22, 234, 186, 29, 232, 231, 95, 232, 24, 15, 5, 249, 22, 234, + 186, 29, 232, 216, 15, 5, 249, 22, 234, 186, 29, 229, 254, 15, 5, 249, + 22, 234, 186, 29, 226, 187, 95, 226, 186, 15, 5, 249, 22, 234, 186, 29, + 220, 136, 15, 5, 249, 22, 234, 186, 29, 218, 35, 15, 5, 249, 22, 234, + 186, 29, 215, 204, 95, 243, 37, 15, 5, 249, 22, 234, 186, 29, 215, 106, + 15, 5, 248, 254, 15, 5, 248, 233, 15, 5, 248, 232, 15, 5, 248, 231, 15, + 5, 248, 76, 15, 5, 248, 59, 15, 5, 248, 34, 15, 5, 248, 35, 29, 221, 8, + 15, 5, 248, 33, 15, 5, 248, 23, 15, 5, 248, 24, 235, 70, 103, 242, 197, + 248, 4, 15, 5, 248, 4, 15, 5, 246, 154, 15, 5, 246, 155, 113, 246, 154, + 15, 5, 246, 155, 242, 196, 15, 5, 246, 155, 220, 246, 15, 5, 246, 152, + 15, 5, 246, 153, 29, 245, 158, 15, 5, 246, 151, 15, 5, 246, 150, 15, 5, + 246, 149, 15, 5, 246, 148, 15, 5, 246, 144, 15, 5, 246, 142, 15, 5, 246, + 143, 242, 196, 15, 5, 246, 143, 242, 197, 242, 196, 15, 5, 246, 141, 15, + 5, 246, 134, 15, 5, 77, 15, 5, 154, 29, 226, 186, 15, 5, 154, 113, 154, + 228, 94, 113, 228, 93, 15, 5, 246, 55, 15, 5, 246, 56, 29, 111, 95, 242, + 151, 95, 249, 30, 15, 5, 246, 56, 29, 243, 192, 15, 5, 246, 56, 29, 231, + 112, 15, 5, 246, 56, 29, 222, 203, 15, 5, 246, 56, 29, 221, 8, 15, 5, + 246, 56, 29, 72, 15, 5, 246, 32, 15, 5, 246, 22, 15, 5, 245, 252, 15, 5, + 245, 229, 15, 5, 245, 230, 29, 243, 200, 15, 5, 245, 230, 29, 243, 201, + 217, 205, 15, 5, 245, 230, 29, 231, 226, 15, 5, 245, 230, 249, 188, 245, + 229, 15, 5, 245, 230, 227, 68, 245, 229, 15, 5, 245, 230, 219, 184, 15, + 5, 245, 173, 15, 5, 245, 171, 15, 5, 245, 158, 15, 5, 245, 99, 15, 5, + 245, 100, 29, 63, 15, 5, 245, 100, 29, 111, 95, 233, 226, 15, 5, 245, + 100, 29, 111, 95, 233, 227, 29, 233, 226, 15, 5, 245, 100, 29, 254, 159, + 15, 5, 245, 100, 29, 252, 221, 15, 5, 245, 100, 29, 246, 143, 242, 196, + 15, 5, 245, 100, 29, 246, 143, 242, 197, 242, 196, 15, 5, 245, 100, 29, + 162, 15, 5, 245, 100, 29, 242, 151, 242, 196, 15, 5, 245, 100, 29, 236, + 148, 242, 196, 15, 5, 245, 100, 29, 235, 69, 15, 5, 245, 100, 29, 235, + 70, 219, 184, 15, 5, 245, 100, 29, 234, 79, 15, 5, 245, 100, 29, 233, + 255, 15, 5, 245, 100, 29, 233, 227, 29, 233, 226, 15, 5, 245, 100, 29, + 233, 111, 15, 5, 245, 100, 29, 232, 230, 15, 5, 245, 100, 29, 215, 203, + 15, 5, 245, 100, 29, 215, 194, 15, 5, 243, 230, 15, 5, 243, 231, 242, + 196, 15, 5, 243, 228, 15, 5, 243, 229, 29, 111, 95, 249, 31, 95, 162, 15, + 5, 243, 229, 29, 111, 95, 162, 15, 5, 243, 229, 29, 111, 95, 236, 147, + 15, 5, 243, 229, 29, 255, 56, 217, 206, 95, 218, 55, 15, 5, 243, 229, 29, + 254, 159, 15, 5, 243, 229, 29, 254, 17, 15, 5, 243, 229, 29, 254, 16, 95, + 243, 214, 15, 5, 243, 229, 29, 252, 221, 15, 5, 243, 229, 29, 252, 187, + 95, 208, 15, 5, 243, 229, 29, 251, 152, 15, 5, 243, 229, 29, 251, 153, + 95, 208, 15, 5, 243, 229, 29, 249, 30, 15, 5, 243, 229, 29, 248, 76, 15, + 5, 243, 229, 29, 248, 35, 29, 221, 8, 15, 5, 243, 229, 29, 246, 152, 15, + 5, 243, 229, 29, 245, 252, 15, 5, 243, 229, 29, 245, 253, 95, 233, 255, + 15, 5, 243, 229, 29, 245, 229, 15, 5, 243, 229, 29, 245, 230, 29, 243, + 201, 217, 205, 15, 5, 243, 229, 29, 243, 201, 217, 205, 15, 5, 243, 229, + 29, 243, 192, 15, 5, 243, 229, 29, 243, 54, 15, 5, 243, 229, 29, 243, 52, + 15, 5, 243, 229, 29, 243, 53, 95, 63, 15, 5, 243, 229, 29, 243, 38, 95, + 219, 41, 15, 5, 243, 229, 29, 242, 151, 95, 232, 231, 95, 245, 158, 15, + 5, 243, 229, 29, 242, 132, 15, 5, 243, 229, 29, 242, 133, 95, 233, 255, + 15, 5, 243, 229, 29, 242, 29, 95, 233, 111, 15, 5, 243, 229, 29, 241, 70, + 15, 5, 243, 229, 29, 236, 148, 242, 196, 15, 5, 243, 229, 29, 236, 25, + 95, 241, 75, 95, 254, 17, 15, 5, 243, 229, 29, 235, 104, 15, 5, 243, 229, + 29, 235, 69, 15, 5, 243, 229, 29, 234, 209, 15, 5, 243, 229, 29, 234, + 210, 95, 233, 226, 15, 5, 243, 229, 29, 234, 80, 95, 254, 159, 15, 5, + 243, 229, 29, 233, 255, 15, 5, 243, 229, 29, 231, 227, 95, 245, 229, 15, + 5, 243, 229, 29, 231, 112, 15, 5, 243, 229, 29, 228, 93, 15, 5, 243, 229, + 29, 228, 94, 113, 228, 93, 15, 5, 243, 229, 29, 195, 15, 5, 243, 229, 29, + 222, 203, 15, 5, 243, 229, 29, 222, 171, 15, 5, 243, 229, 29, 221, 8, 15, + 5, 243, 229, 29, 221, 9, 95, 216, 70, 15, 5, 243, 229, 29, 220, 231, 15, + 5, 243, 229, 29, 219, 2, 15, 5, 243, 229, 29, 218, 35, 15, 5, 243, 229, + 29, 72, 15, 5, 243, 229, 29, 215, 194, 15, 5, 243, 229, 29, 215, 195, 95, + 246, 154, 15, 5, 243, 229, 113, 243, 228, 15, 5, 243, 223, 15, 5, 243, + 224, 249, 188, 243, 223, 15, 5, 243, 221, 15, 5, 243, 222, 113, 243, 222, + 243, 193, 113, 243, 192, 15, 5, 243, 214, 15, 5, 243, 215, 243, 222, 113, + 243, 222, 243, 193, 113, 243, 192, 15, 5, 243, 213, 15, 5, 243, 211, 15, + 5, 243, 202, 15, 5, 243, 200, 15, 5, 243, 201, 217, 205, 15, 5, 243, 201, + 113, 243, 200, 15, 5, 243, 201, 249, 188, 243, 200, 15, 5, 243, 192, 15, + 5, 243, 191, 15, 5, 243, 186, 15, 5, 243, 132, 15, 5, 243, 133, 29, 234, + 60, 15, 5, 243, 54, 15, 5, 243, 55, 29, 77, 15, 5, 243, 55, 29, 72, 15, + 5, 243, 55, 249, 188, 243, 54, 15, 5, 243, 52, 15, 5, 243, 53, 113, 243, + 52, 15, 5, 243, 53, 249, 188, 243, 52, 15, 5, 243, 49, 15, 5, 243, 37, + 15, 5, 243, 38, 242, 196, 15, 5, 243, 35, 15, 5, 243, 36, 29, 111, 95, + 236, 147, 15, 5, 243, 36, 29, 243, 201, 217, 205, 15, 5, 243, 36, 29, + 236, 147, 15, 5, 243, 36, 29, 232, 231, 95, 236, 147, 15, 5, 243, 36, 29, + 195, 15, 5, 243, 32, 15, 5, 243, 30, 15, 5, 243, 31, 249, 188, 243, 30, + 15, 5, 243, 31, 29, 252, 221, 15, 5, 243, 31, 29, 218, 35, 15, 5, 243, + 31, 217, 205, 15, 5, 242, 213, 15, 5, 242, 214, 249, 188, 242, 213, 15, + 5, 242, 211, 15, 5, 242, 212, 29, 235, 104, 15, 5, 242, 212, 29, 235, + 105, 29, 236, 148, 242, 196, 15, 5, 242, 212, 29, 228, 93, 15, 5, 242, + 212, 29, 222, 204, 95, 216, 85, 15, 5, 242, 212, 242, 196, 15, 5, 242, + 205, 15, 5, 242, 206, 29, 111, 95, 234, 60, 15, 5, 242, 206, 29, 234, 60, + 15, 5, 242, 206, 113, 242, 206, 232, 223, 15, 5, 242, 200, 15, 5, 242, + 198, 15, 5, 242, 199, 29, 221, 8, 15, 5, 242, 190, 15, 5, 242, 189, 15, + 5, 242, 186, 15, 5, 242, 185, 15, 5, 162, 15, 5, 242, 151, 217, 205, 15, + 5, 242, 151, 242, 196, 15, 5, 242, 132, 15, 5, 242, 28, 15, 5, 242, 29, + 29, 254, 17, 15, 5, 242, 29, 29, 254, 15, 15, 5, 242, 29, 29, 252, 221, + 15, 5, 242, 29, 29, 248, 4, 15, 5, 242, 29, 29, 243, 221, 15, 5, 242, 29, + 29, 234, 201, 15, 5, 242, 29, 29, 228, 93, 15, 5, 242, 29, 29, 221, 8, + 15, 5, 242, 29, 29, 72, 15, 5, 241, 74, 15, 5, 241, 70, 15, 5, 241, 71, + 29, 254, 159, 15, 5, 241, 71, 29, 242, 132, 15, 5, 241, 71, 29, 235, 69, + 15, 5, 241, 71, 29, 233, 67, 15, 5, 241, 71, 29, 215, 194, 15, 5, 241, + 67, 15, 5, 75, 15, 5, 241, 7, 63, 15, 5, 240, 225, 15, 5, 236, 175, 15, + 5, 236, 176, 113, 236, 176, 251, 152, 15, 5, 236, 176, 113, 236, 176, + 219, 184, 15, 5, 236, 150, 15, 5, 236, 147, 15, 5, 236, 148, 248, 59, 15, + 5, 236, 148, 223, 222, 15, 5, 236, 148, 113, 236, 148, 220, 215, 113, + 220, 215, 215, 195, 113, 215, 194, 15, 5, 236, 148, 242, 196, 15, 5, 236, + 139, 15, 5, 236, 140, 29, 243, 201, 217, 205, 15, 5, 236, 138, 15, 5, + 236, 128, 15, 5, 236, 129, 29, 218, 35, 15, 5, 236, 129, 249, 188, 236, + 128, 15, 5, 236, 129, 227, 68, 236, 128, 15, 5, 236, 129, 219, 184, 15, + 5, 236, 121, 15, 5, 236, 112, 15, 5, 236, 38, 15, 5, 236, 24, 15, 5, 183, + 15, 5, 235, 131, 29, 63, 15, 5, 235, 131, 29, 255, 32, 15, 5, 235, 131, + 29, 255, 33, 95, 234, 79, 15, 5, 235, 131, 29, 254, 15, 15, 5, 235, 131, + 29, 252, 221, 15, 5, 235, 131, 29, 252, 206, 15, 5, 235, 131, 29, 134, + 15, 5, 235, 131, 29, 252, 54, 15, 5, 235, 131, 29, 245, 171, 15, 5, 235, + 131, 29, 245, 158, 15, 5, 235, 131, 29, 243, 230, 15, 5, 235, 131, 29, + 243, 214, 15, 5, 235, 131, 29, 243, 201, 217, 205, 15, 5, 235, 131, 29, + 243, 192, 15, 5, 235, 131, 29, 243, 193, 95, 221, 46, 95, 63, 15, 5, 235, + 131, 29, 243, 54, 15, 5, 235, 131, 29, 243, 37, 15, 5, 235, 131, 29, 243, + 31, 95, 222, 171, 15, 5, 235, 131, 29, 243, 31, 249, 188, 243, 30, 15, 5, + 235, 131, 29, 242, 213, 15, 5, 235, 131, 29, 242, 189, 15, 5, 235, 131, + 29, 236, 147, 15, 5, 235, 131, 29, 236, 128, 15, 5, 235, 131, 29, 235, + 104, 15, 5, 235, 131, 29, 234, 212, 15, 5, 235, 131, 29, 234, 209, 15, 5, + 235, 131, 29, 233, 111, 15, 5, 235, 131, 29, 232, 230, 15, 5, 235, 131, + 29, 231, 226, 15, 5, 235, 131, 29, 231, 227, 95, 246, 154, 15, 5, 235, + 131, 29, 231, 227, 95, 243, 54, 15, 5, 235, 131, 29, 231, 227, 95, 217, + 242, 15, 5, 235, 131, 29, 231, 112, 15, 5, 235, 131, 29, 231, 113, 95, + 228, 88, 15, 5, 235, 131, 29, 229, 254, 15, 5, 235, 131, 29, 228, 93, 15, + 5, 235, 131, 29, 226, 20, 15, 5, 235, 131, 29, 223, 77, 15, 5, 235, 131, + 29, 222, 227, 15, 5, 235, 131, 29, 222, 171, 15, 5, 235, 131, 29, 221, + 47, 15, 5, 235, 131, 29, 221, 8, 15, 5, 235, 131, 29, 220, 231, 15, 5, + 235, 131, 29, 220, 170, 15, 5, 235, 131, 29, 220, 127, 15, 5, 235, 131, + 29, 219, 10, 15, 5, 235, 131, 29, 218, 14, 15, 5, 235, 131, 29, 72, 15, + 5, 235, 131, 29, 215, 203, 15, 5, 235, 131, 29, 215, 194, 15, 5, 235, + 131, 29, 215, 169, 29, 195, 15, 5, 235, 131, 29, 215, 106, 15, 5, 235, + 131, 29, 212, 37, 15, 5, 235, 129, 15, 5, 235, 130, 249, 188, 235, 129, + 15, 5, 235, 122, 15, 5, 235, 119, 15, 5, 235, 117, 15, 5, 235, 116, 15, + 5, 235, 114, 15, 5, 235, 115, 113, 235, 114, 15, 5, 235, 104, 15, 5, 235, + 105, 29, 236, 148, 242, 196, 15, 5, 235, 100, 15, 5, 235, 101, 29, 252, + 221, 15, 5, 235, 101, 249, 188, 235, 100, 15, 5, 235, 98, 15, 5, 235, 97, + 15, 5, 235, 69, 15, 5, 235, 70, 233, 239, 29, 103, 113, 233, 239, 29, 72, + 15, 5, 235, 70, 113, 235, 70, 233, 239, 29, 103, 113, 233, 239, 29, 72, + 15, 5, 235, 19, 15, 5, 234, 212, 15, 5, 234, 213, 29, 252, 221, 15, 5, + 234, 213, 29, 72, 15, 5, 234, 213, 29, 215, 194, 15, 5, 234, 209, 15, 5, + 234, 201, 15, 5, 234, 188, 15, 5, 234, 187, 15, 5, 234, 185, 15, 5, 234, + 186, 113, 234, 185, 15, 5, 234, 81, 15, 5, 234, 82, 113, 242, 29, 29, + 254, 16, 234, 82, 113, 242, 29, 29, 254, 15, 15, 5, 234, 79, 15, 5, 234, + 77, 15, 5, 234, 78, 214, 250, 17, 15, 5, 234, 76, 15, 5, 234, 73, 15, 5, + 234, 74, 242, 196, 15, 5, 234, 72, 15, 5, 234, 60, 15, 5, 234, 61, 227, + 68, 234, 60, 15, 5, 234, 55, 15, 5, 234, 36, 15, 5, 233, 255, 15, 5, 233, + 238, 15, 5, 233, 239, 29, 63, 15, 5, 233, 239, 29, 111, 95, 249, 31, 95, + 162, 15, 5, 233, 239, 29, 111, 95, 243, 192, 15, 5, 233, 239, 29, 111, + 95, 233, 226, 15, 5, 233, 239, 29, 254, 213, 15, 5, 233, 239, 29, 254, + 159, 15, 5, 233, 239, 29, 254, 18, 212, 33, 217, 205, 15, 5, 233, 239, + 29, 252, 221, 15, 5, 233, 239, 29, 252, 54, 15, 5, 233, 239, 29, 248, + 233, 15, 5, 233, 239, 29, 245, 229, 15, 5, 233, 239, 29, 243, 230, 15, 5, + 233, 239, 29, 243, 192, 15, 5, 233, 239, 29, 242, 205, 15, 5, 233, 239, + 29, 242, 206, 95, 242, 205, 15, 5, 233, 239, 29, 162, 15, 5, 233, 239, + 29, 242, 132, 15, 5, 233, 239, 29, 242, 29, 29, 228, 93, 15, 5, 233, 239, + 29, 236, 148, 242, 196, 15, 5, 233, 239, 29, 236, 128, 15, 5, 233, 239, + 29, 236, 129, 95, 162, 15, 5, 233, 239, 29, 236, 129, 95, 232, 230, 15, + 5, 233, 239, 29, 234, 212, 15, 5, 233, 239, 29, 234, 201, 15, 5, 233, + 239, 29, 234, 79, 15, 5, 233, 239, 29, 234, 73, 15, 5, 233, 239, 29, 234, + 74, 95, 242, 29, 95, 63, 15, 5, 233, 239, 29, 233, 238, 15, 5, 233, 239, + 29, 233, 67, 15, 5, 233, 239, 29, 232, 230, 15, 5, 233, 239, 29, 232, + 218, 15, 5, 233, 239, 29, 231, 226, 15, 5, 233, 239, 29, 231, 227, 95, + 245, 229, 15, 5, 233, 239, 29, 230, 201, 15, 5, 233, 239, 29, 229, 254, + 15, 5, 233, 239, 29, 221, 9, 95, 219, 2, 15, 5, 233, 239, 29, 220, 211, + 95, 243, 31, 95, 245, 171, 15, 5, 233, 239, 29, 220, 211, 95, 243, 31, + 217, 205, 15, 5, 233, 239, 29, 220, 168, 15, 5, 233, 239, 29, 220, 169, + 95, 220, 168, 15, 5, 233, 239, 29, 219, 2, 15, 5, 233, 239, 29, 218, 47, + 15, 5, 233, 239, 29, 218, 35, 15, 5, 233, 239, 29, 217, 243, 95, 111, 95, + 219, 42, 95, 207, 15, 5, 233, 239, 29, 72, 15, 5, 233, 239, 29, 103, 95, + 63, 15, 5, 233, 239, 29, 103, 95, 103, 95, 72, 15, 5, 233, 239, 29, 215, + 204, 95, 254, 17, 15, 5, 233, 239, 29, 215, 194, 15, 5, 233, 239, 29, + 215, 106, 15, 5, 233, 239, 219, 184, 15, 5, 233, 236, 15, 5, 233, 237, + 29, 221, 8, 15, 5, 233, 237, 29, 221, 9, 95, 219, 2, 15, 5, 233, 237, + 242, 196, 15, 5, 233, 237, 242, 197, 113, 233, 237, 242, 197, 221, 8, 15, + 5, 233, 233, 15, 5, 233, 226, 15, 5, 233, 227, 29, 233, 226, 15, 5, 233, + 224, 15, 5, 233, 225, 29, 234, 60, 15, 5, 233, 225, 29, 234, 61, 95, 223, + 77, 15, 5, 233, 111, 15, 5, 233, 96, 15, 5, 233, 86, 15, 5, 233, 67, 15, + 5, 232, 230, 15, 5, 232, 231, 29, 252, 221, 15, 5, 232, 228, 15, 5, 232, + 229, 29, 254, 213, 15, 5, 232, 229, 29, 252, 221, 15, 5, 232, 229, 29, + 245, 158, 15, 5, 232, 229, 29, 245, 159, 217, 205, 15, 5, 232, 229, 29, + 243, 201, 217, 205, 15, 5, 232, 229, 29, 242, 29, 29, 252, 221, 15, 5, + 232, 229, 29, 236, 128, 15, 5, 232, 229, 29, 235, 119, 15, 5, 232, 229, + 29, 235, 117, 15, 5, 232, 229, 29, 235, 118, 95, 254, 17, 15, 5, 232, + 229, 29, 234, 212, 15, 5, 232, 229, 29, 234, 0, 95, 254, 17, 15, 5, 232, + 229, 29, 233, 238, 15, 5, 232, 229, 29, 231, 227, 95, 245, 229, 15, 5, + 232, 229, 29, 229, 254, 15, 5, 232, 229, 29, 228, 135, 15, 5, 232, 229, + 29, 220, 137, 95, 254, 17, 15, 5, 232, 229, 29, 220, 119, 95, 251, 179, + 15, 5, 232, 229, 29, 216, 85, 15, 5, 232, 229, 217, 205, 15, 5, 232, 229, + 249, 188, 232, 228, 15, 5, 232, 229, 227, 68, 232, 228, 15, 5, 232, 229, + 219, 184, 15, 5, 232, 229, 220, 246, 15, 5, 232, 227, 15, 5, 232, 223, + 15, 5, 232, 224, 113, 232, 223, 15, 5, 232, 224, 227, 68, 232, 223, 15, + 5, 232, 224, 220, 246, 15, 5, 232, 221, 15, 5, 232, 218, 15, 5, 232, 216, + 15, 5, 232, 217, 113, 232, 216, 15, 5, 232, 217, 113, 232, 217, 243, 193, + 113, 243, 192, 15, 5, 191, 15, 5, 232, 116, 29, 218, 35, 15, 5, 232, 116, + 242, 196, 15, 5, 232, 115, 15, 5, 232, 88, 15, 5, 232, 44, 15, 5, 232, + 25, 15, 5, 232, 24, 15, 5, 231, 226, 15, 5, 231, 182, 15, 5, 231, 112, + 15, 5, 231, 71, 15, 5, 230, 242, 15, 5, 230, 243, 113, 230, 242, 15, 5, + 230, 233, 15, 5, 230, 234, 242, 196, 15, 5, 230, 218, 15, 5, 230, 204, + 15, 5, 230, 201, 15, 5, 230, 202, 29, 63, 15, 5, 230, 202, 29, 234, 60, + 15, 5, 230, 202, 29, 212, 109, 15, 5, 230, 202, 113, 230, 201, 15, 5, + 230, 202, 113, 230, 202, 29, 111, 95, 207, 15, 5, 230, 202, 249, 188, + 230, 201, 15, 5, 230, 199, 15, 5, 230, 200, 29, 63, 15, 5, 230, 200, 29, + 111, 95, 248, 76, 15, 5, 230, 200, 29, 248, 76, 15, 5, 230, 200, 242, + 196, 15, 5, 207, 15, 5, 230, 114, 15, 5, 230, 103, 15, 5, 230, 104, 236, + 51, 15, 5, 230, 104, 29, 220, 171, 217, 205, 15, 5, 230, 104, 227, 68, + 230, 103, 15, 5, 230, 102, 15, 5, 230, 96, 228, 79, 15, 5, 230, 95, 15, + 5, 230, 94, 15, 5, 229, 254, 15, 5, 229, 255, 29, 63, 15, 5, 229, 255, + 29, 215, 194, 15, 5, 229, 255, 220, 246, 15, 5, 229, 128, 15, 5, 229, + 129, 29, 77, 15, 5, 229, 127, 15, 5, 229, 98, 15, 5, 229, 99, 29, 243, + 201, 217, 205, 15, 5, 229, 99, 29, 243, 193, 95, 243, 201, 217, 205, 15, + 5, 229, 96, 15, 5, 229, 97, 29, 254, 159, 15, 5, 229, 97, 29, 254, 17, + 15, 5, 229, 97, 29, 254, 18, 95, 254, 17, 15, 5, 229, 97, 29, 242, 205, + 15, 5, 229, 97, 29, 231, 227, 95, 243, 201, 217, 205, 15, 5, 229, 97, 29, + 229, 254, 15, 5, 229, 97, 29, 228, 93, 15, 5, 229, 97, 29, 221, 8, 15, 5, + 229, 97, 29, 221, 9, 95, 111, 254, 159, 15, 5, 229, 97, 29, 221, 9, 95, + 254, 17, 15, 5, 229, 97, 29, 221, 9, 95, 254, 18, 95, 254, 17, 15, 5, + 229, 97, 29, 215, 204, 95, 254, 17, 15, 5, 229, 97, 29, 215, 106, 15, 5, + 229, 85, 15, 5, 228, 135, 15, 5, 228, 108, 15, 5, 228, 93, 15, 5, 228, + 94, 233, 237, 29, 243, 192, 15, 5, 228, 94, 233, 237, 29, 232, 25, 15, 5, + 228, 94, 233, 237, 29, 222, 203, 15, 5, 228, 94, 233, 237, 29, 222, 204, + 113, 228, 94, 233, 237, 29, 222, 203, 15, 5, 228, 94, 233, 237, 29, 215, + 106, 15, 5, 228, 94, 217, 205, 15, 5, 228, 94, 113, 228, 93, 15, 5, 228, + 94, 249, 188, 228, 93, 15, 5, 228, 94, 249, 188, 228, 94, 233, 237, 113, + 233, 236, 15, 5, 228, 88, 15, 5, 228, 89, 255, 56, 29, 254, 12, 15, 5, + 228, 89, 255, 56, 29, 252, 54, 15, 5, 228, 89, 255, 56, 29, 246, 150, 15, + 5, 228, 89, 255, 56, 29, 242, 205, 15, 5, 228, 89, 255, 56, 29, 236, 148, + 242, 196, 15, 5, 228, 89, 255, 56, 29, 235, 117, 15, 5, 228, 89, 255, 56, + 29, 233, 255, 15, 5, 228, 89, 255, 56, 29, 229, 254, 15, 5, 228, 89, 255, + 56, 29, 220, 116, 15, 5, 228, 89, 255, 56, 29, 215, 203, 15, 5, 228, 89, + 234, 186, 29, 252, 54, 15, 5, 228, 89, 234, 186, 29, 252, 55, 72, 15, 5, + 195, 15, 5, 226, 242, 15, 5, 226, 211, 15, 5, 226, 186, 15, 5, 226, 73, + 15, 5, 226, 20, 15, 5, 226, 21, 29, 63, 15, 5, 226, 21, 29, 255, 57, 15, + 5, 226, 21, 29, 252, 54, 15, 5, 226, 21, 29, 251, 179, 15, 5, 226, 21, + 29, 77, 15, 5, 226, 21, 29, 75, 15, 5, 226, 21, 29, 240, 225, 15, 5, 226, + 21, 29, 72, 15, 5, 226, 21, 29, 215, 203, 15, 5, 226, 21, 249, 188, 226, + 20, 15, 5, 225, 221, 15, 5, 225, 222, 29, 235, 100, 15, 5, 225, 222, 29, + 215, 194, 15, 5, 225, 222, 29, 212, 109, 15, 5, 225, 222, 227, 68, 225, + 221, 15, 5, 208, 15, 5, 224, 107, 15, 5, 223, 222, 15, 5, 223, 77, 15, 5, + 222, 227, 15, 5, 222, 216, 228, 79, 15, 5, 222, 215, 15, 5, 222, 216, 29, + 63, 15, 5, 222, 216, 29, 246, 154, 15, 5, 222, 216, 29, 246, 152, 15, 5, + 222, 216, 29, 162, 15, 5, 222, 216, 29, 235, 104, 15, 5, 222, 216, 29, + 234, 60, 15, 5, 222, 216, 29, 232, 216, 15, 5, 222, 216, 29, 231, 112, + 15, 5, 222, 216, 29, 228, 93, 15, 5, 222, 216, 29, 222, 203, 15, 5, 222, + 216, 29, 220, 231, 15, 5, 222, 216, 29, 218, 55, 15, 5, 222, 216, 29, + 215, 203, 15, 5, 222, 216, 29, 215, 200, 15, 5, 222, 216, 29, 215, 173, + 15, 5, 222, 216, 29, 215, 127, 15, 5, 222, 216, 29, 215, 106, 15, 5, 222, + 216, 113, 222, 215, 15, 5, 222, 216, 242, 196, 15, 5, 222, 203, 15, 5, + 222, 204, 233, 239, 29, 254, 15, 15, 5, 222, 179, 15, 5, 222, 171, 15, 5, + 221, 47, 15, 5, 221, 45, 15, 5, 221, 46, 29, 63, 15, 5, 221, 46, 29, 252, + 221, 15, 5, 221, 46, 29, 243, 30, 15, 5, 221, 46, 29, 229, 254, 15, 5, + 221, 46, 29, 220, 168, 15, 5, 221, 46, 29, 216, 70, 15, 5, 221, 46, 29, + 72, 15, 5, 221, 46, 29, 103, 95, 63, 15, 5, 221, 44, 15, 5, 221, 42, 15, + 5, 221, 23, 15, 5, 221, 8, 15, 5, 221, 9, 241, 74, 15, 5, 221, 9, 113, + 221, 9, 243, 222, 113, 243, 222, 243, 193, 113, 243, 192, 15, 5, 221, 9, + 113, 221, 9, 218, 56, 113, 218, 56, 243, 193, 113, 243, 192, 15, 5, 221, + 1, 15, 5, 220, 252, 15, 5, 220, 249, 15, 5, 220, 248, 15, 5, 220, 245, + 15, 5, 220, 231, 15, 5, 220, 232, 29, 63, 15, 5, 220, 232, 29, 236, 128, + 15, 5, 220, 225, 15, 5, 220, 226, 29, 63, 15, 5, 220, 226, 29, 252, 207, + 15, 5, 220, 226, 29, 251, 163, 15, 5, 220, 226, 29, 248, 23, 15, 5, 220, + 226, 29, 243, 192, 15, 5, 220, 226, 29, 236, 147, 15, 5, 220, 226, 29, + 236, 148, 242, 196, 15, 5, 220, 226, 29, 234, 55, 15, 5, 220, 226, 29, + 232, 218, 15, 5, 220, 226, 29, 230, 233, 15, 5, 220, 226, 29, 222, 203, + 15, 5, 220, 219, 15, 5, 220, 214, 15, 5, 220, 215, 217, 205, 15, 5, 220, + 215, 113, 220, 215, 251, 153, 113, 251, 152, 15, 5, 220, 210, 15, 5, 220, + 170, 15, 5, 220, 171, 113, 236, 52, 220, 170, 15, 5, 220, 168, 15, 5, + 220, 167, 15, 5, 220, 136, 15, 5, 220, 137, 242, 196, 15, 5, 220, 127, + 15, 5, 220, 125, 15, 5, 220, 126, 113, 220, 126, 220, 168, 15, 5, 220, + 118, 15, 5, 220, 116, 15, 5, 219, 41, 15, 5, 219, 42, 113, 219, 41, 15, + 5, 219, 13, 15, 5, 219, 12, 15, 5, 219, 10, 15, 5, 219, 2, 15, 5, 219, 1, + 15, 5, 218, 231, 15, 5, 218, 230, 15, 5, 218, 66, 15, 5, 218, 67, 254, 3, + 15, 5, 218, 67, 29, 242, 28, 15, 5, 218, 67, 29, 231, 112, 15, 5, 218, + 67, 242, 196, 15, 5, 218, 55, 15, 5, 218, 56, 113, 218, 56, 229, 129, + 113, 229, 129, 248, 5, 113, 248, 4, 15, 5, 218, 56, 219, 184, 15, 5, 218, + 47, 15, 5, 128, 29, 252, 54, 15, 5, 128, 29, 242, 205, 15, 5, 128, 29, + 221, 8, 15, 5, 128, 29, 220, 170, 15, 5, 128, 29, 216, 85, 15, 5, 128, + 29, 215, 194, 15, 5, 218, 35, 15, 5, 218, 14, 15, 5, 217, 242, 15, 5, + 217, 243, 242, 196, 15, 5, 217, 84, 15, 5, 217, 85, 217, 205, 15, 5, 217, + 57, 15, 5, 217, 39, 15, 5, 217, 40, 29, 218, 35, 15, 5, 217, 40, 113, + 217, 39, 15, 5, 217, 40, 113, 217, 40, 243, 222, 113, 243, 222, 243, 193, + 113, 243, 192, 15, 5, 216, 90, 15, 5, 216, 85, 15, 5, 216, 83, 15, 5, + 216, 80, 15, 5, 216, 70, 15, 5, 216, 71, 113, 216, 71, 212, 110, 113, + 212, 109, 15, 5, 72, 15, 5, 103, 242, 205, 15, 5, 103, 103, 72, 15, 5, + 103, 113, 103, 226, 252, 113, 226, 252, 243, 193, 113, 243, 192, 15, 5, + 103, 113, 103, 218, 232, 113, 218, 231, 15, 5, 103, 113, 103, 103, 223, + 236, 113, 103, 223, 235, 15, 5, 215, 203, 15, 5, 215, 200, 15, 5, 215, + 194, 15, 5, 215, 195, 234, 55, 15, 5, 215, 195, 29, 252, 221, 15, 5, 215, + 195, 29, 231, 112, 15, 5, 215, 195, 29, 103, 95, 103, 95, 72, 15, 5, 215, + 195, 29, 103, 95, 103, 95, 103, 242, 196, 15, 5, 215, 195, 242, 196, 15, + 5, 215, 195, 220, 246, 15, 5, 215, 195, 220, 247, 29, 252, 221, 15, 5, + 215, 190, 15, 5, 215, 173, 15, 5, 215, 174, 29, 233, 238, 15, 5, 215, + 174, 29, 231, 227, 95, 249, 30, 15, 5, 215, 174, 29, 221, 45, 15, 5, 215, + 174, 29, 72, 15, 5, 215, 172, 15, 5, 215, 168, 15, 5, 215, 169, 29, 235, + 69, 15, 5, 215, 169, 29, 195, 15, 5, 215, 166, 15, 5, 215, 167, 242, 196, + 15, 5, 215, 127, 15, 5, 215, 128, 249, 188, 215, 127, 15, 5, 215, 128, + 220, 246, 15, 5, 215, 125, 15, 5, 215, 126, 29, 111, 95, 162, 15, 5, 215, + 126, 29, 111, 95, 207, 15, 5, 215, 126, 29, 254, 213, 15, 5, 215, 126, + 29, 162, 15, 5, 215, 126, 29, 228, 93, 15, 5, 215, 126, 29, 215, 203, 15, + 5, 215, 126, 29, 215, 204, 95, 254, 17, 15, 5, 215, 126, 29, 215, 204, + 95, 252, 54, 15, 5, 215, 124, 15, 5, 215, 121, 15, 5, 215, 120, 15, 5, + 215, 116, 15, 5, 215, 117, 29, 63, 15, 5, 215, 117, 29, 254, 12, 15, 5, + 215, 117, 29, 134, 15, 5, 215, 117, 29, 246, 144, 15, 5, 215, 117, 29, + 243, 230, 15, 5, 215, 117, 29, 243, 214, 15, 5, 215, 117, 29, 243, 201, + 217, 205, 15, 5, 215, 117, 29, 243, 192, 15, 5, 215, 117, 29, 242, 213, + 15, 5, 215, 117, 29, 162, 15, 5, 215, 117, 29, 236, 147, 15, 5, 215, 117, + 29, 236, 128, 15, 5, 215, 117, 29, 236, 24, 15, 5, 215, 117, 29, 234, + 212, 15, 5, 215, 117, 29, 232, 216, 15, 5, 215, 117, 29, 231, 71, 15, 5, + 215, 117, 29, 195, 15, 5, 215, 117, 29, 221, 8, 15, 5, 215, 117, 29, 220, + 125, 15, 5, 215, 117, 29, 216, 90, 15, 5, 215, 117, 29, 103, 95, 242, + 205, 15, 5, 215, 117, 29, 215, 194, 15, 5, 215, 117, 29, 215, 114, 15, 5, + 215, 114, 15, 5, 215, 115, 29, 72, 15, 5, 215, 106, 15, 5, 215, 107, 29, + 63, 15, 5, 215, 107, 29, 234, 81, 15, 5, 215, 107, 29, 234, 60, 15, 5, + 215, 107, 29, 218, 35, 15, 5, 215, 102, 15, 5, 215, 105, 15, 5, 215, 103, + 15, 5, 215, 99, 15, 5, 215, 88, 15, 5, 215, 89, 29, 235, 69, 15, 5, 215, + 87, 15, 5, 212, 109, 15, 5, 212, 110, 217, 205, 15, 5, 212, 110, 92, 29, + 234, 60, 15, 5, 212, 106, 15, 5, 212, 99, 15, 5, 212, 86, 15, 5, 212, 37, + 15, 5, 212, 38, 113, 212, 37, 15, 5, 212, 36, 15, 5, 212, 34, 15, 5, 212, + 35, 235, 121, 217, 205, 15, 5, 212, 29, 15, 5, 212, 21, 15, 5, 212, 8, + 15, 5, 212, 6, 15, 5, 212, 7, 29, 63, 15, 5, 212, 5, 15, 5, 212, 4, 15, + 130, 5, 119, 254, 17, 15, 130, 5, 137, 254, 17, 15, 130, 5, 244, 101, + 254, 17, 15, 130, 5, 244, 170, 254, 17, 15, 130, 5, 220, 72, 254, 17, 15, + 130, 5, 221, 66, 254, 17, 15, 130, 5, 246, 15, 254, 17, 15, 130, 5, 229, + 95, 254, 17, 15, 130, 5, 137, 248, 4, 15, 130, 5, 244, 101, 248, 4, 15, + 130, 5, 244, 170, 248, 4, 15, 130, 5, 220, 72, 248, 4, 15, 130, 5, 221, + 66, 248, 4, 15, 130, 5, 246, 15, 248, 4, 15, 130, 5, 229, 95, 248, 4, 15, + 130, 5, 244, 101, 72, 15, 130, 5, 244, 170, 72, 15, 130, 5, 220, 72, 72, + 15, 130, 5, 221, 66, 72, 15, 130, 5, 246, 15, 72, 15, 130, 5, 229, 95, + 72, 15, 130, 5, 124, 243, 134, 15, 130, 5, 119, 243, 134, 15, 130, 5, + 137, 243, 134, 15, 130, 5, 244, 101, 243, 134, 15, 130, 5, 244, 170, 243, + 134, 15, 130, 5, 220, 72, 243, 134, 15, 130, 5, 221, 66, 243, 134, 15, + 130, 5, 246, 15, 243, 134, 15, 130, 5, 229, 95, 243, 134, 15, 130, 5, + 124, 243, 131, 15, 130, 5, 119, 243, 131, 15, 130, 5, 137, 243, 131, 15, + 130, 5, 244, 101, 243, 131, 15, 130, 5, 244, 170, 243, 131, 15, 130, 5, + 119, 221, 23, 15, 130, 5, 137, 221, 23, 15, 130, 5, 137, 221, 24, 214, + 250, 17, 15, 130, 5, 244, 101, 221, 23, 15, 130, 5, 244, 170, 221, 23, + 15, 130, 5, 220, 72, 221, 23, 15, 130, 5, 221, 66, 221, 23, 15, 130, 5, + 246, 15, 221, 23, 15, 130, 5, 229, 95, 221, 23, 15, 130, 5, 124, 221, 18, + 15, 130, 5, 119, 221, 18, 15, 130, 5, 137, 221, 18, 15, 130, 5, 137, 221, + 19, 214, 250, 17, 15, 130, 5, 244, 101, 221, 18, 15, 130, 5, 244, 170, + 221, 18, 15, 130, 5, 221, 24, 29, 243, 215, 95, 248, 4, 15, 130, 5, 221, + 24, 29, 243, 215, 95, 231, 71, 15, 130, 5, 124, 251, 149, 15, 130, 5, + 119, 251, 149, 15, 130, 5, 137, 251, 149, 15, 130, 5, 137, 251, 150, 214, + 250, 17, 15, 130, 5, 244, 101, 251, 149, 15, 130, 5, 244, 170, 251, 149, + 15, 130, 5, 137, 214, 250, 244, 109, 245, 160, 15, 130, 5, 137, 214, 250, + 244, 109, 245, 157, 15, 130, 5, 244, 101, 214, 250, 244, 109, 233, 87, + 15, 130, 5, 244, 101, 214, 250, 244, 109, 233, 85, 15, 130, 5, 244, 101, + 214, 250, 244, 109, 233, 88, 63, 15, 130, 5, 244, 101, 214, 250, 244, + 109, 233, 88, 253, 201, 15, 130, 5, 220, 72, 214, 250, 244, 109, 254, 14, + 15, 130, 5, 221, 66, 214, 250, 244, 109, 236, 120, 15, 130, 5, 221, 66, + 214, 250, 244, 109, 236, 122, 63, 15, 130, 5, 221, 66, 214, 250, 244, + 109, 236, 122, 253, 201, 15, 130, 5, 246, 15, 214, 250, 244, 109, 215, + 101, 15, 130, 5, 246, 15, 214, 250, 244, 109, 215, 100, 15, 130, 5, 229, + 95, 214, 250, 244, 109, 236, 136, 15, 130, 5, 229, 95, 214, 250, 244, + 109, 236, 135, 15, 130, 5, 229, 95, 214, 250, 244, 109, 236, 134, 15, + 130, 5, 229, 95, 214, 250, 244, 109, 236, 137, 63, 15, 130, 5, 119, 254, + 18, 217, 205, 15, 130, 5, 137, 254, 18, 217, 205, 15, 130, 5, 244, 101, + 254, 18, 217, 205, 15, 130, 5, 244, 170, 254, 18, 217, 205, 15, 130, 5, + 220, 72, 254, 18, 217, 205, 15, 130, 5, 124, 252, 196, 15, 130, 5, 119, + 252, 196, 15, 130, 5, 137, 252, 196, 15, 130, 5, 244, 101, 252, 196, 15, + 130, 5, 244, 101, 252, 197, 214, 250, 17, 15, 130, 5, 244, 170, 252, 196, + 15, 130, 5, 244, 170, 252, 197, 214, 250, 17, 15, 130, 5, 229, 105, 15, + 130, 5, 229, 106, 15, 130, 5, 124, 245, 156, 15, 130, 5, 119, 245, 156, + 15, 130, 5, 124, 217, 135, 248, 4, 15, 130, 5, 119, 217, 133, 248, 4, 15, + 130, 5, 244, 170, 220, 61, 248, 4, 15, 130, 5, 124, 217, 135, 214, 250, + 244, 109, 63, 15, 130, 5, 119, 217, 133, 214, 250, 244, 109, 63, 15, 130, + 5, 124, 246, 11, 254, 17, 15, 130, 5, 124, 224, 202, 254, 17, 15, 130, 5, + 54, 254, 6, 124, 220, 62, 15, 130, 5, 54, 254, 6, 124, 224, 201, 15, 225, + 63, 5, 54, 254, 6, 213, 199, 247, 245, 15, 225, 63, 5, 66, 250, 30, 15, + 225, 63, 5, 248, 72, 250, 30, 15, 225, 63, 5, 248, 72, 216, 192, 10, 11, + 255, 186, 10, 11, 255, 185, 10, 11, 255, 184, 10, 11, 255, 183, 10, 11, + 255, 182, 10, 11, 255, 181, 10, 11, 255, 180, 10, 11, 255, 179, 10, 11, + 255, 178, 10, 11, 255, 177, 10, 11, 255, 176, 10, 11, 255, 175, 10, 11, + 255, 174, 10, 11, 255, 173, 10, 11, 255, 172, 10, 11, 255, 171, 10, 11, + 255, 170, 10, 11, 255, 169, 10, 11, 255, 168, 10, 11, 255, 167, 10, 11, + 255, 166, 10, 11, 255, 165, 10, 11, 255, 164, 10, 11, 255, 163, 10, 11, + 255, 162, 10, 11, 255, 161, 10, 11, 255, 160, 10, 11, 255, 159, 10, 11, + 255, 158, 10, 11, 255, 157, 10, 11, 255, 156, 10, 11, 255, 155, 10, 11, + 255, 154, 10, 11, 255, 153, 10, 11, 255, 152, 10, 11, 255, 151, 10, 11, + 255, 150, 10, 11, 255, 149, 10, 11, 255, 148, 10, 11, 255, 147, 10, 11, + 255, 146, 10, 11, 255, 145, 10, 11, 255, 144, 10, 11, 255, 143, 10, 11, + 255, 142, 10, 11, 255, 141, 10, 11, 255, 140, 10, 11, 255, 139, 10, 11, + 255, 138, 10, 11, 255, 137, 10, 11, 255, 136, 10, 11, 255, 135, 10, 11, + 255, 134, 10, 11, 255, 133, 10, 11, 255, 132, 10, 11, 255, 131, 10, 11, + 255, 130, 10, 11, 255, 129, 10, 11, 255, 128, 10, 11, 255, 127, 10, 11, + 255, 126, 10, 11, 255, 125, 10, 11, 255, 124, 10, 11, 255, 123, 10, 11, + 255, 122, 10, 11, 255, 121, 10, 11, 255, 120, 10, 11, 255, 119, 10, 11, + 255, 118, 10, 11, 255, 117, 10, 11, 255, 116, 10, 11, 255, 115, 10, 11, + 255, 114, 10, 11, 255, 113, 10, 11, 255, 112, 10, 11, 255, 111, 10, 11, + 255, 110, 10, 11, 255, 109, 10, 11, 255, 108, 10, 11, 255, 107, 10, 11, + 253, 199, 10, 11, 253, 197, 10, 11, 253, 195, 10, 11, 253, 193, 10, 11, + 253, 191, 10, 11, 253, 190, 10, 11, 253, 188, 10, 11, 253, 186, 10, 11, + 253, 184, 10, 11, 253, 182, 10, 11, 251, 117, 10, 11, 251, 116, 10, 11, + 251, 115, 10, 11, 251, 114, 10, 11, 251, 113, 10, 11, 251, 112, 10, 11, + 251, 111, 10, 11, 251, 110, 10, 11, 251, 109, 10, 11, 251, 108, 10, 11, + 251, 107, 10, 11, 251, 106, 10, 11, 251, 105, 10, 11, 251, 104, 10, 11, + 251, 103, 10, 11, 251, 102, 10, 11, 251, 101, 10, 11, 251, 100, 10, 11, + 251, 99, 10, 11, 251, 98, 10, 11, 251, 97, 10, 11, 251, 96, 10, 11, 251, + 95, 10, 11, 251, 94, 10, 11, 251, 93, 10, 11, 251, 92, 10, 11, 251, 91, + 10, 11, 251, 90, 10, 11, 249, 124, 10, 11, 249, 123, 10, 11, 249, 122, + 10, 11, 249, 121, 10, 11, 249, 120, 10, 11, 249, 119, 10, 11, 249, 118, + 10, 11, 249, 117, 10, 11, 249, 116, 10, 11, 249, 115, 10, 11, 249, 114, + 10, 11, 249, 113, 10, 11, 249, 112, 10, 11, 249, 111, 10, 11, 249, 110, + 10, 11, 249, 109, 10, 11, 249, 108, 10, 11, 249, 107, 10, 11, 249, 106, + 10, 11, 249, 105, 10, 11, 249, 104, 10, 11, 249, 103, 10, 11, 249, 102, + 10, 11, 249, 101, 10, 11, 249, 100, 10, 11, 249, 99, 10, 11, 249, 98, 10, + 11, 249, 97, 10, 11, 249, 96, 10, 11, 249, 95, 10, 11, 249, 94, 10, 11, + 249, 93, 10, 11, 249, 92, 10, 11, 249, 91, 10, 11, 249, 90, 10, 11, 249, + 89, 10, 11, 249, 88, 10, 11, 249, 87, 10, 11, 249, 86, 10, 11, 249, 85, + 10, 11, 249, 84, 10, 11, 249, 83, 10, 11, 249, 82, 10, 11, 249, 81, 10, + 11, 249, 80, 10, 11, 249, 79, 10, 11, 249, 78, 10, 11, 249, 77, 10, 11, + 249, 76, 10, 11, 249, 75, 10, 11, 249, 74, 10, 11, 249, 73, 10, 11, 249, + 72, 10, 11, 249, 71, 10, 11, 249, 70, 10, 11, 249, 69, 10, 11, 249, 68, + 10, 11, 249, 67, 10, 11, 249, 66, 10, 11, 249, 65, 10, 11, 249, 64, 10, + 11, 249, 63, 10, 11, 249, 62, 10, 11, 249, 61, 10, 11, 249, 60, 10, 11, + 249, 59, 10, 11, 249, 58, 10, 11, 249, 57, 10, 11, 249, 56, 10, 11, 249, + 55, 10, 11, 249, 54, 10, 11, 249, 53, 10, 11, 249, 52, 10, 11, 249, 51, + 10, 11, 249, 50, 10, 11, 249, 49, 10, 11, 249, 48, 10, 11, 249, 47, 10, + 11, 249, 46, 10, 11, 249, 45, 10, 11, 249, 44, 10, 11, 249, 43, 10, 11, + 249, 42, 10, 11, 249, 41, 10, 11, 249, 40, 10, 11, 249, 39, 10, 11, 249, + 38, 10, 11, 249, 37, 10, 11, 249, 36, 10, 11, 249, 35, 10, 11, 249, 34, + 10, 11, 249, 33, 10, 11, 246, 100, 10, 11, 246, 99, 10, 11, 246, 98, 10, + 11, 246, 97, 10, 11, 246, 96, 10, 11, 246, 95, 10, 11, 246, 94, 10, 11, + 246, 93, 10, 11, 246, 92, 10, 11, 246, 91, 10, 11, 246, 90, 10, 11, 246, + 89, 10, 11, 246, 88, 10, 11, 246, 87, 10, 11, 246, 86, 10, 11, 246, 85, + 10, 11, 246, 84, 10, 11, 246, 83, 10, 11, 246, 82, 10, 11, 246, 81, 10, + 11, 246, 80, 10, 11, 246, 79, 10, 11, 246, 78, 10, 11, 246, 77, 10, 11, + 246, 76, 10, 11, 246, 75, 10, 11, 246, 74, 10, 11, 246, 73, 10, 11, 246, + 72, 10, 11, 246, 71, 10, 11, 246, 70, 10, 11, 246, 69, 10, 11, 246, 68, + 10, 11, 246, 67, 10, 11, 246, 66, 10, 11, 246, 65, 10, 11, 246, 64, 10, + 11, 246, 63, 10, 11, 246, 62, 10, 11, 246, 61, 10, 11, 246, 60, 10, 11, + 246, 59, 10, 11, 246, 58, 10, 11, 246, 57, 10, 11, 245, 94, 10, 11, 245, + 93, 10, 11, 245, 92, 10, 11, 245, 91, 10, 11, 245, 90, 10, 11, 245, 89, + 10, 11, 245, 88, 10, 11, 245, 87, 10, 11, 245, 86, 10, 11, 245, 85, 10, + 11, 245, 84, 10, 11, 245, 83, 10, 11, 245, 82, 10, 11, 245, 81, 10, 11, + 245, 80, 10, 11, 245, 79, 10, 11, 245, 78, 10, 11, 245, 77, 10, 11, 245, + 76, 10, 11, 245, 75, 10, 11, 245, 74, 10, 11, 245, 73, 10, 11, 245, 72, + 10, 11, 245, 71, 10, 11, 245, 70, 10, 11, 245, 69, 10, 11, 245, 68, 10, + 11, 245, 67, 10, 11, 245, 66, 10, 11, 245, 65, 10, 11, 245, 64, 10, 11, + 245, 63, 10, 11, 245, 62, 10, 11, 245, 61, 10, 11, 245, 60, 10, 11, 245, + 59, 10, 11, 245, 58, 10, 11, 245, 57, 10, 11, 245, 56, 10, 11, 245, 55, + 10, 11, 245, 54, 10, 11, 245, 53, 10, 11, 245, 52, 10, 11, 245, 51, 10, + 11, 245, 50, 10, 11, 245, 49, 10, 11, 245, 48, 10, 11, 245, 47, 10, 11, + 245, 46, 10, 11, 245, 45, 10, 11, 245, 44, 10, 11, 245, 43, 10, 11, 245, + 42, 10, 11, 245, 41, 10, 11, 245, 40, 10, 11, 245, 39, 10, 11, 245, 38, + 10, 11, 245, 37, 10, 11, 245, 36, 10, 11, 245, 35, 10, 11, 245, 34, 10, + 11, 245, 33, 10, 11, 245, 32, 10, 11, 245, 31, 10, 11, 245, 30, 10, 11, + 244, 40, 10, 11, 244, 39, 10, 11, 244, 38, 10, 11, 244, 37, 10, 11, 244, + 36, 10, 11, 244, 35, 10, 11, 244, 34, 10, 11, 244, 33, 10, 11, 244, 32, + 10, 11, 244, 31, 10, 11, 244, 30, 10, 11, 244, 29, 10, 11, 244, 28, 10, + 11, 244, 27, 10, 11, 244, 26, 10, 11, 244, 25, 10, 11, 244, 24, 10, 11, + 244, 23, 10, 11, 244, 22, 10, 11, 244, 21, 10, 11, 244, 20, 10, 11, 244, + 19, 10, 11, 244, 18, 10, 11, 244, 17, 10, 11, 244, 16, 10, 11, 244, 15, + 10, 11, 244, 14, 10, 11, 244, 13, 10, 11, 244, 12, 10, 11, 244, 11, 10, + 11, 244, 10, 10, 11, 244, 9, 10, 11, 244, 8, 10, 11, 244, 7, 10, 11, 244, + 6, 10, 11, 244, 5, 10, 11, 244, 4, 10, 11, 244, 3, 10, 11, 244, 2, 10, + 11, 244, 1, 10, 11, 244, 0, 10, 11, 243, 255, 10, 11, 243, 254, 10, 11, + 243, 253, 10, 11, 243, 252, 10, 11, 243, 251, 10, 11, 243, 250, 10, 11, + 243, 249, 10, 11, 243, 248, 10, 11, 243, 247, 10, 11, 243, 246, 10, 11, + 243, 245, 10, 11, 243, 244, 10, 11, 243, 243, 10, 11, 243, 242, 10, 11, + 243, 241, 10, 11, 243, 240, 10, 11, 243, 239, 10, 11, 243, 238, 10, 11, + 243, 237, 10, 11, 243, 236, 10, 11, 243, 235, 10, 11, 243, 234, 10, 11, + 243, 233, 10, 11, 242, 160, 10, 11, 242, 159, 10, 11, 242, 158, 10, 11, + 242, 157, 10, 11, 242, 156, 10, 11, 242, 155, 10, 11, 242, 154, 10, 11, + 242, 153, 10, 11, 242, 152, 10, 11, 240, 247, 10, 11, 240, 246, 10, 11, + 240, 245, 10, 11, 240, 244, 10, 11, 240, 243, 10, 11, 240, 242, 10, 11, + 240, 241, 10, 11, 240, 240, 10, 11, 240, 239, 10, 11, 240, 238, 10, 11, + 240, 237, 10, 11, 240, 236, 10, 11, 240, 235, 10, 11, 240, 234, 10, 11, + 240, 233, 10, 11, 240, 232, 10, 11, 240, 231, 10, 11, 240, 230, 10, 11, + 240, 229, 10, 11, 235, 140, 10, 11, 235, 139, 10, 11, 235, 138, 10, 11, + 235, 137, 10, 11, 235, 136, 10, 11, 235, 135, 10, 11, 235, 134, 10, 11, + 235, 133, 10, 11, 234, 10, 10, 11, 234, 9, 10, 11, 234, 8, 10, 11, 234, + 7, 10, 11, 234, 6, 10, 11, 234, 5, 10, 11, 234, 4, 10, 11, 234, 3, 10, + 11, 234, 2, 10, 11, 234, 1, 10, 11, 232, 182, 10, 11, 232, 181, 10, 11, + 232, 180, 10, 11, 232, 179, 10, 11, 232, 178, 10, 11, 232, 177, 10, 11, + 232, 176, 10, 11, 232, 175, 10, 11, 232, 174, 10, 11, 232, 173, 10, 11, + 232, 172, 10, 11, 232, 171, 10, 11, 232, 170, 10, 11, 232, 169, 10, 11, + 232, 168, 10, 11, 232, 167, 10, 11, 232, 166, 10, 11, 232, 165, 10, 11, + 232, 164, 10, 11, 232, 163, 10, 11, 232, 162, 10, 11, 232, 161, 10, 11, + 232, 160, 10, 11, 232, 159, 10, 11, 232, 158, 10, 11, 232, 157, 10, 11, + 232, 156, 10, 11, 232, 155, 10, 11, 232, 154, 10, 11, 232, 153, 10, 11, + 232, 152, 10, 11, 232, 151, 10, 11, 232, 150, 10, 11, 232, 149, 10, 11, + 232, 148, 10, 11, 232, 147, 10, 11, 232, 146, 10, 11, 232, 145, 10, 11, + 232, 144, 10, 11, 232, 143, 10, 11, 232, 142, 10, 11, 232, 141, 10, 11, + 232, 140, 10, 11, 232, 139, 10, 11, 232, 138, 10, 11, 232, 137, 10, 11, + 232, 136, 10, 11, 232, 135, 10, 11, 232, 134, 10, 11, 232, 133, 10, 11, + 232, 132, 10, 11, 232, 131, 10, 11, 232, 130, 10, 11, 232, 129, 10, 11, + 232, 128, 10, 11, 232, 127, 10, 11, 232, 126, 10, 11, 232, 125, 10, 11, + 232, 124, 10, 11, 232, 123, 10, 11, 232, 122, 10, 11, 232, 121, 10, 11, + 232, 120, 10, 11, 232, 119, 10, 11, 232, 118, 10, 11, 232, 117, 10, 11, + 230, 164, 10, 11, 230, 163, 10, 11, 230, 162, 10, 11, 230, 161, 10, 11, + 230, 160, 10, 11, 230, 159, 10, 11, 230, 158, 10, 11, 230, 157, 10, 11, + 230, 156, 10, 11, 230, 155, 10, 11, 230, 154, 10, 11, 230, 153, 10, 11, + 230, 152, 10, 11, 230, 151, 10, 11, 230, 150, 10, 11, 230, 149, 10, 11, + 230, 148, 10, 11, 230, 147, 10, 11, 230, 146, 10, 11, 230, 145, 10, 11, + 230, 144, 10, 11, 230, 143, 10, 11, 230, 142, 10, 11, 230, 141, 10, 11, + 230, 140, 10, 11, 230, 139, 10, 11, 230, 138, 10, 11, 230, 137, 10, 11, + 230, 136, 10, 11, 230, 135, 10, 11, 230, 134, 10, 11, 230, 133, 10, 11, + 230, 132, 10, 11, 230, 131, 10, 11, 230, 130, 10, 11, 230, 129, 10, 11, + 230, 128, 10, 11, 230, 127, 10, 11, 230, 126, 10, 11, 230, 125, 10, 11, + 230, 124, 10, 11, 230, 123, 10, 11, 230, 122, 10, 11, 230, 121, 10, 11, + 230, 120, 10, 11, 230, 119, 10, 11, 230, 118, 10, 11, 230, 117, 10, 11, + 230, 116, 10, 11, 229, 30, 10, 11, 229, 29, 10, 11, 229, 28, 10, 11, 229, + 27, 10, 11, 229, 26, 10, 11, 229, 25, 10, 11, 229, 24, 10, 11, 229, 23, + 10, 11, 229, 22, 10, 11, 229, 21, 10, 11, 229, 20, 10, 11, 229, 19, 10, + 11, 229, 18, 10, 11, 229, 17, 10, 11, 229, 16, 10, 11, 229, 15, 10, 11, + 229, 14, 10, 11, 229, 13, 10, 11, 229, 12, 10, 11, 229, 11, 10, 11, 229, + 10, 10, 11, 229, 9, 10, 11, 228, 134, 10, 11, 228, 133, 10, 11, 228, 132, + 10, 11, 228, 131, 10, 11, 228, 130, 10, 11, 228, 129, 10, 11, 228, 128, + 10, 11, 228, 127, 10, 11, 228, 126, 10, 11, 228, 125, 10, 11, 228, 124, + 10, 11, 228, 123, 10, 11, 228, 122, 10, 11, 228, 121, 10, 11, 228, 120, + 10, 11, 228, 119, 10, 11, 228, 118, 10, 11, 228, 117, 10, 11, 228, 116, + 10, 11, 228, 115, 10, 11, 228, 114, 10, 11, 228, 113, 10, 11, 228, 112, + 10, 11, 228, 111, 10, 11, 228, 110, 10, 11, 228, 109, 10, 11, 227, 233, + 10, 11, 227, 232, 10, 11, 227, 231, 10, 11, 227, 230, 10, 11, 227, 229, + 10, 11, 227, 228, 10, 11, 227, 227, 10, 11, 227, 226, 10, 11, 227, 225, + 10, 11, 227, 224, 10, 11, 227, 223, 10, 11, 227, 222, 10, 11, 227, 221, + 10, 11, 227, 220, 10, 11, 227, 219, 10, 11, 227, 218, 10, 11, 227, 217, + 10, 11, 227, 216, 10, 11, 227, 215, 10, 11, 227, 214, 10, 11, 227, 213, + 10, 11, 227, 212, 10, 11, 227, 211, 10, 11, 227, 210, 10, 11, 227, 209, + 10, 11, 227, 208, 10, 11, 227, 207, 10, 11, 227, 206, 10, 11, 227, 205, + 10, 11, 227, 204, 10, 11, 227, 203, 10, 11, 227, 202, 10, 11, 227, 201, + 10, 11, 227, 200, 10, 11, 227, 199, 10, 11, 227, 198, 10, 11, 227, 197, 10, 11, 227, 196, 10, 11, 227, 195, 10, 11, 227, 194, 10, 11, 227, 193, 10, 11, 227, 192, 10, 11, 227, 191, 10, 11, 227, 190, 10, 11, 227, 189, 10, 11, 227, 188, 10, 11, 227, 187, 10, 11, 227, 186, 10, 11, 227, 185, @@ -11678,1448 +11721,1563 @@ 10, 11, 227, 172, 10, 11, 227, 171, 10, 11, 227, 170, 10, 11, 227, 169, 10, 11, 227, 168, 10, 11, 227, 167, 10, 11, 227, 166, 10, 11, 227, 165, 10, 11, 227, 164, 10, 11, 227, 163, 10, 11, 227, 162, 10, 11, 227, 161, - 10, 11, 227, 160, 10, 11, 227, 159, 10, 11, 227, 158, 10, 11, 227, 157, - 10, 11, 227, 156, 10, 11, 227, 155, 10, 11, 227, 154, 10, 11, 227, 153, - 10, 11, 227, 152, 10, 11, 227, 151, 10, 11, 227, 150, 10, 11, 227, 149, - 10, 11, 227, 148, 10, 11, 227, 147, 10, 11, 227, 146, 10, 11, 227, 145, - 10, 11, 227, 144, 10, 11, 227, 143, 10, 11, 227, 142, 10, 11, 227, 141, - 10, 11, 227, 140, 10, 11, 227, 139, 10, 11, 227, 138, 10, 11, 227, 137, - 10, 11, 227, 136, 10, 11, 227, 135, 10, 11, 227, 134, 10, 11, 227, 133, - 10, 11, 227, 132, 10, 11, 227, 131, 10, 11, 227, 130, 10, 11, 227, 129, - 10, 11, 227, 128, 10, 11, 227, 127, 10, 11, 227, 126, 10, 11, 227, 125, - 10, 11, 227, 124, 10, 11, 227, 123, 10, 11, 227, 122, 10, 11, 226, 228, - 10, 11, 226, 227, 10, 11, 226, 226, 10, 11, 226, 225, 10, 11, 226, 224, - 10, 11, 226, 223, 10, 11, 226, 222, 10, 11, 226, 221, 10, 11, 226, 220, - 10, 11, 226, 219, 10, 11, 226, 218, 10, 11, 226, 217, 10, 11, 226, 216, - 10, 11, 224, 239, 10, 11, 224, 238, 10, 11, 224, 237, 10, 11, 224, 236, - 10, 11, 224, 235, 10, 11, 224, 234, 10, 11, 224, 233, 10, 11, 224, 111, - 10, 11, 224, 110, 10, 11, 224, 109, 10, 11, 224, 108, 10, 11, 224, 107, - 10, 11, 224, 106, 10, 11, 224, 105, 10, 11, 224, 104, 10, 11, 224, 103, - 10, 11, 224, 102, 10, 11, 224, 101, 10, 11, 224, 100, 10, 11, 224, 99, - 10, 11, 224, 98, 10, 11, 224, 97, 10, 11, 224, 96, 10, 11, 224, 95, 10, - 11, 224, 94, 10, 11, 224, 93, 10, 11, 224, 92, 10, 11, 224, 91, 10, 11, - 224, 90, 10, 11, 224, 89, 10, 11, 224, 88, 10, 11, 224, 87, 10, 11, 224, - 86, 10, 11, 224, 85, 10, 11, 224, 84, 10, 11, 224, 83, 10, 11, 224, 82, - 10, 11, 224, 81, 10, 11, 224, 80, 10, 11, 224, 79, 10, 11, 224, 78, 10, - 11, 223, 1, 10, 11, 223, 0, 10, 11, 222, 255, 10, 11, 222, 254, 10, 11, - 222, 253, 10, 11, 222, 252, 10, 11, 222, 251, 10, 11, 222, 250, 10, 11, - 222, 249, 10, 11, 222, 248, 10, 11, 222, 247, 10, 11, 222, 246, 10, 11, - 222, 245, 10, 11, 222, 244, 10, 11, 222, 243, 10, 11, 222, 242, 10, 11, - 222, 241, 10, 11, 222, 240, 10, 11, 222, 239, 10, 11, 222, 238, 10, 11, - 222, 237, 10, 11, 222, 236, 10, 11, 222, 235, 10, 11, 222, 234, 10, 11, - 222, 233, 10, 11, 222, 232, 10, 11, 222, 231, 10, 11, 222, 230, 10, 11, - 222, 229, 10, 11, 222, 228, 10, 11, 222, 227, 10, 11, 222, 226, 10, 11, - 222, 225, 10, 11, 222, 224, 10, 11, 222, 223, 10, 11, 222, 222, 10, 11, - 222, 221, 10, 11, 222, 220, 10, 11, 222, 219, 10, 11, 222, 218, 10, 11, - 222, 217, 10, 11, 222, 216, 10, 11, 222, 215, 10, 11, 222, 214, 10, 11, - 222, 213, 10, 11, 222, 212, 10, 11, 222, 211, 10, 11, 222, 210, 10, 11, - 222, 209, 10, 11, 222, 208, 10, 11, 222, 207, 10, 11, 222, 206, 10, 11, - 222, 205, 10, 11, 222, 204, 10, 11, 218, 97, 10, 11, 218, 96, 10, 11, - 218, 95, 10, 11, 218, 94, 10, 11, 218, 93, 10, 11, 218, 92, 10, 11, 218, - 91, 10, 11, 218, 90, 10, 11, 218, 89, 10, 11, 218, 88, 10, 11, 218, 87, - 10, 11, 218, 86, 10, 11, 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10, - 11, 218, 82, 10, 11, 218, 81, 10, 11, 218, 80, 10, 11, 218, 79, 10, 11, - 218, 78, 10, 11, 218, 77, 10, 11, 218, 76, 10, 11, 218, 75, 10, 11, 218, - 74, 10, 11, 218, 73, 10, 11, 218, 72, 10, 11, 218, 71, 10, 11, 218, 70, - 10, 11, 218, 69, 10, 11, 218, 68, 10, 11, 218, 67, 10, 11, 218, 66, 10, - 11, 218, 65, 10, 11, 218, 64, 10, 11, 218, 63, 10, 11, 218, 62, 10, 11, - 218, 61, 10, 11, 218, 60, 10, 11, 218, 59, 10, 11, 218, 58, 10, 11, 218, - 57, 10, 11, 218, 56, 10, 11, 218, 55, 10, 11, 218, 54, 10, 11, 215, 245, - 10, 11, 215, 244, 10, 11, 215, 243, 10, 11, 215, 242, 10, 11, 215, 241, - 10, 11, 215, 240, 10, 11, 215, 239, 10, 11, 215, 238, 10, 11, 215, 237, - 10, 11, 215, 236, 10, 11, 215, 235, 10, 11, 215, 234, 10, 11, 215, 233, - 10, 11, 215, 232, 10, 11, 215, 231, 10, 11, 215, 230, 10, 11, 215, 229, - 10, 11, 215, 228, 10, 11, 215, 227, 10, 11, 215, 226, 10, 11, 215, 225, - 10, 11, 215, 224, 10, 11, 215, 223, 10, 11, 215, 222, 10, 11, 215, 221, - 10, 11, 215, 220, 10, 11, 215, 219, 10, 11, 215, 218, 10, 11, 215, 217, - 10, 11, 215, 216, 10, 11, 215, 215, 10, 11, 215, 214, 10, 11, 215, 213, - 10, 11, 215, 212, 10, 11, 215, 211, 10, 11, 215, 210, 10, 11, 215, 209, - 10, 11, 215, 208, 10, 11, 215, 207, 10, 11, 215, 206, 10, 11, 215, 205, - 10, 11, 215, 204, 10, 11, 215, 203, 10, 11, 215, 202, 10, 11, 215, 201, - 10, 11, 215, 200, 10, 11, 215, 199, 10, 11, 215, 78, 10, 11, 215, 77, 10, - 11, 215, 76, 10, 11, 215, 75, 10, 11, 215, 74, 10, 11, 215, 73, 10, 11, - 215, 72, 10, 11, 215, 71, 10, 11, 215, 70, 10, 11, 215, 69, 10, 11, 215, - 68, 10, 11, 215, 67, 10, 11, 215, 66, 10, 11, 215, 65, 10, 11, 215, 64, - 10, 11, 215, 63, 10, 11, 215, 62, 10, 11, 215, 61, 10, 11, 215, 60, 10, - 11, 215, 59, 10, 11, 215, 58, 10, 11, 215, 57, 10, 11, 215, 56, 10, 11, - 215, 55, 10, 11, 215, 54, 10, 11, 215, 53, 10, 11, 215, 52, 10, 11, 215, - 51, 10, 11, 215, 50, 10, 11, 215, 49, 10, 11, 215, 48, 10, 11, 215, 47, - 10, 11, 215, 46, 10, 11, 215, 45, 10, 11, 215, 44, 10, 11, 215, 43, 10, - 11, 215, 42, 10, 11, 215, 41, 10, 11, 215, 40, 10, 11, 215, 39, 10, 11, - 215, 38, 10, 11, 215, 37, 10, 11, 215, 36, 10, 11, 215, 35, 10, 11, 215, - 34, 10, 11, 215, 33, 10, 11, 215, 32, 10, 11, 215, 31, 10, 11, 215, 30, - 10, 11, 215, 29, 10, 11, 215, 28, 10, 11, 215, 27, 10, 11, 215, 26, 10, - 11, 215, 25, 10, 11, 215, 24, 10, 11, 215, 23, 10, 11, 215, 22, 10, 11, - 215, 21, 10, 11, 215, 20, 10, 11, 215, 19, 10, 11, 215, 18, 10, 11, 215, - 17, 10, 11, 215, 16, 10, 11, 215, 15, 10, 11, 215, 14, 10, 11, 215, 13, - 10, 11, 215, 12, 10, 11, 215, 11, 10, 11, 215, 10, 10, 11, 215, 9, 10, - 11, 215, 8, 10, 11, 215, 7, 10, 11, 215, 6, 10, 11, 215, 5, 10, 11, 215, - 4, 10, 11, 215, 3, 10, 11, 215, 2, 10, 11, 214, 81, 10, 11, 214, 80, 10, - 11, 214, 79, 10, 11, 214, 78, 10, 11, 214, 77, 10, 11, 214, 76, 10, 11, - 214, 75, 10, 11, 214, 74, 10, 11, 214, 73, 10, 11, 214, 72, 10, 11, 214, - 71, 10, 11, 214, 70, 10, 11, 214, 69, 10, 11, 214, 68, 10, 11, 214, 67, - 10, 11, 214, 66, 10, 11, 214, 65, 10, 11, 214, 64, 10, 11, 214, 63, 10, - 11, 214, 62, 10, 11, 214, 61, 10, 11, 214, 60, 10, 11, 214, 59, 10, 11, - 214, 58, 10, 11, 214, 57, 10, 11, 214, 56, 10, 11, 214, 55, 10, 11, 214, - 54, 10, 11, 214, 53, 10, 11, 214, 52, 10, 11, 214, 51, 10, 11, 214, 50, - 10, 11, 213, 165, 10, 11, 213, 164, 10, 11, 213, 163, 10, 11, 213, 162, - 10, 11, 213, 161, 10, 11, 213, 160, 10, 11, 213, 159, 10, 11, 213, 158, - 10, 11, 213, 157, 10, 11, 213, 156, 10, 11, 213, 155, 10, 11, 213, 154, - 10, 11, 213, 103, 10, 11, 213, 102, 10, 11, 213, 101, 10, 11, 213, 100, - 10, 11, 213, 99, 10, 11, 213, 98, 10, 11, 213, 97, 10, 11, 213, 96, 10, - 11, 213, 95, 10, 11, 212, 151, 10, 11, 212, 150, 10, 11, 212, 149, 10, - 11, 212, 148, 10, 11, 212, 147, 10, 11, 212, 146, 10, 11, 212, 145, 10, - 11, 212, 144, 10, 11, 212, 143, 10, 11, 212, 142, 10, 11, 212, 141, 10, - 11, 212, 140, 10, 11, 212, 139, 10, 11, 212, 138, 10, 11, 212, 137, 10, - 11, 212, 136, 10, 11, 212, 135, 10, 11, 212, 134, 10, 11, 212, 133, 10, - 11, 212, 132, 10, 11, 212, 131, 10, 11, 212, 130, 10, 11, 212, 129, 10, - 11, 212, 128, 10, 11, 212, 127, 10, 11, 212, 126, 10, 11, 212, 125, 10, - 11, 212, 124, 10, 11, 212, 123, 10, 11, 212, 122, 10, 11, 212, 121, 10, - 11, 212, 120, 10, 11, 212, 119, 10, 11, 212, 118, 10, 11, 212, 117, 10, - 11, 212, 116, 10, 11, 212, 115, 10, 11, 212, 114, 10, 11, 212, 113, 10, - 11, 212, 112, 10, 11, 212, 111, 10, 11, 254, 231, 10, 11, 254, 230, 10, - 11, 254, 229, 10, 11, 254, 228, 10, 11, 254, 227, 10, 11, 254, 226, 10, - 11, 254, 225, 10, 11, 254, 224, 10, 11, 254, 223, 10, 11, 254, 222, 10, - 11, 254, 221, 10, 11, 254, 220, 10, 11, 254, 219, 10, 11, 254, 218, 10, - 11, 254, 217, 10, 11, 254, 216, 10, 11, 254, 215, 10, 11, 254, 214, 10, - 11, 254, 213, 10, 11, 254, 212, 10, 11, 254, 211, 10, 11, 254, 210, 10, - 11, 254, 209, 10, 11, 254, 208, 10, 11, 254, 207, 10, 11, 254, 206, 10, - 11, 254, 205, 10, 11, 254, 204, 10, 11, 254, 203, 10, 11, 254, 202, 10, - 11, 254, 201, 10, 11, 254, 200, 10, 11, 254, 199, 10, 11, 254, 198, 20, - 1, 153, 229, 98, 231, 83, 20, 1, 153, 243, 46, 244, 5, 20, 1, 153, 225, - 131, 231, 84, 225, 189, 20, 1, 153, 225, 131, 231, 84, 225, 190, 20, 1, - 153, 230, 44, 231, 83, 20, 1, 153, 220, 146, 20, 1, 153, 217, 19, 231, - 83, 20, 1, 153, 227, 238, 231, 83, 20, 1, 153, 220, 199, 226, 214, 229, - 0, 20, 1, 153, 225, 131, 226, 214, 229, 1, 225, 189, 20, 1, 153, 225, - 131, 226, 214, 229, 1, 225, 190, 20, 1, 153, 232, 23, 20, 1, 153, 216, - 83, 232, 24, 20, 1, 153, 229, 154, 20, 1, 153, 232, 20, 20, 1, 153, 231, - 239, 20, 1, 153, 230, 119, 20, 1, 153, 221, 45, 20, 1, 153, 228, 96, 20, - 1, 153, 234, 155, 20, 1, 153, 228, 225, 20, 1, 153, 218, 205, 20, 1, 153, - 229, 97, 20, 1, 153, 233, 110, 20, 1, 153, 233, 36, 233, 210, 20, 1, 153, - 228, 103, 231, 91, 20, 1, 153, 232, 27, 20, 1, 153, 226, 119, 20, 1, 153, - 242, 207, 20, 1, 153, 226, 177, 20, 1, 153, 230, 221, 229, 130, 20, 1, - 153, 227, 219, 231, 94, 20, 1, 153, 111, 212, 179, 230, 38, 20, 1, 153, - 242, 208, 20, 1, 153, 228, 103, 228, 104, 20, 1, 153, 220, 56, 20, 1, - 153, 231, 76, 20, 1, 153, 231, 97, 20, 1, 153, 230, 200, 20, 1, 153, 234, - 253, 20, 1, 153, 226, 214, 233, 71, 20, 1, 153, 229, 229, 233, 71, 20, 1, - 153, 226, 34, 20, 1, 153, 232, 21, 20, 1, 153, 229, 38, 20, 1, 153, 225, - 20, 20, 1, 153, 216, 80, 20, 1, 153, 232, 152, 20, 1, 153, 219, 227, 20, - 1, 153, 217, 169, 20, 1, 153, 232, 18, 20, 1, 153, 234, 162, 20, 1, 153, - 229, 225, 20, 1, 153, 233, 222, 20, 1, 153, 230, 201, 20, 1, 153, 220, - 143, 20, 1, 153, 232, 191, 20, 1, 153, 244, 62, 20, 1, 153, 223, 101, 20, - 1, 153, 233, 250, 20, 1, 153, 219, 223, 20, 1, 153, 231, 236, 225, 231, - 20, 1, 153, 220, 192, 20, 1, 153, 228, 102, 20, 1, 153, 220, 177, 228, - 113, 212, 187, 20, 1, 153, 228, 1, 230, 218, 20, 1, 153, 226, 209, 20, 1, - 153, 228, 226, 20, 1, 153, 215, 141, 20, 1, 153, 229, 133, 20, 1, 153, - 232, 17, 20, 1, 153, 229, 12, 20, 1, 153, 231, 182, 20, 1, 153, 228, 12, - 20, 1, 153, 217, 173, 20, 1, 153, 219, 221, 20, 1, 153, 226, 210, 20, 1, - 153, 228, 117, 20, 1, 153, 232, 25, 20, 1, 153, 228, 10, 20, 1, 153, 234, - 221, 20, 1, 153, 228, 120, 20, 1, 153, 214, 227, 20, 1, 153, 232, 156, - 20, 1, 153, 229, 180, 20, 1, 153, 230, 16, 20, 1, 153, 231, 181, 20, 1, - 226, 14, 228, 115, 20, 1, 226, 14, 216, 83, 232, 22, 20, 1, 226, 14, 220, - 111, 20, 1, 226, 14, 221, 49, 216, 82, 20, 1, 226, 14, 232, 193, 228, 99, - 20, 1, 226, 14, 231, 188, 232, 26, 20, 1, 226, 14, 234, 96, 20, 1, 226, - 14, 213, 6, 20, 1, 226, 14, 231, 183, 20, 1, 226, 14, 234, 242, 20, 1, - 226, 14, 226, 83, 20, 1, 226, 14, 213, 77, 233, 71, 20, 1, 226, 14, 233, - 127, 228, 113, 228, 20, 20, 1, 226, 14, 228, 97, 220, 218, 20, 1, 226, - 14, 229, 196, 229, 15, 20, 1, 226, 14, 242, 205, 20, 1, 226, 14, 225, - 181, 20, 1, 226, 14, 216, 83, 228, 111, 20, 1, 226, 14, 220, 223, 229, - 10, 20, 1, 226, 14, 220, 219, 20, 1, 226, 14, 231, 84, 217, 172, 20, 1, - 226, 14, 231, 170, 231, 184, 20, 1, 226, 14, 228, 11, 228, 99, 20, 1, - 226, 14, 234, 151, 20, 1, 226, 14, 242, 206, 20, 1, 226, 14, 234, 147, - 20, 1, 226, 14, 233, 151, 20, 1, 226, 14, 226, 121, 20, 1, 226, 14, 214, - 159, 20, 1, 226, 14, 229, 99, 230, 117, 20, 1, 226, 14, 229, 132, 231, - 166, 20, 1, 226, 14, 213, 181, 20, 1, 226, 14, 222, 182, 20, 1, 226, 14, - 218, 45, 20, 1, 226, 14, 231, 96, 20, 1, 226, 14, 229, 117, 20, 1, 226, - 14, 229, 118, 233, 107, 20, 1, 226, 14, 231, 86, 20, 1, 226, 14, 218, - 253, 20, 1, 226, 14, 231, 174, 20, 1, 226, 14, 230, 203, 20, 1, 226, 14, - 228, 21, 20, 1, 226, 14, 225, 24, 20, 1, 226, 14, 231, 95, 229, 134, 20, - 1, 226, 14, 244, 95, 20, 1, 226, 14, 231, 161, 20, 1, 226, 14, 244, 116, - 20, 1, 226, 14, 234, 159, 20, 1, 226, 14, 232, 43, 229, 4, 20, 1, 226, - 14, 232, 43, 228, 236, 20, 1, 226, 14, 233, 35, 20, 1, 226, 14, 229, 140, - 20, 1, 226, 14, 228, 122, 20, 1, 226, 14, 188, 20, 1, 226, 14, 234, 83, - 20, 1, 226, 14, 229, 87, 20, 1, 131, 229, 98, 232, 24, 20, 1, 131, 227, - 237, 20, 1, 131, 212, 187, 20, 1, 131, 214, 37, 20, 1, 131, 229, 133, 20, - 1, 131, 229, 217, 20, 1, 131, 229, 105, 20, 1, 131, 242, 215, 20, 1, 131, - 231, 178, 20, 1, 131, 243, 53, 20, 1, 131, 228, 3, 230, 239, 231, 98, 20, - 1, 131, 228, 95, 231, 169, 20, 1, 131, 231, 175, 20, 1, 131, 225, 187, - 20, 1, 131, 229, 202, 20, 1, 131, 231, 186, 250, 215, 20, 1, 131, 234, - 149, 20, 1, 131, 242, 216, 20, 1, 131, 234, 156, 20, 1, 131, 212, 204, - 230, 146, 20, 1, 131, 227, 231, 20, 1, 131, 231, 163, 20, 1, 131, 228, - 121, 20, 1, 131, 231, 169, 20, 1, 131, 213, 7, 20, 1, 131, 234, 2, 20, 1, - 131, 235, 14, 20, 1, 131, 221, 44, 20, 1, 131, 229, 211, 20, 1, 131, 218, - 43, 20, 1, 131, 228, 240, 20, 1, 131, 217, 19, 212, 189, 20, 1, 131, 219, - 23, 20, 1, 131, 229, 124, 228, 20, 20, 1, 131, 214, 158, 20, 1, 131, 230, - 19, 20, 1, 131, 232, 43, 234, 158, 20, 1, 131, 228, 104, 20, 1, 131, 229, - 119, 20, 1, 131, 233, 111, 20, 1, 131, 231, 171, 20, 1, 131, 231, 75, 20, - 1, 131, 228, 98, 20, 1, 131, 217, 168, 20, 1, 131, 229, 121, 20, 1, 131, - 243, 204, 20, 1, 131, 229, 216, 20, 1, 131, 228, 123, 20, 1, 131, 228, - 119, 20, 1, 131, 251, 36, 20, 1, 131, 214, 160, 20, 1, 131, 231, 176, 20, - 1, 131, 223, 51, 20, 1, 131, 229, 14, 20, 1, 131, 233, 126, 20, 1, 131, - 217, 17, 20, 1, 131, 228, 105, 229, 87, 20, 1, 131, 229, 6, 20, 1, 131, - 234, 162, 20, 1, 131, 229, 125, 20, 1, 131, 232, 17, 20, 1, 131, 231, - 164, 20, 1, 131, 232, 156, 20, 1, 131, 233, 210, 20, 1, 131, 229, 12, 20, - 1, 131, 229, 87, 20, 1, 131, 213, 172, 20, 1, 131, 229, 122, 20, 1, 131, - 228, 108, 20, 1, 131, 228, 100, 20, 1, 131, 233, 224, 228, 226, 20, 1, - 131, 228, 106, 20, 1, 131, 229, 224, 20, 1, 131, 232, 43, 228, 111, 20, - 1, 131, 213, 91, 20, 1, 131, 229, 223, 20, 1, 131, 220, 145, 20, 1, 131, - 221, 47, 20, 1, 131, 231, 172, 20, 1, 131, 232, 24, 20, 1, 131, 231, 182, - 20, 1, 131, 234, 150, 20, 1, 131, 231, 173, 20, 1, 131, 234, 154, 20, 1, - 131, 231, 186, 225, 235, 20, 1, 131, 212, 171, 20, 1, 131, 229, 2, 20, 1, - 131, 231, 33, 20, 1, 131, 230, 170, 20, 1, 131, 220, 195, 20, 1, 131, - 234, 172, 233, 94, 20, 1, 131, 234, 172, 244, 128, 20, 1, 131, 229, 152, - 20, 1, 131, 230, 16, 20, 1, 131, 232, 229, 20, 1, 131, 225, 197, 20, 1, - 131, 226, 74, 20, 1, 131, 217, 183, 20, 1, 103, 231, 162, 20, 1, 103, - 214, 35, 20, 1, 103, 229, 0, 20, 1, 103, 231, 83, 20, 1, 103, 228, 254, - 20, 1, 103, 233, 7, 20, 1, 103, 229, 3, 20, 1, 103, 228, 118, 20, 1, 103, - 229, 139, 20, 1, 103, 228, 20, 20, 1, 103, 213, 182, 20, 1, 103, 229, 95, - 20, 1, 103, 220, 241, 20, 1, 103, 229, 106, 20, 1, 103, 234, 157, 20, 1, - 103, 217, 170, 20, 1, 103, 220, 221, 20, 1, 103, 229, 11, 20, 1, 103, - 218, 253, 20, 1, 103, 234, 162, 20, 1, 103, 213, 79, 20, 1, 103, 233, - 225, 20, 1, 103, 222, 150, 20, 1, 103, 231, 88, 20, 1, 103, 229, 215, 20, - 1, 103, 231, 251, 20, 1, 103, 231, 94, 20, 1, 103, 221, 46, 20, 1, 103, - 213, 30, 20, 1, 103, 229, 5, 20, 1, 103, 234, 153, 231, 165, 20, 1, 103, - 229, 102, 20, 1, 103, 216, 82, 20, 1, 103, 242, 224, 20, 1, 103, 229, 92, - 20, 1, 103, 244, 96, 20, 1, 103, 229, 219, 20, 1, 103, 231, 67, 20, 1, - 103, 233, 31, 20, 1, 103, 229, 201, 20, 1, 103, 230, 217, 20, 1, 103, - 231, 71, 20, 1, 103, 225, 6, 20, 1, 103, 231, 69, 20, 1, 103, 231, 85, - 20, 1, 103, 232, 142, 20, 1, 103, 228, 110, 20, 1, 103, 231, 185, 20, 1, - 103, 233, 202, 20, 1, 103, 228, 12, 20, 1, 103, 217, 173, 20, 1, 103, - 219, 221, 20, 1, 103, 212, 171, 20, 1, 103, 234, 154, 20, 1, 103, 224, - 60, 20, 1, 103, 217, 218, 20, 1, 103, 229, 103, 20, 1, 103, 231, 90, 20, - 1, 103, 228, 109, 20, 1, 103, 234, 152, 20, 1, 103, 225, 191, 20, 1, 103, - 226, 28, 20, 1, 103, 227, 246, 20, 1, 103, 233, 35, 20, 1, 103, 229, 140, - 20, 1, 103, 231, 87, 20, 1, 103, 229, 114, 20, 1, 103, 212, 184, 20, 1, - 103, 226, 149, 20, 1, 103, 212, 183, 20, 1, 103, 229, 224, 20, 1, 103, - 228, 99, 20, 1, 103, 219, 25, 20, 1, 103, 233, 229, 20, 1, 103, 229, 129, - 20, 1, 103, 229, 100, 20, 1, 103, 216, 66, 20, 1, 103, 231, 98, 20, 1, - 103, 233, 219, 20, 1, 103, 228, 107, 20, 1, 103, 217, 171, 20, 1, 103, - 232, 19, 20, 1, 103, 229, 138, 20, 1, 103, 233, 30, 20, 1, 103, 229, 120, - 20, 1, 103, 228, 112, 20, 1, 103, 228, 240, 20, 1, 103, 242, 209, 20, 1, - 103, 233, 238, 20, 1, 103, 223, 234, 227, 75, 20, 1, 103, 218, 35, 20, 1, - 103, 216, 223, 20, 1, 103, 228, 10, 20, 1, 103, 223, 136, 20, 1, 103, - 233, 73, 20, 1, 103, 231, 144, 20, 1, 103, 183, 20, 1, 103, 218, 205, 20, - 1, 103, 230, 172, 20, 1, 103, 220, 207, 20, 1, 103, 220, 217, 20, 1, 103, - 233, 177, 20, 1, 103, 228, 92, 20, 1, 103, 220, 150, 20, 1, 103, 228, - 101, 20, 1, 103, 226, 86, 20, 1, 103, 229, 64, 20, 1, 103, 220, 176, 20, - 1, 103, 225, 19, 20, 1, 103, 230, 117, 20, 1, 103, 232, 174, 20, 1, 103, - 223, 234, 230, 166, 20, 1, 103, 217, 71, 20, 1, 103, 228, 93, 20, 1, 103, - 231, 186, 198, 20, 1, 103, 222, 148, 20, 1, 103, 244, 163, 20, 1, 80, - 229, 223, 20, 1, 80, 216, 229, 20, 1, 80, 231, 175, 20, 1, 80, 233, 111, - 20, 1, 80, 214, 109, 20, 1, 80, 232, 178, 20, 1, 80, 226, 213, 20, 1, 80, - 219, 230, 20, 1, 80, 224, 37, 20, 1, 80, 228, 114, 20, 1, 80, 229, 194, - 20, 1, 80, 225, 33, 20, 1, 80, 218, 13, 20, 1, 80, 229, 108, 20, 1, 80, - 233, 254, 20, 1, 80, 213, 175, 20, 1, 80, 222, 89, 20, 1, 80, 229, 130, - 20, 1, 80, 226, 210, 20, 1, 80, 216, 230, 20, 1, 80, 233, 223, 20, 1, 80, - 232, 192, 20, 1, 80, 228, 117, 20, 1, 80, 229, 84, 20, 1, 80, 232, 25, - 20, 1, 80, 229, 101, 20, 1, 80, 229, 83, 20, 1, 80, 228, 116, 20, 1, 80, - 223, 134, 20, 1, 80, 229, 2, 20, 1, 80, 226, 85, 20, 1, 80, 222, 200, 20, - 1, 80, 229, 115, 20, 1, 80, 231, 77, 20, 1, 80, 242, 203, 20, 1, 80, 229, - 104, 20, 1, 80, 229, 13, 20, 1, 80, 231, 235, 20, 1, 80, 232, 176, 20, 1, - 80, 229, 135, 20, 1, 80, 229, 207, 20, 1, 80, 218, 34, 228, 99, 20, 1, - 80, 221, 48, 20, 1, 80, 225, 29, 20, 1, 80, 229, 227, 219, 235, 20, 1, - 80, 229, 123, 228, 20, 20, 1, 80, 212, 251, 20, 1, 80, 242, 204, 20, 1, - 80, 216, 81, 20, 1, 80, 213, 10, 20, 1, 80, 225, 150, 20, 1, 80, 216, 71, - 20, 1, 80, 234, 160, 20, 1, 80, 219, 24, 20, 1, 80, 217, 172, 20, 1, 80, - 214, 161, 20, 1, 80, 213, 247, 20, 1, 80, 233, 154, 20, 1, 80, 225, 35, - 20, 1, 80, 218, 44, 20, 1, 80, 242, 223, 20, 1, 80, 229, 144, 20, 1, 80, - 220, 220, 20, 1, 80, 231, 72, 20, 1, 80, 231, 179, 20, 1, 80, 227, 235, - 20, 1, 80, 228, 223, 20, 1, 80, 243, 49, 20, 1, 80, 216, 72, 20, 1, 80, - 233, 232, 20, 1, 80, 213, 57, 20, 1, 80, 228, 11, 249, 209, 20, 1, 80, - 212, 241, 20, 1, 80, 231, 89, 20, 1, 80, 229, 212, 20, 1, 80, 225, 232, - 20, 1, 80, 212, 188, 20, 1, 80, 233, 32, 20, 1, 80, 243, 204, 20, 1, 80, - 243, 48, 20, 1, 80, 229, 94, 20, 1, 80, 234, 162, 20, 1, 80, 232, 28, 20, - 1, 80, 229, 107, 20, 1, 80, 242, 210, 20, 1, 80, 244, 164, 20, 1, 80, - 228, 94, 20, 1, 80, 226, 29, 20, 1, 80, 213, 8, 20, 1, 80, 229, 131, 20, - 1, 80, 228, 11, 251, 200, 20, 1, 80, 227, 215, 20, 1, 80, 225, 127, 20, - 1, 80, 231, 33, 20, 1, 80, 243, 202, 20, 1, 80, 230, 38, 20, 1, 80, 230, - 170, 20, 1, 80, 242, 209, 20, 1, 80, 243, 206, 72, 20, 1, 80, 230, 118, - 20, 1, 80, 225, 32, 20, 1, 80, 229, 96, 20, 1, 80, 233, 210, 20, 1, 80, - 225, 229, 20, 1, 80, 228, 102, 20, 1, 80, 213, 9, 20, 1, 80, 229, 116, - 20, 1, 80, 226, 214, 226, 62, 20, 1, 80, 243, 206, 250, 203, 20, 1, 80, - 244, 6, 20, 1, 80, 229, 7, 20, 1, 80, 61, 20, 1, 80, 216, 223, 20, 1, 80, - 75, 20, 1, 80, 72, 20, 1, 80, 233, 109, 20, 1, 80, 226, 214, 225, 157, - 20, 1, 80, 218, 49, 20, 1, 80, 218, 2, 20, 1, 80, 229, 227, 230, 106, - 240, 221, 20, 1, 80, 220, 195, 20, 1, 80, 213, 5, 20, 1, 80, 229, 77, 20, - 1, 80, 212, 193, 20, 1, 80, 212, 218, 218, 185, 20, 1, 80, 212, 218, 249, - 86, 20, 1, 80, 212, 178, 20, 1, 80, 212, 186, 20, 1, 80, 234, 148, 20, 1, - 80, 226, 27, 20, 1, 80, 229, 8, 245, 65, 20, 1, 80, 225, 30, 20, 1, 80, - 213, 180, 20, 1, 80, 244, 116, 20, 1, 80, 214, 227, 20, 1, 80, 232, 156, - 20, 1, 80, 231, 42, 20, 1, 80, 223, 204, 20, 1, 80, 224, 61, 20, 1, 80, - 229, 76, 20, 1, 80, 229, 159, 20, 1, 80, 220, 187, 20, 1, 80, 220, 176, - 20, 1, 80, 243, 206, 223, 236, 20, 1, 80, 205, 20, 1, 80, 225, 240, 20, - 1, 80, 232, 174, 20, 1, 80, 234, 37, 20, 1, 80, 231, 122, 20, 1, 80, 188, - 20, 1, 80, 231, 232, 20, 1, 80, 217, 174, 20, 1, 80, 234, 101, 20, 1, 80, - 230, 220, 20, 1, 80, 217, 200, 20, 1, 80, 244, 137, 20, 1, 80, 242, 199, - 20, 1, 226, 13, 181, 20, 1, 226, 13, 69, 20, 1, 226, 13, 233, 238, 20, 1, - 226, 13, 245, 165, 20, 1, 226, 13, 224, 1, 20, 1, 226, 13, 218, 35, 20, - 1, 226, 13, 228, 10, 20, 1, 226, 13, 233, 157, 20, 1, 226, 13, 223, 136, - 20, 1, 226, 13, 223, 182, 20, 1, 226, 13, 231, 144, 20, 1, 226, 13, 218, - 49, 20, 1, 226, 13, 229, 226, 20, 1, 226, 13, 229, 14, 20, 1, 226, 13, - 183, 20, 1, 226, 13, 218, 205, 20, 1, 226, 13, 220, 207, 20, 1, 226, 13, - 220, 117, 20, 1, 226, 13, 221, 44, 20, 1, 226, 13, 233, 177, 20, 1, 226, - 13, 234, 162, 20, 1, 226, 13, 228, 64, 20, 1, 226, 13, 228, 92, 20, 1, - 226, 13, 228, 241, 20, 1, 226, 13, 212, 217, 20, 1, 226, 13, 220, 150, - 20, 1, 226, 13, 186, 20, 1, 226, 13, 228, 120, 20, 1, 226, 13, 226, 27, - 20, 1, 226, 13, 228, 101, 20, 1, 226, 13, 213, 180, 20, 1, 226, 13, 226, - 86, 20, 1, 226, 13, 223, 51, 20, 1, 226, 13, 229, 64, 20, 1, 226, 13, - 223, 204, 20, 1, 226, 13, 234, 171, 20, 1, 226, 13, 229, 93, 20, 1, 226, - 13, 229, 141, 20, 1, 226, 13, 220, 187, 20, 1, 226, 13, 225, 33, 20, 1, - 226, 13, 244, 6, 20, 1, 226, 13, 214, 49, 20, 1, 226, 13, 233, 13, 20, 1, - 226, 13, 232, 174, 20, 1, 226, 13, 234, 37, 20, 1, 226, 13, 231, 177, 20, - 1, 226, 13, 223, 233, 20, 1, 226, 13, 188, 20, 1, 226, 13, 230, 231, 20, - 1, 226, 13, 231, 185, 20, 1, 226, 13, 217, 183, 20, 1, 226, 13, 234, 4, - 20, 1, 226, 13, 222, 166, 20, 1, 226, 13, 214, 98, 56, 1, 253, 193, 74, - 142, 1, 253, 193, 213, 38, 47, 27, 16, 225, 39, 47, 27, 16, 248, 103, 47, - 27, 16, 226, 50, 47, 27, 16, 226, 237, 245, 135, 47, 27, 16, 226, 237, - 247, 153, 47, 27, 16, 214, 248, 245, 135, 47, 27, 16, 214, 248, 247, 153, - 47, 27, 16, 234, 202, 47, 27, 16, 218, 115, 47, 27, 16, 226, 137, 47, 27, - 16, 212, 208, 47, 27, 16, 212, 209, 247, 153, 47, 27, 16, 233, 243, 47, - 27, 16, 253, 236, 245, 135, 47, 27, 16, 244, 249, 245, 135, 47, 27, 16, - 217, 211, 47, 27, 16, 234, 167, 47, 27, 16, 253, 227, 47, 27, 16, 253, - 228, 247, 153, 47, 27, 16, 218, 121, 47, 27, 16, 217, 112, 47, 27, 16, - 227, 72, 253, 191, 47, 27, 16, 242, 135, 253, 191, 47, 27, 16, 225, 38, - 47, 27, 16, 250, 85, 47, 27, 16, 214, 238, 47, 27, 16, 235, 162, 253, - 191, 47, 27, 16, 234, 169, 253, 191, 47, 27, 16, 234, 168, 253, 191, 47, - 27, 16, 222, 131, 47, 27, 16, 226, 128, 47, 27, 16, 219, 86, 253, 230, - 47, 27, 16, 226, 236, 253, 191, 47, 27, 16, 214, 247, 253, 191, 47, 27, - 16, 253, 231, 253, 191, 47, 27, 16, 253, 225, 47, 27, 16, 234, 46, 47, - 27, 16, 223, 199, 47, 27, 16, 225, 238, 253, 191, 47, 27, 16, 217, 36, - 47, 27, 16, 254, 30, 47, 27, 16, 222, 78, 47, 27, 16, 218, 124, 253, 191, - 47, 27, 16, 218, 124, 231, 107, 219, 84, 47, 27, 16, 226, 231, 253, 191, - 47, 27, 16, 217, 143, 47, 27, 16, 233, 51, 47, 27, 16, 245, 252, 47, 27, - 16, 216, 185, 47, 27, 16, 217, 185, 47, 27, 16, 233, 246, 47, 27, 16, - 253, 236, 244, 249, 229, 177, 47, 27, 16, 243, 207, 253, 191, 47, 27, 16, - 236, 7, 47, 27, 16, 216, 157, 253, 191, 47, 27, 16, 234, 205, 216, 156, - 47, 27, 16, 226, 75, 47, 27, 16, 225, 43, 47, 27, 16, 234, 20, 47, 27, - 16, 250, 17, 253, 191, 47, 27, 16, 224, 38, 47, 27, 16, 226, 140, 253, - 191, 47, 27, 16, 226, 138, 253, 191, 47, 27, 16, 240, 102, 47, 27, 16, - 230, 23, 47, 27, 16, 226, 32, 47, 27, 16, 234, 21, 254, 58, 47, 27, 16, - 216, 157, 254, 58, 47, 27, 16, 219, 63, 47, 27, 16, 242, 101, 47, 27, 16, - 235, 162, 229, 177, 47, 27, 16, 227, 72, 229, 177, 47, 27, 16, 226, 237, - 229, 177, 47, 27, 16, 226, 31, 47, 27, 16, 234, 7, 47, 27, 16, 226, 30, - 47, 27, 16, 233, 245, 47, 27, 16, 226, 76, 229, 177, 47, 27, 16, 234, - 168, 229, 178, 254, 7, 47, 27, 16, 234, 169, 229, 178, 254, 7, 47, 27, - 16, 212, 206, 47, 27, 16, 253, 228, 229, 177, 47, 27, 16, 253, 229, 218, - 122, 229, 177, 47, 27, 16, 212, 207, 47, 27, 16, 233, 244, 47, 27, 16, - 245, 130, 47, 27, 16, 250, 86, 47, 27, 16, 231, 11, 235, 161, 47, 27, 16, - 214, 248, 229, 177, 47, 27, 16, 225, 238, 229, 177, 47, 27, 16, 225, 44, - 229, 177, 47, 27, 16, 227, 69, 47, 27, 16, 253, 251, 47, 27, 16, 232, - 118, 47, 27, 16, 226, 138, 229, 177, 47, 27, 16, 226, 140, 229, 177, 47, - 27, 16, 245, 26, 226, 139, 47, 27, 16, 233, 175, 47, 27, 16, 253, 252, - 47, 27, 16, 216, 157, 229, 177, 47, 27, 16, 245, 133, 47, 27, 16, 218, - 124, 229, 177, 47, 27, 16, 218, 116, 47, 27, 16, 250, 17, 229, 177, 47, - 27, 16, 245, 69, 47, 27, 16, 222, 79, 229, 177, 47, 27, 16, 213, 139, - 234, 46, 47, 27, 16, 216, 154, 47, 27, 16, 225, 45, 47, 27, 16, 216, 158, - 47, 27, 16, 216, 155, 47, 27, 16, 225, 42, 47, 27, 16, 216, 153, 47, 27, - 16, 225, 41, 47, 27, 16, 242, 134, 47, 27, 16, 253, 185, 47, 27, 16, 245, - 26, 253, 185, 47, 27, 16, 226, 231, 229, 177, 47, 27, 16, 217, 142, 245, - 34, 47, 27, 16, 217, 142, 244, 248, 47, 27, 16, 217, 144, 253, 232, 47, - 27, 16, 217, 137, 234, 251, 253, 224, 47, 27, 16, 234, 204, 47, 27, 16, - 245, 97, 47, 27, 16, 213, 2, 234, 201, 47, 27, 16, 213, 2, 254, 7, 47, - 27, 16, 219, 85, 47, 27, 16, 234, 47, 254, 7, 47, 27, 16, 247, 154, 253, - 191, 47, 27, 16, 233, 247, 253, 191, 47, 27, 16, 233, 247, 254, 58, 47, - 27, 16, 233, 247, 229, 177, 47, 27, 16, 253, 231, 229, 177, 47, 27, 16, - 253, 233, 47, 27, 16, 247, 153, 47, 27, 16, 216, 168, 47, 27, 16, 217, - 177, 47, 27, 16, 234, 11, 47, 27, 16, 233, 56, 245, 92, 250, 8, 47, 27, - 16, 233, 56, 245, 253, 250, 9, 47, 27, 16, 233, 56, 216, 170, 250, 9, 47, - 27, 16, 233, 56, 217, 187, 250, 9, 47, 27, 16, 233, 56, 236, 2, 250, 8, - 47, 27, 16, 242, 135, 229, 178, 254, 7, 47, 27, 16, 242, 135, 226, 129, - 253, 181, 47, 27, 16, 242, 135, 226, 129, 247, 236, 47, 27, 16, 247, 177, - 47, 27, 16, 247, 178, 226, 129, 253, 182, 234, 201, 47, 27, 16, 247, 178, - 226, 129, 253, 182, 254, 7, 47, 27, 16, 247, 178, 226, 129, 247, 236, 47, - 27, 16, 216, 174, 47, 27, 16, 253, 186, 47, 27, 16, 236, 9, 47, 27, 16, - 247, 198, 47, 27, 16, 254, 116, 225, 134, 253, 187, 47, 27, 16, 254, 116, - 253, 184, 47, 27, 16, 254, 116, 253, 187, 47, 27, 16, 254, 116, 231, 101, - 47, 27, 16, 254, 116, 231, 110, 47, 27, 16, 254, 116, 242, 136, 47, 27, - 16, 254, 116, 242, 133, 47, 27, 16, 254, 116, 225, 134, 242, 136, 47, 27, - 16, 231, 214, 225, 50, 240, 100, 47, 27, 16, 231, 214, 254, 60, 225, 50, - 240, 100, 47, 27, 16, 231, 214, 247, 235, 240, 100, 47, 27, 16, 231, 214, - 254, 60, 247, 235, 240, 100, 47, 27, 16, 231, 214, 216, 163, 240, 100, - 47, 27, 16, 231, 214, 216, 175, 47, 27, 16, 231, 214, 217, 181, 240, 100, - 47, 27, 16, 231, 214, 217, 181, 233, 59, 240, 100, 47, 27, 16, 231, 214, - 233, 59, 240, 100, 47, 27, 16, 231, 214, 225, 171, 240, 100, 47, 27, 16, - 235, 167, 217, 204, 240, 101, 47, 27, 16, 253, 229, 217, 204, 240, 101, - 47, 27, 16, 244, 140, 217, 178, 47, 27, 16, 244, 140, 230, 213, 47, 27, - 16, 244, 140, 247, 182, 47, 27, 16, 231, 214, 214, 242, 240, 100, 47, 27, - 16, 231, 214, 225, 49, 240, 100, 47, 27, 16, 231, 214, 225, 171, 217, - 181, 240, 100, 47, 27, 16, 242, 131, 230, 98, 253, 232, 47, 27, 16, 242, - 131, 230, 98, 247, 152, 47, 27, 16, 245, 106, 234, 251, 243, 207, 214, - 105, 47, 27, 16, 236, 8, 47, 27, 16, 236, 6, 47, 27, 16, 243, 207, 253, - 192, 247, 234, 240, 99, 47, 27, 16, 243, 207, 247, 196, 193, 47, 27, 16, - 243, 207, 247, 196, 230, 23, 47, 27, 16, 243, 207, 230, 18, 240, 100, 47, - 27, 16, 243, 207, 247, 196, 247, 211, 47, 27, 16, 243, 207, 220, 30, 247, - 195, 247, 211, 47, 27, 16, 243, 207, 247, 196, 234, 188, 47, 27, 16, 243, - 207, 247, 196, 212, 16, 47, 27, 16, 243, 207, 247, 196, 229, 65, 234, - 201, 47, 27, 16, 243, 207, 247, 196, 229, 65, 254, 7, 47, 27, 16, 243, - 207, 231, 254, 250, 10, 247, 182, 47, 27, 16, 243, 207, 231, 254, 250, - 10, 230, 213, 47, 27, 16, 244, 91, 220, 30, 250, 10, 214, 241, 47, 27, - 16, 243, 207, 220, 30, 250, 10, 218, 125, 47, 27, 16, 243, 207, 229, 179, - 47, 27, 16, 250, 11, 211, 248, 47, 27, 16, 250, 11, 234, 45, 47, 27, 16, - 250, 11, 219, 197, 47, 27, 16, 243, 207, 240, 146, 213, 1, 217, 182, 47, - 27, 16, 243, 207, 245, 107, 253, 253, 47, 27, 16, 213, 1, 216, 164, 47, - 27, 16, 247, 190, 216, 164, 47, 27, 16, 247, 190, 217, 182, 47, 27, 16, - 247, 190, 253, 234, 245, 253, 247, 93, 47, 27, 16, 247, 190, 230, 211, - 217, 186, 247, 93, 47, 27, 16, 247, 190, 247, 174, 245, 3, 247, 93, 47, - 27, 16, 247, 190, 216, 172, 227, 77, 247, 93, 47, 27, 16, 213, 1, 253, - 234, 245, 253, 247, 93, 47, 27, 16, 213, 1, 230, 211, 217, 186, 247, 93, - 47, 27, 16, 213, 1, 247, 174, 245, 3, 247, 93, 47, 27, 16, 213, 1, 216, - 172, 227, 77, 247, 93, 47, 27, 16, 243, 25, 247, 189, 47, 27, 16, 243, - 25, 213, 0, 47, 27, 16, 247, 197, 253, 234, 231, 12, 47, 27, 16, 247, - 197, 253, 234, 231, 137, 47, 27, 16, 247, 197, 247, 153, 47, 27, 16, 247, - 197, 217, 135, 47, 27, 16, 220, 89, 217, 135, 47, 27, 16, 220, 89, 217, - 136, 247, 138, 47, 27, 16, 220, 89, 217, 136, 216, 165, 47, 27, 16, 220, - 89, 217, 136, 217, 175, 47, 27, 16, 220, 89, 253, 159, 47, 27, 16, 220, - 89, 253, 160, 247, 138, 47, 27, 16, 220, 89, 253, 160, 216, 165, 47, 27, - 16, 220, 89, 253, 160, 217, 175, 47, 27, 16, 247, 175, 243, 6, 47, 27, - 16, 247, 181, 227, 2, 47, 27, 16, 219, 77, 47, 27, 16, 253, 178, 193, 47, - 27, 16, 253, 178, 214, 105, 47, 27, 16, 253, 178, 243, 110, 47, 27, 16, - 253, 178, 247, 211, 47, 27, 16, 253, 178, 234, 188, 47, 27, 16, 253, 178, - 212, 16, 47, 27, 16, 253, 178, 229, 64, 47, 27, 16, 234, 168, 229, 178, - 231, 109, 47, 27, 16, 234, 169, 229, 178, 231, 109, 47, 27, 16, 234, 168, - 229, 178, 234, 201, 47, 27, 16, 234, 169, 229, 178, 234, 201, 47, 27, 16, - 234, 47, 234, 201, 47, 27, 16, 242, 135, 229, 178, 234, 201, 27, 16, 220, - 81, 252, 55, 27, 16, 51, 252, 55, 27, 16, 40, 252, 55, 27, 16, 223, 203, - 40, 252, 55, 27, 16, 248, 100, 252, 55, 27, 16, 220, 175, 252, 55, 27, - 16, 42, 223, 228, 52, 27, 16, 46, 223, 228, 52, 27, 16, 223, 228, 247, - 72, 27, 16, 248, 141, 222, 82, 27, 16, 248, 165, 250, 181, 27, 16, 222, - 82, 27, 16, 249, 171, 27, 16, 223, 226, 244, 80, 27, 16, 223, 226, 244, - 79, 27, 16, 223, 226, 244, 78, 27, 16, 244, 100, 27, 16, 244, 101, 55, - 27, 16, 251, 76, 77, 27, 16, 250, 210, 27, 16, 251, 86, 27, 16, 125, 27, - 16, 227, 59, 219, 102, 27, 16, 216, 23, 219, 102, 27, 16, 217, 96, 219, - 102, 27, 16, 243, 236, 219, 102, 27, 16, 244, 49, 219, 102, 27, 16, 220, - 52, 219, 102, 27, 16, 220, 50, 243, 220, 27, 16, 243, 234, 243, 220, 27, - 16, 243, 178, 249, 207, 27, 16, 243, 178, 249, 208, 227, 4, 254, 51, 27, - 16, 243, 178, 249, 208, 227, 4, 252, 42, 27, 16, 250, 253, 249, 207, 27, - 16, 244, 231, 249, 207, 27, 16, 244, 231, 249, 208, 227, 4, 254, 51, 27, - 16, 244, 231, 249, 208, 227, 4, 252, 42, 27, 16, 246, 38, 249, 206, 27, - 16, 246, 38, 249, 205, 27, 16, 230, 155, 231, 155, 223, 213, 27, 16, 51, - 220, 254, 27, 16, 51, 244, 34, 27, 16, 244, 35, 215, 134, 27, 16, 244, - 35, 246, 60, 27, 16, 230, 9, 215, 134, 27, 16, 230, 9, 246, 60, 27, 16, - 220, 255, 215, 134, 27, 16, 220, 255, 246, 60, 27, 16, 224, 167, 160, - 220, 254, 27, 16, 224, 167, 160, 244, 34, 27, 16, 249, 155, 217, 40, 27, - 16, 249, 27, 217, 40, 27, 16, 227, 4, 254, 51, 27, 16, 227, 4, 252, 42, - 27, 16, 224, 149, 254, 51, 27, 16, 224, 149, 252, 42, 27, 16, 230, 158, - 223, 213, 27, 16, 213, 236, 223, 213, 27, 16, 151, 223, 213, 27, 16, 224, - 167, 223, 213, 27, 16, 245, 146, 223, 213, 27, 16, 220, 46, 223, 213, 27, - 16, 217, 113, 223, 213, 27, 16, 220, 38, 223, 213, 27, 16, 122, 240, 201, - 216, 36, 223, 213, 27, 16, 213, 167, 228, 154, 27, 16, 94, 228, 154, 27, - 16, 249, 229, 213, 167, 228, 154, 27, 16, 41, 228, 155, 213, 238, 27, 16, - 41, 228, 155, 251, 144, 27, 16, 216, 184, 228, 155, 114, 213, 238, 27, - 16, 216, 184, 228, 155, 114, 251, 144, 27, 16, 216, 184, 228, 155, 42, - 213, 238, 27, 16, 216, 184, 228, 155, 42, 251, 144, 27, 16, 216, 184, - 228, 155, 46, 213, 238, 27, 16, 216, 184, 228, 155, 46, 251, 144, 27, 16, - 216, 184, 228, 155, 119, 213, 238, 27, 16, 216, 184, 228, 155, 119, 251, - 144, 27, 16, 216, 184, 228, 155, 114, 46, 213, 238, 27, 16, 216, 184, - 228, 155, 114, 46, 251, 144, 27, 16, 230, 199, 228, 155, 213, 238, 27, - 16, 230, 199, 228, 155, 251, 144, 27, 16, 216, 181, 228, 155, 119, 213, - 238, 27, 16, 216, 181, 228, 155, 119, 251, 144, 27, 16, 226, 132, 228, - 154, 27, 16, 214, 113, 228, 154, 27, 16, 228, 155, 251, 144, 27, 16, 228, - 59, 228, 154, 27, 16, 249, 178, 228, 155, 213, 238, 27, 16, 249, 178, - 228, 155, 251, 144, 27, 16, 251, 74, 27, 16, 213, 236, 228, 158, 27, 16, - 151, 228, 158, 27, 16, 224, 167, 228, 158, 27, 16, 245, 146, 228, 158, - 27, 16, 220, 46, 228, 158, 27, 16, 217, 113, 228, 158, 27, 16, 220, 38, - 228, 158, 27, 16, 122, 240, 201, 216, 36, 228, 158, 27, 16, 37, 219, 79, - 27, 16, 37, 219, 172, 219, 79, 27, 16, 37, 216, 192, 27, 16, 37, 216, - 191, 27, 16, 37, 216, 190, 27, 16, 244, 70, 216, 192, 27, 16, 244, 70, - 216, 191, 27, 16, 244, 70, 216, 190, 27, 16, 37, 253, 105, 247, 74, 27, - 16, 37, 244, 41, 27, 16, 37, 244, 40, 27, 16, 37, 244, 39, 27, 16, 37, - 244, 38, 27, 16, 37, 244, 37, 27, 16, 251, 234, 251, 250, 27, 16, 245, - 101, 251, 250, 27, 16, 251, 234, 217, 65, 27, 16, 245, 101, 217, 65, 27, - 16, 251, 234, 220, 8, 27, 16, 245, 101, 220, 8, 27, 16, 251, 234, 225, - 247, 27, 16, 245, 101, 225, 247, 27, 16, 37, 254, 174, 27, 16, 37, 219, - 104, 27, 16, 37, 217, 191, 27, 16, 37, 219, 105, 27, 16, 37, 231, 225, - 27, 16, 37, 231, 224, 27, 16, 37, 254, 173, 27, 16, 37, 232, 167, 27, 16, - 253, 169, 215, 134, 27, 16, 253, 169, 246, 60, 27, 16, 37, 247, 89, 27, - 16, 37, 223, 128, 27, 16, 37, 244, 27, 27, 16, 37, 220, 4, 27, 16, 37, - 251, 215, 27, 16, 37, 51, 216, 232, 27, 16, 37, 216, 169, 216, 232, 27, - 16, 223, 132, 27, 16, 219, 20, 27, 16, 212, 152, 27, 16, 225, 239, 27, - 16, 231, 92, 27, 16, 243, 242, 27, 16, 249, 78, 27, 16, 248, 29, 27, 16, - 242, 126, 228, 159, 220, 23, 27, 16, 242, 126, 228, 159, 228, 186, 220, - 23, 27, 16, 216, 213, 27, 16, 216, 59, 27, 16, 235, 191, 216, 59, 27, 16, - 216, 60, 220, 23, 27, 16, 216, 60, 215, 134, 27, 16, 227, 15, 219, 44, - 27, 16, 227, 15, 219, 41, 27, 16, 227, 15, 219, 40, 27, 16, 227, 15, 219, - 39, 27, 16, 227, 15, 219, 38, 27, 16, 227, 15, 219, 37, 27, 16, 227, 15, - 219, 36, 27, 16, 227, 15, 219, 35, 27, 16, 227, 15, 219, 34, 27, 16, 227, - 15, 219, 43, 27, 16, 227, 15, 219, 42, 27, 16, 241, 229, 27, 16, 229, - 186, 27, 16, 245, 101, 65, 219, 73, 27, 16, 248, 22, 220, 23, 27, 16, 37, - 119, 251, 95, 27, 16, 37, 114, 251, 95, 27, 16, 37, 241, 239, 27, 16, 37, - 219, 251, 225, 175, 27, 16, 226, 91, 77, 27, 16, 226, 91, 114, 77, 27, - 16, 151, 226, 91, 77, 27, 16, 242, 158, 215, 134, 27, 16, 242, 158, 246, - 60, 27, 16, 2, 244, 69, 27, 16, 248, 125, 27, 16, 248, 126, 254, 63, 27, - 16, 231, 197, 27, 16, 232, 182, 27, 16, 251, 71, 27, 16, 221, 74, 213, - 238, 27, 16, 221, 74, 251, 144, 27, 16, 230, 253, 27, 16, 230, 254, 251, - 144, 27, 16, 221, 68, 213, 238, 27, 16, 221, 68, 251, 144, 27, 16, 243, - 192, 213, 238, 27, 16, 243, 192, 251, 144, 27, 16, 232, 183, 226, 55, - 223, 213, 27, 16, 232, 183, 236, 0, 223, 213, 27, 16, 251, 72, 223, 213, - 27, 16, 221, 74, 223, 213, 27, 16, 230, 254, 223, 213, 27, 16, 221, 68, - 223, 213, 27, 16, 217, 202, 226, 53, 249, 48, 225, 58, 226, 54, 27, 16, - 217, 202, 226, 53, 249, 48, 225, 58, 235, 255, 27, 16, 217, 202, 226, 53, - 249, 48, 225, 58, 226, 55, 247, 163, 27, 16, 217, 202, 235, 254, 249, 48, - 225, 58, 226, 54, 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 235, 255, - 27, 16, 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 163, 27, 16, - 217, 202, 235, 254, 249, 48, 225, 58, 236, 0, 247, 162, 27, 16, 217, 202, - 235, 254, 249, 48, 225, 58, 236, 0, 247, 161, 27, 16, 249, 73, 27, 16, - 242, 103, 250, 253, 249, 207, 27, 16, 242, 103, 244, 231, 249, 207, 27, - 16, 41, 253, 74, 27, 16, 214, 132, 27, 16, 225, 148, 27, 16, 249, 198, - 27, 16, 222, 121, 27, 16, 249, 202, 27, 16, 216, 220, 27, 16, 225, 122, - 27, 16, 225, 123, 244, 29, 27, 16, 222, 122, 244, 29, 27, 16, 216, 221, - 223, 210, 27, 16, 226, 39, 219, 11, 25, 214, 118, 174, 218, 174, 25, 214, - 118, 174, 218, 163, 25, 214, 118, 174, 218, 153, 25, 214, 118, 174, 218, - 146, 25, 214, 118, 174, 218, 138, 25, 214, 118, 174, 218, 132, 25, 214, - 118, 174, 218, 131, 25, 214, 118, 174, 218, 130, 25, 214, 118, 174, 218, - 129, 25, 214, 118, 174, 218, 173, 25, 214, 118, 174, 218, 172, 25, 214, - 118, 174, 218, 171, 25, 214, 118, 174, 218, 170, 25, 214, 118, 174, 218, - 169, 25, 214, 118, 174, 218, 168, 25, 214, 118, 174, 218, 167, 25, 214, - 118, 174, 218, 166, 25, 214, 118, 174, 218, 165, 25, 214, 118, 174, 218, - 164, 25, 214, 118, 174, 218, 162, 25, 214, 118, 174, 218, 161, 25, 214, - 118, 174, 218, 160, 25, 214, 118, 174, 218, 159, 25, 214, 118, 174, 218, - 158, 25, 214, 118, 174, 218, 137, 25, 214, 118, 174, 218, 136, 25, 214, - 118, 174, 218, 135, 25, 214, 118, 174, 218, 134, 25, 214, 118, 174, 218, - 133, 25, 235, 211, 174, 218, 174, 25, 235, 211, 174, 218, 163, 25, 235, - 211, 174, 218, 146, 25, 235, 211, 174, 218, 138, 25, 235, 211, 174, 218, - 131, 25, 235, 211, 174, 218, 130, 25, 235, 211, 174, 218, 172, 25, 235, - 211, 174, 218, 171, 25, 235, 211, 174, 218, 170, 25, 235, 211, 174, 218, - 169, 25, 235, 211, 174, 218, 166, 25, 235, 211, 174, 218, 165, 25, 235, - 211, 174, 218, 164, 25, 235, 211, 174, 218, 159, 25, 235, 211, 174, 218, - 158, 25, 235, 211, 174, 218, 157, 25, 235, 211, 174, 218, 156, 25, 235, - 211, 174, 218, 155, 25, 235, 211, 174, 218, 154, 25, 235, 211, 174, 218, - 152, 25, 235, 211, 174, 218, 151, 25, 235, 211, 174, 218, 150, 25, 235, - 211, 174, 218, 149, 25, 235, 211, 174, 218, 148, 25, 235, 211, 174, 218, - 147, 25, 235, 211, 174, 218, 145, 25, 235, 211, 174, 218, 144, 25, 235, - 211, 174, 218, 143, 25, 235, 211, 174, 218, 142, 25, 235, 211, 174, 218, - 141, 25, 235, 211, 174, 218, 140, 25, 235, 211, 174, 218, 139, 25, 235, - 211, 174, 218, 137, 25, 235, 211, 174, 218, 136, 25, 235, 211, 174, 218, - 135, 25, 235, 211, 174, 218, 134, 25, 235, 211, 174, 218, 133, 37, 25, - 27, 216, 166, 37, 25, 27, 217, 176, 37, 25, 27, 226, 63, 25, 27, 233, 55, - 230, 212, 31, 245, 179, 247, 176, 31, 241, 206, 245, 179, 247, 176, 31, - 240, 204, 245, 179, 247, 176, 31, 245, 178, 241, 207, 247, 176, 31, 245, - 178, 240, 203, 247, 176, 31, 245, 179, 170, 31, 250, 108, 170, 31, 243, - 200, 249, 228, 170, 31, 230, 246, 170, 31, 252, 50, 170, 31, 234, 185, - 220, 7, 170, 31, 249, 118, 170, 31, 253, 148, 170, 31, 227, 29, 170, 31, - 251, 80, 226, 254, 170, 31, 248, 24, 167, 247, 131, 170, 31, 247, 128, - 170, 31, 212, 213, 170, 31, 235, 243, 170, 31, 226, 72, 170, 31, 224, 20, - 170, 31, 249, 128, 170, 31, 241, 46, 252, 101, 170, 31, 214, 43, 170, 31, - 244, 8, 170, 31, 254, 151, 170, 31, 223, 239, 170, 31, 223, 217, 170, 31, - 245, 177, 170, 31, 235, 56, 170, 31, 249, 123, 170, 31, 245, 100, 170, - 31, 246, 7, 170, 31, 250, 81, 170, 31, 248, 33, 170, 31, 22, 223, 216, - 170, 31, 226, 205, 170, 31, 233, 58, 170, 31, 249, 191, 170, 31, 234, 86, - 170, 31, 243, 62, 170, 31, 219, 52, 170, 31, 225, 16, 170, 31, 243, 199, - 170, 31, 223, 218, 170, 31, 233, 95, 167, 230, 227, 170, 31, 223, 214, - 170, 31, 242, 144, 211, 211, 231, 141, 170, 31, 245, 102, 170, 31, 219, - 64, 170, 31, 242, 105, 170, 31, 245, 94, 170, 31, 226, 108, 170, 31, 223, - 122, 170, 31, 244, 28, 170, 31, 214, 240, 167, 214, 28, 170, 31, 249, - 132, 170, 31, 231, 154, 170, 31, 245, 27, 170, 31, 215, 143, 170, 31, - 247, 164, 170, 31, 249, 193, 230, 180, 170, 31, 242, 87, 170, 31, 243, - 63, 235, 251, 170, 31, 231, 204, 170, 31, 254, 170, 170, 31, 245, 115, - 170, 31, 246, 63, 170, 31, 214, 26, 170, 31, 220, 78, 170, 31, 235, 219, - 170, 31, 247, 249, 170, 31, 248, 105, 170, 31, 247, 160, 170, 31, 244, - 252, 170, 31, 221, 36, 170, 31, 219, 68, 170, 31, 241, 241, 170, 31, 249, - 151, 170, 31, 249, 188, 170, 31, 244, 145, 170, 31, 254, 117, 170, 31, - 249, 150, 170, 31, 227, 63, 217, 149, 214, 219, 170, 31, 247, 184, 170, - 31, 233, 147, 170, 31, 243, 239, 249, 88, 223, 103, 215, 145, 21, 116, - 249, 88, 223, 103, 215, 145, 21, 109, 249, 88, 223, 103, 215, 145, 21, - 166, 249, 88, 223, 103, 215, 145, 21, 163, 249, 88, 223, 103, 215, 145, - 21, 180, 249, 88, 223, 103, 215, 145, 21, 189, 249, 88, 223, 103, 215, - 145, 21, 198, 249, 88, 223, 103, 215, 145, 21, 195, 249, 88, 223, 103, - 215, 145, 21, 200, 249, 88, 223, 103, 217, 196, 21, 116, 249, 88, 223, - 103, 217, 196, 21, 109, 249, 88, 223, 103, 217, 196, 21, 166, 249, 88, - 223, 103, 217, 196, 21, 163, 249, 88, 223, 103, 217, 196, 21, 180, 249, - 88, 223, 103, 217, 196, 21, 189, 249, 88, 223, 103, 217, 196, 21, 198, - 249, 88, 223, 103, 217, 196, 21, 195, 249, 88, 223, 103, 217, 196, 21, - 200, 14, 22, 6, 61, 14, 22, 6, 253, 74, 14, 22, 6, 250, 252, 14, 22, 6, - 249, 3, 14, 22, 6, 74, 14, 22, 6, 244, 230, 14, 22, 6, 243, 177, 14, 22, - 6, 242, 41, 14, 22, 6, 72, 14, 22, 6, 235, 142, 14, 22, 6, 235, 27, 14, - 22, 6, 150, 14, 22, 6, 183, 14, 22, 6, 204, 14, 22, 6, 75, 14, 22, 6, - 226, 229, 14, 22, 6, 224, 240, 14, 22, 6, 149, 14, 22, 6, 197, 14, 22, 6, - 218, 99, 14, 22, 6, 69, 14, 22, 6, 215, 79, 14, 22, 6, 214, 82, 14, 22, - 6, 213, 166, 14, 22, 6, 213, 105, 14, 22, 6, 212, 152, 14, 22, 3, 61, 14, - 22, 3, 253, 74, 14, 22, 3, 250, 252, 14, 22, 3, 249, 3, 14, 22, 3, 74, - 14, 22, 3, 244, 230, 14, 22, 3, 243, 177, 14, 22, 3, 242, 41, 14, 22, 3, - 72, 14, 22, 3, 235, 142, 14, 22, 3, 235, 27, 14, 22, 3, 150, 14, 22, 3, - 183, 14, 22, 3, 204, 14, 22, 3, 75, 14, 22, 3, 226, 229, 14, 22, 3, 224, - 240, 14, 22, 3, 149, 14, 22, 3, 197, 14, 22, 3, 218, 99, 14, 22, 3, 69, - 14, 22, 3, 215, 79, 14, 22, 3, 214, 82, 14, 22, 3, 213, 166, 14, 22, 3, - 213, 105, 14, 22, 3, 212, 152, 14, 32, 6, 61, 14, 32, 6, 253, 74, 14, 32, - 6, 250, 252, 14, 32, 6, 249, 3, 14, 32, 6, 74, 14, 32, 6, 244, 230, 14, - 32, 6, 243, 177, 14, 32, 6, 242, 41, 14, 32, 6, 72, 14, 32, 6, 235, 142, - 14, 32, 6, 235, 27, 14, 32, 6, 150, 14, 32, 6, 183, 14, 32, 6, 204, 14, - 32, 6, 75, 14, 32, 6, 226, 229, 14, 32, 6, 224, 240, 14, 32, 6, 149, 14, - 32, 6, 197, 14, 32, 6, 218, 99, 14, 32, 6, 69, 14, 32, 6, 215, 79, 14, - 32, 6, 214, 82, 14, 32, 6, 213, 166, 14, 32, 6, 213, 105, 14, 32, 6, 212, - 152, 14, 32, 3, 61, 14, 32, 3, 253, 74, 14, 32, 3, 250, 252, 14, 32, 3, - 249, 3, 14, 32, 3, 74, 14, 32, 3, 244, 230, 14, 32, 3, 243, 177, 14, 32, - 3, 72, 14, 32, 3, 235, 142, 14, 32, 3, 235, 27, 14, 32, 3, 150, 14, 32, - 3, 183, 14, 32, 3, 204, 14, 32, 3, 75, 14, 32, 3, 226, 229, 14, 32, 3, - 224, 240, 14, 32, 3, 149, 14, 32, 3, 197, 14, 32, 3, 218, 99, 14, 32, 3, - 69, 14, 32, 3, 215, 79, 14, 32, 3, 214, 82, 14, 32, 3, 213, 166, 14, 32, - 3, 213, 105, 14, 32, 3, 212, 152, 14, 22, 32, 6, 61, 14, 22, 32, 6, 253, - 74, 14, 22, 32, 6, 250, 252, 14, 22, 32, 6, 249, 3, 14, 22, 32, 6, 74, - 14, 22, 32, 6, 244, 230, 14, 22, 32, 6, 243, 177, 14, 22, 32, 6, 242, 41, - 14, 22, 32, 6, 72, 14, 22, 32, 6, 235, 142, 14, 22, 32, 6, 235, 27, 14, - 22, 32, 6, 150, 14, 22, 32, 6, 183, 14, 22, 32, 6, 204, 14, 22, 32, 6, - 75, 14, 22, 32, 6, 226, 229, 14, 22, 32, 6, 224, 240, 14, 22, 32, 6, 149, - 14, 22, 32, 6, 197, 14, 22, 32, 6, 218, 99, 14, 22, 32, 6, 69, 14, 22, - 32, 6, 215, 79, 14, 22, 32, 6, 214, 82, 14, 22, 32, 6, 213, 166, 14, 22, - 32, 6, 213, 105, 14, 22, 32, 6, 212, 152, 14, 22, 32, 3, 61, 14, 22, 32, - 3, 253, 74, 14, 22, 32, 3, 250, 252, 14, 22, 32, 3, 249, 3, 14, 22, 32, - 3, 74, 14, 22, 32, 3, 244, 230, 14, 22, 32, 3, 243, 177, 14, 22, 32, 3, - 242, 41, 14, 22, 32, 3, 72, 14, 22, 32, 3, 235, 142, 14, 22, 32, 3, 235, - 27, 14, 22, 32, 3, 150, 14, 22, 32, 3, 183, 14, 22, 32, 3, 204, 14, 22, - 32, 3, 75, 14, 22, 32, 3, 226, 229, 14, 22, 32, 3, 224, 240, 14, 22, 32, - 3, 149, 14, 22, 32, 3, 197, 14, 22, 32, 3, 218, 99, 14, 22, 32, 3, 69, - 14, 22, 32, 3, 215, 79, 14, 22, 32, 3, 214, 82, 14, 22, 32, 3, 213, 166, - 14, 22, 32, 3, 213, 105, 14, 22, 32, 3, 212, 152, 14, 113, 6, 61, 14, - 113, 6, 250, 252, 14, 113, 6, 249, 3, 14, 113, 6, 243, 177, 14, 113, 6, - 235, 142, 14, 113, 6, 235, 27, 14, 113, 6, 204, 14, 113, 6, 75, 14, 113, - 6, 226, 229, 14, 113, 6, 224, 240, 14, 113, 6, 197, 14, 113, 6, 218, 99, - 14, 113, 6, 69, 14, 113, 6, 215, 79, 14, 113, 6, 214, 82, 14, 113, 6, - 213, 166, 14, 113, 6, 213, 105, 14, 113, 6, 212, 152, 14, 113, 3, 61, 14, - 113, 3, 253, 74, 14, 113, 3, 250, 252, 14, 113, 3, 249, 3, 14, 113, 3, - 244, 230, 14, 113, 3, 242, 41, 14, 113, 3, 72, 14, 113, 3, 235, 142, 14, - 113, 3, 235, 27, 14, 113, 3, 150, 14, 113, 3, 183, 14, 113, 3, 204, 14, - 113, 3, 226, 229, 14, 113, 3, 224, 240, 14, 113, 3, 149, 14, 113, 3, 197, - 14, 113, 3, 218, 99, 14, 113, 3, 69, 14, 113, 3, 215, 79, 14, 113, 3, - 214, 82, 14, 113, 3, 213, 166, 14, 113, 3, 213, 105, 14, 113, 3, 212, - 152, 14, 22, 113, 6, 61, 14, 22, 113, 6, 253, 74, 14, 22, 113, 6, 250, - 252, 14, 22, 113, 6, 249, 3, 14, 22, 113, 6, 74, 14, 22, 113, 6, 244, - 230, 14, 22, 113, 6, 243, 177, 14, 22, 113, 6, 242, 41, 14, 22, 113, 6, - 72, 14, 22, 113, 6, 235, 142, 14, 22, 113, 6, 235, 27, 14, 22, 113, 6, - 150, 14, 22, 113, 6, 183, 14, 22, 113, 6, 204, 14, 22, 113, 6, 75, 14, - 22, 113, 6, 226, 229, 14, 22, 113, 6, 224, 240, 14, 22, 113, 6, 149, 14, - 22, 113, 6, 197, 14, 22, 113, 6, 218, 99, 14, 22, 113, 6, 69, 14, 22, - 113, 6, 215, 79, 14, 22, 113, 6, 214, 82, 14, 22, 113, 6, 213, 166, 14, - 22, 113, 6, 213, 105, 14, 22, 113, 6, 212, 152, 14, 22, 113, 3, 61, 14, - 22, 113, 3, 253, 74, 14, 22, 113, 3, 250, 252, 14, 22, 113, 3, 249, 3, - 14, 22, 113, 3, 74, 14, 22, 113, 3, 244, 230, 14, 22, 113, 3, 243, 177, - 14, 22, 113, 3, 242, 41, 14, 22, 113, 3, 72, 14, 22, 113, 3, 235, 142, - 14, 22, 113, 3, 235, 27, 14, 22, 113, 3, 150, 14, 22, 113, 3, 183, 14, - 22, 113, 3, 204, 14, 22, 113, 3, 75, 14, 22, 113, 3, 226, 229, 14, 22, - 113, 3, 224, 240, 14, 22, 113, 3, 149, 14, 22, 113, 3, 197, 14, 22, 113, - 3, 218, 99, 14, 22, 113, 3, 69, 14, 22, 113, 3, 215, 79, 14, 22, 113, 3, - 214, 82, 14, 22, 113, 3, 213, 166, 14, 22, 113, 3, 213, 105, 14, 22, 113, - 3, 212, 152, 14, 129, 6, 61, 14, 129, 6, 253, 74, 14, 129, 6, 249, 3, 14, - 129, 6, 74, 14, 129, 6, 244, 230, 14, 129, 6, 243, 177, 14, 129, 6, 235, - 142, 14, 129, 6, 235, 27, 14, 129, 6, 150, 14, 129, 6, 183, 14, 129, 6, - 204, 14, 129, 6, 75, 14, 129, 6, 226, 229, 14, 129, 6, 224, 240, 14, 129, - 6, 197, 14, 129, 6, 218, 99, 14, 129, 6, 69, 14, 129, 6, 215, 79, 14, - 129, 6, 214, 82, 14, 129, 6, 213, 166, 14, 129, 6, 213, 105, 14, 129, 3, - 61, 14, 129, 3, 253, 74, 14, 129, 3, 250, 252, 14, 129, 3, 249, 3, 14, - 129, 3, 74, 14, 129, 3, 244, 230, 14, 129, 3, 243, 177, 14, 129, 3, 242, - 41, 14, 129, 3, 72, 14, 129, 3, 235, 142, 14, 129, 3, 235, 27, 14, 129, - 3, 150, 14, 129, 3, 183, 14, 129, 3, 204, 14, 129, 3, 75, 14, 129, 3, - 226, 229, 14, 129, 3, 224, 240, 14, 129, 3, 149, 14, 129, 3, 197, 14, - 129, 3, 218, 99, 14, 129, 3, 69, 14, 129, 3, 215, 79, 14, 129, 3, 214, - 82, 14, 129, 3, 213, 166, 14, 129, 3, 213, 105, 14, 129, 3, 212, 152, 14, - 187, 6, 61, 14, 187, 6, 253, 74, 14, 187, 6, 249, 3, 14, 187, 6, 74, 14, - 187, 6, 244, 230, 14, 187, 6, 243, 177, 14, 187, 6, 72, 14, 187, 6, 235, - 142, 14, 187, 6, 235, 27, 14, 187, 6, 150, 14, 187, 6, 183, 14, 187, 6, - 75, 14, 187, 6, 197, 14, 187, 6, 218, 99, 14, 187, 6, 69, 14, 187, 6, - 215, 79, 14, 187, 6, 214, 82, 14, 187, 6, 213, 166, 14, 187, 6, 213, 105, - 14, 187, 3, 61, 14, 187, 3, 253, 74, 14, 187, 3, 250, 252, 14, 187, 3, - 249, 3, 14, 187, 3, 74, 14, 187, 3, 244, 230, 14, 187, 3, 243, 177, 14, - 187, 3, 242, 41, 14, 187, 3, 72, 14, 187, 3, 235, 142, 14, 187, 3, 235, - 27, 14, 187, 3, 150, 14, 187, 3, 183, 14, 187, 3, 204, 14, 187, 3, 75, - 14, 187, 3, 226, 229, 14, 187, 3, 224, 240, 14, 187, 3, 149, 14, 187, 3, - 197, 14, 187, 3, 218, 99, 14, 187, 3, 69, 14, 187, 3, 215, 79, 14, 187, - 3, 214, 82, 14, 187, 3, 213, 166, 14, 187, 3, 213, 105, 14, 187, 3, 212, - 152, 14, 22, 129, 6, 61, 14, 22, 129, 6, 253, 74, 14, 22, 129, 6, 250, - 252, 14, 22, 129, 6, 249, 3, 14, 22, 129, 6, 74, 14, 22, 129, 6, 244, - 230, 14, 22, 129, 6, 243, 177, 14, 22, 129, 6, 242, 41, 14, 22, 129, 6, - 72, 14, 22, 129, 6, 235, 142, 14, 22, 129, 6, 235, 27, 14, 22, 129, 6, - 150, 14, 22, 129, 6, 183, 14, 22, 129, 6, 204, 14, 22, 129, 6, 75, 14, - 22, 129, 6, 226, 229, 14, 22, 129, 6, 224, 240, 14, 22, 129, 6, 149, 14, - 22, 129, 6, 197, 14, 22, 129, 6, 218, 99, 14, 22, 129, 6, 69, 14, 22, - 129, 6, 215, 79, 14, 22, 129, 6, 214, 82, 14, 22, 129, 6, 213, 166, 14, - 22, 129, 6, 213, 105, 14, 22, 129, 6, 212, 152, 14, 22, 129, 3, 61, 14, - 22, 129, 3, 253, 74, 14, 22, 129, 3, 250, 252, 14, 22, 129, 3, 249, 3, - 14, 22, 129, 3, 74, 14, 22, 129, 3, 244, 230, 14, 22, 129, 3, 243, 177, - 14, 22, 129, 3, 242, 41, 14, 22, 129, 3, 72, 14, 22, 129, 3, 235, 142, - 14, 22, 129, 3, 235, 27, 14, 22, 129, 3, 150, 14, 22, 129, 3, 183, 14, - 22, 129, 3, 204, 14, 22, 129, 3, 75, 14, 22, 129, 3, 226, 229, 14, 22, - 129, 3, 224, 240, 14, 22, 129, 3, 149, 14, 22, 129, 3, 197, 14, 22, 129, - 3, 218, 99, 14, 22, 129, 3, 69, 14, 22, 129, 3, 215, 79, 14, 22, 129, 3, - 214, 82, 14, 22, 129, 3, 213, 166, 14, 22, 129, 3, 213, 105, 14, 22, 129, - 3, 212, 152, 14, 35, 6, 61, 14, 35, 6, 253, 74, 14, 35, 6, 250, 252, 14, - 35, 6, 249, 3, 14, 35, 6, 74, 14, 35, 6, 244, 230, 14, 35, 6, 243, 177, - 14, 35, 6, 242, 41, 14, 35, 6, 72, 14, 35, 6, 235, 142, 14, 35, 6, 235, - 27, 14, 35, 6, 150, 14, 35, 6, 183, 14, 35, 6, 204, 14, 35, 6, 75, 14, - 35, 6, 226, 229, 14, 35, 6, 224, 240, 14, 35, 6, 149, 14, 35, 6, 197, 14, - 35, 6, 218, 99, 14, 35, 6, 69, 14, 35, 6, 215, 79, 14, 35, 6, 214, 82, - 14, 35, 6, 213, 166, 14, 35, 6, 213, 105, 14, 35, 6, 212, 152, 14, 35, 3, - 61, 14, 35, 3, 253, 74, 14, 35, 3, 250, 252, 14, 35, 3, 249, 3, 14, 35, - 3, 74, 14, 35, 3, 244, 230, 14, 35, 3, 243, 177, 14, 35, 3, 242, 41, 14, - 35, 3, 72, 14, 35, 3, 235, 142, 14, 35, 3, 235, 27, 14, 35, 3, 150, 14, - 35, 3, 183, 14, 35, 3, 204, 14, 35, 3, 75, 14, 35, 3, 226, 229, 14, 35, - 3, 224, 240, 14, 35, 3, 149, 14, 35, 3, 197, 14, 35, 3, 218, 99, 14, 35, - 3, 69, 14, 35, 3, 215, 79, 14, 35, 3, 214, 82, 14, 35, 3, 213, 166, 14, - 35, 3, 213, 105, 14, 35, 3, 212, 152, 14, 35, 22, 6, 61, 14, 35, 22, 6, - 253, 74, 14, 35, 22, 6, 250, 252, 14, 35, 22, 6, 249, 3, 14, 35, 22, 6, - 74, 14, 35, 22, 6, 244, 230, 14, 35, 22, 6, 243, 177, 14, 35, 22, 6, 242, - 41, 14, 35, 22, 6, 72, 14, 35, 22, 6, 235, 142, 14, 35, 22, 6, 235, 27, - 14, 35, 22, 6, 150, 14, 35, 22, 6, 183, 14, 35, 22, 6, 204, 14, 35, 22, - 6, 75, 14, 35, 22, 6, 226, 229, 14, 35, 22, 6, 224, 240, 14, 35, 22, 6, - 149, 14, 35, 22, 6, 197, 14, 35, 22, 6, 218, 99, 14, 35, 22, 6, 69, 14, - 35, 22, 6, 215, 79, 14, 35, 22, 6, 214, 82, 14, 35, 22, 6, 213, 166, 14, - 35, 22, 6, 213, 105, 14, 35, 22, 6, 212, 152, 14, 35, 22, 3, 61, 14, 35, - 22, 3, 253, 74, 14, 35, 22, 3, 250, 252, 14, 35, 22, 3, 249, 3, 14, 35, - 22, 3, 74, 14, 35, 22, 3, 244, 230, 14, 35, 22, 3, 243, 177, 14, 35, 22, - 3, 242, 41, 14, 35, 22, 3, 72, 14, 35, 22, 3, 235, 142, 14, 35, 22, 3, - 235, 27, 14, 35, 22, 3, 150, 14, 35, 22, 3, 183, 14, 35, 22, 3, 204, 14, - 35, 22, 3, 75, 14, 35, 22, 3, 226, 229, 14, 35, 22, 3, 224, 240, 14, 35, - 22, 3, 149, 14, 35, 22, 3, 197, 14, 35, 22, 3, 218, 99, 14, 35, 22, 3, - 69, 14, 35, 22, 3, 215, 79, 14, 35, 22, 3, 214, 82, 14, 35, 22, 3, 213, - 166, 14, 35, 22, 3, 213, 105, 14, 35, 22, 3, 212, 152, 14, 35, 32, 6, 61, - 14, 35, 32, 6, 253, 74, 14, 35, 32, 6, 250, 252, 14, 35, 32, 6, 249, 3, - 14, 35, 32, 6, 74, 14, 35, 32, 6, 244, 230, 14, 35, 32, 6, 243, 177, 14, - 35, 32, 6, 242, 41, 14, 35, 32, 6, 72, 14, 35, 32, 6, 235, 142, 14, 35, - 32, 6, 235, 27, 14, 35, 32, 6, 150, 14, 35, 32, 6, 183, 14, 35, 32, 6, - 204, 14, 35, 32, 6, 75, 14, 35, 32, 6, 226, 229, 14, 35, 32, 6, 224, 240, - 14, 35, 32, 6, 149, 14, 35, 32, 6, 197, 14, 35, 32, 6, 218, 99, 14, 35, - 32, 6, 69, 14, 35, 32, 6, 215, 79, 14, 35, 32, 6, 214, 82, 14, 35, 32, 6, - 213, 166, 14, 35, 32, 6, 213, 105, 14, 35, 32, 6, 212, 152, 14, 35, 32, - 3, 61, 14, 35, 32, 3, 253, 74, 14, 35, 32, 3, 250, 252, 14, 35, 32, 3, - 249, 3, 14, 35, 32, 3, 74, 14, 35, 32, 3, 244, 230, 14, 35, 32, 3, 243, - 177, 14, 35, 32, 3, 242, 41, 14, 35, 32, 3, 72, 14, 35, 32, 3, 235, 142, - 14, 35, 32, 3, 235, 27, 14, 35, 32, 3, 150, 14, 35, 32, 3, 183, 14, 35, - 32, 3, 204, 14, 35, 32, 3, 75, 14, 35, 32, 3, 226, 229, 14, 35, 32, 3, - 224, 240, 14, 35, 32, 3, 149, 14, 35, 32, 3, 197, 14, 35, 32, 3, 218, 99, - 14, 35, 32, 3, 69, 14, 35, 32, 3, 215, 79, 14, 35, 32, 3, 214, 82, 14, - 35, 32, 3, 213, 166, 14, 35, 32, 3, 213, 105, 14, 35, 32, 3, 212, 152, - 14, 35, 22, 32, 6, 61, 14, 35, 22, 32, 6, 253, 74, 14, 35, 22, 32, 6, - 250, 252, 14, 35, 22, 32, 6, 249, 3, 14, 35, 22, 32, 6, 74, 14, 35, 22, - 32, 6, 244, 230, 14, 35, 22, 32, 6, 243, 177, 14, 35, 22, 32, 6, 242, 41, - 14, 35, 22, 32, 6, 72, 14, 35, 22, 32, 6, 235, 142, 14, 35, 22, 32, 6, - 235, 27, 14, 35, 22, 32, 6, 150, 14, 35, 22, 32, 6, 183, 14, 35, 22, 32, - 6, 204, 14, 35, 22, 32, 6, 75, 14, 35, 22, 32, 6, 226, 229, 14, 35, 22, - 32, 6, 224, 240, 14, 35, 22, 32, 6, 149, 14, 35, 22, 32, 6, 197, 14, 35, - 22, 32, 6, 218, 99, 14, 35, 22, 32, 6, 69, 14, 35, 22, 32, 6, 215, 79, - 14, 35, 22, 32, 6, 214, 82, 14, 35, 22, 32, 6, 213, 166, 14, 35, 22, 32, - 6, 213, 105, 14, 35, 22, 32, 6, 212, 152, 14, 35, 22, 32, 3, 61, 14, 35, - 22, 32, 3, 253, 74, 14, 35, 22, 32, 3, 250, 252, 14, 35, 22, 32, 3, 249, - 3, 14, 35, 22, 32, 3, 74, 14, 35, 22, 32, 3, 244, 230, 14, 35, 22, 32, 3, - 243, 177, 14, 35, 22, 32, 3, 242, 41, 14, 35, 22, 32, 3, 72, 14, 35, 22, - 32, 3, 235, 142, 14, 35, 22, 32, 3, 235, 27, 14, 35, 22, 32, 3, 150, 14, - 35, 22, 32, 3, 183, 14, 35, 22, 32, 3, 204, 14, 35, 22, 32, 3, 75, 14, - 35, 22, 32, 3, 226, 229, 14, 35, 22, 32, 3, 224, 240, 14, 35, 22, 32, 3, - 149, 14, 35, 22, 32, 3, 197, 14, 35, 22, 32, 3, 218, 99, 14, 35, 22, 32, - 3, 69, 14, 35, 22, 32, 3, 215, 79, 14, 35, 22, 32, 3, 214, 82, 14, 35, - 22, 32, 3, 213, 166, 14, 35, 22, 32, 3, 213, 105, 14, 35, 22, 32, 3, 212, - 152, 14, 230, 208, 6, 61, 14, 230, 208, 6, 253, 74, 14, 230, 208, 6, 250, - 252, 14, 230, 208, 6, 249, 3, 14, 230, 208, 6, 74, 14, 230, 208, 6, 244, - 230, 14, 230, 208, 6, 243, 177, 14, 230, 208, 6, 242, 41, 14, 230, 208, - 6, 72, 14, 230, 208, 6, 235, 142, 14, 230, 208, 6, 235, 27, 14, 230, 208, - 6, 150, 14, 230, 208, 6, 183, 14, 230, 208, 6, 204, 14, 230, 208, 6, 75, - 14, 230, 208, 6, 226, 229, 14, 230, 208, 6, 224, 240, 14, 230, 208, 6, - 149, 14, 230, 208, 6, 197, 14, 230, 208, 6, 218, 99, 14, 230, 208, 6, 69, - 14, 230, 208, 6, 215, 79, 14, 230, 208, 6, 214, 82, 14, 230, 208, 6, 213, - 166, 14, 230, 208, 6, 213, 105, 14, 230, 208, 6, 212, 152, 14, 230, 208, - 3, 61, 14, 230, 208, 3, 253, 74, 14, 230, 208, 3, 250, 252, 14, 230, 208, - 3, 249, 3, 14, 230, 208, 3, 74, 14, 230, 208, 3, 244, 230, 14, 230, 208, - 3, 243, 177, 14, 230, 208, 3, 242, 41, 14, 230, 208, 3, 72, 14, 230, 208, - 3, 235, 142, 14, 230, 208, 3, 235, 27, 14, 230, 208, 3, 150, 14, 230, - 208, 3, 183, 14, 230, 208, 3, 204, 14, 230, 208, 3, 75, 14, 230, 208, 3, - 226, 229, 14, 230, 208, 3, 224, 240, 14, 230, 208, 3, 149, 14, 230, 208, - 3, 197, 14, 230, 208, 3, 218, 99, 14, 230, 208, 3, 69, 14, 230, 208, 3, - 215, 79, 14, 230, 208, 3, 214, 82, 14, 230, 208, 3, 213, 166, 14, 230, - 208, 3, 213, 105, 14, 230, 208, 3, 212, 152, 14, 32, 3, 247, 73, 72, 14, - 32, 3, 247, 73, 235, 142, 14, 22, 6, 254, 52, 14, 22, 6, 251, 203, 14, - 22, 6, 243, 83, 14, 22, 6, 248, 5, 14, 22, 6, 245, 63, 14, 22, 6, 212, - 78, 14, 22, 6, 245, 28, 14, 22, 6, 217, 132, 14, 22, 6, 235, 183, 14, 22, - 6, 234, 227, 14, 22, 6, 233, 122, 14, 22, 6, 230, 172, 14, 22, 6, 228, - 92, 14, 22, 6, 213, 145, 14, 22, 6, 227, 65, 14, 22, 6, 225, 240, 14, 22, - 6, 223, 190, 14, 22, 6, 217, 133, 87, 14, 22, 6, 220, 103, 14, 22, 6, - 217, 248, 14, 22, 6, 215, 128, 14, 22, 6, 226, 9, 14, 22, 6, 250, 47, 14, - 22, 6, 225, 46, 14, 22, 6, 227, 67, 14, 22, 230, 39, 14, 22, 3, 254, 52, - 14, 22, 3, 251, 203, 14, 22, 3, 243, 83, 14, 22, 3, 248, 5, 14, 22, 3, - 245, 63, 14, 22, 3, 212, 78, 14, 22, 3, 245, 28, 14, 22, 3, 217, 132, 14, - 22, 3, 235, 183, 14, 22, 3, 234, 227, 14, 22, 3, 233, 122, 14, 22, 3, - 230, 172, 14, 22, 3, 228, 92, 14, 22, 3, 213, 145, 14, 22, 3, 227, 65, - 14, 22, 3, 225, 240, 14, 22, 3, 223, 190, 14, 22, 3, 40, 220, 103, 14, - 22, 3, 220, 103, 14, 22, 3, 217, 248, 14, 22, 3, 215, 128, 14, 22, 3, - 226, 9, 14, 22, 3, 250, 47, 14, 22, 3, 225, 46, 14, 22, 3, 227, 67, 14, - 22, 226, 125, 247, 185, 14, 22, 245, 64, 87, 14, 22, 217, 133, 87, 14, - 22, 234, 228, 87, 14, 22, 226, 10, 87, 14, 22, 223, 191, 87, 14, 22, 225, - 241, 87, 14, 32, 6, 254, 52, 14, 32, 6, 251, 203, 14, 32, 6, 243, 83, 14, - 32, 6, 248, 5, 14, 32, 6, 245, 63, 14, 32, 6, 212, 78, 14, 32, 6, 245, - 28, 14, 32, 6, 217, 132, 14, 32, 6, 235, 183, 14, 32, 6, 234, 227, 14, - 32, 6, 233, 122, 14, 32, 6, 230, 172, 14, 32, 6, 228, 92, 14, 32, 6, 213, - 145, 14, 32, 6, 227, 65, 14, 32, 6, 225, 240, 14, 32, 6, 223, 190, 14, - 32, 6, 217, 133, 87, 14, 32, 6, 220, 103, 14, 32, 6, 217, 248, 14, 32, 6, - 215, 128, 14, 32, 6, 226, 9, 14, 32, 6, 250, 47, 14, 32, 6, 225, 46, 14, - 32, 6, 227, 67, 14, 32, 230, 39, 14, 32, 3, 254, 52, 14, 32, 3, 251, 203, - 14, 32, 3, 243, 83, 14, 32, 3, 248, 5, 14, 32, 3, 245, 63, 14, 32, 3, - 212, 78, 14, 32, 3, 245, 28, 14, 32, 3, 217, 132, 14, 32, 3, 235, 183, - 14, 32, 3, 234, 227, 14, 32, 3, 233, 122, 14, 32, 3, 230, 172, 14, 32, 3, - 228, 92, 14, 32, 3, 213, 145, 14, 32, 3, 227, 65, 14, 32, 3, 225, 240, - 14, 32, 3, 223, 190, 14, 32, 3, 40, 220, 103, 14, 32, 3, 220, 103, 14, - 32, 3, 217, 248, 14, 32, 3, 215, 128, 14, 32, 3, 226, 9, 14, 32, 3, 250, - 47, 14, 32, 3, 225, 46, 14, 32, 3, 227, 67, 14, 32, 226, 125, 247, 185, - 14, 32, 245, 64, 87, 14, 32, 217, 133, 87, 14, 32, 234, 228, 87, 14, 32, - 226, 10, 87, 14, 32, 223, 191, 87, 14, 32, 225, 241, 87, 14, 22, 32, 6, - 254, 52, 14, 22, 32, 6, 251, 203, 14, 22, 32, 6, 243, 83, 14, 22, 32, 6, - 248, 5, 14, 22, 32, 6, 245, 63, 14, 22, 32, 6, 212, 78, 14, 22, 32, 6, - 245, 28, 14, 22, 32, 6, 217, 132, 14, 22, 32, 6, 235, 183, 14, 22, 32, 6, - 234, 227, 14, 22, 32, 6, 233, 122, 14, 22, 32, 6, 230, 172, 14, 22, 32, - 6, 228, 92, 14, 22, 32, 6, 213, 145, 14, 22, 32, 6, 227, 65, 14, 22, 32, - 6, 225, 240, 14, 22, 32, 6, 223, 190, 14, 22, 32, 6, 217, 133, 87, 14, - 22, 32, 6, 220, 103, 14, 22, 32, 6, 217, 248, 14, 22, 32, 6, 215, 128, - 14, 22, 32, 6, 226, 9, 14, 22, 32, 6, 250, 47, 14, 22, 32, 6, 225, 46, - 14, 22, 32, 6, 227, 67, 14, 22, 32, 230, 39, 14, 22, 32, 3, 254, 52, 14, - 22, 32, 3, 251, 203, 14, 22, 32, 3, 243, 83, 14, 22, 32, 3, 248, 5, 14, - 22, 32, 3, 245, 63, 14, 22, 32, 3, 212, 78, 14, 22, 32, 3, 245, 28, 14, - 22, 32, 3, 217, 132, 14, 22, 32, 3, 235, 183, 14, 22, 32, 3, 234, 227, - 14, 22, 32, 3, 233, 122, 14, 22, 32, 3, 230, 172, 14, 22, 32, 3, 228, 92, - 14, 22, 32, 3, 213, 145, 14, 22, 32, 3, 227, 65, 14, 22, 32, 3, 225, 240, - 14, 22, 32, 3, 223, 190, 14, 22, 32, 3, 40, 220, 103, 14, 22, 32, 3, 220, - 103, 14, 22, 32, 3, 217, 248, 14, 22, 32, 3, 215, 128, 14, 22, 32, 3, - 226, 9, 14, 22, 32, 3, 250, 47, 14, 22, 32, 3, 225, 46, 14, 22, 32, 3, - 227, 67, 14, 22, 32, 226, 125, 247, 185, 14, 22, 32, 245, 64, 87, 14, 22, - 32, 217, 133, 87, 14, 22, 32, 234, 228, 87, 14, 22, 32, 226, 10, 87, 14, - 22, 32, 223, 191, 87, 14, 22, 32, 225, 241, 87, 14, 35, 22, 6, 254, 52, - 14, 35, 22, 6, 251, 203, 14, 35, 22, 6, 243, 83, 14, 35, 22, 6, 248, 5, - 14, 35, 22, 6, 245, 63, 14, 35, 22, 6, 212, 78, 14, 35, 22, 6, 245, 28, - 14, 35, 22, 6, 217, 132, 14, 35, 22, 6, 235, 183, 14, 35, 22, 6, 234, - 227, 14, 35, 22, 6, 233, 122, 14, 35, 22, 6, 230, 172, 14, 35, 22, 6, - 228, 92, 14, 35, 22, 6, 213, 145, 14, 35, 22, 6, 227, 65, 14, 35, 22, 6, - 225, 240, 14, 35, 22, 6, 223, 190, 14, 35, 22, 6, 217, 133, 87, 14, 35, - 22, 6, 220, 103, 14, 35, 22, 6, 217, 248, 14, 35, 22, 6, 215, 128, 14, - 35, 22, 6, 226, 9, 14, 35, 22, 6, 250, 47, 14, 35, 22, 6, 225, 46, 14, - 35, 22, 6, 227, 67, 14, 35, 22, 230, 39, 14, 35, 22, 3, 254, 52, 14, 35, - 22, 3, 251, 203, 14, 35, 22, 3, 243, 83, 14, 35, 22, 3, 248, 5, 14, 35, - 22, 3, 245, 63, 14, 35, 22, 3, 212, 78, 14, 35, 22, 3, 245, 28, 14, 35, - 22, 3, 217, 132, 14, 35, 22, 3, 235, 183, 14, 35, 22, 3, 234, 227, 14, - 35, 22, 3, 233, 122, 14, 35, 22, 3, 230, 172, 14, 35, 22, 3, 228, 92, 14, - 35, 22, 3, 213, 145, 14, 35, 22, 3, 227, 65, 14, 35, 22, 3, 225, 240, 14, - 35, 22, 3, 223, 190, 14, 35, 22, 3, 40, 220, 103, 14, 35, 22, 3, 220, - 103, 14, 35, 22, 3, 217, 248, 14, 35, 22, 3, 215, 128, 14, 35, 22, 3, - 226, 9, 14, 35, 22, 3, 250, 47, 14, 35, 22, 3, 225, 46, 14, 35, 22, 3, - 227, 67, 14, 35, 22, 226, 125, 247, 185, 14, 35, 22, 245, 64, 87, 14, 35, - 22, 217, 133, 87, 14, 35, 22, 234, 228, 87, 14, 35, 22, 226, 10, 87, 14, - 35, 22, 223, 191, 87, 14, 35, 22, 225, 241, 87, 14, 35, 22, 32, 6, 254, - 52, 14, 35, 22, 32, 6, 251, 203, 14, 35, 22, 32, 6, 243, 83, 14, 35, 22, - 32, 6, 248, 5, 14, 35, 22, 32, 6, 245, 63, 14, 35, 22, 32, 6, 212, 78, - 14, 35, 22, 32, 6, 245, 28, 14, 35, 22, 32, 6, 217, 132, 14, 35, 22, 32, - 6, 235, 183, 14, 35, 22, 32, 6, 234, 227, 14, 35, 22, 32, 6, 233, 122, - 14, 35, 22, 32, 6, 230, 172, 14, 35, 22, 32, 6, 228, 92, 14, 35, 22, 32, - 6, 213, 145, 14, 35, 22, 32, 6, 227, 65, 14, 35, 22, 32, 6, 225, 240, 14, - 35, 22, 32, 6, 223, 190, 14, 35, 22, 32, 6, 217, 133, 87, 14, 35, 22, 32, - 6, 220, 103, 14, 35, 22, 32, 6, 217, 248, 14, 35, 22, 32, 6, 215, 128, - 14, 35, 22, 32, 6, 226, 9, 14, 35, 22, 32, 6, 250, 47, 14, 35, 22, 32, 6, - 225, 46, 14, 35, 22, 32, 6, 227, 67, 14, 35, 22, 32, 230, 39, 14, 35, 22, - 32, 3, 254, 52, 14, 35, 22, 32, 3, 251, 203, 14, 35, 22, 32, 3, 243, 83, - 14, 35, 22, 32, 3, 248, 5, 14, 35, 22, 32, 3, 245, 63, 14, 35, 22, 32, 3, - 212, 78, 14, 35, 22, 32, 3, 245, 28, 14, 35, 22, 32, 3, 217, 132, 14, 35, - 22, 32, 3, 235, 183, 14, 35, 22, 32, 3, 234, 227, 14, 35, 22, 32, 3, 233, - 122, 14, 35, 22, 32, 3, 230, 172, 14, 35, 22, 32, 3, 228, 92, 14, 35, 22, - 32, 3, 213, 145, 14, 35, 22, 32, 3, 227, 65, 14, 35, 22, 32, 3, 225, 240, - 14, 35, 22, 32, 3, 223, 190, 14, 35, 22, 32, 3, 40, 220, 103, 14, 35, 22, - 32, 3, 220, 103, 14, 35, 22, 32, 3, 217, 248, 14, 35, 22, 32, 3, 215, - 128, 14, 35, 22, 32, 3, 226, 9, 14, 35, 22, 32, 3, 250, 47, 14, 35, 22, - 32, 3, 225, 46, 14, 35, 22, 32, 3, 227, 67, 14, 35, 22, 32, 226, 125, - 247, 185, 14, 35, 22, 32, 245, 64, 87, 14, 35, 22, 32, 217, 133, 87, 14, - 35, 22, 32, 234, 228, 87, 14, 35, 22, 32, 226, 10, 87, 14, 35, 22, 32, - 223, 191, 87, 14, 35, 22, 32, 225, 241, 87, 14, 22, 6, 247, 179, 14, 22, - 3, 247, 179, 14, 22, 21, 212, 79, 14, 22, 21, 116, 14, 22, 21, 109, 14, - 22, 21, 166, 14, 22, 21, 163, 14, 22, 21, 180, 14, 22, 21, 189, 14, 22, - 21, 198, 14, 22, 21, 195, 14, 22, 21, 200, 14, 187, 21, 212, 79, 14, 187, - 21, 116, 14, 187, 21, 109, 14, 187, 21, 166, 14, 187, 21, 163, 14, 187, - 21, 180, 14, 187, 21, 189, 14, 187, 21, 198, 14, 187, 21, 195, 14, 187, - 21, 200, 14, 35, 21, 212, 79, 14, 35, 21, 116, 14, 35, 21, 109, 14, 35, - 21, 166, 14, 35, 21, 163, 14, 35, 21, 180, 14, 35, 21, 189, 14, 35, 21, - 198, 14, 35, 21, 195, 14, 35, 21, 200, 14, 35, 22, 21, 212, 79, 14, 35, - 22, 21, 116, 14, 35, 22, 21, 109, 14, 35, 22, 21, 166, 14, 35, 22, 21, - 163, 14, 35, 22, 21, 180, 14, 35, 22, 21, 189, 14, 35, 22, 21, 198, 14, - 35, 22, 21, 195, 14, 35, 22, 21, 200, 14, 230, 208, 21, 212, 79, 14, 230, - 208, 21, 116, 14, 230, 208, 21, 109, 14, 230, 208, 21, 166, 14, 230, 208, - 21, 163, 14, 230, 208, 21, 180, 14, 230, 208, 21, 189, 14, 230, 208, 21, - 198, 14, 230, 208, 21, 195, 14, 230, 208, 21, 200, 232, 10, 85, 245, 176, - 213, 224, 232, 10, 85, 219, 215, 213, 224, 232, 10, 85, 213, 250, 213, - 224, 232, 10, 85, 228, 167, 213, 224, 232, 10, 85, 224, 4, 246, 50, 232, - 10, 85, 242, 104, 246, 50, 232, 10, 85, 67, 246, 50, 232, 10, 85, 122, - 65, 250, 77, 232, 10, 85, 117, 65, 250, 77, 232, 10, 85, 133, 65, 250, - 77, 232, 10, 85, 243, 237, 65, 250, 77, 232, 10, 85, 244, 50, 65, 250, - 77, 232, 10, 85, 220, 53, 65, 250, 77, 232, 10, 85, 221, 43, 65, 250, 77, - 232, 10, 85, 245, 150, 65, 250, 77, 232, 10, 85, 229, 31, 65, 250, 77, - 232, 10, 85, 122, 65, 252, 72, 232, 10, 85, 117, 65, 252, 72, 232, 10, - 85, 133, 65, 252, 72, 232, 10, 85, 243, 237, 65, 252, 72, 232, 10, 85, - 244, 50, 65, 252, 72, 232, 10, 85, 220, 53, 65, 252, 72, 232, 10, 85, - 221, 43, 65, 252, 72, 232, 10, 85, 245, 150, 65, 252, 72, 232, 10, 85, - 229, 31, 65, 252, 72, 232, 10, 85, 122, 65, 249, 227, 232, 10, 85, 117, - 65, 249, 227, 232, 10, 85, 133, 65, 249, 227, 232, 10, 85, 243, 237, 65, - 249, 227, 232, 10, 85, 244, 50, 65, 249, 227, 232, 10, 85, 220, 53, 65, - 249, 227, 232, 10, 85, 221, 43, 65, 249, 227, 232, 10, 85, 245, 150, 65, - 249, 227, 232, 10, 85, 229, 31, 65, 249, 227, 232, 10, 85, 225, 159, 232, - 10, 85, 227, 22, 232, 10, 85, 252, 73, 232, 10, 85, 250, 7, 232, 10, 85, - 219, 171, 232, 10, 85, 218, 240, 232, 10, 85, 253, 95, 232, 10, 85, 213, - 217, 232, 10, 85, 235, 65, 232, 10, 85, 252, 101, 127, 85, 199, 252, 101, - 127, 85, 241, 30, 127, 85, 241, 29, 127, 85, 241, 28, 127, 85, 241, 27, - 127, 85, 241, 26, 127, 85, 241, 25, 127, 85, 241, 24, 127, 85, 241, 23, - 127, 85, 241, 22, 127, 85, 241, 21, 127, 85, 241, 20, 127, 85, 241, 19, - 127, 85, 241, 18, 127, 85, 241, 17, 127, 85, 241, 16, 127, 85, 241, 15, - 127, 85, 241, 14, 127, 85, 241, 13, 127, 85, 241, 12, 127, 85, 241, 11, - 127, 85, 241, 10, 127, 85, 241, 9, 127, 85, 241, 8, 127, 85, 241, 7, 127, - 85, 241, 6, 127, 85, 241, 5, 127, 85, 241, 4, 127, 85, 241, 3, 127, 85, - 241, 2, 127, 85, 241, 1, 127, 85, 241, 0, 127, 85, 240, 255, 127, 85, - 240, 254, 127, 85, 240, 253, 127, 85, 240, 252, 127, 85, 240, 251, 127, - 85, 240, 250, 127, 85, 240, 249, 127, 85, 240, 248, 127, 85, 240, 247, - 127, 85, 240, 246, 127, 85, 240, 245, 127, 85, 240, 244, 127, 85, 240, - 243, 127, 85, 240, 242, 127, 85, 240, 241, 127, 85, 240, 240, 127, 85, - 240, 239, 127, 85, 240, 238, 127, 85, 71, 252, 101, 127, 85, 214, 215, - 127, 85, 214, 214, 127, 85, 214, 213, 127, 85, 214, 212, 127, 85, 214, - 211, 127, 85, 214, 210, 127, 85, 214, 209, 127, 85, 214, 208, 127, 85, - 214, 207, 127, 85, 214, 206, 127, 85, 214, 205, 127, 85, 214, 204, 127, - 85, 214, 203, 127, 85, 214, 202, 127, 85, 214, 201, 127, 85, 214, 200, - 127, 85, 214, 199, 127, 85, 214, 198, 127, 85, 214, 197, 127, 85, 214, - 196, 127, 85, 214, 195, 127, 85, 214, 194, 127, 85, 214, 193, 127, 85, - 214, 192, 127, 85, 214, 191, 127, 85, 214, 190, 127, 85, 214, 189, 127, - 85, 214, 188, 127, 85, 214, 187, 127, 85, 214, 186, 127, 85, 214, 185, - 127, 85, 214, 184, 127, 85, 214, 183, 127, 85, 214, 182, 127, 85, 214, - 181, 127, 85, 214, 180, 127, 85, 214, 179, 127, 85, 214, 178, 127, 85, - 214, 177, 127, 85, 214, 176, 127, 85, 214, 175, 127, 85, 214, 174, 127, - 85, 214, 173, 127, 85, 214, 172, 127, 85, 214, 171, 127, 85, 214, 170, - 127, 85, 214, 169, 127, 85, 214, 168, 127, 85, 214, 167, 225, 165, 250, - 175, 252, 101, 225, 165, 250, 175, 254, 169, 65, 219, 203, 225, 165, 250, - 175, 117, 65, 219, 203, 225, 165, 250, 175, 133, 65, 219, 203, 225, 165, - 250, 175, 243, 237, 65, 219, 203, 225, 165, 250, 175, 244, 50, 65, 219, - 203, 225, 165, 250, 175, 220, 53, 65, 219, 203, 225, 165, 250, 175, 221, - 43, 65, 219, 203, 225, 165, 250, 175, 245, 150, 65, 219, 203, 225, 165, - 250, 175, 229, 31, 65, 219, 203, 225, 165, 250, 175, 217, 201, 65, 219, - 203, 225, 165, 250, 175, 235, 137, 65, 219, 203, 225, 165, 250, 175, 234, - 40, 65, 219, 203, 225, 165, 250, 175, 224, 160, 65, 219, 203, 225, 165, - 250, 175, 234, 88, 65, 219, 203, 225, 165, 250, 175, 254, 169, 65, 241, - 209, 225, 165, 250, 175, 117, 65, 241, 209, 225, 165, 250, 175, 133, 65, - 241, 209, 225, 165, 250, 175, 243, 237, 65, 241, 209, 225, 165, 250, 175, - 244, 50, 65, 241, 209, 225, 165, 250, 175, 220, 53, 65, 241, 209, 225, - 165, 250, 175, 221, 43, 65, 241, 209, 225, 165, 250, 175, 245, 150, 65, - 241, 209, 225, 165, 250, 175, 229, 31, 65, 241, 209, 225, 165, 250, 175, - 217, 201, 65, 241, 209, 225, 165, 250, 175, 235, 137, 65, 241, 209, 225, - 165, 250, 175, 234, 40, 65, 241, 209, 225, 165, 250, 175, 224, 160, 65, - 241, 209, 225, 165, 250, 175, 234, 88, 65, 241, 209, 225, 165, 250, 175, - 254, 169, 65, 247, 199, 225, 165, 250, 175, 117, 65, 247, 199, 225, 165, - 250, 175, 133, 65, 247, 199, 225, 165, 250, 175, 243, 237, 65, 247, 199, - 225, 165, 250, 175, 244, 50, 65, 247, 199, 225, 165, 250, 175, 220, 53, - 65, 247, 199, 225, 165, 250, 175, 221, 43, 65, 247, 199, 225, 165, 250, - 175, 245, 150, 65, 247, 199, 225, 165, 250, 175, 229, 31, 65, 247, 199, - 225, 165, 250, 175, 217, 201, 65, 247, 199, 225, 165, 250, 175, 235, 137, - 65, 247, 199, 225, 165, 250, 175, 234, 40, 65, 247, 199, 225, 165, 250, - 175, 224, 160, 65, 247, 199, 225, 165, 250, 175, 234, 88, 65, 247, 199, - 225, 165, 250, 175, 83, 235, 65, 225, 165, 250, 175, 254, 169, 65, 249, - 179, 225, 165, 250, 175, 117, 65, 249, 179, 225, 165, 250, 175, 133, 65, - 249, 179, 225, 165, 250, 175, 243, 237, 65, 249, 179, 225, 165, 250, 175, - 244, 50, 65, 249, 179, 225, 165, 250, 175, 220, 53, 65, 249, 179, 225, - 165, 250, 175, 221, 43, 65, 249, 179, 225, 165, 250, 175, 245, 150, 65, - 249, 179, 225, 165, 250, 175, 229, 31, 65, 249, 179, 225, 165, 250, 175, - 217, 201, 65, 249, 179, 225, 165, 250, 175, 235, 137, 65, 249, 179, 225, - 165, 250, 175, 234, 40, 65, 249, 179, 225, 165, 250, 175, 224, 160, 65, - 249, 179, 225, 165, 250, 175, 234, 88, 65, 249, 179, 225, 165, 250, 175, - 67, 235, 65, 21, 212, 80, 243, 200, 219, 69, 21, 212, 80, 249, 157, 21, - 122, 249, 157, 21, 117, 249, 157, 21, 133, 249, 157, 21, 243, 237, 249, - 157, 21, 244, 50, 249, 157, 21, 220, 53, 249, 157, 21, 221, 43, 249, 157, - 21, 245, 150, 249, 157, 21, 229, 31, 249, 157, 86, 7, 6, 1, 61, 86, 7, 6, - 1, 253, 74, 86, 7, 6, 1, 250, 252, 86, 7, 6, 1, 249, 3, 86, 7, 6, 1, 74, - 86, 7, 6, 1, 244, 230, 86, 7, 6, 1, 243, 177, 86, 7, 6, 1, 242, 41, 86, - 7, 6, 1, 72, 86, 7, 6, 1, 235, 142, 86, 7, 6, 1, 235, 27, 86, 7, 6, 1, - 150, 86, 7, 6, 1, 183, 86, 7, 6, 1, 204, 86, 7, 6, 1, 75, 86, 7, 6, 1, - 226, 229, 86, 7, 6, 1, 224, 240, 86, 7, 6, 1, 149, 86, 7, 6, 1, 197, 86, - 7, 6, 1, 218, 99, 86, 7, 6, 1, 69, 86, 7, 6, 1, 215, 79, 86, 7, 6, 1, - 214, 82, 86, 7, 6, 1, 213, 166, 86, 7, 6, 1, 213, 105, 86, 7, 6, 1, 212, - 152, 216, 219, 220, 233, 251, 84, 7, 6, 1, 197, 36, 32, 7, 6, 1, 250, - 252, 36, 32, 7, 6, 1, 149, 36, 250, 125, 36, 213, 168, 91, 7, 6, 1, 61, - 91, 7, 6, 1, 253, 74, 91, 7, 6, 1, 250, 252, 91, 7, 6, 1, 249, 3, 91, 7, - 6, 1, 74, 91, 7, 6, 1, 244, 230, 91, 7, 6, 1, 243, 177, 91, 7, 6, 1, 242, - 41, 91, 7, 6, 1, 72, 91, 7, 6, 1, 235, 142, 91, 7, 6, 1, 235, 27, 91, 7, - 6, 1, 150, 91, 7, 6, 1, 183, 91, 7, 6, 1, 204, 91, 7, 6, 1, 75, 91, 7, 6, - 1, 226, 229, 91, 7, 6, 1, 224, 240, 91, 7, 6, 1, 149, 91, 7, 6, 1, 197, - 91, 7, 6, 1, 218, 99, 91, 7, 6, 1, 69, 91, 7, 6, 1, 215, 79, 91, 7, 6, 1, - 214, 82, 91, 7, 6, 1, 213, 166, 91, 7, 6, 1, 213, 105, 91, 7, 6, 1, 212, - 152, 91, 240, 193, 91, 230, 120, 91, 222, 102, 91, 219, 158, 91, 225, 98, - 91, 214, 7, 146, 36, 7, 6, 1, 61, 146, 36, 7, 6, 1, 253, 74, 146, 36, 7, - 6, 1, 250, 252, 146, 36, 7, 6, 1, 249, 3, 146, 36, 7, 6, 1, 74, 146, 36, - 7, 6, 1, 244, 230, 146, 36, 7, 6, 1, 243, 177, 146, 36, 7, 6, 1, 242, 41, - 146, 36, 7, 6, 1, 72, 146, 36, 7, 6, 1, 235, 142, 146, 36, 7, 6, 1, 235, - 27, 146, 36, 7, 6, 1, 150, 146, 36, 7, 6, 1, 183, 146, 36, 7, 6, 1, 204, - 146, 36, 7, 6, 1, 75, 146, 36, 7, 6, 1, 226, 229, 146, 36, 7, 6, 1, 224, - 240, 146, 36, 7, 6, 1, 149, 146, 36, 7, 6, 1, 197, 146, 36, 7, 6, 1, 218, - 99, 146, 36, 7, 6, 1, 69, 146, 36, 7, 6, 1, 215, 79, 146, 36, 7, 6, 1, - 214, 82, 146, 36, 7, 6, 1, 213, 166, 146, 36, 7, 6, 1, 213, 105, 146, 36, - 7, 6, 1, 212, 152, 146, 91, 7, 6, 1, 61, 146, 91, 7, 6, 1, 253, 74, 146, - 91, 7, 6, 1, 250, 252, 146, 91, 7, 6, 1, 249, 3, 146, 91, 7, 6, 1, 74, - 146, 91, 7, 6, 1, 244, 230, 146, 91, 7, 6, 1, 243, 177, 146, 91, 7, 6, 1, - 242, 41, 146, 91, 7, 6, 1, 72, 146, 91, 7, 6, 1, 235, 142, 146, 91, 7, 6, - 1, 235, 27, 146, 91, 7, 6, 1, 150, 146, 91, 7, 6, 1, 183, 146, 91, 7, 6, - 1, 204, 146, 91, 7, 6, 1, 75, 146, 91, 7, 6, 1, 226, 229, 146, 91, 7, 6, - 1, 224, 240, 146, 91, 7, 6, 1, 149, 146, 91, 7, 6, 1, 197, 146, 91, 7, 6, - 1, 218, 99, 146, 91, 7, 6, 1, 69, 146, 91, 7, 6, 1, 215, 79, 146, 91, 7, - 6, 1, 214, 82, 146, 91, 7, 6, 1, 213, 166, 146, 91, 7, 6, 1, 213, 105, - 146, 91, 7, 6, 1, 212, 152, 249, 68, 146, 91, 7, 6, 1, 226, 229, 146, 91, - 240, 106, 146, 91, 193, 146, 91, 222, 202, 146, 91, 254, 185, 146, 91, - 214, 7, 41, 247, 116, 91, 249, 216, 91, 249, 109, 91, 243, 222, 91, 240, - 98, 91, 229, 168, 91, 229, 161, 91, 227, 80, 91, 219, 222, 91, 114, 2, - 244, 254, 77, 91, 214, 100, 223, 253, 235, 236, 16, 1, 61, 223, 253, 235, - 236, 16, 1, 253, 74, 223, 253, 235, 236, 16, 1, 250, 252, 223, 253, 235, - 236, 16, 1, 249, 3, 223, 253, 235, 236, 16, 1, 74, 223, 253, 235, 236, - 16, 1, 244, 230, 223, 253, 235, 236, 16, 1, 243, 177, 223, 253, 235, 236, - 16, 1, 242, 41, 223, 253, 235, 236, 16, 1, 72, 223, 253, 235, 236, 16, 1, - 235, 142, 223, 253, 235, 236, 16, 1, 235, 27, 223, 253, 235, 236, 16, 1, - 150, 223, 253, 235, 236, 16, 1, 183, 223, 253, 235, 236, 16, 1, 204, 223, - 253, 235, 236, 16, 1, 75, 223, 253, 235, 236, 16, 1, 226, 229, 223, 253, - 235, 236, 16, 1, 224, 240, 223, 253, 235, 236, 16, 1, 149, 223, 253, 235, - 236, 16, 1, 197, 223, 253, 235, 236, 16, 1, 218, 99, 223, 253, 235, 236, - 16, 1, 69, 223, 253, 235, 236, 16, 1, 215, 79, 223, 253, 235, 236, 16, 1, - 214, 82, 223, 253, 235, 236, 16, 1, 213, 166, 223, 253, 235, 236, 16, 1, - 213, 105, 223, 253, 235, 236, 16, 1, 212, 152, 41, 142, 241, 49, 91, 56, - 234, 27, 91, 56, 222, 202, 91, 9, 215, 148, 238, 43, 91, 9, 215, 148, - 238, 47, 91, 9, 215, 148, 238, 55, 91, 56, 248, 41, 91, 9, 215, 148, 238, - 62, 91, 9, 215, 148, 238, 49, 91, 9, 215, 148, 238, 21, 91, 9, 215, 148, - 238, 48, 91, 9, 215, 148, 238, 61, 91, 9, 215, 148, 238, 35, 91, 9, 215, - 148, 238, 28, 91, 9, 215, 148, 238, 37, 91, 9, 215, 148, 238, 58, 91, 9, - 215, 148, 238, 44, 91, 9, 215, 148, 238, 60, 91, 9, 215, 148, 238, 36, - 91, 9, 215, 148, 238, 59, 91, 9, 215, 148, 238, 22, 91, 9, 215, 148, 238, - 27, 91, 9, 215, 148, 238, 20, 91, 9, 215, 148, 238, 50, 91, 9, 215, 148, - 238, 52, 91, 9, 215, 148, 238, 30, 91, 9, 215, 148, 238, 41, 91, 9, 215, - 148, 238, 39, 91, 9, 215, 148, 238, 65, 91, 9, 215, 148, 238, 64, 91, 9, - 215, 148, 238, 18, 91, 9, 215, 148, 238, 45, 91, 9, 215, 148, 238, 63, - 91, 9, 215, 148, 238, 54, 91, 9, 215, 148, 238, 40, 91, 9, 215, 148, 238, - 19, 91, 9, 215, 148, 238, 42, 91, 9, 215, 148, 238, 24, 91, 9, 215, 148, - 238, 23, 91, 9, 215, 148, 238, 53, 91, 9, 215, 148, 238, 31, 91, 9, 215, - 148, 238, 33, 91, 9, 215, 148, 238, 34, 91, 9, 215, 148, 238, 26, 91, 9, - 215, 148, 238, 57, 91, 9, 215, 148, 238, 51, 216, 219, 220, 233, 251, 84, - 9, 215, 148, 238, 32, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 64, - 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 62, 216, 219, 220, 233, - 251, 84, 9, 215, 148, 238, 46, 216, 219, 220, 233, 251, 84, 9, 215, 148, - 238, 29, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 42, 216, 219, - 220, 233, 251, 84, 9, 215, 148, 238, 25, 216, 219, 220, 233, 251, 84, 9, - 215, 148, 238, 56, 216, 219, 220, 233, 251, 84, 9, 215, 148, 238, 38, 36, - 143, 254, 150, 36, 143, 254, 172, 249, 14, 244, 11, 249, 193, 215, 164, - 229, 44, 2, 219, 92, 218, 233, 110, 230, 184, 218, 232, 249, 219, 253, - 123, 246, 9, 218, 231, 110, 251, 47, 224, 49, 251, 68, 253, 123, 229, 43, - 214, 25, 214, 19, 214, 112, 231, 8, 214, 9, 245, 180, 242, 157, 245, 12, - 245, 180, 242, 157, 254, 37, 245, 180, 242, 157, 253, 140, 242, 157, 2, - 231, 115, 156, 230, 199, 87, 214, 11, 249, 77, 230, 199, 87, 244, 61, - 224, 167, 230, 199, 87, 214, 11, 242, 186, 230, 199, 87, 243, 200, 230, - 199, 87, 214, 36, 242, 186, 230, 199, 87, 233, 103, 224, 167, 230, 199, - 87, 214, 36, 249, 77, 230, 199, 87, 249, 77, 230, 198, 156, 230, 199, 2, - 244, 158, 244, 61, 224, 167, 230, 199, 2, 244, 158, 233, 103, 224, 167, - 230, 199, 2, 244, 158, 243, 200, 230, 199, 2, 244, 158, 218, 239, 2, 244, - 158, 242, 155, 219, 95, 220, 179, 219, 95, 250, 53, 222, 87, 245, 6, 216, - 193, 248, 35, 216, 193, 226, 186, 216, 193, 250, 213, 216, 73, 250, 55, - 251, 133, 223, 93, 241, 164, 218, 236, 251, 133, 245, 184, 65, 232, 0, - 245, 184, 65, 223, 184, 241, 188, 243, 237, 233, 78, 249, 183, 231, 233, - 233, 77, 244, 144, 233, 77, 233, 78, 244, 16, 235, 252, 213, 224, 230, - 128, 216, 245, 253, 107, 242, 119, 231, 131, 214, 23, 218, 8, 233, 50, - 252, 68, 225, 194, 224, 4, 253, 223, 242, 104, 253, 223, 226, 92, 226, - 93, 250, 56, 219, 54, 242, 6, 220, 18, 65, 225, 176, 231, 152, 227, 63, - 251, 119, 225, 109, 233, 60, 223, 185, 249, 82, 223, 185, 252, 78, 249, - 112, 223, 184, 249, 36, 24, 223, 184, 219, 81, 251, 93, 219, 202, 251, - 78, 243, 221, 243, 217, 223, 108, 218, 191, 225, 111, 248, 120, 227, 101, - 218, 208, 243, 218, 220, 155, 244, 60, 250, 209, 2, 218, 184, 247, 242, - 219, 236, 240, 105, 249, 81, 220, 250, 240, 104, 240, 105, 249, 81, 246, - 62, 249, 111, 250, 21, 134, 250, 186, 232, 194, 249, 30, 241, 41, 225, - 113, 220, 164, 251, 213, 251, 89, 225, 114, 65, 244, 2, 249, 110, 243, - 249, 24, 234, 41, 217, 227, 213, 216, 241, 252, 222, 183, 251, 103, 24, - 249, 43, 213, 222, 242, 160, 249, 172, 242, 160, 216, 151, 246, 45, 251, - 238, 230, 163, 249, 200, 251, 238, 230, 162, 252, 104, 251, 102, 223, - 186, 213, 189, 225, 75, 251, 158, 250, 208, 235, 136, 250, 14, 216, 193, - 244, 130, 250, 13, 244, 63, 244, 64, 219, 200, 252, 77, 226, 122, 225, - 124, 249, 143, 252, 78, 218, 10, 216, 193, 249, 68, 244, 36, 225, 195, - 248, 32, 235, 131, 247, 85, 250, 164, 219, 53, 213, 225, 250, 35, 230, - 199, 214, 144, 250, 96, 222, 117, 222, 141, 242, 124, 250, 183, 250, 165, - 240, 232, 244, 99, 213, 241, 223, 102, 249, 173, 244, 55, 225, 136, 24, - 244, 59, 231, 40, 230, 178, 250, 198, 249, 232, 241, 216, 253, 156, 226, - 189, 216, 227, 241, 234, 249, 222, 217, 195, 217, 67, 249, 213, 251, 125, - 226, 52, 253, 155, 214, 150, 243, 86, 247, 149, 241, 142, 220, 12, 232, - 39, 251, 168, 243, 87, 247, 192, 251, 92, 244, 21, 225, 165, 250, 173, - 27, 228, 158, 230, 155, 27, 228, 153, 222, 130, 242, 80, 27, 234, 143, - 216, 148, 214, 135, 27, 222, 111, 223, 35, 220, 191, 2, 222, 143, 217, - 197, 224, 68, 24, 252, 78, 220, 33, 24, 220, 33, 251, 112, 252, 43, 24, - 241, 36, 250, 57, 244, 42, 219, 247, 223, 36, 218, 212, 216, 152, 240, - 233, 224, 69, 254, 38, 244, 0, 223, 47, 244, 0, 218, 186, 240, 222, 251, - 48, 240, 222, 2, 243, 70, 227, 95, 251, 48, 235, 131, 225, 119, 227, 94, - 245, 11, 225, 119, 227, 94, 240, 231, 252, 64, 253, 97, 217, 205, 232, - 39, 240, 227, 232, 166, 240, 227, 249, 115, 219, 65, 222, 116, 247, 250, - 219, 65, 244, 148, 235, 147, 233, 113, 235, 131, 250, 158, 245, 11, 250, - 158, 224, 33, 230, 182, 226, 238, 214, 25, 251, 52, 249, 84, 217, 60, - 233, 42, 224, 70, 250, 156, 246, 50, 249, 75, 213, 244, 219, 254, 219, - 252, 240, 232, 224, 45, 242, 146, 220, 237, 230, 215, 223, 96, 250, 45, - 247, 90, 225, 205, 251, 126, 245, 126, 227, 103, 219, 184, 220, 232, 251, - 51, 254, 3, 241, 40, 233, 144, 251, 236, 244, 59, 216, 151, 244, 59, 251, - 132, 216, 55, 241, 232, 250, 46, 252, 104, 250, 46, 243, 212, 252, 104, - 250, 46, 251, 160, 226, 70, 234, 35, 225, 128, 246, 42, 250, 199, 252, - 95, 250, 199, 247, 84, 230, 183, 244, 158, 249, 85, 244, 158, 217, 61, - 244, 158, 224, 71, 244, 158, 250, 157, 244, 158, 246, 51, 244, 158, 219, - 173, 213, 244, 240, 233, 244, 158, 230, 216, 244, 158, 247, 91, 244, 158, - 225, 206, 244, 158, 243, 215, 244, 158, 242, 3, 244, 158, 213, 211, 244, - 158, 251, 247, 244, 158, 226, 172, 244, 158, 225, 206, 228, 164, 226, - 106, 225, 67, 244, 237, 245, 183, 228, 164, 230, 180, 216, 232, 67, 114, - 225, 141, 252, 99, 235, 239, 67, 119, 225, 141, 252, 99, 235, 239, 67, - 42, 225, 141, 252, 99, 235, 239, 67, 46, 225, 141, 252, 99, 235, 239, - 244, 53, 241, 255, 52, 214, 17, 241, 255, 52, 227, 81, 241, 255, 52, 217, - 89, 114, 52, 217, 89, 119, 52, 249, 212, 241, 250, 52, 227, 40, 241, 250, - 52, 249, 63, 213, 207, 241, 234, 244, 238, 229, 185, 218, 98, 235, 126, - 246, 47, 234, 91, 251, 170, 213, 207, 249, 186, 225, 14, 241, 253, 225, - 110, 231, 240, 220, 184, 253, 119, 220, 184, 241, 150, 220, 184, 213, - 207, 222, 156, 213, 207, 251, 111, 243, 254, 251, 19, 235, 252, 220, 95, - 251, 18, 235, 252, 220, 95, 251, 88, 242, 170, 231, 248, 213, 208, 244, - 142, 231, 249, 24, 213, 209, 241, 46, 241, 249, 117, 231, 123, 241, 46, - 241, 249, 117, 213, 206, 241, 46, 241, 249, 225, 133, 227, 93, 213, 209, - 2, 251, 35, 245, 181, 251, 69, 2, 214, 223, 226, 44, 2, 251, 135, 242, - 16, 231, 249, 2, 242, 89, 225, 241, 231, 237, 231, 249, 2, 216, 61, 227, - 74, 231, 248, 227, 74, 213, 208, 252, 103, 249, 129, 213, 192, 225, 70, - 235, 131, 227, 89, 235, 131, 242, 145, 242, 198, 252, 104, 254, 22, 244, - 242, 254, 69, 254, 70, 230, 206, 236, 1, 220, 28, 235, 229, 247, 241, - 226, 43, 242, 86, 248, 124, 232, 230, 230, 30, 225, 132, 244, 159, 231, - 205, 242, 15, 252, 58, 225, 135, 218, 117, 225, 198, 234, 73, 77, 232, - 166, 233, 34, 223, 130, 243, 30, 219, 71, 234, 72, 251, 97, 249, 87, 2, - 241, 211, 214, 3, 251, 245, 241, 211, 251, 63, 241, 211, 117, 241, 209, - 219, 198, 241, 211, 242, 98, 241, 211, 241, 212, 2, 68, 251, 131, 241, - 211, 242, 104, 241, 211, 213, 33, 241, 211, 225, 15, 241, 211, 241, 212, - 2, 223, 186, 223, 197, 241, 209, 241, 212, 248, 32, 247, 201, 221, 5, 2, - 118, 62, 235, 212, 245, 129, 177, 251, 45, 254, 21, 87, 251, 120, 220, - 20, 87, 249, 166, 87, 219, 178, 218, 193, 87, 246, 40, 248, 102, 87, 225, - 199, 65, 225, 129, 244, 30, 251, 181, 247, 117, 87, 219, 191, 252, 77, - 217, 102, 252, 77, 67, 244, 20, 240, 201, 225, 139, 87, 230, 219, 252, - 90, 249, 39, 244, 255, 107, 247, 86, 52, 249, 79, 250, 174, 252, 63, 2, - 213, 31, 52, 252, 63, 2, 247, 86, 52, 252, 63, 2, 245, 14, 52, 252, 63, - 2, 225, 108, 52, 230, 219, 2, 213, 220, 250, 74, 2, 215, 124, 216, 189, - 24, 213, 31, 52, 222, 97, 226, 42, 249, 147, 251, 67, 230, 255, 244, 25, - 247, 137, 227, 27, 247, 142, 246, 4, 244, 76, 244, 9, 227, 40, 244, 76, - 244, 9, 226, 201, 2, 249, 41, 226, 201, 244, 151, 215, 134, 250, 204, - 217, 226, 250, 204, 250, 175, 235, 239, 250, 74, 2, 215, 124, 216, 188, - 250, 74, 2, 246, 58, 216, 188, 252, 60, 250, 73, 249, 199, 225, 10, 223, - 87, 225, 10, 226, 147, 219, 61, 223, 42, 216, 180, 223, 42, 251, 116, - 218, 39, 233, 75, 228, 156, 228, 157, 2, 248, 31, 249, 86, 249, 193, 251, - 117, 227, 40, 251, 117, 242, 104, 251, 117, 251, 131, 251, 117, 227, 23, - 251, 117, 251, 114, 230, 25, 252, 93, 222, 105, 231, 124, 217, 210, 224, - 16, 226, 199, 244, 127, 232, 39, 222, 140, 254, 0, 225, 31, 254, 157, - 232, 168, 250, 63, 231, 136, 226, 253, 216, 196, 235, 248, 216, 196, 226, - 206, 245, 236, 87, 235, 245, 245, 78, 245, 79, 2, 246, 58, 76, 49, 249, - 193, 232, 6, 2, 232, 162, 244, 42, 249, 193, 232, 6, 2, 224, 48, 244, 42, - 227, 40, 232, 6, 2, 224, 48, 244, 42, 227, 40, 232, 6, 2, 232, 162, 244, - 42, 225, 116, 225, 117, 240, 235, 229, 166, 230, 229, 225, 249, 230, 229, - 225, 250, 2, 95, 76, 253, 123, 233, 70, 214, 153, 230, 228, 230, 229, - 225, 250, 227, 96, 228, 186, 230, 229, 225, 248, 254, 1, 2, 252, 49, 250, - 198, 214, 150, 250, 198, 217, 207, 224, 63, 214, 149, 216, 25, 95, 253, - 162, 249, 195, 95, 24, 132, 227, 40, 249, 229, 253, 162, 249, 195, 95, - 24, 132, 227, 40, 249, 229, 253, 163, 2, 36, 122, 226, 244, 249, 195, - 246, 58, 24, 215, 124, 227, 40, 249, 229, 253, 162, 253, 255, 246, 58, - 24, 215, 124, 227, 40, 249, 229, 253, 162, 115, 251, 66, 87, 124, 251, - 66, 87, 219, 195, 2, 250, 192, 90, 219, 194, 219, 195, 2, 122, 219, 218, - 214, 19, 219, 195, 2, 133, 219, 218, 214, 18, 252, 35, 245, 129, 225, - 161, 233, 66, 232, 16, 242, 160, 223, 144, 232, 16, 242, 160, 232, 204, - 2, 235, 222, 226, 74, 249, 193, 232, 204, 2, 234, 144, 234, 144, 232, - 203, 227, 40, 232, 203, 251, 221, 251, 222, 2, 250, 192, 90, 251, 115, - 232, 233, 87, 224, 64, 251, 15, 252, 102, 2, 132, 76, 49, 245, 101, 2, - 132, 76, 49, 227, 63, 2, 244, 254, 152, 2, 42, 46, 76, 49, 219, 225, 2, - 95, 76, 49, 216, 227, 2, 215, 124, 76, 49, 228, 186, 122, 215, 154, 245, - 148, 87, 234, 142, 217, 200, 235, 216, 16, 31, 7, 6, 233, 33, 235, 216, - 16, 31, 7, 3, 233, 33, 235, 216, 16, 31, 228, 55, 235, 216, 16, 31, 218, - 128, 235, 216, 16, 31, 7, 233, 33, 244, 65, 245, 129, 216, 222, 213, 187, - 242, 4, 228, 38, 24, 251, 121, 241, 52, 225, 182, 231, 39, 217, 208, 249, - 54, 252, 78, 220, 53, 225, 143, 219, 96, 2, 231, 37, 247, 74, 235, 131, - 16, 31, 251, 233, 216, 178, 245, 114, 83, 41, 251, 15, 67, 41, 251, 15, - 233, 108, 224, 4, 249, 228, 233, 108, 251, 131, 249, 228, 233, 108, 227, - 23, 247, 200, 233, 108, 251, 131, 247, 200, 3, 227, 23, 247, 200, 3, 251, - 131, 247, 200, 215, 133, 224, 4, 216, 183, 246, 59, 224, 4, 216, 183, - 215, 133, 3, 224, 4, 216, 183, 246, 59, 3, 224, 4, 216, 183, 249, 197, - 244, 159, 122, 227, 106, 249, 197, 244, 159, 117, 227, 106, 249, 197, - 244, 159, 133, 227, 106, 249, 197, 244, 159, 243, 237, 227, 106, 249, - 197, 244, 159, 244, 50, 227, 106, 249, 197, 244, 159, 220, 53, 227, 106, - 249, 197, 244, 159, 221, 43, 227, 106, 249, 197, 244, 159, 245, 150, 227, - 106, 249, 197, 244, 159, 229, 31, 227, 106, 249, 197, 244, 159, 217, 201, - 227, 106, 249, 197, 244, 159, 245, 125, 227, 106, 249, 197, 244, 159, - 216, 42, 227, 106, 249, 197, 244, 159, 227, 58, 249, 197, 244, 159, 216, - 22, 249, 197, 244, 159, 217, 94, 249, 197, 244, 159, 243, 233, 249, 197, - 244, 159, 244, 48, 249, 197, 244, 159, 220, 49, 249, 197, 244, 159, 221, - 42, 249, 197, 244, 159, 245, 149, 249, 197, 244, 159, 229, 30, 249, 197, - 244, 159, 217, 199, 249, 197, 244, 159, 245, 123, 249, 197, 244, 159, - 216, 40, 230, 187, 243, 201, 216, 247, 216, 215, 219, 88, 65, 233, 11, - 220, 96, 65, 235, 132, 230, 176, 242, 102, 244, 159, 2, 220, 2, 244, 237, - 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 244, 159, 2, 227, 40, 230, - 180, 220, 2, 244, 159, 2, 227, 40, 230, 181, 24, 220, 2, 244, 237, 220, - 2, 244, 159, 2, 227, 40, 230, 181, 24, 249, 168, 218, 192, 220, 2, 244, - 159, 2, 227, 40, 230, 181, 24, 217, 58, 244, 237, 220, 2, 244, 159, 2, - 242, 8, 220, 2, 244, 159, 2, 240, 234, 213, 218, 244, 158, 220, 2, 244, - 159, 2, 220, 2, 244, 237, 244, 159, 222, 135, 248, 13, 244, 2, 223, 238, - 244, 158, 220, 2, 244, 159, 2, 241, 210, 244, 237, 220, 2, 244, 159, 2, - 218, 234, 220, 1, 244, 158, 229, 169, 244, 158, 215, 158, 244, 158, 244, - 159, 2, 249, 168, 218, 192, 226, 67, 244, 158, 249, 141, 244, 158, 244, - 159, 217, 91, 118, 234, 72, 234, 71, 244, 159, 2, 249, 193, 244, 237, - 244, 159, 2, 219, 31, 216, 233, 24, 213, 218, 244, 239, 244, 159, 2, 219, - 31, 216, 233, 24, 217, 58, 244, 237, 247, 144, 244, 158, 254, 17, 244, - 158, 225, 107, 244, 158, 249, 56, 244, 158, 226, 46, 244, 158, 244, 159, - 2, 232, 179, 65, 216, 162, 247, 144, 251, 17, 223, 238, 244, 158, 244, - 121, 244, 158, 214, 4, 244, 158, 220, 19, 244, 158, 217, 24, 244, 158, - 232, 169, 249, 56, 244, 158, 244, 159, 2, 227, 40, 230, 181, 24, 249, - 168, 218, 192, 244, 159, 222, 109, 235, 252, 244, 122, 253, 129, 244, - 158, 244, 18, 244, 158, 247, 117, 244, 158, 244, 159, 213, 216, 230, 180, - 244, 159, 2, 231, 149, 231, 207, 242, 102, 250, 157, 244, 159, 2, 220, 2, - 244, 237, 250, 157, 244, 159, 2, 217, 222, 65, 235, 56, 220, 2, 250, 157, - 244, 159, 2, 227, 40, 230, 180, 220, 2, 250, 157, 244, 159, 2, 241, 210, - 244, 237, 250, 157, 244, 159, 2, 213, 184, 220, 3, 234, 71, 250, 157, - 244, 159, 2, 249, 193, 244, 237, 225, 107, 250, 157, 244, 158, 249, 56, - 250, 157, 244, 158, 214, 4, 250, 157, 244, 158, 244, 159, 2, 228, 186, - 242, 139, 243, 10, 244, 159, 2, 227, 81, 243, 10, 226, 44, 251, 94, 248, - 26, 222, 88, 230, 215, 241, 213, 230, 215, 219, 196, 230, 215, 241, 244, - 226, 44, 224, 47, 122, 241, 254, 226, 44, 224, 47, 251, 104, 241, 250, - 235, 252, 250, 113, 226, 44, 243, 208, 226, 44, 2, 225, 107, 244, 158, - 226, 44, 2, 244, 10, 241, 249, 223, 104, 241, 198, 219, 83, 232, 202, - 224, 53, 250, 176, 241, 148, 216, 205, 241, 148, 216, 206, 2, 251, 43, - 228, 164, 216, 205, 231, 99, 177, 224, 54, 219, 89, 216, 203, 216, 204, - 250, 176, 251, 21, 227, 60, 251, 21, 216, 159, 251, 22, 219, 69, 231, 0, - 254, 39, 244, 66, 245, 95, 225, 133, 250, 176, 227, 60, 225, 133, 250, - 176, 217, 239, 227, 60, 217, 239, 253, 96, 227, 60, 253, 96, 224, 11, - 214, 224, 248, 9, 216, 150, 253, 157, 232, 172, 216, 211, 230, 209, 230, - 186, 224, 52, 218, 207, 224, 52, 230, 186, 250, 214, 254, 134, 216, 202, - 220, 196, 223, 84, 219, 189, 199, 216, 209, 233, 2, 71, 216, 209, 233, 2, - 249, 129, 52, 225, 133, 250, 161, 223, 197, 233, 2, 216, 180, 244, 43, - 227, 63, 225, 118, 247, 77, 228, 186, 245, 84, 52, 220, 0, 87, 228, 186, - 220, 0, 87, 225, 9, 232, 222, 235, 252, 235, 155, 225, 173, 87, 247, 100, - 228, 163, 232, 222, 87, 225, 112, 214, 25, 87, 228, 177, 214, 25, 87, - 251, 180, 228, 186, 251, 179, 251, 178, 230, 186, 251, 178, 226, 88, 228, - 186, 226, 87, 250, 37, 249, 64, 231, 120, 87, 213, 205, 87, 223, 211, - 252, 104, 87, 216, 248, 214, 25, 249, 190, 220, 158, 252, 38, 252, 36, - 226, 115, 249, 116, 249, 28, 252, 87, 249, 215, 42, 232, 148, 104, 16, - 31, 224, 148, 104, 16, 31, 254, 100, 104, 16, 31, 244, 65, 104, 16, 31, - 245, 179, 104, 16, 31, 214, 24, 104, 16, 31, 253, 213, 104, 16, 31, 253, - 214, 223, 255, 104, 16, 31, 253, 214, 223, 254, 104, 16, 31, 253, 214, - 214, 124, 104, 16, 31, 253, 214, 214, 123, 104, 16, 31, 214, 138, 104, - 16, 31, 214, 137, 104, 16, 31, 214, 136, 104, 16, 31, 218, 245, 104, 16, - 31, 226, 1, 218, 245, 104, 16, 31, 83, 218, 245, 104, 16, 31, 231, 119, - 219, 16, 104, 16, 31, 231, 119, 219, 15, 104, 16, 31, 231, 119, 219, 14, - 104, 16, 31, 249, 231, 104, 16, 31, 222, 172, 104, 16, 31, 229, 19, 104, - 16, 31, 214, 122, 104, 16, 31, 214, 121, 104, 16, 31, 223, 105, 222, 172, - 104, 16, 31, 223, 105, 222, 171, 104, 16, 31, 242, 142, 104, 16, 31, 220, - 92, 104, 16, 31, 235, 175, 227, 20, 104, 16, 31, 235, 175, 227, 19, 104, - 16, 31, 249, 74, 65, 235, 174, 104, 16, 31, 223, 251, 65, 235, 174, 104, - 16, 31, 249, 107, 227, 20, 104, 16, 31, 235, 173, 227, 20, 104, 16, 31, - 219, 17, 65, 249, 106, 104, 16, 31, 249, 74, 65, 249, 106, 104, 16, 31, - 249, 74, 65, 249, 105, 104, 16, 31, 249, 107, 253, 250, 104, 16, 31, 222, - 173, 65, 249, 107, 253, 250, 104, 16, 31, 219, 17, 65, 222, 173, 65, 249, - 106, 104, 16, 31, 214, 220, 104, 16, 31, 217, 37, 227, 20, 104, 16, 31, - 233, 81, 227, 20, 104, 16, 31, 253, 249, 227, 20, 104, 16, 31, 219, 17, - 65, 253, 248, 104, 16, 31, 222, 173, 65, 253, 248, 104, 16, 31, 219, 17, - 65, 222, 173, 65, 253, 248, 104, 16, 31, 214, 139, 65, 253, 248, 104, 16, - 31, 223, 251, 65, 253, 248, 104, 16, 31, 223, 251, 65, 253, 247, 104, 16, - 31, 223, 250, 104, 16, 31, 223, 249, 104, 16, 31, 223, 248, 104, 16, 31, - 223, 247, 104, 16, 31, 254, 66, 104, 16, 31, 254, 65, 104, 16, 31, 231, - 226, 104, 16, 31, 222, 178, 104, 16, 31, 253, 161, 104, 16, 31, 224, 18, - 104, 16, 31, 224, 17, 104, 16, 31, 253, 99, 104, 16, 31, 251, 152, 227, - 20, 104, 16, 31, 218, 0, 104, 16, 31, 217, 255, 104, 16, 31, 224, 153, - 232, 251, 104, 16, 31, 251, 109, 104, 16, 31, 251, 108, 104, 16, 31, 251, - 107, 104, 16, 31, 254, 47, 104, 16, 31, 227, 84, 104, 16, 31, 219, 180, - 104, 16, 31, 217, 35, 104, 16, 31, 242, 77, 104, 16, 31, 214, 12, 104, - 16, 31, 225, 106, 104, 16, 31, 250, 202, 104, 16, 31, 216, 50, 104, 16, - 31, 250, 178, 230, 192, 104, 16, 31, 222, 120, 65, 235, 58, 104, 16, 31, - 250, 211, 104, 16, 31, 216, 177, 104, 16, 31, 219, 93, 216, 177, 104, 16, - 31, 232, 201, 104, 16, 31, 219, 240, 104, 16, 31, 215, 113, 104, 16, 31, - 240, 233, 246, 19, 104, 16, 31, 253, 142, 104, 16, 31, 225, 114, 253, - 142, 104, 16, 31, 251, 70, 104, 16, 31, 225, 105, 251, 70, 104, 16, 31, - 254, 44, 104, 16, 31, 219, 57, 218, 226, 219, 56, 104, 16, 31, 219, 57, - 218, 226, 219, 55, 104, 16, 31, 219, 13, 104, 16, 31, 225, 80, 104, 16, - 31, 247, 133, 104, 16, 31, 247, 135, 104, 16, 31, 247, 134, 104, 16, 31, - 225, 17, 104, 16, 31, 225, 7, 104, 16, 31, 249, 62, 104, 16, 31, 249, 61, - 104, 16, 31, 249, 60, 104, 16, 31, 249, 59, 104, 16, 31, 249, 58, 104, - 16, 31, 254, 77, 104, 16, 31, 252, 39, 65, 231, 212, 104, 16, 31, 252, - 39, 65, 214, 249, 104, 16, 31, 223, 209, 104, 16, 31, 240, 225, 104, 16, - 31, 229, 43, 104, 16, 31, 248, 91, 104, 16, 31, 230, 204, 104, 16, 31, - 151, 246, 49, 104, 16, 31, 151, 227, 0, 9, 13, 240, 95, 9, 13, 240, 94, - 9, 13, 240, 93, 9, 13, 240, 92, 9, 13, 240, 91, 9, 13, 240, 90, 9, 13, - 240, 89, 9, 13, 240, 88, 9, 13, 240, 87, 9, 13, 240, 86, 9, 13, 240, 85, - 9, 13, 240, 84, 9, 13, 240, 83, 9, 13, 240, 82, 9, 13, 240, 81, 9, 13, - 240, 80, 9, 13, 240, 79, 9, 13, 240, 78, 9, 13, 240, 77, 9, 13, 240, 76, - 9, 13, 240, 75, 9, 13, 240, 74, 9, 13, 240, 73, 9, 13, 240, 72, 9, 13, - 240, 71, 9, 13, 240, 70, 9, 13, 240, 69, 9, 13, 240, 68, 9, 13, 240, 67, - 9, 13, 240, 66, 9, 13, 240, 65, 9, 13, 240, 64, 9, 13, 240, 63, 9, 13, - 240, 62, 9, 13, 240, 61, 9, 13, 240, 60, 9, 13, 240, 59, 9, 13, 240, 58, - 9, 13, 240, 57, 9, 13, 240, 56, 9, 13, 240, 55, 9, 13, 240, 54, 9, 13, - 240, 53, 9, 13, 240, 52, 9, 13, 240, 51, 9, 13, 240, 50, 9, 13, 240, 49, - 9, 13, 240, 48, 9, 13, 240, 47, 9, 13, 240, 46, 9, 13, 240, 45, 9, 13, - 240, 44, 9, 13, 240, 43, 9, 13, 240, 42, 9, 13, 240, 41, 9, 13, 240, 40, - 9, 13, 240, 39, 9, 13, 240, 38, 9, 13, 240, 37, 9, 13, 240, 36, 9, 13, - 240, 35, 9, 13, 240, 34, 9, 13, 240, 33, 9, 13, 240, 32, 9, 13, 240, 31, - 9, 13, 240, 30, 9, 13, 240, 29, 9, 13, 240, 28, 9, 13, 240, 27, 9, 13, - 240, 26, 9, 13, 240, 25, 9, 13, 240, 24, 9, 13, 240, 23, 9, 13, 240, 22, - 9, 13, 240, 21, 9, 13, 240, 20, 9, 13, 240, 19, 9, 13, 240, 18, 9, 13, - 240, 17, 9, 13, 240, 16, 9, 13, 240, 15, 9, 13, 240, 14, 9, 13, 240, 13, - 9, 13, 240, 12, 9, 13, 240, 11, 9, 13, 240, 10, 9, 13, 240, 9, 9, 13, - 240, 8, 9, 13, 240, 7, 9, 13, 240, 6, 9, 13, 240, 5, 9, 13, 240, 4, 9, - 13, 240, 3, 9, 13, 240, 2, 9, 13, 240, 1, 9, 13, 240, 0, 9, 13, 239, 255, - 9, 13, 239, 254, 9, 13, 239, 253, 9, 13, 239, 252, 9, 13, 239, 251, 9, - 13, 239, 250, 9, 13, 239, 249, 9, 13, 239, 248, 9, 13, 239, 247, 9, 13, - 239, 246, 9, 13, 239, 245, 9, 13, 239, 244, 9, 13, 239, 243, 9, 13, 239, - 242, 9, 13, 239, 241, 9, 13, 239, 240, 9, 13, 239, 239, 9, 13, 239, 238, - 9, 13, 239, 237, 9, 13, 239, 236, 9, 13, 239, 235, 9, 13, 239, 234, 9, - 13, 239, 233, 9, 13, 239, 232, 9, 13, 239, 231, 9, 13, 239, 230, 9, 13, - 239, 229, 9, 13, 239, 228, 9, 13, 239, 227, 9, 13, 239, 226, 9, 13, 239, - 225, 9, 13, 239, 224, 9, 13, 239, 223, 9, 13, 239, 222, 9, 13, 239, 221, - 9, 13, 239, 220, 9, 13, 239, 219, 9, 13, 239, 218, 9, 13, 239, 217, 9, - 13, 239, 216, 9, 13, 239, 215, 9, 13, 239, 214, 9, 13, 239, 213, 9, 13, - 239, 212, 9, 13, 239, 211, 9, 13, 239, 210, 9, 13, 239, 209, 9, 13, 239, - 208, 9, 13, 239, 207, 9, 13, 239, 206, 9, 13, 239, 205, 9, 13, 239, 204, - 9, 13, 239, 203, 9, 13, 239, 202, 9, 13, 239, 201, 9, 13, 239, 200, 9, - 13, 239, 199, 9, 13, 239, 198, 9, 13, 239, 197, 9, 13, 239, 196, 9, 13, - 239, 195, 9, 13, 239, 194, 9, 13, 239, 193, 9, 13, 239, 192, 9, 13, 239, - 191, 9, 13, 239, 190, 9, 13, 239, 189, 9, 13, 239, 188, 9, 13, 239, 187, - 9, 13, 239, 186, 9, 13, 239, 185, 9, 13, 239, 184, 9, 13, 239, 183, 9, - 13, 239, 182, 9, 13, 239, 181, 9, 13, 239, 180, 9, 13, 239, 179, 9, 13, - 239, 178, 9, 13, 239, 177, 9, 13, 239, 176, 9, 13, 239, 175, 9, 13, 239, - 174, 9, 13, 239, 173, 9, 13, 239, 172, 9, 13, 239, 171, 9, 13, 239, 170, - 9, 13, 239, 169, 9, 13, 239, 168, 9, 13, 239, 167, 9, 13, 239, 166, 9, - 13, 239, 165, 9, 13, 239, 164, 9, 13, 239, 163, 9, 13, 239, 162, 9, 13, - 239, 161, 9, 13, 239, 160, 9, 13, 239, 159, 9, 13, 239, 158, 9, 13, 239, - 157, 9, 13, 239, 156, 9, 13, 239, 155, 9, 13, 239, 154, 9, 13, 239, 153, - 9, 13, 239, 152, 9, 13, 239, 151, 9, 13, 239, 150, 9, 13, 239, 149, 9, - 13, 239, 148, 9, 13, 239, 147, 9, 13, 239, 146, 9, 13, 239, 145, 9, 13, - 239, 144, 9, 13, 239, 143, 9, 13, 239, 142, 9, 13, 239, 141, 9, 13, 239, - 140, 9, 13, 239, 139, 9, 13, 239, 138, 9, 13, 239, 137, 9, 13, 239, 136, - 9, 13, 239, 135, 9, 13, 239, 134, 9, 13, 239, 133, 9, 13, 239, 132, 9, - 13, 239, 131, 9, 13, 239, 130, 9, 13, 239, 129, 9, 13, 239, 128, 9, 13, - 239, 127, 9, 13, 239, 126, 9, 13, 239, 125, 9, 13, 239, 124, 9, 13, 239, - 123, 9, 13, 239, 122, 9, 13, 239, 121, 9, 13, 239, 120, 9, 13, 239, 119, - 9, 13, 239, 118, 9, 13, 239, 117, 9, 13, 239, 116, 9, 13, 239, 115, 9, - 13, 239, 114, 9, 13, 239, 113, 9, 13, 239, 112, 9, 13, 239, 111, 9, 13, - 239, 110, 9, 13, 239, 109, 9, 13, 239, 108, 9, 13, 239, 107, 9, 13, 239, - 106, 9, 13, 239, 105, 9, 13, 239, 104, 9, 13, 239, 103, 9, 13, 239, 102, - 9, 13, 239, 101, 9, 13, 239, 100, 9, 13, 239, 99, 9, 13, 239, 98, 9, 13, - 239, 97, 9, 13, 239, 96, 9, 13, 239, 95, 9, 13, 239, 94, 9, 13, 239, 93, - 9, 13, 239, 92, 9, 13, 239, 91, 9, 13, 239, 90, 9, 13, 239, 89, 9, 13, - 239, 88, 9, 13, 239, 87, 9, 13, 239, 86, 9, 13, 239, 85, 9, 13, 239, 84, - 9, 13, 239, 83, 9, 13, 239, 82, 9, 13, 239, 81, 9, 13, 239, 80, 9, 13, - 239, 79, 9, 13, 239, 78, 9, 13, 239, 77, 9, 13, 239, 76, 9, 13, 239, 75, - 9, 13, 239, 74, 9, 13, 239, 73, 9, 13, 239, 72, 9, 13, 239, 71, 9, 13, - 239, 70, 9, 13, 239, 69, 9, 13, 239, 68, 9, 13, 239, 67, 9, 13, 239, 66, - 9, 13, 239, 65, 9, 13, 239, 64, 9, 13, 239, 63, 9, 13, 239, 62, 9, 13, - 239, 61, 9, 13, 239, 60, 9, 13, 239, 59, 9, 13, 239, 58, 9, 13, 239, 57, - 9, 13, 239, 56, 9, 13, 239, 55, 9, 13, 239, 54, 9, 13, 239, 53, 9, 13, - 239, 52, 9, 13, 239, 51, 9, 13, 239, 50, 9, 13, 239, 49, 9, 13, 239, 48, - 9, 13, 239, 47, 9, 13, 239, 46, 9, 13, 239, 45, 9, 13, 239, 44, 9, 13, - 239, 43, 9, 13, 239, 42, 9, 13, 239, 41, 9, 13, 239, 40, 9, 13, 239, 39, - 9, 13, 239, 38, 9, 13, 239, 37, 9, 13, 239, 36, 9, 13, 239, 35, 9, 13, - 239, 34, 9, 13, 239, 33, 9, 13, 239, 32, 9, 13, 239, 31, 9, 13, 239, 30, - 9, 13, 239, 29, 9, 13, 239, 28, 9, 13, 239, 27, 9, 13, 239, 26, 9, 13, - 239, 25, 9, 13, 239, 24, 9, 13, 239, 23, 9, 13, 239, 22, 9, 13, 239, 21, - 9, 13, 239, 20, 9, 13, 239, 19, 9, 13, 239, 18, 9, 13, 239, 17, 9, 13, - 239, 16, 9, 13, 239, 15, 9, 13, 239, 14, 9, 13, 239, 13, 9, 13, 239, 12, - 9, 13, 239, 11, 9, 13, 239, 10, 9, 13, 239, 9, 9, 13, 239, 8, 9, 13, 239, - 7, 9, 13, 239, 6, 9, 13, 239, 5, 9, 13, 239, 4, 9, 13, 239, 3, 9, 13, - 239, 2, 9, 13, 239, 1, 9, 13, 239, 0, 9, 13, 238, 255, 9, 13, 238, 254, - 9, 13, 238, 253, 9, 13, 238, 252, 9, 13, 238, 251, 9, 13, 238, 250, 9, - 13, 238, 249, 9, 13, 238, 248, 9, 13, 238, 247, 9, 13, 238, 246, 9, 13, - 238, 245, 9, 13, 238, 244, 9, 13, 238, 243, 9, 13, 238, 242, 9, 13, 238, - 241, 9, 13, 238, 240, 9, 13, 238, 239, 9, 13, 238, 238, 9, 13, 238, 237, - 9, 13, 238, 236, 9, 13, 238, 235, 9, 13, 238, 234, 9, 13, 238, 233, 9, - 13, 238, 232, 9, 13, 238, 231, 9, 13, 238, 230, 9, 13, 238, 229, 9, 13, - 238, 228, 9, 13, 238, 227, 9, 13, 238, 226, 9, 13, 238, 225, 9, 13, 238, - 224, 9, 13, 238, 223, 9, 13, 238, 222, 9, 13, 238, 221, 9, 13, 238, 220, - 9, 13, 238, 219, 9, 13, 238, 218, 9, 13, 238, 217, 9, 13, 238, 216, 9, - 13, 238, 215, 9, 13, 238, 214, 9, 13, 238, 213, 9, 13, 238, 212, 9, 13, - 238, 211, 9, 13, 238, 210, 9, 13, 238, 209, 9, 13, 238, 208, 9, 13, 238, - 207, 9, 13, 238, 206, 9, 13, 238, 205, 9, 13, 238, 204, 9, 13, 238, 203, - 9, 13, 238, 202, 9, 13, 238, 201, 9, 13, 238, 200, 9, 13, 238, 199, 9, - 13, 238, 198, 9, 13, 238, 197, 9, 13, 238, 196, 9, 13, 238, 195, 9, 13, - 238, 194, 9, 13, 238, 193, 9, 13, 238, 192, 9, 13, 238, 191, 9, 13, 238, - 190, 9, 13, 238, 189, 9, 13, 238, 188, 9, 13, 238, 187, 9, 13, 238, 186, - 9, 13, 238, 185, 9, 13, 238, 184, 9, 13, 238, 183, 9, 13, 238, 182, 9, - 13, 238, 181, 9, 13, 238, 180, 9, 13, 238, 179, 9, 13, 238, 178, 9, 13, - 238, 177, 9, 13, 238, 176, 9, 13, 238, 175, 9, 13, 238, 174, 9, 13, 238, - 173, 9, 13, 238, 172, 9, 13, 238, 171, 9, 13, 238, 170, 9, 13, 238, 169, - 9, 13, 238, 168, 9, 13, 238, 167, 9, 13, 238, 166, 9, 13, 238, 165, 9, - 13, 238, 164, 9, 13, 238, 163, 9, 13, 238, 162, 9, 13, 238, 161, 9, 13, - 238, 160, 9, 13, 238, 159, 9, 13, 238, 158, 9, 13, 238, 157, 9, 13, 238, - 156, 9, 13, 238, 155, 9, 13, 238, 154, 9, 13, 238, 153, 9, 13, 238, 152, - 9, 13, 238, 151, 9, 13, 238, 150, 9, 13, 238, 149, 9, 13, 238, 148, 9, - 13, 238, 147, 9, 13, 238, 146, 9, 13, 238, 145, 9, 13, 238, 144, 9, 13, - 238, 143, 9, 13, 238, 142, 9, 13, 238, 141, 9, 13, 238, 140, 9, 13, 238, - 139, 9, 13, 238, 138, 9, 13, 238, 137, 9, 13, 238, 136, 9, 13, 238, 135, - 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, 13, 238, 131, 9, - 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, 238, 127, 9, 13, - 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, 123, 9, 13, 238, - 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, 9, 13, 238, 118, - 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, 13, 238, 114, 9, - 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, 238, 110, 9, 13, - 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, 106, 9, 13, 238, - 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, 9, 13, 238, 101, - 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, 238, 97, 9, 13, - 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, 9, 13, 238, 92, - 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, 238, 88, 9, 13, - 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, 9, 13, 238, 83, - 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, 238, 79, 9, 13, - 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, 9, 13, 238, 74, - 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, 238, 70, 9, 13, - 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, 233, 114, 218, - 33, 126, 219, 206, 126, 244, 254, 77, 126, 224, 143, 77, 126, 50, 52, - 126, 247, 86, 52, 126, 226, 57, 52, 126, 254, 35, 126, 253, 226, 126, 42, - 226, 131, 126, 46, 226, 131, 126, 253, 132, 126, 94, 52, 126, 249, 157, - 126, 240, 159, 126, 243, 200, 219, 69, 126, 219, 231, 126, 21, 212, 79, - 126, 21, 116, 126, 21, 109, 126, 21, 166, 126, 21, 163, 126, 21, 180, - 126, 21, 189, 126, 21, 198, 126, 21, 195, 126, 21, 200, 126, 249, 164, - 126, 221, 70, 126, 233, 39, 52, 126, 245, 61, 52, 126, 242, 107, 52, 126, - 224, 158, 77, 126, 249, 156, 253, 122, 126, 7, 6, 1, 61, 126, 7, 6, 1, - 253, 74, 126, 7, 6, 1, 250, 252, 126, 7, 6, 1, 249, 3, 126, 7, 6, 1, 74, - 126, 7, 6, 1, 244, 230, 126, 7, 6, 1, 243, 177, 126, 7, 6, 1, 242, 41, - 126, 7, 6, 1, 72, 126, 7, 6, 1, 235, 142, 126, 7, 6, 1, 235, 27, 126, 7, - 6, 1, 150, 126, 7, 6, 1, 183, 126, 7, 6, 1, 204, 126, 7, 6, 1, 75, 126, - 7, 6, 1, 226, 229, 126, 7, 6, 1, 224, 240, 126, 7, 6, 1, 149, 126, 7, 6, - 1, 197, 126, 7, 6, 1, 218, 99, 126, 7, 6, 1, 69, 126, 7, 6, 1, 215, 79, - 126, 7, 6, 1, 214, 82, 126, 7, 6, 1, 213, 166, 126, 7, 6, 1, 213, 105, - 126, 7, 6, 1, 212, 152, 126, 42, 41, 125, 126, 223, 203, 219, 231, 126, - 46, 41, 125, 126, 249, 224, 254, 174, 126, 115, 232, 242, 126, 242, 114, - 254, 174, 126, 7, 3, 1, 61, 126, 7, 3, 1, 253, 74, 126, 7, 3, 1, 250, - 252, 126, 7, 3, 1, 249, 3, 126, 7, 3, 1, 74, 126, 7, 3, 1, 244, 230, 126, - 7, 3, 1, 243, 177, 126, 7, 3, 1, 242, 41, 126, 7, 3, 1, 72, 126, 7, 3, 1, - 235, 142, 126, 7, 3, 1, 235, 27, 126, 7, 3, 1, 150, 126, 7, 3, 1, 183, - 126, 7, 3, 1, 204, 126, 7, 3, 1, 75, 126, 7, 3, 1, 226, 229, 126, 7, 3, - 1, 224, 240, 126, 7, 3, 1, 149, 126, 7, 3, 1, 197, 126, 7, 3, 1, 218, 99, - 126, 7, 3, 1, 69, 126, 7, 3, 1, 215, 79, 126, 7, 3, 1, 214, 82, 126, 7, - 3, 1, 213, 166, 126, 7, 3, 1, 213, 105, 126, 7, 3, 1, 212, 152, 126, 42, - 249, 40, 125, 126, 71, 232, 242, 126, 46, 249, 40, 125, 126, 217, 42, - 250, 194, 218, 33, 43, 221, 254, 43, 221, 243, 43, 221, 232, 43, 221, - 220, 43, 221, 209, 43, 221, 198, 43, 221, 187, 43, 221, 176, 43, 221, - 165, 43, 221, 157, 43, 221, 156, 43, 221, 155, 43, 221, 154, 43, 221, - 152, 43, 221, 151, 43, 221, 150, 43, 221, 149, 43, 221, 148, 43, 221, - 147, 43, 221, 146, 43, 221, 145, 43, 221, 144, 43, 221, 143, 43, 221, - 141, 43, 221, 140, 43, 221, 139, 43, 221, 138, 43, 221, 137, 43, 221, - 136, 43, 221, 135, 43, 221, 134, 43, 221, 133, 43, 221, 132, 43, 221, - 130, 43, 221, 129, 43, 221, 128, 43, 221, 127, 43, 221, 126, 43, 221, - 125, 43, 221, 124, 43, 221, 123, 43, 221, 122, 43, 221, 121, 43, 221, - 119, 43, 221, 118, 43, 221, 117, 43, 221, 116, 43, 221, 115, 43, 221, - 114, 43, 221, 113, 43, 221, 112, 43, 221, 111, 43, 221, 110, 43, 221, - 108, 43, 221, 107, 43, 221, 106, 43, 221, 105, 43, 221, 104, 43, 221, - 103, 43, 221, 102, 43, 221, 101, 43, 221, 100, 43, 221, 99, 43, 221, 97, - 43, 221, 96, 43, 221, 95, 43, 221, 94, 43, 221, 93, 43, 221, 92, 43, 221, - 91, 43, 221, 90, 43, 221, 89, 43, 221, 88, 43, 221, 86, 43, 221, 85, 43, - 221, 84, 43, 221, 83, 43, 221, 82, 43, 221, 81, 43, 221, 80, 43, 221, 79, - 43, 221, 78, 43, 221, 77, 43, 222, 74, 43, 222, 73, 43, 222, 72, 43, 222, - 71, 43, 222, 70, 43, 222, 69, 43, 222, 68, 43, 222, 67, 43, 222, 66, 43, - 222, 65, 43, 222, 63, 43, 222, 62, 43, 222, 61, 43, 222, 60, 43, 222, 59, - 43, 222, 58, 43, 222, 57, 43, 222, 56, 43, 222, 55, 43, 222, 54, 43, 222, - 52, 43, 222, 51, 43, 222, 50, 43, 222, 49, 43, 222, 48, 43, 222, 47, 43, - 222, 46, 43, 222, 45, 43, 222, 44, 43, 222, 43, 43, 222, 41, 43, 222, 40, - 43, 222, 39, 43, 222, 38, 43, 222, 37, 43, 222, 36, 43, 222, 35, 43, 222, - 34, 43, 222, 33, 43, 222, 32, 43, 222, 30, 43, 222, 29, 43, 222, 28, 43, - 222, 27, 43, 222, 26, 43, 222, 25, 43, 222, 24, 43, 222, 23, 43, 222, 22, - 43, 222, 21, 43, 222, 19, 43, 222, 18, 43, 222, 17, 43, 222, 16, 43, 222, - 15, 43, 222, 14, 43, 222, 13, 43, 222, 12, 43, 222, 11, 43, 222, 10, 43, - 222, 8, 43, 222, 7, 43, 222, 6, 43, 222, 5, 43, 222, 4, 43, 222, 3, 43, - 222, 2, 43, 222, 1, 43, 222, 0, 43, 221, 255, 43, 221, 253, 43, 221, 252, - 43, 221, 251, 43, 221, 250, 43, 221, 249, 43, 221, 248, 43, 221, 247, 43, - 221, 246, 43, 221, 245, 43, 221, 244, 43, 221, 242, 43, 221, 241, 43, - 221, 240, 43, 221, 239, 43, 221, 238, 43, 221, 237, 43, 221, 236, 43, - 221, 235, 43, 221, 234, 43, 221, 233, 43, 221, 231, 43, 221, 230, 43, - 221, 229, 43, 221, 228, 43, 221, 227, 43, 221, 226, 43, 221, 225, 43, - 221, 224, 43, 221, 223, 43, 221, 222, 43, 221, 219, 43, 221, 218, 43, - 221, 217, 43, 221, 216, 43, 221, 215, 43, 221, 214, 43, 221, 213, 43, - 221, 212, 43, 221, 211, 43, 221, 210, 43, 221, 208, 43, 221, 207, 43, - 221, 206, 43, 221, 205, 43, 221, 204, 43, 221, 203, 43, 221, 202, 43, - 221, 201, 43, 221, 200, 43, 221, 199, 43, 221, 197, 43, 221, 196, 43, - 221, 195, 43, 221, 194, 43, 221, 193, 43, 221, 192, 43, 221, 191, 43, - 221, 190, 43, 221, 189, 43, 221, 188, 43, 221, 186, 43, 221, 185, 43, - 221, 184, 43, 221, 183, 43, 221, 182, 43, 221, 181, 43, 221, 180, 43, - 221, 179, 43, 221, 178, 43, 221, 177, 43, 221, 175, 43, 221, 174, 43, - 221, 173, 43, 221, 172, 43, 221, 171, 43, 221, 170, 43, 221, 169, 43, - 221, 168, 43, 221, 167, 43, 221, 166, 43, 221, 164, 43, 221, 163, 43, - 221, 162, 43, 221, 161, 43, 221, 160, 43, 221, 159, 43, 221, 158, + 10, 11, 227, 160, 10, 11, 227, 159, 10, 11, 227, 10, 10, 11, 227, 9, 10, + 11, 227, 8, 10, 11, 227, 7, 10, 11, 227, 6, 10, 11, 227, 5, 10, 11, 227, + 4, 10, 11, 227, 3, 10, 11, 227, 2, 10, 11, 227, 1, 10, 11, 227, 0, 10, + 11, 226, 255, 10, 11, 226, 254, 10, 11, 225, 18, 10, 11, 225, 17, 10, 11, + 225, 16, 10, 11, 225, 15, 10, 11, 225, 14, 10, 11, 225, 13, 10, 11, 225, + 12, 10, 11, 224, 146, 10, 11, 224, 145, 10, 11, 224, 144, 10, 11, 224, + 143, 10, 11, 224, 142, 10, 11, 224, 141, 10, 11, 224, 140, 10, 11, 224, + 139, 10, 11, 224, 138, 10, 11, 224, 137, 10, 11, 224, 136, 10, 11, 224, + 135, 10, 11, 224, 134, 10, 11, 224, 133, 10, 11, 224, 132, 10, 11, 224, + 131, 10, 11, 224, 130, 10, 11, 224, 129, 10, 11, 224, 128, 10, 11, 224, + 127, 10, 11, 224, 126, 10, 11, 224, 125, 10, 11, 224, 124, 10, 11, 224, + 123, 10, 11, 224, 122, 10, 11, 224, 121, 10, 11, 224, 120, 10, 11, 224, + 119, 10, 11, 224, 118, 10, 11, 224, 117, 10, 11, 224, 116, 10, 11, 224, + 115, 10, 11, 224, 114, 10, 11, 224, 113, 10, 11, 223, 26, 10, 11, 223, + 25, 10, 11, 223, 24, 10, 11, 223, 23, 10, 11, 223, 22, 10, 11, 223, 21, + 10, 11, 223, 20, 10, 11, 223, 19, 10, 11, 223, 18, 10, 11, 223, 17, 10, + 11, 223, 16, 10, 11, 223, 15, 10, 11, 223, 14, 10, 11, 223, 13, 10, 11, + 223, 12, 10, 11, 223, 11, 10, 11, 223, 10, 10, 11, 223, 9, 10, 11, 223, + 8, 10, 11, 223, 7, 10, 11, 223, 6, 10, 11, 223, 5, 10, 11, 223, 4, 10, + 11, 223, 3, 10, 11, 223, 2, 10, 11, 223, 1, 10, 11, 223, 0, 10, 11, 222, + 255, 10, 11, 222, 254, 10, 11, 222, 253, 10, 11, 222, 252, 10, 11, 222, + 251, 10, 11, 222, 250, 10, 11, 222, 249, 10, 11, 222, 248, 10, 11, 222, + 247, 10, 11, 222, 246, 10, 11, 222, 245, 10, 11, 222, 244, 10, 11, 222, + 243, 10, 11, 222, 242, 10, 11, 222, 241, 10, 11, 222, 240, 10, 11, 222, + 239, 10, 11, 222, 238, 10, 11, 222, 237, 10, 11, 222, 236, 10, 11, 222, + 235, 10, 11, 222, 234, 10, 11, 222, 233, 10, 11, 222, 232, 10, 11, 222, + 231, 10, 11, 222, 230, 10, 11, 222, 229, 10, 11, 218, 111, 10, 11, 218, + 110, 10, 11, 218, 109, 10, 11, 218, 108, 10, 11, 218, 107, 10, 11, 218, + 106, 10, 11, 218, 105, 10, 11, 218, 104, 10, 11, 218, 103, 10, 11, 218, + 102, 10, 11, 218, 101, 10, 11, 218, 100, 10, 11, 218, 99, 10, 11, 218, + 98, 10, 11, 218, 97, 10, 11, 218, 96, 10, 11, 218, 95, 10, 11, 218, 94, + 10, 11, 218, 93, 10, 11, 218, 92, 10, 11, 218, 91, 10, 11, 218, 90, 10, + 11, 218, 89, 10, 11, 218, 88, 10, 11, 218, 87, 10, 11, 218, 86, 10, 11, + 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10, 11, 218, 82, 10, 11, 218, + 81, 10, 11, 218, 80, 10, 11, 218, 79, 10, 11, 218, 78, 10, 11, 218, 77, + 10, 11, 218, 76, 10, 11, 218, 75, 10, 11, 218, 74, 10, 11, 218, 73, 10, + 11, 218, 72, 10, 11, 218, 71, 10, 11, 218, 70, 10, 11, 218, 69, 10, 11, + 218, 68, 10, 11, 215, 251, 10, 11, 215, 250, 10, 11, 215, 249, 10, 11, + 215, 248, 10, 11, 215, 247, 10, 11, 215, 246, 10, 11, 215, 245, 10, 11, + 215, 244, 10, 11, 215, 243, 10, 11, 215, 242, 10, 11, 215, 241, 10, 11, + 215, 240, 10, 11, 215, 239, 10, 11, 215, 238, 10, 11, 215, 237, 10, 11, + 215, 236, 10, 11, 215, 235, 10, 11, 215, 234, 10, 11, 215, 233, 10, 11, + 215, 232, 10, 11, 215, 231, 10, 11, 215, 230, 10, 11, 215, 229, 10, 11, + 215, 228, 10, 11, 215, 227, 10, 11, 215, 226, 10, 11, 215, 225, 10, 11, + 215, 224, 10, 11, 215, 223, 10, 11, 215, 222, 10, 11, 215, 221, 10, 11, + 215, 220, 10, 11, 215, 219, 10, 11, 215, 218, 10, 11, 215, 217, 10, 11, + 215, 216, 10, 11, 215, 215, 10, 11, 215, 214, 10, 11, 215, 213, 10, 11, + 215, 212, 10, 11, 215, 211, 10, 11, 215, 210, 10, 11, 215, 209, 10, 11, + 215, 208, 10, 11, 215, 207, 10, 11, 215, 206, 10, 11, 215, 205, 10, 11, + 215, 85, 10, 11, 215, 84, 10, 11, 215, 83, 10, 11, 215, 82, 10, 11, 215, + 81, 10, 11, 215, 80, 10, 11, 215, 79, 10, 11, 215, 78, 10, 11, 215, 77, + 10, 11, 215, 76, 10, 11, 215, 75, 10, 11, 215, 74, 10, 11, 215, 73, 10, + 11, 215, 72, 10, 11, 215, 71, 10, 11, 215, 70, 10, 11, 215, 69, 10, 11, + 215, 68, 10, 11, 215, 67, 10, 11, 215, 66, 10, 11, 215, 65, 10, 11, 215, + 64, 10, 11, 215, 63, 10, 11, 215, 62, 10, 11, 215, 61, 10, 11, 215, 60, + 10, 11, 215, 59, 10, 11, 215, 58, 10, 11, 215, 57, 10, 11, 215, 56, 10, + 11, 215, 55, 10, 11, 215, 54, 10, 11, 215, 53, 10, 11, 215, 52, 10, 11, + 215, 51, 10, 11, 215, 50, 10, 11, 215, 49, 10, 11, 215, 48, 10, 11, 215, + 47, 10, 11, 215, 46, 10, 11, 215, 45, 10, 11, 215, 44, 10, 11, 215, 43, + 10, 11, 215, 42, 10, 11, 215, 41, 10, 11, 215, 40, 10, 11, 215, 39, 10, + 11, 215, 38, 10, 11, 215, 37, 10, 11, 215, 36, 10, 11, 215, 35, 10, 11, + 215, 34, 10, 11, 215, 33, 10, 11, 215, 32, 10, 11, 215, 31, 10, 11, 215, + 30, 10, 11, 215, 29, 10, 11, 215, 28, 10, 11, 215, 27, 10, 11, 215, 26, + 10, 11, 215, 25, 10, 11, 215, 24, 10, 11, 215, 23, 10, 11, 215, 22, 10, + 11, 215, 21, 10, 11, 215, 20, 10, 11, 215, 19, 10, 11, 215, 18, 10, 11, + 215, 17, 10, 11, 215, 16, 10, 11, 215, 15, 10, 11, 215, 14, 10, 11, 215, + 13, 10, 11, 215, 12, 10, 11, 215, 11, 10, 11, 215, 10, 10, 11, 215, 9, + 10, 11, 214, 84, 10, 11, 214, 83, 10, 11, 214, 82, 10, 11, 214, 81, 10, + 11, 214, 80, 10, 11, 214, 79, 10, 11, 214, 78, 10, 11, 214, 77, 10, 11, + 214, 76, 10, 11, 214, 75, 10, 11, 214, 74, 10, 11, 214, 73, 10, 11, 214, + 72, 10, 11, 214, 71, 10, 11, 214, 70, 10, 11, 214, 69, 10, 11, 214, 68, + 10, 11, 214, 67, 10, 11, 214, 66, 10, 11, 214, 65, 10, 11, 214, 64, 10, + 11, 214, 63, 10, 11, 214, 62, 10, 11, 214, 61, 10, 11, 214, 60, 10, 11, + 214, 59, 10, 11, 214, 58, 10, 11, 214, 57, 10, 11, 214, 56, 10, 11, 214, + 55, 10, 11, 214, 54, 10, 11, 214, 53, 10, 11, 213, 168, 10, 11, 213, 167, + 10, 11, 213, 166, 10, 11, 213, 165, 10, 11, 213, 164, 10, 11, 213, 163, + 10, 11, 213, 162, 10, 11, 213, 161, 10, 11, 213, 160, 10, 11, 213, 159, + 10, 11, 213, 158, 10, 11, 213, 157, 10, 11, 213, 106, 10, 11, 213, 105, + 10, 11, 213, 104, 10, 11, 213, 103, 10, 11, 213, 102, 10, 11, 213, 101, + 10, 11, 213, 100, 10, 11, 213, 99, 10, 11, 213, 98, 10, 11, 212, 151, 10, + 11, 212, 150, 10, 11, 212, 149, 10, 11, 212, 148, 10, 11, 212, 147, 10, + 11, 212, 146, 10, 11, 212, 145, 10, 11, 212, 144, 10, 11, 212, 143, 10, + 11, 212, 142, 10, 11, 212, 141, 10, 11, 212, 140, 10, 11, 212, 139, 10, + 11, 212, 138, 10, 11, 212, 137, 10, 11, 212, 136, 10, 11, 212, 135, 10, + 11, 212, 134, 10, 11, 212, 133, 10, 11, 212, 132, 10, 11, 212, 131, 10, + 11, 212, 130, 10, 11, 212, 129, 10, 11, 212, 128, 10, 11, 212, 127, 10, + 11, 212, 126, 10, 11, 212, 125, 10, 11, 212, 124, 10, 11, 212, 123, 10, + 11, 212, 122, 10, 11, 212, 121, 10, 11, 212, 120, 10, 11, 212, 119, 10, + 11, 212, 118, 10, 11, 212, 117, 10, 11, 212, 116, 10, 11, 212, 115, 10, + 11, 212, 114, 10, 11, 212, 113, 10, 11, 212, 112, 10, 11, 212, 111, 10, + 11, 255, 103, 10, 11, 255, 102, 10, 11, 255, 101, 10, 11, 255, 100, 10, + 11, 255, 99, 10, 11, 255, 98, 10, 11, 255, 97, 10, 11, 255, 96, 10, 11, + 255, 95, 10, 11, 255, 94, 10, 11, 255, 93, 10, 11, 255, 92, 10, 11, 255, + 91, 10, 11, 255, 90, 10, 11, 255, 89, 10, 11, 255, 88, 10, 11, 255, 87, + 10, 11, 255, 86, 10, 11, 255, 85, 10, 11, 255, 84, 10, 11, 255, 83, 10, + 11, 255, 82, 10, 11, 255, 81, 10, 11, 255, 80, 10, 11, 255, 79, 10, 11, + 255, 78, 10, 11, 255, 77, 10, 11, 255, 76, 10, 11, 255, 75, 10, 11, 255, + 74, 10, 11, 255, 73, 10, 11, 255, 72, 10, 11, 255, 71, 10, 11, 255, 70, + 20, 1, 159, 229, 163, 231, 153, 20, 1, 159, 243, 166, 244, 125, 20, 1, + 159, 225, 167, 231, 154, 225, 225, 20, 1, 159, 225, 167, 231, 154, 225, + 226, 20, 1, 159, 230, 113, 231, 153, 20, 1, 159, 220, 166, 20, 1, 159, + 217, 33, 231, 153, 20, 1, 159, 228, 19, 231, 153, 20, 1, 159, 220, 220, + 226, 252, 229, 64, 20, 1, 159, 225, 167, 226, 252, 229, 65, 225, 225, 20, + 1, 159, 225, 167, 226, 252, 229, 65, 225, 226, 20, 1, 159, 232, 96, 20, + 1, 159, 216, 91, 232, 97, 20, 1, 159, 229, 221, 20, 1, 159, 232, 93, 20, + 1, 159, 232, 54, 20, 1, 159, 230, 188, 20, 1, 159, 221, 68, 20, 1, 159, + 228, 139, 20, 1, 159, 235, 11, 20, 1, 159, 229, 33, 20, 1, 159, 218, 219, + 20, 1, 159, 229, 162, 20, 1, 159, 233, 209, 20, 1, 159, 233, 134, 234, + 53, 20, 1, 159, 228, 146, 231, 161, 20, 1, 159, 232, 100, 20, 1, 159, + 226, 156, 20, 1, 159, 243, 71, 20, 1, 159, 226, 214, 20, 1, 159, 231, 35, + 229, 195, 20, 1, 159, 228, 0, 231, 164, 20, 1, 159, 103, 212, 180, 230, + 107, 20, 1, 159, 243, 72, 20, 1, 159, 228, 146, 228, 147, 20, 1, 159, + 220, 75, 20, 1, 159, 231, 146, 20, 1, 159, 231, 167, 20, 1, 159, 231, 14, + 20, 1, 159, 235, 111, 20, 1, 159, 226, 252, 233, 169, 20, 1, 159, 230, + 40, 233, 169, 20, 1, 159, 226, 70, 20, 1, 159, 232, 94, 20, 1, 159, 229, + 102, 20, 1, 159, 225, 56, 20, 1, 159, 216, 88, 20, 1, 159, 232, 226, 20, + 1, 159, 219, 246, 20, 1, 159, 217, 182, 20, 1, 159, 232, 91, 20, 1, 159, + 235, 18, 20, 1, 159, 230, 36, 20, 1, 159, 234, 65, 20, 1, 159, 231, 15, + 20, 1, 159, 220, 163, 20, 1, 159, 233, 9, 20, 1, 159, 244, 182, 20, 1, + 159, 223, 135, 20, 1, 159, 234, 105, 20, 1, 159, 219, 242, 20, 1, 159, + 232, 51, 226, 11, 20, 1, 159, 220, 213, 20, 1, 159, 228, 145, 20, 1, 159, + 220, 198, 228, 156, 212, 188, 20, 1, 159, 228, 39, 231, 32, 20, 1, 159, + 226, 247, 20, 1, 159, 229, 34, 20, 1, 159, 215, 147, 20, 1, 159, 229, + 198, 20, 1, 159, 232, 90, 20, 1, 159, 229, 76, 20, 1, 159, 231, 252, 20, + 1, 159, 228, 51, 20, 1, 159, 217, 186, 20, 1, 159, 219, 240, 20, 1, 159, + 226, 248, 20, 1, 159, 228, 160, 20, 1, 159, 232, 98, 20, 1, 159, 228, 49, + 20, 1, 159, 235, 78, 20, 1, 159, 228, 163, 20, 1, 159, 214, 232, 20, 1, + 159, 232, 230, 20, 1, 159, 229, 247, 20, 1, 159, 230, 84, 20, 1, 159, + 231, 251, 20, 1, 226, 50, 228, 158, 20, 1, 226, 50, 216, 91, 232, 95, 20, + 1, 226, 50, 220, 130, 20, 1, 226, 50, 221, 72, 216, 90, 20, 1, 226, 50, + 233, 11, 228, 142, 20, 1, 226, 50, 232, 2, 232, 99, 20, 1, 226, 50, 234, + 207, 20, 1, 226, 50, 213, 7, 20, 1, 226, 50, 231, 253, 20, 1, 226, 50, + 235, 99, 20, 1, 226, 50, 226, 119, 20, 1, 226, 50, 213, 80, 233, 169, 20, + 1, 226, 50, 233, 225, 228, 156, 228, 60, 20, 1, 226, 50, 228, 140, 220, + 239, 20, 1, 226, 50, 230, 7, 229, 79, 20, 1, 226, 50, 243, 69, 20, 1, + 226, 50, 225, 217, 20, 1, 226, 50, 216, 91, 228, 154, 20, 1, 226, 50, + 220, 244, 229, 74, 20, 1, 226, 50, 220, 240, 20, 1, 226, 50, 231, 154, + 217, 185, 20, 1, 226, 50, 231, 240, 231, 254, 20, 1, 226, 50, 228, 50, + 228, 142, 20, 1, 226, 50, 235, 7, 20, 1, 226, 50, 243, 70, 20, 1, 226, + 50, 235, 3, 20, 1, 226, 50, 233, 249, 20, 1, 226, 50, 226, 158, 20, 1, + 226, 50, 214, 164, 20, 1, 226, 50, 229, 164, 230, 186, 20, 1, 226, 50, + 229, 197, 231, 236, 20, 1, 226, 50, 213, 184, 20, 1, 226, 50, 222, 206, + 20, 1, 226, 50, 218, 59, 20, 1, 226, 50, 231, 166, 20, 1, 226, 50, 229, + 182, 20, 1, 226, 50, 229, 183, 233, 206, 20, 1, 226, 50, 231, 156, 20, 1, + 226, 50, 219, 11, 20, 1, 226, 50, 231, 244, 20, 1, 226, 50, 231, 17, 20, + 1, 226, 50, 228, 62, 20, 1, 226, 50, 225, 60, 20, 1, 226, 50, 231, 165, + 229, 199, 20, 1, 226, 50, 244, 215, 20, 1, 226, 50, 231, 231, 20, 1, 226, + 50, 244, 236, 20, 1, 226, 50, 235, 15, 20, 1, 226, 50, 232, 116, 229, 68, + 20, 1, 226, 50, 232, 116, 229, 44, 20, 1, 226, 50, 233, 133, 20, 1, 226, + 50, 229, 205, 20, 1, 226, 50, 228, 165, 20, 1, 226, 50, 191, 20, 1, 226, + 50, 234, 194, 20, 1, 226, 50, 229, 152, 20, 1, 133, 229, 163, 232, 97, + 20, 1, 133, 228, 18, 20, 1, 133, 212, 188, 20, 1, 133, 214, 40, 20, 1, + 133, 229, 198, 20, 1, 133, 230, 28, 20, 1, 133, 229, 170, 20, 1, 133, + 243, 79, 20, 1, 133, 231, 248, 20, 1, 133, 243, 173, 20, 1, 133, 228, 41, + 231, 53, 231, 168, 20, 1, 133, 228, 138, 231, 239, 20, 1, 133, 231, 245, + 20, 1, 133, 225, 223, 20, 1, 133, 230, 13, 20, 1, 133, 232, 0, 251, 84, + 20, 1, 133, 235, 5, 20, 1, 133, 243, 80, 20, 1, 133, 235, 12, 20, 1, 133, + 212, 205, 230, 216, 20, 1, 133, 228, 12, 20, 1, 133, 231, 233, 20, 1, + 133, 228, 164, 20, 1, 133, 231, 239, 20, 1, 133, 213, 8, 20, 1, 133, 234, + 113, 20, 1, 133, 235, 128, 20, 1, 133, 221, 67, 20, 1, 133, 230, 22, 20, + 1, 133, 218, 57, 20, 1, 133, 229, 48, 20, 1, 133, 217, 33, 212, 190, 20, + 1, 133, 219, 37, 20, 1, 133, 229, 189, 228, 60, 20, 1, 133, 214, 163, 20, + 1, 133, 230, 87, 20, 1, 133, 232, 116, 235, 14, 20, 1, 133, 228, 147, 20, + 1, 133, 229, 184, 20, 1, 133, 233, 210, 20, 1, 133, 231, 241, 20, 1, 133, + 231, 145, 20, 1, 133, 228, 141, 20, 1, 133, 217, 181, 20, 1, 133, 229, + 186, 20, 1, 133, 244, 68, 20, 1, 133, 230, 27, 20, 1, 133, 228, 166, 20, + 1, 133, 228, 162, 20, 1, 133, 251, 161, 20, 1, 133, 214, 165, 20, 1, 133, + 231, 246, 20, 1, 133, 223, 77, 20, 1, 133, 229, 78, 20, 1, 133, 233, 224, + 20, 1, 133, 217, 31, 20, 1, 133, 228, 148, 229, 152, 20, 1, 133, 229, 70, + 20, 1, 133, 235, 18, 20, 1, 133, 229, 190, 20, 1, 133, 232, 90, 20, 1, + 133, 231, 234, 20, 1, 133, 232, 230, 20, 1, 133, 234, 53, 20, 1, 133, + 229, 76, 20, 1, 133, 229, 152, 20, 1, 133, 213, 175, 20, 1, 133, 229, + 187, 20, 1, 133, 228, 151, 20, 1, 133, 228, 143, 20, 1, 133, 234, 67, + 229, 34, 20, 1, 133, 228, 149, 20, 1, 133, 230, 35, 20, 1, 133, 232, 116, + 228, 154, 20, 1, 133, 213, 94, 20, 1, 133, 230, 34, 20, 1, 133, 220, 165, + 20, 1, 133, 221, 70, 20, 1, 133, 231, 242, 20, 1, 133, 232, 97, 20, 1, + 133, 231, 252, 20, 1, 133, 235, 6, 20, 1, 133, 231, 243, 20, 1, 133, 235, + 10, 20, 1, 133, 232, 0, 226, 15, 20, 1, 133, 212, 171, 20, 1, 133, 229, + 66, 20, 1, 133, 231, 103, 20, 1, 133, 230, 240, 20, 1, 133, 220, 216, 20, + 1, 133, 235, 28, 233, 192, 20, 1, 133, 235, 28, 244, 249, 20, 1, 133, + 229, 219, 20, 1, 133, 230, 84, 20, 1, 133, 233, 70, 20, 1, 133, 225, 233, + 20, 1, 133, 226, 110, 20, 1, 133, 217, 196, 20, 1, 105, 231, 232, 20, 1, + 105, 214, 38, 20, 1, 105, 229, 64, 20, 1, 105, 231, 153, 20, 1, 105, 229, + 62, 20, 1, 105, 233, 105, 20, 1, 105, 229, 67, 20, 1, 105, 228, 161, 20, + 1, 105, 229, 204, 20, 1, 105, 228, 60, 20, 1, 105, 213, 185, 20, 1, 105, + 229, 160, 20, 1, 105, 221, 6, 20, 1, 105, 229, 171, 20, 1, 105, 235, 13, + 20, 1, 105, 217, 183, 20, 1, 105, 220, 242, 20, 1, 105, 229, 75, 20, 1, + 105, 219, 11, 20, 1, 105, 235, 18, 20, 1, 105, 213, 82, 20, 1, 105, 234, + 68, 20, 1, 105, 222, 174, 20, 1, 105, 231, 158, 20, 1, 105, 230, 26, 20, + 1, 105, 232, 66, 20, 1, 105, 231, 164, 20, 1, 105, 221, 69, 20, 1, 105, + 213, 31, 20, 1, 105, 229, 69, 20, 1, 105, 235, 9, 231, 235, 20, 1, 105, + 229, 167, 20, 1, 105, 216, 90, 20, 1, 105, 243, 88, 20, 1, 105, 229, 157, + 20, 1, 105, 244, 216, 20, 1, 105, 230, 30, 20, 1, 105, 231, 137, 20, 1, + 105, 233, 129, 20, 1, 105, 230, 12, 20, 1, 105, 231, 31, 20, 1, 105, 231, + 141, 20, 1, 105, 225, 41, 20, 1, 105, 231, 139, 20, 1, 105, 231, 155, 20, + 1, 105, 232, 216, 20, 1, 105, 228, 153, 20, 1, 105, 231, 255, 20, 1, 105, + 234, 44, 20, 1, 105, 228, 51, 20, 1, 105, 217, 186, 20, 1, 105, 219, 240, + 20, 1, 105, 212, 171, 20, 1, 105, 235, 10, 20, 1, 105, 224, 95, 20, 1, + 105, 217, 231, 20, 1, 105, 229, 168, 20, 1, 105, 231, 160, 20, 1, 105, + 228, 152, 20, 1, 105, 235, 8, 20, 1, 105, 225, 227, 20, 1, 105, 226, 64, + 20, 1, 105, 228, 28, 20, 1, 105, 233, 133, 20, 1, 105, 229, 205, 20, 1, + 105, 231, 157, 20, 1, 105, 229, 179, 20, 1, 105, 212, 185, 20, 1, 105, + 226, 186, 20, 1, 105, 212, 184, 20, 1, 105, 230, 35, 20, 1, 105, 228, + 142, 20, 1, 105, 219, 39, 20, 1, 105, 234, 72, 20, 1, 105, 229, 194, 20, + 1, 105, 229, 165, 20, 1, 105, 216, 74, 20, 1, 105, 231, 168, 20, 1, 105, + 234, 62, 20, 1, 105, 228, 150, 20, 1, 105, 217, 184, 20, 1, 105, 232, 92, + 20, 1, 105, 229, 203, 20, 1, 105, 233, 128, 20, 1, 105, 229, 185, 20, 1, + 105, 228, 155, 20, 1, 105, 229, 48, 20, 1, 105, 243, 73, 20, 1, 105, 234, + 81, 20, 1, 105, 224, 12, 227, 112, 20, 1, 105, 218, 49, 20, 1, 105, 216, + 236, 20, 1, 105, 228, 49, 20, 1, 105, 223, 170, 20, 1, 105, 233, 171, 20, + 1, 105, 231, 214, 20, 1, 105, 184, 20, 1, 105, 218, 219, 20, 1, 105, 230, + 242, 20, 1, 105, 220, 228, 20, 1, 105, 220, 238, 20, 1, 105, 234, 19, 20, + 1, 105, 228, 135, 20, 1, 105, 220, 170, 20, 1, 105, 228, 144, 20, 1, 105, + 226, 122, 20, 1, 105, 229, 128, 20, 1, 105, 220, 197, 20, 1, 105, 225, + 55, 20, 1, 105, 230, 186, 20, 1, 105, 232, 248, 20, 1, 105, 224, 12, 230, + 236, 20, 1, 105, 217, 84, 20, 1, 105, 228, 136, 20, 1, 105, 232, 0, 200, + 20, 1, 105, 222, 172, 20, 1, 105, 245, 28, 20, 1, 82, 230, 34, 20, 1, 82, + 216, 242, 20, 1, 82, 231, 245, 20, 1, 82, 233, 210, 20, 1, 82, 214, 113, + 20, 1, 82, 232, 252, 20, 1, 82, 226, 251, 20, 1, 82, 219, 249, 20, 1, 82, + 224, 72, 20, 1, 82, 228, 157, 20, 1, 82, 230, 5, 20, 1, 82, 225, 69, 20, + 1, 82, 218, 26, 20, 1, 82, 229, 173, 20, 1, 82, 234, 109, 20, 1, 82, 213, + 178, 20, 1, 82, 222, 112, 20, 1, 82, 229, 195, 20, 1, 82, 226, 248, 20, + 1, 82, 216, 243, 20, 1, 82, 234, 66, 20, 1, 82, 233, 10, 20, 1, 82, 228, + 160, 20, 1, 82, 229, 149, 20, 1, 82, 232, 98, 20, 1, 82, 229, 166, 20, 1, + 82, 229, 148, 20, 1, 82, 228, 159, 20, 1, 82, 223, 168, 20, 1, 82, 229, + 66, 20, 1, 82, 226, 121, 20, 1, 82, 222, 225, 20, 1, 82, 229, 180, 20, 1, + 82, 231, 147, 20, 1, 82, 243, 67, 20, 1, 82, 229, 169, 20, 1, 82, 229, + 77, 20, 1, 82, 232, 50, 20, 1, 82, 232, 250, 20, 1, 82, 229, 200, 20, 1, + 82, 230, 18, 20, 1, 82, 218, 48, 228, 142, 20, 1, 82, 221, 71, 20, 1, 82, + 225, 65, 20, 1, 82, 230, 38, 219, 254, 20, 1, 82, 229, 188, 228, 60, 20, + 1, 82, 212, 252, 20, 1, 82, 243, 68, 20, 1, 82, 216, 89, 20, 1, 82, 213, + 11, 20, 1, 82, 225, 186, 20, 1, 82, 216, 79, 20, 1, 82, 235, 16, 20, 1, + 82, 219, 38, 20, 1, 82, 217, 185, 20, 1, 82, 214, 166, 20, 1, 82, 213, + 250, 20, 1, 82, 233, 252, 20, 1, 82, 225, 71, 20, 1, 82, 218, 58, 20, 1, + 82, 243, 87, 20, 1, 82, 229, 209, 20, 1, 82, 220, 241, 20, 1, 82, 231, + 142, 20, 1, 82, 231, 249, 20, 1, 82, 228, 16, 20, 1, 82, 229, 31, 20, 1, + 82, 243, 169, 20, 1, 82, 216, 80, 20, 1, 82, 234, 75, 20, 1, 82, 213, 59, + 20, 1, 82, 228, 50, 250, 76, 20, 1, 82, 212, 242, 20, 1, 82, 231, 159, + 20, 1, 82, 230, 23, 20, 1, 82, 226, 12, 20, 1, 82, 212, 189, 20, 1, 82, + 233, 130, 20, 1, 82, 244, 68, 20, 1, 82, 243, 168, 20, 1, 82, 229, 159, + 20, 1, 82, 235, 18, 20, 1, 82, 232, 101, 20, 1, 82, 229, 172, 20, 1, 82, + 243, 74, 20, 1, 82, 245, 29, 20, 1, 82, 228, 137, 20, 1, 82, 226, 65, 20, + 1, 82, 213, 9, 20, 1, 82, 229, 196, 20, 1, 82, 228, 50, 252, 70, 20, 1, + 82, 227, 252, 20, 1, 82, 225, 163, 20, 1, 82, 231, 103, 20, 1, 82, 244, + 66, 20, 1, 82, 230, 107, 20, 1, 82, 230, 240, 20, 1, 82, 243, 73, 20, 1, + 82, 244, 70, 75, 20, 1, 82, 230, 187, 20, 1, 82, 225, 68, 20, 1, 82, 229, + 161, 20, 1, 82, 234, 53, 20, 1, 82, 226, 9, 20, 1, 82, 228, 145, 20, 1, + 82, 213, 10, 20, 1, 82, 229, 181, 20, 1, 82, 226, 252, 226, 98, 20, 1, + 82, 244, 70, 251, 71, 20, 1, 82, 244, 126, 20, 1, 82, 229, 71, 20, 1, 82, + 63, 20, 1, 82, 216, 236, 20, 1, 82, 78, 20, 1, 82, 75, 20, 1, 82, 233, + 208, 20, 1, 82, 226, 252, 225, 193, 20, 1, 82, 218, 63, 20, 1, 82, 218, + 15, 20, 1, 82, 230, 38, 230, 175, 241, 83, 20, 1, 82, 220, 216, 20, 1, + 82, 213, 6, 20, 1, 82, 229, 142, 20, 1, 82, 212, 194, 20, 1, 82, 212, + 219, 218, 199, 20, 1, 82, 212, 219, 249, 209, 20, 1, 82, 212, 179, 20, 1, + 82, 212, 187, 20, 1, 82, 235, 4, 20, 1, 82, 226, 63, 20, 1, 82, 229, 72, + 245, 186, 20, 1, 82, 225, 66, 20, 1, 82, 213, 183, 20, 1, 82, 244, 236, + 20, 1, 82, 214, 232, 20, 1, 82, 232, 230, 20, 1, 82, 231, 112, 20, 1, 82, + 223, 238, 20, 1, 82, 224, 96, 20, 1, 82, 229, 141, 20, 1, 82, 229, 226, + 20, 1, 82, 220, 208, 20, 1, 82, 220, 197, 20, 1, 82, 244, 70, 224, 14, + 20, 1, 82, 207, 20, 1, 82, 226, 20, 20, 1, 82, 232, 248, 20, 1, 82, 234, + 148, 20, 1, 82, 231, 192, 20, 1, 82, 191, 20, 1, 82, 232, 47, 20, 1, 82, + 217, 187, 20, 1, 82, 234, 212, 20, 1, 82, 231, 34, 20, 1, 82, 217, 213, + 20, 1, 82, 245, 2, 20, 1, 82, 243, 63, 20, 1, 226, 49, 183, 20, 1, 226, + 49, 72, 20, 1, 226, 49, 234, 81, 20, 1, 226, 49, 246, 30, 20, 1, 226, 49, + 224, 35, 20, 1, 226, 49, 218, 49, 20, 1, 226, 49, 228, 49, 20, 1, 226, + 49, 233, 255, 20, 1, 226, 49, 223, 170, 20, 1, 226, 49, 223, 216, 20, 1, + 226, 49, 231, 214, 20, 1, 226, 49, 218, 63, 20, 1, 226, 49, 230, 37, 20, + 1, 226, 49, 229, 78, 20, 1, 226, 49, 184, 20, 1, 226, 49, 218, 219, 20, + 1, 226, 49, 220, 228, 20, 1, 226, 49, 220, 136, 20, 1, 226, 49, 221, 67, + 20, 1, 226, 49, 234, 19, 20, 1, 226, 49, 235, 18, 20, 1, 226, 49, 228, + 107, 20, 1, 226, 49, 228, 135, 20, 1, 226, 49, 229, 49, 20, 1, 226, 49, + 212, 218, 20, 1, 226, 49, 220, 170, 20, 1, 226, 49, 189, 20, 1, 226, 49, + 228, 163, 20, 1, 226, 49, 226, 63, 20, 1, 226, 49, 228, 144, 20, 1, 226, + 49, 213, 183, 20, 1, 226, 49, 226, 122, 20, 1, 226, 49, 223, 77, 20, 1, + 226, 49, 229, 128, 20, 1, 226, 49, 223, 238, 20, 1, 226, 49, 235, 27, 20, + 1, 226, 49, 229, 158, 20, 1, 226, 49, 229, 206, 20, 1, 226, 49, 220, 208, + 20, 1, 226, 49, 225, 69, 20, 1, 226, 49, 244, 126, 20, 1, 226, 49, 214, + 52, 20, 1, 226, 49, 233, 111, 20, 1, 226, 49, 232, 248, 20, 1, 226, 49, + 234, 148, 20, 1, 226, 49, 231, 247, 20, 1, 226, 49, 224, 11, 20, 1, 226, + 49, 191, 20, 1, 226, 49, 231, 45, 20, 1, 226, 49, 231, 255, 20, 1, 226, + 49, 217, 196, 20, 1, 226, 49, 234, 115, 20, 1, 226, 49, 222, 190, 20, 1, + 226, 49, 214, 102, 56, 1, 254, 64, 77, 136, 1, 254, 64, 213, 39, 48, 27, + 16, 225, 75, 48, 27, 16, 248, 225, 48, 27, 16, 226, 86, 48, 27, 16, 227, + 19, 246, 0, 48, 27, 16, 227, 19, 248, 18, 48, 27, 16, 214, 254, 246, 0, + 48, 27, 16, 214, 254, 248, 18, 48, 27, 16, 235, 59, 48, 27, 16, 218, 129, + 48, 27, 16, 226, 174, 48, 27, 16, 212, 209, 48, 27, 16, 212, 210, 248, + 18, 48, 27, 16, 234, 98, 48, 27, 16, 254, 107, 246, 0, 48, 27, 16, 245, + 114, 246, 0, 48, 27, 16, 217, 224, 48, 27, 16, 235, 23, 48, 27, 16, 254, + 98, 48, 27, 16, 254, 99, 248, 18, 48, 27, 16, 218, 135, 48, 27, 16, 217, + 125, 48, 27, 16, 227, 109, 254, 62, 48, 27, 16, 242, 255, 254, 62, 48, + 27, 16, 225, 74, 48, 27, 16, 250, 208, 48, 27, 16, 214, 244, 48, 27, 16, + 236, 23, 254, 62, 48, 27, 16, 235, 25, 254, 62, 48, 27, 16, 235, 24, 254, + 62, 48, 27, 16, 222, 154, 48, 27, 16, 226, 165, 48, 27, 16, 219, 100, + 254, 101, 48, 27, 16, 227, 18, 254, 62, 48, 27, 16, 214, 253, 254, 62, + 48, 27, 16, 254, 102, 254, 62, 48, 27, 16, 254, 96, 48, 27, 16, 234, 157, + 48, 27, 16, 223, 233, 48, 27, 16, 226, 18, 254, 62, 48, 27, 16, 217, 50, + 48, 27, 16, 254, 157, 48, 27, 16, 222, 101, 48, 27, 16, 218, 138, 254, + 62, 48, 27, 16, 218, 138, 231, 177, 219, 98, 48, 27, 16, 227, 13, 254, + 62, 48, 27, 16, 217, 156, 48, 27, 16, 233, 149, 48, 27, 16, 246, 117, 48, + 27, 16, 216, 198, 48, 27, 16, 217, 198, 48, 27, 16, 234, 101, 48, 27, 16, + 254, 107, 245, 114, 229, 244, 48, 27, 16, 244, 71, 254, 62, 48, 27, 16, + 236, 124, 48, 27, 16, 216, 170, 254, 62, 48, 27, 16, 235, 62, 216, 169, + 48, 27, 16, 226, 111, 48, 27, 16, 225, 79, 48, 27, 16, 234, 131, 48, 27, + 16, 250, 140, 254, 62, 48, 27, 16, 224, 73, 48, 27, 16, 226, 177, 254, + 62, 48, 27, 16, 226, 175, 254, 62, 48, 27, 16, 240, 219, 48, 27, 16, 230, + 91, 48, 27, 16, 226, 68, 48, 27, 16, 234, 132, 254, 185, 48, 27, 16, 216, + 170, 254, 185, 48, 27, 16, 219, 77, 48, 27, 16, 242, 222, 48, 27, 16, + 236, 23, 229, 244, 48, 27, 16, 227, 109, 229, 244, 48, 27, 16, 227, 19, + 229, 244, 48, 27, 16, 226, 67, 48, 27, 16, 234, 118, 48, 27, 16, 226, 66, + 48, 27, 16, 234, 100, 48, 27, 16, 226, 112, 229, 244, 48, 27, 16, 235, + 24, 229, 245, 254, 134, 48, 27, 16, 235, 25, 229, 245, 254, 134, 48, 27, + 16, 212, 207, 48, 27, 16, 254, 99, 229, 244, 48, 27, 16, 254, 100, 218, + 136, 229, 244, 48, 27, 16, 212, 208, 48, 27, 16, 234, 99, 48, 27, 16, + 245, 251, 48, 27, 16, 250, 209, 48, 27, 16, 231, 81, 236, 22, 48, 27, 16, + 214, 254, 229, 244, 48, 27, 16, 226, 18, 229, 244, 48, 27, 16, 225, 80, + 229, 244, 48, 27, 16, 227, 106, 48, 27, 16, 254, 122, 48, 27, 16, 232, + 191, 48, 27, 16, 226, 175, 229, 244, 48, 27, 16, 226, 177, 229, 244, 48, + 27, 16, 245, 147, 226, 176, 48, 27, 16, 234, 17, 48, 27, 16, 254, 123, + 48, 27, 16, 216, 170, 229, 244, 48, 27, 16, 245, 254, 48, 27, 16, 218, + 138, 229, 244, 48, 27, 16, 218, 130, 48, 27, 16, 250, 140, 229, 244, 48, + 27, 16, 245, 190, 48, 27, 16, 222, 102, 229, 244, 48, 27, 16, 213, 142, + 234, 157, 48, 27, 16, 216, 167, 48, 27, 16, 225, 81, 48, 27, 16, 216, + 171, 48, 27, 16, 216, 168, 48, 27, 16, 225, 78, 48, 27, 16, 216, 166, 48, + 27, 16, 225, 77, 48, 27, 16, 242, 254, 48, 27, 16, 254, 56, 48, 27, 16, + 245, 147, 254, 56, 48, 27, 16, 227, 13, 229, 244, 48, 27, 16, 217, 155, + 245, 155, 48, 27, 16, 217, 155, 245, 113, 48, 27, 16, 217, 157, 254, 103, + 48, 27, 16, 217, 150, 235, 109, 254, 95, 48, 27, 16, 235, 61, 48, 27, 16, + 245, 218, 48, 27, 16, 213, 3, 235, 58, 48, 27, 16, 213, 3, 254, 134, 48, + 27, 16, 219, 99, 48, 27, 16, 234, 158, 254, 134, 48, 27, 16, 248, 19, + 254, 62, 48, 27, 16, 234, 102, 254, 62, 48, 27, 16, 234, 102, 254, 185, + 48, 27, 16, 234, 102, 229, 244, 48, 27, 16, 254, 102, 229, 244, 48, 27, + 16, 254, 104, 48, 27, 16, 248, 18, 48, 27, 16, 216, 181, 48, 27, 16, 217, + 190, 48, 27, 16, 234, 122, 48, 27, 16, 233, 154, 245, 213, 250, 131, 48, + 27, 16, 233, 154, 246, 118, 250, 132, 48, 27, 16, 233, 154, 216, 183, + 250, 132, 48, 27, 16, 233, 154, 217, 200, 250, 132, 48, 27, 16, 233, 154, + 236, 119, 250, 131, 48, 27, 16, 242, 255, 229, 245, 254, 134, 48, 27, 16, + 242, 255, 226, 166, 254, 52, 48, 27, 16, 242, 255, 226, 166, 248, 101, + 48, 27, 16, 248, 42, 48, 27, 16, 248, 43, 226, 166, 254, 53, 235, 58, 48, + 27, 16, 248, 43, 226, 166, 254, 53, 254, 134, 48, 27, 16, 248, 43, 226, + 166, 248, 101, 48, 27, 16, 216, 187, 48, 27, 16, 254, 57, 48, 27, 16, + 236, 126, 48, 27, 16, 248, 63, 48, 27, 16, 254, 244, 225, 170, 254, 58, + 48, 27, 16, 254, 244, 254, 55, 48, 27, 16, 254, 244, 254, 58, 48, 27, 16, + 254, 244, 231, 171, 48, 27, 16, 254, 244, 231, 180, 48, 27, 16, 254, 244, + 243, 0, 48, 27, 16, 254, 244, 242, 253, 48, 27, 16, 254, 244, 225, 170, + 243, 0, 48, 27, 16, 232, 29, 225, 86, 240, 217, 48, 27, 16, 232, 29, 254, + 187, 225, 86, 240, 217, 48, 27, 16, 232, 29, 248, 100, 240, 217, 48, 27, + 16, 232, 29, 254, 187, 248, 100, 240, 217, 48, 27, 16, 232, 29, 216, 176, + 240, 217, 48, 27, 16, 232, 29, 216, 188, 48, 27, 16, 232, 29, 217, 194, + 240, 217, 48, 27, 16, 232, 29, 217, 194, 233, 157, 240, 217, 48, 27, 16, + 232, 29, 233, 157, 240, 217, 48, 27, 16, 232, 29, 225, 207, 240, 217, 48, + 27, 16, 236, 28, 217, 217, 240, 218, 48, 27, 16, 254, 100, 217, 217, 240, + 218, 48, 27, 16, 245, 5, 217, 191, 48, 27, 16, 245, 5, 231, 27, 48, 27, + 16, 245, 5, 248, 47, 48, 27, 16, 232, 29, 214, 248, 240, 217, 48, 27, 16, + 232, 29, 225, 85, 240, 217, 48, 27, 16, 232, 29, 225, 207, 217, 194, 240, + 217, 48, 27, 16, 242, 251, 230, 167, 254, 103, 48, 27, 16, 242, 251, 230, + 167, 248, 17, 48, 27, 16, 245, 227, 235, 109, 244, 71, 214, 109, 48, 27, + 16, 236, 125, 48, 27, 16, 236, 123, 48, 27, 16, 244, 71, 254, 63, 248, + 99, 240, 216, 48, 27, 16, 244, 71, 248, 61, 195, 48, 27, 16, 244, 71, + 248, 61, 230, 91, 48, 27, 16, 244, 71, 230, 86, 240, 217, 48, 27, 16, + 244, 71, 248, 61, 248, 76, 48, 27, 16, 244, 71, 220, 49, 248, 60, 248, + 76, 48, 27, 16, 244, 71, 248, 61, 235, 44, 48, 27, 16, 244, 71, 248, 61, + 212, 16, 48, 27, 16, 244, 71, 248, 61, 229, 129, 235, 58, 48, 27, 16, + 244, 71, 248, 61, 229, 129, 254, 134, 48, 27, 16, 244, 71, 232, 69, 250, + 133, 248, 47, 48, 27, 16, 244, 71, 232, 69, 250, 133, 231, 27, 48, 27, + 16, 244, 211, 220, 49, 250, 133, 214, 247, 48, 27, 16, 244, 71, 220, 49, + 250, 133, 218, 139, 48, 27, 16, 244, 71, 229, 246, 48, 27, 16, 250, 134, + 211, 248, 48, 27, 16, 250, 134, 234, 156, 48, 27, 16, 250, 134, 219, 216, + 48, 27, 16, 244, 71, 241, 7, 213, 2, 217, 195, 48, 27, 16, 244, 71, 245, + 228, 254, 124, 48, 27, 16, 213, 2, 216, 177, 48, 27, 16, 248, 55, 216, + 177, 48, 27, 16, 248, 55, 217, 195, 48, 27, 16, 248, 55, 254, 105, 246, + 118, 247, 214, 48, 27, 16, 248, 55, 231, 25, 217, 199, 247, 214, 48, 27, + 16, 248, 55, 248, 39, 245, 124, 247, 214, 48, 27, 16, 248, 55, 216, 185, + 227, 114, 247, 214, 48, 27, 16, 213, 2, 254, 105, 246, 118, 247, 214, 48, + 27, 16, 213, 2, 231, 25, 217, 199, 247, 214, 48, 27, 16, 213, 2, 248, 39, + 245, 124, 247, 214, 48, 27, 16, 213, 2, 216, 185, 227, 114, 247, 214, 48, + 27, 16, 243, 145, 248, 54, 48, 27, 16, 243, 145, 213, 1, 48, 27, 16, 248, + 62, 254, 105, 231, 82, 48, 27, 16, 248, 62, 254, 105, 231, 207, 48, 27, + 16, 248, 62, 248, 18, 48, 27, 16, 248, 62, 217, 148, 48, 27, 16, 220, + 108, 217, 148, 48, 27, 16, 220, 108, 217, 149, 248, 3, 48, 27, 16, 220, + 108, 217, 149, 216, 178, 48, 27, 16, 220, 108, 217, 149, 217, 188, 48, + 27, 16, 220, 108, 254, 30, 48, 27, 16, 220, 108, 254, 31, 248, 3, 48, 27, + 16, 220, 108, 254, 31, 216, 178, 48, 27, 16, 220, 108, 254, 31, 217, 188, + 48, 27, 16, 248, 40, 243, 126, 48, 27, 16, 248, 46, 227, 40, 48, 27, 16, + 219, 91, 48, 27, 16, 254, 49, 195, 48, 27, 16, 254, 49, 214, 109, 48, 27, + 16, 254, 49, 243, 230, 48, 27, 16, 254, 49, 248, 76, 48, 27, 16, 254, 49, + 235, 44, 48, 27, 16, 254, 49, 212, 16, 48, 27, 16, 254, 49, 229, 128, 48, + 27, 16, 235, 24, 229, 245, 231, 179, 48, 27, 16, 235, 25, 229, 245, 231, + 179, 48, 27, 16, 235, 24, 229, 245, 235, 58, 48, 27, 16, 235, 25, 229, + 245, 235, 58, 48, 27, 16, 234, 158, 235, 58, 48, 27, 16, 242, 255, 229, + 245, 235, 58, 27, 16, 220, 100, 252, 181, 27, 16, 52, 252, 181, 27, 16, + 41, 252, 181, 27, 16, 223, 237, 41, 252, 181, 27, 16, 248, 222, 252, 181, + 27, 16, 220, 196, 252, 181, 27, 16, 43, 224, 6, 53, 27, 16, 47, 224, 6, + 53, 27, 16, 224, 6, 247, 193, 27, 16, 249, 7, 222, 105, 27, 16, 249, 31, + 251, 49, 27, 16, 222, 105, 27, 16, 250, 38, 27, 16, 224, 4, 244, 200, 27, + 16, 224, 4, 244, 199, 27, 16, 224, 4, 244, 198, 27, 16, 244, 220, 27, 16, + 244, 221, 55, 27, 16, 251, 201, 79, 27, 16, 251, 79, 27, 16, 251, 211, + 27, 16, 125, 27, 16, 227, 96, 219, 116, 27, 16, 216, 30, 219, 116, 27, + 16, 217, 109, 219, 116, 27, 16, 244, 100, 219, 116, 27, 16, 244, 169, + 219, 116, 27, 16, 220, 71, 219, 116, 27, 16, 220, 69, 244, 84, 27, 16, + 244, 98, 244, 84, 27, 16, 244, 42, 250, 74, 27, 16, 244, 42, 250, 75, + 227, 42, 254, 178, 27, 16, 244, 42, 250, 75, 227, 42, 252, 168, 27, 16, + 251, 122, 250, 74, 27, 16, 245, 96, 250, 74, 27, 16, 245, 96, 250, 75, + 227, 42, 254, 178, 27, 16, 245, 96, 250, 75, 227, 42, 252, 168, 27, 16, + 246, 159, 250, 73, 27, 16, 246, 159, 250, 72, 27, 16, 230, 225, 231, 225, + 223, 247, 27, 16, 52, 221, 20, 27, 16, 52, 244, 154, 27, 16, 244, 155, + 215, 140, 27, 16, 244, 155, 246, 181, 27, 16, 230, 77, 215, 140, 27, 16, + 230, 77, 246, 181, 27, 16, 221, 21, 215, 140, 27, 16, 221, 21, 246, 181, + 27, 16, 224, 202, 161, 221, 20, 27, 16, 224, 202, 161, 244, 154, 27, 16, + 250, 21, 217, 54, 27, 16, 249, 150, 217, 54, 27, 16, 227, 42, 254, 178, + 27, 16, 227, 42, 252, 168, 27, 16, 224, 184, 254, 178, 27, 16, 224, 184, + 252, 168, 27, 16, 230, 228, 223, 247, 27, 16, 213, 239, 223, 247, 27, 16, + 157, 223, 247, 27, 16, 224, 202, 223, 247, 27, 16, 246, 11, 223, 247, 27, + 16, 220, 65, 223, 247, 27, 16, 217, 126, 223, 247, 27, 16, 220, 57, 223, + 247, 27, 16, 124, 241, 63, 216, 43, 223, 247, 27, 16, 213, 170, 228, 197, + 27, 16, 95, 228, 197, 27, 16, 250, 96, 213, 170, 228, 197, 27, 16, 42, + 228, 198, 213, 241, 27, 16, 42, 228, 198, 252, 13, 27, 16, 216, 197, 228, + 198, 116, 213, 241, 27, 16, 216, 197, 228, 198, 116, 252, 13, 27, 16, + 216, 197, 228, 198, 43, 213, 241, 27, 16, 216, 197, 228, 198, 43, 252, + 13, 27, 16, 216, 197, 228, 198, 47, 213, 241, 27, 16, 216, 197, 228, 198, + 47, 252, 13, 27, 16, 216, 197, 228, 198, 121, 213, 241, 27, 16, 216, 197, + 228, 198, 121, 252, 13, 27, 16, 216, 197, 228, 198, 116, 47, 213, 241, + 27, 16, 216, 197, 228, 198, 116, 47, 252, 13, 27, 16, 231, 13, 228, 198, + 213, 241, 27, 16, 231, 13, 228, 198, 252, 13, 27, 16, 216, 194, 228, 198, + 121, 213, 241, 27, 16, 216, 194, 228, 198, 121, 252, 13, 27, 16, 226, + 169, 228, 197, 27, 16, 214, 117, 228, 197, 27, 16, 228, 198, 252, 13, 27, + 16, 228, 102, 228, 197, 27, 16, 250, 45, 228, 198, 213, 241, 27, 16, 250, + 45, 228, 198, 252, 13, 27, 16, 251, 199, 27, 16, 213, 239, 228, 201, 27, + 16, 157, 228, 201, 27, 16, 224, 202, 228, 201, 27, 16, 246, 11, 228, 201, + 27, 16, 220, 65, 228, 201, 27, 16, 217, 126, 228, 201, 27, 16, 220, 57, + 228, 201, 27, 16, 124, 241, 63, 216, 43, 228, 201, 27, 16, 38, 219, 93, + 27, 16, 38, 219, 191, 219, 93, 27, 16, 38, 216, 205, 27, 16, 38, 216, + 204, 27, 16, 38, 216, 203, 27, 16, 244, 190, 216, 205, 27, 16, 244, 190, + 216, 204, 27, 16, 244, 190, 216, 203, 27, 16, 38, 253, 232, 247, 195, 27, + 16, 38, 244, 161, 27, 16, 38, 244, 160, 27, 16, 38, 244, 159, 27, 16, 38, + 244, 158, 27, 16, 38, 244, 157, 27, 16, 252, 104, 252, 120, 27, 16, 245, + 222, 252, 120, 27, 16, 252, 104, 217, 78, 27, 16, 245, 222, 217, 78, 27, + 16, 252, 104, 220, 27, 27, 16, 245, 222, 220, 27, 27, 16, 252, 104, 226, + 27, 27, 16, 245, 222, 226, 27, 27, 16, 38, 255, 46, 27, 16, 38, 219, 118, + 27, 16, 38, 217, 204, 27, 16, 38, 219, 119, 27, 16, 38, 232, 40, 27, 16, + 38, 232, 39, 27, 16, 38, 255, 45, 27, 16, 38, 232, 241, 27, 16, 254, 40, + 215, 140, 27, 16, 254, 40, 246, 181, 27, 16, 38, 247, 210, 27, 16, 38, + 223, 162, 27, 16, 38, 244, 147, 27, 16, 38, 220, 23, 27, 16, 38, 252, 85, + 27, 16, 38, 52, 216, 245, 27, 16, 38, 216, 182, 216, 245, 27, 16, 223, + 166, 27, 16, 219, 34, 27, 16, 212, 152, 27, 16, 226, 19, 27, 16, 231, + 162, 27, 16, 244, 106, 27, 16, 249, 201, 27, 16, 248, 150, 27, 16, 242, + 246, 228, 202, 220, 42, 27, 16, 242, 246, 228, 202, 228, 229, 220, 42, + 27, 16, 216, 226, 27, 16, 216, 67, 27, 16, 236, 52, 216, 67, 27, 16, 216, + 68, 220, 42, 27, 16, 216, 68, 215, 140, 27, 16, 227, 53, 219, 58, 27, 16, + 227, 53, 219, 55, 27, 16, 227, 53, 219, 54, 27, 16, 227, 53, 219, 53, 27, + 16, 227, 53, 219, 52, 27, 16, 227, 53, 219, 51, 27, 16, 227, 53, 219, 50, + 27, 16, 227, 53, 219, 49, 27, 16, 227, 53, 219, 48, 27, 16, 227, 53, 219, + 57, 27, 16, 227, 53, 219, 56, 27, 16, 242, 92, 27, 16, 229, 253, 27, 16, + 245, 222, 68, 219, 87, 27, 16, 248, 143, 220, 42, 27, 16, 38, 121, 251, + 220, 27, 16, 38, 116, 251, 220, 27, 16, 38, 242, 103, 27, 16, 38, 220, + 14, 225, 211, 27, 16, 226, 127, 79, 27, 16, 226, 127, 116, 79, 27, 16, + 157, 226, 127, 79, 27, 16, 243, 22, 215, 140, 27, 16, 243, 22, 246, 181, + 27, 16, 2, 244, 189, 27, 16, 248, 247, 27, 16, 248, 248, 254, 190, 27, + 16, 232, 11, 27, 16, 233, 0, 27, 16, 251, 196, 27, 16, 221, 97, 213, 241, + 27, 16, 221, 97, 252, 13, 27, 16, 231, 67, 27, 16, 231, 68, 252, 13, 27, + 16, 221, 91, 213, 241, 27, 16, 221, 91, 252, 13, 27, 16, 244, 56, 213, + 241, 27, 16, 244, 56, 252, 13, 27, 16, 233, 1, 226, 91, 223, 247, 27, 16, + 233, 1, 236, 117, 223, 247, 27, 16, 251, 197, 223, 247, 27, 16, 221, 97, + 223, 247, 27, 16, 231, 68, 223, 247, 27, 16, 221, 91, 223, 247, 27, 16, + 217, 215, 226, 89, 249, 171, 225, 94, 226, 90, 27, 16, 217, 215, 226, 89, + 249, 171, 225, 94, 236, 116, 27, 16, 217, 215, 226, 89, 249, 171, 225, + 94, 226, 91, 248, 28, 27, 16, 217, 215, 236, 115, 249, 171, 225, 94, 226, + 90, 27, 16, 217, 215, 236, 115, 249, 171, 225, 94, 236, 116, 27, 16, 217, + 215, 236, 115, 249, 171, 225, 94, 236, 117, 248, 28, 27, 16, 217, 215, + 236, 115, 249, 171, 225, 94, 236, 117, 248, 27, 27, 16, 217, 215, 236, + 115, 249, 171, 225, 94, 236, 117, 248, 26, 27, 16, 249, 196, 27, 16, 242, + 224, 251, 122, 250, 74, 27, 16, 242, 224, 245, 96, 250, 74, 27, 16, 42, + 253, 201, 27, 16, 214, 136, 27, 16, 225, 184, 27, 16, 250, 65, 27, 16, + 222, 144, 27, 16, 250, 69, 27, 16, 216, 233, 27, 16, 225, 158, 27, 16, + 225, 159, 244, 149, 27, 16, 222, 145, 244, 149, 27, 16, 216, 234, 223, + 244, 27, 16, 226, 75, 219, 25, 25, 214, 122, 179, 218, 188, 25, 214, 122, + 179, 218, 177, 25, 214, 122, 179, 218, 167, 25, 214, 122, 179, 218, 160, + 25, 214, 122, 179, 218, 152, 25, 214, 122, 179, 218, 146, 25, 214, 122, + 179, 218, 145, 25, 214, 122, 179, 218, 144, 25, 214, 122, 179, 218, 143, + 25, 214, 122, 179, 218, 187, 25, 214, 122, 179, 218, 186, 25, 214, 122, + 179, 218, 185, 25, 214, 122, 179, 218, 184, 25, 214, 122, 179, 218, 183, + 25, 214, 122, 179, 218, 182, 25, 214, 122, 179, 218, 181, 25, 214, 122, + 179, 218, 180, 25, 214, 122, 179, 218, 179, 25, 214, 122, 179, 218, 178, + 25, 214, 122, 179, 218, 176, 25, 214, 122, 179, 218, 175, 25, 214, 122, + 179, 218, 174, 25, 214, 122, 179, 218, 173, 25, 214, 122, 179, 218, 172, + 25, 214, 122, 179, 218, 151, 25, 214, 122, 179, 218, 150, 25, 214, 122, + 179, 218, 149, 25, 214, 122, 179, 218, 148, 25, 214, 122, 179, 218, 147, + 25, 236, 72, 179, 218, 188, 25, 236, 72, 179, 218, 177, 25, 236, 72, 179, + 218, 160, 25, 236, 72, 179, 218, 152, 25, 236, 72, 179, 218, 145, 25, + 236, 72, 179, 218, 144, 25, 236, 72, 179, 218, 186, 25, 236, 72, 179, + 218, 185, 25, 236, 72, 179, 218, 184, 25, 236, 72, 179, 218, 183, 25, + 236, 72, 179, 218, 180, 25, 236, 72, 179, 218, 179, 25, 236, 72, 179, + 218, 178, 25, 236, 72, 179, 218, 173, 25, 236, 72, 179, 218, 172, 25, + 236, 72, 179, 218, 171, 25, 236, 72, 179, 218, 170, 25, 236, 72, 179, + 218, 169, 25, 236, 72, 179, 218, 168, 25, 236, 72, 179, 218, 166, 25, + 236, 72, 179, 218, 165, 25, 236, 72, 179, 218, 164, 25, 236, 72, 179, + 218, 163, 25, 236, 72, 179, 218, 162, 25, 236, 72, 179, 218, 161, 25, + 236, 72, 179, 218, 159, 25, 236, 72, 179, 218, 158, 25, 236, 72, 179, + 218, 157, 25, 236, 72, 179, 218, 156, 25, 236, 72, 179, 218, 155, 25, + 236, 72, 179, 218, 154, 25, 236, 72, 179, 218, 153, 25, 236, 72, 179, + 218, 151, 25, 236, 72, 179, 218, 150, 25, 236, 72, 179, 218, 149, 25, + 236, 72, 179, 218, 148, 25, 236, 72, 179, 218, 147, 38, 25, 27, 216, 179, + 38, 25, 27, 217, 189, 38, 25, 27, 226, 99, 25, 27, 233, 153, 231, 26, 31, + 246, 44, 248, 41, 31, 242, 69, 246, 44, 248, 41, 31, 241, 66, 246, 44, + 248, 41, 31, 246, 43, 242, 70, 248, 41, 31, 246, 43, 241, 65, 248, 41, + 31, 246, 44, 174, 31, 250, 231, 174, 31, 244, 64, 250, 95, 174, 31, 231, + 60, 174, 31, 252, 176, 174, 31, 235, 41, 220, 26, 174, 31, 249, 241, 174, + 31, 254, 19, 174, 31, 227, 67, 174, 31, 251, 205, 227, 36, 174, 31, 248, + 145, 171, 247, 252, 174, 31, 247, 249, 174, 31, 212, 214, 174, 31, 236, + 104, 174, 31, 226, 108, 174, 31, 224, 54, 174, 31, 249, 251, 174, 31, + 241, 165, 252, 228, 174, 31, 214, 46, 174, 31, 244, 128, 174, 31, 255, + 23, 174, 31, 224, 17, 174, 31, 223, 251, 174, 31, 246, 42, 174, 31, 235, + 170, 174, 31, 249, 246, 174, 31, 245, 221, 174, 31, 246, 128, 174, 31, + 250, 204, 174, 31, 248, 154, 174, 31, 23, 223, 250, 174, 31, 226, 243, + 174, 31, 233, 156, 174, 31, 250, 58, 174, 31, 234, 197, 174, 31, 243, + 182, 174, 31, 219, 66, 174, 31, 225, 52, 174, 31, 244, 63, 174, 31, 223, + 252, 174, 31, 233, 193, 171, 231, 41, 174, 31, 223, 248, 174, 31, 243, 8, + 217, 10, 231, 211, 174, 31, 245, 223, 174, 31, 219, 78, 174, 31, 242, + 226, 174, 31, 245, 215, 174, 31, 226, 145, 174, 31, 223, 156, 174, 31, + 244, 148, 174, 31, 214, 246, 171, 214, 31, 174, 31, 249, 255, 174, 31, + 231, 224, 174, 31, 245, 148, 174, 31, 215, 149, 174, 31, 248, 29, 174, + 31, 250, 60, 230, 250, 174, 31, 242, 208, 174, 31, 243, 183, 236, 112, + 174, 31, 232, 19, 174, 31, 255, 42, 174, 31, 245, 236, 174, 31, 246, 184, + 174, 31, 214, 29, 174, 31, 220, 97, 174, 31, 236, 80, 174, 31, 248, 114, + 174, 31, 248, 227, 174, 31, 248, 25, 174, 31, 245, 117, 174, 31, 221, 59, + 174, 31, 219, 82, 174, 31, 242, 105, 174, 31, 250, 17, 174, 31, 250, 55, + 174, 31, 245, 10, 174, 31, 254, 245, 174, 31, 250, 16, 174, 31, 227, 100, + 217, 162, 214, 224, 174, 31, 248, 49, 174, 31, 233, 245, 174, 31, 244, + 103, 249, 211, 223, 137, 215, 151, 21, 118, 249, 211, 223, 137, 215, 151, + 21, 112, 249, 211, 223, 137, 215, 151, 21, 170, 249, 211, 223, 137, 215, + 151, 21, 167, 249, 211, 223, 137, 215, 151, 21, 185, 249, 211, 223, 137, + 215, 151, 21, 192, 249, 211, 223, 137, 215, 151, 21, 200, 249, 211, 223, + 137, 215, 151, 21, 198, 249, 211, 223, 137, 215, 151, 21, 203, 249, 211, + 223, 137, 217, 209, 21, 118, 249, 211, 223, 137, 217, 209, 21, 112, 249, + 211, 223, 137, 217, 209, 21, 170, 249, 211, 223, 137, 217, 209, 21, 167, + 249, 211, 223, 137, 217, 209, 21, 185, 249, 211, 223, 137, 217, 209, 21, + 192, 249, 211, 223, 137, 217, 209, 21, 200, 249, 211, 223, 137, 217, 209, + 21, 198, 249, 211, 223, 137, 217, 209, 21, 203, 14, 23, 6, 63, 14, 23, 6, + 253, 201, 14, 23, 6, 251, 121, 14, 23, 6, 249, 125, 14, 23, 6, 77, 14, + 23, 6, 245, 95, 14, 23, 6, 244, 41, 14, 23, 6, 242, 162, 14, 23, 6, 75, + 14, 23, 6, 236, 3, 14, 23, 6, 235, 141, 14, 23, 6, 155, 14, 23, 6, 184, + 14, 23, 6, 206, 14, 23, 6, 78, 14, 23, 6, 227, 11, 14, 23, 6, 225, 19, + 14, 23, 6, 152, 14, 23, 6, 196, 14, 23, 6, 218, 113, 14, 23, 6, 72, 14, + 23, 6, 211, 211, 14, 23, 6, 214, 85, 14, 23, 6, 213, 169, 14, 23, 6, 213, + 108, 14, 23, 6, 212, 152, 14, 23, 4, 63, 14, 23, 4, 253, 201, 14, 23, 4, + 251, 121, 14, 23, 4, 249, 125, 14, 23, 4, 77, 14, 23, 4, 245, 95, 14, 23, + 4, 244, 41, 14, 23, 4, 242, 162, 14, 23, 4, 75, 14, 23, 4, 236, 3, 14, + 23, 4, 235, 141, 14, 23, 4, 155, 14, 23, 4, 184, 14, 23, 4, 206, 14, 23, + 4, 78, 14, 23, 4, 227, 11, 14, 23, 4, 225, 19, 14, 23, 4, 152, 14, 23, 4, + 196, 14, 23, 4, 218, 113, 14, 23, 4, 72, 14, 23, 4, 211, 211, 14, 23, 4, + 214, 85, 14, 23, 4, 213, 169, 14, 23, 4, 213, 108, 14, 23, 4, 212, 152, + 14, 32, 6, 63, 14, 32, 6, 253, 201, 14, 32, 6, 251, 121, 14, 32, 6, 249, + 125, 14, 32, 6, 77, 14, 32, 6, 245, 95, 14, 32, 6, 244, 41, 14, 32, 6, + 242, 162, 14, 32, 6, 75, 14, 32, 6, 236, 3, 14, 32, 6, 235, 141, 14, 32, + 6, 155, 14, 32, 6, 184, 14, 32, 6, 206, 14, 32, 6, 78, 14, 32, 6, 227, + 11, 14, 32, 6, 225, 19, 14, 32, 6, 152, 14, 32, 6, 196, 14, 32, 6, 218, + 113, 14, 32, 6, 72, 14, 32, 6, 211, 211, 14, 32, 6, 214, 85, 14, 32, 6, + 213, 169, 14, 32, 6, 213, 108, 14, 32, 6, 212, 152, 14, 32, 4, 63, 14, + 32, 4, 253, 201, 14, 32, 4, 251, 121, 14, 32, 4, 249, 125, 14, 32, 4, 77, + 14, 32, 4, 245, 95, 14, 32, 4, 244, 41, 14, 32, 4, 75, 14, 32, 4, 236, 3, + 14, 32, 4, 235, 141, 14, 32, 4, 155, 14, 32, 4, 184, 14, 32, 4, 206, 14, + 32, 4, 78, 14, 32, 4, 227, 11, 14, 32, 4, 225, 19, 14, 32, 4, 152, 14, + 32, 4, 196, 14, 32, 4, 218, 113, 14, 32, 4, 72, 14, 32, 4, 211, 211, 14, + 32, 4, 214, 85, 14, 32, 4, 213, 169, 14, 32, 4, 213, 108, 14, 32, 4, 212, + 152, 14, 23, 32, 6, 63, 14, 23, 32, 6, 253, 201, 14, 23, 32, 6, 251, 121, + 14, 23, 32, 6, 249, 125, 14, 23, 32, 6, 77, 14, 23, 32, 6, 245, 95, 14, + 23, 32, 6, 244, 41, 14, 23, 32, 6, 242, 162, 14, 23, 32, 6, 75, 14, 23, + 32, 6, 236, 3, 14, 23, 32, 6, 235, 141, 14, 23, 32, 6, 155, 14, 23, 32, + 6, 184, 14, 23, 32, 6, 206, 14, 23, 32, 6, 78, 14, 23, 32, 6, 227, 11, + 14, 23, 32, 6, 225, 19, 14, 23, 32, 6, 152, 14, 23, 32, 6, 196, 14, 23, + 32, 6, 218, 113, 14, 23, 32, 6, 72, 14, 23, 32, 6, 211, 211, 14, 23, 32, + 6, 214, 85, 14, 23, 32, 6, 213, 169, 14, 23, 32, 6, 213, 108, 14, 23, 32, + 6, 212, 152, 14, 23, 32, 4, 63, 14, 23, 32, 4, 253, 201, 14, 23, 32, 4, + 251, 121, 14, 23, 32, 4, 249, 125, 14, 23, 32, 4, 77, 14, 23, 32, 4, 245, + 95, 14, 23, 32, 4, 244, 41, 14, 23, 32, 4, 242, 162, 14, 23, 32, 4, 75, + 14, 23, 32, 4, 236, 3, 14, 23, 32, 4, 235, 141, 14, 23, 32, 4, 155, 14, + 23, 32, 4, 184, 14, 23, 32, 4, 206, 14, 23, 32, 4, 78, 14, 23, 32, 4, + 227, 11, 14, 23, 32, 4, 225, 19, 14, 23, 32, 4, 152, 14, 23, 32, 4, 196, + 14, 23, 32, 4, 218, 113, 14, 23, 32, 4, 72, 14, 23, 32, 4, 211, 211, 14, + 23, 32, 4, 214, 85, 14, 23, 32, 4, 213, 169, 14, 23, 32, 4, 213, 108, 14, + 23, 32, 4, 212, 152, 14, 115, 6, 63, 14, 115, 6, 251, 121, 14, 115, 6, + 249, 125, 14, 115, 6, 244, 41, 14, 115, 6, 236, 3, 14, 115, 6, 235, 141, + 14, 115, 6, 206, 14, 115, 6, 78, 14, 115, 6, 227, 11, 14, 115, 6, 225, + 19, 14, 115, 6, 196, 14, 115, 6, 218, 113, 14, 115, 6, 72, 14, 115, 6, + 211, 211, 14, 115, 6, 214, 85, 14, 115, 6, 213, 169, 14, 115, 6, 213, + 108, 14, 115, 6, 212, 152, 14, 115, 4, 63, 14, 115, 4, 253, 201, 14, 115, + 4, 251, 121, 14, 115, 4, 249, 125, 14, 115, 4, 245, 95, 14, 115, 4, 242, + 162, 14, 115, 4, 75, 14, 115, 4, 236, 3, 14, 115, 4, 235, 141, 14, 115, + 4, 155, 14, 115, 4, 184, 14, 115, 4, 206, 14, 115, 4, 227, 11, 14, 115, + 4, 225, 19, 14, 115, 4, 152, 14, 115, 4, 196, 14, 115, 4, 218, 113, 14, + 115, 4, 72, 14, 115, 4, 211, 211, 14, 115, 4, 214, 85, 14, 115, 4, 213, + 169, 14, 115, 4, 213, 108, 14, 115, 4, 212, 152, 14, 23, 115, 6, 63, 14, + 23, 115, 6, 253, 201, 14, 23, 115, 6, 251, 121, 14, 23, 115, 6, 249, 125, + 14, 23, 115, 6, 77, 14, 23, 115, 6, 245, 95, 14, 23, 115, 6, 244, 41, 14, + 23, 115, 6, 242, 162, 14, 23, 115, 6, 75, 14, 23, 115, 6, 236, 3, 14, 23, + 115, 6, 235, 141, 14, 23, 115, 6, 155, 14, 23, 115, 6, 184, 14, 23, 115, + 6, 206, 14, 23, 115, 6, 78, 14, 23, 115, 6, 227, 11, 14, 23, 115, 6, 225, + 19, 14, 23, 115, 6, 152, 14, 23, 115, 6, 196, 14, 23, 115, 6, 218, 113, + 14, 23, 115, 6, 72, 14, 23, 115, 6, 211, 211, 14, 23, 115, 6, 214, 85, + 14, 23, 115, 6, 213, 169, 14, 23, 115, 6, 213, 108, 14, 23, 115, 6, 212, + 152, 14, 23, 115, 4, 63, 14, 23, 115, 4, 253, 201, 14, 23, 115, 4, 251, + 121, 14, 23, 115, 4, 249, 125, 14, 23, 115, 4, 77, 14, 23, 115, 4, 245, + 95, 14, 23, 115, 4, 244, 41, 14, 23, 115, 4, 242, 162, 14, 23, 115, 4, + 75, 14, 23, 115, 4, 236, 3, 14, 23, 115, 4, 235, 141, 14, 23, 115, 4, + 155, 14, 23, 115, 4, 184, 14, 23, 115, 4, 206, 14, 23, 115, 4, 78, 14, + 23, 115, 4, 227, 11, 14, 23, 115, 4, 225, 19, 14, 23, 115, 4, 152, 14, + 23, 115, 4, 196, 14, 23, 115, 4, 218, 113, 14, 23, 115, 4, 72, 14, 23, + 115, 4, 211, 211, 14, 23, 115, 4, 214, 85, 14, 23, 115, 4, 213, 169, 14, + 23, 115, 4, 213, 108, 14, 23, 115, 4, 212, 152, 14, 131, 6, 63, 14, 131, + 6, 253, 201, 14, 131, 6, 249, 125, 14, 131, 6, 77, 14, 131, 6, 245, 95, + 14, 131, 6, 244, 41, 14, 131, 6, 236, 3, 14, 131, 6, 235, 141, 14, 131, + 6, 155, 14, 131, 6, 184, 14, 131, 6, 206, 14, 131, 6, 78, 14, 131, 6, + 227, 11, 14, 131, 6, 225, 19, 14, 131, 6, 196, 14, 131, 6, 218, 113, 14, + 131, 6, 72, 14, 131, 6, 211, 211, 14, 131, 6, 214, 85, 14, 131, 6, 213, + 169, 14, 131, 6, 213, 108, 14, 131, 4, 63, 14, 131, 4, 253, 201, 14, 131, + 4, 251, 121, 14, 131, 4, 249, 125, 14, 131, 4, 77, 14, 131, 4, 245, 95, + 14, 131, 4, 244, 41, 14, 131, 4, 242, 162, 14, 131, 4, 75, 14, 131, 4, + 236, 3, 14, 131, 4, 235, 141, 14, 131, 4, 155, 14, 131, 4, 184, 14, 131, + 4, 206, 14, 131, 4, 78, 14, 131, 4, 227, 11, 14, 131, 4, 225, 19, 14, + 131, 4, 152, 14, 131, 4, 196, 14, 131, 4, 218, 113, 14, 131, 4, 72, 14, + 131, 4, 211, 211, 14, 131, 4, 214, 85, 14, 131, 4, 213, 169, 14, 131, 4, + 213, 108, 14, 131, 4, 212, 152, 14, 190, 6, 63, 14, 190, 6, 253, 201, 14, + 190, 6, 249, 125, 14, 190, 6, 77, 14, 190, 6, 245, 95, 14, 190, 6, 244, + 41, 14, 190, 6, 75, 14, 190, 6, 236, 3, 14, 190, 6, 235, 141, 14, 190, 6, + 155, 14, 190, 6, 184, 14, 190, 6, 78, 14, 190, 6, 196, 14, 190, 6, 218, + 113, 14, 190, 6, 72, 14, 190, 6, 211, 211, 14, 190, 6, 214, 85, 14, 190, + 6, 213, 169, 14, 190, 6, 213, 108, 14, 190, 4, 63, 14, 190, 4, 253, 201, + 14, 190, 4, 251, 121, 14, 190, 4, 249, 125, 14, 190, 4, 77, 14, 190, 4, + 245, 95, 14, 190, 4, 244, 41, 14, 190, 4, 242, 162, 14, 190, 4, 75, 14, + 190, 4, 236, 3, 14, 190, 4, 235, 141, 14, 190, 4, 155, 14, 190, 4, 184, + 14, 190, 4, 206, 14, 190, 4, 78, 14, 190, 4, 227, 11, 14, 190, 4, 225, + 19, 14, 190, 4, 152, 14, 190, 4, 196, 14, 190, 4, 218, 113, 14, 190, 4, + 72, 14, 190, 4, 211, 211, 14, 190, 4, 214, 85, 14, 190, 4, 213, 169, 14, + 190, 4, 213, 108, 14, 190, 4, 212, 152, 14, 23, 131, 6, 63, 14, 23, 131, + 6, 253, 201, 14, 23, 131, 6, 251, 121, 14, 23, 131, 6, 249, 125, 14, 23, + 131, 6, 77, 14, 23, 131, 6, 245, 95, 14, 23, 131, 6, 244, 41, 14, 23, + 131, 6, 242, 162, 14, 23, 131, 6, 75, 14, 23, 131, 6, 236, 3, 14, 23, + 131, 6, 235, 141, 14, 23, 131, 6, 155, 14, 23, 131, 6, 184, 14, 23, 131, + 6, 206, 14, 23, 131, 6, 78, 14, 23, 131, 6, 227, 11, 14, 23, 131, 6, 225, + 19, 14, 23, 131, 6, 152, 14, 23, 131, 6, 196, 14, 23, 131, 6, 218, 113, + 14, 23, 131, 6, 72, 14, 23, 131, 6, 211, 211, 14, 23, 131, 6, 214, 85, + 14, 23, 131, 6, 213, 169, 14, 23, 131, 6, 213, 108, 14, 23, 131, 6, 212, + 152, 14, 23, 131, 4, 63, 14, 23, 131, 4, 253, 201, 14, 23, 131, 4, 251, + 121, 14, 23, 131, 4, 249, 125, 14, 23, 131, 4, 77, 14, 23, 131, 4, 245, + 95, 14, 23, 131, 4, 244, 41, 14, 23, 131, 4, 242, 162, 14, 23, 131, 4, + 75, 14, 23, 131, 4, 236, 3, 14, 23, 131, 4, 235, 141, 14, 23, 131, 4, + 155, 14, 23, 131, 4, 184, 14, 23, 131, 4, 206, 14, 23, 131, 4, 78, 14, + 23, 131, 4, 227, 11, 14, 23, 131, 4, 225, 19, 14, 23, 131, 4, 152, 14, + 23, 131, 4, 196, 14, 23, 131, 4, 218, 113, 14, 23, 131, 4, 72, 14, 23, + 131, 4, 211, 211, 14, 23, 131, 4, 214, 85, 14, 23, 131, 4, 213, 169, 14, + 23, 131, 4, 213, 108, 14, 23, 131, 4, 212, 152, 14, 35, 6, 63, 14, 35, 6, + 253, 201, 14, 35, 6, 251, 121, 14, 35, 6, 249, 125, 14, 35, 6, 77, 14, + 35, 6, 245, 95, 14, 35, 6, 244, 41, 14, 35, 6, 242, 162, 14, 35, 6, 75, + 14, 35, 6, 236, 3, 14, 35, 6, 235, 141, 14, 35, 6, 155, 14, 35, 6, 184, + 14, 35, 6, 206, 14, 35, 6, 78, 14, 35, 6, 227, 11, 14, 35, 6, 225, 19, + 14, 35, 6, 152, 14, 35, 6, 196, 14, 35, 6, 218, 113, 14, 35, 6, 72, 14, + 35, 6, 211, 211, 14, 35, 6, 214, 85, 14, 35, 6, 213, 169, 14, 35, 6, 213, + 108, 14, 35, 6, 212, 152, 14, 35, 4, 63, 14, 35, 4, 253, 201, 14, 35, 4, + 251, 121, 14, 35, 4, 249, 125, 14, 35, 4, 77, 14, 35, 4, 245, 95, 14, 35, + 4, 244, 41, 14, 35, 4, 242, 162, 14, 35, 4, 75, 14, 35, 4, 236, 3, 14, + 35, 4, 235, 141, 14, 35, 4, 155, 14, 35, 4, 184, 14, 35, 4, 206, 14, 35, + 4, 78, 14, 35, 4, 227, 11, 14, 35, 4, 225, 19, 14, 35, 4, 152, 14, 35, 4, + 196, 14, 35, 4, 218, 113, 14, 35, 4, 72, 14, 35, 4, 211, 211, 14, 35, 4, + 214, 85, 14, 35, 4, 213, 169, 14, 35, 4, 213, 108, 14, 35, 4, 212, 152, + 14, 35, 23, 6, 63, 14, 35, 23, 6, 253, 201, 14, 35, 23, 6, 251, 121, 14, + 35, 23, 6, 249, 125, 14, 35, 23, 6, 77, 14, 35, 23, 6, 245, 95, 14, 35, + 23, 6, 244, 41, 14, 35, 23, 6, 242, 162, 14, 35, 23, 6, 75, 14, 35, 23, + 6, 236, 3, 14, 35, 23, 6, 235, 141, 14, 35, 23, 6, 155, 14, 35, 23, 6, + 184, 14, 35, 23, 6, 206, 14, 35, 23, 6, 78, 14, 35, 23, 6, 227, 11, 14, + 35, 23, 6, 225, 19, 14, 35, 23, 6, 152, 14, 35, 23, 6, 196, 14, 35, 23, + 6, 218, 113, 14, 35, 23, 6, 72, 14, 35, 23, 6, 211, 211, 14, 35, 23, 6, + 214, 85, 14, 35, 23, 6, 213, 169, 14, 35, 23, 6, 213, 108, 14, 35, 23, 6, + 212, 152, 14, 35, 23, 4, 63, 14, 35, 23, 4, 253, 201, 14, 35, 23, 4, 251, + 121, 14, 35, 23, 4, 249, 125, 14, 35, 23, 4, 77, 14, 35, 23, 4, 245, 95, + 14, 35, 23, 4, 244, 41, 14, 35, 23, 4, 242, 162, 14, 35, 23, 4, 75, 14, + 35, 23, 4, 236, 3, 14, 35, 23, 4, 235, 141, 14, 35, 23, 4, 155, 14, 35, + 23, 4, 184, 14, 35, 23, 4, 206, 14, 35, 23, 4, 78, 14, 35, 23, 4, 227, + 11, 14, 35, 23, 4, 225, 19, 14, 35, 23, 4, 152, 14, 35, 23, 4, 196, 14, + 35, 23, 4, 218, 113, 14, 35, 23, 4, 72, 14, 35, 23, 4, 211, 211, 14, 35, + 23, 4, 214, 85, 14, 35, 23, 4, 213, 169, 14, 35, 23, 4, 213, 108, 14, 35, + 23, 4, 212, 152, 14, 35, 32, 6, 63, 14, 35, 32, 6, 253, 201, 14, 35, 32, + 6, 251, 121, 14, 35, 32, 6, 249, 125, 14, 35, 32, 6, 77, 14, 35, 32, 6, + 245, 95, 14, 35, 32, 6, 244, 41, 14, 35, 32, 6, 242, 162, 14, 35, 32, 6, + 75, 14, 35, 32, 6, 236, 3, 14, 35, 32, 6, 235, 141, 14, 35, 32, 6, 155, + 14, 35, 32, 6, 184, 14, 35, 32, 6, 206, 14, 35, 32, 6, 78, 14, 35, 32, 6, + 227, 11, 14, 35, 32, 6, 225, 19, 14, 35, 32, 6, 152, 14, 35, 32, 6, 196, + 14, 35, 32, 6, 218, 113, 14, 35, 32, 6, 72, 14, 35, 32, 6, 211, 211, 14, + 35, 32, 6, 214, 85, 14, 35, 32, 6, 213, 169, 14, 35, 32, 6, 213, 108, 14, + 35, 32, 6, 212, 152, 14, 35, 32, 4, 63, 14, 35, 32, 4, 253, 201, 14, 35, + 32, 4, 251, 121, 14, 35, 32, 4, 249, 125, 14, 35, 32, 4, 77, 14, 35, 32, + 4, 245, 95, 14, 35, 32, 4, 244, 41, 14, 35, 32, 4, 242, 162, 14, 35, 32, + 4, 75, 14, 35, 32, 4, 236, 3, 14, 35, 32, 4, 235, 141, 14, 35, 32, 4, + 155, 14, 35, 32, 4, 184, 14, 35, 32, 4, 206, 14, 35, 32, 4, 78, 14, 35, + 32, 4, 227, 11, 14, 35, 32, 4, 225, 19, 14, 35, 32, 4, 152, 14, 35, 32, + 4, 196, 14, 35, 32, 4, 218, 113, 14, 35, 32, 4, 72, 14, 35, 32, 4, 211, + 211, 14, 35, 32, 4, 214, 85, 14, 35, 32, 4, 213, 169, 14, 35, 32, 4, 213, + 108, 14, 35, 32, 4, 212, 152, 14, 35, 23, 32, 6, 63, 14, 35, 23, 32, 6, + 253, 201, 14, 35, 23, 32, 6, 251, 121, 14, 35, 23, 32, 6, 249, 125, 14, + 35, 23, 32, 6, 77, 14, 35, 23, 32, 6, 245, 95, 14, 35, 23, 32, 6, 244, + 41, 14, 35, 23, 32, 6, 242, 162, 14, 35, 23, 32, 6, 75, 14, 35, 23, 32, + 6, 236, 3, 14, 35, 23, 32, 6, 235, 141, 14, 35, 23, 32, 6, 155, 14, 35, + 23, 32, 6, 184, 14, 35, 23, 32, 6, 206, 14, 35, 23, 32, 6, 78, 14, 35, + 23, 32, 6, 227, 11, 14, 35, 23, 32, 6, 225, 19, 14, 35, 23, 32, 6, 152, + 14, 35, 23, 32, 6, 196, 14, 35, 23, 32, 6, 218, 113, 14, 35, 23, 32, 6, + 72, 14, 35, 23, 32, 6, 211, 211, 14, 35, 23, 32, 6, 214, 85, 14, 35, 23, + 32, 6, 213, 169, 14, 35, 23, 32, 6, 213, 108, 14, 35, 23, 32, 6, 212, + 152, 14, 35, 23, 32, 4, 63, 14, 35, 23, 32, 4, 253, 201, 14, 35, 23, 32, + 4, 251, 121, 14, 35, 23, 32, 4, 249, 125, 14, 35, 23, 32, 4, 77, 14, 35, + 23, 32, 4, 245, 95, 14, 35, 23, 32, 4, 244, 41, 14, 35, 23, 32, 4, 242, + 162, 14, 35, 23, 32, 4, 75, 14, 35, 23, 32, 4, 236, 3, 14, 35, 23, 32, 4, + 235, 141, 14, 35, 23, 32, 4, 155, 14, 35, 23, 32, 4, 184, 14, 35, 23, 32, + 4, 206, 14, 35, 23, 32, 4, 78, 14, 35, 23, 32, 4, 227, 11, 14, 35, 23, + 32, 4, 225, 19, 14, 35, 23, 32, 4, 152, 14, 35, 23, 32, 4, 196, 14, 35, + 23, 32, 4, 218, 113, 14, 35, 23, 32, 4, 72, 14, 35, 23, 32, 4, 211, 211, + 14, 35, 23, 32, 4, 214, 85, 14, 35, 23, 32, 4, 213, 169, 14, 35, 23, 32, + 4, 213, 108, 14, 35, 23, 32, 4, 212, 152, 14, 231, 22, 6, 63, 14, 231, + 22, 6, 253, 201, 14, 231, 22, 6, 251, 121, 14, 231, 22, 6, 249, 125, 14, + 231, 22, 6, 77, 14, 231, 22, 6, 245, 95, 14, 231, 22, 6, 244, 41, 14, + 231, 22, 6, 242, 162, 14, 231, 22, 6, 75, 14, 231, 22, 6, 236, 3, 14, + 231, 22, 6, 235, 141, 14, 231, 22, 6, 155, 14, 231, 22, 6, 184, 14, 231, + 22, 6, 206, 14, 231, 22, 6, 78, 14, 231, 22, 6, 227, 11, 14, 231, 22, 6, + 225, 19, 14, 231, 22, 6, 152, 14, 231, 22, 6, 196, 14, 231, 22, 6, 218, + 113, 14, 231, 22, 6, 72, 14, 231, 22, 6, 211, 211, 14, 231, 22, 6, 214, + 85, 14, 231, 22, 6, 213, 169, 14, 231, 22, 6, 213, 108, 14, 231, 22, 6, + 212, 152, 14, 231, 22, 4, 63, 14, 231, 22, 4, 253, 201, 14, 231, 22, 4, + 251, 121, 14, 231, 22, 4, 249, 125, 14, 231, 22, 4, 77, 14, 231, 22, 4, + 245, 95, 14, 231, 22, 4, 244, 41, 14, 231, 22, 4, 242, 162, 14, 231, 22, + 4, 75, 14, 231, 22, 4, 236, 3, 14, 231, 22, 4, 235, 141, 14, 231, 22, 4, + 155, 14, 231, 22, 4, 184, 14, 231, 22, 4, 206, 14, 231, 22, 4, 78, 14, + 231, 22, 4, 227, 11, 14, 231, 22, 4, 225, 19, 14, 231, 22, 4, 152, 14, + 231, 22, 4, 196, 14, 231, 22, 4, 218, 113, 14, 231, 22, 4, 72, 14, 231, + 22, 4, 211, 211, 14, 231, 22, 4, 214, 85, 14, 231, 22, 4, 213, 169, 14, + 231, 22, 4, 213, 108, 14, 231, 22, 4, 212, 152, 14, 32, 4, 247, 194, 75, + 14, 32, 4, 247, 194, 236, 3, 14, 23, 6, 254, 179, 14, 23, 6, 252, 73, 14, + 23, 6, 243, 203, 14, 23, 6, 248, 126, 14, 23, 6, 245, 184, 14, 23, 6, + 212, 78, 14, 23, 6, 245, 149, 14, 23, 6, 217, 145, 14, 23, 6, 236, 44, + 14, 23, 6, 235, 84, 14, 23, 6, 233, 220, 14, 23, 6, 230, 242, 14, 23, 6, + 228, 135, 14, 23, 6, 213, 148, 14, 23, 6, 227, 102, 14, 23, 6, 226, 20, + 14, 23, 6, 223, 224, 14, 23, 6, 217, 146, 88, 14, 23, 6, 220, 122, 14, + 23, 6, 218, 5, 14, 23, 6, 215, 134, 14, 23, 6, 226, 45, 14, 23, 6, 250, + 170, 14, 23, 6, 225, 82, 14, 23, 6, 227, 104, 14, 23, 230, 108, 14, 23, + 4, 254, 179, 14, 23, 4, 252, 73, 14, 23, 4, 243, 203, 14, 23, 4, 248, + 126, 14, 23, 4, 245, 184, 14, 23, 4, 212, 78, 14, 23, 4, 245, 149, 14, + 23, 4, 217, 145, 14, 23, 4, 236, 44, 14, 23, 4, 235, 84, 14, 23, 4, 233, + 220, 14, 23, 4, 230, 242, 14, 23, 4, 228, 135, 14, 23, 4, 213, 148, 14, + 23, 4, 227, 102, 14, 23, 4, 226, 20, 14, 23, 4, 223, 224, 14, 23, 4, 41, + 220, 122, 14, 23, 4, 220, 122, 14, 23, 4, 218, 5, 14, 23, 4, 215, 134, + 14, 23, 4, 226, 45, 14, 23, 4, 250, 170, 14, 23, 4, 225, 82, 14, 23, 4, + 227, 104, 14, 23, 226, 162, 248, 50, 14, 23, 245, 185, 88, 14, 23, 217, + 146, 88, 14, 23, 235, 85, 88, 14, 23, 226, 46, 88, 14, 23, 223, 225, 88, + 14, 23, 226, 21, 88, 14, 32, 6, 254, 179, 14, 32, 6, 252, 73, 14, 32, 6, + 243, 203, 14, 32, 6, 248, 126, 14, 32, 6, 245, 184, 14, 32, 6, 212, 78, + 14, 32, 6, 245, 149, 14, 32, 6, 217, 145, 14, 32, 6, 236, 44, 14, 32, 6, + 235, 84, 14, 32, 6, 233, 220, 14, 32, 6, 230, 242, 14, 32, 6, 228, 135, + 14, 32, 6, 213, 148, 14, 32, 6, 227, 102, 14, 32, 6, 226, 20, 14, 32, 6, + 223, 224, 14, 32, 6, 217, 146, 88, 14, 32, 6, 220, 122, 14, 32, 6, 218, + 5, 14, 32, 6, 215, 134, 14, 32, 6, 226, 45, 14, 32, 6, 250, 170, 14, 32, + 6, 225, 82, 14, 32, 6, 227, 104, 14, 32, 230, 108, 14, 32, 4, 254, 179, + 14, 32, 4, 252, 73, 14, 32, 4, 243, 203, 14, 32, 4, 248, 126, 14, 32, 4, + 245, 184, 14, 32, 4, 212, 78, 14, 32, 4, 245, 149, 14, 32, 4, 217, 145, + 14, 32, 4, 236, 44, 14, 32, 4, 235, 84, 14, 32, 4, 233, 220, 14, 32, 4, + 230, 242, 14, 32, 4, 228, 135, 14, 32, 4, 213, 148, 14, 32, 4, 227, 102, + 14, 32, 4, 226, 20, 14, 32, 4, 223, 224, 14, 32, 4, 41, 220, 122, 14, 32, + 4, 220, 122, 14, 32, 4, 218, 5, 14, 32, 4, 215, 134, 14, 32, 4, 226, 45, + 14, 32, 4, 250, 170, 14, 32, 4, 225, 82, 14, 32, 4, 227, 104, 14, 32, + 226, 162, 248, 50, 14, 32, 245, 185, 88, 14, 32, 217, 146, 88, 14, 32, + 235, 85, 88, 14, 32, 226, 46, 88, 14, 32, 223, 225, 88, 14, 32, 226, 21, + 88, 14, 23, 32, 6, 254, 179, 14, 23, 32, 6, 252, 73, 14, 23, 32, 6, 243, + 203, 14, 23, 32, 6, 248, 126, 14, 23, 32, 6, 245, 184, 14, 23, 32, 6, + 212, 78, 14, 23, 32, 6, 245, 149, 14, 23, 32, 6, 217, 145, 14, 23, 32, 6, + 236, 44, 14, 23, 32, 6, 235, 84, 14, 23, 32, 6, 233, 220, 14, 23, 32, 6, + 230, 242, 14, 23, 32, 6, 228, 135, 14, 23, 32, 6, 213, 148, 14, 23, 32, + 6, 227, 102, 14, 23, 32, 6, 226, 20, 14, 23, 32, 6, 223, 224, 14, 23, 32, + 6, 217, 146, 88, 14, 23, 32, 6, 220, 122, 14, 23, 32, 6, 218, 5, 14, 23, + 32, 6, 215, 134, 14, 23, 32, 6, 226, 45, 14, 23, 32, 6, 250, 170, 14, 23, + 32, 6, 225, 82, 14, 23, 32, 6, 227, 104, 14, 23, 32, 230, 108, 14, 23, + 32, 4, 254, 179, 14, 23, 32, 4, 252, 73, 14, 23, 32, 4, 243, 203, 14, 23, + 32, 4, 248, 126, 14, 23, 32, 4, 245, 184, 14, 23, 32, 4, 212, 78, 14, 23, + 32, 4, 245, 149, 14, 23, 32, 4, 217, 145, 14, 23, 32, 4, 236, 44, 14, 23, + 32, 4, 235, 84, 14, 23, 32, 4, 233, 220, 14, 23, 32, 4, 230, 242, 14, 23, + 32, 4, 228, 135, 14, 23, 32, 4, 213, 148, 14, 23, 32, 4, 227, 102, 14, + 23, 32, 4, 226, 20, 14, 23, 32, 4, 223, 224, 14, 23, 32, 4, 41, 220, 122, + 14, 23, 32, 4, 220, 122, 14, 23, 32, 4, 218, 5, 14, 23, 32, 4, 215, 134, + 14, 23, 32, 4, 226, 45, 14, 23, 32, 4, 250, 170, 14, 23, 32, 4, 225, 82, + 14, 23, 32, 4, 227, 104, 14, 23, 32, 226, 162, 248, 50, 14, 23, 32, 245, + 185, 88, 14, 23, 32, 217, 146, 88, 14, 23, 32, 235, 85, 88, 14, 23, 32, + 226, 46, 88, 14, 23, 32, 223, 225, 88, 14, 23, 32, 226, 21, 88, 14, 35, + 23, 6, 254, 179, 14, 35, 23, 6, 252, 73, 14, 35, 23, 6, 243, 203, 14, 35, + 23, 6, 248, 126, 14, 35, 23, 6, 245, 184, 14, 35, 23, 6, 212, 78, 14, 35, + 23, 6, 245, 149, 14, 35, 23, 6, 217, 145, 14, 35, 23, 6, 236, 44, 14, 35, + 23, 6, 235, 84, 14, 35, 23, 6, 233, 220, 14, 35, 23, 6, 230, 242, 14, 35, + 23, 6, 228, 135, 14, 35, 23, 6, 213, 148, 14, 35, 23, 6, 227, 102, 14, + 35, 23, 6, 226, 20, 14, 35, 23, 6, 223, 224, 14, 35, 23, 6, 217, 146, 88, + 14, 35, 23, 6, 220, 122, 14, 35, 23, 6, 218, 5, 14, 35, 23, 6, 215, 134, + 14, 35, 23, 6, 226, 45, 14, 35, 23, 6, 250, 170, 14, 35, 23, 6, 225, 82, + 14, 35, 23, 6, 227, 104, 14, 35, 23, 230, 108, 14, 35, 23, 4, 254, 179, + 14, 35, 23, 4, 252, 73, 14, 35, 23, 4, 243, 203, 14, 35, 23, 4, 248, 126, + 14, 35, 23, 4, 245, 184, 14, 35, 23, 4, 212, 78, 14, 35, 23, 4, 245, 149, + 14, 35, 23, 4, 217, 145, 14, 35, 23, 4, 236, 44, 14, 35, 23, 4, 235, 84, + 14, 35, 23, 4, 233, 220, 14, 35, 23, 4, 230, 242, 14, 35, 23, 4, 228, + 135, 14, 35, 23, 4, 213, 148, 14, 35, 23, 4, 227, 102, 14, 35, 23, 4, + 226, 20, 14, 35, 23, 4, 223, 224, 14, 35, 23, 4, 41, 220, 122, 14, 35, + 23, 4, 220, 122, 14, 35, 23, 4, 218, 5, 14, 35, 23, 4, 215, 134, 14, 35, + 23, 4, 226, 45, 14, 35, 23, 4, 250, 170, 14, 35, 23, 4, 225, 82, 14, 35, + 23, 4, 227, 104, 14, 35, 23, 226, 162, 248, 50, 14, 35, 23, 245, 185, 88, + 14, 35, 23, 217, 146, 88, 14, 35, 23, 235, 85, 88, 14, 35, 23, 226, 46, + 88, 14, 35, 23, 223, 225, 88, 14, 35, 23, 226, 21, 88, 14, 35, 23, 32, 6, + 254, 179, 14, 35, 23, 32, 6, 252, 73, 14, 35, 23, 32, 6, 243, 203, 14, + 35, 23, 32, 6, 248, 126, 14, 35, 23, 32, 6, 245, 184, 14, 35, 23, 32, 6, + 212, 78, 14, 35, 23, 32, 6, 245, 149, 14, 35, 23, 32, 6, 217, 145, 14, + 35, 23, 32, 6, 236, 44, 14, 35, 23, 32, 6, 235, 84, 14, 35, 23, 32, 6, + 233, 220, 14, 35, 23, 32, 6, 230, 242, 14, 35, 23, 32, 6, 228, 135, 14, + 35, 23, 32, 6, 213, 148, 14, 35, 23, 32, 6, 227, 102, 14, 35, 23, 32, 6, + 226, 20, 14, 35, 23, 32, 6, 223, 224, 14, 35, 23, 32, 6, 217, 146, 88, + 14, 35, 23, 32, 6, 220, 122, 14, 35, 23, 32, 6, 218, 5, 14, 35, 23, 32, + 6, 215, 134, 14, 35, 23, 32, 6, 226, 45, 14, 35, 23, 32, 6, 250, 170, 14, + 35, 23, 32, 6, 225, 82, 14, 35, 23, 32, 6, 227, 104, 14, 35, 23, 32, 230, + 108, 14, 35, 23, 32, 4, 254, 179, 14, 35, 23, 32, 4, 252, 73, 14, 35, 23, + 32, 4, 243, 203, 14, 35, 23, 32, 4, 248, 126, 14, 35, 23, 32, 4, 245, + 184, 14, 35, 23, 32, 4, 212, 78, 14, 35, 23, 32, 4, 245, 149, 14, 35, 23, + 32, 4, 217, 145, 14, 35, 23, 32, 4, 236, 44, 14, 35, 23, 32, 4, 235, 84, + 14, 35, 23, 32, 4, 233, 220, 14, 35, 23, 32, 4, 230, 242, 14, 35, 23, 32, + 4, 228, 135, 14, 35, 23, 32, 4, 213, 148, 14, 35, 23, 32, 4, 227, 102, + 14, 35, 23, 32, 4, 226, 20, 14, 35, 23, 32, 4, 223, 224, 14, 35, 23, 32, + 4, 41, 220, 122, 14, 35, 23, 32, 4, 220, 122, 14, 35, 23, 32, 4, 218, 5, + 14, 35, 23, 32, 4, 215, 134, 14, 35, 23, 32, 4, 226, 45, 14, 35, 23, 32, + 4, 250, 170, 14, 35, 23, 32, 4, 225, 82, 14, 35, 23, 32, 4, 227, 104, 14, + 35, 23, 32, 226, 162, 248, 50, 14, 35, 23, 32, 245, 185, 88, 14, 35, 23, + 32, 217, 146, 88, 14, 35, 23, 32, 235, 85, 88, 14, 35, 23, 32, 226, 46, + 88, 14, 35, 23, 32, 223, 225, 88, 14, 35, 23, 32, 226, 21, 88, 14, 23, 6, + 248, 44, 14, 23, 4, 248, 44, 14, 23, 21, 212, 79, 14, 23, 21, 118, 14, + 23, 21, 112, 14, 23, 21, 170, 14, 23, 21, 167, 14, 23, 21, 185, 14, 23, + 21, 192, 14, 23, 21, 200, 14, 23, 21, 198, 14, 23, 21, 203, 14, 190, 21, + 212, 79, 14, 190, 21, 118, 14, 190, 21, 112, 14, 190, 21, 170, 14, 190, + 21, 167, 14, 190, 21, 185, 14, 190, 21, 192, 14, 190, 21, 200, 14, 190, + 21, 198, 14, 190, 21, 203, 14, 35, 21, 212, 79, 14, 35, 21, 118, 14, 35, + 21, 112, 14, 35, 21, 170, 14, 35, 21, 167, 14, 35, 21, 185, 14, 35, 21, + 192, 14, 35, 21, 200, 14, 35, 21, 198, 14, 35, 21, 203, 14, 35, 23, 21, + 212, 79, 14, 35, 23, 21, 118, 14, 35, 23, 21, 112, 14, 35, 23, 21, 170, + 14, 35, 23, 21, 167, 14, 35, 23, 21, 185, 14, 35, 23, 21, 192, 14, 35, + 23, 21, 200, 14, 35, 23, 21, 198, 14, 35, 23, 21, 203, 14, 231, 22, 21, + 212, 79, 14, 231, 22, 21, 118, 14, 231, 22, 21, 112, 14, 231, 22, 21, + 170, 14, 231, 22, 21, 167, 14, 231, 22, 21, 185, 14, 231, 22, 21, 192, + 14, 231, 22, 21, 200, 14, 231, 22, 21, 198, 14, 231, 22, 21, 203, 232, + 83, 86, 246, 41, 213, 227, 232, 83, 86, 219, 234, 213, 227, 232, 83, 86, + 213, 253, 213, 227, 232, 83, 86, 228, 210, 213, 227, 232, 83, 86, 224, + 38, 246, 171, 232, 83, 86, 242, 225, 246, 171, 232, 83, 86, 69, 246, 171, + 232, 83, 86, 124, 68, 250, 200, 232, 83, 86, 119, 68, 250, 200, 232, 83, + 86, 137, 68, 250, 200, 232, 83, 86, 244, 101, 68, 250, 200, 232, 83, 86, + 244, 170, 68, 250, 200, 232, 83, 86, 220, 72, 68, 250, 200, 232, 83, 86, + 221, 66, 68, 250, 200, 232, 83, 86, 246, 15, 68, 250, 200, 232, 83, 86, + 229, 95, 68, 250, 200, 232, 83, 86, 124, 68, 252, 199, 232, 83, 86, 119, + 68, 252, 199, 232, 83, 86, 137, 68, 252, 199, 232, 83, 86, 244, 101, 68, + 252, 199, 232, 83, 86, 244, 170, 68, 252, 199, 232, 83, 86, 220, 72, 68, + 252, 199, 232, 83, 86, 221, 66, 68, 252, 199, 232, 83, 86, 246, 15, 68, + 252, 199, 232, 83, 86, 229, 95, 68, 252, 199, 232, 83, 86, 124, 68, 250, + 94, 232, 83, 86, 119, 68, 250, 94, 232, 83, 86, 137, 68, 250, 94, 232, + 83, 86, 244, 101, 68, 250, 94, 232, 83, 86, 244, 170, 68, 250, 94, 232, + 83, 86, 220, 72, 68, 250, 94, 232, 83, 86, 221, 66, 68, 250, 94, 232, 83, + 86, 246, 15, 68, 250, 94, 232, 83, 86, 229, 95, 68, 250, 94, 232, 83, 86, + 225, 195, 232, 83, 86, 227, 60, 232, 83, 86, 252, 200, 232, 83, 86, 250, + 130, 232, 83, 86, 219, 190, 232, 83, 86, 218, 254, 232, 83, 86, 253, 222, + 232, 83, 86, 213, 220, 232, 83, 86, 235, 179, 232, 83, 86, 252, 228, 129, + 86, 201, 252, 228, 129, 86, 241, 148, 129, 86, 241, 147, 129, 86, 241, + 146, 129, 86, 241, 145, 129, 86, 241, 144, 129, 86, 241, 143, 129, 86, + 241, 142, 129, 86, 241, 141, 129, 86, 241, 140, 129, 86, 241, 139, 129, + 86, 241, 138, 129, 86, 241, 137, 129, 86, 241, 136, 129, 86, 241, 135, + 129, 86, 241, 134, 129, 86, 241, 133, 129, 86, 241, 132, 129, 86, 241, + 131, 129, 86, 241, 130, 129, 86, 241, 129, 129, 86, 241, 128, 129, 86, + 241, 127, 129, 86, 241, 126, 129, 86, 241, 125, 129, 86, 241, 124, 129, + 86, 241, 123, 129, 86, 241, 122, 129, 86, 241, 121, 129, 86, 241, 120, + 129, 86, 241, 119, 129, 86, 241, 118, 129, 86, 241, 117, 129, 86, 241, + 116, 129, 86, 241, 115, 129, 86, 241, 114, 129, 86, 241, 113, 129, 86, + 241, 112, 129, 86, 241, 111, 129, 86, 241, 110, 129, 86, 241, 109, 129, + 86, 241, 108, 129, 86, 241, 107, 129, 86, 241, 106, 129, 86, 241, 105, + 129, 86, 241, 104, 129, 86, 241, 103, 129, 86, 241, 102, 129, 86, 241, + 101, 129, 86, 241, 100, 129, 86, 66, 252, 228, 129, 86, 214, 220, 129, + 86, 214, 219, 129, 86, 214, 218, 129, 86, 214, 217, 129, 86, 214, 216, + 129, 86, 214, 215, 129, 86, 214, 214, 129, 86, 214, 213, 129, 86, 214, + 212, 129, 86, 214, 211, 129, 86, 214, 210, 129, 86, 214, 209, 129, 86, + 214, 208, 129, 86, 214, 207, 129, 86, 214, 206, 129, 86, 214, 205, 129, + 86, 214, 204, 129, 86, 214, 203, 129, 86, 214, 202, 129, 86, 214, 201, + 129, 86, 214, 200, 129, 86, 214, 199, 129, 86, 214, 198, 129, 86, 214, + 197, 129, 86, 214, 196, 129, 86, 214, 195, 129, 86, 214, 194, 129, 86, + 214, 193, 129, 86, 214, 192, 129, 86, 214, 191, 129, 86, 214, 190, 129, + 86, 214, 189, 129, 86, 214, 188, 129, 86, 214, 187, 129, 86, 214, 186, + 129, 86, 214, 185, 129, 86, 214, 184, 129, 86, 214, 183, 129, 86, 214, + 182, 129, 86, 214, 181, 129, 86, 214, 180, 129, 86, 214, 179, 129, 86, + 214, 178, 129, 86, 214, 177, 129, 86, 214, 176, 129, 86, 214, 175, 129, + 86, 214, 174, 129, 86, 214, 173, 129, 86, 214, 172, 225, 201, 251, 43, + 252, 228, 225, 201, 251, 43, 255, 41, 68, 219, 222, 225, 201, 251, 43, + 119, 68, 219, 222, 225, 201, 251, 43, 137, 68, 219, 222, 225, 201, 251, + 43, 244, 101, 68, 219, 222, 225, 201, 251, 43, 244, 170, 68, 219, 222, + 225, 201, 251, 43, 220, 72, 68, 219, 222, 225, 201, 251, 43, 221, 66, 68, + 219, 222, 225, 201, 251, 43, 246, 15, 68, 219, 222, 225, 201, 251, 43, + 229, 95, 68, 219, 222, 225, 201, 251, 43, 217, 214, 68, 219, 222, 225, + 201, 251, 43, 235, 254, 68, 219, 222, 225, 201, 251, 43, 234, 151, 68, + 219, 222, 225, 201, 251, 43, 224, 195, 68, 219, 222, 225, 201, 251, 43, + 234, 199, 68, 219, 222, 225, 201, 251, 43, 255, 41, 68, 242, 72, 225, + 201, 251, 43, 119, 68, 242, 72, 225, 201, 251, 43, 137, 68, 242, 72, 225, + 201, 251, 43, 244, 101, 68, 242, 72, 225, 201, 251, 43, 244, 170, 68, + 242, 72, 225, 201, 251, 43, 220, 72, 68, 242, 72, 225, 201, 251, 43, 221, + 66, 68, 242, 72, 225, 201, 251, 43, 246, 15, 68, 242, 72, 225, 201, 251, + 43, 229, 95, 68, 242, 72, 225, 201, 251, 43, 217, 214, 68, 242, 72, 225, + 201, 251, 43, 235, 254, 68, 242, 72, 225, 201, 251, 43, 234, 151, 68, + 242, 72, 225, 201, 251, 43, 224, 195, 68, 242, 72, 225, 201, 251, 43, + 234, 199, 68, 242, 72, 225, 201, 251, 43, 255, 41, 68, 248, 64, 225, 201, + 251, 43, 119, 68, 248, 64, 225, 201, 251, 43, 137, 68, 248, 64, 225, 201, + 251, 43, 244, 101, 68, 248, 64, 225, 201, 251, 43, 244, 170, 68, 248, 64, + 225, 201, 251, 43, 220, 72, 68, 248, 64, 225, 201, 251, 43, 221, 66, 68, + 248, 64, 225, 201, 251, 43, 246, 15, 68, 248, 64, 225, 201, 251, 43, 229, + 95, 68, 248, 64, 225, 201, 251, 43, 217, 214, 68, 248, 64, 225, 201, 251, + 43, 235, 254, 68, 248, 64, 225, 201, 251, 43, 234, 151, 68, 248, 64, 225, + 201, 251, 43, 224, 195, 68, 248, 64, 225, 201, 251, 43, 234, 199, 68, + 248, 64, 225, 201, 251, 43, 85, 235, 179, 225, 201, 251, 43, 255, 41, 68, + 250, 46, 225, 201, 251, 43, 119, 68, 250, 46, 225, 201, 251, 43, 137, 68, + 250, 46, 225, 201, 251, 43, 244, 101, 68, 250, 46, 225, 201, 251, 43, + 244, 170, 68, 250, 46, 225, 201, 251, 43, 220, 72, 68, 250, 46, 225, 201, + 251, 43, 221, 66, 68, 250, 46, 225, 201, 251, 43, 246, 15, 68, 250, 46, + 225, 201, 251, 43, 229, 95, 68, 250, 46, 225, 201, 251, 43, 217, 214, 68, + 250, 46, 225, 201, 251, 43, 235, 254, 68, 250, 46, 225, 201, 251, 43, + 234, 151, 68, 250, 46, 225, 201, 251, 43, 224, 195, 68, 250, 46, 225, + 201, 251, 43, 234, 199, 68, 250, 46, 225, 201, 251, 43, 69, 235, 179, 21, + 212, 80, 244, 64, 219, 83, 21, 212, 80, 250, 23, 21, 124, 250, 23, 21, + 119, 250, 23, 21, 137, 250, 23, 21, 244, 101, 250, 23, 21, 244, 170, 250, + 23, 21, 220, 72, 250, 23, 21, 221, 66, 250, 23, 21, 246, 15, 250, 23, 21, + 229, 95, 250, 23, 87, 7, 6, 1, 63, 87, 7, 6, 1, 253, 201, 87, 7, 6, 1, + 251, 121, 87, 7, 6, 1, 249, 125, 87, 7, 6, 1, 77, 87, 7, 6, 1, 245, 95, + 87, 7, 6, 1, 244, 41, 87, 7, 6, 1, 242, 162, 87, 7, 6, 1, 75, 87, 7, 6, + 1, 236, 3, 87, 7, 6, 1, 235, 141, 87, 7, 6, 1, 155, 87, 7, 6, 1, 184, 87, + 7, 6, 1, 206, 87, 7, 6, 1, 78, 87, 7, 6, 1, 227, 11, 87, 7, 6, 1, 225, + 19, 87, 7, 6, 1, 152, 87, 7, 6, 1, 196, 87, 7, 6, 1, 218, 113, 87, 7, 6, + 1, 72, 87, 7, 6, 1, 211, 211, 87, 7, 6, 1, 214, 85, 87, 7, 6, 1, 213, + 169, 87, 7, 6, 1, 213, 108, 87, 7, 6, 1, 212, 152, 216, 232, 220, 254, + 251, 209, 7, 6, 1, 196, 37, 32, 7, 6, 1, 251, 121, 37, 32, 7, 6, 1, 152, + 37, 250, 248, 37, 213, 171, 92, 7, 6, 1, 63, 92, 7, 6, 1, 253, 201, 92, + 7, 6, 1, 251, 121, 92, 7, 6, 1, 249, 125, 92, 7, 6, 1, 77, 92, 7, 6, 1, + 245, 95, 92, 7, 6, 1, 244, 41, 92, 7, 6, 1, 242, 162, 92, 7, 6, 1, 75, + 92, 7, 6, 1, 236, 3, 92, 7, 6, 1, 235, 141, 92, 7, 6, 1, 155, 92, 7, 6, + 1, 184, 92, 7, 6, 1, 206, 92, 7, 6, 1, 78, 92, 7, 6, 1, 227, 11, 92, 7, + 6, 1, 225, 19, 92, 7, 6, 1, 152, 92, 7, 6, 1, 196, 92, 7, 6, 1, 218, 113, + 92, 7, 6, 1, 72, 92, 7, 6, 1, 211, 211, 92, 7, 6, 1, 214, 85, 92, 7, 6, + 1, 213, 169, 92, 7, 6, 1, 213, 108, 92, 7, 6, 1, 212, 152, 92, 241, 54, + 92, 230, 189, 92, 222, 125, 92, 219, 177, 92, 225, 134, 92, 214, 10, 150, + 37, 7, 6, 1, 63, 150, 37, 7, 6, 1, 253, 201, 150, 37, 7, 6, 1, 251, 121, + 150, 37, 7, 6, 1, 249, 125, 150, 37, 7, 6, 1, 77, 150, 37, 7, 6, 1, 245, + 95, 150, 37, 7, 6, 1, 244, 41, 150, 37, 7, 6, 1, 242, 162, 150, 37, 7, 6, + 1, 75, 150, 37, 7, 6, 1, 236, 3, 150, 37, 7, 6, 1, 235, 141, 150, 37, 7, + 6, 1, 155, 150, 37, 7, 6, 1, 184, 150, 37, 7, 6, 1, 206, 150, 37, 7, 6, + 1, 78, 150, 37, 7, 6, 1, 227, 11, 150, 37, 7, 6, 1, 225, 19, 150, 37, 7, + 6, 1, 152, 150, 37, 7, 6, 1, 196, 150, 37, 7, 6, 1, 218, 113, 150, 37, 7, + 6, 1, 72, 150, 37, 7, 6, 1, 211, 211, 150, 37, 7, 6, 1, 214, 85, 150, 37, + 7, 6, 1, 213, 169, 150, 37, 7, 6, 1, 213, 108, 150, 37, 7, 6, 1, 212, + 152, 150, 92, 7, 6, 1, 63, 150, 92, 7, 6, 1, 253, 201, 150, 92, 7, 6, 1, + 251, 121, 150, 92, 7, 6, 1, 249, 125, 150, 92, 7, 6, 1, 77, 150, 92, 7, + 6, 1, 245, 95, 150, 92, 7, 6, 1, 244, 41, 150, 92, 7, 6, 1, 242, 162, + 150, 92, 7, 6, 1, 75, 150, 92, 7, 6, 1, 236, 3, 150, 92, 7, 6, 1, 235, + 141, 150, 92, 7, 6, 1, 155, 150, 92, 7, 6, 1, 184, 150, 92, 7, 6, 1, 206, + 150, 92, 7, 6, 1, 78, 150, 92, 7, 6, 1, 227, 11, 150, 92, 7, 6, 1, 225, + 19, 150, 92, 7, 6, 1, 152, 150, 92, 7, 6, 1, 196, 150, 92, 7, 6, 1, 218, + 113, 150, 92, 7, 6, 1, 72, 150, 92, 7, 6, 1, 211, 211, 150, 92, 7, 6, 1, + 214, 85, 150, 92, 7, 6, 1, 213, 169, 150, 92, 7, 6, 1, 213, 108, 150, 92, + 7, 6, 1, 212, 152, 249, 191, 150, 92, 7, 6, 1, 227, 11, 150, 92, 240, + 223, 150, 92, 195, 150, 92, 222, 227, 150, 92, 255, 57, 150, 92, 214, 10, + 42, 247, 237, 92, 250, 83, 92, 249, 232, 92, 244, 86, 92, 240, 215, 92, + 229, 235, 92, 229, 228, 92, 227, 117, 92, 219, 241, 92, 116, 2, 245, 119, + 79, 92, 214, 104, 224, 31, 236, 97, 16, 1, 63, 224, 31, 236, 97, 16, 1, + 253, 201, 224, 31, 236, 97, 16, 1, 251, 121, 224, 31, 236, 97, 16, 1, + 249, 125, 224, 31, 236, 97, 16, 1, 77, 224, 31, 236, 97, 16, 1, 245, 95, + 224, 31, 236, 97, 16, 1, 244, 41, 224, 31, 236, 97, 16, 1, 242, 162, 224, + 31, 236, 97, 16, 1, 75, 224, 31, 236, 97, 16, 1, 236, 3, 224, 31, 236, + 97, 16, 1, 235, 141, 224, 31, 236, 97, 16, 1, 155, 224, 31, 236, 97, 16, + 1, 184, 224, 31, 236, 97, 16, 1, 206, 224, 31, 236, 97, 16, 1, 78, 224, + 31, 236, 97, 16, 1, 227, 11, 224, 31, 236, 97, 16, 1, 225, 19, 224, 31, + 236, 97, 16, 1, 152, 224, 31, 236, 97, 16, 1, 196, 224, 31, 236, 97, 16, + 1, 218, 113, 224, 31, 236, 97, 16, 1, 72, 224, 31, 236, 97, 16, 1, 211, + 211, 224, 31, 236, 97, 16, 1, 214, 85, 224, 31, 236, 97, 16, 1, 213, 169, + 224, 31, 236, 97, 16, 1, 213, 108, 224, 31, 236, 97, 16, 1, 212, 152, 42, + 136, 241, 168, 92, 56, 234, 138, 92, 56, 222, 227, 92, 9, 215, 154, 238, + 160, 92, 9, 215, 154, 238, 164, 92, 9, 215, 154, 238, 172, 92, 56, 248, + 162, 92, 9, 215, 154, 238, 179, 92, 9, 215, 154, 238, 166, 92, 9, 215, + 154, 238, 138, 92, 9, 215, 154, 238, 165, 92, 9, 215, 154, 238, 178, 92, + 9, 215, 154, 238, 152, 92, 9, 215, 154, 238, 145, 92, 9, 215, 154, 238, + 154, 92, 9, 215, 154, 238, 175, 92, 9, 215, 154, 238, 161, 92, 9, 215, + 154, 238, 177, 92, 9, 215, 154, 238, 153, 92, 9, 215, 154, 238, 176, 92, + 9, 215, 154, 238, 139, 92, 9, 215, 154, 238, 144, 92, 9, 215, 154, 238, + 137, 92, 9, 215, 154, 238, 167, 92, 9, 215, 154, 238, 169, 92, 9, 215, + 154, 238, 147, 92, 9, 215, 154, 238, 158, 92, 9, 215, 154, 238, 156, 92, + 9, 215, 154, 238, 182, 92, 9, 215, 154, 238, 181, 92, 9, 215, 154, 238, + 135, 92, 9, 215, 154, 238, 162, 92, 9, 215, 154, 238, 180, 92, 9, 215, + 154, 238, 171, 92, 9, 215, 154, 238, 157, 92, 9, 215, 154, 238, 136, 92, + 9, 215, 154, 238, 159, 92, 9, 215, 154, 238, 141, 92, 9, 215, 154, 238, + 140, 92, 9, 215, 154, 238, 170, 92, 9, 215, 154, 238, 148, 92, 9, 215, + 154, 238, 150, 92, 9, 215, 154, 238, 151, 92, 9, 215, 154, 238, 143, 92, + 9, 215, 154, 238, 174, 92, 9, 215, 154, 238, 168, 216, 232, 220, 254, + 251, 209, 9, 215, 154, 238, 149, 216, 232, 220, 254, 251, 209, 9, 215, + 154, 238, 181, 216, 232, 220, 254, 251, 209, 9, 215, 154, 238, 179, 216, + 232, 220, 254, 251, 209, 9, 215, 154, 238, 163, 216, 232, 220, 254, 251, + 209, 9, 215, 154, 238, 146, 216, 232, 220, 254, 251, 209, 9, 215, 154, + 238, 159, 216, 232, 220, 254, 251, 209, 9, 215, 154, 238, 142, 216, 232, + 220, 254, 251, 209, 9, 215, 154, 238, 173, 216, 232, 220, 254, 251, 209, + 9, 215, 154, 238, 155, 37, 147, 255, 22, 37, 147, 255, 44, 249, 136, 244, + 131, 250, 60, 215, 170, 229, 108, 2, 219, 106, 218, 247, 113, 230, 254, + 218, 246, 250, 86, 253, 250, 246, 130, 218, 245, 113, 251, 172, 224, 84, + 251, 193, 253, 250, 229, 107, 214, 28, 214, 22, 214, 116, 231, 78, 214, + 12, 246, 45, 243, 21, 245, 133, 246, 45, 243, 21, 254, 164, 246, 45, 243, + 21, 254, 11, 243, 21, 2, 231, 185, 163, 231, 13, 88, 214, 14, 249, 200, + 231, 13, 88, 244, 181, 224, 202, 231, 13, 88, 214, 14, 243, 50, 231, 13, + 88, 244, 64, 231, 13, 88, 214, 39, 243, 50, 231, 13, 88, 233, 202, 224, + 202, 231, 13, 88, 214, 39, 249, 200, 231, 13, 88, 249, 200, 231, 12, 163, + 231, 13, 2, 245, 23, 244, 181, 224, 202, 231, 13, 2, 245, 23, 233, 202, + 224, 202, 231, 13, 2, 245, 23, 244, 64, 231, 13, 2, 245, 23, 218, 253, 2, + 245, 23, 243, 19, 219, 109, 220, 200, 219, 109, 250, 176, 222, 110, 245, + 127, 216, 206, 248, 156, 216, 206, 226, 223, 216, 206, 251, 82, 216, 81, + 250, 178, 252, 2, 223, 127, 242, 27, 218, 250, 252, 2, 246, 49, 68, 232, + 72, 246, 49, 68, 223, 218, 242, 51, 244, 101, 233, 176, 250, 50, 232, 48, + 233, 175, 245, 9, 233, 175, 233, 176, 244, 136, 236, 113, 213, 227, 230, + 198, 217, 2, 253, 234, 242, 239, 231, 201, 214, 26, 218, 21, 233, 148, + 252, 195, 225, 230, 224, 38, 254, 94, 242, 225, 254, 94, 226, 128, 226, + 129, 250, 179, 219, 68, 242, 126, 220, 37, 68, 225, 212, 231, 222, 227, + 100, 251, 244, 225, 145, 233, 158, 223, 219, 249, 205, 223, 219, 252, + 205, 249, 235, 223, 218, 249, 159, 22, 223, 218, 219, 95, 251, 218, 219, + 221, 251, 203, 244, 85, 244, 81, 223, 142, 218, 205, 225, 147, 248, 242, + 227, 138, 218, 222, 244, 82, 220, 175, 244, 180, 251, 77, 2, 218, 198, + 248, 107, 219, 255, 240, 222, 249, 204, 221, 15, 240, 221, 240, 222, 249, + 204, 246, 183, 249, 234, 250, 144, 134, 251, 54, 233, 12, 249, 153, 241, + 160, 225, 149, 220, 185, 252, 83, 251, 214, 225, 150, 68, 244, 122, 249, + 233, 244, 113, 22, 234, 152, 217, 240, 213, 219, 242, 116, 222, 207, 251, + 228, 22, 249, 166, 213, 225, 243, 24, 250, 39, 243, 24, 216, 164, 246, + 166, 252, 108, 230, 233, 250, 67, 252, 108, 230, 232, 252, 231, 251, 227, + 223, 220, 213, 192, 225, 111, 252, 27, 251, 76, 235, 253, 250, 137, 216, + 206, 244, 251, 250, 136, 244, 183, 244, 184, 219, 219, 252, 204, 226, + 159, 225, 160, 250, 9, 252, 205, 218, 23, 216, 206, 249, 191, 244, 156, + 225, 231, 248, 153, 235, 247, 247, 206, 251, 32, 219, 67, 213, 228, 250, + 158, 231, 13, 214, 149, 250, 219, 222, 140, 222, 165, 242, 244, 251, 51, + 251, 33, 241, 94, 244, 219, 213, 244, 223, 136, 250, 40, 244, 175, 225, + 172, 22, 244, 179, 231, 110, 230, 248, 251, 66, 250, 99, 242, 79, 254, + 27, 226, 226, 216, 240, 242, 98, 250, 89, 217, 208, 217, 80, 250, 80, + 251, 250, 226, 88, 254, 26, 214, 155, 243, 206, 248, 14, 242, 5, 220, 31, + 232, 112, 252, 37, 243, 207, 248, 57, 251, 217, 244, 141, 225, 201, 251, + 41, 27, 228, 201, 230, 225, 27, 228, 196, 222, 153, 242, 201, 27, 234, + 255, 216, 161, 214, 139, 27, 222, 134, 223, 61, 220, 212, 2, 222, 167, + 217, 210, 224, 103, 22, 252, 205, 220, 52, 22, 220, 52, 251, 237, 252, + 169, 22, 241, 154, 250, 180, 244, 162, 220, 10, 223, 62, 218, 226, 216, + 165, 241, 95, 224, 104, 254, 165, 244, 120, 223, 73, 244, 120, 218, 200, + 241, 84, 251, 173, 241, 84, 2, 243, 190, 227, 132, 251, 173, 235, 247, + 225, 155, 227, 131, 245, 132, 225, 155, 227, 131, 241, 93, 252, 191, 253, + 224, 217, 218, 232, 112, 241, 89, 232, 240, 241, 89, 249, 238, 219, 79, + 222, 139, 248, 115, 219, 79, 245, 13, 236, 8, 233, 211, 235, 247, 251, + 26, 245, 132, 251, 26, 224, 68, 230, 252, 227, 20, 214, 28, 251, 177, + 249, 207, 217, 73, 233, 140, 224, 105, 251, 24, 246, 171, 249, 198, 213, + 247, 220, 17, 220, 15, 241, 94, 224, 80, 243, 10, 221, 2, 231, 29, 223, + 130, 250, 168, 247, 211, 225, 241, 251, 251, 245, 247, 227, 140, 219, + 203, 220, 253, 251, 176, 254, 130, 241, 159, 233, 242, 252, 106, 244, + 179, 216, 164, 244, 179, 252, 1, 216, 63, 242, 96, 250, 169, 252, 231, + 250, 169, 244, 76, 252, 231, 250, 169, 252, 29, 226, 106, 234, 146, 225, + 164, 246, 163, 251, 67, 252, 222, 251, 67, 247, 205, 230, 253, 245, 23, + 249, 208, 245, 23, 217, 74, 245, 23, 224, 106, 245, 23, 251, 25, 245, 23, + 246, 172, 245, 23, 219, 192, 213, 247, 241, 95, 245, 23, 231, 30, 245, + 23, 247, 212, 245, 23, 225, 242, 245, 23, 244, 79, 245, 23, 242, 123, + 245, 23, 213, 214, 245, 23, 252, 117, 245, 23, 226, 209, 245, 23, 225, + 242, 228, 207, 226, 142, 225, 103, 245, 102, 246, 48, 228, 207, 230, 250, + 216, 245, 69, 116, 225, 177, 252, 226, 236, 100, 69, 121, 225, 177, 252, + 226, 236, 100, 69, 43, 225, 177, 252, 226, 236, 100, 69, 47, 225, 177, + 252, 226, 236, 100, 244, 173, 242, 119, 53, 214, 20, 242, 119, 53, 227, + 118, 242, 119, 53, 217, 102, 116, 53, 217, 102, 121, 53, 250, 79, 242, + 114, 53, 210, 242, 114, 53, 249, 186, 213, 210, 242, 98, 245, 103, 229, + 252, 218, 112, 235, 241, 246, 168, 234, 202, 252, 39, 213, 210, 250, 53, + 225, 50, 242, 117, 225, 146, 232, 55, 220, 205, 253, 246, 220, 205, 242, + 13, 220, 205, 213, 210, 222, 180, 213, 210, 251, 236, 244, 118, 251, 144, + 236, 113, 220, 114, 251, 143, 236, 113, 220, 114, 251, 213, 243, 34, 232, + 63, 213, 211, 245, 7, 232, 64, 22, 213, 212, 241, 165, 242, 113, 119, + 231, 193, 241, 165, 242, 113, 119, 213, 209, 241, 165, 242, 113, 225, + 169, 227, 130, 213, 212, 2, 251, 160, 246, 46, 251, 194, 2, 214, 228, + 226, 80, 2, 252, 4, 242, 136, 232, 64, 2, 242, 210, 226, 21, 232, 52, + 232, 64, 2, 216, 69, 227, 111, 232, 63, 227, 111, 213, 211, 252, 230, + 249, 252, 213, 195, 225, 106, 235, 247, 227, 126, 235, 247, 243, 9, 243, + 62, 252, 231, 254, 149, 245, 107, 254, 196, 254, 197, 231, 20, 236, 118, + 220, 47, 236, 90, 248, 106, 226, 79, 242, 207, 248, 246, 233, 71, 230, + 98, 225, 168, 245, 24, 232, 20, 242, 135, 252, 184, 225, 171, 218, 131, + 225, 234, 234, 184, 79, 232, 240, 233, 132, 223, 164, 243, 150, 219, 85, + 234, 183, 251, 222, 249, 210, 2, 242, 74, 214, 6, 252, 115, 242, 74, 251, + 188, 242, 74, 119, 242, 72, 219, 217, 242, 74, 242, 219, 242, 74, 242, + 75, 2, 71, 252, 0, 242, 74, 242, 225, 242, 74, 213, 34, 242, 74, 225, 51, + 242, 74, 242, 75, 2, 223, 220, 223, 231, 242, 72, 242, 75, 248, 153, 248, + 66, 221, 27, 2, 111, 62, 236, 73, 245, 250, 182, 251, 170, 254, 148, 88, + 251, 245, 220, 39, 88, 250, 32, 88, 219, 197, 218, 207, 88, 246, 161, + 248, 224, 88, 225, 235, 68, 225, 165, 244, 150, 252, 51, 247, 238, 88, + 219, 210, 252, 204, 217, 115, 252, 204, 69, 244, 140, 241, 63, 225, 175, + 88, 231, 33, 252, 217, 249, 162, 245, 120, 110, 247, 207, 53, 249, 202, + 251, 42, 252, 190, 2, 213, 32, 53, 252, 190, 2, 247, 207, 53, 252, 190, + 2, 245, 135, 53, 252, 190, 2, 225, 144, 53, 231, 33, 2, 213, 223, 250, + 197, 2, 215, 130, 216, 202, 22, 213, 32, 53, 222, 120, 226, 78, 250, 13, + 251, 192, 231, 69, 244, 145, 248, 2, 227, 65, 248, 7, 246, 125, 244, 196, + 244, 129, 210, 244, 196, 244, 129, 226, 239, 2, 249, 164, 226, 239, 245, + 16, 215, 140, 251, 72, 217, 239, 251, 72, 251, 43, 236, 100, 250, 197, 2, + 215, 130, 216, 201, 250, 197, 2, 246, 179, 216, 201, 252, 187, 250, 196, + 250, 66, 225, 46, 223, 121, 225, 46, 226, 184, 219, 75, 223, 68, 216, + 193, 223, 68, 251, 241, 218, 53, 233, 173, 228, 199, 228, 200, 2, 248, + 152, 249, 209, 250, 60, 251, 242, 210, 251, 242, 242, 225, 251, 242, 252, + 0, 251, 242, 227, 61, 251, 242, 251, 239, 230, 93, 252, 220, 222, 128, + 231, 194, 217, 223, 224, 50, 226, 237, 244, 248, 232, 112, 222, 164, 254, + 127, 225, 67, 255, 29, 232, 242, 250, 186, 231, 206, 227, 35, 216, 209, + 236, 109, 216, 209, 226, 244, 246, 101, 88, 236, 106, 245, 199, 245, 200, + 2, 246, 179, 80, 50, 250, 60, 232, 78, 2, 232, 236, 244, 162, 250, 60, + 232, 78, 2, 224, 83, 244, 162, 210, 232, 78, 2, 224, 83, 244, 162, 210, + 232, 78, 2, 232, 236, 244, 162, 225, 152, 225, 153, 241, 97, 229, 233, + 231, 43, 226, 29, 231, 43, 226, 30, 2, 96, 80, 253, 250, 233, 168, 214, + 158, 231, 42, 231, 43, 226, 30, 227, 133, 228, 229, 231, 43, 226, 28, + 254, 128, 2, 252, 175, 251, 66, 214, 155, 251, 66, 217, 220, 224, 98, + 214, 154, 216, 32, 96, 254, 33, 250, 62, 96, 22, 135, 210, 250, 96, 254, + 33, 250, 62, 96, 22, 135, 210, 250, 96, 254, 34, 2, 37, 124, 227, 26, + 250, 62, 246, 179, 22, 215, 130, 210, 250, 96, 254, 33, 254, 126, 246, + 179, 22, 215, 130, 210, 250, 96, 254, 33, 117, 251, 191, 88, 127, 251, + 191, 88, 219, 214, 2, 251, 60, 91, 219, 213, 219, 214, 2, 124, 219, 237, + 214, 22, 219, 214, 2, 137, 219, 237, 214, 21, 252, 161, 245, 250, 225, + 197, 233, 164, 232, 89, 243, 24, 223, 178, 232, 89, 243, 24, 233, 22, 2, + 236, 83, 226, 110, 250, 60, 233, 22, 2, 235, 0, 235, 0, 233, 21, 210, + 233, 21, 252, 91, 252, 92, 2, 251, 60, 91, 251, 240, 233, 74, 88, 224, + 99, 251, 140, 252, 229, 2, 135, 80, 50, 245, 222, 2, 135, 80, 50, 227, + 100, 2, 245, 119, 156, 2, 43, 47, 80, 50, 219, 244, 2, 96, 80, 50, 216, + 240, 2, 215, 130, 80, 50, 228, 229, 124, 215, 160, 246, 13, 88, 234, 254, + 217, 213, 236, 77, 16, 31, 7, 6, 233, 131, 236, 77, 16, 31, 7, 4, 233, + 131, 236, 77, 16, 31, 228, 98, 236, 77, 16, 31, 218, 142, 236, 77, 16, + 31, 7, 233, 131, 244, 185, 245, 250, 216, 235, 213, 190, 242, 124, 228, + 81, 22, 251, 246, 241, 171, 225, 218, 231, 109, 217, 221, 249, 177, 252, + 205, 220, 72, 225, 179, 219, 110, 2, 231, 107, 247, 195, 235, 247, 16, + 31, 252, 103, 216, 191, 245, 235, 85, 42, 251, 140, 69, 42, 251, 140, + 233, 207, 224, 38, 250, 95, 233, 207, 252, 0, 250, 95, 233, 207, 227, 61, + 248, 65, 233, 207, 252, 0, 248, 65, 4, 227, 61, 248, 65, 4, 252, 0, 248, + 65, 215, 139, 224, 38, 216, 196, 246, 180, 224, 38, 216, 196, 215, 139, + 4, 224, 38, 216, 196, 246, 180, 4, 224, 38, 216, 196, 250, 64, 245, 24, + 124, 227, 143, 250, 64, 245, 24, 119, 227, 143, 250, 64, 245, 24, 137, + 227, 143, 250, 64, 245, 24, 244, 101, 227, 143, 250, 64, 245, 24, 244, + 170, 227, 143, 250, 64, 245, 24, 220, 72, 227, 143, 250, 64, 245, 24, + 221, 66, 227, 143, 250, 64, 245, 24, 246, 15, 227, 143, 250, 64, 245, 24, + 229, 95, 227, 143, 250, 64, 245, 24, 217, 214, 227, 143, 250, 64, 245, + 24, 245, 246, 227, 143, 250, 64, 245, 24, 216, 49, 227, 143, 250, 64, + 245, 24, 227, 95, 250, 64, 245, 24, 216, 29, 250, 64, 245, 24, 217, 107, + 250, 64, 245, 24, 244, 97, 250, 64, 245, 24, 244, 168, 250, 64, 245, 24, + 220, 68, 250, 64, 245, 24, 221, 65, 250, 64, 245, 24, 246, 14, 250, 64, + 245, 24, 229, 94, 250, 64, 245, 24, 217, 212, 250, 64, 245, 24, 245, 244, + 250, 64, 245, 24, 216, 47, 231, 1, 244, 65, 217, 4, 216, 228, 219, 102, + 68, 233, 109, 220, 115, 68, 235, 248, 230, 246, 242, 223, 245, 24, 2, + 220, 21, 245, 102, 245, 24, 2, 217, 235, 68, 235, 170, 220, 21, 245, 24, + 2, 210, 230, 250, 220, 21, 245, 24, 2, 210, 230, 251, 22, 220, 21, 245, + 102, 220, 21, 245, 24, 2, 210, 230, 251, 22, 250, 34, 218, 206, 220, 21, + 245, 24, 2, 210, 230, 251, 22, 217, 71, 245, 102, 220, 21, 245, 24, 2, + 242, 128, 220, 21, 245, 24, 2, 241, 96, 213, 221, 245, 23, 220, 21, 245, + 24, 2, 220, 21, 245, 102, 245, 24, 222, 158, 248, 134, 244, 122, 224, 16, + 245, 23, 220, 21, 245, 24, 2, 242, 73, 245, 102, 220, 21, 245, 24, 2, + 218, 248, 220, 20, 245, 23, 229, 236, 245, 23, 215, 164, 245, 23, 245, + 24, 2, 250, 34, 218, 206, 226, 103, 245, 23, 250, 7, 245, 23, 245, 24, + 217, 104, 111, 234, 183, 234, 182, 245, 24, 2, 250, 60, 245, 102, 245, + 24, 2, 219, 45, 216, 246, 22, 213, 221, 245, 104, 245, 24, 2, 219, 45, + 216, 246, 22, 217, 71, 245, 102, 248, 9, 245, 23, 254, 144, 245, 23, 225, + 143, 245, 23, 249, 179, 245, 23, 226, 82, 245, 23, 245, 24, 2, 232, 253, + 68, 216, 175, 248, 9, 251, 142, 224, 16, 245, 23, 244, 241, 245, 23, 214, + 7, 245, 23, 220, 38, 245, 23, 217, 38, 245, 23, 232, 243, 249, 179, 245, + 23, 245, 24, 2, 210, 230, 251, 22, 250, 34, 218, 206, 245, 24, 222, 132, + 236, 113, 244, 242, 254, 0, 245, 23, 244, 138, 245, 23, 247, 238, 245, + 23, 245, 24, 213, 219, 230, 250, 245, 24, 2, 231, 219, 232, 22, 242, 223, + 251, 25, 245, 24, 2, 220, 21, 245, 102, 251, 25, 245, 24, 2, 217, 235, + 68, 235, 170, 220, 21, 251, 25, 245, 24, 2, 210, 230, 250, 220, 21, 251, + 25, 245, 24, 2, 242, 73, 245, 102, 251, 25, 245, 24, 2, 213, 187, 220, + 22, 234, 182, 251, 25, 245, 24, 2, 250, 60, 245, 102, 225, 143, 251, 25, + 245, 23, 249, 179, 251, 25, 245, 23, 214, 7, 251, 25, 245, 23, 245, 24, + 2, 228, 229, 243, 3, 243, 130, 245, 24, 2, 227, 118, 243, 130, 226, 80, + 251, 219, 248, 147, 222, 111, 231, 29, 242, 76, 231, 29, 219, 215, 231, + 29, 242, 108, 226, 80, 224, 82, 124, 242, 118, 226, 80, 224, 82, 251, + 229, 242, 114, 236, 113, 250, 236, 226, 80, 244, 72, 226, 80, 2, 225, + 143, 245, 23, 226, 80, 2, 244, 130, 242, 113, 223, 138, 242, 61, 219, 97, + 233, 20, 224, 88, 251, 44, 242, 11, 216, 218, 242, 11, 216, 219, 2, 251, + 168, 228, 207, 216, 218, 231, 169, 182, 224, 89, 219, 103, 216, 216, 216, + 217, 251, 44, 251, 146, 227, 97, 251, 146, 216, 172, 251, 147, 219, 83, + 231, 70, 254, 166, 244, 186, 245, 216, 225, 169, 251, 44, 227, 97, 225, + 169, 251, 44, 217, 252, 227, 97, 217, 252, 253, 223, 227, 97, 253, 223, + 224, 45, 214, 229, 248, 130, 216, 163, 254, 28, 232, 246, 216, 224, 231, + 23, 231, 0, 224, 87, 218, 221, 224, 87, 231, 0, 251, 83, 255, 6, 216, + 215, 220, 217, 223, 118, 219, 208, 201, 216, 222, 233, 100, 66, 216, 222, + 233, 100, 249, 252, 53, 225, 169, 251, 29, 223, 231, 233, 100, 216, 193, + 244, 163, 227, 100, 225, 154, 247, 198, 228, 229, 245, 205, 53, 220, 19, + 88, 228, 229, 220, 19, 88, 225, 45, 233, 63, 236, 113, 236, 16, 225, 209, + 88, 247, 221, 228, 206, 233, 63, 88, 225, 148, 214, 28, 88, 228, 220, + 214, 28, 88, 252, 50, 228, 229, 252, 49, 252, 48, 231, 0, 252, 48, 226, + 124, 228, 229, 226, 123, 250, 160, 249, 187, 231, 190, 88, 213, 208, 88, + 223, 245, 252, 231, 88, 217, 5, 214, 28, 250, 57, 220, 179, 252, 164, + 252, 162, 226, 152, 249, 239, 249, 151, 252, 214, 250, 82, 43, 232, 222, + 106, 16, 31, 224, 183, 106, 16, 31, 254, 227, 106, 16, 31, 244, 185, 106, + 16, 31, 246, 44, 106, 16, 31, 214, 27, 106, 16, 31, 254, 84, 106, 16, 31, + 254, 85, 224, 33, 106, 16, 31, 254, 85, 224, 32, 106, 16, 31, 254, 85, + 214, 128, 106, 16, 31, 254, 85, 214, 127, 106, 16, 31, 214, 142, 106, 16, + 31, 214, 141, 106, 16, 31, 214, 140, 106, 16, 31, 219, 3, 106, 16, 31, + 226, 37, 219, 3, 106, 16, 31, 85, 219, 3, 106, 16, 31, 231, 189, 219, 30, + 106, 16, 31, 231, 189, 219, 29, 106, 16, 31, 231, 189, 219, 28, 106, 16, + 31, 250, 98, 106, 16, 31, 222, 196, 106, 16, 31, 229, 83, 106, 16, 31, + 214, 126, 106, 16, 31, 214, 125, 106, 16, 31, 223, 139, 222, 196, 106, + 16, 31, 223, 139, 222, 195, 106, 16, 31, 243, 6, 106, 16, 31, 220, 111, + 106, 16, 31, 236, 36, 227, 58, 106, 16, 31, 236, 36, 227, 57, 106, 16, + 31, 249, 197, 68, 236, 35, 106, 16, 31, 224, 29, 68, 236, 35, 106, 16, + 31, 249, 230, 227, 58, 106, 16, 31, 236, 34, 227, 58, 106, 16, 31, 219, + 31, 68, 249, 229, 106, 16, 31, 249, 197, 68, 249, 229, 106, 16, 31, 249, + 197, 68, 249, 228, 106, 16, 31, 249, 230, 254, 121, 106, 16, 31, 222, + 197, 68, 249, 230, 254, 121, 106, 16, 31, 219, 31, 68, 222, 197, 68, 249, + 229, 106, 16, 31, 214, 225, 106, 16, 31, 217, 51, 227, 58, 106, 16, 31, + 233, 179, 227, 58, 106, 16, 31, 254, 120, 227, 58, 106, 16, 31, 219, 31, + 68, 254, 119, 106, 16, 31, 222, 197, 68, 254, 119, 106, 16, 31, 219, 31, + 68, 222, 197, 68, 254, 119, 106, 16, 31, 214, 143, 68, 254, 119, 106, 16, + 31, 224, 29, 68, 254, 119, 106, 16, 31, 224, 29, 68, 254, 118, 106, 16, + 31, 224, 28, 106, 16, 31, 224, 27, 106, 16, 31, 224, 26, 106, 16, 31, + 224, 25, 106, 16, 31, 254, 193, 106, 16, 31, 254, 192, 106, 16, 31, 232, + 41, 106, 16, 31, 222, 202, 106, 16, 31, 254, 32, 106, 16, 31, 224, 52, + 106, 16, 31, 224, 51, 106, 16, 31, 253, 226, 106, 16, 31, 252, 21, 227, + 58, 106, 16, 31, 218, 13, 106, 16, 31, 218, 12, 106, 16, 31, 224, 188, + 233, 92, 106, 16, 31, 251, 234, 106, 16, 31, 251, 233, 106, 16, 31, 251, + 232, 106, 16, 31, 254, 174, 106, 16, 31, 227, 121, 106, 16, 31, 219, 199, + 106, 16, 31, 217, 49, 106, 16, 31, 242, 198, 106, 16, 31, 214, 15, 106, + 16, 31, 225, 142, 106, 16, 31, 251, 70, 106, 16, 31, 216, 58, 106, 16, + 31, 251, 46, 231, 6, 106, 16, 31, 222, 143, 68, 235, 172, 106, 16, 31, + 251, 80, 106, 16, 31, 216, 190, 106, 16, 31, 219, 107, 216, 190, 106, 16, + 31, 233, 19, 106, 16, 31, 220, 3, 106, 16, 31, 215, 119, 106, 16, 31, + 241, 95, 246, 140, 106, 16, 31, 254, 13, 106, 16, 31, 225, 150, 254, 13, + 106, 16, 31, 251, 195, 106, 16, 31, 225, 141, 251, 195, 106, 16, 31, 254, + 171, 106, 16, 31, 219, 71, 218, 240, 219, 70, 106, 16, 31, 219, 71, 218, + 240, 219, 69, 106, 16, 31, 219, 27, 106, 16, 31, 225, 116, 106, 16, 31, + 247, 254, 106, 16, 31, 248, 0, 106, 16, 31, 247, 255, 106, 16, 31, 225, + 53, 106, 16, 31, 225, 43, 106, 16, 31, 249, 185, 106, 16, 31, 249, 184, + 106, 16, 31, 249, 183, 106, 16, 31, 249, 182, 106, 16, 31, 249, 181, 106, + 16, 31, 254, 204, 106, 16, 31, 252, 165, 68, 232, 27, 106, 16, 31, 252, + 165, 68, 214, 255, 106, 16, 31, 223, 243, 106, 16, 31, 241, 87, 106, 16, + 31, 229, 107, 106, 16, 31, 248, 212, 106, 16, 31, 231, 18, 106, 16, 31, + 157, 246, 170, 106, 16, 31, 157, 227, 38, 9, 13, 240, 212, 9, 13, 240, + 211, 9, 13, 240, 210, 9, 13, 240, 209, 9, 13, 240, 208, 9, 13, 240, 207, + 9, 13, 240, 206, 9, 13, 240, 205, 9, 13, 240, 204, 9, 13, 240, 203, 9, + 13, 240, 202, 9, 13, 240, 201, 9, 13, 240, 200, 9, 13, 240, 199, 9, 13, + 240, 198, 9, 13, 240, 197, 9, 13, 240, 196, 9, 13, 240, 195, 9, 13, 240, + 194, 9, 13, 240, 193, 9, 13, 240, 192, 9, 13, 240, 191, 9, 13, 240, 190, + 9, 13, 240, 189, 9, 13, 240, 188, 9, 13, 240, 187, 9, 13, 240, 186, 9, + 13, 240, 185, 9, 13, 240, 184, 9, 13, 240, 183, 9, 13, 240, 182, 9, 13, + 240, 181, 9, 13, 240, 180, 9, 13, 240, 179, 9, 13, 240, 178, 9, 13, 240, + 177, 9, 13, 240, 176, 9, 13, 240, 175, 9, 13, 240, 174, 9, 13, 240, 173, + 9, 13, 240, 172, 9, 13, 240, 171, 9, 13, 240, 170, 9, 13, 240, 169, 9, + 13, 240, 168, 9, 13, 240, 167, 9, 13, 240, 166, 9, 13, 240, 165, 9, 13, + 240, 164, 9, 13, 240, 163, 9, 13, 240, 162, 9, 13, 240, 161, 9, 13, 240, + 160, 9, 13, 240, 159, 9, 13, 240, 158, 9, 13, 240, 157, 9, 13, 240, 156, + 9, 13, 240, 155, 9, 13, 240, 154, 9, 13, 240, 153, 9, 13, 240, 152, 9, + 13, 240, 151, 9, 13, 240, 150, 9, 13, 240, 149, 9, 13, 240, 148, 9, 13, + 240, 147, 9, 13, 240, 146, 9, 13, 240, 145, 9, 13, 240, 144, 9, 13, 240, + 143, 9, 13, 240, 142, 9, 13, 240, 141, 9, 13, 240, 140, 9, 13, 240, 139, + 9, 13, 240, 138, 9, 13, 240, 137, 9, 13, 240, 136, 9, 13, 240, 135, 9, + 13, 240, 134, 9, 13, 240, 133, 9, 13, 240, 132, 9, 13, 240, 131, 9, 13, + 240, 130, 9, 13, 240, 129, 9, 13, 240, 128, 9, 13, 240, 127, 9, 13, 240, + 126, 9, 13, 240, 125, 9, 13, 240, 124, 9, 13, 240, 123, 9, 13, 240, 122, + 9, 13, 240, 121, 9, 13, 240, 120, 9, 13, 240, 119, 9, 13, 240, 118, 9, + 13, 240, 117, 9, 13, 240, 116, 9, 13, 240, 115, 9, 13, 240, 114, 9, 13, + 240, 113, 9, 13, 240, 112, 9, 13, 240, 111, 9, 13, 240, 110, 9, 13, 240, + 109, 9, 13, 240, 108, 9, 13, 240, 107, 9, 13, 240, 106, 9, 13, 240, 105, + 9, 13, 240, 104, 9, 13, 240, 103, 9, 13, 240, 102, 9, 13, 240, 101, 9, + 13, 240, 100, 9, 13, 240, 99, 9, 13, 240, 98, 9, 13, 240, 97, 9, 13, 240, + 96, 9, 13, 240, 95, 9, 13, 240, 94, 9, 13, 240, 93, 9, 13, 240, 92, 9, + 13, 240, 91, 9, 13, 240, 90, 9, 13, 240, 89, 9, 13, 240, 88, 9, 13, 240, + 87, 9, 13, 240, 86, 9, 13, 240, 85, 9, 13, 240, 84, 9, 13, 240, 83, 9, + 13, 240, 82, 9, 13, 240, 81, 9, 13, 240, 80, 9, 13, 240, 79, 9, 13, 240, + 78, 9, 13, 240, 77, 9, 13, 240, 76, 9, 13, 240, 75, 9, 13, 240, 74, 9, + 13, 240, 73, 9, 13, 240, 72, 9, 13, 240, 71, 9, 13, 240, 70, 9, 13, 240, + 69, 9, 13, 240, 68, 9, 13, 240, 67, 9, 13, 240, 66, 9, 13, 240, 65, 9, + 13, 240, 64, 9, 13, 240, 63, 9, 13, 240, 62, 9, 13, 240, 61, 9, 13, 240, + 60, 9, 13, 240, 59, 9, 13, 240, 58, 9, 13, 240, 57, 9, 13, 240, 56, 9, + 13, 240, 55, 9, 13, 240, 54, 9, 13, 240, 53, 9, 13, 240, 52, 9, 13, 240, + 51, 9, 13, 240, 50, 9, 13, 240, 49, 9, 13, 240, 48, 9, 13, 240, 47, 9, + 13, 240, 46, 9, 13, 240, 45, 9, 13, 240, 44, 9, 13, 240, 43, 9, 13, 240, + 42, 9, 13, 240, 41, 9, 13, 240, 40, 9, 13, 240, 39, 9, 13, 240, 38, 9, + 13, 240, 37, 9, 13, 240, 36, 9, 13, 240, 35, 9, 13, 240, 34, 9, 13, 240, + 33, 9, 13, 240, 32, 9, 13, 240, 31, 9, 13, 240, 30, 9, 13, 240, 29, 9, + 13, 240, 28, 9, 13, 240, 27, 9, 13, 240, 26, 9, 13, 240, 25, 9, 13, 240, + 24, 9, 13, 240, 23, 9, 13, 240, 22, 9, 13, 240, 21, 9, 13, 240, 20, 9, + 13, 240, 19, 9, 13, 240, 18, 9, 13, 240, 17, 9, 13, 240, 16, 9, 13, 240, + 15, 9, 13, 240, 14, 9, 13, 240, 13, 9, 13, 240, 12, 9, 13, 240, 11, 9, + 13, 240, 10, 9, 13, 240, 9, 9, 13, 240, 8, 9, 13, 240, 7, 9, 13, 240, 6, + 9, 13, 240, 5, 9, 13, 240, 4, 9, 13, 240, 3, 9, 13, 240, 2, 9, 13, 240, + 1, 9, 13, 240, 0, 9, 13, 239, 255, 9, 13, 239, 254, 9, 13, 239, 253, 9, + 13, 239, 252, 9, 13, 239, 251, 9, 13, 239, 250, 9, 13, 239, 249, 9, 13, + 239, 248, 9, 13, 239, 247, 9, 13, 239, 246, 9, 13, 239, 245, 9, 13, 239, + 244, 9, 13, 239, 243, 9, 13, 239, 242, 9, 13, 239, 241, 9, 13, 239, 240, + 9, 13, 239, 239, 9, 13, 239, 238, 9, 13, 239, 237, 9, 13, 239, 236, 9, + 13, 239, 235, 9, 13, 239, 234, 9, 13, 239, 233, 9, 13, 239, 232, 9, 13, + 239, 231, 9, 13, 239, 230, 9, 13, 239, 229, 9, 13, 239, 228, 9, 13, 239, + 227, 9, 13, 239, 226, 9, 13, 239, 225, 9, 13, 239, 224, 9, 13, 239, 223, + 9, 13, 239, 222, 9, 13, 239, 221, 9, 13, 239, 220, 9, 13, 239, 219, 9, + 13, 239, 218, 9, 13, 239, 217, 9, 13, 239, 216, 9, 13, 239, 215, 9, 13, + 239, 214, 9, 13, 239, 213, 9, 13, 239, 212, 9, 13, 239, 211, 9, 13, 239, + 210, 9, 13, 239, 209, 9, 13, 239, 208, 9, 13, 239, 207, 9, 13, 239, 206, + 9, 13, 239, 205, 9, 13, 239, 204, 9, 13, 239, 203, 9, 13, 239, 202, 9, + 13, 239, 201, 9, 13, 239, 200, 9, 13, 239, 199, 9, 13, 239, 198, 9, 13, + 239, 197, 9, 13, 239, 196, 9, 13, 239, 195, 9, 13, 239, 194, 9, 13, 239, + 193, 9, 13, 239, 192, 9, 13, 239, 191, 9, 13, 239, 190, 9, 13, 239, 189, + 9, 13, 239, 188, 9, 13, 239, 187, 9, 13, 239, 186, 9, 13, 239, 185, 9, + 13, 239, 184, 9, 13, 239, 183, 9, 13, 239, 182, 9, 13, 239, 181, 9, 13, + 239, 180, 9, 13, 239, 179, 9, 13, 239, 178, 9, 13, 239, 177, 9, 13, 239, + 176, 9, 13, 239, 175, 9, 13, 239, 174, 9, 13, 239, 173, 9, 13, 239, 172, + 9, 13, 239, 171, 9, 13, 239, 170, 9, 13, 239, 169, 9, 13, 239, 168, 9, + 13, 239, 167, 9, 13, 239, 166, 9, 13, 239, 165, 9, 13, 239, 164, 9, 13, + 239, 163, 9, 13, 239, 162, 9, 13, 239, 161, 9, 13, 239, 160, 9, 13, 239, + 159, 9, 13, 239, 158, 9, 13, 239, 157, 9, 13, 239, 156, 9, 13, 239, 155, + 9, 13, 239, 154, 9, 13, 239, 153, 9, 13, 239, 152, 9, 13, 239, 151, 9, + 13, 239, 150, 9, 13, 239, 149, 9, 13, 239, 148, 9, 13, 239, 147, 9, 13, + 239, 146, 9, 13, 239, 145, 9, 13, 239, 144, 9, 13, 239, 143, 9, 13, 239, + 142, 9, 13, 239, 141, 9, 13, 239, 140, 9, 13, 239, 139, 9, 13, 239, 138, + 9, 13, 239, 137, 9, 13, 239, 136, 9, 13, 239, 135, 9, 13, 239, 134, 9, + 13, 239, 133, 9, 13, 239, 132, 9, 13, 239, 131, 9, 13, 239, 130, 9, 13, + 239, 129, 9, 13, 239, 128, 9, 13, 239, 127, 9, 13, 239, 126, 9, 13, 239, + 125, 9, 13, 239, 124, 9, 13, 239, 123, 9, 13, 239, 122, 9, 13, 239, 121, + 9, 13, 239, 120, 9, 13, 239, 119, 9, 13, 239, 118, 9, 13, 239, 117, 9, + 13, 239, 116, 9, 13, 239, 115, 9, 13, 239, 114, 9, 13, 239, 113, 9, 13, + 239, 112, 9, 13, 239, 111, 9, 13, 239, 110, 9, 13, 239, 109, 9, 13, 239, + 108, 9, 13, 239, 107, 9, 13, 239, 106, 9, 13, 239, 105, 9, 13, 239, 104, + 9, 13, 239, 103, 9, 13, 239, 102, 9, 13, 239, 101, 9, 13, 239, 100, 9, + 13, 239, 99, 9, 13, 239, 98, 9, 13, 239, 97, 9, 13, 239, 96, 9, 13, 239, + 95, 9, 13, 239, 94, 9, 13, 239, 93, 9, 13, 239, 92, 9, 13, 239, 91, 9, + 13, 239, 90, 9, 13, 239, 89, 9, 13, 239, 88, 9, 13, 239, 87, 9, 13, 239, + 86, 9, 13, 239, 85, 9, 13, 239, 84, 9, 13, 239, 83, 9, 13, 239, 82, 9, + 13, 239, 81, 9, 13, 239, 80, 9, 13, 239, 79, 9, 13, 239, 78, 9, 13, 239, + 77, 9, 13, 239, 76, 9, 13, 239, 75, 9, 13, 239, 74, 9, 13, 239, 73, 9, + 13, 239, 72, 9, 13, 239, 71, 9, 13, 239, 70, 9, 13, 239, 69, 9, 13, 239, + 68, 9, 13, 239, 67, 9, 13, 239, 66, 9, 13, 239, 65, 9, 13, 239, 64, 9, + 13, 239, 63, 9, 13, 239, 62, 9, 13, 239, 61, 9, 13, 239, 60, 9, 13, 239, + 59, 9, 13, 239, 58, 9, 13, 239, 57, 9, 13, 239, 56, 9, 13, 239, 55, 9, + 13, 239, 54, 9, 13, 239, 53, 9, 13, 239, 52, 9, 13, 239, 51, 9, 13, 239, + 50, 9, 13, 239, 49, 9, 13, 239, 48, 9, 13, 239, 47, 9, 13, 239, 46, 9, + 13, 239, 45, 9, 13, 239, 44, 9, 13, 239, 43, 9, 13, 239, 42, 9, 13, 239, + 41, 9, 13, 239, 40, 9, 13, 239, 39, 9, 13, 239, 38, 9, 13, 239, 37, 9, + 13, 239, 36, 9, 13, 239, 35, 9, 13, 239, 34, 9, 13, 239, 33, 9, 13, 239, + 32, 9, 13, 239, 31, 9, 13, 239, 30, 9, 13, 239, 29, 9, 13, 239, 28, 9, + 13, 239, 27, 9, 13, 239, 26, 9, 13, 239, 25, 9, 13, 239, 24, 9, 13, 239, + 23, 9, 13, 239, 22, 9, 13, 239, 21, 9, 13, 239, 20, 9, 13, 239, 19, 9, + 13, 239, 18, 9, 13, 239, 17, 9, 13, 239, 16, 9, 13, 239, 15, 9, 13, 239, + 14, 9, 13, 239, 13, 9, 13, 239, 12, 9, 13, 239, 11, 9, 13, 239, 10, 9, + 13, 239, 9, 9, 13, 239, 8, 9, 13, 239, 7, 9, 13, 239, 6, 9, 13, 239, 5, + 9, 13, 239, 4, 9, 13, 239, 3, 9, 13, 239, 2, 9, 13, 239, 1, 9, 13, 239, + 0, 9, 13, 238, 255, 9, 13, 238, 254, 9, 13, 238, 253, 9, 13, 238, 252, 9, + 13, 238, 251, 9, 13, 238, 250, 9, 13, 238, 249, 9, 13, 238, 248, 9, 13, + 238, 247, 9, 13, 238, 246, 9, 13, 238, 245, 9, 13, 238, 244, 9, 13, 238, + 243, 9, 13, 238, 242, 9, 13, 238, 241, 9, 13, 238, 240, 9, 13, 238, 239, + 9, 13, 238, 238, 9, 13, 238, 237, 9, 13, 238, 236, 9, 13, 238, 235, 9, + 13, 238, 234, 9, 13, 238, 233, 9, 13, 238, 232, 9, 13, 238, 231, 9, 13, + 238, 230, 9, 13, 238, 229, 9, 13, 238, 228, 9, 13, 238, 227, 9, 13, 238, + 226, 9, 13, 238, 225, 9, 13, 238, 224, 9, 13, 238, 223, 9, 13, 238, 222, + 9, 13, 238, 221, 9, 13, 238, 220, 9, 13, 238, 219, 9, 13, 238, 218, 9, + 13, 238, 217, 9, 13, 238, 216, 9, 13, 238, 215, 9, 13, 238, 214, 9, 13, + 238, 213, 9, 13, 238, 212, 9, 13, 238, 211, 9, 13, 238, 210, 9, 13, 238, + 209, 9, 13, 238, 208, 9, 13, 238, 207, 9, 13, 238, 206, 9, 13, 238, 205, + 9, 13, 238, 204, 9, 13, 238, 203, 9, 13, 238, 202, 9, 13, 238, 201, 9, + 13, 238, 200, 9, 13, 238, 199, 9, 13, 238, 198, 9, 13, 238, 197, 9, 13, + 238, 196, 9, 13, 238, 195, 9, 13, 238, 194, 9, 13, 238, 193, 9, 13, 238, + 192, 9, 13, 238, 191, 9, 13, 238, 190, 9, 13, 238, 189, 9, 13, 238, 188, + 9, 13, 238, 187, 9, 13, 238, 186, 9, 13, 238, 185, 9, 13, 238, 184, 9, + 13, 238, 183, 233, 212, 218, 47, 128, 219, 225, 128, 245, 119, 79, 128, + 224, 178, 79, 128, 51, 53, 128, 247, 207, 53, 128, 226, 93, 53, 128, 254, + 162, 128, 254, 97, 128, 43, 226, 168, 128, 47, 226, 168, 128, 254, 3, + 128, 95, 53, 128, 250, 23, 128, 241, 20, 128, 244, 64, 219, 83, 128, 219, + 250, 128, 21, 212, 79, 128, 21, 118, 128, 21, 112, 128, 21, 170, 128, 21, + 167, 128, 21, 185, 128, 21, 192, 128, 21, 200, 128, 21, 198, 128, 21, + 203, 128, 250, 30, 128, 221, 93, 128, 233, 137, 53, 128, 245, 182, 53, + 128, 242, 228, 53, 128, 224, 193, 79, 128, 250, 22, 253, 249, 128, 7, 6, + 1, 63, 128, 7, 6, 1, 253, 201, 128, 7, 6, 1, 251, 121, 128, 7, 6, 1, 249, + 125, 128, 7, 6, 1, 77, 128, 7, 6, 1, 245, 95, 128, 7, 6, 1, 244, 41, 128, + 7, 6, 1, 242, 162, 128, 7, 6, 1, 75, 128, 7, 6, 1, 236, 3, 128, 7, 6, 1, + 235, 141, 128, 7, 6, 1, 155, 128, 7, 6, 1, 184, 128, 7, 6, 1, 206, 128, + 7, 6, 1, 78, 128, 7, 6, 1, 227, 11, 128, 7, 6, 1, 225, 19, 128, 7, 6, 1, + 152, 128, 7, 6, 1, 196, 128, 7, 6, 1, 218, 113, 128, 7, 6, 1, 72, 128, 7, + 6, 1, 211, 211, 128, 7, 6, 1, 214, 85, 128, 7, 6, 1, 213, 169, 128, 7, 6, + 1, 213, 108, 128, 7, 6, 1, 212, 152, 128, 43, 42, 125, 128, 223, 237, + 219, 250, 128, 47, 42, 125, 128, 250, 91, 255, 46, 128, 117, 233, 83, + 128, 242, 234, 255, 46, 128, 7, 4, 1, 63, 128, 7, 4, 1, 253, 201, 128, 7, + 4, 1, 251, 121, 128, 7, 4, 1, 249, 125, 128, 7, 4, 1, 77, 128, 7, 4, 1, + 245, 95, 128, 7, 4, 1, 244, 41, 128, 7, 4, 1, 242, 162, 128, 7, 4, 1, 75, + 128, 7, 4, 1, 236, 3, 128, 7, 4, 1, 235, 141, 128, 7, 4, 1, 155, 128, 7, + 4, 1, 184, 128, 7, 4, 1, 206, 128, 7, 4, 1, 78, 128, 7, 4, 1, 227, 11, + 128, 7, 4, 1, 225, 19, 128, 7, 4, 1, 152, 128, 7, 4, 1, 196, 128, 7, 4, + 1, 218, 113, 128, 7, 4, 1, 72, 128, 7, 4, 1, 211, 211, 128, 7, 4, 1, 214, + 85, 128, 7, 4, 1, 213, 169, 128, 7, 4, 1, 213, 108, 128, 7, 4, 1, 212, + 152, 128, 43, 249, 163, 125, 128, 66, 233, 83, 128, 47, 249, 163, 125, + 128, 177, 251, 62, 218, 47, 44, 222, 21, 44, 222, 10, 44, 221, 255, 44, + 221, 243, 44, 221, 232, 44, 221, 221, 44, 221, 210, 44, 221, 199, 44, + 221, 188, 44, 221, 180, 44, 221, 179, 44, 221, 178, 44, 221, 177, 44, + 221, 175, 44, 221, 174, 44, 221, 173, 44, 221, 172, 44, 221, 171, 44, + 221, 170, 44, 221, 169, 44, 221, 168, 44, 221, 167, 44, 221, 166, 44, + 221, 164, 44, 221, 163, 44, 221, 162, 44, 221, 161, 44, 221, 160, 44, + 221, 159, 44, 221, 158, 44, 221, 157, 44, 221, 156, 44, 221, 155, 44, + 221, 153, 44, 221, 152, 44, 221, 151, 44, 221, 150, 44, 221, 149, 44, + 221, 148, 44, 221, 147, 44, 221, 146, 44, 221, 145, 44, 221, 144, 44, + 221, 142, 44, 221, 141, 44, 221, 140, 44, 221, 139, 44, 221, 138, 44, + 221, 137, 44, 221, 136, 44, 221, 135, 44, 221, 134, 44, 221, 133, 44, + 221, 131, 44, 221, 130, 44, 221, 129, 44, 221, 128, 44, 221, 127, 44, + 221, 126, 44, 221, 125, 44, 221, 124, 44, 221, 123, 44, 221, 122, 44, + 221, 120, 44, 221, 119, 44, 221, 118, 44, 221, 117, 44, 221, 116, 44, + 221, 115, 44, 221, 114, 44, 221, 113, 44, 221, 112, 44, 221, 111, 44, + 221, 109, 44, 221, 108, 44, 221, 107, 44, 221, 106, 44, 221, 105, 44, + 221, 104, 44, 221, 103, 44, 221, 102, 44, 221, 101, 44, 221, 100, 44, + 222, 97, 44, 222, 96, 44, 222, 95, 44, 222, 94, 44, 222, 93, 44, 222, 92, + 44, 222, 91, 44, 222, 90, 44, 222, 89, 44, 222, 88, 44, 222, 86, 44, 222, + 85, 44, 222, 84, 44, 222, 83, 44, 222, 82, 44, 222, 81, 44, 222, 80, 44, + 222, 79, 44, 222, 78, 44, 222, 77, 44, 222, 75, 44, 222, 74, 44, 222, 73, + 44, 222, 72, 44, 222, 71, 44, 222, 70, 44, 222, 69, 44, 222, 68, 44, 222, + 67, 44, 222, 66, 44, 222, 64, 44, 222, 63, 44, 222, 62, 44, 222, 61, 44, + 222, 60, 44, 222, 59, 44, 222, 58, 44, 222, 57, 44, 222, 56, 44, 222, 55, + 44, 222, 53, 44, 222, 52, 44, 222, 51, 44, 222, 50, 44, 222, 49, 44, 222, + 48, 44, 222, 47, 44, 222, 46, 44, 222, 45, 44, 222, 44, 44, 222, 42, 44, + 222, 41, 44, 222, 40, 44, 222, 39, 44, 222, 38, 44, 222, 37, 44, 222, 36, + 44, 222, 35, 44, 222, 34, 44, 222, 33, 44, 222, 31, 44, 222, 30, 44, 222, + 29, 44, 222, 28, 44, 222, 27, 44, 222, 26, 44, 222, 25, 44, 222, 24, 44, + 222, 23, 44, 222, 22, 44, 222, 20, 44, 222, 19, 44, 222, 18, 44, 222, 17, + 44, 222, 16, 44, 222, 15, 44, 222, 14, 44, 222, 13, 44, 222, 12, 44, 222, + 11, 44, 222, 9, 44, 222, 8, 44, 222, 7, 44, 222, 6, 44, 222, 5, 44, 222, + 4, 44, 222, 3, 44, 222, 2, 44, 222, 1, 44, 222, 0, 44, 221, 254, 44, 221, + 253, 44, 221, 252, 44, 221, 251, 44, 221, 250, 44, 221, 249, 44, 221, + 248, 44, 221, 247, 44, 221, 246, 44, 221, 245, 44, 221, 242, 44, 221, + 241, 44, 221, 240, 44, 221, 239, 44, 221, 238, 44, 221, 237, 44, 221, + 236, 44, 221, 235, 44, 221, 234, 44, 221, 233, 44, 221, 231, 44, 221, + 230, 44, 221, 229, 44, 221, 228, 44, 221, 227, 44, 221, 226, 44, 221, + 225, 44, 221, 224, 44, 221, 223, 44, 221, 222, 44, 221, 220, 44, 221, + 219, 44, 221, 218, 44, 221, 217, 44, 221, 216, 44, 221, 215, 44, 221, + 214, 44, 221, 213, 44, 221, 212, 44, 221, 211, 44, 221, 209, 44, 221, + 208, 44, 221, 207, 44, 221, 206, 44, 221, 205, 44, 221, 204, 44, 221, + 203, 44, 221, 202, 44, 221, 201, 44, 221, 200, 44, 221, 198, 44, 221, + 197, 44, 221, 196, 44, 221, 195, 44, 221, 194, 44, 221, 193, 44, 221, + 192, 44, 221, 191, 44, 221, 190, 44, 221, 189, 44, 221, 187, 44, 221, + 186, 44, 221, 185, 44, 221, 184, 44, 221, 183, 44, 221, 182, 44, 221, + 181, 7, 6, 1, 243, 89, 7, 4, 1, 243, 89, 158, 1, 233, 45, 202, 1, 244, + 133, 244, 125, 202, 1, 244, 133, 244, 246, 202, 1, 223, 146, 202, 1, 233, + 26, 61, 156, 252, 15, 220, 204, 243, 55, 231, 129, 223, 228, 8, 3, 236, + 17, 79, 225, 110, 244, 109, 31, 66, 47, 69, 233, 142, 125, 48, 27, 16, + 244, 71, 220, 49, 250, 133, 214, 247, 7, 6, 1, 111, 2, 232, 111, 22, 209, + 7, 4, 1, 111, 2, 232, 111, 22, 209, 7, 6, 1, 154, 2, 66, 233, 84, 55, 7, + 4, 1, 154, 2, 66, 233, 84, 55, 7, 6, 1, 154, 2, 66, 233, 84, 252, 90, 22, + 209, 7, 4, 1, 154, 2, 66, 233, 84, 252, 90, 22, 209, 7, 6, 1, 154, 2, 66, + 233, 84, 252, 90, 22, 138, 7, 4, 1, 154, 2, 66, 233, 84, 252, 90, 22, + 138, 7, 6, 1, 154, 2, 250, 91, 22, 232, 110, 7, 4, 1, 154, 2, 250, 91, + 22, 232, 110, 7, 6, 1, 154, 2, 250, 91, 22, 251, 34, 7, 4, 1, 154, 2, + 250, 91, 22, 251, 34, 7, 6, 1, 241, 7, 2, 232, 111, 22, 209, 7, 4, 1, + 241, 7, 2, 232, 111, 22, 209, 7, 4, 1, 241, 7, 2, 62, 74, 22, 138, 7, 4, + 1, 229, 229, 2, 217, 56, 50, 7, 6, 1, 141, 2, 66, 233, 84, 55, 7, 4, 1, + 141, 2, 66, 233, 84, 55, 7, 6, 1, 141, 2, 66, 233, 84, 252, 90, 22, 209, + 7, 4, 1, 141, 2, 66, 233, 84, 252, 90, 22, 209, 7, 6, 1, 141, 2, 66, 233, + 84, 252, 90, 22, 138, 7, 4, 1, 141, 2, 66, 233, 84, 252, 90, 22, 138, 7, + 6, 1, 223, 29, 2, 66, 233, 84, 55, 7, 4, 1, 223, 29, 2, 66, 233, 84, 55, + 7, 6, 1, 103, 2, 232, 111, 22, 209, 7, 4, 1, 103, 2, 232, 111, 22, 209, + 7, 6, 1, 111, 2, 227, 128, 22, 138, 7, 4, 1, 111, 2, 227, 128, 22, 138, + 7, 6, 1, 111, 2, 227, 128, 22, 177, 7, 4, 1, 111, 2, 227, 128, 22, 177, + 7, 6, 1, 154, 2, 227, 128, 22, 138, 7, 4, 1, 154, 2, 227, 128, 22, 138, + 7, 6, 1, 154, 2, 227, 128, 22, 177, 7, 4, 1, 154, 2, 227, 128, 22, 177, + 7, 6, 1, 154, 2, 62, 74, 22, 138, 7, 4, 1, 154, 2, 62, 74, 22, 138, 7, 6, + 1, 154, 2, 62, 74, 22, 177, 7, 4, 1, 154, 2, 62, 74, 22, 177, 7, 4, 1, + 241, 7, 2, 62, 74, 22, 209, 7, 4, 1, 241, 7, 2, 62, 74, 22, 177, 7, 6, 1, + 241, 7, 2, 227, 128, 22, 138, 7, 4, 1, 241, 7, 2, 227, 128, 22, 62, 74, + 22, 138, 7, 6, 1, 241, 7, 2, 227, 128, 22, 177, 7, 4, 1, 241, 7, 2, 227, + 128, 22, 62, 74, 22, 177, 7, 6, 1, 236, 4, 2, 177, 7, 4, 1, 236, 4, 2, + 62, 74, 22, 177, 7, 6, 1, 234, 13, 2, 177, 7, 4, 1, 234, 13, 2, 177, 7, + 6, 1, 232, 183, 2, 177, 7, 4, 1, 232, 183, 2, 177, 7, 6, 1, 224, 148, 2, + 177, 7, 4, 1, 224, 148, 2, 177, 7, 6, 1, 103, 2, 227, 128, 22, 138, 7, 4, + 1, 103, 2, 227, 128, 22, 138, 7, 6, 1, 103, 2, 227, 128, 22, 177, 7, 4, + 1, 103, 2, 227, 128, 22, 177, 7, 6, 1, 103, 2, 232, 111, 22, 138, 7, 4, + 1, 103, 2, 232, 111, 22, 138, 7, 6, 1, 103, 2, 232, 111, 22, 177, 7, 4, + 1, 103, 2, 232, 111, 22, 177, 7, 4, 1, 255, 21, 2, 209, 7, 4, 1, 210, + 141, 2, 209, 7, 4, 1, 210, 141, 2, 138, 7, 4, 1, 216, 66, 215, 86, 2, + 209, 7, 4, 1, 216, 66, 215, 86, 2, 138, 7, 4, 1, 222, 137, 2, 209, 7, 4, + 1, 222, 137, 2, 138, 7, 4, 1, 241, 156, 222, 137, 2, 209, 7, 4, 1, 241, + 156, 222, 137, 2, 138, 142, 1, 234, 227, 36, 120, 235, 141, 36, 120, 229, + 228, 36, 120, 251, 121, 36, 120, 228, 66, 36, 120, 216, 131, 36, 120, + 229, 7, 36, 120, 218, 113, 36, 120, 206, 36, 120, 227, 11, 36, 120, 184, + 36, 120, 213, 108, 36, 120, 152, 36, 120, 155, 36, 120, 211, 211, 36, + 120, 233, 46, 36, 120, 233, 55, 36, 120, 223, 116, 36, 120, 228, 247, 36, + 120, 236, 3, 36, 120, 221, 49, 36, 120, 219, 177, 36, 120, 196, 36, 120, + 242, 162, 36, 120, 234, 96, 36, 3, 235, 128, 36, 3, 234, 212, 36, 3, 234, + 203, 36, 3, 234, 81, 36, 3, 234, 52, 36, 3, 235, 44, 36, 3, 235, 43, 36, + 3, 235, 108, 36, 3, 234, 148, 36, 3, 234, 130, 36, 3, 235, 57, 36, 3, + 229, 225, 36, 3, 229, 178, 36, 3, 229, 174, 36, 3, 229, 143, 36, 3, 229, + 136, 36, 3, 229, 214, 36, 3, 229, 212, 36, 3, 229, 223, 36, 3, 229, 155, + 36, 3, 229, 150, 36, 3, 229, 216, 36, 3, 251, 87, 36, 3, 250, 111, 36, 3, + 250, 101, 36, 3, 249, 176, 36, 3, 249, 148, 36, 3, 250, 247, 36, 3, 250, + 239, 36, 3, 251, 78, 36, 3, 250, 42, 36, 3, 249, 236, 36, 3, 251, 22, 36, + 3, 228, 63, 36, 3, 228, 49, 36, 3, 228, 44, 36, 3, 228, 29, 36, 3, 228, + 22, 36, 3, 228, 56, 36, 3, 228, 55, 36, 3, 228, 61, 36, 3, 228, 35, 36, + 3, 228, 33, 36, 3, 228, 59, 36, 3, 216, 127, 36, 3, 216, 107, 36, 3, 216, + 106, 36, 3, 216, 95, 36, 3, 216, 92, 36, 3, 216, 123, 36, 3, 216, 122, + 36, 3, 216, 126, 36, 3, 216, 105, 36, 3, 216, 104, 36, 3, 216, 125, 36, + 3, 229, 5, 36, 3, 228, 249, 36, 3, 228, 248, 36, 3, 228, 232, 36, 3, 228, + 231, 36, 3, 229, 2, 36, 3, 229, 1, 36, 3, 229, 4, 36, 3, 228, 234, 36, 3, + 228, 233, 36, 3, 229, 3, 36, 3, 218, 63, 36, 3, 217, 84, 36, 3, 217, 70, + 36, 3, 216, 90, 36, 3, 216, 57, 36, 3, 217, 242, 36, 3, 217, 232, 36, 3, + 218, 42, 36, 3, 109, 36, 3, 216, 243, 36, 3, 218, 5, 36, 3, 230, 112, 36, + 3, 229, 128, 36, 3, 229, 103, 36, 3, 228, 135, 36, 3, 228, 78, 36, 3, + 229, 254, 36, 3, 229, 251, 36, 3, 230, 99, 36, 3, 228, 228, 36, 3, 228, + 218, 36, 3, 230, 76, 36, 3, 226, 251, 36, 3, 226, 20, 36, 3, 225, 239, + 36, 3, 225, 71, 36, 3, 225, 42, 36, 3, 226, 132, 36, 3, 226, 122, 36, 3, + 226, 235, 36, 3, 225, 186, 36, 3, 225, 165, 36, 3, 226, 144, 36, 3, 232, + 114, 36, 3, 231, 112, 36, 3, 231, 84, 36, 3, 230, 242, 36, 3, 230, 194, + 36, 3, 231, 226, 36, 3, 231, 215, 36, 3, 232, 81, 36, 3, 231, 45, 36, 3, + 231, 16, 36, 3, 232, 13, 36, 3, 213, 94, 36, 3, 213, 0, 36, 3, 212, 247, + 36, 3, 212, 204, 36, 3, 212, 173, 36, 3, 213, 39, 36, 3, 213, 36, 36, 3, + 213, 73, 36, 3, 212, 236, 36, 3, 212, 221, 36, 3, 213, 47, 36, 3, 224, + 109, 36, 3, 223, 222, 36, 3, 223, 170, 36, 3, 223, 77, 36, 3, 223, 49, + 36, 3, 224, 55, 36, 3, 224, 35, 36, 3, 224, 92, 36, 3, 223, 146, 36, 3, + 223, 133, 36, 3, 224, 63, 36, 3, 233, 254, 36, 3, 233, 111, 36, 3, 233, + 97, 36, 3, 232, 230, 36, 3, 232, 205, 36, 3, 233, 180, 36, 3, 233, 172, + 36, 3, 233, 231, 36, 3, 233, 26, 36, 3, 232, 254, 36, 3, 233, 196, 36, 3, + 215, 7, 36, 3, 214, 159, 36, 3, 214, 147, 36, 3, 214, 103, 36, 3, 214, + 96, 36, 3, 214, 237, 36, 3, 214, 232, 36, 3, 215, 5, 36, 3, 214, 123, 36, + 3, 214, 112, 36, 3, 214, 243, 36, 3, 233, 44, 36, 3, 233, 39, 36, 3, 233, + 38, 36, 3, 233, 35, 36, 3, 233, 34, 36, 3, 233, 41, 36, 3, 233, 40, 36, + 3, 233, 43, 36, 3, 233, 37, 36, 3, 233, 36, 36, 3, 233, 42, 36, 3, 233, + 53, 36, 3, 233, 48, 36, 3, 233, 47, 36, 3, 233, 31, 36, 3, 233, 30, 36, + 3, 233, 50, 36, 3, 233, 49, 36, 3, 233, 52, 36, 3, 233, 33, 36, 3, 233, + 32, 36, 3, 233, 51, 36, 3, 223, 114, 36, 3, 223, 103, 36, 3, 223, 102, + 36, 3, 223, 96, 36, 3, 223, 89, 36, 3, 223, 110, 36, 3, 223, 109, 36, 3, + 223, 113, 36, 3, 223, 101, 36, 3, 223, 100, 36, 3, 223, 112, 36, 3, 228, + 245, 36, 3, 228, 240, 36, 3, 228, 239, 36, 3, 228, 236, 36, 3, 228, 235, + 36, 3, 228, 242, 36, 3, 228, 241, 36, 3, 228, 244, 36, 3, 228, 238, 36, + 3, 228, 237, 36, 3, 228, 243, 36, 3, 235, 255, 36, 3, 235, 225, 36, 3, + 235, 218, 36, 3, 235, 168, 36, 3, 235, 151, 36, 3, 235, 242, 36, 3, 235, + 240, 36, 3, 235, 251, 36, 3, 235, 185, 36, 3, 235, 176, 36, 3, 235, 245, + 36, 3, 221, 43, 36, 3, 220, 233, 36, 3, 220, 228, 36, 3, 220, 170, 36, 3, + 220, 155, 36, 3, 221, 8, 36, 3, 221, 6, 36, 3, 221, 35, 36, 3, 220, 208, + 36, 3, 220, 202, 36, 3, 221, 16, 36, 3, 219, 175, 36, 3, 219, 145, 36, 3, + 219, 141, 36, 3, 219, 132, 36, 3, 219, 129, 36, 3, 219, 150, 36, 3, 219, + 149, 36, 3, 219, 174, 36, 3, 219, 137, 36, 3, 219, 136, 36, 3, 219, 152, + 36, 3, 222, 225, 36, 3, 220, 136, 36, 3, 220, 120, 36, 3, 219, 41, 36, 3, + 218, 219, 36, 3, 222, 123, 36, 3, 222, 112, 36, 3, 222, 212, 36, 3, 220, + 5, 36, 3, 219, 245, 36, 3, 222, 160, 36, 3, 242, 148, 36, 3, 242, 28, 36, + 3, 242, 10, 36, 3, 241, 74, 36, 3, 241, 55, 36, 3, 242, 85, 36, 3, 242, + 67, 36, 3, 242, 138, 36, 3, 241, 173, 36, 3, 241, 158, 36, 3, 242, 93, + 36, 3, 234, 95, 36, 3, 234, 94, 36, 3, 234, 89, 36, 3, 234, 88, 36, 3, + 234, 85, 36, 3, 234, 84, 36, 3, 234, 91, 36, 3, 234, 90, 36, 3, 234, 93, + 36, 3, 234, 87, 36, 3, 234, 86, 36, 3, 234, 92, 36, 3, 220, 176, 99, 1, + 216, 1, 67, 120, 5, 250, 37, 183, 67, 120, 5, 250, 37, 234, 250, 67, 120, + 5, 250, 37, 234, 148, 67, 120, 5, 250, 37, 234, 224, 67, 120, 5, 250, 37, + 229, 155, 67, 120, 5, 250, 37, 251, 88, 67, 120, 5, 250, 37, 250, 215, + 67, 120, 5, 250, 37, 250, 42, 67, 120, 5, 250, 37, 250, 146, 67, 120, 5, + 250, 37, 228, 35, 67, 120, 5, 250, 37, 249, 30, 67, 120, 5, 250, 37, 216, + 116, 67, 120, 5, 250, 37, 247, 220, 67, 120, 5, 250, 37, 216, 111, 67, + 120, 5, 250, 37, 207, 67, 120, 5, 250, 37, 218, 66, 67, 120, 5, 250, 37, + 217, 174, 67, 120, 5, 250, 37, 109, 67, 120, 5, 250, 37, 217, 122, 67, + 120, 5, 250, 37, 228, 228, 67, 120, 5, 250, 37, 252, 234, 67, 120, 5, + 250, 37, 226, 59, 67, 120, 5, 250, 37, 225, 186, 67, 120, 5, 250, 37, + 226, 33, 67, 120, 5, 250, 37, 231, 45, 67, 120, 5, 250, 37, 212, 236, 67, + 120, 5, 250, 37, 223, 146, 67, 120, 5, 250, 37, 233, 26, 67, 120, 5, 250, + 37, 214, 123, 67, 120, 5, 250, 37, 221, 47, 67, 120, 5, 250, 37, 219, + 176, 67, 120, 5, 250, 37, 222, 227, 67, 120, 5, 250, 37, 162, 67, 120, 5, + 250, 37, 233, 255, 67, 30, 5, 250, 37, 225, 11, 67, 236, 101, 30, 5, 250, + 37, 224, 210, 67, 236, 101, 30, 5, 250, 37, 223, 37, 67, 236, 101, 30, 5, + 250, 37, 223, 30, 67, 236, 101, 30, 5, 250, 37, 224, 248, 67, 30, 5, 227, + 107, 67, 30, 5, 255, 65, 136, 1, 252, 47, 229, 226, 136, 1, 252, 47, 229, + 178, 136, 1, 252, 47, 229, 143, 136, 1, 252, 47, 229, 214, 136, 1, 252, + 47, 229, 155, 56, 1, 252, 47, 229, 226, 56, 1, 252, 47, 229, 178, 56, 1, + 252, 47, 229, 143, 56, 1, 252, 47, 229, 214, 56, 1, 252, 47, 229, 155, + 56, 1, 254, 229, 250, 247, 56, 1, 254, 229, 216, 90, 56, 1, 254, 229, + 109, 56, 1, 254, 229, 227, 11, 59, 1, 245, 109, 245, 108, 249, 244, 161, + 134, 59, 1, 245, 108, 245, 109, 249, 244, 161, 134, }; static unsigned char phrasebook_offset1[] = { @@ -13551,63 +13709,64 @@ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 219, 17, 220, 221, 222, 223, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, }; static unsigned int phrasebook_offset2[] = { @@ -13619,2569 +13778,2626 @@ 209, 212, 216, 219, 223, 227, 232, 237, 242, 246, 251, 256, 261, 265, 270, 275, 279, 283, 287, 291, 296, 301, 305, 309, 314, 318, 323, 328, 333, 338, 343, 347, 350, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 360, 365, - 368, 371, 374, 377, 380, 383, 385, 388, 394, 402, 405, 409, 412, 414, - 417, 420, 423, 426, 430, 433, 436, 440, 442, 445, 451, 459, 466, 473, - 480, 485, 492, 498, 505, 512, 519, 527, 532, 540, 547, 553, 560, 567, - 575, 582, 590, 598, 603, 611, 618, 624, 631, 638, 645, 648, 654, 661, - 667, 674, 681, 688, 693, 699, 706, 712, 719, 726, 733, 741, 746, 754, - 761, 767, 774, 781, 789, 796, 804, 812, 817, 825, 832, 838, 845, 852, - 859, 862, 868, 875, 881, 888, 895, 902, 907, 915, 922, 929, 936, 943, - 950, 957, 964, 971, 979, 987, 995, 1003, 1011, 1019, 1027, 1035, 1042, - 1049, 1056, 1063, 1070, 1077, 1084, 1091, 1098, 1105, 1112, 1119, 1127, - 1135, 1143, 1151, 1159, 1167, 1175, 1183, 1191, 1199, 1206, 1213, 1221, - 1229, 1237, 1245, 1253, 1261, 1269, 1277, 1285, 1291, 1296, 1301, 1309, - 1317, 1325, 1333, 1338, 1345, 1352, 1360, 1368, 1376, 1384, 1394, 1404, - 1411, 1418, 1425, 1432, 1440, 1448, 1456, 1464, 1475, 1480, 1485, 1492, - 1499, 1506, 1513, 1520, 1527, 1532, 1537, 1544, 1551, 1559, 1567, 1575, - 1583, 1590, 1597, 1605, 1613, 1621, 1629, 1637, 1645, 1653, 1661, 1669, - 1677, 1684, 1691, 1698, 1705, 1712, 1719, 1726, 1733, 1741, 1749, 1756, - 1763, 1770, 1777, 1785, 1793, 1801, 1809, 1817, 1824, 1831, 1839, 1847, - 1855, 1863, 1868, 1874, 1880, 1887, 1894, 1899, 1904, 1910, 1917, 1924, - 1931, 1938, 1946, 1954, 1961, 1967, 1972, 1978, 1985, 1992, 1999, 2004, - 2009, 2014, 2021, 2028, 2035, 2042, 2049, 2055, 2063, 2073, 2082, 2089, - 2096, 2101, 2106, 2113, 2120, 2124, 2129, 2134, 2139, 2147, 2156, 2163, - 2170, 2179, 2186, 2193, 2198, 2205, 2212, 2219, 2226, 2233, 2238, 2245, - 2252, 2260, 2265, 2270, 2275, 2285, 2289, 2295, 2301, 2307, 2313, 2321, - 2334, 2342, 2347, 2357, 2362, 2367, 2377, 2382, 2389, 2396, 2404, 2412, - 2419, 2426, 2433, 2440, 2450, 2460, 2469, 2478, 2488, 2498, 2508, 2518, - 2524, 2534, 2544, 2554, 2564, 2572, 2580, 2587, 2594, 2602, 2610, 2618, - 2626, 2633, 2640, 2650, 2660, 2668, 2676, 2684, 2689, 2699, 2704, 2711, - 2718, 2723, 2728, 2736, 2744, 2754, 2764, 2771, 2778, 2787, 2796, 2804, - 2812, 2821, 2830, 2838, 2846, 2855, 2864, 2873, 2882, 2892, 2902, 2910, - 2918, 2927, 2936, 2945, 2954, 2964, 2974, 2982, 2990, 2999, 3008, 3017, - 3026, 3035, 3044, 3049, 3054, 3062, 3070, 3080, 3088, 3093, 3098, 3105, - 3112, 3119, 3126, 3133, 3140, 3150, 3160, 3170, 3180, 3187, 3194, 3204, - 3214, 3222, 3230, 3238, 3246, 3254, 3261, 3268, 3275, 3281, 3288, 3295, - 3302, 3311, 3321, 3331, 3338, 3345, 3351, 3356, 3363, 3369, 3375, 3382, - 3389, 3400, 3410, 3417, 3424, 3431, 3438, 3444, 3449, 3456, 3462, 3468, - 3476, 3484, 3491, 3497, 3502, 3509, 3515, 3523, 3533, 3543, 3552, 3559, - 3565, 3571, 3576, 3583, 3590, 3597, 3604, 3611, 3616, 3621, 3631, 3639, - 3648, 3653, 3659, 3670, 3677, 3685, 3694, 3699, 3705, 3711, 3718, 3723, - 3729, 3740, 3749, 3758, 3766, 3774, 3784, 3789, 3796, 3803, 3808, 3820, - 3829, 3837, 3844, 3853, 3858, 3863, 3870, 3877, 3884, 3891, 3897, 3906, - 3914, 3919, 3927, 3933, 3941, 3949, 3955, 3961, 3967, 3975, 3983, 3989, - 3997, 4004, 4009, 4016, 4024, 4034, 4041, 4048, 4058, 4065, 4072, 4082, - 4089, 4096, 4103, 4109, 4115, 4125, 4138, 4143, 4150, 4155, 4159, 4165, - 4174, 4181, 4186, 4191, 4195, 4200, 4206, 4210, 4216, 4222, 4228, 4234, - 4242, 4247, 4252, 4257, 4262, 4268, 4270, 4275, 4279, 4285, 4291, 4297, - 4302, 4309, 4316, 4322, 4329, 4337, 4345, 4350, 4355, 4359, 4364, 4366, - 4368, 4371, 4373, 4376, 4381, 4386, 4392, 4397, 4401, 4405, 4410, 4419, - 4425, 4430, 4436, 4441, 4447, 4455, 4463, 4467, 4471, 4476, 4482, 4488, - 4494, 4500, 4505, 4513, 4522, 4531, 4536, 4542, 4549, 4556, 4563, 4570, - 4574, 4580, 4585, 4590, 4595, 4600, 4603, 4606, 4609, 4612, 4615, 4618, - 4622, 4626, 4632, 4635, 4640, 4646, 4652, 4655, 4660, 4666, 4670, 4676, - 4682, 4688, 4694, 4699, 4704, 4709, 4712, 4718, 4723, 4728, 4732, 4737, - 4743, 4749, 4752, 4756, 4760, 4764, 4767, 4770, 4775, 4779, 4786, 4790, - 4796, 4800, 4806, 4810, 4814, 4818, 4823, 4828, 4835, 4841, 4848, 4854, - 4860, 4866, 4869, 4873, 4877, 4881, 4885, 4890, 4895, 4899, 4903, 4909, - 4913, 4917, 4922, 4928, 4933, 4939, 4943, 4950, 4955, 4960, 4965, 4970, - 4976, 4979, 4983, 4988, 4993, 5002, 5008, 5013, 5017, 5022, 5026, 5031, - 5035, 5039, 5044, 5048, 5054, 5059, 5064, 5069, 5074, 5079, 5084, 5090, - 5096, 5102, 5107, 5112, 5118, 5124, 5130, 5135, 5140, 5147, 5154, 5158, - 5164, 5171, 0, 0, 5178, 5181, 5190, 5199, 5210, 0, 0, 0, 0, 0, 5214, - 5217, 5222, 5230, 5235, 5243, 5251, 0, 5259, 0, 5267, 5275, 5283, 5294, - 5299, 5304, 5309, 5314, 5319, 5324, 5329, 5334, 5339, 5344, 5349, 5354, - 5359, 5364, 5369, 5374, 0, 5379, 5384, 5389, 5394, 5399, 5404, 5409, - 5414, 5422, 5430, 5438, 5446, 5454, 5462, 5473, 5478, 5483, 5488, 5493, - 5498, 5503, 5508, 5513, 5518, 5523, 5528, 5533, 5538, 5543, 5548, 5553, - 5558, 5564, 5569, 5574, 5579, 5584, 5589, 5594, 5599, 5607, 5615, 5623, - 5631, 5639, 5644, 5648, 5652, 5659, 5669, 5679, 5683, 5687, 5691, 5697, - 5704, 5708, 5713, 5717, 5722, 5726, 5731, 5735, 5740, 5745, 5750, 5755, - 5760, 5765, 5770, 5775, 5780, 5785, 5790, 5795, 5800, 5805, 5810, 5814, - 5818, 5824, 5828, 5833, 5839, 5847, 5852, 5857, 5864, 5869, 5874, 5881, - 5890, 5899, 5910, 5918, 5923, 5928, 5933, 5940, 5945, 5951, 5956, 5961, - 5966, 5971, 5976, 5981, 5989, 5995, 6000, 6004, 6009, 6014, 6019, 6024, - 6029, 6034, 6039, 6043, 6049, 6053, 6058, 6063, 6068, 6072, 6077, 6082, - 6087, 6092, 6096, 6101, 6105, 6110, 6115, 6120, 6125, 6131, 6136, 6142, - 6146, 6151, 6155, 6159, 6164, 6169, 6174, 6179, 6184, 6189, 6194, 6198, - 6204, 6208, 6213, 6218, 6223, 6227, 6232, 6237, 6242, 6247, 6251, 6256, - 6260, 6265, 6270, 6275, 6280, 6286, 6291, 6297, 6301, 6306, 6310, 6318, - 6323, 6328, 6333, 6340, 6345, 6351, 6356, 6361, 6366, 6371, 6376, 6381, - 6389, 6395, 6400, 6405, 6410, 6415, 6420, 6426, 6432, 6439, 6446, 6455, - 6464, 6471, 6478, 6487, 6496, 6501, 6506, 6511, 6516, 6521, 6526, 6531, - 6536, 6547, 6558, 6563, 6568, 6575, 6582, 6590, 6598, 6603, 6608, 6613, - 6618, 6622, 6626, 6630, 6635, 6641, 6645, 6652, 6657, 6667, 6677, 6683, - 6689, 6697, 6705, 6713, 6721, 6728, 6735, 6744, 6753, 6761, 6769, 6777, - 6785, 6793, 6801, 6809, 6817, 6824, 6831, 6837, 6843, 6851, 6859, 6866, - 6873, 6882, 6891, 6897, 6903, 6911, 6919, 6927, 6935, 6941, 6947, 6955, - 6963, 6971, 6979, 6986, 6993, 7001, 7009, 7017, 7025, 7030, 7035, 7042, - 7049, 7059, 7069, 7073, 7081, 7089, 7096, 7103, 7111, 7119, 7126, 7133, - 7141, 7149, 7156, 7163, 7171, 7179, 7184, 7191, 7198, 7205, 7212, 7218, - 7224, 7232, 7240, 7245, 7250, 7258, 7266, 7274, 7282, 7290, 7298, 7305, - 7312, 7320, 7328, 7336, 7344, 7351, 7358, 7364, 7370, 7379, 7388, 7395, - 7402, 7409, 7416, 7423, 7430, 7437, 7444, 7452, 7460, 7468, 7476, 7484, - 7492, 7502, 7512, 7519, 7526, 7533, 7540, 7547, 7554, 7561, 7568, 7575, - 7582, 7589, 7596, 7603, 7610, 7617, 7624, 7631, 7638, 7645, 7652, 7659, - 7666, 7673, 7680, 7685, 7690, 7695, 7700, 7705, 7710, 7715, 7720, 7725, - 7730, 7736, 7742, 7751, 7760, 7769, 7778, 7786, 7794, 7802, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7810, 7815, 7820, 7825, 7830, 7835, 7840, 7845, 7850, - 7854, 7859, 7864, 7869, 7874, 7879, 7884, 7889, 7894, 7899, 7904, 7909, - 7914, 7919, 7924, 7929, 7934, 7939, 7944, 7948, 7953, 7958, 7963, 7968, - 7973, 7978, 7983, 7988, 7993, 0, 0, 7998, 8005, 8008, 8012, 8016, 8019, - 8023, 0, 8027, 8032, 8037, 8042, 8047, 8052, 8057, 8062, 8067, 8071, - 8076, 8081, 8086, 8091, 8096, 8101, 8106, 8111, 8116, 8121, 8126, 8131, - 8136, 8141, 8146, 8151, 8156, 8161, 8165, 8170, 8175, 8180, 8185, 8190, - 8195, 8200, 8205, 8210, 8215, 0, 8222, 8227, 0, 0, 0, 0, 0, 0, 8230, - 8235, 8240, 8245, 8252, 8259, 8264, 8269, 8274, 8279, 8284, 8289, 8294, - 8301, 8306, 8313, 8320, 8325, 8332, 8337, 8342, 8347, 8354, 8359, 8364, - 8371, 8380, 8385, 8390, 8395, 8400, 8406, 8411, 8418, 8425, 8432, 8437, - 8442, 8447, 8452, 8457, 8462, 8472, 8477, 8485, 8490, 8495, 8500, 8505, - 8512, 8519, 8526, 8532, 8538, 8545, 0, 0, 0, 0, 0, 0, 0, 0, 8552, 8556, - 8560, 8564, 8568, 8572, 8576, 8580, 8584, 8588, 8592, 8597, 8601, 8605, - 8610, 8614, 8619, 8623, 8627, 8631, 8636, 8640, 8645, 8649, 8653, 8657, - 8661, 0, 0, 0, 0, 0, 8665, 8672, 8680, 8687, 8692, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8697, 8700, 8704, 8709, 0, 0, 8713, 8719, 8725, 8728, 8735, - 8744, 8747, 8750, 8755, 8761, 8765, 8773, 8779, 8785, 8793, 8797, 8802, - 8813, 8818, 8822, 8826, 8830, 0, 0, 8833, 8840, 8844, 8850, 8854, 8861, - 8867, 8874, 8880, 8886, 8890, 8894, 8900, 8904, 8908, 8912, 8916, 8920, - 8924, 8928, 8932, 8936, 8940, 8944, 8948, 8952, 8956, 8960, 8964, 8968, - 8976, 8984, 8994, 9003, 9012, 9015, 9019, 9023, 9027, 9031, 9035, 9039, - 9043, 9047, 9052, 9056, 9059, 9062, 9065, 9068, 9071, 9074, 9077, 9080, - 9084, 9087, 9090, 9095, 9100, 9106, 9109, 9116, 9125, 9130, 9135, 9142, - 9147, 9152, 9156, 9160, 9164, 9168, 9172, 9176, 9180, 9184, 9188, 9192, - 9197, 9202, 9209, 9215, 9221, 9227, 9232, 9240, 9248, 9253, 9259, 9265, - 9271, 9277, 9281, 9285, 9289, 9296, 9306, 9310, 9314, 9318, 9324, 9332, - 9336, 9340, 9347, 9351, 9355, 9359, 9366, 9373, 9385, 9389, 9393, 9397, - 9407, 9416, 9420, 9428, 9435, 9442, 9451, 9462, 9470, 9474, 9483, 9494, - 9502, 9515, 9523, 9531, 9539, 9547, 9553, 9562, 9569, 9573, 9581, 9585, - 9592, 9600, 9604, 9610, 9617, 9624, 9628, 9636, 9640, 9647, 9651, 9659, - 9663, 9671, 9679, 9686, 9694, 9702, 9709, 9715, 9719, 9726, 9734, 9740, - 9747, 9754, 9760, 9769, 9777, 9784, 9790, 9794, 9797, 9801, 9807, 9815, - 9819, 9825, 9831, 9838, 9845, 9848, 9855, 9860, 9868, 9873, 9877, 9890, - 9903, 9909, 9916, 9921, 9927, 9932, 9938, 9948, 9955, 9964, 9974, 9980, - 9985, 9990, 9994, 9998, 10003, 10008, 10014, 10022, 10030, 10041, 10046, - 10055, 10064, 10071, 10077, 10083, 10089, 10095, 10101, 10107, 10113, - 10119, 10125, 10132, 10139, 10146, 10152, 10160, 10169, 10175, 10182, - 10189, 10194, 10199, 10203, 10210, 10217, 10226, 10235, 10238, 10243, - 10248, 0, 10253, 10257, 10261, 10267, 10271, 10275, 10281, 10285, 10293, - 10297, 10301, 10305, 10309, 10313, 10319, 10323, 10329, 10333, 10337, - 10341, 10345, 10349, 10354, 10357, 10361, 10367, 10371, 10375, 10379, - 10383, 10387, 10393, 10399, 10405, 10409, 10413, 10418, 10422, 10426, - 10431, 10435, 10439, 10446, 10453, 10457, 10461, 10466, 10470, 10474, - 10477, 10482, 10485, 10488, 10493, 10498, 10502, 10506, 10512, 10518, - 10521, 0, 0, 10524, 10530, 10536, 10542, 10552, 10564, 10576, 10593, - 10605, 10616, 10624, 10631, 10642, 10657, 10668, 10674, 10683, 10691, - 10703, 10713, 10721, 10733, 10740, 10748, 10760, 10766, 10772, 10780, - 10788, 10796, 10802, 10812, 10819, 10829, 10839, 10852, 10866, 10880, - 10890, 10901, 10912, 10925, 10938, 10952, 10964, 10976, 10989, 11002, - 11014, 11027, 11036, 11044, 11049, 11054, 11059, 11064, 11069, 11074, - 11079, 11084, 11089, 11094, 11099, 11104, 11109, 11114, 11119, 11124, - 11129, 11134, 11139, 11144, 11149, 11154, 11159, 11164, 11169, 11174, - 11179, 11184, 11189, 11194, 11199, 11204, 11208, 11213, 11218, 11223, - 11228, 11233, 11237, 11241, 11245, 11249, 11253, 11257, 11261, 11265, - 11269, 11273, 11277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11282, - 11287, 11291, 11295, 11299, 11303, 11307, 11311, 11315, 11319, 11323, - 11327, 11332, 11336, 11340, 11344, 11349, 11353, 11358, 11362, 11367, - 11371, 11376, 11381, 11386, 11391, 11395, 11400, 11405, 11410, 11415, - 11419, 11424, 11431, 11435, 11440, 11444, 11448, 11453, 11457, 11464, - 11471, 11478, 11484, 11492, 11500, 11509, 11517, 11524, 11531, 11539, - 11545, 11551, 11557, 11563, 11570, 11575, 11579, 11584, 0, 0, 0, 0, 0, - 11588, 11593, 11598, 11603, 11608, 11613, 11618, 11623, 11628, 11633, - 11638, 11643, 11648, 11653, 11658, 11663, 11668, 11673, 11678, 11683, - 11688, 11693, 11698, 11703, 11708, 11713, 11718, 11726, 11733, 11739, - 11744, 11752, 11759, 11765, 11772, 11778, 11783, 11790, 11797, 11803, - 11808, 11813, 11819, 11824, 11829, 11835, 0, 0, 11840, 11846, 11852, - 11858, 11864, 11870, 11876, 11881, 11889, 11895, 11901, 11907, 11913, - 11919, 11927, 0, 11933, 11938, 11943, 11948, 11953, 11958, 11963, 11968, - 11973, 11978, 11983, 11988, 11993, 11998, 12003, 12008, 12013, 12018, - 12023, 12028, 12033, 12038, 12043, 12048, 12053, 12058, 12063, 12068, 0, - 0, 12073, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12077, 12083, - 12087, 12091, 12095, 12100, 12103, 12107, 12110, 12114, 12117, 12121, - 12125, 12129, 12134, 12139, 12142, 12146, 12151, 12156, 12159, 12163, - 12166, 12170, 12174, 12178, 12182, 12186, 12190, 12194, 12198, 12202, - 12206, 12210, 12214, 12218, 12222, 12226, 12230, 12234, 12238, 12241, - 12245, 12248, 12252, 12256, 12260, 12263, 12266, 12269, 12273, 12277, - 12281, 12285, 12289, 12293, 12297, 12301, 12304, 12309, 12314, 12318, - 12322, 12327, 12331, 12336, 12340, 12345, 12350, 12356, 12362, 12368, - 12372, 12377, 12383, 12389, 12393, 12398, 12402, 12408, 12413, 12416, - 12422, 12428, 12433, 12438, 12445, 12450, 12455, 12459, 12463, 12467, - 12471, 12475, 12479, 12483, 12487, 12492, 12497, 12502, 12508, 12511, - 12515, 12519, 12522, 12525, 12528, 12531, 12534, 12537, 12540, 12543, - 12546, 12550, 12557, 12562, 12566, 12570, 12574, 12578, 0, 12582, 12586, - 12590, 12594, 12598, 12604, 12608, 0, 12612, 12616, 12620, 0, 12624, - 12627, 12631, 12634, 12638, 12641, 12645, 12649, 0, 0, 12653, 12656, 0, - 0, 12660, 12663, 12667, 12670, 12674, 12678, 12682, 12686, 12690, 12694, - 12698, 12702, 12706, 12710, 12714, 12718, 12722, 12726, 12730, 12734, - 12738, 12742, 0, 12745, 12748, 12752, 12756, 12760, 12763, 12766, 0, - 12769, 0, 0, 0, 12773, 12777, 12781, 12785, 0, 0, 12788, 12792, 12796, - 12801, 12805, 12810, 12814, 12819, 12824, 0, 0, 12830, 12834, 0, 0, - 12839, 12843, 12848, 12852, 0, 0, 0, 0, 0, 0, 0, 0, 12858, 0, 0, 0, 0, - 12864, 12868, 0, 12872, 12876, 12881, 12886, 12891, 0, 0, 12897, 12901, - 12904, 12907, 12910, 12913, 12916, 12919, 12922, 12925, 12928, 12937, - 12946, 12950, 12954, 12960, 12966, 12972, 12978, 12992, 12999, 13002, 0, - 0, 0, 0, 0, 13006, 13012, 13016, 0, 13020, 13023, 13027, 13030, 13034, - 13037, 0, 0, 0, 0, 13041, 13045, 0, 0, 13049, 13053, 13057, 13060, 13064, - 13068, 13072, 13076, 13080, 13084, 13088, 13092, 13096, 13100, 13104, - 13108, 13112, 13116, 13120, 13124, 13128, 13132, 0, 13135, 13138, 13142, - 13146, 13150, 13153, 13156, 0, 13159, 13163, 0, 13167, 13171, 0, 13175, - 13179, 0, 0, 13182, 0, 13186, 13191, 13195, 13200, 13204, 0, 0, 0, 0, - 13209, 13214, 0, 0, 13219, 13224, 13229, 0, 0, 0, 13233, 0, 0, 0, 0, 0, - 0, 0, 13237, 13241, 13245, 13249, 0, 13253, 0, 0, 0, 0, 0, 0, 0, 13257, - 13261, 13264, 13267, 13270, 13273, 13276, 13279, 13282, 13285, 13288, - 13291, 13294, 13297, 13300, 13305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13309, 13313, 13317, 0, 13321, 13324, 13328, 13331, 13335, 13338, 13342, - 13346, 13350, 0, 13355, 13358, 13362, 0, 13367, 13370, 13374, 13377, - 13381, 13385, 13389, 13393, 13397, 13401, 13405, 13409, 13413, 13417, - 13421, 13425, 13429, 13433, 13437, 13441, 13445, 13449, 0, 13452, 13455, - 13459, 13463, 13467, 13470, 13473, 0, 13476, 13480, 0, 13484, 13488, - 13492, 13496, 13500, 0, 0, 13503, 13507, 13511, 13516, 13520, 13525, - 13529, 13534, 13539, 13545, 0, 13551, 13555, 13560, 0, 13566, 13570, - 13575, 0, 0, 13579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13582, - 13587, 13592, 13597, 0, 0, 13603, 13607, 13610, 13613, 13616, 13619, - 13622, 13625, 13628, 13631, 0, 13634, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13638, 13642, 13646, 0, 13650, 13653, 13657, 13660, 13664, - 13667, 13671, 13675, 0, 0, 13679, 13682, 0, 0, 13686, 13689, 13693, - 13696, 13700, 13704, 13708, 13712, 13716, 13720, 13724, 13728, 13732, - 13736, 13740, 13744, 13748, 13752, 13756, 13760, 13764, 13768, 0, 13771, - 13774, 13778, 13782, 13786, 13789, 13792, 0, 13795, 13799, 0, 13803, - 13807, 13811, 13815, 13819, 0, 0, 13822, 13826, 13830, 13835, 13839, - 13844, 13848, 13853, 13858, 0, 0, 13864, 13868, 0, 0, 13873, 13877, - 13882, 0, 0, 0, 0, 0, 0, 0, 0, 13886, 13892, 0, 0, 0, 0, 13898, 13902, 0, - 13906, 13910, 13915, 13920, 13925, 0, 0, 13931, 13935, 13938, 13941, - 13944, 13947, 13950, 13953, 13956, 13959, 13962, 13965, 13969, 13975, - 13981, 13987, 13993, 13999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14005, 14009, - 0, 14013, 14016, 14020, 14023, 14027, 14030, 0, 0, 0, 14034, 14037, - 14041, 0, 14045, 14048, 14052, 14056, 0, 0, 0, 14059, 14063, 0, 14067, 0, - 14071, 14075, 0, 0, 0, 14079, 14083, 0, 0, 0, 14087, 14090, 14094, 0, 0, - 0, 14097, 14100, 14103, 14106, 14110, 14114, 14118, 14122, 14126, 14130, - 14134, 14138, 0, 0, 0, 0, 14141, 14146, 14150, 14155, 14159, 0, 0, 0, - 14164, 14168, 14173, 0, 14178, 14182, 14187, 14192, 0, 0, 14196, 0, 0, 0, - 0, 0, 0, 14199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14205, 14209, - 14212, 14215, 14218, 14221, 14224, 14227, 14230, 14233, 14236, 14240, - 14245, 14250, 14254, 14258, 14262, 14266, 14270, 14275, 14279, 0, 0, 0, - 0, 0, 0, 14282, 14286, 14290, 0, 14294, 14297, 14301, 14304, 14308, - 14311, 14315, 14319, 0, 14323, 14326, 14330, 0, 14334, 14337, 14341, - 14345, 14348, 14352, 14356, 14360, 14364, 14368, 14372, 14376, 14380, - 14384, 14388, 14392, 14396, 14400, 14404, 14408, 14412, 14416, 14420, 0, - 14423, 14426, 14430, 14434, 14438, 14441, 14444, 14447, 14451, 14455, 0, - 14459, 14463, 14467, 14471, 14475, 0, 0, 0, 14478, 14482, 14487, 14491, - 14496, 14500, 14505, 14510, 0, 14516, 14520, 14525, 0, 14530, 14534, - 14539, 14544, 0, 0, 0, 0, 0, 0, 0, 14548, 14552, 0, 14558, 14562, 0, 0, - 0, 0, 0, 0, 14566, 14571, 14576, 14581, 0, 0, 14587, 14591, 14594, 14597, - 14600, 14603, 14606, 14609, 14612, 14615, 0, 0, 0, 0, 0, 0, 0, 0, 14618, - 14631, 14643, 14655, 14667, 14679, 14691, 14703, 0, 0, 14707, 14711, 0, - 14715, 14718, 14722, 14725, 14729, 14732, 14736, 14740, 0, 14744, 14747, - 14751, 0, 14755, 14758, 14762, 14766, 14769, 14773, 14777, 14781, 14785, - 14789, 14793, 14797, 14801, 14805, 14809, 14813, 14817, 14821, 14825, - 14829, 14833, 14837, 14841, 0, 14844, 14847, 14851, 14855, 14859, 14862, - 14865, 14868, 14872, 14876, 0, 14880, 14884, 14888, 14892, 14896, 0, 0, - 14899, 14903, 14907, 14912, 14916, 14921, 14925, 14930, 14935, 0, 14941, - 14945, 14950, 0, 14955, 14959, 14964, 14969, 0, 0, 0, 0, 0, 0, 0, 14973, - 14977, 0, 0, 0, 0, 0, 0, 0, 14983, 0, 14987, 14992, 14997, 15002, 0, 0, - 15008, 15012, 15015, 15018, 15021, 15024, 15027, 15030, 15033, 15036, 0, - 15039, 15043, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15047, 15051, - 0, 15055, 15058, 15062, 15065, 15069, 15072, 15076, 15080, 0, 15084, - 15087, 15091, 0, 15095, 15098, 15102, 15106, 15109, 15113, 15117, 15121, - 15125, 15129, 15133, 15137, 15141, 15145, 15149, 15153, 15157, 15161, - 15165, 15169, 15173, 15177, 15181, 15184, 15188, 15191, 15195, 15199, - 15203, 15206, 15209, 15212, 15216, 15220, 15224, 15228, 15232, 15236, - 15240, 15244, 15247, 0, 0, 15251, 15255, 15260, 15264, 15269, 15273, - 15278, 15283, 0, 15289, 15293, 15298, 0, 15303, 15307, 15312, 15317, - 15321, 0, 0, 0, 0, 0, 0, 0, 0, 15326, 0, 0, 0, 0, 0, 0, 0, 0, 15332, - 15337, 15342, 15347, 0, 0, 15353, 15357, 15360, 15363, 15366, 15369, - 15372, 15375, 15378, 15381, 15384, 15388, 15393, 15398, 15404, 15410, 0, - 0, 0, 15416, 15420, 15426, 15431, 15437, 15442, 15448, 0, 0, 15454, - 15458, 0, 15462, 15466, 15470, 15474, 15478, 15482, 15486, 15490, 15494, - 15498, 15502, 15506, 15510, 15514, 15518, 15522, 15526, 15530, 0, 0, 0, - 15534, 15540, 15546, 15552, 15558, 15564, 15570, 15576, 15582, 15588, - 15594, 15600, 15608, 15614, 15620, 15626, 15632, 15638, 15644, 15650, - 15656, 15662, 15668, 15674, 0, 15680, 15686, 15692, 15698, 15704, 15710, - 15714, 15720, 15724, 0, 15728, 0, 0, 15734, 15738, 15744, 15750, 15756, - 15760, 15766, 0, 0, 0, 15770, 0, 0, 0, 0, 15774, 15779, 15786, 15793, - 15800, 15807, 0, 15814, 0, 15821, 15826, 15831, 15838, 15845, 15854, - 15865, 15874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15879, 15886, 15893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15898, 15904, - 15910, 15916, 15922, 15928, 15934, 15940, 15946, 15952, 15958, 15964, - 15970, 15976, 15982, 15988, 15994, 16000, 16006, 16012, 16018, 16024, - 16030, 16036, 16042, 16048, 16054, 16060, 16066, 16072, 16078, 16084, - 16090, 16095, 16101, 16107, 16111, 16117, 16121, 16127, 16133, 16139, - 16145, 16151, 16157, 16162, 16168, 16172, 16177, 16183, 16189, 16195, - 16200, 16206, 16212, 16218, 16223, 16229, 0, 0, 0, 0, 16233, 16239, - 16244, 16250, 16255, 16263, 16271, 16275, 16279, 16283, 16289, 16295, - 16301, 16307, 16311, 16315, 16319, 16323, 16327, 16330, 16333, 16336, - 16339, 16342, 16345, 16348, 16351, 16354, 16358, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16362, 16367, 0, 16374, 0, 0, 16381, 16386, 0, 16391, 0, - 0, 16398, 0, 0, 0, 0, 0, 0, 16403, 16408, 16412, 16419, 0, 16426, 16431, - 16436, 16441, 16448, 16455, 16462, 0, 16469, 16474, 16479, 0, 16486, 0, - 16493, 0, 0, 16498, 16505, 0, 16512, 16516, 16523, 16527, 16532, 16540, - 16546, 16552, 16557, 16563, 16569, 16575, 16580, 0, 16586, 16594, 16601, - 0, 0, 16608, 16613, 16619, 16624, 16630, 0, 16636, 0, 16642, 16649, - 16656, 16663, 16670, 16675, 0, 0, 16679, 16684, 16688, 16692, 16696, - 16700, 16704, 16708, 16712, 16716, 0, 0, 16720, 16726, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16732, 16736, 16747, 16762, 16777, 16787, 16798, 16811, - 16822, 16828, 16836, 16846, 16852, 16860, 16864, 16870, 16876, 16884, - 16894, 16902, 16915, 16921, 16929, 16937, 16949, 16956, 16964, 16972, - 16980, 16988, 16996, 17004, 17014, 17018, 17021, 17024, 17027, 17030, - 17033, 17036, 17039, 17042, 17045, 17049, 17053, 17057, 17061, 17065, - 17069, 17073, 17077, 17081, 17086, 17092, 17102, 17116, 17126, 17132, - 17138, 17146, 17154, 17162, 17170, 17176, 17182, 17185, 17189, 17193, - 17197, 17201, 17205, 17209, 0, 17213, 17217, 17221, 17225, 17229, 17233, - 17237, 17241, 17245, 17249, 17253, 17256, 17259, 17263, 17267, 17271, - 17274, 17278, 17282, 17286, 17290, 17294, 17298, 17302, 17306, 17309, - 17312, 17316, 17320, 17324, 17328, 17331, 17334, 17338, 17343, 17347, 0, - 0, 0, 0, 17351, 17356, 17360, 17365, 17369, 17374, 17379, 17385, 17390, - 17396, 17400, 17405, 17409, 17414, 17424, 17430, 17436, 17443, 17453, - 17459, 17463, 17467, 17473, 17479, 17487, 17493, 17501, 17509, 17517, - 17527, 17535, 17545, 17550, 17556, 17562, 17568, 17574, 17580, 17586, 0, - 17592, 17598, 17604, 17610, 17616, 17622, 17628, 17634, 17640, 17646, - 17652, 17657, 17662, 17668, 17674, 17680, 17685, 17691, 17697, 17703, - 17709, 17715, 17721, 17727, 17733, 17738, 17743, 17749, 17755, 17761, - 17767, 17772, 17777, 17783, 17791, 17798, 0, 17805, 17812, 17825, 17832, - 17839, 17847, 17855, 17861, 17867, 17873, 17883, 17888, 17894, 17904, - 17914, 0, 17924, 17934, 17942, 17954, 17966, 17972, 17986, 18001, 18006, - 18011, 18019, 18027, 18035, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18043, - 18046, 18050, 18054, 18058, 18062, 18066, 18070, 18074, 18078, 18082, - 18086, 18090, 18094, 18098, 18102, 18106, 18110, 18114, 18118, 18122, - 18125, 18128, 18132, 18136, 18140, 18143, 18146, 18149, 18153, 18157, - 18161, 18164, 18168, 18171, 18176, 18179, 18183, 18186, 18190, 18193, - 18198, 18201, 18205, 18212, 18217, 18221, 18226, 18230, 18235, 18239, - 18244, 18251, 18257, 18262, 18266, 18270, 18274, 18278, 18282, 18288, - 18294, 18301, 18307, 18313, 18317, 18320, 18323, 18326, 18329, 18332, - 18335, 18338, 18341, 18344, 18350, 18354, 18358, 18362, 18366, 18370, - 18374, 18378, 18382, 18387, 18391, 18396, 18401, 18407, 18412, 18418, - 18424, 18430, 18436, 18442, 18450, 18458, 18467, 18475, 18484, 18493, - 18504, 18514, 18524, 18535, 18546, 18556, 18566, 18576, 18586, 18596, - 18606, 18616, 18626, 18634, 18641, 18647, 18654, 18659, 18665, 18671, - 18677, 18683, 18689, 18695, 18700, 18706, 18712, 18718, 18724, 18729, - 18738, 18745, 18751, 18758, 18766, 18772, 18778, 18784, 18790, 18798, - 18806, 18816, 18824, 18832, 18838, 18843, 18848, 18853, 18858, 18863, - 18868, 18873, 18878, 18883, 18889, 18895, 18901, 18908, 18913, 18919, - 18924, 18929, 18934, 18939, 18944, 18949, 18954, 18959, 18964, 18969, - 18974, 18979, 18984, 18989, 18994, 18999, 19004, 19009, 19014, 19019, - 19024, 19029, 19034, 19039, 19044, 19049, 19054, 19059, 19064, 19069, - 19074, 19079, 19084, 19089, 19094, 19099, 19104, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19109, 19113, 19117, 19121, 19125, 19129, 19133, 19137, 19141, - 19145, 19149, 19153, 19157, 19161, 19165, 19169, 19173, 19177, 19181, - 19185, 19189, 19193, 19197, 19201, 19205, 19209, 19213, 19217, 19221, - 19225, 19229, 19233, 19237, 19241, 19245, 19249, 19253, 19257, 19261, - 19265, 19269, 19273, 19279, 19283, 19288, 0, 0, 0, 19293, 19297, 19301, - 19305, 19309, 19313, 19317, 19321, 19325, 19329, 19333, 19337, 19341, - 19345, 19349, 19353, 19357, 19361, 19365, 19369, 19373, 19377, 19381, - 19385, 19389, 19393, 19397, 19401, 19405, 19409, 19413, 19417, 19421, - 19425, 19429, 19433, 19437, 19441, 19445, 19449, 19453, 19457, 19461, - 19465, 19469, 19473, 19477, 19481, 19485, 19489, 19493, 19497, 19501, - 19505, 19509, 19513, 19517, 19521, 19525, 19529, 19533, 19537, 19541, - 19545, 19549, 19553, 19557, 19561, 19565, 19569, 19573, 19577, 19581, - 19585, 19589, 19593, 19597, 19601, 19605, 19609, 19613, 19617, 19621, - 19625, 19629, 19633, 19637, 19641, 19645, 19649, 19653, 19657, 19661, - 19665, 19669, 19673, 19677, 19681, 19684, 19688, 19691, 19695, 19699, - 19702, 19706, 19710, 19713, 19717, 19721, 19725, 19729, 19732, 19736, - 19740, 19744, 19748, 19752, 19756, 19759, 19763, 19767, 19771, 19775, - 19779, 19783, 19787, 19791, 19795, 19799, 19803, 19807, 19811, 19815, - 19819, 19823, 19827, 19831, 19835, 19839, 19843, 19847, 19851, 19855, - 19859, 19863, 19867, 19871, 19875, 19879, 19883, 19887, 19891, 19895, - 19899, 19903, 19907, 19911, 19915, 19919, 19923, 19927, 19931, 19935, - 19939, 19943, 19947, 19951, 19955, 19959, 19963, 19967, 19971, 19975, - 19979, 19983, 19987, 19991, 19995, 19999, 20003, 20007, 20011, 20015, - 20019, 20023, 20027, 20031, 20035, 20039, 20043, 20047, 20051, 20055, - 20059, 20063, 20067, 20071, 20075, 20079, 20083, 20087, 20091, 20095, - 20099, 20103, 20107, 20111, 20115, 20119, 20123, 20127, 20131, 20135, - 20139, 20143, 20147, 20151, 20155, 20159, 20163, 20167, 20171, 20175, - 20179, 20183, 20187, 20191, 20195, 20199, 20203, 20207, 20211, 20215, - 20219, 20223, 20227, 20231, 20235, 20239, 20243, 20247, 20251, 20255, - 20259, 20263, 20267, 20271, 20275, 20279, 20283, 20287, 20291, 20295, - 20299, 20303, 20307, 20311, 20314, 20318, 20322, 20326, 20330, 20334, - 20338, 20342, 20346, 20350, 20354, 20358, 20362, 20366, 20370, 20374, - 20378, 20382, 20386, 20390, 20394, 20398, 20402, 20406, 20409, 20413, - 20417, 20421, 20425, 20429, 20433, 20437, 20441, 20445, 20449, 20453, - 20457, 20461, 20465, 20469, 20472, 20476, 20480, 20484, 20488, 20492, - 20496, 20500, 20504, 20508, 20512, 20516, 20520, 20524, 20528, 20532, - 20536, 20540, 20544, 20548, 20552, 20556, 20560, 20564, 20568, 20572, - 20576, 20580, 20584, 20588, 20592, 20596, 0, 20600, 20604, 20608, 20612, - 0, 0, 20616, 20620, 20624, 20628, 20632, 20636, 20640, 0, 20644, 0, - 20648, 20652, 20656, 20660, 0, 0, 20664, 20668, 20672, 20676, 20680, - 20684, 20688, 20692, 20696, 20700, 20704, 20708, 20712, 20716, 20720, - 20724, 20728, 20732, 20736, 20740, 20744, 20748, 20752, 20755, 20759, - 20763, 20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799, - 20803, 20807, 20811, 20815, 20819, 20823, 0, 20827, 20831, 20835, 20839, - 0, 0, 20843, 20846, 20850, 20854, 20858, 20862, 20866, 20870, 20874, - 20878, 20882, 20886, 20890, 20894, 20898, 20902, 20906, 20911, 20916, - 20921, 20927, 20933, 20938, 20943, 20949, 20952, 20956, 20960, 20964, - 20968, 20972, 20976, 20980, 0, 20984, 20988, 20992, 20996, 0, 0, 21000, - 21004, 21008, 21012, 21016, 21020, 21024, 0, 21028, 0, 21032, 21036, - 21040, 21044, 0, 0, 21048, 21052, 21056, 21060, 21064, 21068, 21072, - 21076, 21080, 21085, 21090, 21095, 21101, 21107, 21112, 0, 21117, 21121, - 21125, 21129, 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161, - 21165, 21169, 21173, 21177, 21181, 21184, 21188, 21192, 21196, 21200, - 21204, 21208, 21212, 21216, 21220, 21224, 21228, 21232, 21236, 21240, - 21244, 21248, 21252, 21256, 21260, 21264, 21268, 21272, 21276, 21280, - 21284, 21288, 21292, 21296, 21300, 21304, 21308, 21312, 21316, 21320, - 21324, 21328, 21332, 21336, 21340, 0, 21344, 21348, 21352, 21356, 0, 0, - 21360, 21364, 21368, 21372, 21376, 21380, 21384, 21388, 21392, 21396, - 21400, 21404, 21408, 21412, 21416, 21420, 21424, 21428, 21432, 21436, - 21440, 21444, 21448, 21452, 21456, 21460, 21464, 21468, 21472, 21476, - 21480, 21484, 21488, 21492, 21496, 21500, 21504, 21508, 21512, 21516, - 21520, 21524, 21528, 21532, 21536, 21540, 21544, 21548, 21552, 21556, - 21560, 21564, 21568, 21572, 21576, 21580, 21584, 21587, 21591, 21595, - 21599, 21603, 21607, 21611, 21615, 21619, 21623, 0, 0, 21627, 21636, - 21642, 21647, 21651, 21654, 21659, 21662, 21665, 21668, 21673, 21677, - 21682, 21685, 21688, 21691, 21694, 21697, 21700, 21703, 21706, 21709, - 21713, 21717, 21721, 21725, 21729, 21733, 21737, 21741, 21745, 21749, 0, - 0, 0, 21755, 21761, 21765, 21769, 21773, 21779, 21783, 21787, 21791, - 21797, 21801, 21805, 21809, 21815, 21819, 21823, 21827, 21833, 21839, - 21845, 21853, 21859, 21865, 21871, 21877, 21883, 0, 0, 0, 0, 0, 0, 21889, - 21892, 21895, 21898, 21901, 21904, 21908, 21912, 21915, 21919, 21923, - 21927, 21931, 21935, 21938, 21942, 21946, 21950, 21954, 21958, 21962, - 21966, 21970, 21974, 21978, 21982, 21985, 21989, 21993, 21997, 22001, - 22004, 22008, 22012, 22016, 22020, 22024, 22028, 22032, 22036, 22040, - 22044, 22048, 22052, 22056, 22060, 22063, 22067, 22071, 22075, 22079, - 22083, 22087, 22091, 22095, 22099, 22103, 22107, 22111, 22115, 22119, - 22123, 22127, 22131, 22135, 22139, 22143, 22147, 22151, 22155, 22159, - 22163, 22167, 22171, 22175, 22179, 22183, 22187, 22191, 22195, 22198, - 22202, 22206, 22210, 22214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22218, - 22222, 22225, 22229, 22232, 22236, 22239, 22243, 22249, 22254, 22258, - 22261, 22265, 22269, 22274, 22278, 22283, 22287, 22292, 22296, 22301, - 22305, 22310, 22316, 22320, 22325, 22329, 22334, 22340, 22344, 22350, - 22356, 22360, 22365, 22373, 22381, 22388, 22393, 22398, 22407, 22414, - 22421, 22426, 22432, 22436, 22440, 22444, 22448, 22452, 22456, 22460, - 22464, 22468, 22472, 22478, 22483, 22488, 22491, 22495, 22499, 22504, - 22508, 22513, 22517, 22522, 22526, 22531, 22535, 22540, 22544, 22549, - 22553, 22558, 22564, 22568, 22573, 22578, 22582, 22586, 22590, 22594, - 22597, 22601, 22607, 22612, 22617, 22621, 22625, 22629, 22634, 22638, - 22643, 22647, 22652, 22655, 22659, 22663, 22668, 22672, 22677, 22681, - 22686, 22692, 22696, 22700, 22704, 22708, 22712, 22716, 22720, 22724, - 22728, 22732, 22736, 22742, 22745, 22749, 22753, 22758, 22762, 22767, - 22771, 22776, 22780, 22785, 22789, 22794, 22798, 22803, 22807, 22812, - 22818, 22822, 22826, 22832, 22838, 22844, 22850, 22854, 22858, 22862, - 22866, 22870, 22874, 22880, 22884, 22888, 22892, 22897, 22901, 22906, - 22910, 22915, 22919, 22924, 22928, 22933, 22937, 22942, 22946, 22951, - 22957, 22961, 22967, 22971, 22975, 22979, 22983, 22987, 22991, 22997, - 23000, 23004, 23008, 23013, 23017, 23022, 23026, 23031, 23035, 23040, - 23044, 23049, 23053, 23058, 23062, 23067, 23073, 23076, 23080, 23084, - 23089, 23094, 23098, 23102, 23106, 23110, 23114, 23118, 23124, 23127, - 23131, 23135, 23140, 23144, 23149, 23153, 23158, 23164, 23167, 23172, - 23176, 23180, 23184, 23188, 23192, 23196, 23200, 23206, 23210, 23214, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 355, 359, 364, + 367, 370, 373, 376, 379, 382, 384, 387, 393, 401, 404, 408, 411, 413, + 416, 419, 422, 425, 429, 432, 435, 439, 441, 444, 450, 458, 465, 472, + 479, 484, 490, 496, 503, 509, 516, 524, 529, 537, 543, 549, 556, 563, + 570, 577, 585, 593, 598, 605, 611, 617, 624, 630, 637, 640, 646, 652, + 658, 665, 672, 679, 684, 690, 696, 702, 709, 715, 722, 730, 735, 743, + 749, 755, 762, 769, 776, 783, 791, 799, 804, 811, 817, 823, 830, 836, + 843, 846, 852, 858, 864, 871, 878, 885, 890, 898, 905, 912, 919, 926, + 933, 940, 947, 954, 962, 970, 978, 986, 994, 1002, 1010, 1018, 1025, + 1032, 1039, 1046, 1053, 1060, 1067, 1074, 1081, 1088, 1095, 1102, 1110, + 1118, 1126, 1134, 1142, 1150, 1158, 1166, 1174, 1182, 1189, 1196, 1203, + 1210, 1218, 1226, 1234, 1242, 1250, 1258, 1266, 1272, 1277, 1282, 1290, + 1298, 1306, 1314, 1319, 1326, 1333, 1341, 1349, 1357, 1365, 1375, 1385, + 1392, 1399, 1406, 1413, 1421, 1429, 1437, 1445, 1456, 1461, 1466, 1473, + 1480, 1487, 1494, 1501, 1508, 1513, 1518, 1525, 1532, 1540, 1548, 1556, + 1564, 1571, 1578, 1586, 1594, 1602, 1610, 1618, 1626, 1634, 1642, 1650, + 1658, 1665, 1672, 1678, 1684, 1691, 1698, 1705, 1712, 1720, 1728, 1735, + 1742, 1749, 1756, 1764, 1772, 1780, 1788, 1796, 1803, 1810, 1818, 1826, + 1834, 1842, 1847, 1853, 1859, 1866, 1873, 1878, 1883, 1888, 1895, 1902, + 1909, 1916, 1924, 1932, 1939, 1945, 1950, 1955, 1962, 1969, 1976, 1981, + 1986, 1991, 1998, 2005, 2012, 2019, 2026, 2032, 2040, 2050, 2058, 2065, + 2072, 2077, 2082, 2089, 2096, 2100, 2105, 2110, 2115, 2123, 2132, 2139, + 2146, 2155, 2162, 2169, 2174, 2181, 2188, 2195, 2202, 2209, 2214, 2221, + 2228, 2236, 2241, 2246, 2251, 2261, 2265, 2271, 2277, 2283, 2289, 2297, + 2310, 2318, 2323, 2333, 2338, 2343, 2353, 2358, 2365, 2372, 2380, 2388, + 2395, 2402, 2409, 2416, 2426, 2436, 2445, 2454, 2464, 2474, 2483, 2492, + 2498, 2508, 2518, 2528, 2538, 2546, 2554, 2561, 2568, 2576, 2584, 2592, + 2600, 2607, 2614, 2624, 2634, 2642, 2650, 2658, 2663, 2673, 2678, 2685, + 2692, 2697, 2702, 2709, 2716, 2726, 2736, 2743, 2750, 2759, 2768, 2775, + 2782, 2791, 2800, 2807, 2814, 2823, 2832, 2840, 2848, 2858, 2868, 2875, + 2882, 2891, 2900, 2908, 2916, 2926, 2936, 2943, 2950, 2959, 2968, 2977, + 2986, 2995, 3004, 3009, 3014, 3022, 3030, 3040, 3048, 3053, 3058, 3065, + 3072, 3079, 3086, 3093, 3100, 3110, 3120, 3130, 3140, 3147, 3154, 3164, + 3174, 3182, 3190, 3198, 3206, 3214, 3221, 3228, 3235, 3241, 3248, 3255, + 3262, 3271, 3281, 3291, 3298, 3305, 3311, 3316, 3323, 3329, 3335, 3342, + 3349, 3360, 3370, 3377, 3384, 3391, 3398, 3404, 3409, 3416, 3422, 3427, + 3435, 3443, 3450, 3456, 3461, 3468, 3473, 3480, 3489, 3498, 3507, 3514, + 3520, 3526, 3531, 3538, 3545, 3552, 3559, 3566, 3571, 3576, 3585, 3593, + 3602, 3607, 3613, 3624, 3631, 3639, 3648, 3653, 3659, 3665, 3672, 3677, + 3683, 3694, 3703, 3712, 3720, 3728, 3738, 3743, 3750, 3757, 3762, 3774, + 3783, 3791, 3798, 3807, 3812, 3817, 3824, 3831, 3838, 3845, 3851, 3860, + 3868, 3873, 3881, 3887, 3895, 3903, 3909, 3915, 3921, 3928, 3936, 3942, + 3950, 3957, 3962, 3969, 3977, 3987, 3994, 4001, 4011, 4018, 4025, 4035, + 4042, 4049, 4056, 4062, 4068, 4078, 4091, 4096, 4103, 4108, 4112, 4118, + 4127, 4134, 4139, 4144, 4148, 4153, 4159, 4163, 4169, 4175, 4181, 4187, + 4195, 4200, 4205, 4210, 4215, 4221, 4223, 4228, 4232, 4238, 4244, 4250, + 4255, 4262, 4269, 4275, 4282, 4290, 4298, 4303, 4308, 4312, 4317, 4319, + 4321, 4324, 4326, 4328, 4333, 4338, 4344, 4349, 4353, 4357, 4362, 4371, + 4377, 4382, 4388, 4393, 4399, 4407, 4415, 4419, 4423, 4428, 4434, 4440, + 4446, 4452, 4457, 4465, 4474, 4483, 4487, 4493, 4500, 4507, 4514, 4521, + 4525, 4530, 4535, 4540, 4545, 4550, 4552, 4555, 4558, 4561, 4564, 4567, + 4571, 4575, 4581, 4584, 4589, 4595, 4601, 4604, 4609, 4615, 4619, 4625, + 4631, 4637, 4643, 4648, 4653, 4658, 4661, 4667, 4672, 4677, 4681, 4686, + 4692, 4698, 4701, 4705, 4709, 4713, 4716, 4719, 4724, 4728, 4735, 4739, + 4745, 4749, 4755, 4759, 4763, 4767, 4772, 4777, 4784, 4790, 4797, 4803, + 4809, 4815, 4818, 4822, 4826, 4829, 4833, 4838, 4843, 4847, 4851, 4857, + 4861, 4865, 4870, 4876, 4881, 4887, 4891, 4898, 4903, 4908, 4913, 4918, + 4924, 4927, 4931, 4936, 4941, 4950, 4956, 4961, 4965, 4970, 4974, 4979, + 4983, 4987, 4992, 4995, 5001, 5006, 5011, 5016, 5021, 5026, 5031, 5037, + 5043, 5049, 5054, 5059, 5065, 5071, 5077, 5082, 5087, 5094, 5101, 5105, + 5111, 5118, 0, 0, 5125, 5128, 5137, 5146, 5157, 0, 0, 0, 0, 0, 5161, + 5164, 5169, 5177, 5182, 5190, 5198, 0, 5206, 0, 5214, 5222, 5230, 5241, + 5246, 5251, 5256, 5261, 5266, 5271, 5276, 5281, 5286, 5291, 5296, 5301, + 5306, 5311, 5316, 5321, 0, 5326, 5331, 5336, 5341, 5346, 5351, 5356, + 5361, 5369, 5377, 5385, 5393, 5401, 5409, 5420, 5425, 5430, 5435, 5440, + 5445, 5450, 5455, 5460, 5465, 5470, 5475, 5480, 5485, 5490, 5495, 5500, + 5505, 5511, 5516, 5521, 5526, 5531, 5536, 5541, 5546, 5554, 5562, 5570, + 5578, 5586, 5591, 5595, 5599, 5606, 5616, 5626, 5630, 5634, 5638, 5644, + 5651, 5655, 5660, 5664, 5669, 5673, 5678, 5682, 5687, 5692, 5697, 5702, + 5707, 5712, 5717, 5722, 5727, 5732, 5737, 5742, 5747, 5752, 5757, 5761, + 5765, 5771, 5775, 5780, 5786, 5794, 5799, 5804, 5811, 5816, 5821, 5828, + 5837, 5846, 5857, 5864, 5869, 5874, 5879, 5886, 5891, 5897, 5902, 5907, + 5912, 5917, 5922, 5927, 5934, 5940, 5945, 5949, 5954, 5959, 5964, 5969, + 5974, 5979, 5984, 5988, 5994, 5998, 6003, 6008, 6013, 6017, 6022, 6027, + 6032, 6037, 6041, 6046, 6050, 6055, 6060, 6065, 6070, 6076, 6081, 6087, + 6091, 6096, 6100, 6104, 6109, 6114, 6119, 6124, 6129, 6134, 6139, 6143, + 6149, 6153, 6158, 6163, 6168, 6172, 6177, 6182, 6187, 6192, 6196, 6201, + 6205, 6210, 6215, 6220, 6225, 6231, 6236, 6242, 6246, 6251, 6255, 6262, + 6267, 6272, 6277, 6284, 6289, 6295, 6300, 6305, 6310, 6315, 6320, 6325, + 6332, 6338, 6343, 6348, 6353, 6358, 6363, 6369, 6375, 6382, 6389, 6398, + 6407, 6414, 6421, 6430, 6439, 6444, 6449, 6454, 6459, 6464, 6469, 6474, + 6479, 6490, 6501, 6506, 6511, 6518, 6525, 6533, 6541, 6546, 6551, 6556, + 6561, 6565, 6569, 6573, 6579, 6585, 6589, 6596, 6601, 6611, 6621, 6627, + 6633, 6641, 6649, 6657, 6665, 6672, 6679, 6688, 6697, 6705, 6713, 6721, + 6729, 6737, 6745, 6753, 6761, 6768, 6775, 6781, 6787, 6795, 6803, 6810, + 6817, 6826, 6835, 6841, 6847, 6855, 6863, 6871, 6879, 6885, 6891, 6899, + 6907, 6915, 6923, 6930, 6937, 6945, 6953, 6961, 6969, 6974, 6979, 6986, + 6993, 7003, 7013, 7017, 7025, 7033, 7040, 7047, 7055, 7063, 7070, 7077, + 7085, 7093, 7100, 7107, 7115, 7123, 7128, 7135, 7142, 7149, 7156, 7162, + 7168, 7176, 7184, 7189, 7194, 7202, 7210, 7218, 7226, 7234, 7242, 7249, + 7256, 7264, 7272, 7280, 7288, 7295, 7302, 7308, 7314, 7323, 7332, 7339, + 7346, 7353, 7360, 7367, 7374, 7381, 7388, 7396, 7404, 7412, 7420, 7428, + 7436, 7446, 7456, 7463, 7470, 7477, 7484, 7491, 7498, 7505, 7512, 7519, + 7526, 7533, 7540, 7547, 7554, 7561, 7568, 7575, 7582, 7589, 7596, 7603, + 7610, 7617, 7624, 7629, 7634, 7639, 7644, 7649, 7654, 7659, 7664, 7669, + 7674, 7680, 7686, 7695, 7704, 7713, 7722, 7730, 7738, 7746, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 7754, 7759, 7764, 7769, 7774, 7779, 7784, 7789, 7794, + 7798, 7803, 7808, 7813, 7818, 7823, 7828, 7833, 7838, 7843, 7848, 7853, + 7858, 7863, 7868, 7873, 7878, 7883, 7888, 7892, 7897, 7902, 7907, 7912, + 7917, 7922, 7927, 7932, 7937, 0, 0, 7942, 7949, 7952, 7956, 7960, 7963, + 7967, 0, 7971, 7976, 7981, 7986, 7991, 7996, 8001, 8006, 8011, 8015, + 8020, 8025, 8030, 8035, 8040, 8045, 8050, 8055, 8060, 8065, 8070, 8075, + 8080, 8085, 8090, 8095, 8100, 8105, 8109, 8114, 8119, 8124, 8129, 8134, + 8139, 8144, 8149, 8154, 8159, 0, 8166, 8171, 0, 0, 0, 0, 0, 0, 8174, + 8179, 8184, 8189, 8196, 8203, 8208, 8213, 8218, 8223, 8228, 8233, 8238, + 8245, 8250, 8257, 8264, 8269, 8276, 8281, 8286, 8291, 8298, 8303, 8308, + 8315, 8324, 8329, 8334, 8339, 8344, 8350, 8355, 8362, 8369, 8376, 8381, + 8386, 8391, 8396, 8401, 8406, 8416, 8421, 8429, 8434, 8439, 8444, 8449, + 8456, 8463, 8470, 8476, 8482, 8489, 0, 0, 0, 0, 0, 0, 0, 0, 8496, 8500, + 8504, 8508, 8512, 8516, 8520, 8524, 8528, 8532, 8536, 8541, 8545, 8549, + 8554, 8558, 8563, 8567, 8571, 8575, 8580, 8584, 8589, 8593, 8597, 8601, + 8605, 0, 0, 0, 0, 0, 8609, 8616, 8624, 8631, 8636, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 8641, 8644, 8648, 8653, 0, 0, 8657, 8663, 8669, 8672, 8679, + 8688, 8691, 8694, 8699, 8705, 8709, 8717, 8723, 8729, 8737, 8741, 8746, + 8757, 8762, 8766, 8770, 8774, 0, 0, 8777, 8784, 8788, 8794, 8798, 8805, + 8811, 8818, 8824, 8830, 8834, 8838, 8844, 8848, 8852, 8856, 8860, 8864, + 8868, 8872, 8876, 8880, 8884, 8888, 8892, 8896, 8900, 8904, 8908, 8912, + 8920, 8928, 8938, 8947, 8956, 8959, 8963, 8967, 8971, 8975, 8979, 8983, + 8987, 8991, 8996, 9000, 9003, 9006, 9009, 9012, 9015, 9018, 9021, 9024, + 9028, 9031, 9034, 9039, 9044, 9050, 9053, 9060, 9069, 9074, 9079, 9086, + 9091, 9096, 9100, 9104, 9108, 9112, 9116, 9120, 9124, 9128, 9132, 9136, + 9141, 9146, 9153, 9159, 9165, 9171, 9176, 9184, 9192, 9197, 9203, 9209, + 9215, 9221, 9225, 9229, 9233, 9240, 9250, 9254, 9258, 9262, 9268, 9276, + 9280, 9284, 9291, 9295, 9299, 9303, 9310, 9317, 9329, 9333, 9337, 9341, + 9351, 9360, 9364, 9372, 9379, 9386, 9395, 9406, 9414, 9418, 9427, 9438, + 9446, 9459, 9467, 9475, 9483, 9491, 9497, 9506, 9513, 9517, 9525, 9529, + 9536, 9544, 9548, 9554, 9561, 9568, 9572, 9580, 9584, 9591, 9595, 9603, + 9607, 9615, 9623, 9630, 9638, 9646, 9653, 9659, 9663, 9670, 9678, 9684, + 9691, 9698, 9704, 9713, 9721, 9728, 9734, 9738, 9741, 9745, 9751, 9759, + 9763, 9769, 9775, 9782, 9789, 9792, 9799, 9804, 9812, 9817, 9821, 9834, + 9847, 9853, 9860, 9865, 9871, 9876, 9882, 9892, 9899, 9908, 9918, 9924, + 9929, 9934, 9938, 9942, 9947, 9952, 9958, 9966, 9974, 9985, 9990, 9999, + 10008, 10015, 10021, 10027, 10033, 10039, 10045, 10051, 10057, 10063, + 10069, 10076, 10083, 10090, 10096, 10104, 10113, 10119, 10126, 10133, + 10138, 10143, 10147, 10154, 10161, 10170, 10179, 10182, 10187, 10192, 0, + 10197, 10201, 10205, 10211, 10215, 10219, 10225, 10229, 10237, 10241, + 10245, 10249, 10253, 10257, 10263, 10267, 10273, 10277, 10281, 10285, + 10289, 10293, 10298, 10301, 10305, 10311, 10315, 10319, 10323, 10327, + 10331, 10337, 10343, 10349, 10353, 10357, 10362, 10366, 10370, 10375, + 10379, 10383, 10390, 10397, 10401, 10405, 10410, 10414, 10418, 10421, + 10426, 10429, 10432, 10437, 10442, 10446, 10450, 10456, 10462, 10465, 0, + 0, 10468, 10474, 10480, 10486, 10496, 10508, 10520, 10537, 10549, 10560, + 10568, 10575, 10586, 10601, 10612, 10618, 10627, 10635, 10647, 10657, + 10665, 10677, 10684, 10692, 10704, 10710, 10716, 10724, 10732, 10740, + 10746, 10756, 10763, 10773, 10783, 10796, 10810, 10824, 10834, 10845, + 10856, 10869, 10882, 10896, 10908, 10920, 10933, 10946, 10958, 10971, + 10980, 10988, 10993, 10998, 11003, 11008, 11013, 11018, 11023, 11028, + 11033, 11038, 11043, 11048, 11053, 11058, 11063, 11068, 11073, 11078, + 11083, 11088, 11093, 11098, 11103, 11108, 11113, 11118, 11123, 11128, + 11133, 11138, 11143, 11148, 11152, 11157, 11162, 11167, 11172, 11177, + 11181, 11185, 11189, 11193, 11197, 11201, 11205, 11209, 11213, 11217, + 11221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11226, 11231, 11235, + 11239, 11243, 11247, 11251, 11255, 11259, 11263, 11267, 11271, 11276, + 11280, 11284, 11288, 11293, 11297, 11302, 11306, 11311, 11315, 11320, + 11325, 11330, 11335, 11339, 11344, 11349, 11354, 11359, 11363, 11368, + 11375, 11379, 11384, 11388, 11392, 11397, 11401, 11408, 11415, 11422, + 11428, 11436, 11444, 11453, 11461, 11468, 11475, 11483, 11489, 11495, + 11501, 11507, 11514, 11519, 11523, 11528, 0, 0, 0, 0, 0, 11532, 11537, + 11542, 11547, 11552, 11557, 11562, 11567, 11572, 11577, 11582, 11587, + 11592, 11597, 11602, 11607, 11612, 11617, 11622, 11627, 11632, 11637, + 11642, 11647, 11652, 11657, 11662, 11670, 11677, 11683, 11688, 11696, + 11703, 11709, 11716, 11722, 11727, 11734, 11741, 11747, 11752, 11757, + 11763, 11768, 11773, 11779, 0, 0, 11784, 11790, 11796, 11802, 11808, + 11814, 11820, 11825, 11833, 11839, 11845, 11851, 11857, 11863, 11871, 0, + 11877, 11882, 11887, 11892, 11897, 11902, 11907, 11912, 11917, 11922, + 11927, 11932, 11937, 11942, 11947, 11952, 11957, 11962, 11967, 11972, + 11977, 11982, 11987, 11992, 11997, 12002, 12007, 12012, 0, 0, 12017, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12021, 12027, 12031, + 12035, 12039, 12044, 12047, 12051, 12054, 12058, 12061, 12065, 12069, + 12073, 12078, 12083, 12086, 12090, 12095, 12100, 12103, 12107, 12110, + 12114, 12118, 12122, 12126, 12130, 12134, 12138, 12142, 12146, 12150, + 12154, 12158, 12162, 12166, 12170, 12174, 12178, 12182, 12185, 12189, + 12192, 12196, 12200, 12204, 12207, 12210, 12213, 12217, 12221, 12225, + 12229, 12233, 12237, 12241, 12245, 12248, 12253, 12258, 12262, 12266, + 12271, 12275, 12280, 12284, 12289, 12294, 12300, 12306, 12312, 12316, + 12321, 12327, 12333, 12337, 12342, 12346, 12352, 12357, 12360, 12366, + 12372, 12377, 12382, 12389, 12394, 12399, 12403, 12407, 12411, 12415, + 12419, 12423, 12427, 12431, 12436, 12441, 12446, 12452, 12455, 12459, + 12463, 12466, 12469, 12472, 12475, 12478, 12481, 12484, 12487, 12490, + 12494, 12501, 12506, 12510, 12514, 12518, 12522, 0, 12526, 12530, 12534, + 12538, 12542, 12548, 12552, 0, 12556, 12560, 12564, 0, 12568, 12571, + 12575, 12578, 12582, 12585, 12589, 12593, 0, 0, 12597, 12600, 0, 0, + 12604, 12607, 12611, 12614, 12618, 12622, 12626, 12630, 12634, 12638, + 12642, 12646, 12650, 12654, 12658, 12662, 12666, 12670, 12674, 12678, + 12682, 12686, 0, 12689, 12692, 12696, 12700, 12704, 12707, 12710, 0, + 12713, 0, 0, 0, 12717, 12721, 12725, 12729, 0, 0, 12732, 12736, 12740, + 12745, 12749, 12754, 12758, 12763, 12768, 0, 0, 12774, 12778, 0, 0, + 12783, 12787, 12792, 12796, 0, 0, 0, 0, 0, 0, 0, 0, 12802, 0, 0, 0, 0, + 12808, 12812, 0, 12816, 12820, 12825, 12830, 12835, 0, 0, 12841, 12845, + 12848, 12851, 12854, 12857, 12860, 12863, 12866, 12869, 12872, 12881, + 12890, 12894, 12898, 12904, 12910, 12916, 12922, 12936, 12943, 12946, 0, + 0, 0, 0, 0, 12950, 12956, 12960, 0, 12964, 12967, 12971, 12974, 12978, + 12981, 0, 0, 0, 0, 12985, 12989, 0, 0, 12993, 12997, 13001, 13004, 13008, + 13012, 13016, 13020, 13024, 13028, 13032, 13036, 13040, 13044, 13048, + 13052, 13056, 13060, 13064, 13068, 13072, 13076, 0, 13079, 13082, 13086, + 13090, 13094, 13097, 13100, 0, 13103, 13107, 0, 13111, 13115, 0, 13119, + 13123, 0, 0, 13126, 0, 13130, 13135, 13139, 13144, 13148, 0, 0, 0, 0, + 13153, 13158, 0, 0, 13163, 13168, 13173, 0, 0, 0, 13177, 0, 0, 0, 0, 0, + 0, 0, 13181, 13185, 13189, 13193, 0, 13197, 0, 0, 0, 0, 0, 0, 0, 13201, + 13205, 13208, 13211, 13214, 13217, 13220, 13223, 13226, 13229, 13232, + 13235, 13238, 13241, 13244, 13249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13253, 13257, 13261, 0, 13265, 13268, 13272, 13275, 13279, 13282, 13286, + 13290, 13294, 0, 13299, 13302, 13306, 0, 13311, 13314, 13318, 13321, + 13325, 13329, 13333, 13337, 13341, 13345, 13349, 13353, 13357, 13361, + 13365, 13369, 13373, 13377, 13381, 13385, 13389, 13393, 0, 13396, 13399, + 13403, 13407, 13411, 13414, 13417, 0, 13420, 13424, 0, 13428, 13432, + 13436, 13440, 13444, 0, 0, 13447, 13451, 13455, 13460, 13464, 13469, + 13473, 13478, 13483, 13489, 0, 13495, 13499, 13504, 0, 13510, 13514, + 13519, 0, 0, 13523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13526, + 13531, 13536, 13541, 0, 0, 13547, 13551, 13554, 13557, 13560, 13563, + 13566, 13569, 13572, 13575, 0, 13578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 13582, 13586, 13590, 0, 13594, 13597, 13601, 13604, 13608, + 13611, 13615, 13619, 0, 0, 13623, 13626, 0, 0, 13630, 13633, 13637, + 13640, 13644, 13648, 13652, 13656, 13660, 13664, 13668, 13672, 13676, + 13680, 13684, 13688, 13692, 13696, 13700, 13704, 13708, 13712, 0, 13715, + 13718, 13722, 13726, 13730, 13733, 13736, 0, 13739, 13743, 0, 13747, + 13751, 13755, 13759, 13763, 0, 0, 13766, 13770, 13774, 13779, 13783, + 13788, 13792, 13797, 13802, 0, 0, 13808, 13812, 0, 0, 13817, 13821, + 13826, 0, 0, 0, 0, 0, 0, 0, 0, 13830, 13836, 0, 0, 0, 0, 13842, 13846, 0, + 13850, 13854, 13859, 13864, 13869, 0, 0, 13875, 13879, 13882, 13885, + 13888, 13891, 13894, 13897, 13900, 13903, 13906, 13909, 13913, 13919, + 13925, 13931, 13937, 13943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13949, 13953, + 0, 13957, 13960, 13964, 13967, 13971, 13974, 0, 0, 0, 13978, 13981, + 13985, 0, 13989, 13992, 13996, 14000, 0, 0, 0, 14003, 14007, 0, 14011, 0, + 14015, 14019, 0, 0, 0, 14023, 14027, 0, 0, 0, 14031, 14034, 14038, 0, 0, + 0, 14041, 14044, 14047, 14050, 14054, 14058, 14062, 14066, 14070, 14074, + 14078, 14082, 0, 0, 0, 0, 14085, 14090, 14094, 14099, 14103, 0, 0, 0, + 14108, 14112, 14117, 0, 14122, 14126, 14131, 14136, 0, 0, 14140, 0, 0, 0, + 0, 0, 0, 14143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14149, 14153, + 14156, 14159, 14162, 14165, 14168, 14171, 14174, 14177, 14180, 14184, + 14189, 14194, 14198, 14202, 14206, 14210, 14214, 14219, 14223, 0, 0, 0, + 0, 0, 0, 14226, 14230, 14234, 0, 14238, 14241, 14245, 14248, 14252, + 14255, 14259, 14263, 0, 14267, 14270, 14274, 0, 14278, 14281, 14285, + 14289, 14292, 14296, 14300, 14304, 14308, 14312, 14316, 14320, 14324, + 14328, 14332, 14336, 14340, 14344, 14348, 14352, 14356, 14360, 14364, 0, + 14367, 14370, 14374, 14378, 14382, 14385, 14388, 14391, 14395, 14399, 0, + 14403, 14407, 14411, 14415, 14419, 0, 0, 0, 14422, 14426, 14431, 14435, + 14440, 14444, 14449, 14454, 0, 14460, 14464, 14469, 0, 14474, 14478, + 14483, 14488, 0, 0, 0, 0, 0, 0, 0, 14492, 14496, 0, 14502, 14506, 0, 0, + 0, 0, 0, 0, 14510, 14515, 14520, 14525, 0, 0, 14531, 14535, 14538, 14541, + 14544, 14547, 14550, 14553, 14556, 14559, 0, 0, 0, 0, 0, 0, 0, 0, 14562, + 14575, 14587, 14599, 14611, 14623, 14635, 14647, 0, 0, 14651, 14655, 0, + 14659, 14662, 14666, 14669, 14673, 14676, 14680, 14684, 0, 14688, 14691, + 14695, 0, 14699, 14702, 14706, 14710, 14713, 14717, 14721, 14725, 14729, + 14733, 14737, 14741, 14745, 14749, 14753, 14757, 14761, 14765, 14769, + 14773, 14777, 14781, 14785, 0, 14788, 14791, 14795, 14799, 14803, 14806, + 14809, 14812, 14816, 14820, 0, 14824, 14828, 14832, 14836, 14840, 0, 0, + 14843, 14847, 14851, 14856, 14860, 14865, 14869, 14874, 14879, 0, 14885, + 14889, 14894, 0, 14899, 14903, 14908, 14913, 0, 0, 0, 0, 0, 0, 0, 14917, + 14921, 0, 0, 0, 0, 0, 0, 0, 14927, 0, 14931, 14936, 14941, 14946, 0, 0, + 14952, 14956, 14959, 14962, 14965, 14968, 14971, 14974, 14977, 14980, 0, + 14983, 14987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14991, 14995, + 0, 14999, 15002, 15006, 15009, 15013, 15016, 15020, 15024, 0, 15028, + 15031, 15035, 0, 15039, 15042, 15046, 15050, 15053, 15057, 15061, 15065, + 15069, 15073, 15077, 15081, 15085, 15089, 15093, 15097, 15101, 15105, + 15109, 15113, 15117, 15121, 15125, 15128, 15132, 15135, 15139, 15143, + 15147, 15150, 15153, 15156, 15160, 15164, 15168, 15172, 15176, 15180, + 15184, 15188, 15191, 0, 0, 15195, 15199, 15204, 15208, 15213, 15217, + 15222, 15227, 0, 15233, 15237, 15242, 0, 15247, 15251, 15256, 15261, + 15265, 0, 0, 0, 0, 0, 0, 0, 0, 15270, 0, 0, 0, 0, 0, 0, 0, 0, 15276, + 15281, 15286, 15291, 0, 0, 15297, 15301, 15304, 15307, 15310, 15313, + 15316, 15319, 15322, 15325, 15328, 15332, 15337, 15342, 15348, 15354, 0, + 0, 0, 15360, 15364, 15370, 15375, 15381, 15386, 15392, 0, 0, 15398, + 15402, 0, 15406, 15410, 15414, 15418, 15422, 15426, 15430, 15434, 15438, + 15442, 15446, 15450, 15454, 15458, 15462, 15466, 15470, 15474, 0, 0, 0, + 15478, 15484, 15490, 15496, 15502, 15508, 15514, 15520, 15526, 15532, + 15538, 15544, 15552, 15558, 15564, 15570, 15576, 15582, 15588, 15594, + 15600, 15606, 15612, 15618, 0, 15624, 15630, 15636, 15642, 15648, 15654, + 15658, 15664, 15668, 0, 15672, 0, 0, 15678, 15682, 15688, 15694, 15700, + 15704, 15710, 0, 0, 0, 15714, 0, 0, 0, 0, 15718, 15723, 15730, 15737, + 15744, 15751, 0, 15758, 0, 15765, 15770, 15775, 15782, 15789, 15798, + 15809, 15818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15823, 15830, 15837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15842, 15848, + 15854, 15860, 15866, 15872, 15878, 15884, 15890, 15896, 15902, 15908, + 15914, 15920, 15926, 15932, 15938, 15944, 15950, 15956, 15962, 15968, + 15974, 15980, 15986, 15992, 15998, 16004, 16010, 16016, 16022, 16028, + 16034, 16039, 16045, 16051, 16055, 16061, 16065, 16071, 16077, 16083, + 16089, 16095, 16101, 16106, 16112, 16116, 16121, 16127, 16133, 16139, + 16144, 16150, 16156, 16162, 16167, 16173, 0, 0, 0, 0, 16177, 16183, + 16188, 16194, 16199, 16207, 16215, 16219, 16223, 16227, 16233, 16239, + 16245, 16251, 16255, 16259, 16263, 16267, 16271, 16274, 16277, 16280, + 16283, 16286, 16289, 16292, 16295, 16298, 16302, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 16306, 16310, 0, 16316, 0, 0, 16322, 16326, 0, 16330, 0, + 0, 16336, 0, 0, 0, 0, 0, 0, 16340, 16344, 16347, 16353, 0, 16359, 16363, + 16367, 16371, 16377, 16383, 16389, 0, 16395, 16399, 16403, 0, 16409, 0, + 16415, 0, 0, 16419, 16425, 0, 16431, 16434, 16440, 16443, 16447, 16454, + 16459, 16464, 16468, 16473, 16478, 16483, 16487, 0, 16492, 16499, 16505, + 0, 0, 16511, 16515, 16520, 16524, 16529, 0, 16534, 0, 16539, 16545, + 16551, 16557, 16563, 16567, 0, 0, 16570, 16574, 16577, 16580, 16583, + 16586, 16589, 16592, 16595, 16598, 0, 0, 16601, 16606, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 16611, 16615, 16626, 16641, 16656, 16666, 16677, 16690, + 16701, 16707, 16715, 16725, 16731, 16739, 16743, 16749, 16755, 16763, + 16773, 16781, 16794, 16800, 16808, 16816, 16828, 16835, 16843, 16851, + 16859, 16867, 16875, 16883, 16893, 16897, 16900, 16903, 16906, 16909, + 16912, 16915, 16918, 16921, 16924, 16928, 16932, 16936, 16940, 16944, + 16948, 16952, 16956, 16960, 16965, 16971, 16981, 16995, 17005, 17011, + 17017, 17025, 17033, 17041, 17049, 17055, 17061, 17064, 17068, 17072, + 17076, 17080, 17084, 17088, 0, 17092, 17096, 17100, 17104, 17108, 17112, + 17116, 17120, 17124, 17128, 17132, 17135, 17138, 17142, 17146, 17150, + 17153, 17157, 17161, 17165, 17169, 17173, 17177, 17181, 17185, 17188, + 17191, 17195, 17199, 17203, 17207, 17210, 17213, 17217, 17222, 17226, 0, + 0, 0, 0, 17230, 17235, 17239, 17244, 17248, 17253, 17258, 17264, 17269, + 17275, 17279, 17284, 17288, 17293, 17303, 17309, 17315, 17322, 17332, + 17338, 17342, 17346, 17352, 17358, 17366, 17372, 17380, 17388, 17396, + 17406, 17414, 17424, 17429, 17435, 17441, 17447, 17453, 17459, 17465, 0, + 17471, 17477, 17483, 17489, 17495, 17501, 17507, 17513, 17519, 17525, + 17531, 17536, 17541, 17547, 17553, 17559, 17564, 17570, 17576, 17582, + 17588, 17594, 17600, 17606, 17612, 17617, 17622, 17628, 17634, 17640, + 17646, 17651, 17656, 17662, 17670, 17677, 0, 17684, 17691, 17704, 17711, + 17718, 17726, 17734, 17740, 17746, 17752, 17762, 17767, 17773, 17783, + 17793, 0, 17803, 17813, 17821, 17833, 17845, 17851, 17865, 17880, 17885, + 17890, 17898, 17906, 17914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17922, + 17925, 17929, 17933, 17937, 17941, 17945, 17949, 17953, 17957, 17961, + 17965, 17969, 17973, 17977, 17981, 17985, 17989, 17993, 17997, 18001, + 18004, 18007, 18011, 18015, 18019, 18022, 18025, 18028, 18032, 18036, + 18040, 18043, 18047, 18050, 18055, 18058, 18062, 18065, 18069, 18072, + 18077, 18080, 18084, 18091, 18096, 18100, 18105, 18109, 18114, 18118, + 18123, 18130, 18136, 18141, 18145, 18149, 18153, 18157, 18161, 18166, + 18171, 18177, 18182, 18188, 18192, 18195, 18198, 18201, 18204, 18207, + 18210, 18213, 18216, 18219, 18225, 18229, 18233, 18237, 18241, 18245, + 18249, 18253, 18257, 18262, 18266, 18271, 18276, 18282, 18287, 18293, + 18299, 18305, 18311, 18317, 18324, 18331, 18339, 18347, 18356, 18365, + 18376, 18386, 18396, 18407, 18418, 18428, 18438, 18448, 18458, 18468, + 18478, 18488, 18498, 18506, 18513, 18519, 18526, 18531, 18537, 18543, + 18549, 18555, 18561, 18567, 18572, 18578, 18584, 18590, 18596, 18601, + 18609, 18616, 18622, 18629, 18637, 18643, 18649, 18655, 18661, 18669, + 18677, 18687, 18695, 18703, 18709, 18714, 18719, 18724, 18729, 18734, + 18739, 18744, 18749, 18754, 18760, 18766, 18772, 18779, 18784, 18790, + 18795, 18800, 18805, 18810, 18815, 18820, 18825, 18830, 18835, 18840, + 18845, 18850, 18855, 18860, 18865, 18870, 18875, 18880, 18885, 18890, + 18895, 18900, 18905, 18910, 18915, 18920, 18925, 18930, 18935, 18940, + 18945, 18950, 18955, 18960, 18965, 18970, 18975, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 18980, 18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, + 19016, 19020, 19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, + 19056, 19060, 19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, + 19096, 19100, 19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, + 19136, 19140, 19144, 19150, 19154, 19159, 0, 0, 0, 19164, 19168, 19172, + 19176, 19180, 19184, 19188, 19192, 19196, 19200, 19204, 19208, 19212, + 19216, 19220, 19224, 19228, 19232, 19236, 19240, 19244, 19248, 19252, + 19256, 19260, 19264, 19268, 19272, 19276, 19280, 19284, 19288, 19292, + 19296, 19300, 19304, 19308, 19312, 19316, 19320, 19324, 19328, 19332, + 19336, 19340, 19344, 19348, 19352, 19356, 19360, 19364, 19368, 19372, + 19376, 19380, 19384, 19388, 19392, 19396, 19400, 19404, 19408, 19412, + 19416, 19420, 19424, 19428, 19432, 19436, 19440, 19444, 19448, 19452, + 19456, 19460, 19464, 19468, 19472, 19476, 19480, 19484, 19488, 19492, + 19496, 19500, 19504, 19508, 19512, 19516, 19520, 19524, 19528, 19532, + 19536, 19540, 19544, 19548, 19552, 19555, 19559, 19562, 19566, 19570, + 19573, 19577, 19581, 19584, 19588, 19592, 19596, 19600, 19603, 19607, + 19611, 19615, 19619, 19623, 19627, 19630, 19634, 19638, 19642, 19646, + 19650, 19654, 19658, 19662, 19666, 19670, 19674, 19678, 19682, 19686, + 19690, 19694, 19698, 19702, 19706, 19710, 19714, 19718, 19722, 19726, + 19730, 19734, 19738, 19742, 19746, 19750, 19754, 19758, 19762, 19766, + 19770, 19774, 19778, 19782, 19786, 19790, 19794, 19798, 19802, 19806, + 19810, 19814, 19818, 19822, 19826, 19830, 19834, 19838, 19842, 19846, + 19850, 19854, 19858, 19862, 19866, 19870, 19874, 19878, 19882, 19886, + 19890, 19894, 19898, 19902, 19906, 19910, 19914, 19918, 19922, 19926, + 19930, 19934, 19938, 19942, 19946, 19950, 19954, 19958, 19962, 19966, + 19970, 19974, 19978, 19982, 19986, 19990, 19994, 19998, 20002, 20006, + 20010, 20014, 20018, 20022, 20026, 20030, 20034, 20038, 20042, 20046, + 20050, 20054, 20058, 20062, 20066, 20070, 20074, 20078, 20082, 20086, + 20090, 20094, 20098, 20102, 20106, 20110, 20114, 20118, 20122, 20126, + 20130, 20134, 20138, 20142, 20146, 20150, 20154, 20158, 20162, 20166, + 20170, 20174, 20178, 20182, 20185, 20189, 20193, 20197, 20201, 20205, + 20209, 20213, 20217, 20221, 20225, 20229, 20233, 20237, 20241, 20245, + 20249, 20253, 20257, 20261, 20265, 20269, 20273, 20277, 20280, 20284, + 20288, 20292, 20296, 20300, 20304, 20308, 20312, 20316, 20320, 20324, + 20328, 20332, 20336, 20340, 20343, 20347, 20351, 20355, 20359, 20363, + 20367, 20371, 20375, 20379, 20383, 20387, 20391, 20395, 20399, 20403, + 20407, 20411, 20415, 20419, 20423, 20427, 20431, 20435, 20439, 20443, + 20447, 20451, 20455, 20459, 20463, 20467, 0, 20471, 20475, 20479, 20483, + 0, 0, 20487, 20491, 20495, 20499, 20503, 20507, 20511, 0, 20515, 0, + 20519, 20523, 20527, 20531, 0, 0, 20535, 20539, 20543, 20547, 20551, + 20555, 20559, 20563, 20567, 20571, 20575, 20579, 20583, 20587, 20591, + 20595, 20599, 20603, 20607, 20611, 20615, 20619, 20623, 20626, 20630, + 20634, 20638, 20642, 20646, 20650, 20654, 20658, 20662, 20666, 20670, + 20674, 20678, 20682, 20686, 20690, 20694, 0, 20698, 20702, 20706, 20710, + 0, 0, 20714, 20717, 20721, 20725, 20729, 20733, 20737, 20741, 20745, + 20749, 20753, 20757, 20761, 20765, 20769, 20773, 20777, 20782, 20787, + 20792, 20798, 20804, 20809, 20814, 20820, 20823, 20827, 20831, 20835, + 20839, 20843, 20847, 20851, 0, 20855, 20859, 20863, 20867, 0, 0, 20871, + 20875, 20879, 20883, 20887, 20891, 20895, 0, 20899, 0, 20903, 20907, + 20911, 20915, 0, 0, 20919, 20923, 20927, 20931, 20935, 20939, 20943, + 20947, 20951, 20956, 20961, 20966, 20972, 20978, 20983, 0, 20988, 20992, + 20996, 21000, 21004, 21008, 21012, 21016, 21020, 21024, 21028, 21032, + 21036, 21040, 21044, 21048, 21052, 21055, 21059, 21063, 21067, 21071, + 21075, 21079, 21083, 21087, 21091, 21095, 21099, 21103, 21107, 21111, + 21115, 21119, 21123, 21127, 21131, 21135, 21139, 21143, 21147, 21151, + 21155, 21159, 21163, 21167, 21171, 21175, 21179, 21183, 21187, 21191, + 21195, 21199, 21203, 21207, 21211, 0, 21215, 21219, 21223, 21227, 0, 0, + 21231, 21235, 21239, 21243, 21247, 21251, 21255, 21259, 21263, 21267, + 21271, 21275, 21279, 21283, 21287, 21291, 21295, 21299, 21303, 21307, + 21311, 21315, 21319, 21323, 21327, 21331, 21335, 21339, 21343, 21347, + 21351, 21355, 21359, 21363, 21367, 21371, 21375, 21379, 21383, 21387, + 21391, 21395, 21399, 21403, 21407, 21411, 21415, 21419, 21423, 21427, + 21431, 21435, 21439, 21443, 21447, 21451, 21455, 21458, 21462, 21466, + 21470, 21474, 21478, 21482, 21486, 21490, 21494, 0, 0, 21498, 21507, + 21513, 21518, 21522, 21525, 21530, 21533, 21536, 21539, 21544, 21548, + 21553, 21556, 21559, 21562, 21565, 21568, 21571, 21574, 21577, 21580, + 21584, 21588, 21592, 21596, 21600, 21604, 21608, 21612, 21616, 21620, 0, + 0, 0, 21626, 21632, 21636, 21640, 21644, 21650, 21654, 21658, 21662, + 21668, 21672, 21676, 21680, 21686, 21690, 21694, 21698, 21704, 21710, + 21716, 21724, 21730, 21736, 21742, 21748, 21754, 0, 0, 0, 0, 0, 0, 21760, + 21763, 21766, 21769, 21772, 21775, 21779, 21783, 21786, 21790, 21794, + 21798, 21802, 21806, 21809, 21813, 21817, 21821, 21825, 21829, 21833, + 21837, 21841, 21845, 21849, 21853, 21856, 21860, 21864, 21868, 21872, + 21875, 21879, 21883, 21887, 21891, 21895, 21899, 21903, 21907, 21911, + 21915, 21919, 21923, 21927, 21931, 21934, 21938, 21942, 21946, 21950, + 21954, 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21990, + 21994, 21998, 22002, 22006, 22010, 22014, 22018, 22022, 22026, 22030, + 22034, 22038, 22042, 22046, 22050, 22054, 22058, 22062, 22066, 22069, + 22073, 22077, 22081, 22085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22089, + 22093, 22096, 22100, 22103, 22107, 22110, 22114, 22120, 22125, 22129, + 22132, 22136, 22140, 22145, 22149, 22154, 22158, 22163, 22167, 22172, + 22176, 22181, 22187, 22191, 22196, 22200, 22205, 22211, 22215, 22221, + 22227, 22231, 22235, 22243, 22251, 22258, 22263, 22268, 22277, 22284, + 22291, 22296, 22302, 22306, 22310, 22314, 22318, 22322, 22326, 22330, + 22334, 22338, 22342, 22348, 22353, 22358, 22361, 22365, 22369, 22374, + 22378, 22383, 22387, 22392, 22396, 22401, 22405, 22410, 22414, 22419, + 22423, 22428, 22434, 22438, 22443, 22448, 22452, 22456, 22460, 22464, + 22467, 22471, 22477, 22482, 22487, 22491, 22495, 22499, 22504, 22508, + 22513, 22517, 22522, 22525, 22529, 22533, 22538, 22542, 22547, 22551, + 22556, 22562, 22566, 22570, 22574, 22578, 22582, 22586, 22590, 22594, + 22598, 22602, 22606, 22612, 22615, 22619, 22623, 22628, 22632, 22637, + 22641, 22646, 22650, 22655, 22659, 22664, 22668, 22673, 22677, 22682, + 22688, 22692, 22696, 22702, 22708, 22714, 22720, 22724, 22728, 22732, + 22736, 22740, 22744, 22750, 22754, 22758, 22762, 22767, 22771, 22776, + 22780, 22785, 22789, 22794, 22798, 22803, 22807, 22812, 22816, 22821, + 22827, 22831, 22837, 22841, 22845, 22849, 22853, 22857, 22861, 22867, + 22870, 22874, 22878, 22883, 22887, 22892, 22896, 22901, 22905, 22910, + 22914, 22919, 22923, 22928, 22932, 22937, 22943, 22946, 22950, 22954, + 22959, 22964, 22968, 22972, 22976, 22980, 22984, 22988, 22994, 22997, + 23001, 23005, 23010, 23014, 23019, 23023, 23028, 23034, 23037, 23042, + 23046, 23050, 23054, 23058, 23062, 23066, 23070, 23076, 23080, 23084, + 23088, 23093, 23097, 23102, 23106, 23111, 23115, 23120, 23124, 23129, + 23133, 23138, 23142, 23147, 23150, 23154, 23158, 23162, 23166, 23170, + 23174, 23178, 23182, 23188, 23192, 23196, 23200, 23205, 23209, 23214, 23218, 23223, 23227, 23232, 23236, 23241, 23245, 23250, 23254, 23259, - 23263, 23268, 23272, 23277, 23280, 23284, 23288, 23292, 23296, 23300, - 23304, 23308, 23312, 23318, 23322, 23326, 23330, 23335, 23339, 23344, - 23348, 23353, 23357, 23362, 23366, 23371, 23375, 23380, 23384, 23389, - 23395, 23398, 23403, 23407, 23412, 23418, 23424, 23430, 23436, 23442, - 23448, 23454, 23458, 23462, 23466, 23470, 23474, 23478, 23482, 23486, - 23491, 23495, 23500, 23504, 23509, 23513, 23518, 23522, 23527, 23531, - 23536, 23540, 23545, 23549, 23553, 23557, 23561, 23565, 23569, 23573, - 23579, 23582, 23586, 23590, 23595, 23599, 23604, 23608, 23613, 23617, - 23622, 23626, 23631, 23635, 23640, 23644, 23649, 23655, 23659, 23665, - 23670, 23676, 23680, 23686, 23691, 23695, 23699, 23703, 23707, 23711, - 23716, 23719, 23723, 23728, 23732, 23737, 23740, 23744, 23748, 23752, - 23756, 23760, 23764, 23768, 23772, 23776, 23780, 23784, 23789, 23793, - 23797, 23803, 23807, 23813, 23817, 23823, 23827, 23831, 23835, 23839, - 23843, 23848, 23852, 23856, 23860, 23864, 23868, 23872, 23876, 23880, - 23884, 23888, 23894, 23900, 23906, 23912, 23918, 23923, 23929, 23935, - 23941, 23945, 23949, 23953, 23957, 23961, 23965, 23969, 23973, 23977, - 23981, 23985, 23989, 23993, 23998, 24003, 24008, 24012, 24016, 24020, - 24024, 24028, 24032, 24036, 24040, 24044, 24048, 24054, 24060, 24066, - 24072, 24078, 24084, 24090, 24096, 24102, 24106, 24110, 24114, 24118, - 24122, 24126, 24130, 24136, 24142, 24148, 24154, 24160, 24166, 24172, - 24178, 24184, 24189, 24194, 24199, 24204, 24210, 24216, 24222, 24228, - 24234, 24240, 24246, 24251, 24257, 24263, 24269, 24274, 24280, 24286, - 24292, 24297, 24302, 24307, 24312, 24317, 24322, 24327, 24332, 24337, - 24342, 24347, 24352, 24356, 24361, 24366, 24371, 24376, 24381, 24386, - 24391, 24396, 24401, 24406, 24411, 24416, 24421, 24426, 24431, 24436, - 24441, 24446, 24451, 24456, 24461, 24466, 24471, 24476, 24481, 24486, - 24491, 24496, 24501, 24505, 24510, 24515, 24520, 24525, 24530, 24535, - 24540, 24545, 24550, 24555, 24560, 24565, 24570, 24575, 24580, 24585, - 24590, 24595, 24600, 24605, 24610, 24615, 24620, 24625, 24630, 24634, - 24639, 24644, 24649, 24654, 24659, 24663, 24668, 24673, 24678, 24683, - 24688, 24692, 24697, 24703, 24708, 24713, 24718, 24723, 24729, 24734, - 24739, 24744, 24749, 24754, 24759, 24764, 24769, 24774, 24779, 24784, - 24789, 24794, 24799, 24804, 24809, 24814, 24819, 24824, 24829, 24834, - 24839, 24844, 24849, 24854, 24859, 24864, 24869, 24874, 24879, 24884, - 24889, 24894, 24899, 24904, 24909, 24914, 24919, 24924, 24929, 24934, - 24939, 24944, 24949, 24955, 24960, 24965, 24970, 24975, 24980, 24985, - 24990, 24995, 25000, 25005, 25010, 25015, 25020, 25025, 25030, 25035, - 25040, 25045, 25050, 25055, 25060, 25065, 25070, 25075, 25080, 25085, - 25090, 25095, 25100, 25105, 25110, 25115, 25120, 25125, 25130, 25135, - 25140, 25145, 25151, 25155, 25159, 25163, 25167, 25171, 25175, 25179, - 25183, 25189, 25195, 25201, 25207, 25213, 25219, 25225, 25232, 25238, - 25243, 25248, 25253, 25258, 25263, 25268, 25273, 25278, 25283, 25288, - 25293, 25298, 25303, 25308, 25313, 25318, 25323, 25328, 25333, 25338, - 25343, 25348, 25353, 25358, 25363, 25368, 25373, 25378, 0, 0, 0, 25385, - 25395, 25399, 25406, 25410, 25414, 25418, 25426, 25430, 25435, 25440, - 25445, 25449, 25454, 25459, 25462, 25466, 25470, 25479, 25483, 25487, - 25493, 25497, 25501, 25509, 25513, 25521, 25527, 25533, 25539, 25545, - 25554, 25559, 25563, 25572, 25575, 25581, 25585, 25591, 25596, 25602, - 25610, 25616, 25621, 25628, 25633, 25637, 25641, 25651, 25657, 25661, - 25671, 25677, 25681, 25685, 25692, 25699, 25704, 25709, 25718, 25722, - 25726, 25730, 25738, 25745, 25749, 25753, 25757, 25761, 25765, 25769, - 25773, 25777, 25781, 25785, 25789, 25794, 25799, 25804, 25808, 25812, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25816, 25820, 25824, 25828, - 25832, 25837, 25842, 25847, 25852, 25856, 25860, 25865, 25869, 0, 25873, - 25878, 25883, 25888, 25892, 25897, 25902, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25907, 25911, 25915, 25919, 25923, 25928, 25933, 25938, 25943, 25947, - 25951, 25956, 25960, 25964, 25968, 25973, 25978, 25983, 25987, 25992, - 25997, 26002, 26008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26013, 26017, 26021, - 26025, 26029, 26034, 26039, 26044, 26049, 26053, 26057, 26062, 26066, - 26070, 26074, 26079, 26084, 26089, 26093, 26098, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 26103, 26107, 26111, 26115, 26119, 26124, 26129, 26134, - 26139, 26143, 26147, 26152, 26156, 0, 26160, 26165, 26170, 0, 26175, - 26180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26185, 26188, 26192, 26196, - 26200, 26204, 26208, 26212, 26216, 26220, 26224, 26228, 26232, 26236, - 26240, 26244, 26248, 26252, 26255, 26259, 26263, 26267, 26271, 26275, - 26279, 26283, 26287, 26291, 26295, 26299, 26303, 26307, 26311, 26314, - 26318, 26322, 26328, 26334, 26340, 26346, 26352, 26358, 26364, 26370, - 26376, 26382, 26388, 26394, 26400, 26406, 26415, 26424, 26430, 26436, - 26442, 26447, 26451, 26456, 26461, 26466, 26470, 26475, 26480, 26485, - 26489, 26494, 26498, 26503, 26508, 26513, 26518, 26522, 26526, 26530, - 26534, 26538, 26542, 26546, 26550, 26554, 26558, 26564, 26568, 26572, - 26576, 26580, 26584, 26592, 26598, 26602, 26608, 26612, 26618, 26622, 0, - 0, 26626, 26630, 26633, 26636, 26639, 26642, 26645, 26648, 26651, 26654, - 0, 0, 0, 0, 0, 0, 26657, 26665, 26673, 26681, 26689, 26697, 26705, 26713, - 26721, 26729, 0, 0, 0, 0, 0, 0, 26737, 26740, 26743, 26746, 26751, 26754, - 26759, 26766, 26774, 26779, 26786, 26789, 26796, 26803, 26810, 0, 26814, - 26818, 26821, 26824, 26827, 26830, 26833, 26836, 26839, 26842, 0, 0, 0, - 0, 0, 0, 26845, 26848, 26851, 26854, 26857, 26860, 26864, 26868, 26872, - 26875, 26879, 26883, 26886, 26890, 26894, 26897, 26901, 26905, 26909, - 26913, 26917, 26921, 26925, 26928, 26931, 26935, 26939, 26942, 26946, - 26950, 26954, 26958, 26962, 26966, 26970, 26974, 26981, 26986, 26991, - 26996, 27001, 27007, 27013, 27019, 27025, 27030, 27036, 27042, 27047, - 27053, 27059, 27065, 27071, 27077, 27082, 27088, 27093, 27099, 27105, - 27111, 27117, 27123, 27128, 27133, 27139, 27145, 27150, 27156, 27161, - 27167, 27172, 27177, 27183, 27189, 27195, 27201, 27207, 27213, 27219, - 27225, 27231, 27237, 27243, 27249, 27254, 27259, 27264, 27270, 0, 0, 0, - 0, 0, 0, 0, 0, 27276, 27285, 27294, 27302, 27310, 27320, 27328, 27337, - 27344, 27351, 27358, 27366, 27374, 27382, 27390, 27398, 27406, 27414, - 27422, 27429, 27437, 27445, 27453, 27461, 27469, 27479, 27489, 27499, - 27509, 27519, 27529, 27539, 27549, 27559, 27569, 27579, 27589, 27599, - 27609, 27617, 27625, 27635, 27643, 0, 0, 0, 0, 0, 27653, 27657, 27661, - 27665, 27669, 27673, 27677, 27681, 27685, 27689, 27693, 27697, 27701, - 27705, 27709, 27713, 27717, 27721, 27725, 27729, 27733, 27737, 27741, - 27745, 27751, 27755, 27761, 27765, 27771, 27775, 27781, 27785, 27789, - 27793, 27797, 27801, 27805, 27811, 27817, 27823, 27829, 27834, 27839, - 27844, 27850, 27856, 27862, 27868, 27875, 27881, 27886, 27891, 27895, - 27899, 27903, 27907, 27911, 27915, 27919, 27925, 27931, 27937, 27942, - 27949, 27954, 27959, 27965, 27970, 27977, 27984, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27990, 27995, 27998, 28002, 28006, 28010, 28014, 28018, 28022, - 28026, 28030, 28034, 28038, 28042, 28046, 28050, 28053, 28056, 28060, - 28064, 28068, 28071, 28074, 28077, 28081, 28085, 28089, 28093, 28097, 0, - 0, 0, 28100, 28104, 28108, 28112, 28117, 28122, 28127, 28132, 28136, - 28140, 28145, 28150, 0, 0, 0, 0, 28156, 28160, 28165, 28170, 28175, - 28179, 28183, 28187, 28191, 28196, 28200, 28204, 0, 0, 0, 0, 28208, 0, 0, - 0, 28212, 28216, 28220, 28224, 28227, 28230, 28233, 28236, 28239, 28242, - 28245, 28248, 28251, 28256, 28262, 28268, 28274, 28280, 28285, 28291, - 28297, 28303, 28308, 28314, 28319, 28325, 28331, 28336, 28342, 28348, - 28354, 28359, 28364, 28369, 28375, 28381, 28386, 28392, 28397, 28403, - 28408, 28414, 0, 0, 28420, 28426, 28432, 28438, 28444, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28450, 28457, 28464, 28470, 28477, 28484, 28490, 28497, - 28504, 28511, 28518, 28524, 28531, 28538, 28544, 28551, 28558, 28564, - 28571, 28578, 28584, 28590, 28597, 28603, 28609, 28616, 28622, 28629, - 28636, 28643, 28650, 28657, 28664, 28670, 28677, 28684, 28690, 28697, - 28704, 28711, 28718, 28725, 28732, 28739, 0, 0, 0, 0, 28746, 28754, - 28761, 28768, 28774, 28781, 28787, 28794, 28800, 28807, 28814, 28821, - 28828, 28835, 28842, 28849, 28856, 28863, 28870, 28877, 28883, 28889, - 28896, 28903, 28910, 28916, 0, 0, 0, 0, 0, 0, 28922, 28928, 28933, 28938, - 28943, 28948, 28953, 28958, 28963, 28968, 28973, 0, 0, 0, 28979, 28985, - 28991, 28995, 29001, 29007, 29013, 29019, 29025, 29031, 29037, 29043, - 29049, 29055, 29061, 29067, 29073, 29079, 29085, 29089, 29095, 29101, - 29107, 29113, 29119, 29125, 29131, 29137, 29143, 29149, 29155, 29161, - 29167, 29173, 29179, 29183, 29188, 29193, 29198, 29202, 29207, 29211, - 29216, 29221, 29226, 29230, 29235, 29240, 29245, 29250, 29255, 29259, - 29263, 29268, 29273, 29278, 29282, 29286, 29291, 29296, 29301, 29306, 0, - 0, 29312, 29316, 29323, 29328, 29334, 29340, 29345, 29351, 29357, 29362, - 29368, 29374, 29380, 29386, 29392, 29397, 29402, 29408, 29413, 29419, - 29424, 29430, 29436, 29442, 29448, 29452, 29457, 29462, 29468, 29474, - 29479, 29485, 29491, 29495, 29500, 29505, 29509, 29514, 29519, 29524, - 29529, 29535, 29541, 29547, 29552, 29557, 29561, 29566, 29570, 29575, - 29579, 29584, 29589, 29594, 29599, 29606, 29613, 29621, 29632, 29641, - 29649, 29656, 29667, 29673, 29680, 0, 29687, 29692, 29697, 29705, 29711, - 29719, 29724, 29730, 29736, 29742, 29747, 29753, 29758, 29765, 29771, - 29776, 29782, 29788, 29794, 29801, 29808, 29815, 29820, 29825, 29832, - 29839, 29846, 29853, 29860, 0, 0, 29867, 29874, 29881, 29887, 29893, - 29899, 29905, 29911, 29917, 29923, 29929, 0, 0, 0, 0, 0, 0, 29935, 29941, - 29946, 29951, 29956, 29961, 29966, 29971, 29976, 29981, 0, 0, 0, 0, 0, 0, - 29986, 29991, 29996, 30001, 30006, 30011, 30016, 30025, 30032, 30037, - 30042, 30047, 30052, 30057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30062, 30068, - 30074, 30078, 30082, 30086, 30090, 30096, 30100, 30106, 30110, 30116, - 30122, 30130, 30136, 30144, 30148, 30152, 30156, 30162, 30165, 30171, - 30175, 30181, 30185, 30189, 30195, 30199, 30205, 30209, 30215, 30223, - 30231, 30239, 30245, 30249, 30255, 30259, 30265, 30268, 30271, 30277, - 30281, 30287, 30290, 30293, 30296, 30300, 30304, 30310, 30316, 30320, - 30323, 30327, 30332, 30337, 30344, 30349, 30356, 30363, 30372, 30379, - 30388, 30393, 30400, 30407, 30416, 30421, 30428, 30433, 30439, 30445, - 30451, 30457, 30463, 30469, 0, 0, 0, 0, 30475, 30479, 30482, 30485, - 30488, 30491, 30494, 30497, 30500, 30503, 30506, 30509, 30512, 30515, - 30520, 30525, 30530, 30533, 30538, 30543, 30548, 30553, 30560, 30565, - 30570, 30575, 30580, 30587, 30593, 30599, 30605, 30611, 30617, 30626, - 30635, 30641, 30647, 30656, 30665, 30674, 30683, 30692, 30701, 30710, - 30719, 0, 0, 0, 30728, 30733, 30738, 30743, 30747, 30751, 30755, 30760, - 30764, 30768, 30773, 30777, 30782, 30787, 30792, 30797, 30802, 30807, - 30812, 30817, 30822, 30826, 30830, 30835, 30840, 30845, 30849, 30853, - 30857, 30862, 30867, 30872, 30877, 30881, 30888, 30895, 30902, 30908, - 30914, 30920, 30926, 30932, 30938, 0, 0, 0, 30943, 30948, 30953, 30958, - 30962, 30966, 30970, 30974, 30978, 30982, 30986, 30990, 0, 0, 0, 0, 0, 0, - 30994, 30998, 31004, 31008, 31014, 31020, 31025, 31032, 31036, 31042, - 31046, 31052, 31057, 31064, 31071, 31076, 31083, 31088, 31093, 31097, - 31103, 31107, 31113, 31120, 31127, 31132, 31139, 31146, 31150, 31156, - 31161, 31166, 31173, 31178, 31183, 31188, 31193, 31197, 31201, 31206, - 31211, 31218, 31224, 31229, 31236, 31241, 31248, 31253, 31263, 31270, - 31277, 31281, 0, 0, 0, 0, 0, 0, 0, 0, 31285, 31294, 31301, 31308, 31315, - 31318, 31322, 31326, 31330, 31334, 31338, 31342, 31346, 31350, 31354, - 31358, 31362, 31366, 31369, 31372, 31376, 31380, 31384, 31388, 31392, - 31396, 31399, 31403, 31407, 31411, 31415, 31418, 31421, 31425, 31428, - 31432, 31436, 31440, 31444, 31448, 31451, 31456, 31461, 31466, 31470, - 31474, 31479, 31483, 31488, 31492, 31498, 31503, 31508, 31513, 31519, - 31524, 31530, 31536, 31542, 31546, 0, 0, 0, 31550, 31555, 31564, 31569, - 31576, 31581, 31585, 31588, 31591, 31594, 31597, 31600, 31603, 31606, - 31609, 0, 0, 0, 31612, 31616, 31620, 31624, 31631, 31637, 31643, 31649, - 31655, 31661, 31667, 31673, 31679, 31685, 31692, 31699, 31706, 31713, - 31720, 31727, 31734, 31741, 31748, 31755, 31762, 31769, 31776, 31783, - 31790, 31797, 31804, 31811, 31818, 31825, 31832, 31839, 31846, 31853, - 31860, 31867, 31874, 31881, 31888, 31895, 31903, 31911, 31919, 31925, - 31931, 31937, 31945, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31954, 31959, 31964, 31969, - 31974, 31983, 31994, 32003, 32014, 32020, 32033, 32039, 32046, 32053, - 32058, 32064, 32070, 32081, 32090, 32097, 32104, 32113, 32120, 32129, - 32139, 32149, 32156, 32163, 32170, 32180, 32185, 32193, 32199, 32207, - 32216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32221, 32226, 32232, 32239, - 32247, 32253, 32259, 32265, 32270, 32278, 32284, 32290, 32296, 32304, - 32309, 32316, 32321, 32328, 32334, 32342, 32350, 32357, 32363, 32370, - 32377, 32383, 32390, 32397, 32403, 32408, 32414, 32422, 32430, 32436, - 32442, 32448, 32454, 32462, 32466, 32472, 32478, 32484, 32490, 32496, - 32502, 32506, 32511, 32516, 32523, 32528, 32532, 32538, 32543, 32548, - 32552, 32557, 32562, 32566, 32570, 32574, 32580, 32584, 32589, 32594, - 32598, 32603, 32607, 32612, 32616, 32622, 32627, 32634, 32639, 32644, - 32648, 32653, 32659, 32667, 32672, 32678, 32683, 32687, 32692, 32696, - 32702, 32709, 32716, 32721, 32726, 32730, 32736, 32742, 32747, 32752, - 32757, 32763, 32768, 32774, 32779, 32785, 32791, 32797, 32804, 32811, - 32818, 32825, 32832, 32839, 32844, 32853, 32863, 32873, 32883, 32893, - 32903, 32913, 32926, 32936, 32946, 32956, 32963, 32968, 32975, 32983, - 32991, 32998, 33005, 33012, 33019, 33027, 33036, 33045, 33054, 33063, - 33072, 33081, 33090, 33099, 33108, 33117, 33126, 33135, 33144, 33153, - 33161, 33170, 33181, 33189, 33199, 33211, 33220, 33229, 33239, 33248, - 33256, 33265, 33272, 33277, 33285, 33290, 33298, 33303, 33312, 33318, - 33325, 33332, 33337, 33342, 33350, 33358, 33367, 33376, 33381, 33388, - 33399, 33407, 33416, 33421, 33427, 33432, 33439, 33444, 33453, 33458, - 33463, 33468, 33475, 33482, 33487, 33496, 33504, 33509, 33514, 33521, - 33528, 33532, 33536, 33539, 33542, 33545, 33548, 33551, 33554, 33561, - 33564, 33567, 33572, 33576, 33580, 33584, 33588, 33592, 33602, 33608, - 33614, 33620, 33628, 33636, 33642, 33648, 33655, 33661, 33666, 33672, - 33678, 33683, 33689, 33695, 33703, 33708, 33714, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33720, 33727, 33734, 33739, 33748, - 33756, 33764, 33771, 33778, 33785, 33792, 33800, 33808, 33818, 33828, - 33836, 33844, 33852, 33860, 33869, 33878, 33886, 33894, 33903, 33912, - 33922, 33932, 33941, 33950, 33958, 33966, 33974, 33982, 33992, 34002, - 34010, 34018, 34026, 34034, 34042, 34050, 34058, 34066, 34074, 34082, - 34090, 34098, 34107, 34116, 34125, 34134, 34144, 34154, 34161, 34168, - 34176, 34184, 34193, 34202, 34210, 34218, 34230, 34242, 34251, 34260, - 34269, 34278, 34285, 34292, 34300, 34308, 34316, 34324, 34332, 34340, - 34348, 34356, 34365, 34374, 34383, 34392, 34401, 34410, 34420, 34430, - 34440, 34450, 34459, 34468, 34475, 34482, 34490, 34498, 34506, 34514, - 34522, 34530, 34542, 34554, 34563, 34572, 34580, 34588, 34596, 34604, - 34615, 34626, 34637, 34648, 34660, 34672, 34680, 34688, 34696, 34704, - 34713, 34722, 34731, 34740, 34748, 34756, 34764, 34772, 34780, 34788, - 34797, 34806, 34816, 34826, 34834, 34842, 34850, 34858, 34866, 34874, - 34881, 34888, 34896, 34904, 34912, 34920, 34928, 34936, 34944, 34952, - 34960, 34968, 34976, 34984, 34992, 35000, 35008, 35016, 35025, 35034, - 35043, 35051, 35060, 35069, 35078, 35087, 35097, 35106, 35112, 35117, - 35124, 35131, 35139, 35147, 35156, 35165, 35175, 35185, 35196, 35207, - 35217, 35227, 35237, 35247, 35256, 35265, 35275, 35285, 35296, 35307, - 35317, 35327, 35337, 35347, 35354, 35361, 35369, 35377, 35384, 35391, - 35400, 35409, 35419, 35429, 35440, 35451, 35461, 35471, 35481, 35491, - 35500, 35509, 35517, 35525, 35532, 35539, 35547, 35555, 35564, 35573, - 35583, 35593, 35604, 35615, 35625, 35635, 35645, 35655, 35664, 35673, - 35683, 35693, 35704, 35715, 35725, 35735, 35745, 35755, 35762, 35769, - 35777, 35785, 35794, 35803, 35813, 35823, 35834, 35845, 35855, 35865, - 35875, 35885, 35893, 35901, 35909, 35917, 35926, 35935, 35943, 35951, - 35958, 35965, 35972, 35979, 35987, 35995, 36003, 36011, 36022, 36032, - 36043, 36053, 36064, 36074, 36082, 36090, 36101, 36111, 36122, 36132, - 36143, 36153, 36161, 36169, 36180, 36190, 36201, 0, 0, 36211, 36219, - 36227, 36238, 36248, 36259, 0, 0, 36269, 36277, 36285, 36296, 36306, - 36317, 36327, 36338, 36348, 36356, 36364, 36375, 36385, 36396, 36406, - 36417, 36427, 36435, 36443, 36454, 36464, 36475, 36485, 36496, 36506, - 36514, 36522, 36533, 36543, 36554, 36564, 36575, 36585, 36593, 36601, - 36612, 36622, 36633, 0, 0, 36643, 36651, 36659, 36670, 36680, 36691, 0, - 0, 36701, 36709, 36717, 36728, 36738, 36749, 36759, 36770, 0, 36780, 0, - 36788, 0, 36798, 0, 36808, 36818, 36826, 36834, 36845, 36855, 36866, - 36876, 36887, 36897, 36905, 36913, 36924, 36934, 36945, 36955, 36966, - 36976, 36984, 36992, 37000, 37008, 37016, 37024, 37032, 37040, 37048, - 37056, 37064, 37072, 37080, 0, 0, 37088, 37099, 37109, 37123, 37136, - 37150, 37163, 37177, 37190, 37201, 37211, 37225, 37238, 37252, 37265, - 37279, 37292, 37303, 37313, 37327, 37340, 37354, 37367, 37381, 37394, - 37405, 37415, 37429, 37442, 37456, 37469, 37483, 37496, 37507, 37517, - 37531, 37544, 37558, 37571, 37585, 37598, 37609, 37619, 37633, 37646, - 37660, 37673, 37687, 37700, 37708, 37716, 37727, 37735, 0, 37746, 37754, - 37765, 37773, 37781, 37789, 37797, 37805, 37808, 37811, 37814, 37817, - 37823, 37834, 37842, 0, 37853, 37861, 37872, 37880, 37888, 37896, 37904, - 37912, 37918, 37924, 37930, 37938, 37946, 37957, 0, 0, 37968, 37976, - 37987, 37995, 38003, 38011, 0, 38019, 38024, 38029, 38034, 38042, 38050, - 38061, 38072, 38080, 38088, 38096, 38107, 38115, 38123, 38131, 38139, - 38147, 38153, 38159, 0, 0, 38162, 38173, 38181, 0, 38192, 38200, 38211, - 38219, 38227, 38235, 38243, 38251, 38254, 0, 38257, 38261, 38265, 38269, - 38273, 38277, 38281, 38285, 38289, 38293, 38297, 38301, 38307, 38313, - 38319, 38322, 38325, 38327, 38331, 38335, 38339, 38343, 38345, 38349, - 38353, 38359, 38365, 38372, 38379, 38384, 38389, 38395, 38401, 38403, - 38406, 38408, 38412, 38416, 38420, 38423, 38427, 38431, 38435, 38439, - 38443, 38449, 38453, 38457, 38463, 38468, 38475, 38477, 38480, 38484, - 38488, 38493, 38499, 38501, 38510, 38519, 38522, 38526, 38528, 38530, - 38532, 38535, 38541, 38543, 38547, 38551, 38558, 38565, 38569, 38574, - 38579, 38584, 38589, 38593, 38597, 38600, 38604, 38608, 38615, 38620, - 38624, 38628, 38633, 38637, 38641, 38646, 38651, 38655, 38659, 38663, - 38665, 38670, 38675, 38679, 38683, 38687, 38691, 0, 0, 0, 0, 0, 38695, - 38701, 38707, 38714, 38721, 38726, 38731, 38735, 0, 0, 38741, 38744, - 38747, 38750, 38753, 38756, 38759, 38763, 38767, 38772, 38777, 38782, - 38788, 38792, 38795, 38798, 38801, 38804, 38807, 38810, 38813, 38816, - 38819, 38823, 38827, 38832, 38837, 0, 38842, 38848, 38854, 38860, 38867, - 38874, 38881, 38888, 38894, 38900, 38906, 38913, 38919, 0, 0, 0, 38926, - 38929, 38932, 38935, 38940, 38943, 38946, 38949, 38952, 38955, 38958, - 38962, 38965, 38968, 38971, 38974, 38977, 38982, 38985, 38988, 38991, - 38994, 38997, 39002, 39005, 39008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 39013, 39018, 39023, 39030, 39038, 39043, - 39048, 39052, 39056, 39061, 39068, 39075, 39079, 39084, 39089, 39094, - 39099, 39106, 39111, 39116, 39121, 39130, 39137, 39144, 39148, 39153, - 39159, 39164, 39171, 39179, 39187, 39191, 39195, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 39199, 39203, 39211, 39215, 39219, 39224, 39228, - 39232, 39236, 39238, 39242, 39246, 39250, 39255, 39259, 39263, 39271, - 39274, 39278, 39281, 39284, 39290, 39293, 39296, 39302, 39306, 39310, - 39314, 39317, 39321, 39324, 39328, 39330, 39333, 39336, 39340, 39342, - 39346, 39349, 39352, 39357, 39362, 39369, 39372, 39375, 39379, 39384, - 39387, 39390, 39393, 39397, 39402, 39405, 39408, 39410, 39413, 39416, - 39419, 39423, 39428, 39431, 39435, 39439, 39443, 39447, 39452, 39458, - 39463, 39468, 39474, 39479, 39484, 39488, 39492, 39497, 39501, 39505, - 39508, 39510, 39515, 39521, 39528, 39535, 39542, 39549, 39556, 39563, - 39570, 39577, 39585, 39592, 39600, 39607, 39614, 39622, 39630, 39635, - 39640, 39645, 39650, 39655, 39660, 39665, 39670, 39675, 39680, 39686, - 39692, 39698, 39704, 39711, 39719, 39726, 39732, 39738, 39744, 39750, - 39756, 39762, 39768, 39774, 39780, 39787, 39794, 39801, 39808, 39816, - 39825, 39833, 39844, 39852, 39860, 39869, 39876, 39885, 39894, 39902, - 39911, 0, 0, 0, 0, 0, 0, 39919, 39921, 39924, 39926, 39929, 39932, 39935, - 39940, 39945, 39950, 39955, 39959, 39963, 39967, 39971, 39976, 39982, - 39987, 39993, 39998, 40003, 40008, 40014, 40019, 40025, 40031, 40035, - 40039, 40044, 40049, 40054, 40059, 40064, 40072, 40080, 40088, 40096, - 40103, 40111, 40118, 40125, 40134, 40146, 40153, 40160, 40167, 40174, - 40182, 40190, 40197, 40204, 40212, 40220, 40225, 40233, 40238, 40243, - 40249, 40254, 40260, 40267, 40274, 40279, 40285, 40290, 40293, 40297, - 40300, 40304, 40308, 40312, 40318, 40324, 40330, 40336, 40340, 40344, - 40348, 40352, 40358, 40364, 40368, 40373, 40377, 40382, 40387, 40392, - 40395, 40399, 40402, 40406, 40413, 40421, 40432, 40443, 40448, 40457, - 40464, 40473, 40482, 40486, 40492, 40500, 40504, 40509, 40514, 40520, - 40526, 40532, 40539, 40543, 40547, 40552, 40555, 40557, 40561, 40565, - 40573, 40577, 40579, 40581, 40585, 40593, 40598, 40604, 40614, 40621, - 40626, 40630, 40634, 40638, 40641, 40644, 40647, 40651, 40655, 40659, - 40663, 40667, 40670, 40674, 40678, 40681, 40683, 40686, 40688, 40692, - 40696, 40698, 40704, 40707, 40712, 40716, 40720, 40722, 40724, 40726, - 40729, 40733, 40737, 40741, 40745, 40749, 40755, 40761, 40763, 40765, - 40767, 40769, 40772, 40774, 40778, 40780, 40784, 40788, 40793, 40797, - 40801, 40805, 40809, 40813, 40819, 40823, 40833, 40843, 40847, 40853, - 40859, 40863, 40867, 40870, 40875, 40879, 40885, 40889, 40901, 40909, - 40913, 40917, 40923, 40927, 40930, 40932, 40935, 40939, 40943, 40950, - 40954, 40958, 40962, 40965, 40970, 40975, 40980, 40985, 40990, 40995, - 41003, 41011, 41015, 41019, 41021, 41026, 41030, 41034, 41042, 41050, - 41056, 41062, 41071, 41080, 41085, 41090, 41098, 41106, 41108, 41110, - 41115, 41120, 41126, 41132, 41138, 41144, 41148, 41152, 41159, 41166, - 41172, 41178, 41188, 41198, 41206, 41214, 41216, 41220, 41224, 41229, - 41234, 41241, 41248, 41251, 41254, 41257, 41260, 41263, 41268, 41272, - 41277, 41282, 41285, 41288, 41291, 41294, 41297, 41301, 41304, 41307, - 41310, 41313, 41315, 41317, 41319, 41321, 41329, 41337, 41343, 41347, - 41353, 41363, 41369, 41375, 41381, 41389, 41397, 41408, 41412, 41416, - 41418, 41424, 41426, 41428, 41430, 41432, 41438, 41441, 41447, 41453, - 41457, 41461, 41465, 41468, 41472, 41476, 41478, 41487, 41496, 41501, - 41506, 41512, 41518, 41524, 41527, 41530, 41533, 41536, 41538, 41543, - 41548, 41553, 41559, 41565, 41573, 41581, 41587, 41593, 41599, 41605, - 41614, 41623, 41632, 41641, 41650, 41659, 41668, 41677, 41686, 41695, - 41703, 41715, 41725, 41740, 41743, 41748, 41754, 41760, 41767, 41781, - 41796, 41802, 41808, 41815, 41821, 41829, 41835, 41848, 41862, 41867, - 41873, 41880, 41883, 41886, 41888, 41891, 41894, 41896, 41898, 41902, - 41905, 41908, 41911, 41914, 41919, 41924, 41929, 41934, 41939, 41942, - 41944, 41946, 41948, 41952, 41956, 41960, 41966, 41971, 41973, 41975, - 41980, 41985, 41990, 41995, 42000, 42005, 42007, 42009, 42018, 42022, - 42030, 42039, 42041, 42046, 42051, 42059, 42063, 42065, 42069, 42071, - 42075, 42079, 42083, 42085, 42087, 42089, 42094, 42101, 42108, 42115, - 42122, 42129, 42136, 42143, 42150, 42156, 42162, 42169, 42176, 42183, - 42190, 42196, 42202, 42209, 42216, 42223, 42231, 42238, 42246, 42253, - 42261, 42268, 42276, 42284, 42291, 42299, 42306, 42314, 42321, 42329, - 42336, 42343, 42350, 42357, 42364, 42372, 42379, 42386, 42393, 42401, - 42408, 42415, 42422, 42429, 42437, 42445, 42452, 42459, 42465, 42472, - 42477, 42484, 42491, 42500, 42507, 42515, 42523, 42528, 42533, 42538, - 42545, 42552, 42559, 42566, 42571, 42576, 42585, 42591, 42594, 42602, - 42605, 42610, 42615, 42618, 42621, 42629, 42632, 42637, 42640, 42647, - 42652, 42660, 42663, 42666, 42669, 42674, 42679, 42682, 42685, 42693, - 42696, 42701, 42708, 42712, 42716, 42721, 42726, 42732, 42737, 42743, - 42749, 42754, 42760, 42768, 42774, 42782, 42790, 42796, 42804, 42812, - 42821, 42829, 42835, 42843, 42852, 42860, 42864, 42869, 42882, 42895, - 42899, 42903, 42907, 42911, 42921, 42925, 42930, 42935, 42940, 42945, - 42950, 42955, 42965, 42975, 42983, 42993, 43003, 43011, 43021, 43031, - 43039, 43049, 43059, 43067, 43075, 43085, 43095, 43098, 43101, 43104, - 43109, 43113, 43119, 43126, 43133, 43141, 43148, 43152, 43156, 43160, - 43164, 43166, 43170, 43174, 43179, 43184, 43191, 43198, 43201, 43208, - 43210, 43212, 43216, 43220, 43225, 43231, 43237, 43243, 43249, 43258, - 43267, 43276, 43280, 43282, 43286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43293, 43297, 43304, 43311, 43318, 43325, 43329, 43333, 43337, 43341, - 43346, 43352, 43357, 43363, 43369, 43375, 43381, 43389, 43396, 43403, - 43410, 43417, 43422, 43428, 43437, 43441, 43448, 43452, 43456, 43462, - 43468, 43474, 43480, 43484, 43488, 43491, 43495, 43499, 43506, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43513, - 43516, 43520, 43524, 43530, 43536, 43542, 43550, 43557, 43561, 43569, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43574, 43577, - 43580, 43583, 43586, 43589, 43592, 43595, 43598, 43601, 43605, 43609, - 43613, 43617, 43621, 43625, 43629, 43633, 43637, 43641, 43645, 43648, - 43651, 43654, 43657, 43660, 43663, 43666, 43669, 43672, 43676, 43680, - 43684, 43688, 43692, 43696, 43700, 43704, 43708, 43712, 43716, 43722, - 43728, 43734, 43741, 43748, 43755, 43762, 43769, 43776, 43783, 43790, - 43797, 43804, 43811, 43818, 43825, 43832, 43839, 43846, 43853, 43858, - 43864, 43870, 43876, 43881, 43887, 43893, 43899, 43904, 43910, 43916, - 43921, 43926, 43931, 43936, 43942, 43948, 43953, 43958, 43964, 43969, - 43975, 43981, 43987, 43993, 43999, 44004, 44010, 44016, 44022, 44027, - 44033, 44039, 44045, 44050, 44056, 44062, 44067, 44072, 44077, 44082, - 44088, 44094, 44099, 44104, 44110, 44115, 44121, 44127, 44133, 44139, - 44145, 44150, 44156, 44162, 44168, 44173, 44179, 44185, 44191, 44196, - 44202, 44208, 44213, 44218, 44223, 44228, 44234, 44240, 44245, 44250, - 44256, 44261, 44267, 44273, 44279, 44285, 44291, 44295, 44300, 44305, - 44310, 44315, 44320, 44325, 44330, 44335, 44340, 44345, 44349, 44353, - 44357, 44361, 44365, 44369, 44373, 44377, 44381, 44386, 44391, 44396, - 44401, 44406, 44411, 44420, 44429, 44438, 44447, 44456, 44465, 44474, - 44483, 44490, 44498, 44506, 44513, 44520, 44528, 44536, 44543, 44550, - 44558, 44566, 44573, 44580, 44588, 44596, 44603, 44610, 44618, 44627, - 44636, 44644, 44653, 44662, 44669, 44676, 44684, 44693, 44702, 44710, - 44719, 44728, 44735, 44742, 44751, 44760, 44768, 44776, 44785, 44794, - 44801, 44808, 44817, 44826, 44834, 44842, 44851, 44860, 44867, 44874, - 44883, 44892, 44900, 44909, 44918, 44926, 44936, 44946, 44956, 44966, - 44975, 44984, 44993, 45002, 45009, 45017, 45025, 45033, 45041, 45046, - 45051, 45060, 45068, 45075, 45084, 45092, 45099, 45108, 45116, 45123, - 45132, 45140, 45147, 45156, 45164, 45171, 45180, 45188, 45195, 45204, - 45212, 45219, 45228, 45236, 45243, 45252, 45260, 45267, 45276, 45285, - 45294, 45303, 45317, 45331, 45338, 45343, 45348, 45353, 45358, 45363, - 45368, 45373, 45378, 45386, 45394, 45402, 45410, 45415, 45422, 45429, - 45436, 45441, 45449, 45456, 45464, 45468, 45475, 45481, 45488, 45492, - 45498, 45504, 45510, 45514, 45517, 45521, 45525, 45532, 45538, 45544, - 45550, 45556, 45570, 45580, 45594, 45608, 45614, 45624, 45638, 45641, - 45644, 45651, 45659, 45664, 45669, 45677, 45689, 45701, 45709, 45713, - 45717, 45720, 45723, 45727, 45731, 45734, 45737, 45742, 45747, 45753, - 45759, 45764, 45769, 45775, 45781, 45786, 45791, 45796, 45801, 45807, - 45813, 45818, 45823, 45829, 45835, 45840, 45845, 45848, 45851, 45860, - 45862, 45864, 45867, 45871, 45877, 45879, 45882, 45889, 45896, 45904, - 45912, 45922, 45936, 45941, 45946, 45950, 45955, 45963, 45971, 45980, - 45989, 45998, 46007, 46012, 46017, 46023, 46029, 46035, 46041, 46044, - 46050, 46056, 46066, 46076, 46084, 46092, 46101, 46110, 46114, 46122, - 46130, 46138, 46146, 46155, 46164, 46173, 46182, 46187, 46192, 46197, - 46202, 46207, 46213, 46219, 46224, 46230, 46232, 46234, 46236, 46238, - 46241, 46244, 46246, 46248, 46250, 46254, 46258, 46260, 46262, 46265, - 46268, 46272, 46278, 46284, 46286, 46293, 46297, 46302, 46307, 46309, - 46319, 46325, 46331, 46337, 46343, 46349, 46355, 46360, 46363, 46366, - 46369, 46371, 46373, 46377, 46381, 46386, 46391, 46396, 46399, 46403, - 46408, 46411, 46415, 46420, 46425, 46430, 46435, 46440, 46445, 46450, - 46455, 46460, 46465, 46470, 46475, 46481, 46487, 46493, 46495, 46498, - 46500, 46503, 46505, 46507, 46509, 46511, 46513, 46515, 46517, 46519, - 46521, 46523, 46525, 46527, 46529, 46531, 46533, 46535, 46537, 46542, - 46547, 46552, 46557, 46562, 46567, 46572, 46577, 46582, 46587, 46592, - 46597, 46602, 46607, 46612, 46617, 46622, 46627, 46632, 46637, 46641, - 46645, 46649, 46655, 46661, 46666, 46671, 46676, 46681, 46686, 46691, - 46699, 46707, 46715, 46723, 46731, 46739, 46747, 46755, 46761, 46766, - 46771, 46776, 46779, 46783, 46787, 46791, 46795, 46799, 46803, 46810, - 46817, 46825, 46833, 46838, 46843, 46850, 46857, 46864, 46871, 46874, - 46877, 46882, 46884, 46888, 46893, 46895, 46897, 46899, 46901, 46906, - 46909, 46911, 46916, 46923, 46930, 46933, 46937, 46942, 46947, 46955, - 46961, 46967, 46979, 46986, 46993, 46998, 47003, 47009, 47012, 47015, - 47020, 47022, 47026, 47028, 47030, 47032, 47034, 47036, 47038, 47043, - 47045, 47047, 47049, 47051, 47055, 47057, 47060, 47065, 47070, 47075, - 47080, 47086, 47092, 47094, 47097, 47104, 47111, 47118, 47125, 47129, - 47133, 47135, 47137, 47141, 47147, 47152, 47154, 47158, 47167, 47175, - 47183, 47189, 47195, 47200, 47206, 47211, 47214, 47228, 47231, 47236, - 47241, 47247, 47257, 47259, 47265, 47271, 47275, 47282, 47286, 47288, - 47290, 47294, 47300, 47305, 47311, 47313, 47319, 47321, 47327, 47329, - 47331, 47336, 47338, 47342, 47347, 47349, 47354, 47359, 47363, 47370, 0, - 47380, 47386, 47389, 47395, 47398, 47403, 47408, 47412, 47414, 47416, - 47420, 47424, 47428, 47432, 47437, 47439, 47444, 47447, 47450, 47453, - 47457, 47461, 47466, 47470, 47475, 47480, 47484, 47490, 47497, 47500, - 47506, 47511, 47515, 47520, 47526, 47532, 47539, 47545, 47552, 47559, - 47561, 47568, 47572, 47579, 47585, 47590, 47596, 47600, 47605, 47608, - 47614, 47620, 47627, 47635, 47642, 47651, 47661, 47668, 47674, 47678, - 47686, 47691, 47700, 47703, 47706, 47715, 47726, 47733, 47735, 47741, - 47746, 47748, 47751, 47755, 47763, 47772, 47775, 47780, 47785, 47793, - 47801, 47809, 47817, 47823, 47829, 47835, 47843, 47848, 47851, 47855, - 47858, 47870, 47880, 47891, 47900, 47911, 47921, 47930, 47936, 47944, - 47948, 47956, 47960, 47968, 47975, 47982, 47991, 48000, 48010, 48020, - 48030, 48040, 48049, 48058, 48068, 48078, 48087, 48096, 48102, 48108, - 48114, 48120, 48126, 48132, 48138, 48144, 48150, 48157, 48163, 48169, - 48175, 48181, 48187, 48193, 48199, 48205, 48211, 48218, 48225, 48232, - 48239, 48246, 48253, 48260, 48267, 48274, 48281, 48289, 48294, 48297, - 48301, 48305, 48311, 48314, 48320, 48326, 48331, 48335, 48340, 48346, - 48353, 48356, 48363, 48370, 48374, 48383, 48392, 48397, 48403, 48408, - 48413, 48420, 48427, 48435, 48443, 48452, 48456, 48465, 48470, 48474, - 48481, 48485, 48492, 48500, 48505, 48513, 48517, 48522, 48526, 48531, - 48535, 48540, 48545, 48554, 48556, 48560, 48564, 48571, 48578, 48583, - 48591, 48597, 0, 48603, 0, 48606, 48611, 48616, 48624, 48628, 48635, - 48643, 48651, 48656, 48661, 48667, 48672, 48677, 48683, 48688, 48691, - 48695, 48699, 48706, 48715, 48720, 48729, 48738, 48744, 48750, 48755, - 48760, 48765, 48770, 48776, 48782, 48790, 48798, 48804, 48810, 48815, - 48820, 48827, 48834, 48840, 48843, 48846, 48850, 48854, 48858, 48863, - 48869, 48875, 48882, 48889, 48894, 48898, 48902, 48906, 48910, 48914, - 48918, 48922, 48926, 48930, 48934, 48938, 48942, 48946, 48950, 48954, - 48958, 48962, 48966, 48970, 48974, 48978, 48982, 48986, 48990, 48994, - 48998, 49002, 49006, 49010, 49014, 49018, 49022, 49026, 49030, 49034, - 49038, 49042, 49046, 49050, 49054, 49058, 49062, 49066, 49070, 49074, - 49078, 49082, 49086, 49090, 49094, 49098, 49102, 49106, 49110, 49114, - 49118, 49122, 49126, 49130, 49134, 49138, 49142, 49146, 49150, 49154, - 49158, 49162, 49166, 49170, 49174, 49178, 49182, 49186, 49190, 49194, - 49198, 49202, 49206, 49210, 49214, 49218, 49222, 49226, 49230, 49234, - 49238, 49242, 49246, 49250, 49254, 49258, 49262, 49266, 49270, 49274, - 49278, 49282, 49286, 49290, 49294, 49298, 49302, 49306, 49310, 49314, - 49318, 49322, 49326, 49330, 49334, 49338, 49342, 49346, 49350, 49354, - 49358, 49362, 49366, 49370, 49374, 49378, 49382, 49386, 49390, 49394, - 49398, 49402, 49406, 49410, 49414, 49418, 49422, 49426, 49430, 49434, - 49438, 49442, 49446, 49450, 49454, 49458, 49462, 49466, 49470, 49474, - 49478, 49482, 49486, 49490, 49494, 49498, 49502, 49506, 49510, 49514, - 49518, 49522, 49526, 49530, 49534, 49538, 49542, 49546, 49550, 49554, - 49558, 49562, 49566, 49570, 49574, 49578, 49582, 49586, 49590, 49594, - 49598, 49602, 49606, 49610, 49614, 49618, 49622, 49626, 49630, 49634, - 49638, 49642, 49646, 49650, 49654, 49658, 49662, 49666, 49670, 49674, - 49678, 49682, 49686, 49690, 49694, 49698, 49702, 49706, 49710, 49714, - 49718, 49722, 49726, 49730, 49734, 49738, 49742, 49746, 49750, 49754, - 49758, 49762, 49766, 49770, 49774, 49778, 49782, 49786, 49790, 49794, - 49798, 49802, 49806, 49810, 49814, 49818, 49822, 49826, 49830, 49834, - 49838, 49842, 49846, 49850, 49854, 49858, 49862, 49866, 49870, 49874, - 49878, 49882, 49886, 49890, 49894, 49898, 49902, 49906, 49910, 49914, - 49918, 49925, 49933, 49939, 49945, 49952, 49959, 49965, 49971, 49977, - 49983, 49988, 49993, 49998, 50003, 50009, 50015, 50023, 50030, 50036, - 50042, 50050, 50059, 50066, 50076, 50087, 50090, 50093, 50097, 50101, - 50108, 50115, 50126, 50137, 50147, 50157, 50164, 50171, 50178, 50185, - 50196, 50207, 50218, 50229, 50239, 50249, 50261, 50273, 50284, 50295, - 50307, 50319, 50328, 50338, 50348, 50359, 50370, 50377, 50384, 50391, - 50398, 50408, 50418, 50426, 50434, 50441, 50448, 50455, 50462, 50469, - 50474, 50479, 50485, 50493, 50503, 50511, 50519, 50527, 50535, 50543, - 50551, 50559, 50567, 50576, 50585, 50595, 50605, 50614, 50623, 50633, - 50643, 50652, 50661, 50671, 50681, 50690, 50699, 50709, 50719, 50733, - 50750, 50764, 50781, 50795, 50809, 50823, 50837, 50847, 50858, 50868, - 50879, 50896, 50913, 50921, 50927, 50934, 50941, 50948, 50955, 50960, - 50966, 50971, 50976, 50982, 50987, 50992, 50997, 51002, 51007, 51014, - 51019, 51026, 51031, 51036, 51040, 51044, 51051, 51058, 51065, 51072, - 51079, 51086, 51099, 51112, 51125, 51138, 51146, 51154, 51160, 51166, - 51173, 51180, 51187, 51194, 51198, 51203, 51211, 51219, 51227, 51234, - 51238, 51246, 51254, 51258, 51262, 51267, 51274, 51282, 51290, 51310, - 51330, 51350, 51370, 51390, 51410, 51430, 51450, 51456, 51463, 51472, - 51480, 51488, 51493, 51496, 51499, 51504, 51507, 51526, 51533, 51539, - 51545, 51549, 51552, 51555, 51558, 51570, 51583, 51590, 51597, 51600, - 51604, 51607, 51612, 51617, 51622, 51628, 51637, 51644, 51651, 51659, - 51666, 51673, 51676, 51682, 51688, 51691, 51694, 51699, 51704, 51710, - 51716, 51720, 51725, 51732, 51736, 51742, 51746, 51750, 51758, 51770, - 51779, 51783, 51785, 51794, 51803, 51809, 51812, 51818, 51824, 51829, - 51834, 51839, 51844, 51849, 51854, 51856, 51862, 51867, 51874, 51878, - 51884, 51887, 51891, 51898, 51905, 51907, 51909, 51915, 51921, 51927, - 51936, 51945, 51952, 51959, 51965, 51971, 51976, 51981, 51986, 51992, - 51998, 52003, 52010, 52014, 52018, 52031, 52044, 52056, 52065, 52071, - 52078, 52083, 52088, 52093, 52098, 52103, 52105, 52112, 52119, 52126, - 52133, 52140, 52148, 52154, 52159, 52165, 52171, 52177, 52184, 52190, - 52198, 52206, 52214, 52222, 52229, 52235, 52241, 52250, 52254, 52263, - 52272, 52281, 52289, 52293, 52299, 52306, 52313, 52317, 52323, 52330, - 52335, 52340, 52346, 52351, 52356, 52363, 52370, 52375, 52380, 52388, - 52396, 52406, 52416, 52423, 52430, 52434, 52438, 52450, 52456, 52462, - 52467, 52472, 52479, 52486, 52492, 52498, 52507, 52515, 52523, 52530, - 52537, 52544, 52550, 52557, 52563, 52570, 52577, 52584, 52591, 52597, - 52602, 52611, 52621, 52628, 52637, 52643, 52648, 52653, 52663, 52669, - 52675, 52681, 52689, 52694, 52701, 52708, 52719, 52726, 52733, 52740, - 52747, 52754, 52761, 52768, 52780, 52792, 52803, 52814, 52827, 52840, - 52845, 52850, 52859, 52868, 52875, 52882, 52891, 52900, 52908, 52916, - 52924, 52932, 52942, 52952, 52966, 52980, 52988, 52996, 53008, 53020, - 53028, 53036, 53046, 53056, 53061, 53066, 53075, 53084, 53089, 53094, - 53102, 53108, 53114, 53122, 53130, 53143, 53156, 53160, 53164, 53171, - 53178, 53185, 53193, 53201, 53210, 53219, 53225, 53231, 53238, 53245, - 53252, 53259, 53268, 53277, 53280, 53283, 53288, 53293, 53299, 53305, - 53312, 53319, 53329, 53339, 53346, 53353, 53361, 53369, 53377, 53385, - 53393, 53401, 53408, 53415, 53419, 53423, 53430, 53437, 53442, 53447, - 53452, 53457, 53463, 53477, 53484, 53491, 53495, 53497, 53499, 53504, - 53509, 53514, 53518, 53526, 53533, 53540, 53548, 53560, 53568, 53576, - 53587, 53591, 53595, 53601, 53609, 53622, 53629, 53636, 53643, 53648, - 53655, 53664, 53672, 53678, 53684, 53690, 53699, 53708, 53716, 53725, - 53730, 53733, 53738, 53744, 53750, 53756, 53762, 53766, 53769, 53773, - 53777, 53783, 53789, 53795, 53801, 53805, 53809, 53816, 53823, 53830, - 53837, 53844, 53851, 53861, 53871, 53878, 53885, 53893, 53901, 53905, - 53910, 53915, 53921, 53927, 53930, 53933, 53936, 53939, 53943, 53948, - 53953, 53958, 53963, 53968, 53972, 53976, 53980, 53984, 53988, 53992, - 53996, 54002, 54006, 54012, 54017, 54024, 54032, 54039, 54047, 54054, - 54062, 54071, 54078, 54088, 54099, 54105, 54114, 54120, 54129, 54138, - 54144, 54150, 54154, 54158, 54167, 54176, 54183, 54190, 54199, 0, 0, 0, - 54208, 54213, 54217, 54221, 54226, 54231, 54236, 54244, 54252, 54255, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54259, 54264, 54269, 54274, 54279, - 54284, 54289, 54294, 54299, 54304, 54309, 54315, 54319, 54324, 54329, - 54334, 54339, 54344, 54349, 54354, 54359, 54364, 54369, 54374, 54379, - 54384, 54389, 54394, 54399, 54404, 54409, 54414, 54419, 54424, 54429, - 54435, 54440, 54446, 54455, 54460, 54468, 54475, 54484, 54489, 54494, - 54499, 54505, 0, 54512, 54517, 54522, 54527, 54532, 54537, 54542, 54547, - 54552, 54557, 54562, 54568, 54572, 54577, 54582, 54587, 54592, 54597, - 54602, 54607, 54612, 54617, 54622, 54627, 54632, 54637, 54642, 54647, - 54652, 54657, 54662, 54667, 54672, 54677, 54682, 54688, 54693, 54699, - 54708, 54713, 54721, 54728, 54737, 54742, 54747, 54752, 54758, 0, 54765, - 54773, 54781, 54791, 54798, 54806, 54812, 54821, 54829, 54837, 54845, - 54853, 54861, 54869, 54874, 54881, 54887, 54894, 54902, 54909, 54916, - 54924, 54930, 54936, 54943, 54950, 54960, 54970, 54977, 54984, 54989, - 54999, 55009, 55014, 55019, 55024, 55029, 55034, 55039, 55044, 55049, - 55054, 55059, 55064, 55069, 55074, 55079, 55084, 55089, 55094, 55099, - 55104, 55109, 55114, 55119, 55124, 55129, 55134, 55139, 55144, 55149, - 55154, 55159, 55163, 55167, 55172, 55177, 55182, 55187, 55192, 55197, - 55202, 55207, 55212, 55217, 55222, 55227, 55232, 55237, 55242, 55247, - 55252, 55257, 55264, 55271, 55278, 55285, 55292, 55299, 55306, 55313, - 55320, 55327, 55334, 55341, 55348, 55355, 55360, 55365, 55372, 55379, - 55386, 55393, 55400, 55407, 55414, 55421, 55428, 55435, 55442, 55449, - 55455, 55461, 55467, 55473, 55480, 55487, 55494, 55501, 55508, 55515, - 55522, 55529, 55536, 55543, 55551, 55559, 55567, 55575, 55583, 55591, - 55599, 55607, 55611, 55617, 55623, 55627, 55633, 55639, 55645, 55652, - 55659, 55666, 55673, 55678, 55684, 0, 0, 0, 0, 0, 0, 0, 55690, 55698, - 55707, 55716, 55724, 55730, 55735, 55740, 55745, 55750, 55755, 55760, - 55765, 55770, 55775, 55780, 55785, 55790, 55795, 55800, 55805, 55810, - 55815, 55820, 55825, 55830, 55835, 55840, 55845, 55850, 55855, 55860, - 55865, 55870, 55875, 55880, 55885, 55890, 55895, 55900, 55905, 55910, - 55915, 55920, 55925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55930, 55934, 55939, - 55944, 55949, 55954, 55963, 55968, 55973, 55978, 55983, 55988, 55993, - 55998, 56003, 56010, 56015, 56020, 56029, 56036, 56041, 56046, 56051, - 56058, 56063, 56070, 56075, 56080, 56087, 56094, 56099, 56104, 56109, - 56116, 56123, 56128, 56133, 56138, 56143, 56148, 56155, 56162, 56167, - 56172, 56177, 56182, 56187, 56192, 56197, 56202, 56207, 56212, 56217, - 56224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56229, 56236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56241, 56247, 56251, 56255, 56259, 56263, 56267, 56271, - 56275, 56279, 56283, 56287, 56293, 56297, 56301, 56305, 56309, 56313, - 56317, 56321, 56325, 56329, 56333, 56337, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56341, 56345, 56349, 56353, 56357, 56361, 56365, 0, 56369, 56373, 56377, - 56381, 56385, 56389, 56393, 0, 56397, 56401, 56405, 56409, 56413, 56417, - 56421, 0, 56425, 56429, 56433, 56437, 56441, 56445, 56449, 0, 56453, - 56457, 56461, 56465, 56469, 56473, 56477, 0, 56481, 56485, 56489, 56493, - 56497, 56501, 56505, 0, 56509, 56513, 56517, 56521, 56525, 56529, 56533, - 0, 56537, 56541, 56545, 56549, 56553, 56557, 56561, 0, 56565, 56570, - 56575, 56580, 56585, 56590, 56595, 56599, 56604, 56609, 56614, 56618, - 56623, 56628, 56633, 56638, 56642, 56647, 56652, 56657, 56662, 56667, - 56672, 56676, 56681, 56686, 56693, 56698, 56703, 56709, 56716, 56723, - 56732, 56739, 56748, 56752, 56756, 56762, 56768, 56774, 56782, 56788, - 56792, 56796, 56800, 56806, 56812, 56816, 56818, 56822, 56828, 56830, - 56834, 56838, 56842, 56848, 56853, 56857, 56861, 56866, 56872, 56877, - 56882, 56887, 56892, 56899, 56906, 56911, 56916, 56921, 56926, 56931, - 56936, 56940, 56944, 56951, 56958, 56964, 56968, 56973, 56976, 56980, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 56988, 56992, 56996, 57001, 57006, 57011, 57015, 57019, - 57023, 57028, 57033, 57037, 57041, 57045, 57049, 57054, 57059, 57064, - 57069, 57073, 57077, 57082, 57087, 57092, 57097, 57101, 0, 57105, 57109, - 57113, 57117, 57121, 57125, 57129, 57134, 57139, 57143, 57148, 57153, - 57162, 57166, 57170, 57174, 57181, 57185, 57190, 57195, 57199, 57203, - 57209, 57214, 57219, 57224, 57229, 57233, 57237, 57241, 57245, 57249, - 57254, 57259, 57263, 57267, 57272, 57277, 57282, 57286, 57290, 57295, - 57300, 57306, 57312, 57316, 57322, 57328, 57332, 57338, 57344, 57349, - 57354, 57358, 57364, 57368, 57372, 57378, 57384, 57389, 57394, 57398, - 57402, 57410, 57416, 57422, 57428, 57433, 57438, 57443, 57449, 57453, - 57459, 57463, 57467, 57473, 57479, 57485, 57491, 57497, 57503, 57509, - 57515, 57521, 57527, 57533, 57539, 57543, 57549, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57555, 57558, 57562, 57566, 57570, 57574, 57577, 57580, - 57584, 57588, 57592, 57596, 57599, 57604, 57608, 57612, 57616, 57622, - 57626, 57630, 57634, 57638, 57645, 57651, 57655, 57659, 57663, 57667, - 57671, 57675, 57679, 57683, 57687, 57691, 57695, 57701, 57705, 57709, - 57713, 57717, 57721, 57725, 57729, 57733, 57737, 57741, 57745, 57749, - 57753, 57757, 57761, 57765, 57771, 57777, 57782, 57787, 57791, 57795, - 57799, 57803, 57807, 57811, 57815, 57819, 57823, 57827, 57831, 57835, - 57839, 57843, 57847, 57851, 57855, 57859, 57863, 57867, 57871, 57875, - 57879, 57883, 57889, 57893, 57897, 57901, 57905, 57909, 57913, 57917, - 57921, 57926, 57933, 57937, 57941, 57945, 57949, 57953, 57957, 57961, - 57965, 57969, 57973, 57977, 57981, 57988, 57992, 57998, 58002, 58006, - 58010, 58014, 58018, 58021, 58025, 58029, 58033, 58037, 58041, 58045, - 58049, 58053, 58057, 58061, 58065, 58069, 58073, 58077, 58081, 58085, - 58089, 58093, 58097, 58101, 58105, 58109, 58113, 58117, 58121, 58125, - 58129, 58133, 58137, 58141, 58145, 58149, 58155, 58159, 58163, 58167, - 58171, 58175, 58179, 58183, 58187, 58191, 58195, 58199, 58203, 58207, - 58211, 58215, 58219, 58223, 58227, 58231, 58235, 58239, 58243, 58247, - 58251, 58255, 58259, 58263, 58271, 58275, 58279, 58283, 58287, 58291, - 58297, 58301, 58305, 58309, 58313, 58317, 58321, 58325, 58329, 58333, - 58337, 58341, 58345, 58349, 58355, 58359, 58363, 58367, 58371, 58375, - 58379, 58383, 58387, 58391, 58395, 58399, 58403, 58407, 58411, 58415, - 58419, 58423, 58427, 58431, 58435, 58439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58443, 58452, 58460, - 58472, 58483, 58491, 58500, 58509, 58519, 58531, 58543, 58555, 0, 0, 0, - 0, 58561, 58564, 58567, 58572, 58575, 58582, 58586, 58590, 58594, 58598, - 58602, 58607, 58612, 58616, 58620, 58625, 58630, 58635, 58640, 58643, - 58646, 58652, 58658, 58663, 58668, 58675, 58682, 58686, 58690, 58694, - 58702, 58708, 58715, 58720, 58725, 58730, 58735, 58740, 58745, 58750, - 58755, 58760, 58765, 58770, 58775, 58780, 58785, 58791, 58796, 58800, - 58806, 58817, 58827, 58842, 58852, 58856, 58865, 58871, 58877, 58883, - 58888, 58891, 58896, 58900, 0, 58906, 58910, 58913, 58917, 58920, 58924, - 58927, 58931, 58934, 58938, 58941, 58944, 58948, 58952, 58956, 58960, - 58964, 58968, 58972, 58976, 58980, 58984, 58988, 58992, 58996, 59000, - 59004, 59008, 59012, 59016, 59020, 59024, 59028, 59032, 59036, 59041, - 59045, 59049, 59053, 59057, 59060, 59064, 59067, 59071, 59075, 59079, - 59083, 59086, 59090, 59093, 59097, 59101, 59105, 59109, 59113, 59117, - 59121, 59125, 59129, 59133, 59137, 59141, 59144, 59148, 59152, 59156, - 59160, 59164, 59167, 59172, 59176, 59181, 59185, 59188, 59192, 59196, - 59200, 59204, 59209, 59213, 59217, 59221, 59225, 59228, 59232, 59236, 0, - 0, 59241, 59249, 59257, 59264, 59271, 59275, 59281, 59286, 59291, 59295, - 59298, 59302, 59305, 59309, 59312, 59316, 59319, 59323, 59326, 59329, - 59333, 59337, 59341, 59345, 59349, 59353, 59357, 59361, 59365, 59369, - 59373, 59377, 59381, 59385, 59389, 59393, 59397, 59401, 59405, 59409, - 59413, 59417, 59421, 59426, 59430, 59434, 59438, 59442, 59445, 59449, - 59452, 59456, 59460, 59464, 59468, 59471, 59475, 59478, 59482, 59486, - 59490, 59494, 59498, 59502, 59506, 59510, 59514, 59518, 59522, 59526, - 59529, 59533, 59537, 59541, 59545, 59549, 59552, 59557, 59561, 59566, - 59570, 59573, 59577, 59581, 59585, 59589, 59594, 59598, 59602, 59606, - 59610, 59613, 59617, 59621, 59626, 59630, 59634, 59638, 59642, 59647, - 59654, 59658, 59664, 0, 0, 0, 0, 0, 59669, 59673, 59677, 59680, 59684, - 59688, 59692, 59695, 59698, 59702, 59706, 59710, 59714, 59718, 59722, - 59726, 59730, 59734, 59737, 59741, 59745, 59748, 59751, 59754, 59757, - 59761, 59765, 59769, 59773, 59777, 59781, 59785, 59789, 59793, 59797, - 59800, 59803, 59807, 59811, 59815, 59819, 0, 0, 0, 59823, 59827, 59831, - 59835, 59839, 59843, 59847, 59851, 59855, 59859, 59863, 59867, 59871, - 59875, 59879, 59883, 59887, 59891, 59895, 59899, 59903, 59907, 59911, - 59915, 59919, 59923, 59927, 59931, 59935, 59939, 59943, 59946, 59950, - 59953, 59957, 59961, 59964, 59968, 59972, 59975, 59979, 59983, 59987, - 59991, 59994, 59998, 60002, 60006, 60010, 60014, 60018, 60021, 60024, - 60028, 60032, 60036, 60040, 60044, 60048, 60052, 60056, 60060, 60064, - 60068, 60072, 60076, 60080, 60084, 60088, 60092, 60096, 60100, 60104, - 60108, 60112, 60116, 60120, 60124, 60128, 60132, 60136, 60140, 60144, - 60148, 60152, 60156, 60160, 60164, 60168, 60172, 60176, 60180, 60184, - 60188, 0, 60192, 60198, 60204, 60209, 60214, 60219, 60225, 60231, 60237, - 60243, 60249, 60255, 60261, 60267, 60273, 60279, 60285, 60289, 60293, - 60297, 60301, 60305, 60309, 60313, 60317, 60321, 60325, 60329, 60333, - 60337, 60341, 60345, 60349, 60353, 60357, 60361, 60365, 60370, 60375, - 60380, 60385, 60389, 60393, 0, 0, 0, 0, 0, 60397, 60402, 60407, 60412, - 60417, 60422, 60427, 60432, 60437, 60442, 60447, 60452, 60457, 60462, - 60467, 60472, 60476, 60481, 60485, 60490, 60495, 60500, 60505, 60510, - 60515, 60520, 60525, 60530, 60535, 60540, 60545, 60550, 60555, 60560, - 60565, 60570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60575, 60580, 60585, - 60590, 60594, 60599, 60603, 60608, 60613, 60618, 60623, 60628, 60632, - 60637, 60642, 60647, 60652, 60656, 60660, 60664, 60668, 60672, 60676, - 60680, 60684, 60688, 60692, 60696, 60700, 60704, 60708, 60713, 60718, - 60723, 60728, 60733, 60738, 60743, 60748, 60753, 60758, 60763, 60768, - 60773, 60778, 60783, 60789, 0, 60796, 60799, 60802, 60805, 60808, 60811, - 60814, 60817, 60820, 60823, 60827, 60831, 60835, 60839, 60843, 60847, - 60851, 60855, 60859, 60863, 60867, 60871, 60875, 60879, 60883, 60887, - 60891, 60895, 60899, 60903, 60907, 60911, 60915, 60919, 60923, 60927, - 60931, 60935, 60939, 60943, 60947, 60956, 60965, 60974, 60983, 60992, - 61001, 61010, 61019, 61022, 61027, 61032, 61037, 61042, 61047, 61052, - 61057, 61062, 61067, 61071, 61076, 61081, 61086, 61091, 61096, 61100, - 61104, 61108, 61112, 61116, 61120, 61124, 61128, 61132, 61136, 61140, - 61144, 61148, 61152, 61157, 61162, 61167, 61172, 61177, 61182, 61187, - 61192, 61197, 61202, 61207, 61212, 61217, 61222, 61228, 61234, 61239, - 61244, 61247, 61250, 61253, 61256, 61259, 61262, 61265, 61268, 61271, - 61275, 61279, 61283, 61287, 61291, 61295, 61299, 61303, 61307, 61311, - 61315, 61319, 61323, 61327, 61331, 61335, 61339, 61343, 61347, 61351, - 61355, 61359, 61363, 61367, 61371, 61375, 61379, 61383, 61387, 61391, - 61395, 61399, 61403, 61407, 61411, 61415, 61419, 61423, 61427, 61431, - 61436, 61441, 61446, 61451, 61455, 61460, 61465, 61470, 61475, 61480, - 61485, 61490, 61495, 61500, 61504, 61510, 61516, 61522, 61528, 61534, - 61540, 61546, 61552, 61558, 61564, 61570, 61576, 61579, 61582, 61585, - 61590, 61593, 61596, 61599, 61602, 61605, 61608, 61612, 61616, 61620, - 61624, 61628, 61632, 61636, 61640, 61644, 61648, 61652, 61656, 61660, - 61663, 61666, 61670, 61674, 61678, 61682, 61685, 61689, 61693, 61697, - 61701, 61704, 61708, 61712, 61716, 61720, 61723, 61727, 61731, 61734, - 61738, 61742, 61746, 61750, 61754, 61758, 61762, 0, 61766, 61769, 61772, - 61775, 61778, 61781, 61784, 61787, 61790, 61793, 61796, 61799, 61802, - 61805, 61808, 61811, 61814, 61817, 61820, 61823, 61826, 61829, 61832, - 61835, 61838, 61841, 61844, 61847, 61850, 61853, 61856, 61859, 61862, - 61865, 61868, 61871, 61874, 61877, 61880, 61883, 61886, 61889, 61892, - 61895, 61898, 61901, 61904, 61907, 61910, 61913, 61916, 61919, 61922, - 61925, 61928, 61931, 61934, 61937, 61940, 61943, 61946, 61949, 61952, - 61955, 61958, 61961, 61964, 61967, 61970, 61973, 61976, 61979, 61982, - 61985, 61988, 61991, 61994, 61997, 62000, 62003, 62006, 62009, 62012, - 62015, 62018, 62021, 62024, 62027, 62030, 62038, 62045, 62052, 62059, - 62066, 62073, 62080, 62087, 62094, 62101, 62109, 62117, 62125, 62133, - 62141, 62149, 62157, 62165, 62173, 62181, 62189, 62197, 62205, 62213, - 62221, 62224, 62227, 62230, 62232, 62235, 62238, 62241, 62246, 62251, - 62254, 62261, 62268, 62275, 62282, 62285, 62290, 62292, 62296, 62298, - 62300, 62303, 62306, 62309, 62312, 62315, 62318, 62321, 62326, 62331, - 62334, 62337, 62340, 62343, 62346, 62349, 62352, 62356, 62359, 62362, - 62365, 62368, 62371, 62375, 62378, 62381, 62384, 62389, 62394, 62399, - 62404, 62409, 62414, 62419, 62424, 62429, 62437, 62439, 62442, 62445, - 62448, 62451, 62456, 62464, 62467, 62470, 62474, 62477, 62480, 62483, - 62488, 62491, 62494, 62499, 62502, 62505, 62510, 62513, 62516, 62521, - 62526, 62531, 62534, 62537, 62540, 62543, 62549, 62552, 62555, 62558, - 62560, 62563, 62566, 62569, 62574, 62577, 62580, 62583, 62586, 62589, - 62594, 62597, 62600, 62603, 62606, 62609, 62612, 62615, 62618, 62621, - 62626, 62630, 62637, 62644, 62651, 62658, 62665, 62672, 62679, 62686, - 62693, 62701, 62709, 62717, 62725, 62733, 62741, 62749, 62757, 62765, - 62773, 62781, 62789, 62797, 62805, 62813, 62821, 62829, 62837, 62845, - 62853, 62861, 62869, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23265, 23268, 23273, 23277, 23282, 23288, 23294, 23300, 23306, 23312, + 23318, 23324, 23328, 23332, 23336, 23340, 23344, 23348, 23352, 23356, + 23361, 23365, 23370, 23374, 23379, 23383, 23388, 23392, 23397, 23401, + 23406, 23410, 23415, 23419, 23423, 23427, 23431, 23435, 23439, 23443, + 23449, 23452, 23456, 23460, 23465, 23469, 23474, 23478, 23483, 23487, + 23492, 23496, 23501, 23505, 23510, 23514, 23519, 23525, 23529, 23535, + 23540, 23546, 23550, 23556, 23561, 23565, 23569, 23573, 23577, 23581, + 23586, 23589, 23593, 23598, 23602, 23607, 23610, 23614, 23618, 23622, + 23626, 23630, 23634, 23638, 23642, 23646, 23650, 23654, 23659, 23663, + 23667, 23673, 23677, 23683, 23687, 23693, 23697, 23701, 23705, 23709, + 23713, 23718, 23722, 23726, 23730, 23734, 23738, 23742, 23746, 23750, + 23754, 23758, 23764, 23770, 23776, 23782, 23788, 23793, 23799, 23805, + 23811, 23815, 23819, 23823, 23827, 23831, 23835, 23839, 23843, 23847, + 23851, 23855, 23859, 23863, 23868, 23873, 23878, 23882, 23886, 23890, + 23894, 23898, 23902, 23906, 23910, 23914, 23918, 23924, 23930, 23936, + 23942, 23948, 23954, 23960, 23966, 23972, 23976, 23980, 23984, 23988, + 23992, 23996, 24000, 24006, 24012, 24018, 24024, 24030, 24036, 24042, + 24048, 24054, 24059, 24064, 24069, 24074, 24080, 24086, 24092, 24098, + 24104, 24110, 24116, 24121, 24127, 24133, 24139, 24144, 24150, 24156, + 24162, 24167, 24172, 24177, 24182, 24187, 24192, 24197, 24202, 24207, + 24212, 24217, 24222, 24226, 24231, 24236, 24241, 24246, 24251, 24256, + 24261, 24266, 24271, 24276, 24281, 24286, 24291, 24296, 24301, 24306, + 24311, 24316, 24321, 24326, 24331, 24336, 24341, 24346, 24351, 24356, + 24361, 24366, 24371, 24375, 24380, 24385, 24390, 24395, 24400, 24405, + 24410, 24415, 24420, 24425, 24430, 24435, 24440, 24445, 24450, 24455, + 24460, 24465, 24470, 24475, 24480, 24485, 24490, 24495, 24500, 24504, + 24509, 24514, 24519, 24524, 24529, 24533, 24538, 24543, 24548, 24553, + 24558, 24562, 24567, 24573, 24578, 24583, 24588, 24593, 24599, 24604, + 24609, 24614, 24619, 24624, 24629, 24634, 24639, 24644, 24649, 24654, + 24659, 24664, 24669, 24674, 24679, 24684, 24689, 24694, 24699, 24704, + 24709, 24714, 24719, 24724, 24729, 24734, 24739, 24744, 24749, 24754, + 24759, 24764, 24769, 24774, 24779, 24784, 24789, 24794, 24799, 24804, + 24809, 24814, 24819, 24825, 24830, 24835, 24840, 24845, 24850, 24855, + 24860, 24865, 24870, 24875, 24880, 24885, 24890, 24895, 24900, 24905, + 24910, 24915, 24920, 24925, 24930, 24935, 24940, 24945, 24950, 24955, + 24960, 24965, 24970, 24975, 24980, 24985, 24990, 24995, 25000, 25005, + 25010, 25015, 25021, 25025, 25029, 25033, 25037, 25041, 25045, 25049, + 25053, 25059, 25065, 25071, 25077, 25083, 25089, 25095, 25102, 25108, + 25113, 25118, 25123, 25128, 25133, 25138, 25143, 25148, 25153, 25158, + 25163, 25168, 25173, 25178, 25183, 25188, 25193, 25198, 25203, 25208, + 25213, 25218, 25223, 25228, 25233, 25238, 25243, 25248, 0, 0, 0, 25255, + 25265, 25269, 25276, 25280, 25284, 25288, 25296, 25300, 25305, 25310, + 25315, 25319, 25324, 25329, 25332, 25336, 25340, 25349, 25353, 25357, + 25363, 25367, 25371, 25379, 25383, 25391, 25397, 25403, 25409, 25415, + 25424, 25429, 25433, 25442, 25445, 25451, 25455, 25461, 25466, 25472, + 25480, 25486, 25491, 25498, 25503, 25507, 25511, 25521, 25527, 25531, + 25541, 25547, 25551, 25555, 25562, 25569, 25574, 25579, 25588, 25592, + 25596, 25600, 25608, 25615, 25619, 25623, 25627, 25631, 25635, 25639, + 25643, 25647, 25651, 25655, 25659, 25664, 25669, 25674, 25678, 25682, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25686, 25690, 25694, 25698, + 25702, 25707, 25712, 25717, 25722, 25726, 25730, 25735, 25739, 0, 25743, + 25748, 25753, 25758, 25762, 25767, 25772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 25777, 25781, 25785, 25789, 25793, 25798, 25803, 25808, 25813, 25817, + 25821, 25826, 25830, 25834, 25838, 25843, 25848, 25853, 25857, 25862, + 25867, 25872, 25878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25883, 25887, 25891, + 25895, 25899, 25904, 25909, 25914, 25919, 25923, 25927, 25932, 25936, + 25940, 25944, 25949, 25954, 25959, 25963, 25968, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 25973, 25977, 25981, 25985, 25989, 25994, 25999, 26004, + 26009, 26013, 26017, 26022, 26026, 0, 26030, 26035, 26040, 0, 26045, + 26050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26055, 26058, 26062, 26066, + 26070, 26074, 26078, 26082, 26086, 26090, 26094, 26098, 26102, 26106, + 26110, 26114, 26118, 26122, 26125, 26129, 26133, 26137, 26141, 26145, + 26149, 26153, 26157, 26161, 26165, 26169, 26173, 26177, 26181, 26184, + 26188, 26192, 26198, 26204, 26210, 26216, 26222, 26228, 26234, 26240, + 26246, 26252, 26258, 26264, 26270, 26276, 26285, 26294, 26300, 26306, + 26312, 26317, 26321, 26326, 26331, 26336, 26340, 26345, 26350, 26355, + 26359, 26364, 26368, 26373, 26378, 26383, 26388, 26392, 26396, 26400, + 26404, 26408, 26412, 26416, 26420, 26424, 26428, 26434, 26438, 26442, + 26446, 26450, 26454, 26462, 26468, 26472, 26478, 26482, 26488, 26492, 0, + 0, 26496, 26500, 26503, 26506, 26509, 26512, 26515, 26518, 26521, 26524, + 0, 0, 0, 0, 0, 0, 26527, 26535, 26543, 26551, 26559, 26567, 26575, 26583, + 26591, 26599, 0, 0, 0, 0, 0, 0, 26607, 26610, 26613, 26616, 26621, 26624, + 26629, 26636, 26644, 26649, 26656, 26659, 26666, 26673, 26680, 0, 26684, + 26688, 26691, 26694, 26697, 26700, 26703, 26706, 26709, 26712, 0, 0, 0, + 0, 0, 0, 26715, 26718, 26721, 26724, 26727, 26730, 26734, 26738, 26742, + 26745, 26749, 26753, 26756, 26760, 26764, 26767, 26771, 26775, 26779, + 26783, 26787, 26791, 26795, 26798, 26801, 26805, 26809, 26812, 26816, + 26820, 26824, 26828, 26832, 26836, 26840, 26844, 26851, 26856, 26861, + 26866, 26871, 26877, 26883, 26889, 26895, 26900, 26906, 26912, 26917, + 26923, 26929, 26935, 26941, 26947, 26952, 26958, 26963, 26969, 26975, + 26981, 26987, 26993, 26998, 27003, 27009, 27015, 27020, 27026, 27031, + 27037, 27042, 27047, 27053, 27059, 27065, 27071, 27077, 27083, 27089, + 27095, 27101, 27107, 27113, 27119, 27124, 27129, 27134, 27140, 0, 0, 0, + 0, 0, 0, 0, 0, 27146, 27155, 27164, 27172, 27180, 27190, 27198, 27207, + 27214, 27221, 27228, 27236, 27244, 27252, 27260, 27268, 27276, 27284, + 27292, 27299, 27307, 27315, 27323, 27331, 27339, 27349, 27359, 27369, + 27379, 27389, 27399, 27409, 27419, 27429, 27439, 27449, 27459, 27469, + 27479, 27487, 27495, 27505, 27513, 0, 0, 0, 0, 0, 27523, 27527, 27531, + 27535, 27539, 27543, 27547, 27551, 27555, 27559, 27563, 27567, 27571, + 27575, 27579, 27583, 27587, 27591, 27595, 27599, 27603, 27607, 27611, + 27615, 27621, 27625, 27631, 27635, 27641, 27645, 27651, 27655, 27659, + 27663, 27667, 27671, 27675, 27681, 27687, 27693, 27699, 27704, 27709, + 27714, 27720, 27726, 27732, 27738, 27745, 27751, 27756, 27761, 27765, + 27769, 27773, 27777, 27781, 27785, 27789, 27795, 27801, 27807, 27812, + 27819, 27824, 27829, 27835, 27840, 27847, 27854, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 27860, 27866, 27870, 27875, 27880, 27885, 27890, 27895, 27900, + 27905, 27910, 27915, 27920, 27925, 27930, 27935, 27939, 27943, 27948, + 27953, 27958, 27962, 27966, 27970, 27975, 27980, 27985, 27990, 27995, 0, + 0, 0, 27999, 28004, 28009, 28014, 28020, 28026, 28032, 28038, 28043, + 28048, 28054, 28060, 0, 0, 0, 0, 28067, 28072, 28078, 28084, 28090, + 28095, 28100, 28105, 28110, 28116, 28121, 28126, 0, 0, 0, 0, 28131, 0, 0, + 0, 28136, 28141, 28146, 28151, 28155, 28159, 28163, 28167, 28171, 28175, + 28179, 28183, 28187, 28192, 28198, 28204, 28210, 28216, 28221, 28227, + 28233, 28239, 28244, 28250, 28255, 28261, 28267, 28272, 28278, 28284, + 28290, 28295, 28300, 28305, 28311, 28317, 28322, 28328, 28333, 28339, + 28344, 28350, 0, 0, 28356, 28362, 28368, 28374, 28380, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 28386, 28393, 28400, 28406, 28413, 28420, 28426, 28433, + 28440, 28447, 28454, 28460, 28467, 28474, 28480, 28487, 28494, 28500, + 28507, 28514, 28520, 28526, 28533, 28539, 28545, 28552, 28558, 28565, + 28572, 28579, 28586, 28593, 28600, 28606, 28613, 28620, 28626, 28633, + 28640, 28647, 28654, 28661, 28668, 28675, 0, 0, 0, 0, 28682, 28690, + 28697, 28704, 28710, 28717, 28723, 28730, 28736, 28743, 28750, 28757, + 28764, 28771, 28778, 28785, 28792, 28799, 28806, 28813, 28819, 28825, + 28832, 28839, 28846, 28852, 0, 0, 0, 0, 0, 0, 28858, 28864, 28869, 28874, + 28879, 28884, 28889, 28894, 28899, 28904, 28909, 0, 0, 0, 28915, 28921, + 28927, 28931, 28937, 28943, 28949, 28955, 28961, 28967, 28973, 28979, + 28985, 28991, 28997, 29003, 29009, 29015, 29021, 29025, 29031, 29037, + 29043, 29049, 29055, 29061, 29067, 29073, 29079, 29085, 29091, 29097, + 29103, 29109, 29115, 29119, 29124, 29129, 29134, 29138, 29143, 29147, + 29152, 29157, 29162, 29166, 29171, 29176, 29181, 29186, 29191, 29195, + 29199, 29204, 29209, 29214, 29218, 29222, 29227, 29232, 29237, 29242, 0, + 0, 29248, 29252, 29259, 29264, 29270, 29276, 29281, 29287, 29293, 29298, + 29304, 29310, 29316, 29322, 29328, 29333, 29338, 29344, 29349, 29355, + 29360, 29366, 29372, 29378, 29384, 29388, 29393, 29398, 29404, 29410, + 29415, 29421, 29427, 29431, 29436, 29441, 29445, 29450, 29455, 29460, + 29465, 29471, 29477, 29483, 29488, 29493, 29497, 29502, 29506, 29511, + 29515, 29520, 29525, 29530, 29535, 29542, 29548, 29555, 29565, 29574, + 29581, 29587, 29597, 29602, 29608, 0, 29614, 29619, 29624, 29632, 29638, + 29646, 29651, 29657, 29663, 29669, 29674, 29680, 29685, 29692, 29698, + 29703, 29709, 29715, 29721, 29728, 29735, 29742, 29747, 29752, 29759, + 29766, 29773, 29780, 29787, 0, 0, 29794, 29801, 29808, 29814, 29820, + 29826, 29832, 29838, 29844, 29850, 29856, 0, 0, 0, 0, 0, 0, 29862, 29868, + 29873, 29878, 29883, 29888, 29893, 29898, 29903, 29908, 0, 0, 0, 0, 0, 0, + 29913, 29918, 29923, 29928, 29933, 29938, 29943, 29952, 29959, 29964, + 29969, 29974, 29979, 29984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29989, 29995, + 30001, 30005, 30009, 30013, 30017, 30023, 30027, 30033, 30037, 30043, + 30049, 30057, 30063, 30071, 30075, 30079, 30083, 30089, 30092, 30098, + 30102, 30108, 30112, 30116, 30122, 30126, 30132, 30136, 30142, 30150, + 30158, 30166, 30172, 30176, 30182, 30186, 30192, 30195, 30198, 30204, + 30208, 30214, 30217, 30220, 30223, 30227, 30231, 30237, 30243, 30247, + 30250, 30254, 30259, 30264, 30271, 30276, 30283, 30290, 30299, 30306, + 30315, 30320, 30327, 30334, 30343, 30348, 30355, 30360, 30366, 30372, + 30378, 30384, 30390, 30396, 0, 0, 0, 0, 30402, 30406, 30409, 30412, + 30415, 30418, 30421, 30424, 30427, 30430, 30433, 30436, 30439, 30442, + 30447, 30452, 30457, 30460, 30465, 30470, 30475, 30480, 30487, 30492, + 30497, 30502, 30507, 30514, 30520, 30526, 30532, 30538, 30544, 30553, + 30562, 30568, 30574, 30582, 30590, 30599, 30608, 30616, 30624, 30633, + 30642, 0, 0, 0, 30650, 30655, 30660, 30665, 30669, 30673, 30677, 30682, + 30686, 30690, 30695, 30699, 30704, 30709, 30714, 30719, 30724, 30729, + 30734, 30739, 30744, 30748, 30752, 30757, 30762, 30767, 30771, 30775, + 30779, 30784, 30789, 30794, 30799, 30803, 30809, 30815, 30821, 30827, + 30833, 30839, 30845, 30851, 30857, 0, 0, 0, 30862, 30867, 30872, 30877, + 30881, 30885, 30889, 30893, 30897, 30901, 30905, 30909, 0, 0, 0, 0, 0, 0, + 30913, 30917, 30923, 30927, 30933, 30939, 30944, 30951, 30955, 30961, + 30965, 30971, 30976, 30983, 30990, 30995, 31002, 31007, 31012, 31016, + 31022, 31026, 31032, 31039, 31046, 31051, 31058, 31065, 31069, 31075, + 31080, 31085, 31092, 31097, 31102, 31107, 31112, 31116, 31120, 31125, + 31130, 31137, 31143, 31148, 31155, 31160, 31167, 31172, 31182, 31188, + 31194, 31198, 0, 0, 0, 0, 0, 0, 0, 0, 31202, 31211, 31218, 31225, 31232, + 31235, 31239, 31243, 31247, 31251, 31255, 31259, 31263, 31267, 31271, + 31275, 31279, 31283, 31286, 31289, 31293, 31297, 31301, 31305, 31309, + 31313, 31316, 31320, 31324, 31328, 31332, 31335, 31338, 31342, 31345, + 31349, 31353, 31357, 31361, 31365, 31368, 31373, 31378, 31383, 31387, + 31391, 31396, 31400, 31405, 31409, 31414, 31418, 31422, 31426, 31431, + 31435, 31440, 31445, 31450, 31454, 0, 0, 0, 31458, 31463, 31472, 31477, + 31484, 31489, 31493, 31496, 31499, 31502, 31505, 31508, 31511, 31514, + 31517, 0, 0, 0, 31520, 31524, 31528, 31532, 31539, 31545, 31551, 31557, + 31563, 31569, 31575, 31581, 31587, 31593, 31600, 31607, 31614, 31621, + 31628, 31635, 31642, 31649, 31656, 31663, 31670, 31677, 31684, 31691, + 31698, 31705, 31712, 31719, 31726, 31733, 31740, 31747, 31754, 31761, + 31768, 31775, 31782, 31789, 31796, 31803, 31811, 31819, 31827, 31833, + 31839, 31845, 31853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31862, 31867, 31872, 31877, + 31882, 31891, 31902, 31911, 31922, 31928, 31941, 31947, 31954, 31961, + 31966, 31972, 31978, 31989, 31998, 32005, 32012, 32021, 32028, 32037, + 32047, 32057, 32064, 32071, 32078, 32088, 32093, 32101, 32107, 32115, + 32124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32129, 32134, 32140, 32147, + 32155, 32161, 32167, 32173, 32178, 32185, 32191, 32197, 32203, 32211, + 32216, 32223, 32228, 32234, 32240, 32247, 32255, 32262, 32268, 32275, + 32282, 32288, 32295, 32302, 32308, 32313, 32319, 32327, 32335, 32341, + 32347, 32353, 32359, 32367, 32371, 32377, 32383, 32389, 32395, 32401, + 32407, 32411, 32416, 32421, 32428, 32433, 32437, 32443, 32448, 32453, + 32457, 32462, 32467, 32471, 32475, 32479, 32485, 32489, 32494, 32499, + 32503, 32508, 32512, 32517, 32521, 32527, 32532, 32539, 32544, 32549, + 32553, 32558, 32563, 32570, 32575, 32581, 32586, 32590, 32595, 32599, + 32604, 32611, 32618, 32623, 32628, 32632, 32638, 32644, 32649, 32654, + 32659, 32665, 32670, 32676, 32681, 32687, 32693, 32699, 32706, 32713, + 32720, 32727, 32734, 32741, 32746, 32754, 32763, 32772, 32781, 32790, + 32799, 32808, 32820, 32829, 32838, 32847, 32854, 32859, 32866, 32874, + 32882, 32889, 32896, 32903, 32910, 32918, 32927, 32936, 32945, 32954, + 32963, 32972, 32981, 32990, 32999, 33008, 33017, 33026, 33035, 33044, + 33052, 33061, 33072, 33080, 33089, 33100, 33109, 33118, 33127, 33136, + 33144, 33153, 33160, 33165, 33173, 33178, 33185, 33190, 33199, 33205, + 33212, 33219, 33224, 33229, 33237, 33245, 33254, 33263, 33268, 33275, + 33286, 33294, 33303, 33308, 33314, 33319, 33326, 33331, 33340, 33345, + 33350, 33355, 33362, 33369, 33374, 33383, 33391, 33396, 33401, 33408, + 33415, 33419, 33423, 33426, 33429, 33432, 33435, 33438, 33441, 33448, + 33451, 33454, 33459, 33463, 33467, 33471, 33475, 33479, 33488, 33494, + 33500, 33506, 33514, 33522, 33528, 33534, 33541, 33547, 33552, 33558, + 33564, 33569, 33575, 33581, 33589, 33594, 33600, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33606, 33613, 33620, 33625, 33634, + 33642, 33650, 33657, 33664, 33671, 33678, 33686, 33694, 33704, 33714, + 33722, 33730, 33738, 33746, 33755, 33764, 33772, 33780, 33789, 33798, + 33807, 33816, 33825, 33834, 33842, 33850, 33858, 33866, 33876, 33886, + 33894, 33902, 33910, 33918, 33926, 33934, 33942, 33950, 33958, 33966, + 33974, 33982, 33991, 34000, 34009, 34018, 34028, 34038, 34045, 34052, + 34060, 34068, 34077, 34086, 34094, 34102, 34114, 34126, 34135, 34144, + 34153, 34162, 34169, 34176, 34184, 34192, 34200, 34208, 34216, 34224, + 34232, 34240, 34249, 34258, 34267, 34276, 34285, 34294, 34304, 34314, + 34323, 34332, 34341, 34350, 34357, 34364, 34372, 34380, 34388, 34396, + 34404, 34412, 34424, 34436, 34445, 34454, 34462, 34470, 34478, 34486, + 34497, 34508, 34519, 34530, 34542, 34554, 34562, 34570, 34578, 34586, + 34595, 34604, 34613, 34622, 34630, 34638, 34646, 34654, 34662, 34670, + 34679, 34688, 34698, 34708, 34715, 34722, 34730, 34738, 34745, 34752, + 34759, 34766, 34774, 34782, 34790, 34798, 34806, 34814, 34822, 34830, + 34838, 34846, 34854, 34862, 34870, 34878, 34886, 34894, 34903, 34912, + 34921, 34929, 34938, 34947, 34956, 34965, 34975, 34984, 34990, 34995, + 35002, 35009, 35017, 35025, 35034, 35043, 35052, 35061, 35072, 35083, + 35092, 35101, 35111, 35121, 35130, 35139, 35148, 35157, 35168, 35179, + 35188, 35197, 35207, 35217, 35224, 35231, 35239, 35247, 35253, 35259, + 35268, 35277, 35286, 35295, 35306, 35317, 35326, 35335, 35345, 35355, + 35364, 35373, 35381, 35389, 35396, 35403, 35411, 35419, 35428, 35437, + 35446, 35455, 35466, 35477, 35486, 35495, 35505, 35515, 35524, 35533, + 35542, 35551, 35562, 35573, 35582, 35591, 35601, 35611, 35618, 35625, + 35633, 35641, 35650, 35659, 35668, 35677, 35688, 35699, 35708, 35717, + 35727, 35737, 35744, 35751, 35759, 35767, 35776, 35785, 35792, 35799, + 35806, 35813, 35820, 35827, 35835, 35843, 35851, 35859, 35870, 35881, + 35892, 35903, 35914, 35925, 35933, 35941, 35952, 35963, 35974, 35985, + 35996, 36007, 36015, 36023, 36034, 36045, 36056, 0, 0, 36067, 36075, + 36083, 36094, 36105, 36116, 0, 0, 36127, 36135, 36143, 36154, 36165, + 36176, 36187, 36198, 36209, 36217, 36225, 36236, 36247, 36258, 36269, + 36280, 36291, 36299, 36307, 36318, 36329, 36340, 36351, 36362, 36373, + 36381, 36389, 36400, 36411, 36422, 36433, 36444, 36455, 36463, 36471, + 36482, 36493, 36504, 0, 0, 36515, 36523, 36531, 36542, 36553, 36564, 0, + 0, 36575, 36583, 36591, 36602, 36613, 36624, 36635, 36646, 0, 36657, 0, + 36665, 0, 36676, 0, 36687, 36698, 36706, 36714, 36725, 36736, 36747, + 36758, 36769, 36780, 36788, 36796, 36807, 36818, 36829, 36840, 36851, + 36862, 36870, 36878, 36886, 36894, 36902, 36910, 36918, 36926, 36934, + 36942, 36950, 36958, 36966, 0, 0, 36974, 36985, 36996, 37010, 37024, + 37038, 37052, 37066, 37080, 37091, 37102, 37116, 37130, 37144, 37158, + 37172, 37186, 37197, 37208, 37222, 37236, 37250, 37264, 37278, 37292, + 37303, 37314, 37328, 37342, 37356, 37370, 37384, 37398, 37409, 37420, + 37434, 37448, 37462, 37476, 37490, 37504, 37515, 37526, 37540, 37554, + 37568, 37582, 37596, 37610, 37618, 37626, 37637, 37645, 0, 37656, 37664, + 37675, 37683, 37691, 37699, 37707, 37715, 37718, 37721, 37724, 37727, + 37733, 37744, 37752, 0, 37763, 37771, 37782, 37790, 37798, 37806, 37814, + 37822, 37828, 37834, 37840, 37848, 37856, 37867, 0, 0, 37878, 37886, + 37897, 37905, 37913, 37921, 0, 37929, 37935, 37941, 37947, 37955, 37963, + 37974, 37985, 37993, 38001, 38009, 38020, 38028, 38036, 38044, 38052, + 38060, 38066, 38072, 0, 0, 38075, 38086, 38094, 0, 38105, 38113, 38124, + 38132, 38140, 38148, 38156, 38164, 38167, 0, 38170, 38174, 38178, 38182, + 38186, 38190, 38194, 38198, 38202, 38206, 38210, 38214, 38220, 38226, + 38232, 38235, 38238, 38240, 38244, 38248, 38252, 38256, 38258, 38262, + 38266, 38272, 38278, 38285, 38292, 38297, 38302, 38308, 38314, 38316, + 38319, 38321, 38325, 38329, 38333, 38336, 38340, 38344, 38348, 38352, + 38356, 38362, 38366, 38370, 38376, 38381, 38388, 38390, 38393, 38397, + 38401, 38406, 38412, 38414, 38423, 38432, 38435, 38439, 38441, 38443, + 38445, 38448, 38454, 38456, 38460, 38464, 38471, 38478, 38482, 38487, + 38492, 38497, 38502, 38506, 38510, 38513, 38517, 38521, 38528, 38533, + 38537, 38541, 38546, 38550, 38554, 38559, 38564, 38568, 38572, 38576, + 38578, 38583, 38588, 38592, 38596, 38600, 38604, 0, 0, 0, 0, 0, 38608, + 38614, 38620, 38627, 38634, 38639, 38644, 38648, 0, 0, 38654, 38657, + 38660, 38663, 38666, 38669, 38672, 38676, 38680, 38685, 38690, 38695, + 38701, 38705, 38708, 38711, 38714, 38717, 38720, 38723, 38726, 38729, + 38732, 38736, 38740, 38745, 38750, 0, 38755, 38761, 38767, 38773, 38780, + 38787, 38794, 38801, 38807, 38813, 38819, 38826, 38832, 0, 0, 0, 38839, + 38842, 38845, 38848, 38853, 38856, 38859, 38862, 38865, 38868, 38871, + 38875, 38878, 38881, 38884, 38887, 38890, 38895, 38898, 38901, 38904, + 38907, 38910, 38915, 38918, 38921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 38926, 38931, 38936, 38943, 38951, 38956, + 38961, 38965, 38969, 38974, 38981, 38988, 38992, 38997, 39002, 39007, + 39012, 39019, 39024, 39029, 39034, 39043, 39050, 39057, 39061, 39066, + 39072, 39077, 39084, 39093, 39102, 39106, 39110, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39114, 39118, 39126, 39130, 39134, 39139, 39143, + 39147, 39151, 39153, 39157, 39161, 39165, 39170, 39174, 39178, 39186, + 39189, 39193, 39196, 39199, 39205, 39208, 39211, 39217, 39221, 39225, + 39229, 39232, 39236, 39239, 39243, 39245, 39248, 39251, 39255, 39257, + 39261, 39264, 39267, 39272, 39277, 39284, 39287, 39290, 39294, 39299, + 39302, 39305, 39308, 39312, 39317, 39320, 39323, 39325, 39328, 39331, + 39334, 39338, 39343, 39346, 39350, 39354, 39358, 39362, 39367, 39373, + 39378, 39383, 39389, 39394, 39399, 39403, 39407, 39412, 39416, 39420, + 39423, 39425, 39430, 39436, 39443, 39450, 39457, 39464, 39471, 39478, + 39485, 39492, 39500, 39507, 39515, 39522, 39529, 39537, 39545, 39550, + 39555, 39560, 39565, 39570, 39575, 39580, 39585, 39590, 39595, 39601, + 39607, 39613, 39619, 39626, 39634, 39641, 39647, 39653, 39659, 39665, + 39671, 39677, 39683, 39689, 39695, 39702, 39709, 39716, 39723, 39731, + 39740, 39748, 39759, 39767, 39775, 39784, 39791, 39800, 39809, 39817, + 39826, 0, 0, 0, 0, 0, 0, 39834, 39836, 39839, 39841, 39844, 39847, 39850, + 39855, 39860, 39865, 39870, 39874, 39878, 39882, 39886, 39891, 39897, + 39902, 39908, 39913, 39918, 39923, 39929, 39934, 39940, 39946, 39950, + 39954, 39959, 39964, 39969, 39974, 39979, 39987, 39995, 40003, 40011, + 40018, 40026, 40033, 40040, 40049, 40061, 40067, 40073, 40081, 40089, + 40098, 40107, 40115, 40123, 40132, 40141, 40146, 40154, 40159, 40164, + 40170, 40175, 40181, 40188, 40195, 40200, 40206, 40211, 40214, 40218, + 40221, 40225, 40229, 40233, 40239, 40245, 40251, 40257, 40261, 40265, + 40269, 40273, 40279, 40285, 40289, 40294, 40298, 40303, 40308, 40313, + 40316, 40320, 40323, 40327, 40334, 40342, 40353, 40364, 40369, 40378, + 40385, 40394, 40403, 40407, 40413, 40421, 40425, 40430, 40435, 40441, + 40447, 40453, 40460, 40464, 40468, 40473, 40476, 40478, 40482, 40486, + 40494, 40498, 40500, 40502, 40506, 40514, 40519, 40525, 40535, 40542, + 40547, 40551, 40555, 40559, 40562, 40565, 40568, 40572, 40576, 40580, + 40584, 40588, 40591, 40595, 40599, 40602, 40604, 40607, 40609, 40613, + 40617, 40619, 40625, 40628, 40633, 40637, 40641, 40643, 40645, 40647, + 40650, 40654, 40658, 40662, 40666, 40670, 40676, 40682, 40684, 40686, + 40688, 40690, 40693, 40695, 40699, 40701, 40705, 40708, 40713, 40717, + 40721, 40724, 40727, 40731, 40737, 40741, 40751, 40761, 40765, 40771, + 40777, 40780, 40784, 40787, 40792, 40796, 40802, 40806, 40818, 40826, + 40830, 40834, 40840, 40844, 40847, 40849, 40852, 40856, 40860, 40867, + 40871, 40875, 40879, 40882, 40887, 40892, 40897, 40902, 40907, 40912, + 40920, 40928, 40932, 40936, 40938, 40943, 40947, 40951, 40959, 40967, + 40973, 40979, 40988, 40997, 41002, 41007, 41015, 41023, 41025, 41027, + 41032, 41037, 41043, 41049, 41055, 41061, 41065, 41069, 41076, 41083, + 41089, 41095, 41105, 41115, 41123, 41131, 41133, 41137, 41141, 41146, + 41151, 41158, 41165, 41168, 41171, 41174, 41177, 41180, 41185, 41189, + 41194, 41199, 41202, 41205, 41208, 41211, 41214, 41218, 41221, 41224, + 41227, 41230, 41232, 41234, 41236, 41238, 41246, 41254, 41260, 41264, + 41270, 41280, 41286, 41292, 41298, 41306, 41314, 41325, 41329, 41333, + 41335, 41341, 41343, 41345, 41347, 41349, 41355, 41358, 41364, 41370, + 41374, 41378, 41382, 41385, 41389, 41393, 41395, 41404, 41413, 41418, + 41423, 41429, 41435, 41441, 41444, 41447, 41450, 41453, 41455, 41460, + 41465, 41470, 41476, 41482, 41490, 41498, 41504, 41510, 41516, 41522, + 41531, 41540, 41549, 41558, 41567, 41576, 41585, 41594, 41603, 41612, + 41620, 41632, 41642, 41657, 41660, 41665, 41671, 41677, 41684, 41698, + 41713, 41719, 41725, 41732, 41738, 41746, 41752, 41765, 41779, 41784, + 41790, 41797, 41800, 41803, 41805, 41808, 41811, 41813, 41815, 41819, + 41822, 41825, 41828, 41831, 41836, 41841, 41846, 41851, 41856, 41859, + 41861, 41863, 41865, 41869, 41873, 41877, 41883, 41888, 41890, 41892, + 41897, 41902, 41907, 41912, 41917, 41922, 41924, 41926, 41935, 41939, + 41947, 41956, 41958, 41963, 41968, 41976, 41980, 41982, 41986, 41988, + 41992, 41996, 42000, 42002, 42004, 42006, 42011, 42018, 42025, 42032, + 42039, 42046, 42053, 42060, 42067, 42073, 42079, 42086, 42093, 42100, + 42107, 42113, 42119, 42126, 42133, 42140, 42148, 42155, 42163, 42170, + 42178, 42185, 42193, 42201, 42208, 42216, 42223, 42231, 42238, 42246, + 42253, 42260, 42267, 42274, 42281, 42289, 42296, 42303, 42310, 42318, + 42325, 42332, 42339, 42346, 42354, 42362, 42369, 42376, 42382, 42388, + 42393, 42399, 42406, 42415, 42422, 42429, 42436, 42441, 42446, 42451, + 42458, 42465, 42472, 42479, 42484, 42489, 42498, 42503, 42506, 42514, + 42517, 42522, 42527, 42530, 42533, 42541, 42544, 42549, 42552, 42559, + 42564, 42572, 42575, 42578, 42581, 42586, 42591, 42594, 42597, 42605, + 42608, 42613, 42620, 42624, 42628, 42633, 42638, 42644, 42649, 42655, + 42661, 42666, 42672, 42680, 42686, 42694, 42702, 42708, 42716, 42724, + 42733, 42741, 42747, 42755, 42764, 42772, 42776, 42781, 42794, 42807, + 42811, 42815, 42819, 42823, 42833, 42837, 42842, 42847, 42852, 42857, + 42862, 42867, 42877, 42887, 42895, 42905, 42915, 42923, 42933, 42943, + 42951, 42961, 42971, 42979, 42987, 42997, 43007, 43010, 43013, 43016, + 43021, 43025, 43031, 43038, 43045, 43053, 43060, 43064, 43068, 43072, + 43076, 43078, 43082, 43086, 43091, 43096, 43103, 43110, 43113, 43120, + 43122, 43124, 43128, 43132, 43137, 43143, 43149, 43155, 43161, 43170, + 43179, 43188, 43192, 43194, 43198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 43205, 43209, 43216, 43223, 43230, 43237, 43241, 43245, 43249, 43253, + 43258, 43264, 43269, 43275, 43281, 43287, 43293, 43301, 43308, 43315, + 43322, 43329, 43334, 43340, 43349, 43353, 43360, 43364, 43368, 43374, + 43380, 43386, 43392, 43396, 43400, 43403, 43406, 43410, 43417, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43424, + 43427, 43431, 43435, 43441, 43447, 43453, 43461, 43468, 43472, 43480, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43485, 43488, + 43491, 43494, 43497, 43500, 43503, 43506, 43509, 43512, 43516, 43520, + 43524, 43528, 43532, 43536, 43540, 43544, 43548, 43552, 43556, 43559, + 43562, 43565, 43568, 43571, 43574, 43577, 43580, 43583, 43587, 43591, + 43595, 43599, 43603, 43607, 43611, 43615, 43619, 43623, 43627, 43633, + 43639, 43645, 43652, 43659, 43666, 43673, 43680, 43687, 43694, 43701, + 43708, 43715, 43722, 43729, 43736, 43743, 43750, 43757, 43764, 43769, + 43775, 43781, 43787, 43792, 43798, 43804, 43810, 43815, 43821, 43827, + 43832, 43837, 43842, 43847, 43853, 43859, 43864, 43869, 43875, 43880, + 43886, 43892, 43898, 43904, 43910, 43915, 43921, 43927, 43933, 43938, + 43944, 43950, 43956, 43961, 43967, 43973, 43978, 43983, 43988, 43993, + 43999, 44005, 44010, 44015, 44021, 44026, 44032, 44038, 44044, 44050, + 44056, 44061, 44067, 44073, 44079, 44084, 44090, 44096, 44102, 44107, + 44113, 44119, 44124, 44129, 44134, 44139, 44145, 44151, 44156, 44161, + 44167, 44172, 44178, 44184, 44190, 44196, 44202, 44206, 44211, 44216, + 44221, 44226, 44231, 44236, 44241, 44246, 44251, 44256, 44260, 44264, + 44268, 44272, 44276, 44280, 44284, 44288, 44292, 44297, 44302, 44307, + 44312, 44317, 44322, 44331, 44340, 44349, 44358, 44367, 44376, 44385, + 44394, 44401, 44409, 44417, 44424, 44431, 44439, 44447, 44454, 44461, + 44469, 44477, 44484, 44491, 44499, 44507, 44514, 44521, 44529, 44538, + 44547, 44555, 44564, 44573, 44580, 44587, 44595, 44604, 44613, 44621, + 44630, 44639, 44646, 44653, 44662, 44671, 44679, 44687, 44696, 44705, + 44712, 44719, 44728, 44737, 44745, 44753, 44762, 44771, 44778, 44785, + 44794, 44803, 44811, 44820, 44829, 44837, 44847, 44857, 44867, 44877, + 44886, 44895, 44904, 44913, 44920, 44928, 44936, 44944, 44952, 44957, + 44962, 44971, 44979, 44986, 44995, 45003, 45010, 45019, 45027, 45034, + 45043, 45051, 45058, 45067, 45075, 45082, 45091, 45099, 45106, 45115, + 45123, 45130, 45139, 45147, 45154, 45163, 45171, 45178, 45187, 45196, + 45205, 45214, 45228, 45242, 45249, 45254, 45259, 45264, 45269, 45274, + 45279, 45284, 45289, 45297, 45305, 45313, 45321, 45326, 45333, 45340, + 45347, 45352, 45360, 45367, 45375, 45379, 45386, 45392, 45399, 45403, + 45409, 45415, 45421, 45425, 45428, 45432, 45436, 45443, 45449, 45455, + 45461, 45467, 45481, 45491, 45505, 45519, 45525, 45535, 45549, 45552, + 45555, 45562, 45570, 45575, 45580, 45588, 45600, 45612, 45620, 45624, + 45628, 45631, 45634, 45638, 45642, 45645, 45648, 45653, 45658, 45664, + 45670, 45675, 45680, 45686, 45692, 45697, 45702, 45707, 45712, 45718, + 45724, 45729, 45734, 45740, 45746, 45751, 45756, 45759, 45762, 45771, + 45773, 45775, 45778, 45782, 45788, 45790, 45793, 45800, 45807, 45815, + 45823, 45833, 45847, 45852, 45857, 45861, 45866, 45874, 45882, 45891, + 45900, 45909, 45918, 45923, 45928, 45934, 45940, 45946, 45952, 45955, + 45961, 45967, 45977, 45987, 45995, 46003, 46012, 46021, 46025, 46033, + 46041, 46049, 46057, 46066, 46075, 46084, 46093, 46098, 46103, 46108, + 46113, 46118, 46124, 46130, 46135, 46141, 46143, 46145, 46147, 46149, + 46152, 46155, 46157, 46159, 46161, 46165, 46169, 46171, 46173, 46176, + 46179, 46183, 46189, 46195, 46197, 46204, 46208, 46213, 46218, 46220, + 46230, 46236, 46242, 46248, 46254, 46260, 46266, 46271, 46274, 46277, + 46280, 46282, 46284, 46288, 46292, 46297, 46302, 46307, 46310, 46314, + 46319, 46322, 46326, 46331, 46336, 46341, 46346, 46351, 46356, 46361, + 46366, 46371, 46376, 46381, 46386, 46392, 46398, 46404, 46406, 46409, + 46411, 46414, 46416, 46418, 46420, 46422, 46424, 46426, 46428, 46430, + 46432, 46434, 46436, 46438, 46440, 46442, 46444, 46446, 46448, 46453, + 46458, 46463, 46468, 46473, 46478, 46483, 46488, 46493, 46498, 46503, + 46508, 46513, 46518, 46523, 46528, 46533, 46538, 46543, 46548, 46552, + 46556, 46560, 46566, 46572, 46577, 46582, 46587, 46592, 46597, 46602, + 46610, 46618, 46626, 46634, 46642, 46650, 46658, 46666, 46672, 46677, + 46682, 46687, 46690, 46694, 46698, 46702, 46706, 46710, 46714, 46721, + 46728, 46736, 46744, 46749, 46754, 46761, 46768, 46775, 46782, 46785, + 46788, 46793, 46795, 46799, 46804, 46806, 46808, 46810, 46812, 46817, + 46820, 46822, 46827, 46834, 46841, 46844, 46848, 46853, 46858, 46866, + 46872, 46878, 46890, 46897, 46904, 46909, 46914, 46920, 46923, 46926, + 46931, 46933, 46937, 46939, 46941, 46943, 46945, 46947, 46949, 46954, + 46956, 46958, 46960, 46962, 46966, 46968, 46971, 46976, 46981, 46986, + 46991, 46997, 47003, 47005, 47008, 47015, 47022, 47029, 47036, 47040, + 47044, 47046, 47048, 47052, 47058, 47063, 47065, 47069, 47078, 47086, + 47094, 47100, 47106, 47111, 47117, 47122, 47125, 47139, 47142, 47147, + 47152, 47158, 47168, 47170, 47176, 47182, 47186, 47193, 47197, 47199, + 47201, 47205, 47211, 47216, 47222, 47224, 47230, 47232, 47238, 47240, + 47242, 47247, 47249, 47253, 47258, 47260, 47265, 47270, 47274, 47281, 0, + 47291, 47297, 47300, 47306, 47309, 47314, 47319, 47323, 47325, 47327, + 47331, 47335, 47339, 47343, 47348, 47350, 47355, 47358, 47361, 47364, + 47368, 47372, 47377, 47381, 47386, 47391, 47395, 47400, 47406, 47409, + 47415, 47420, 47424, 47429, 47435, 47441, 47448, 47454, 47461, 47468, + 47470, 47477, 47481, 47487, 47493, 47498, 47504, 47508, 47513, 47516, + 47521, 47527, 47534, 47542, 47549, 47558, 47568, 47575, 47581, 47585, + 47592, 47597, 47606, 47609, 47612, 47621, 47631, 47638, 47640, 47646, + 47651, 47653, 47656, 47660, 47668, 47677, 47680, 47685, 47690, 47698, + 47706, 47714, 47722, 47728, 47734, 47740, 47748, 47753, 47756, 47760, + 47763, 47775, 47785, 47796, 47805, 47816, 47826, 47835, 47841, 47849, + 47853, 47861, 47865, 47873, 47880, 47887, 47896, 47905, 47915, 47925, + 47935, 47945, 47954, 47963, 47973, 47983, 47992, 48001, 48007, 48013, + 48019, 48025, 48031, 48037, 48043, 48049, 48055, 48062, 48068, 48074, + 48080, 48086, 48092, 48098, 48104, 48110, 48116, 48123, 48130, 48137, + 48144, 48151, 48158, 48165, 48172, 48179, 48186, 48194, 48199, 48202, + 48206, 48210, 48216, 48219, 48225, 48231, 48236, 48240, 48245, 48251, + 48258, 48261, 48268, 48275, 48279, 48288, 48297, 48302, 48308, 48313, + 48318, 48325, 48332, 48340, 48348, 48357, 48361, 48370, 48375, 48379, + 48386, 48390, 48397, 48405, 48410, 48418, 48422, 48427, 48431, 48436, + 48440, 48445, 48450, 48459, 48461, 48464, 48467, 48474, 48481, 48486, + 48494, 48500, 0, 48506, 0, 48509, 48514, 48519, 48527, 48531, 48538, + 48546, 48554, 48559, 48564, 48570, 48575, 48580, 48586, 48591, 48594, + 48598, 48602, 48609, 48618, 48623, 48632, 48641, 48647, 48653, 48658, + 48663, 48668, 48673, 48679, 48685, 48693, 48701, 48707, 48713, 48718, + 48723, 48730, 48737, 48743, 48746, 48749, 48753, 48757, 48761, 48766, + 48772, 48778, 48785, 48792, 48797, 48801, 48805, 48809, 48813, 48817, + 48821, 48825, 48829, 48833, 48837, 48841, 48845, 48849, 48853, 48857, + 48861, 48865, 48869, 48873, 48877, 48881, 48885, 48889, 48893, 48897, + 48901, 48905, 48909, 48913, 48917, 48921, 48925, 48929, 48933, 48937, + 48941, 48945, 48949, 48953, 48957, 48961, 48965, 48969, 48973, 48977, + 48981, 48985, 48989, 48993, 48997, 49001, 49005, 49009, 49013, 49017, + 49021, 49025, 49029, 49033, 49037, 49041, 49045, 49049, 49053, 49057, + 49061, 49065, 49069, 49073, 49077, 49081, 49085, 49089, 49093, 49097, + 49101, 49105, 49109, 49113, 49117, 49121, 49125, 49129, 49133, 49137, + 49141, 49145, 49149, 49153, 49157, 49161, 49165, 49169, 49173, 49177, + 49181, 49185, 49189, 49193, 49197, 49201, 49205, 49209, 49213, 49217, + 49221, 49225, 49229, 49233, 49237, 49241, 49245, 49249, 49253, 49257, + 49261, 49265, 49269, 49273, 49277, 49281, 49285, 49289, 49293, 49297, + 49301, 49305, 49309, 49313, 49317, 49321, 49325, 49329, 49333, 49337, + 49341, 49345, 49349, 49353, 49357, 49361, 49365, 49369, 49373, 49377, + 49381, 49385, 49389, 49393, 49397, 49401, 49405, 49409, 49413, 49417, + 49421, 49425, 49429, 49433, 49437, 49441, 49445, 49449, 49453, 49457, + 49461, 49465, 49469, 49473, 49477, 49481, 49485, 49489, 49493, 49497, + 49501, 49505, 49509, 49513, 49517, 49521, 49525, 49529, 49533, 49537, + 49541, 49545, 49549, 49553, 49557, 49561, 49565, 49569, 49573, 49577, + 49581, 49585, 49589, 49593, 49597, 49601, 49605, 49609, 49613, 49617, + 49621, 49625, 49629, 49633, 49637, 49641, 49645, 49649, 49653, 49657, + 49661, 49665, 49669, 49673, 49677, 49681, 49685, 49689, 49693, 49697, + 49701, 49705, 49709, 49713, 49717, 49721, 49725, 49729, 49733, 49737, + 49741, 49745, 49749, 49753, 49757, 49761, 49765, 49769, 49773, 49777, + 49781, 49785, 49789, 49793, 49797, 49801, 49805, 49809, 49813, 49817, + 49821, 49828, 49836, 49842, 49848, 49855, 49862, 49868, 49874, 49880, + 49886, 49891, 49896, 49901, 49906, 49912, 49918, 49926, 49933, 49939, + 49945, 49953, 49962, 49969, 49979, 49990, 49993, 49996, 50000, 50004, + 50011, 50018, 50029, 50040, 50050, 50060, 50067, 50074, 50081, 50088, + 50099, 50110, 50121, 50132, 50142, 50152, 50164, 50176, 50187, 50198, + 50210, 50222, 50231, 50241, 50251, 50262, 50273, 50280, 50287, 50294, + 50301, 50311, 50321, 50329, 50337, 50344, 50351, 50358, 50365, 50372, + 50377, 50382, 50388, 50396, 50406, 50416, 50426, 50436, 50446, 50456, + 50466, 50476, 50486, 50496, 50506, 50517, 50528, 50538, 50548, 50559, + 50570, 50580, 50590, 50601, 50612, 50622, 50632, 50643, 50654, 50670, + 50689, 50705, 50724, 50740, 50756, 50772, 50788, 50799, 50811, 50822, + 50834, 50853, 50872, 50880, 50886, 50893, 50900, 50907, 50914, 50919, + 50925, 50930, 50935, 50941, 50946, 50951, 50956, 50961, 50966, 50973, + 50978, 50985, 50990, 50995, 50999, 51003, 51010, 51017, 51024, 51031, + 51038, 51045, 51058, 51071, 51084, 51097, 51105, 51113, 51119, 51125, + 51132, 51139, 51146, 51153, 51157, 51162, 51170, 51178, 51186, 51193, + 51197, 51205, 51213, 51217, 51221, 51226, 51233, 51241, 51249, 51268, + 51287, 51306, 51325, 51344, 51363, 51382, 51401, 51407, 51414, 51423, + 51431, 51439, 51444, 51447, 51450, 51455, 51458, 51477, 51484, 51490, + 51496, 51500, 51503, 51506, 51509, 51521, 51534, 51541, 51548, 51551, + 51555, 51558, 51563, 51568, 51573, 51579, 51588, 51595, 51602, 51610, + 51617, 51624, 51627, 51633, 51639, 51642, 51645, 51650, 51655, 51661, + 51667, 51671, 51676, 51683, 51687, 51693, 51697, 51701, 51709, 51721, + 51730, 51734, 51736, 51745, 51754, 51760, 51763, 51769, 51775, 51780, + 51785, 51790, 51795, 51800, 51805, 51807, 51813, 51818, 51825, 51829, + 51835, 51838, 51842, 51849, 51856, 51858, 51860, 51866, 51872, 51878, + 51887, 51896, 51903, 51910, 51916, 51922, 51927, 51932, 51937, 51943, + 51949, 51954, 51961, 51965, 51969, 51982, 51995, 52007, 52016, 52022, + 52029, 52034, 52039, 52044, 52049, 52054, 52056, 52063, 52070, 52077, + 52084, 52091, 52099, 52105, 52110, 52116, 52122, 52128, 52135, 52141, + 52149, 52157, 52165, 52173, 52180, 52186, 52192, 52201, 52205, 52214, + 52223, 52232, 52240, 52244, 52250, 52257, 52264, 52268, 52274, 52281, + 52286, 52291, 52297, 52302, 52307, 52314, 52321, 52326, 52331, 52339, + 52347, 52357, 52367, 52374, 52381, 52385, 52389, 52401, 52407, 52413, + 52418, 52423, 52430, 52437, 52443, 52449, 52458, 52466, 52474, 52481, + 52488, 52495, 52501, 52508, 52514, 52521, 52528, 52535, 52542, 52548, + 52553, 52562, 52572, 52579, 52588, 52594, 52599, 52604, 52614, 52620, + 52626, 52632, 52640, 52645, 52652, 52659, 52670, 52677, 52684, 52691, + 52698, 52705, 52712, 52719, 52731, 52743, 52754, 52765, 52778, 52791, + 52796, 52801, 52810, 52819, 52826, 52833, 52842, 52851, 52859, 52867, + 52875, 52883, 52893, 52903, 52917, 52931, 52939, 52947, 52959, 52971, + 52979, 52987, 52997, 53007, 53012, 53017, 53026, 53035, 53040, 53045, + 53053, 53059, 53065, 53073, 53081, 53094, 53107, 53111, 53115, 53122, + 53129, 53136, 53144, 53152, 53161, 53170, 53176, 53182, 53189, 53196, + 53203, 53210, 53219, 53228, 53231, 53234, 53239, 53244, 53250, 53256, + 53263, 53270, 53280, 53290, 53297, 53304, 53312, 53320, 53328, 53336, + 53344, 53352, 53358, 53364, 53368, 53372, 53379, 53386, 53391, 53396, + 53401, 53406, 53412, 53426, 53433, 53440, 53444, 53446, 53448, 53453, + 53458, 53463, 53467, 53475, 53482, 53489, 53497, 53509, 53517, 53525, + 53536, 53540, 53544, 53550, 53558, 53571, 53578, 53585, 53592, 53597, + 53604, 53613, 53621, 53627, 53633, 53639, 53648, 53657, 53665, 53674, + 53679, 53682, 53687, 53693, 53699, 53705, 53711, 53715, 53718, 53722, + 53726, 53732, 53738, 53744, 53750, 53754, 53758, 53765, 53772, 53779, + 53786, 53793, 53800, 53810, 53820, 53827, 53834, 53842, 53850, 53854, + 53859, 53864, 53870, 53876, 53879, 53882, 53885, 53888, 53892, 53897, + 53902, 53907, 53912, 53917, 53921, 53925, 53929, 53933, 53937, 53941, + 53945, 53951, 53955, 53961, 53966, 53973, 53981, 53988, 53996, 54003, + 54011, 54020, 54027, 54037, 54048, 54054, 54063, 54069, 54078, 54087, + 54093, 54099, 54103, 54107, 54116, 54125, 54132, 54139, 54148, 0, 0, 0, + 54157, 54162, 54166, 54170, 54175, 54180, 54185, 54193, 54201, 54204, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54208, 54213, 54218, 54223, 54228, + 54233, 54238, 54243, 54248, 54253, 54258, 54264, 54268, 54273, 54278, + 54283, 54288, 54293, 54298, 54303, 54308, 54313, 54318, 54323, 54328, + 54333, 54338, 54343, 54348, 54353, 54358, 54363, 54368, 54373, 54378, + 54384, 54389, 54395, 54404, 54409, 54417, 54424, 54433, 54438, 54443, + 54448, 54454, 0, 54461, 54466, 54471, 54476, 54481, 54486, 54491, 54496, + 54501, 54506, 54511, 54517, 54521, 54526, 54531, 54536, 54541, 54546, + 54551, 54556, 54561, 54566, 54571, 54576, 54581, 54586, 54591, 54596, + 54601, 54606, 54611, 54616, 54621, 54626, 54631, 54637, 54642, 54648, + 54657, 54662, 54670, 54677, 54686, 54691, 54696, 54701, 54707, 0, 54714, + 54722, 54730, 54739, 54746, 54754, 54760, 54769, 54777, 54785, 54793, + 54801, 54809, 54817, 54822, 54829, 54835, 54842, 54850, 54857, 54864, + 54872, 54878, 54884, 54891, 54898, 54908, 54918, 54925, 54932, 54937, + 54947, 54957, 54962, 54967, 54972, 54977, 54982, 54987, 54992, 54997, + 55002, 55007, 55012, 55017, 55022, 55027, 55032, 55037, 55042, 55047, + 55052, 55057, 55062, 55067, 55072, 55077, 55082, 55087, 55092, 55097, + 55102, 55107, 55111, 55115, 55120, 55125, 55130, 55135, 55140, 55145, + 55150, 55155, 55160, 55165, 55170, 55175, 55180, 55185, 55190, 55195, + 55200, 55205, 55212, 55219, 55226, 55233, 55240, 55247, 55254, 55261, + 55268, 55275, 55282, 55289, 55296, 55303, 55308, 55313, 55320, 55327, + 55334, 55341, 55348, 55355, 55362, 55369, 55376, 55383, 55390, 55397, + 55403, 55409, 55415, 55421, 55428, 55435, 55442, 55449, 55456, 55463, + 55470, 55477, 55484, 55491, 55499, 55507, 55515, 55523, 55531, 55539, + 55547, 55555, 55559, 55565, 55571, 55575, 55581, 55587, 55593, 55600, + 55607, 55614, 55621, 55626, 55632, 0, 0, 0, 0, 0, 0, 0, 55638, 55646, + 55655, 55664, 55672, 55678, 55683, 55688, 55693, 55698, 55703, 55708, + 55713, 55718, 55723, 55728, 55733, 55738, 55743, 55748, 55753, 55758, + 55763, 55768, 55773, 55778, 55783, 55788, 55793, 55798, 55803, 55808, + 55813, 55818, 55823, 55828, 55833, 55838, 55843, 55848, 55853, 55858, + 55863, 55868, 55873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55878, 55882, 55887, + 55892, 55897, 55902, 55911, 55916, 55921, 55926, 55931, 55936, 55941, + 55946, 55951, 55958, 55963, 55968, 55977, 55984, 55989, 55994, 55999, + 56006, 56011, 56018, 56023, 56028, 56035, 56042, 56047, 56052, 56057, + 56064, 56071, 56076, 56081, 56086, 56091, 56096, 56103, 56110, 56115, + 56120, 56125, 56130, 56135, 56140, 56145, 56150, 56155, 56160, 56165, + 56172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56177, 56184, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56189, 56194, 56198, 56202, 56206, 56210, 56214, 56218, + 56222, 56226, 56230, 56234, 56240, 56244, 56248, 56252, 56256, 56260, + 56264, 56268, 56272, 56276, 56280, 56284, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 56288, 56292, 56296, 56300, 56304, 56308, 56312, 0, 56316, 56320, 56324, + 56328, 56332, 56336, 56340, 0, 56344, 56348, 56352, 56356, 56360, 56364, + 56368, 0, 56372, 56376, 56380, 56384, 56388, 56392, 56396, 0, 56400, + 56404, 56408, 56412, 56416, 56420, 56424, 0, 56428, 56432, 56436, 56440, + 56444, 56448, 56452, 0, 56456, 56460, 56464, 56468, 56472, 56476, 56480, + 0, 56484, 56488, 56492, 56496, 56500, 56504, 56508, 0, 56512, 56517, + 56522, 56527, 56532, 56537, 56542, 56546, 56551, 56556, 56561, 56565, + 56570, 56575, 56580, 56585, 56589, 56594, 56599, 56604, 56609, 56614, + 56619, 56623, 56628, 56633, 56640, 56645, 56650, 56656, 56663, 56670, + 56679, 56686, 56695, 56699, 56703, 56709, 56715, 56721, 56729, 56735, + 56739, 56743, 56747, 56753, 56759, 56763, 56765, 56769, 56775, 56777, + 56781, 56785, 56789, 56795, 56800, 56804, 56808, 56813, 56819, 56824, + 56829, 56834, 56839, 56846, 56853, 56858, 56863, 56868, 56873, 56878, + 56883, 56887, 56891, 56898, 56905, 56911, 56915, 56920, 56922, 56926, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 56934, 56938, 56942, 56947, 56952, 56957, 56961, 56965, + 56969, 56974, 56979, 56983, 56987, 56991, 56995, 57000, 57005, 57010, + 57015, 57019, 57023, 57028, 57033, 57038, 57043, 57047, 0, 57051, 57055, + 57059, 57063, 57067, 57071, 57075, 57080, 57085, 57089, 57094, 57099, + 57108, 57112, 57116, 57120, 57127, 57131, 57136, 57141, 57145, 57149, + 57155, 57160, 57165, 57170, 57175, 57179, 57183, 57187, 57191, 57195, + 57200, 57205, 57209, 57213, 57218, 57223, 57228, 57232, 57236, 57241, + 57246, 57252, 57258, 57262, 57268, 57274, 57278, 57284, 57290, 57295, + 57300, 57304, 57310, 57314, 57318, 57324, 57330, 57335, 57340, 57344, + 57348, 57356, 57362, 57368, 57374, 57379, 57384, 57389, 57395, 57399, + 57405, 57409, 57413, 57419, 57425, 57431, 57437, 57443, 57449, 57455, + 57461, 57467, 57473, 57479, 57485, 57489, 57495, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 57501, 57504, 57508, 57512, 57516, 57520, 57523, 57526, + 57530, 57534, 57538, 57542, 57545, 57550, 57554, 57558, 57562, 57567, + 57571, 57575, 57579, 57583, 57589, 57595, 57599, 57603, 57607, 57611, + 57615, 57619, 57623, 57627, 57631, 57635, 57639, 57645, 57649, 57653, + 57657, 57661, 57665, 57669, 57673, 57677, 57681, 57685, 57689, 57693, + 57697, 57701, 57705, 57709, 57715, 57721, 57726, 57731, 57735, 57739, + 57743, 57747, 57751, 57755, 57759, 57763, 57767, 57771, 57775, 57779, + 57783, 57787, 57791, 57795, 57799, 57803, 57807, 57811, 57815, 57819, + 57823, 57827, 57833, 57837, 57841, 57845, 57849, 57853, 57857, 57861, + 57865, 57870, 57877, 57881, 57885, 57889, 57893, 57897, 57901, 57905, + 57909, 57913, 57917, 57921, 57925, 57932, 57936, 57942, 57946, 57950, + 57954, 57958, 57962, 57965, 57969, 57973, 57977, 57981, 57985, 57989, + 57993, 57997, 58001, 58005, 58009, 58013, 58017, 58021, 58025, 58029, + 58033, 58037, 58041, 58045, 58049, 58053, 58057, 58061, 58065, 58069, + 58073, 58077, 58081, 58085, 58089, 58093, 58099, 58103, 58107, 58111, + 58115, 58119, 58123, 58127, 58131, 58135, 58139, 58143, 58147, 58151, + 58155, 58159, 58163, 58167, 58171, 58175, 58179, 58183, 58187, 58191, + 58195, 58199, 58203, 58207, 58215, 58219, 58223, 58227, 58231, 58235, + 58241, 58245, 58249, 58253, 58257, 58261, 58265, 58269, 58273, 58277, + 58281, 58285, 58289, 58293, 58299, 58303, 58307, 58311, 58315, 58319, + 58323, 58327, 58331, 58335, 58339, 58343, 58347, 58351, 58355, 58359, + 58363, 58367, 58371, 58375, 58379, 58383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58387, 58396, 58404, + 58416, 58427, 58435, 58444, 58453, 58463, 58475, 58487, 58499, 0, 0, 0, + 0, 58505, 58508, 58511, 58516, 58519, 58526, 58530, 58534, 58538, 58542, + 58546, 58551, 58556, 58560, 58564, 58569, 58574, 58579, 58584, 58587, + 58590, 58596, 58602, 58607, 58612, 58619, 58626, 58630, 58634, 58638, + 58646, 58652, 58659, 58664, 58669, 58674, 58679, 58684, 58689, 58694, + 58699, 58704, 58709, 58714, 58719, 58724, 58729, 58735, 58740, 58744, + 58750, 58761, 58771, 58786, 58796, 58800, 58809, 58815, 58821, 58827, + 58832, 58835, 58840, 58844, 0, 58850, 58854, 58857, 58861, 58864, 58868, + 58871, 58875, 58878, 58882, 58885, 58888, 58892, 58896, 58900, 58904, + 58908, 58912, 58916, 58920, 58924, 58928, 58932, 58936, 58940, 58944, + 58948, 58952, 58956, 58960, 58964, 58968, 58972, 58976, 58980, 58985, + 58989, 58993, 58997, 59001, 59004, 59008, 59011, 59015, 59019, 59023, + 59027, 59030, 59034, 59037, 59041, 59045, 59049, 59053, 59057, 59061, + 59065, 59069, 59073, 59077, 59081, 59085, 59088, 59092, 59096, 59100, + 59104, 59108, 59111, 59116, 59120, 59125, 59129, 59132, 59136, 59140, + 59144, 59148, 59153, 59157, 59161, 59165, 59169, 59172, 59176, 59180, 0, + 0, 59185, 59193, 59201, 59208, 59215, 59219, 59225, 59230, 59235, 59239, + 59242, 59246, 59249, 59253, 59256, 59260, 59263, 59267, 59270, 59273, + 59277, 59281, 59285, 59289, 59293, 59297, 59301, 59305, 59309, 59313, + 59317, 59321, 59325, 59329, 59333, 59337, 59341, 59345, 59349, 59353, + 59357, 59361, 59365, 59370, 59374, 59378, 59382, 59386, 59389, 59393, + 59396, 59400, 59404, 59408, 59412, 59415, 59419, 59422, 59426, 59430, + 59434, 59438, 59442, 59446, 59450, 59454, 59458, 59462, 59466, 59470, + 59473, 59477, 59481, 59485, 59489, 59493, 59496, 59501, 59505, 59510, + 59514, 59517, 59521, 59525, 59529, 59533, 59538, 59542, 59546, 59550, + 59554, 59557, 59561, 59565, 59570, 59574, 59578, 59582, 59586, 59591, + 59598, 59602, 59608, 0, 0, 0, 0, 0, 59613, 59617, 59621, 59624, 59628, + 59632, 59636, 59639, 59642, 59646, 59650, 59654, 59658, 59662, 59666, + 59670, 59674, 59678, 59681, 59685, 59689, 59692, 59695, 59698, 59701, + 59705, 59709, 59713, 59717, 59721, 59725, 59729, 59733, 59737, 59741, + 59744, 59747, 59751, 59755, 59759, 59763, 0, 0, 0, 59767, 59771, 59775, + 59779, 59783, 59787, 59791, 59795, 59799, 59803, 59807, 59811, 59815, + 59819, 59823, 59827, 59831, 59835, 59839, 59843, 59847, 59851, 59855, + 59859, 59863, 59867, 59871, 59875, 59879, 59883, 59887, 59890, 59894, + 59897, 59901, 59905, 59908, 59912, 59916, 59919, 59923, 59927, 59931, + 59935, 59938, 59942, 59946, 59950, 59954, 59958, 59962, 59965, 59968, + 59972, 59976, 59980, 59984, 59988, 59992, 59996, 60000, 60004, 60008, + 60012, 60016, 60020, 60024, 60028, 60032, 60036, 60040, 60044, 60048, + 60052, 60056, 60060, 60064, 60068, 60072, 60076, 60080, 60084, 60088, + 60092, 60096, 60100, 60104, 60108, 60112, 60116, 60120, 60124, 60128, + 60132, 0, 60136, 60142, 60148, 60153, 60158, 60163, 60169, 60175, 60181, + 60187, 60193, 60199, 60205, 60211, 60217, 60223, 60229, 60233, 60237, + 60241, 60245, 60249, 60253, 60257, 60261, 60265, 60269, 60273, 60277, + 60281, 60285, 60289, 60293, 60297, 60301, 60305, 60309, 60314, 60319, + 60324, 60329, 60333, 60337, 0, 0, 0, 0, 0, 60341, 60346, 60351, 60356, + 60361, 60366, 60371, 60376, 60381, 60386, 60391, 60396, 60401, 60406, + 60411, 60416, 60420, 60425, 60429, 60434, 60439, 60444, 60449, 60454, + 60459, 60464, 60469, 60474, 60479, 60484, 60489, 60494, 60499, 60504, + 60509, 60514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60519, 60524, 60529, + 60534, 60538, 60543, 60547, 60552, 60557, 60562, 60567, 60572, 60576, + 60581, 60586, 60591, 60596, 60600, 60604, 60608, 60612, 60616, 60620, + 60624, 60628, 60632, 60636, 60640, 60644, 60648, 60652, 60657, 60662, + 60667, 60672, 60677, 60682, 60687, 60692, 60697, 60702, 60707, 60712, + 60717, 60722, 60727, 60733, 0, 60740, 60743, 60746, 60749, 60752, 60755, + 60758, 60761, 60764, 60767, 60771, 60775, 60779, 60783, 60787, 60791, + 60795, 60799, 60803, 60807, 60811, 60815, 60819, 60823, 60827, 60831, + 60835, 60839, 60843, 60847, 60851, 60855, 60859, 60863, 60867, 60871, + 60875, 60879, 60883, 60887, 60891, 60900, 60909, 60918, 60927, 60936, + 60945, 60954, 60963, 60966, 60971, 60976, 60981, 60986, 60991, 60996, + 61001, 61006, 61011, 61015, 61020, 61025, 61030, 61035, 61040, 61044, + 61048, 61052, 61056, 61060, 61064, 61068, 61072, 61076, 61080, 61084, + 61088, 61092, 61096, 61101, 61106, 61111, 61116, 61121, 61126, 61131, + 61136, 61141, 61146, 61151, 61156, 61161, 61166, 61172, 61178, 61183, + 61188, 61191, 61194, 61197, 61200, 61203, 61206, 61209, 61212, 61215, + 61219, 61223, 61227, 61231, 61235, 61239, 61243, 61247, 61251, 61255, + 61259, 61263, 61267, 61271, 61275, 61279, 61283, 61287, 61291, 61295, + 61299, 61303, 61307, 61311, 61315, 61319, 61323, 61327, 61331, 61335, + 61339, 61343, 61347, 61351, 61355, 61359, 61363, 61367, 61371, 61375, + 61380, 61385, 61390, 61395, 61399, 61404, 61409, 61414, 61419, 61424, + 61429, 61434, 61439, 61444, 61448, 61454, 61460, 61466, 61472, 61478, + 61484, 61490, 61496, 61502, 61508, 61514, 61520, 61523, 61526, 61529, + 61534, 61537, 61540, 61543, 61546, 61549, 61552, 61556, 61560, 61564, + 61568, 61572, 61576, 61580, 61584, 61588, 61592, 61596, 61600, 61604, + 61607, 61610, 61614, 61618, 61622, 61626, 61629, 61633, 61637, 61641, + 61645, 61648, 61652, 61656, 61660, 61664, 61667, 61671, 61675, 61678, + 61682, 61686, 61690, 61694, 61698, 61702, 61706, 0, 61710, 61713, 61716, + 61719, 61722, 61725, 61728, 61731, 61734, 61737, 61740, 61743, 61746, + 61749, 61752, 61755, 61758, 61761, 61764, 61767, 61770, 61773, 61776, + 61779, 61782, 61785, 61788, 61791, 61794, 61797, 61800, 61803, 61806, + 61809, 61812, 61815, 61818, 61821, 61824, 61827, 61830, 61833, 61836, + 61839, 61842, 61845, 61848, 61851, 61854, 61857, 61860, 61863, 61866, + 61869, 61872, 61875, 61878, 61881, 61884, 61887, 61890, 61893, 61896, + 61899, 61902, 61905, 61908, 61911, 61914, 61917, 61920, 61923, 61926, + 61929, 61932, 61935, 61938, 61941, 61944, 61947, 61950, 61953, 61956, + 61959, 61962, 61965, 61968, 61971, 61974, 61982, 61989, 61996, 62003, + 62010, 62017, 62024, 62031, 62038, 62045, 62053, 62061, 62069, 62077, + 62085, 62093, 62101, 62109, 62117, 62125, 62133, 62141, 62149, 62157, + 62165, 62168, 62171, 62174, 62176, 62179, 62182, 62185, 62190, 62195, + 62198, 62205, 62212, 62219, 62226, 62229, 62234, 62236, 62240, 62242, + 62244, 62247, 62250, 62253, 62256, 62259, 62262, 62265, 62270, 62275, + 62278, 62281, 62284, 62287, 62290, 62293, 62296, 62300, 62303, 62306, + 62309, 62312, 62315, 62319, 62322, 62325, 62328, 62333, 62338, 62343, + 62348, 62353, 62358, 62363, 62368, 62373, 62381, 62383, 62386, 62389, + 62392, 62395, 62400, 62408, 62411, 62414, 62418, 62421, 62424, 62427, + 62432, 62435, 62438, 62443, 62446, 62449, 62454, 62457, 62460, 62465, + 62470, 62475, 62478, 62481, 62484, 62487, 62493, 62496, 62499, 62502, + 62504, 62507, 62510, 62513, 62518, 62521, 62524, 62527, 62530, 62533, + 62538, 62541, 62544, 62547, 62550, 62553, 62556, 62559, 62562, 62565, + 62570, 62574, 62581, 62588, 62595, 62602, 62609, 62616, 62623, 62630, + 62637, 62645, 62653, 62661, 62669, 62677, 62685, 62693, 62701, 62709, + 62717, 62725, 62733, 62741, 62749, 62757, 62765, 62773, 62781, 62789, + 62797, 62805, 62813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62872, 62881, 62890, 62901, 62908, 62913, 62918, 62925, 62932, 62938, - 62943, 62948, 62953, 62958, 62965, 62970, 62975, 62980, 62991, 62996, - 63001, 63008, 63013, 63020, 63025, 63030, 63037, 63044, 63051, 63060, - 63069, 63074, 63079, 63084, 63091, 63096, 63106, 63113, 63118, 63123, - 63128, 63133, 63138, 63143, 63152, 63159, 63166, 63171, 63178, 63183, - 63190, 63199, 63210, 63215, 63224, 63229, 63236, 63245, 63254, 63259, - 63264, 63271, 63277, 63284, 63291, 63295, 63299, 63302, 63306, 63310, - 63314, 63318, 63322, 63326, 63330, 63333, 63337, 63341, 63345, 63349, - 63353, 63357, 63360, 63364, 63368, 63371, 63375, 63379, 63383, 63387, - 63391, 63395, 63399, 63403, 63407, 63411, 63415, 63419, 63423, 63427, - 63431, 63435, 63439, 63443, 63447, 63451, 63455, 63459, 63463, 63467, - 63471, 63475, 63479, 63483, 63487, 63491, 63495, 63499, 63503, 63507, - 63511, 63515, 63519, 63523, 63527, 63531, 63535, 63539, 63543, 63547, - 63550, 63554, 63558, 63562, 63566, 63570, 63574, 63578, 63582, 63586, - 63590, 63594, 63598, 63602, 63606, 63610, 63614, 63618, 63622, 63626, - 63630, 63634, 63638, 63642, 63646, 63650, 63654, 63658, 63662, 63666, - 63670, 63674, 63678, 63682, 63686, 63690, 63694, 63698, 63702, 63706, - 63710, 63714, 63718, 63722, 63726, 63730, 63734, 63738, 63742, 63746, - 63750, 63754, 63758, 63762, 63766, 63770, 63774, 63778, 63782, 63786, - 63790, 63794, 63798, 63802, 63806, 63810, 63814, 63818, 63822, 63826, - 63830, 63834, 63838, 63842, 63846, 63850, 63854, 63858, 63862, 63866, - 63870, 63874, 63878, 63882, 63886, 63890, 63894, 63898, 63902, 63906, - 63910, 63914, 63918, 63922, 63926, 63930, 63934, 63938, 63942, 63946, - 63950, 63954, 63958, 63962, 63966, 63970, 63974, 63978, 63982, 63986, - 63990, 63994, 63998, 64002, 64006, 64010, 64014, 64018, 64021, 64025, - 64029, 64033, 64037, 64041, 64045, 64049, 64053, 64057, 64061, 64065, - 64069, 64073, 64077, 64081, 64085, 64089, 64093, 64097, 64101, 64105, - 64109, 64113, 64117, 64121, 64125, 64129, 64133, 64137, 64141, 64145, - 64149, 64153, 64157, 64161, 64165, 64169, 64173, 64177, 64181, 64185, - 64189, 64193, 64197, 64201, 64205, 64209, 64213, 64217, 64221, 64225, - 64229, 64233, 64237, 64241, 64245, 64249, 64253, 64257, 64261, 64265, - 64269, 64273, 64277, 64281, 64285, 64289, 64293, 64297, 64301, 64305, - 64309, 64313, 64317, 64321, 64325, 64329, 64333, 64337, 64341, 64345, - 64349, 64353, 64357, 64361, 64365, 64369, 64373, 64377, 64381, 64385, - 64389, 64393, 64397, 64401, 64405, 64409, 64413, 64417, 64421, 64425, - 64429, 64433, 64437, 64441, 64445, 64449, 64453, 64457, 64461, 64465, - 64469, 64473, 64477, 64481, 64484, 64488, 64492, 64496, 64500, 64504, - 64508, 64512, 64516, 64520, 64524, 64528, 64532, 64536, 64540, 64544, - 64548, 64552, 64556, 64560, 64564, 64568, 64572, 64576, 64580, 64584, - 64588, 64592, 64596, 64600, 64604, 64608, 64612, 64616, 64620, 64624, - 64628, 64632, 64636, 64640, 64644, 64648, 64652, 64656, 64660, 64664, - 64668, 64672, 64676, 64680, 64684, 64688, 64692, 64696, 64700, 64704, - 64708, 64712, 64716, 64720, 64724, 64728, 64732, 64736, 64740, 64744, - 64748, 64752, 64756, 64760, 64764, 64768, 64772, 64776, 64780, 64784, - 64788, 64792, 64796, 64800, 64804, 64808, 64812, 64816, 64820, 64824, - 64828, 64832, 64836, 64840, 64843, 64847, 64851, 64855, 64859, 64863, - 64867, 64871, 64875, 64879, 64883, 64887, 64891, 64895, 64899, 64903, - 64907, 64911, 64915, 64919, 64923, 64927, 64931, 64935, 64939, 64943, - 64947, 64951, 64955, 64959, 64963, 64967, 64971, 64975, 64979, 64983, - 64987, 64991, 64995, 64999, 65003, 65007, 65011, 65015, 65019, 65023, - 65027, 65031, 65035, 65039, 65043, 65047, 65051, 65055, 65059, 65063, - 65067, 65071, 65075, 65079, 65083, 65087, 65091, 65095, 65099, 65103, - 65107, 65111, 65115, 65119, 65123, 65127, 65131, 65135, 65139, 65143, - 65147, 65151, 65155, 65159, 65163, 65167, 65171, 65175, 65179, 65183, - 65187, 65191, 65195, 65199, 65203, 65207, 65211, 65215, 65219, 65223, - 65227, 65231, 65235, 65239, 65243, 65247, 65251, 65255, 65259, 65263, - 65267, 65271, 65275, 65279, 65283, 65287, 65291, 65295, 65299, 65303, - 65307, 65311, 65315, 65319, 65323, 65327, 65331, 65335, 65338, 65342, - 65346, 65350, 65354, 65358, 65362, 65366, 65370, 65374, 65378, 65382, - 65386, 65390, 65394, 65398, 65402, 65406, 65410, 65414, 65418, 65422, - 65426, 65430, 65434, 65438, 65442, 65446, 65450, 65454, 65458, 65462, - 65466, 65470, 65474, 65478, 65482, 65486, 65490, 65494, 65498, 65502, - 65506, 65510, 65514, 65518, 65522, 65526, 65530, 65534, 65538, 65542, - 65546, 65550, 65554, 65558, 65562, 65566, 65570, 65574, 65578, 65582, - 65586, 65590, 65594, 65598, 65602, 65606, 65610, 65614, 65618, 65622, - 65626, 65630, 65634, 65638, 65642, 65646, 65650, 65654, 65658, 65662, - 65666, 65670, 65674, 65678, 65682, 65686, 65690, 65694, 65698, 65702, - 65706, 65710, 65714, 65718, 65722, 65726, 65730, 65734, 65738, 65742, - 65746, 65750, 65754, 65758, 65762, 65766, 65770, 65774, 65778, 65782, - 65786, 65790, 65793, 65797, 65801, 65805, 65809, 65813, 65817, 65821, - 65825, 65829, 65833, 65837, 65841, 65845, 65849, 65853, 65857, 65861, - 65865, 65869, 65873, 65877, 65881, 65885, 65889, 65893, 65897, 65901, - 65905, 65909, 65913, 65917, 65921, 65925, 65929, 65933, 65937, 65941, - 65945, 65949, 65953, 65957, 65961, 65965, 65969, 65973, 65977, 65981, - 65985, 65989, 65993, 65997, 66001, 66005, 66009, 66013, 66017, 66021, - 66025, 66029, 66033, 66037, 66041, 66045, 66049, 66053, 66057, 66061, - 66065, 66069, 66073, 66077, 66081, 66085, 66089, 66093, 66097, 66101, - 66105, 66109, 66113, 66117, 66121, 66125, 66129, 66133, 66137, 66141, - 66145, 66149, 66153, 66157, 66161, 66165, 66169, 66173, 66177, 66181, - 66185, 66189, 66193, 66197, 66201, 66205, 66209, 66213, 66217, 66221, - 66225, 66229, 66233, 66237, 66241, 66245, 66249, 66253, 66257, 66261, - 66265, 66269, 66273, 66277, 66281, 66285, 66289, 66293, 66297, 66301, - 66305, 66309, 66313, 66317, 66321, 66325, 66329, 66333, 66337, 66341, - 66345, 66349, 66353, 66357, 66361, 66365, 66369, 66373, 66377, 66381, - 66385, 66389, 66393, 66396, 66400, 66404, 66408, 66412, 66416, 66420, - 66424, 66428, 66432, 66436, 66440, 66444, 66448, 66452, 66456, 66460, - 66464, 66468, 66472, 66476, 66480, 66484, 66488, 66492, 66496, 66500, - 66504, 66508, 66512, 66516, 66520, 66524, 66528, 66532, 66536, 66540, - 66544, 66548, 66552, 66556, 66560, 66564, 66568, 66572, 66576, 66580, - 66584, 66588, 66592, 66596, 66600, 66604, 66608, 66612, 66616, 66620, - 66624, 66628, 66632, 66636, 66640, 66644, 66648, 66652, 66656, 66660, - 66664, 66668, 66672, 66676, 66680, 66684, 66688, 66692, 66696, 66700, - 66704, 66708, 66712, 66716, 66720, 66724, 66728, 66732, 66736, 66740, - 66744, 66748, 66752, 66756, 66760, 66764, 66768, 66772, 66776, 66780, - 66784, 66788, 66792, 66796, 66800, 66804, 66808, 66812, 66816, 66820, - 66824, 66828, 66832, 66836, 66840, 66844, 66848, 66852, 66856, 66860, - 66864, 66868, 66872, 66876, 66880, 66884, 66888, 66892, 66896, 66900, - 66904, 66908, 66912, 66916, 66920, 66924, 66928, 66932, 66936, 66940, - 66944, 66948, 66952, 66956, 66960, 66964, 66968, 66972, 66976, 66980, - 66984, 66988, 66992, 66996, 67000, 67004, 67008, 67012, 67016, 67020, - 67024, 67028, 67032, 67036, 67040, 67044, 67048, 67052, 67056, 67060, - 67064, 67068, 67072, 67076, 67080, 67084, 67088, 67092, 67096, 67100, - 67104, 67108, 67112, 67116, 67120, 67124, 67128, 67132, 67136, 67140, - 67144, 67148, 67152, 67155, 67159, 67163, 67167, 67171, 67175, 67179, - 67183, 67187, 67191, 67195, 67199, 67203, 67207, 67211, 67215, 67219, - 67223, 67227, 67231, 67235, 67239, 67243, 67247, 67251, 67255, 67259, - 67263, 67267, 67271, 67275, 67279, 67283, 67287, 67291, 67295, 67299, - 67303, 67307, 67311, 67315, 67319, 67323, 67327, 67331, 67335, 67339, - 67343, 67347, 67351, 67355, 67359, 67363, 67367, 67371, 67375, 67379, - 67383, 67387, 67391, 67395, 67399, 67403, 67407, 67411, 67415, 67419, - 67423, 67427, 67431, 67435, 67439, 67443, 67447, 67451, 67455, 67459, - 67463, 67467, 67471, 67475, 67479, 67483, 67487, 67491, 67495, 67499, - 67503, 67507, 67511, 67515, 67519, 67523, 67527, 67531, 67535, 67539, - 67543, 67547, 67551, 67555, 67559, 67563, 67567, 67571, 67575, 67579, - 67583, 67587, 67591, 67595, 67599, 67603, 67607, 67611, 67615, 67619, - 67623, 67627, 67631, 67635, 67639, 67643, 67647, 67651, 67655, 67659, - 67663, 67667, 67671, 67675, 67679, 67683, 67687, 67691, 67695, 67699, - 67703, 67707, 67711, 67715, 67719, 67723, 67727, 67731, 67735, 67739, - 67743, 67747, 67751, 67755, 67759, 67763, 67767, 67771, 67775, 67779, - 67783, 67787, 67791, 67795, 67799, 67803, 67807, 67811, 67815, 67819, - 67823, 67827, 67831, 67835, 67839, 67843, 67847, 67851, 67855, 67859, - 67863, 67867, 67871, 67875, 67879, 67883, 67887, 67891, 67895, 67899, - 67903, 67907, 67911, 67915, 67919, 67923, 67927, 67931, 67935, 0, 0, 0, - 67939, 67943, 67947, 67951, 67955, 67959, 67963, 67967, 67971, 67975, - 67979, 67983, 67987, 67991, 67995, 67999, 68003, 68007, 68011, 68015, - 68019, 68023, 68027, 68031, 68035, 68039, 68043, 68047, 68051, 68055, - 68059, 68063, 68067, 68071, 68075, 68079, 68083, 68087, 68091, 68095, - 68099, 68103, 68107, 68111, 68115, 68119, 68123, 68127, 68131, 68135, - 68139, 68143, 68147, 68151, 68155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68159, - 68164, 68168, 68173, 68178, 68183, 68188, 68193, 68197, 68202, 68207, - 68212, 68217, 68222, 68227, 68232, 68236, 68240, 68245, 68250, 68255, - 68260, 68265, 68269, 68274, 68279, 68284, 68289, 68294, 68298, 68303, - 68307, 68312, 68316, 68321, 68325, 68329, 68333, 68338, 68343, 68348, - 68356, 68364, 68372, 68380, 68387, 68395, 68401, 68409, 68413, 68417, - 68421, 68425, 68429, 68433, 68437, 68441, 68445, 68449, 68453, 68457, - 68461, 68465, 68469, 68473, 68477, 68481, 68485, 68489, 68493, 68497, - 68501, 68505, 68509, 68513, 68517, 68521, 68525, 68529, 68533, 68537, - 68541, 68545, 68549, 68553, 68556, 68560, 68564, 68568, 68572, 68576, - 68580, 68584, 68588, 68592, 68596, 68600, 68604, 68608, 68612, 68616, - 68620, 68624, 68628, 68632, 68636, 68640, 68644, 68648, 68652, 68656, - 68660, 68664, 68668, 68672, 68676, 68680, 68684, 68688, 68692, 68696, - 68700, 68703, 68707, 68711, 68714, 68718, 68722, 68726, 68729, 68733, - 68737, 68741, 68745, 68749, 68753, 68757, 68761, 68765, 68769, 68773, - 68777, 68781, 68785, 68788, 68792, 68796, 68800, 68804, 68808, 68812, - 68816, 68820, 68824, 68827, 68830, 68834, 68838, 68842, 68845, 68848, - 68852, 68856, 68860, 68864, 68868, 68872, 68876, 68880, 68884, 68888, - 68892, 68896, 68900, 68904, 68908, 68912, 68916, 68920, 68924, 68928, - 68932, 68936, 68940, 68944, 68948, 68952, 68956, 68960, 68964, 68968, - 68972, 68976, 68980, 68984, 68988, 68992, 68996, 68999, 69003, 69007, - 69011, 69015, 69019, 69023, 69027, 69031, 69035, 69039, 69043, 69047, - 69051, 69055, 69059, 69063, 69067, 69071, 69075, 69079, 69083, 69087, - 69091, 69095, 69099, 69103, 69107, 69111, 69115, 69119, 69123, 69127, - 69131, 69135, 69139, 69143, 69146, 69150, 69154, 69158, 69162, 69166, - 69170, 69174, 69178, 69182, 69186, 69190, 69194, 69198, 69202, 69206, - 69210, 69213, 69217, 69221, 69225, 69229, 69233, 69237, 69241, 69245, - 69249, 69253, 69257, 69261, 69265, 69269, 69273, 69277, 69281, 69285, - 69289, 69293, 69297, 69300, 69304, 69308, 69312, 69316, 69320, 69324, - 69328, 69332, 69336, 69340, 69344, 69348, 69352, 69356, 69360, 69364, - 69368, 69372, 69376, 69380, 69384, 69388, 69392, 69396, 69400, 69404, - 69408, 69412, 69416, 69420, 69424, 69428, 69432, 69436, 69440, 69444, - 69448, 69452, 69456, 69460, 69464, 69468, 69472, 69475, 69480, 69484, - 69490, 69495, 69501, 69505, 69509, 69513, 69517, 69521, 69525, 69529, - 69533, 69537, 69541, 69545, 69549, 69553, 69557, 69560, 69563, 69566, - 69569, 69572, 69575, 69578, 69581, 69584, 69589, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69595, 69600, 69605, 69610, 69615, - 69622, 69629, 69634, 69639, 69644, 69649, 69656, 69663, 69670, 69677, - 69684, 69691, 69701, 69711, 69718, 69725, 69732, 69739, 69745, 69751, - 69760, 69769, 69776, 69783, 69794, 69805, 69810, 69815, 69822, 69829, - 69836, 69843, 69850, 69857, 69864, 69871, 69877, 69883, 69889, 69895, - 69902, 69909, 69914, 69918, 69925, 69932, 69939, 0, 0, 0, 0, 0, 0, 0, 0, - 69943, 69947, 69951, 69954, 69957, 69962, 69967, 69972, 69977, 69982, - 69987, 69992, 69997, 70002, 70007, 70016, 70025, 70030, 70035, 70040, - 70045, 70050, 70055, 70060, 70065, 70070, 70075, 70080, 0, 0, 0, 0, 0, 0, - 0, 0, 70085, 70088, 70091, 70094, 70098, 70102, 70106, 70110, 70113, - 70117, 70120, 70124, 70127, 70131, 70135, 70139, 70143, 70147, 70151, - 70155, 70158, 70162, 70166, 70170, 70174, 70178, 70182, 70186, 70190, - 70194, 70198, 70202, 70206, 70210, 70214, 70217, 70221, 70225, 70229, - 70233, 70237, 70241, 70245, 70249, 70253, 70257, 70261, 70265, 70269, - 70273, 70277, 70281, 70285, 70289, 70293, 70297, 70301, 70305, 70309, - 70313, 70316, 70320, 70324, 70328, 70332, 70336, 70340, 70344, 70347, - 70351, 70355, 70359, 70363, 70367, 70371, 70375, 70379, 70383, 70387, - 70391, 70395, 70400, 70405, 70408, 70413, 70416, 70419, 70422, 0, 0, 0, - 0, 0, 0, 0, 0, 70426, 70435, 70444, 70453, 70462, 70471, 70480, 70489, - 70498, 70506, 70513, 70521, 70528, 70536, 70546, 70555, 70565, 70574, - 70584, 70592, 70599, 70607, 70614, 70622, 70627, 70632, 70637, 70646, - 70652, 70658, 70665, 70674, 70682, 70690, 70698, 70705, 70712, 70719, - 70726, 70731, 70736, 70741, 70746, 70751, 70756, 70761, 70766, 70774, - 70782, 70788, 70793, 70798, 70803, 70808, 70813, 70818, 70823, 70828, - 70833, 70841, 70849, 70854, 70859, 70869, 70879, 70886, 70893, 70902, - 70911, 70923, 70935, 70941, 70947, 70955, 70963, 70973, 70983, 70990, - 70997, 71002, 71007, 71019, 71031, 71039, 71047, 71057, 71067, 71079, - 71091, 71100, 71109, 71116, 71123, 71130, 71137, 71146, 71155, 71160, - 71165, 71172, 71179, 71186, 71193, 71205, 71217, 71222, 71227, 71232, - 71237, 71242, 71247, 71252, 71257, 71261, 71266, 71271, 71276, 71281, - 71286, 71292, 71297, 71302, 71309, 71316, 71323, 71330, 71337, 71346, - 71355, 71361, 71367, 71373, 71379, 71385, 71391, 71398, 71405, 71412, - 71416, 71423, 71428, 71433, 71440, 0, 71453, 71461, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 71469, 71478, 71487, 71496, 71505, 71514, 71523, - 71532, 71541, 71550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71559, 71566, 71574, 71582, - 71589, 71597, 71604, 71610, 71616, 71623, 71629, 71635, 71641, 71648, - 71655, 71662, 71669, 71676, 71683, 71690, 71697, 71704, 71711, 71718, - 71725, 71732, 71739, 71745, 71752, 71759, 71766, 71773, 71780, 71787, - 71794, 71801, 71808, 71815, 71822, 71829, 71836, 71843, 71850, 71857, - 71864, 71871, 71879, 71887, 71895, 71903, 0, 0, 0, 0, 71911, 71920, - 71929, 71938, 71947, 71956, 71965, 71972, 71979, 71986, 0, 0, 0, 0, 0, 0, - 71993, 71997, 72002, 72007, 72012, 72017, 72022, 72027, 72032, 72037, - 72042, 72047, 72051, 72055, 72060, 72065, 72069, 72074, 72079, 72084, - 72089, 72094, 72099, 72104, 72108, 72112, 72117, 72122, 72127, 72131, - 72135, 72139, 72143, 72147, 72151, 72156, 72161, 72166, 72171, 72176, - 72183, 72189, 72194, 72199, 72204, 72209, 72215, 72222, 72228, 72235, - 72241, 72247, 72252, 72259, 72265, 72270, 0, 0, 0, 0, 0, 0, 0, 0, 72276, - 72280, 72284, 72287, 72291, 72294, 72298, 72301, 72305, 72309, 72314, - 72318, 72323, 72326, 72330, 72334, 72337, 72341, 72345, 72348, 72352, - 72356, 72360, 72364, 72368, 72372, 72376, 72380, 72384, 72388, 72392, - 72396, 72400, 72404, 72408, 72412, 72416, 72420, 72423, 72426, 72430, - 72434, 72438, 72441, 72444, 72447, 72451, 72455, 72459, 72463, 72467, - 72470, 72474, 72480, 72485, 72489, 72494, 72498, 72503, 72508, 72514, - 72519, 72525, 72529, 72534, 72539, 72543, 72548, 72553, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 72557, 72560, 72564, 72568, 72571, 72574, 72577, 72580, 72583, - 72586, 72589, 72592, 0, 0, 0, 0, 0, 0, 72595, 72600, 72604, 72608, 72612, - 72616, 72620, 72624, 72628, 72632, 72636, 72640, 72644, 72648, 72652, - 72656, 72660, 72665, 72670, 72676, 72682, 72689, 72694, 72699, 72705, - 72709, 72714, 72717, 0, 0, 0, 0, 72720, 72727, 72733, 72739, 72745, - 72751, 72757, 72763, 72769, 72775, 72781, 72787, 72794, 72801, 72808, - 72815, 72822, 72829, 72836, 72843, 72850, 72856, 72862, 72869, 72875, - 72882, 72889, 72895, 72901, 72908, 72915, 72922, 72928, 72935, 72942, - 72948, 72955, 72961, 72968, 72975, 72981, 72987, 72994, 73000, 73007, - 73014, 73023, 73030, 73037, 73041, 73046, 73051, 73056, 73061, 73065, - 73069, 73074, 73078, 73083, 73088, 73093, 73098, 73102, 73107, 73111, - 73116, 73120, 73125, 73130, 73135, 73140, 73144, 73149, 73154, 73159, - 73165, 73170, 73176, 73182, 73188, 73195, 73201, 73207, 73214, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 73218, 73223, 73227, 73231, 73235, 73239, 73243, - 73247, 73251, 73255, 73259, 73263, 73267, 73271, 73275, 73279, 73283, - 73287, 73291, 73295, 73299, 73303, 73307, 73311, 73315, 73319, 73323, - 73327, 73331, 73335, 0, 0, 0, 73339, 73343, 73347, 73351, 73355, 73358, - 73364, 73367, 73371, 73374, 73380, 73386, 73394, 73397, 73401, 73404, - 73407, 73413, 73419, 73423, 73429, 73433, 73437, 73443, 73447, 73453, - 73459, 73463, 73467, 73473, 73477, 73483, 73489, 73493, 73499, 73503, - 73509, 73512, 73515, 73521, 73525, 73531, 73534, 73537, 73540, 73546, - 73550, 73554, 73560, 73566, 73570, 73573, 73579, 73584, 73589, 73594, - 73601, 73606, 73613, 73618, 73625, 73630, 73636, 73642, 73648, 73651, - 73655, 73659, 73664, 73669, 73674, 73679, 73684, 73689, 73694, 73699, - 73706, 73711, 0, 73718, 73721, 73725, 73728, 73731, 73734, 73737, 73740, - 73743, 73746, 73749, 0, 0, 0, 0, 73752, 73759, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 62816, 62825, 62834, 62845, 62852, 62857, 62862, 62869, 62876, 62882, + 62887, 62892, 62897, 62902, 62909, 62914, 62919, 62924, 62935, 62940, + 62945, 62952, 62957, 62964, 62969, 62974, 62981, 62988, 62995, 63004, + 63013, 63018, 63023, 63028, 63035, 63040, 63050, 63057, 63062, 63067, + 63072, 63077, 63082, 63087, 63096, 63103, 63110, 63115, 63122, 63127, + 63134, 63143, 63154, 63159, 63168, 63173, 63180, 63189, 63198, 63203, + 63208, 63215, 63221, 63228, 63235, 63239, 63243, 63246, 63250, 63254, + 63258, 63262, 63266, 63270, 63274, 63277, 63281, 63285, 63289, 63293, + 63297, 63301, 63304, 63308, 63312, 63315, 63319, 63323, 63327, 63331, + 63335, 63339, 63343, 63347, 63351, 63355, 63359, 63363, 63367, 63371, + 63375, 63379, 63383, 63387, 63391, 63395, 63399, 63403, 63407, 63411, + 63415, 63419, 63423, 63427, 63431, 63435, 63439, 63443, 63447, 63451, + 63455, 63459, 63463, 63467, 63471, 63475, 63479, 63483, 63487, 63491, + 63494, 63498, 63502, 63506, 63510, 63514, 63518, 63522, 63526, 63530, + 63534, 63538, 63542, 63546, 63550, 63554, 63558, 63562, 63566, 63570, + 63574, 63578, 63582, 63586, 63590, 63594, 63598, 63602, 63606, 63610, + 63614, 63618, 63622, 63626, 63630, 63634, 63638, 63642, 63646, 63650, + 63654, 63658, 63662, 63666, 63670, 63674, 63678, 63682, 63686, 63690, + 63694, 63698, 63702, 63706, 63710, 63714, 63718, 63722, 63726, 63730, + 63734, 63738, 63742, 63746, 63750, 63754, 63758, 63762, 63766, 63770, + 63774, 63778, 63782, 63786, 63790, 63794, 63798, 63802, 63806, 63810, + 63814, 63818, 63822, 63826, 63830, 63834, 63838, 63842, 63846, 63850, + 63854, 63858, 63862, 63866, 63870, 63874, 63878, 63882, 63886, 63890, + 63894, 63898, 63902, 63906, 63910, 63914, 63918, 63922, 63926, 63930, + 63934, 63938, 63942, 63946, 63950, 63954, 63958, 63962, 63965, 63969, + 63973, 63977, 63981, 63985, 63989, 63993, 63997, 64001, 64005, 64009, + 64013, 64017, 64021, 64025, 64029, 64033, 64037, 64041, 64045, 64049, + 64053, 64057, 64061, 64065, 64069, 64073, 64077, 64081, 64085, 64089, + 64093, 64097, 64101, 64105, 64109, 64113, 64117, 64121, 64125, 64129, + 64133, 64137, 64141, 64145, 64149, 64153, 64157, 64161, 64165, 64169, + 64173, 64177, 64181, 64185, 64189, 64193, 64197, 64201, 64205, 64209, + 64213, 64217, 64221, 64225, 64229, 64233, 64237, 64241, 64245, 64249, + 64253, 64257, 64261, 64265, 64269, 64273, 64277, 64281, 64285, 64289, + 64293, 64297, 64301, 64305, 64309, 64313, 64317, 64321, 64325, 64329, + 64333, 64337, 64341, 64345, 64349, 64353, 64357, 64361, 64365, 64369, + 64373, 64377, 64381, 64385, 64389, 64393, 64397, 64401, 64405, 64409, + 64413, 64417, 64421, 64425, 64428, 64432, 64436, 64440, 64444, 64448, + 64452, 64456, 64460, 64464, 64468, 64472, 64476, 64480, 64484, 64488, + 64492, 64496, 64500, 64504, 64508, 64512, 64516, 64520, 64524, 64528, + 64532, 64536, 64540, 64544, 64548, 64552, 64556, 64560, 64564, 64568, + 64572, 64576, 64580, 64584, 64588, 64592, 64596, 64600, 64604, 64608, + 64612, 64616, 64620, 64624, 64628, 64632, 64636, 64640, 64644, 64648, + 64652, 64656, 64660, 64664, 64668, 64672, 64676, 64680, 64684, 64688, + 64692, 64696, 64700, 64704, 64708, 64712, 64716, 64720, 64724, 64728, + 64732, 64736, 64740, 64744, 64748, 64752, 64756, 64760, 64764, 64768, + 64772, 64776, 64780, 64784, 64787, 64791, 64795, 64799, 64803, 64807, + 64811, 64815, 64819, 64823, 64827, 64831, 64835, 64839, 64843, 64847, + 64851, 64855, 64859, 64863, 64867, 64871, 64875, 64879, 64883, 64887, + 64891, 64895, 64899, 64903, 64907, 64911, 64915, 64919, 64923, 64927, + 64931, 64935, 64939, 64943, 64947, 64951, 64955, 64959, 64963, 64967, + 64971, 64975, 64979, 64983, 64987, 64991, 64995, 64999, 65003, 65007, + 65011, 65015, 65019, 65023, 65027, 65031, 65035, 65039, 65043, 65047, + 65051, 65055, 65059, 65063, 65067, 65071, 65075, 65079, 65083, 65087, + 65091, 65095, 65099, 65103, 65107, 65111, 65115, 65119, 65123, 65127, + 65131, 65135, 65139, 65143, 65147, 65151, 65155, 65159, 65163, 65167, + 65171, 65175, 65179, 65183, 65187, 65191, 65195, 65199, 65203, 65207, + 65211, 65215, 65219, 65223, 65227, 65231, 65235, 65239, 65243, 65247, + 65251, 65255, 65259, 65263, 65267, 65271, 65275, 65279, 65282, 65286, + 65290, 65294, 65298, 65302, 65306, 65310, 65314, 65318, 65322, 65326, + 65330, 65334, 65338, 65342, 65346, 65350, 65354, 65358, 65362, 65366, + 65370, 65374, 65378, 65382, 65386, 65390, 65394, 65398, 65402, 65406, + 65410, 65414, 65418, 65422, 65426, 65430, 65434, 65438, 65442, 65446, + 65450, 65454, 65458, 65462, 65466, 65470, 65474, 65478, 65482, 65486, + 65490, 65494, 65498, 65502, 65506, 65510, 65514, 65518, 65522, 65526, + 65530, 65534, 65538, 65542, 65546, 65550, 65554, 65558, 65562, 65566, + 65570, 65574, 65578, 65582, 65586, 65590, 65594, 65598, 65602, 65606, + 65610, 65614, 65618, 65622, 65626, 65630, 65634, 65638, 65642, 65646, + 65650, 65654, 65658, 65662, 65666, 65670, 65674, 65678, 65682, 65686, + 65690, 65694, 65698, 65702, 65706, 65710, 65714, 65718, 65722, 65726, + 65730, 65734, 65737, 65741, 65745, 65749, 65753, 65757, 65761, 65765, + 65769, 65773, 65777, 65781, 65785, 65789, 65793, 65797, 65801, 65805, + 65809, 65813, 65817, 65821, 65825, 65829, 65833, 65837, 65841, 65845, + 65849, 65853, 65857, 65861, 65865, 65869, 65873, 65877, 65881, 65885, + 65889, 65893, 65897, 65901, 65905, 65909, 65913, 65917, 65921, 65925, + 65929, 65933, 65937, 65941, 65945, 65949, 65953, 65957, 65961, 65965, + 65969, 65973, 65977, 65981, 65985, 65989, 65993, 65997, 66001, 66005, + 66009, 66013, 66017, 66021, 66025, 66029, 66033, 66037, 66041, 66045, + 66049, 66053, 66057, 66061, 66065, 66069, 66073, 66077, 66081, 66085, + 66089, 66093, 66097, 66101, 66105, 66109, 66113, 66117, 66121, 66125, + 66129, 66133, 66137, 66141, 66145, 66149, 66153, 66157, 66161, 66165, + 66169, 66173, 66177, 66181, 66185, 66189, 66193, 66197, 66201, 66205, + 66209, 66213, 66217, 66221, 66225, 66229, 66233, 66237, 66241, 66245, + 66249, 66253, 66257, 66261, 66265, 66269, 66273, 66277, 66281, 66285, + 66289, 66293, 66297, 66301, 66305, 66309, 66313, 66317, 66321, 66325, + 66329, 66333, 66337, 66340, 66344, 66348, 66352, 66356, 66360, 66364, + 66368, 66372, 66376, 66380, 66384, 66388, 66392, 66396, 66400, 66404, + 66408, 66412, 66416, 66420, 66424, 66428, 66432, 66436, 66440, 66444, + 66448, 66452, 66456, 66460, 66464, 66468, 66472, 66476, 66480, 66484, + 66488, 66492, 66496, 66500, 66504, 66508, 66512, 66516, 66520, 66524, + 66528, 66532, 66536, 66540, 66544, 66548, 66552, 66556, 66560, 66564, + 66568, 66572, 66576, 66580, 66584, 66588, 66592, 66596, 66600, 66604, + 66608, 66612, 66616, 66620, 66624, 66628, 66632, 66636, 66640, 66644, + 66648, 66652, 66656, 66660, 66664, 66668, 66672, 66676, 66680, 66684, + 66688, 66692, 66696, 66700, 66704, 66708, 66712, 66716, 66720, 66724, + 66728, 66732, 66736, 66740, 66744, 66748, 66752, 66756, 66760, 66764, + 66768, 66772, 66776, 66780, 66784, 66788, 66792, 66796, 66800, 66804, + 66808, 66812, 66816, 66820, 66824, 66828, 66832, 66836, 66840, 66844, + 66848, 66852, 66856, 66860, 66864, 66868, 66872, 66876, 66880, 66884, + 66888, 66892, 66896, 66900, 66904, 66908, 66912, 66916, 66920, 66924, + 66928, 66932, 66936, 66940, 66944, 66948, 66952, 66956, 66960, 66964, + 66968, 66972, 66976, 66980, 66984, 66988, 66992, 66996, 67000, 67004, + 67008, 67012, 67016, 67020, 67024, 67028, 67032, 67036, 67040, 67044, + 67048, 67052, 67056, 67060, 67064, 67068, 67072, 67076, 67080, 67084, + 67088, 67092, 67096, 67099, 67103, 67107, 67111, 67115, 67119, 67123, + 67127, 67131, 67135, 67139, 67143, 67147, 67151, 67155, 67159, 67163, + 67167, 67171, 67175, 67179, 67183, 67187, 67191, 67195, 67199, 67203, + 67207, 67211, 67215, 67219, 67223, 67227, 67231, 67235, 67239, 67243, + 67247, 67251, 67255, 67259, 67263, 67267, 67271, 67275, 67279, 67283, + 67287, 67291, 67295, 67299, 67303, 67307, 67311, 67315, 67319, 67323, + 67327, 67331, 67335, 67339, 67343, 67347, 67351, 67355, 67359, 67363, + 67367, 67371, 67375, 67379, 67383, 67387, 67391, 67395, 67399, 67403, + 67407, 67411, 67415, 67419, 67423, 67427, 67431, 67435, 67439, 67443, + 67447, 67451, 67455, 67459, 67463, 67467, 67471, 67475, 67479, 67483, + 67487, 67491, 67495, 67499, 67503, 67507, 67511, 67515, 67519, 67523, + 67527, 67531, 67535, 67539, 67543, 67547, 67551, 67555, 67559, 67563, + 67567, 67571, 67575, 67579, 67583, 67587, 67591, 67595, 67599, 67603, + 67607, 67611, 67615, 67619, 67623, 67627, 67631, 67635, 67639, 67643, + 67647, 67651, 67655, 67659, 67663, 67667, 67671, 67675, 67679, 67683, + 67687, 67691, 67695, 67699, 67703, 67707, 67711, 67715, 67719, 67723, + 67727, 67731, 67735, 67739, 67743, 67747, 67751, 67755, 67759, 67763, + 67767, 67771, 67775, 67779, 67783, 67787, 67791, 67795, 67799, 67803, + 67807, 67811, 67815, 67819, 67823, 67827, 67831, 67835, 67839, 67843, + 67847, 67851, 67855, 67859, 67863, 67867, 67871, 67875, 67879, 0, 0, 0, + 67883, 67887, 67891, 67895, 67899, 67903, 67907, 67911, 67915, 67919, + 67923, 67927, 67931, 67935, 67939, 67943, 67947, 67951, 67955, 67959, + 67963, 67967, 67971, 67975, 67979, 67983, 67987, 67991, 67995, 67999, + 68003, 68007, 68011, 68015, 68019, 68023, 68027, 68031, 68035, 68039, + 68043, 68047, 68051, 68055, 68059, 68063, 68067, 68071, 68075, 68079, + 68083, 68087, 68091, 68095, 68099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68103, + 68108, 68112, 68117, 68122, 68127, 68132, 68137, 68141, 68146, 68151, + 68156, 68161, 68166, 68171, 68176, 68180, 68184, 68189, 68194, 68199, + 68204, 68209, 68213, 68218, 68223, 68228, 68233, 68238, 68242, 68247, + 68251, 68256, 68260, 68265, 68269, 68273, 68277, 68282, 68287, 68292, + 68300, 68308, 68316, 68324, 68331, 68339, 68345, 68353, 68357, 68361, + 68365, 68369, 68373, 68377, 68381, 68385, 68389, 68393, 68397, 68401, + 68405, 68409, 68413, 68417, 68421, 68425, 68429, 68433, 68437, 68441, + 68445, 68449, 68453, 68457, 68461, 68465, 68469, 68473, 68477, 68481, + 68485, 68489, 68493, 68497, 68500, 68504, 68508, 68512, 68516, 68520, + 68524, 68528, 68532, 68536, 68540, 68544, 68548, 68552, 68556, 68560, + 68564, 68568, 68572, 68576, 68580, 68584, 68588, 68592, 68596, 68600, + 68604, 68608, 68612, 68616, 68620, 68624, 68628, 68632, 68636, 68640, + 68644, 68647, 68651, 68655, 68658, 68662, 68666, 68670, 68673, 68677, + 68681, 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, + 68721, 68725, 68729, 68732, 68736, 68740, 68744, 68748, 68752, 68756, + 68760, 68764, 68768, 68771, 68774, 68778, 68782, 68786, 68789, 68792, + 68796, 68800, 68804, 68808, 68812, 68816, 68820, 68824, 68828, 68832, + 68836, 68840, 68844, 68848, 68852, 68856, 68860, 68864, 68868, 68872, + 68876, 68880, 68884, 68888, 68892, 68896, 68900, 68904, 68908, 68912, + 68916, 68920, 68924, 68928, 68932, 68936, 68940, 68943, 68947, 68951, + 68955, 68959, 68963, 68967, 68971, 68975, 68979, 68983, 68987, 68991, + 68995, 68999, 69003, 69007, 69011, 69015, 69019, 69023, 69027, 69031, + 69035, 69039, 69043, 69047, 69051, 69055, 69059, 69063, 69067, 69071, + 69075, 69079, 69083, 69087, 69090, 69094, 69098, 69102, 69106, 69110, + 69114, 69118, 69122, 69126, 69130, 69134, 69138, 69142, 69146, 69150, + 69154, 69157, 69161, 69165, 69169, 69173, 69177, 69181, 69185, 69189, + 69193, 69197, 69201, 69205, 69209, 69213, 69217, 69221, 69225, 69229, + 69233, 69237, 69241, 69244, 69248, 69252, 69256, 69260, 69264, 69268, + 69272, 69276, 69280, 69284, 69288, 69292, 69296, 69300, 69304, 69308, + 69312, 69316, 69320, 69324, 69328, 69332, 69336, 69340, 69344, 69348, + 69352, 69356, 69360, 69364, 69368, 69372, 69376, 69380, 69384, 69388, + 69392, 69396, 69400, 69404, 69408, 69412, 69416, 69419, 69424, 69428, + 69434, 69439, 69445, 69449, 69453, 69457, 69461, 69465, 69469, 69473, + 69477, 69481, 69485, 69489, 69493, 69497, 69501, 69504, 69507, 69510, + 69513, 69516, 69519, 69522, 69525, 69528, 69533, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69539, 69544, 69549, 69554, 69559, + 69566, 69573, 69578, 69583, 69588, 69593, 69600, 69607, 69614, 69621, + 69628, 69635, 69645, 69655, 69662, 69669, 69676, 69683, 69689, 69695, + 69704, 69713, 69720, 69727, 69738, 69749, 69754, 69759, 69766, 69773, + 69780, 69787, 69794, 69801, 69808, 69815, 69821, 69827, 69833, 69839, + 69846, 69853, 69858, 69862, 69869, 69876, 69883, 0, 0, 0, 0, 0, 0, 0, 0, + 69887, 69891, 69895, 69898, 69901, 69906, 69911, 69916, 69921, 69926, + 69931, 69936, 69941, 69946, 69951, 69960, 69969, 69974, 69979, 69984, + 69989, 69994, 69999, 70004, 70009, 70014, 70019, 70024, 0, 0, 0, 0, 0, 0, + 0, 0, 70029, 70032, 70035, 70038, 70042, 70046, 70050, 70054, 70057, + 70061, 70064, 70068, 70071, 70075, 70079, 70083, 70087, 70091, 70095, + 70099, 70102, 70106, 70110, 70114, 70118, 70122, 70126, 70130, 70134, + 70138, 70142, 70146, 70150, 70154, 70158, 70161, 70165, 70169, 70173, + 70177, 70181, 70185, 70189, 70193, 70197, 70201, 70205, 70209, 70213, + 70217, 70221, 70225, 70229, 70233, 70237, 70241, 70245, 70249, 70253, + 70257, 70260, 70264, 70268, 70272, 70276, 70280, 70284, 70288, 70291, + 70295, 70299, 70303, 70307, 70311, 70315, 70319, 70323, 70327, 70331, + 70335, 70339, 70344, 70349, 70352, 70357, 70360, 70363, 70366, 0, 0, 0, + 0, 0, 0, 0, 0, 70370, 70379, 70388, 70397, 70406, 70415, 70424, 70433, + 70442, 70450, 70457, 70465, 70472, 70480, 70490, 70499, 70509, 70518, + 70528, 70536, 70543, 70551, 70558, 70566, 70571, 70576, 70581, 70590, + 70596, 70602, 70609, 70618, 70626, 70634, 70642, 70649, 70656, 70663, + 70670, 70675, 70680, 70685, 70690, 70695, 70700, 70705, 70710, 70718, + 70726, 70732, 70737, 70742, 70747, 70752, 70757, 70762, 70767, 70772, + 70777, 70785, 70793, 70798, 70803, 70813, 70823, 70830, 70837, 70846, + 70855, 70867, 70879, 70885, 70891, 70899, 70907, 70917, 70927, 70934, + 70941, 70946, 70951, 70963, 70975, 70983, 70991, 71001, 71011, 71023, + 71035, 71044, 71053, 71060, 71067, 71074, 71081, 71090, 71099, 71104, + 71109, 71116, 71123, 71130, 71137, 71149, 71161, 71166, 71171, 71176, + 71181, 71186, 71191, 71196, 71201, 71205, 71210, 71215, 71220, 71225, + 71230, 71236, 71241, 71246, 71253, 71260, 71267, 71274, 71281, 71290, + 71299, 71305, 71311, 71317, 71323, 71329, 71335, 71342, 71349, 71356, + 71360, 71367, 71372, 71377, 71384, 0, 71397, 71405, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 71413, 71422, 71431, 71440, 71449, 71458, 71467, + 71476, 71485, 71494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71503, 71510, 71518, 71526, + 71533, 71541, 71548, 71554, 71560, 71567, 71573, 71579, 71585, 71592, + 71599, 71606, 71613, 71620, 71627, 71634, 71641, 71648, 71655, 71662, + 71669, 71676, 71683, 71689, 71696, 71703, 71710, 71717, 71724, 71731, + 71738, 71745, 71752, 71759, 71766, 71773, 71780, 71787, 71794, 71801, + 71808, 71815, 71823, 71831, 71839, 71847, 0, 0, 0, 0, 71855, 71864, + 71873, 71882, 71891, 71900, 71909, 71916, 71923, 71930, 0, 0, 0, 0, 0, 0, + 71937, 71941, 71946, 71951, 71956, 71961, 71966, 71971, 71976, 71981, + 71986, 71991, 71995, 71999, 72004, 72009, 72013, 72018, 72023, 72028, + 72033, 72038, 72043, 72048, 72052, 72056, 72061, 72066, 72071, 72075, + 72079, 72083, 72087, 72091, 72095, 72100, 72105, 72110, 72115, 72120, + 72127, 72133, 72138, 72143, 72148, 72153, 72159, 72166, 72172, 72179, + 72185, 72191, 72196, 72203, 72209, 72214, 0, 0, 0, 0, 0, 0, 0, 0, 72220, + 72224, 72228, 72231, 72235, 72238, 72242, 72245, 72249, 72253, 72258, + 72262, 72267, 72270, 72274, 72278, 72281, 72285, 72289, 72292, 72296, + 72300, 72304, 72308, 72312, 72316, 72320, 72324, 72328, 72332, 72336, + 72340, 72344, 72348, 72352, 72356, 72360, 72364, 72367, 72370, 72374, + 72378, 72382, 72385, 72388, 72391, 72395, 72399, 72403, 72407, 72411, + 72414, 72418, 72423, 72428, 72432, 72437, 72441, 72446, 72451, 72457, + 72462, 72468, 72472, 72477, 72482, 72486, 72491, 72496, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 72500, 72503, 72507, 72511, 72514, 72517, 72520, 72523, 72526, + 72529, 72532, 72535, 0, 0, 0, 0, 0, 0, 72538, 72543, 72547, 72551, 72555, + 72559, 72563, 72567, 72571, 72575, 72579, 72583, 72587, 72591, 72595, + 72599, 72603, 72608, 72613, 72619, 72625, 72632, 72637, 72642, 72648, + 72652, 72657, 72660, 0, 0, 0, 0, 72663, 72670, 72676, 72682, 72688, + 72694, 72700, 72706, 72712, 72718, 72724, 72730, 72737, 72744, 72751, + 72758, 72765, 72772, 72779, 72786, 72793, 72799, 72805, 72812, 72818, + 72825, 72832, 72838, 72844, 72851, 72858, 72865, 72871, 72878, 72885, + 72891, 72898, 72904, 72911, 72918, 72924, 72930, 72937, 72943, 72950, + 72957, 72966, 72973, 72980, 72984, 72989, 72994, 72999, 73004, 73008, + 73012, 73017, 73021, 73026, 73031, 73036, 73041, 73045, 73050, 73054, + 73059, 73063, 73068, 73073, 73078, 73083, 73087, 73092, 73097, 73102, + 73108, 73113, 73119, 73125, 73131, 73137, 73142, 73147, 73153, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 73157, 73162, 73166, 73170, 73174, 73178, 73182, + 73186, 73190, 73194, 73198, 73202, 73206, 73210, 73214, 73218, 73222, + 73226, 73230, 73234, 73238, 73242, 73246, 73250, 73254, 73258, 73262, + 73266, 73270, 73274, 0, 0, 0, 73278, 73282, 73286, 73290, 73294, 73297, + 73303, 73306, 73310, 73313, 73319, 73325, 73333, 73336, 73340, 73343, + 73346, 73352, 73358, 73362, 73368, 73372, 73376, 73382, 73386, 73392, + 73398, 73402, 73406, 73412, 73416, 73422, 73428, 73432, 73438, 73442, + 73448, 73451, 73454, 73460, 73464, 73470, 73473, 73476, 73479, 73485, + 73489, 73493, 73499, 73505, 73509, 73512, 73518, 73523, 73528, 73533, + 73540, 73545, 73552, 73557, 73564, 73569, 73574, 73579, 73584, 73587, + 73591, 73595, 73600, 73605, 73610, 73615, 73620, 73625, 73630, 73635, + 73642, 73647, 0, 73654, 73657, 73661, 73664, 73667, 73670, 73673, 73676, + 73679, 73682, 73685, 0, 0, 0, 0, 73688, 73695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 73764, 73767, 73770, 73773, 73776, 73780, 73783, 73786, 73790, 73794, - 73798, 73802, 73806, 73810, 73814, 73818, 73822, 73826, 73830, 73834, - 73838, 73842, 73846, 73850, 73854, 73857, 73861, 73864, 73868, 73872, - 73876, 73880, 73884, 73887, 73891, 73894, 73897, 73901, 73905, 73909, - 73913, 73916, 73921, 73925, 73930, 73935, 73939, 73944, 73948, 73953, - 73958, 73963, 73968, 73973, 73979, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73985, - 73990, 73995, 74000, 74007, 74012, 74017, 74021, 74026, 74031, 74035, - 74039, 74044, 74050, 0, 0, 74057, 74061, 74064, 74067, 74070, 74073, - 74076, 74079, 74082, 74085, 0, 0, 74088, 74093, 74098, 74104, 74111, - 74117, 74123, 74129, 74135, 74141, 74147, 74153, 74159, 74165, 74171, - 74177, 74182, 74188, 74193, 74199, 74205, 74212, 74218, 74224, 74229, - 74236, 74243, 74250, 74256, 74261, 74266, 74271, 0, 0, 0, 0, 74279, - 74285, 74291, 74297, 74303, 74309, 74315, 74321, 74327, 74333, 74339, - 74345, 74351, 74357, 74363, 74369, 74375, 74381, 74387, 74393, 74399, - 74404, 74409, 74415, 74421, 74427, 74433, 74439, 74445, 74451, 74457, - 74463, 74469, 74475, 74481, 74487, 74493, 74499, 74505, 74511, 74517, - 74523, 74529, 74535, 74541, 74547, 74553, 74558, 74563, 74569, 74574, - 74578, 74583, 74587, 74591, 74595, 74601, 74606, 74611, 74616, 74621, - 74626, 74631, 74636, 74643, 74650, 74657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74664, 74669, 74674, 74679, - 74686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74693, 74697, 74701, 74705, 74709, - 74713, 0, 0, 74717, 74721, 74725, 74729, 74733, 74737, 0, 0, 74741, - 74745, 74749, 74753, 74757, 74761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74765, - 74769, 74773, 74777, 74781, 74785, 74789, 0, 74793, 74797, 74801, 74805, - 74809, 74813, 74817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 74821, 74828, 74835, 74842, 74849, 74855, 74861, - 74868, 74875, 74882, 74889, 74896, 74903, 74910, 74917, 74924, 74930, - 74937, 74944, 74951, 74958, 74965, 74972, 74979, 74986, 74993, 75000, - 75007, 75016, 75025, 75034, 75043, 75052, 75061, 75070, 75079, 75087, - 75095, 75103, 75111, 75119, 75127, 75135, 75143, 75149, 75157, 0, 0, - 75165, 75172, 75178, 75184, 75190, 75196, 75202, 75208, 75214, 75220, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 75226, 75230, 75234, 75238, 75242, 75246, 75250, 75254, - 75258, 75262, 75266, 75270, 75274, 75278, 75282, 75286, 75290, 75294, - 75298, 75302, 75306, 75310, 75314, 0, 0, 0, 0, 75318, 75322, 75326, - 75330, 75334, 75338, 75342, 75346, 75350, 75354, 75358, 75362, 75366, - 75370, 75374, 75378, 75382, 75386, 75390, 75394, 75398, 75402, 75406, - 75410, 75414, 75418, 75422, 75426, 75430, 75434, 75438, 75442, 75446, - 75450, 75454, 75458, 75462, 75466, 75470, 75474, 75478, 75482, 75486, - 75490, 75494, 75498, 75502, 75506, 75510, 0, 0, 0, 0, 75514, 75518, - 75522, 75526, 75530, 75534, 75538, 75542, 75546, 75550, 75554, 75558, - 75562, 75566, 75570, 75574, 75578, 75582, 75586, 75590, 75594, 75598, - 75602, 75606, 75610, 75614, 75618, 75622, 75626, 75630, 75634, 75638, - 75642, 75646, 75650, 75654, 75658, 75662, 75666, 75670, 75674, 75678, - 75682, 75686, 75690, 75694, 75698, 75702, 75706, 75710, 75714, 75718, - 75722, 75726, 75730, 75734, 75738, 75742, 75746, 75750, 75754, 75758, - 75762, 75766, 75770, 75774, 75778, 75782, 75786, 75790, 75794, 75798, - 75802, 75806, 75810, 75814, 75818, 75822, 75826, 75830, 75834, 75838, - 75842, 75846, 75850, 75854, 75858, 75862, 75866, 75870, 75874, 75878, - 75882, 75886, 75890, 75894, 75898, 75902, 75906, 75910, 75914, 75918, - 75922, 75926, 75930, 75934, 75938, 75942, 75946, 75950, 75954, 75958, - 75962, 75966, 75970, 75974, 75978, 75982, 75986, 75990, 75994, 75998, - 76002, 76006, 76010, 76014, 76018, 76022, 76026, 76030, 76034, 76038, - 76042, 76046, 76050, 76054, 76058, 76062, 76066, 76070, 76074, 76078, - 76082, 76086, 76090, 76094, 76098, 76102, 76106, 76110, 76114, 76118, - 76122, 76126, 76130, 76134, 76138, 76142, 76146, 76150, 76154, 76158, - 76162, 76166, 76170, 76174, 76178, 76182, 76186, 76190, 76194, 76198, - 76202, 76206, 76210, 76214, 76218, 76222, 76226, 76230, 76234, 76238, - 76242, 76246, 76250, 76254, 76258, 76262, 76266, 76270, 76274, 76278, - 76282, 76286, 76290, 76294, 76298, 76302, 76306, 76310, 76314, 76318, - 76322, 76326, 76330, 76334, 76338, 76342, 76346, 76350, 76354, 76358, - 76362, 76366, 76370, 76374, 76378, 76382, 76386, 76390, 76394, 76398, - 76402, 76406, 76410, 76414, 76418, 76422, 76426, 76430, 76434, 76438, - 76442, 76446, 76450, 76454, 76458, 76462, 76466, 76470, 76474, 76478, - 76482, 76486, 76490, 76494, 76498, 76502, 76506, 76510, 76514, 76518, - 76522, 76526, 76530, 76534, 76538, 76542, 76546, 76550, 76554, 76558, - 76562, 76566, 76570, 76574, 76578, 76582, 76586, 76590, 76594, 76598, - 76602, 76606, 76610, 76614, 76618, 76622, 76626, 76630, 76634, 76638, - 76642, 76646, 76650, 76654, 76658, 76662, 76666, 76670, 76674, 76678, - 76682, 76686, 76690, 76694, 76698, 76702, 76706, 76710, 76714, 76718, 0, - 0, 76722, 76726, 76730, 76734, 76738, 76742, 76746, 76750, 76754, 76758, - 76762, 76766, 76770, 76774, 76778, 76782, 76786, 76790, 76794, 76798, - 76802, 76806, 76810, 76814, 76818, 76822, 76826, 76830, 76834, 76838, - 76842, 76846, 76850, 76854, 76858, 76862, 76866, 76870, 76874, 76878, - 76882, 76886, 76890, 76894, 76898, 76902, 76906, 76910, 76914, 76918, - 76922, 76926, 76930, 76934, 76938, 76942, 76946, 76950, 76954, 76958, - 76962, 76966, 0, 0, 76970, 76974, 76978, 76982, 76986, 76990, 76994, - 76998, 77002, 77006, 77010, 77014, 77018, 77022, 77026, 77030, 77034, - 77038, 77042, 77046, 77050, 77054, 77058, 77062, 77066, 77070, 77074, - 77078, 77082, 77086, 77090, 77094, 77098, 77102, 77106, 77110, 77114, - 77118, 77122, 77126, 77130, 77134, 77138, 77142, 77146, 77150, 77154, - 77158, 77162, 77166, 77170, 77174, 77178, 77182, 77186, 77190, 77194, - 77198, 77202, 77206, 77210, 77214, 77218, 77222, 77226, 77230, 77234, - 77238, 77242, 77246, 77250, 77254, 77258, 77262, 77266, 77270, 77274, - 77278, 77282, 77286, 77290, 77294, 77298, 77302, 77306, 77310, 77314, - 77318, 77322, 77326, 77330, 77334, 77338, 77342, 77346, 77350, 77354, - 77358, 77362, 77366, 77370, 77374, 77378, 77382, 77386, 77390, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77394, 77399, 77404, 77409, 77414, - 77419, 77427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77432, 77439, 77446, - 77453, 77460, 0, 0, 0, 0, 0, 77467, 77474, 77481, 77491, 77497, 77503, - 77509, 77515, 77521, 77527, 77534, 77540, 77546, 77552, 77561, 77570, - 77582, 77594, 77600, 77606, 77612, 77619, 77626, 77633, 77640, 77647, 0, - 77654, 77661, 77668, 77676, 77683, 0, 77690, 0, 77697, 77704, 0, 77711, - 77719, 0, 77726, 77733, 77740, 77747, 77754, 77761, 77768, 77775, 77782, - 77789, 77794, 77801, 77808, 77814, 77820, 77826, 77832, 77838, 77844, - 77850, 77856, 77862, 77868, 77874, 77880, 77886, 77892, 77898, 77904, - 77910, 77916, 77922, 77928, 77934, 77940, 77946, 77952, 77958, 77964, - 77970, 77976, 77982, 77988, 77994, 78000, 78006, 78012, 78018, 78024, - 78030, 78036, 78042, 78048, 78054, 78060, 78066, 78072, 78078, 78084, - 78090, 78096, 78102, 78108, 78114, 78120, 78126, 78132, 78138, 78144, - 78150, 78156, 78162, 78168, 78174, 78180, 78186, 78192, 78198, 78204, - 78210, 78216, 78222, 78228, 78234, 78240, 78246, 78252, 78258, 78264, - 78272, 78280, 78286, 78292, 78298, 78304, 78313, 78322, 78330, 78338, - 78346, 78354, 78362, 78370, 78378, 78386, 78393, 78400, 78410, 78420, - 78424, 78428, 78433, 78438, 78443, 78448, 78457, 78466, 78472, 78478, - 78485, 78492, 78499, 78503, 78509, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78515, 78521, 78527, 78533, 78539, 78544, 78549, 78555, - 78561, 78567, 78573, 78581, 78587, 78593, 78601, 78609, 78617, 78625, - 78630, 78635, 78640, 78645, 78657, 78669, 78679, 78689, 78700, 78711, - 78722, 78733, 78743, 78753, 78764, 78775, 78786, 78797, 78807, 78817, - 78827, 78842, 78857, 78872, 78879, 78886, 78893, 78900, 78910, 78920, - 78930, 78941, 78951, 78959, 78967, 78976, 78984, 78993, 79001, 79009, - 79017, 79026, 79034, 79043, 79051, 79059, 79067, 79076, 79084, 79091, - 79098, 79105, 79112, 79120, 79128, 79136, 79144, 79152, 79161, 79169, - 79177, 79185, 79193, 79201, 79210, 79218, 79226, 79234, 79242, 79250, - 79258, 79266, 79274, 79282, 79290, 79299, 79307, 79316, 79324, 79332, - 79340, 79349, 79357, 79365, 79373, 79381, 79390, 79399, 79407, 79416, - 79424, 79432, 79440, 79449, 79457, 79466, 79474, 79481, 79488, 79496, - 79503, 79511, 79518, 79526, 79534, 79543, 79551, 79560, 79568, 79576, - 79584, 79593, 79601, 79608, 79615, 79623, 79630, 79638, 79645, 79655, - 79665, 79675, 79684, 79693, 79702, 79711, 79720, 79730, 79741, 79752, - 79762, 79773, 79784, 79794, 79803, 79812, 79820, 79829, 79838, 79846, - 79855, 79864, 79872, 79881, 79890, 79898, 79907, 79916, 79924, 79933, - 79942, 79950, 79959, 79967, 79976, 79984, 79992, 80001, 80009, 80018, - 80026, 80034, 80043, 80051, 80058, 80065, 80074, 80083, 80091, 80100, - 80109, 80117, 80127, 80135, 80143, 80150, 80158, 80166, 80173, 80183, - 80193, 80204, 80214, 80225, 80233, 80241, 80250, 80258, 80267, 80275, - 80283, 80292, 80300, 80309, 80317, 80324, 80331, 80338, 80345, 80353, - 80361, 80369, 80377, 80386, 80394, 80402, 80411, 80419, 80427, 80435, - 80444, 80452, 80460, 80468, 80476, 80484, 80492, 80500, 80508, 80516, - 80525, 80533, 80541, 80549, 80557, 80565, 80574, 80583, 80591, 80599, - 80607, 80616, 80624, 80633, 80640, 80647, 80655, 80662, 80670, 80678, - 80687, 80695, 80704, 80712, 80720, 80730, 80737, 80744, 80752, 80759, - 80767, 80777, 80788, 80796, 80805, 80813, 80822, 80830, 80839, 80847, - 80856, 80864, 80873, 80882, 80890, 80898, 80906, 80915, 80922, 80930, - 80939, 80948, 80957, 80966, 80974, 80983, 80991, 81000, 81008, 81017, - 81025, 81034, 81042, 81050, 81057, 81065, 81072, 81081, 81089, 81098, - 81106, 81115, 81123, 81131, 81139, 81148, 81156, 81165, 81174, 81183, - 81192, 81201, 81209, 81218, 81226, 81235, 81243, 81252, 81260, 81269, - 81277, 81285, 81292, 81300, 81307, 81316, 81324, 81333, 81341, 81350, - 81358, 81366, 81374, 81383, 81391, 81400, 81409, 81418, 81427, 81435, - 81443, 81452, 81460, 81469, 81478, 81486, 81494, 81502, 81511, 81519, - 81527, 81536, 81544, 81552, 81560, 81568, 81573, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 81578, 81588, 81598, 81608, 81618, 81629, 81639, - 81649, 81660, 81669, 81678, 81687, 81697, 81707, 81717, 81728, 81738, - 81748, 81758, 81768, 81778, 81788, 81798, 81808, 81818, 81828, 81838, - 81849, 81860, 81870, 81880, 81891, 81902, 81913, 81923, 81933, 81943, - 81953, 81963, 81973, 81983, 81994, 82004, 82014, 82025, 82036, 82047, - 82057, 82067, 82077, 82087, 82098, 82108, 82118, 82129, 82140, 82150, - 82160, 82169, 82178, 82187, 82196, 82205, 82215, 0, 0, 82225, 82235, - 82245, 82255, 82265, 82276, 82286, 82296, 82307, 82317, 82328, 82337, - 82346, 82357, 82367, 82378, 82389, 82401, 82411, 82422, 82431, 82441, - 82451, 82463, 82473, 82483, 82493, 82503, 82513, 82522, 82531, 82540, - 82549, 82559, 82569, 82579, 82589, 82599, 82609, 82619, 82629, 82639, - 82649, 82659, 82669, 82678, 82687, 82696, 82706, 82716, 82726, 82736, - 82746, 82757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82767, 82782, - 82797, 82803, 82809, 82815, 82821, 82827, 82833, 82839, 82845, 82853, - 82857, 82860, 0, 0, 82868, 82871, 82874, 82877, 82880, 82883, 82886, - 82889, 82892, 82895, 82898, 82901, 82904, 82907, 82910, 82913, 82916, - 82924, 82933, 82944, 82952, 82960, 82969, 82978, 82989, 83001, 0, 0, 0, - 0, 0, 0, 83010, 83015, 83020, 83027, 83034, 83040, 83046, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83051, 83061, 83071, 83081, 83090, 83101, 83110, 83119, - 83129, 83139, 83151, 83163, 83174, 83185, 83196, 83207, 83217, 83227, - 83237, 83247, 83258, 83269, 83273, 83278, 83287, 83296, 83300, 83304, - 83308, 83313, 83318, 83323, 83328, 83331, 83335, 0, 83340, 83343, 83346, - 83350, 83354, 83359, 83363, 83367, 83372, 83377, 83384, 83391, 83394, - 83397, 83400, 83403, 83406, 83410, 83414, 0, 83418, 83423, 83427, 83431, - 0, 0, 0, 0, 83436, 83441, 83448, 83453, 83458, 0, 83463, 83468, 83473, - 83478, 83483, 83488, 83493, 83498, 83503, 83508, 83513, 83518, 83527, - 83536, 83544, 83552, 83561, 83570, 83579, 83588, 83596, 83604, 83612, - 83620, 83625, 83630, 83636, 83642, 83648, 83654, 83662, 83670, 83676, - 83682, 83688, 83694, 83700, 83706, 83712, 83718, 83723, 83728, 83733, - 83738, 83743, 83748, 83753, 83758, 83764, 83770, 83776, 83782, 83788, - 83794, 83800, 83806, 83812, 83818, 83824, 83830, 83836, 83842, 83848, - 83854, 83860, 83866, 83872, 83878, 83884, 83890, 83896, 83902, 83908, - 83914, 83920, 83926, 83932, 83938, 83944, 83950, 83956, 83962, 83968, - 83974, 83980, 83986, 83992, 83998, 84004, 84010, 84016, 84022, 84028, - 84034, 84040, 84046, 84052, 84058, 84064, 84070, 84076, 84082, 84088, - 84094, 84100, 84106, 84112, 84118, 84123, 84128, 84133, 84138, 84144, - 84150, 84156, 84162, 84168, 84174, 84180, 84186, 84192, 84198, 84204, - 84210, 84215, 84220, 84225, 84230, 84242, 84254, 84265, 84276, 84288, - 84300, 84308, 0, 0, 84316, 0, 84324, 84328, 84332, 84335, 84339, 84343, - 84346, 84349, 84353, 84357, 84360, 84363, 84366, 84369, 84374, 84377, - 84381, 84384, 84387, 84390, 84393, 84396, 84399, 84402, 84405, 84408, - 84411, 84414, 84418, 84422, 84426, 84430, 84435, 84440, 84446, 84452, - 84458, 84463, 84469, 84475, 84481, 84486, 84492, 84498, 84503, 84508, - 84513, 84518, 84524, 84530, 84535, 84540, 84546, 84551, 84557, 84563, - 84569, 84575, 84581, 84585, 84590, 84594, 84599, 84603, 84608, 84613, - 84619, 84625, 84631, 84636, 84642, 84648, 84654, 84659, 84665, 84671, - 84676, 84681, 84686, 84691, 84697, 84703, 84708, 84713, 84719, 84724, - 84730, 84736, 84742, 84748, 84754, 84759, 84763, 84768, 84771, 84776, - 84781, 84787, 84792, 84797, 84801, 84807, 84812, 84817, 84822, 84827, - 84832, 84837, 84842, 84848, 84854, 84860, 84868, 84872, 84876, 84880, - 84884, 84888, 84892, 84897, 84902, 84907, 84912, 84917, 84922, 84927, - 84932, 84937, 84942, 84947, 84952, 84957, 84961, 84965, 84970, 84975, - 84980, 84985, 84989, 84994, 84999, 85004, 85009, 85013, 85018, 85023, - 85028, 85033, 85037, 85042, 85047, 85051, 85056, 85061, 85066, 85071, - 85076, 85080, 85087, 85094, 85098, 85103, 85108, 85113, 85118, 85123, - 85128, 85133, 85138, 85143, 85148, 85153, 85158, 85163, 85168, 85173, - 85178, 85183, 85188, 85193, 85198, 85203, 85208, 85213, 85218, 85223, - 85228, 85233, 85238, 85243, 0, 0, 0, 85248, 85252, 85257, 85261, 85266, - 85271, 0, 0, 85275, 85280, 85285, 85289, 85294, 85299, 0, 0, 85304, - 85309, 85313, 85318, 85323, 85328, 0, 0, 85333, 85338, 85343, 0, 0, 0, - 85347, 85351, 85355, 85359, 85362, 85366, 85370, 0, 85374, 85380, 85383, - 85387, 85390, 85394, 85398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85402, 85408, - 85414, 85420, 85426, 0, 0, 85430, 85436, 85442, 85448, 85454, 85460, - 85467, 85474, 85481, 85488, 85495, 85502, 0, 85509, 85516, 85523, 85529, - 85536, 85543, 85550, 85557, 85563, 85570, 85577, 85584, 85591, 85597, - 85604, 85611, 85618, 85625, 85631, 85638, 85645, 85652, 85659, 85666, - 85673, 85680, 0, 85687, 85693, 85700, 85707, 85714, 85721, 85728, 85735, - 85742, 85749, 85756, 85763, 85770, 85777, 85783, 85790, 85797, 85804, - 85811, 0, 85818, 85825, 0, 85832, 85839, 85846, 85853, 85860, 85867, - 85874, 85881, 85888, 85895, 85902, 85909, 85916, 85923, 85930, 0, 0, - 85936, 85941, 85946, 85951, 85956, 85961, 85966, 85971, 85976, 85981, - 85986, 85991, 85996, 86001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86006, 86013, - 86020, 86027, 86034, 86041, 86048, 86055, 86062, 86069, 86076, 86083, - 86090, 86097, 86104, 86111, 86118, 86125, 86132, 86139, 86147, 86155, - 86162, 86169, 86174, 86182, 86190, 86197, 86204, 86209, 86216, 86221, - 86226, 86233, 86238, 86243, 86248, 86256, 86261, 86266, 86273, 86278, - 86283, 86290, 86297, 86302, 86307, 86312, 86317, 86322, 86327, 86332, - 86337, 86342, 86349, 86354, 86361, 86366, 86371, 86376, 86381, 86386, - 86391, 86396, 86401, 86406, 86411, 86416, 86423, 86430, 86437, 86444, - 86450, 86455, 86462, 86467, 86472, 86481, 86488, 86497, 86504, 86509, - 86514, 86522, 86527, 86532, 86537, 86542, 86547, 86554, 86559, 86564, - 86569, 86574, 86579, 86586, 86593, 86600, 86607, 86614, 86621, 86628, - 86635, 86642, 86649, 86656, 86663, 86670, 86677, 86684, 86691, 86698, - 86705, 86712, 86719, 86726, 86733, 86740, 86747, 86754, 86761, 86768, - 86775, 0, 0, 0, 0, 0, 86782, 86790, 86798, 0, 0, 0, 0, 86803, 86807, - 86811, 86815, 86819, 86823, 86827, 86831, 86835, 86839, 86844, 86849, - 86854, 86859, 86864, 86869, 86874, 86879, 86884, 86890, 86896, 86902, - 86909, 86916, 86923, 86930, 86937, 86944, 86950, 86956, 86962, 86969, - 86976, 86983, 86990, 86997, 87004, 87011, 87018, 87025, 87032, 87039, - 87046, 87053, 87060, 0, 0, 0, 87067, 87075, 87083, 87091, 87099, 87107, - 87117, 87127, 87135, 87143, 87151, 87159, 87167, 87173, 87180, 87189, - 87198, 87207, 87216, 87225, 87234, 87244, 87255, 87265, 87276, 87285, - 87294, 87303, 87313, 87324, 87334, 87345, 87356, 87365, 87373, 87379, - 87385, 87391, 87397, 87405, 87413, 87419, 87426, 87436, 87443, 87450, - 87457, 87464, 87471, 87481, 87488, 87495, 87503, 87511, 87520, 87529, - 87538, 87547, 87556, 87564, 87573, 87582, 87591, 87595, 87602, 87607, - 87612, 87616, 87620, 87624, 87628, 87633, 87638, 87644, 87650, 87654, - 87660, 87664, 87668, 87672, 87676, 87680, 87684, 87690, 0, 0, 0, 0, 0, - 87694, 87699, 87704, 87709, 87714, 87721, 87726, 87731, 87736, 87741, - 87746, 87751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87756, 87763, 87772, 87781, 87788, 87795, 87802, - 87809, 87816, 87823, 87829, 87836, 87843, 87850, 87857, 87864, 87871, - 87878, 87885, 87894, 87901, 87908, 87915, 87922, 87929, 87936, 87943, - 87950, 87959, 87966, 87973, 87980, 87987, 87994, 88001, 88010, 88017, - 88024, 88031, 88038, 88047, 88054, 88061, 88068, 88076, 88085, 0, 0, - 88094, 88098, 88102, 88107, 88112, 88117, 88122, 88126, 88131, 88136, - 88141, 88146, 88151, 88156, 88160, 88164, 88168, 88173, 88178, 88182, - 88187, 88192, 88196, 88200, 88205, 88210, 88215, 88220, 88225, 0, 0, 0, - 88230, 88234, 88239, 88244, 88248, 88253, 88257, 88262, 88267, 88272, - 88277, 88281, 88285, 88290, 88295, 88300, 88305, 88309, 88314, 88318, - 88323, 88328, 88332, 88337, 88342, 88347, 88351, 88355, 88360, 88365, - 88370, 88375, 88380, 88385, 88390, 88395, 88400, 88405, 88410, 88415, - 88420, 88425, 88430, 88435, 88440, 88445, 88450, 88455, 88460, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88465, 88469, - 88474, 88479, 88484, 88488, 88493, 88498, 88503, 88508, 88512, 88516, - 88521, 88526, 88531, 88536, 88540, 88545, 88550, 88555, 88560, 88565, - 88570, 88574, 88579, 88584, 88589, 88594, 88599, 88604, 88609, 0, 88614, - 88619, 88624, 88630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88636, 88641, - 88646, 88651, 88656, 88661, 88666, 88671, 88676, 88681, 88686, 88691, - 88696, 88701, 88706, 88711, 88716, 88721, 88726, 88731, 88736, 88741, - 88746, 88751, 88756, 88761, 88766, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88773, 88778, 88783, - 88788, 88793, 88798, 88803, 88808, 88813, 88818, 88823, 88828, 88833, - 88838, 88843, 88848, 88853, 88858, 88863, 88868, 88873, 88878, 88883, - 88888, 88893, 88898, 88903, 88907, 88911, 88915, 0, 88920, 88926, 88931, - 88936, 88941, 88946, 88952, 88958, 88964, 88970, 88976, 88982, 88988, - 88994, 89000, 89006, 89012, 89018, 89024, 89029, 89035, 89041, 89046, - 89052, 89057, 89063, 89069, 89074, 89080, 89086, 89091, 89097, 89103, - 89109, 89115, 89121, 89127, 0, 0, 0, 0, 89132, 89138, 89144, 89150, - 89156, 89162, 89168, 89174, 89180, 89187, 89192, 89197, 89203, 89209, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89215, 89220, 89225, - 89230, 89236, 89241, 89247, 89253, 89259, 89265, 89272, 89278, 89285, - 89290, 89295, 89300, 89305, 89310, 89315, 89320, 89325, 89330, 89335, - 89340, 89345, 89350, 89355, 89360, 89365, 89370, 89375, 89380, 89385, - 89390, 89395, 89400, 89405, 89410, 89415, 89420, 89425, 89430, 89435, - 89440, 89446, 89451, 89457, 89463, 89469, 89475, 89482, 89488, 89495, - 89500, 89505, 89510, 89515, 89520, 89525, 89530, 89535, 89540, 89545, - 89550, 89555, 89560, 89565, 89570, 89575, 89580, 89585, 89590, 89595, - 89600, 89605, 89610, 89615, 89620, 89625, 89630, 89635, 89640, 89645, - 89650, 89655, 89660, 89665, 89670, 89675, 89680, 89685, 89690, 89695, - 89700, 89705, 89710, 89715, 89720, 89725, 89730, 89735, 89740, 89745, - 89750, 89755, 89760, 89765, 89770, 89775, 89780, 89785, 89790, 89795, - 89800, 89805, 89810, 89815, 89820, 89825, 89830, 89835, 89840, 89845, - 89850, 89855, 89860, 89865, 89870, 89875, 89880, 89885, 89890, 89895, - 89900, 89905, 89910, 89914, 89919, 89924, 89929, 89934, 89939, 89944, - 89949, 89954, 89959, 89964, 89969, 89974, 89978, 89982, 89986, 89990, - 89994, 89998, 90002, 90007, 90012, 0, 0, 90017, 90022, 90026, 90030, - 90034, 90038, 90042, 90046, 90050, 90054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90058, 90062, 90066, 90070, 90074, 90078, 0, 0, 90083, 0, - 90088, 90092, 90097, 90102, 90107, 90112, 90117, 90122, 90127, 90132, - 90137, 90141, 90146, 90151, 90156, 90161, 90165, 90170, 90175, 90180, - 90185, 90189, 90194, 90199, 90204, 90209, 90213, 90218, 90223, 90228, - 90233, 90238, 90243, 90248, 90253, 90258, 90263, 90268, 90273, 90277, - 90282, 90287, 90292, 90297, 0, 90302, 90307, 0, 0, 0, 90312, 0, 0, 90317, - 90322, 90329, 90336, 90343, 90350, 90357, 90364, 90371, 90378, 90385, - 90392, 90399, 90406, 90413, 90420, 90427, 90434, 90441, 90448, 90455, - 90462, 90469, 0, 90476, 90483, 90489, 90495, 90501, 90508, 90515, 90523, - 90531, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90540, 90545, 90550, 90555, 90560, 90565, - 90570, 90575, 90580, 90585, 90590, 90595, 90600, 90605, 90610, 90615, - 90620, 90625, 90630, 90635, 90640, 90645, 90650, 90654, 90659, 90664, - 90670, 90674, 0, 0, 0, 90678, 90684, 90688, 90693, 90698, 90703, 90707, - 90712, 90716, 90721, 90726, 90730, 90734, 90738, 90742, 90746, 90751, - 90756, 90760, 90765, 90770, 90774, 90779, 90784, 90789, 90794, 90799, 0, - 0, 0, 0, 0, 90804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90809, - 90813, 90818, 90823, 0, 90829, 90834, 0, 0, 0, 0, 0, 90839, 90845, 90852, - 90857, 90862, 90866, 90871, 90876, 0, 90881, 90886, 90891, 0, 90896, - 90901, 90906, 90911, 90916, 90921, 90926, 90931, 90936, 90941, 90946, - 90950, 90954, 90959, 90964, 90969, 90973, 90977, 90981, 90986, 90991, - 90996, 91001, 91006, 91011, 91015, 91020, 0, 0, 0, 0, 91025, 91031, - 91036, 0, 0, 0, 0, 91041, 91045, 91049, 91053, 91057, 91061, 91066, - 91071, 91077, 0, 0, 0, 0, 0, 0, 0, 0, 91083, 91089, 91096, 91102, 91109, - 91115, 91121, 91127, 91134, 0, 0, 0, 0, 0, 0, 0, 91140, 91148, 91156, - 91164, 91172, 91180, 91188, 91196, 91204, 91212, 91220, 91228, 91236, - 91244, 91252, 91260, 91268, 91276, 91284, 91292, 91300, 91308, 91316, - 91324, 91332, 91340, 91348, 91356, 91364, 91372, 91379, 91387, 91395, - 91399, 91404, 91409, 91414, 91419, 91424, 91429, 91434, 91438, 91443, - 91447, 91452, 91456, 91461, 91465, 91470, 91475, 91480, 91485, 91490, - 91495, 91500, 91505, 91510, 91515, 91520, 91525, 91530, 91535, 91540, - 91545, 91550, 91555, 91560, 91565, 91570, 91575, 91580, 91585, 91590, - 91595, 91600, 91605, 91610, 91615, 91620, 91625, 91630, 91635, 91640, - 91645, 91650, 91655, 0, 0, 0, 91660, 91665, 91674, 91682, 91691, 91700, - 91711, 91722, 91729, 91736, 91743, 91750, 91757, 91764, 91771, 91778, - 91785, 91792, 91799, 91806, 91813, 91820, 91827, 91834, 91841, 91848, - 91855, 91862, 91869, 0, 0, 91876, 91882, 91888, 91894, 91900, 91907, - 91914, 91922, 91930, 91937, 91944, 91951, 91958, 91965, 91972, 91979, - 91986, 91993, 92000, 92007, 92014, 92021, 92028, 92035, 92042, 92049, - 92056, 0, 0, 0, 0, 0, 92063, 92069, 92075, 92081, 92087, 92094, 92101, - 92109, 92117, 92123, 92129, 92136, 92142, 92148, 92154, 92160, 92167, - 92174, 92181, 92188, 92195, 92202, 92209, 92216, 92223, 92230, 92237, - 92244, 92251, 92258, 92265, 92272, 92279, 92286, 92293, 92300, 92307, - 92314, 92321, 92328, 92335, 92342, 92349, 92356, 92363, 92370, 92377, - 92384, 92391, 92398, 92405, 92412, 92419, 92426, 92433, 92440, 92447, - 92454, 92461, 92468, 92475, 92482, 92489, 92496, 92503, 92510, 92517, - 92524, 92531, 92538, 92545, 92552, 92559, 92566, 92573, 92580, 92587, - 92594, 92601, 92608, 92615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92622, 92626, 92630, - 92634, 92638, 92642, 92646, 92650, 92654, 92658, 92663, 92668, 92673, - 92678, 92683, 92688, 92693, 92698, 92703, 92709, 92715, 92721, 92728, - 92735, 92742, 92749, 92756, 92763, 92770, 92777, 92784, 0, 92791, 92795, - 92799, 92803, 92807, 92811, 92814, 92818, 92821, 92825, 92828, 92832, - 92836, 92841, 92845, 92850, 92853, 92857, 92860, 92864, 92867, 92871, - 92875, 92879, 92883, 92887, 92891, 92895, 92899, 92903, 92907, 92911, - 92915, 92919, 92923, 92927, 92931, 92935, 92939, 92942, 92945, 92949, - 92953, 92957, 92960, 92963, 92966, 92970, 92974, 92978, 92982, 92986, - 92989, 92993, 92999, 93005, 93011, 93016, 93023, 93027, 93032, 93036, - 93041, 93046, 93052, 93057, 93063, 93067, 93072, 93076, 93081, 93084, - 93087, 93091, 93096, 93102, 93107, 93113, 0, 0, 0, 0, 93118, 93121, - 93124, 93127, 93130, 93133, 93136, 93139, 93142, 93145, 93149, 93153, - 93157, 93161, 93165, 93169, 93173, 93177, 93181, 93186, 93191, 93195, - 93198, 93201, 93204, 93207, 93210, 93213, 93216, 93219, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93222, 93226, 93230, 93234, 93237, 93241, - 93244, 93248, 93251, 93255, 93258, 93262, 93265, 93269, 93272, 93276, - 93280, 93284, 93288, 93292, 93296, 93300, 93304, 93308, 93312, 93316, - 93320, 93324, 93328, 93332, 93336, 93340, 93344, 93348, 93352, 93355, - 93358, 93362, 93366, 93370, 93373, 93376, 93379, 93383, 93387, 93391, - 93395, 93399, 93402, 93407, 93411, 93416, 93420, 93425, 93429, 93434, - 93438, 93443, 93447, 93451, 93455, 93459, 93462, 93466, 93471, 93474, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93478, 93481, 93486, 93492, 93500, - 93505, 93511, 93519, 93525, 93531, 93535, 93539, 93546, 93555, 93562, - 93571, 93577, 93586, 93593, 93600, 93607, 93617, 93623, 93627, 93634, - 93643, 93653, 93660, 93667, 93671, 93675, 93682, 93692, 93696, 93703, - 93710, 93717, 93723, 93730, 93737, 93744, 93751, 93755, 93759, 93763, - 93770, 93774, 93781, 93788, 93802, 93811, 93815, 93819, 93823, 93830, - 93834, 93838, 93842, 93850, 93858, 93877, 93887, 93907, 93911, 93915, - 93919, 93923, 93927, 93931, 93935, 93942, 93946, 93949, 93953, 93957, - 93963, 93970, 93979, 93983, 93992, 94001, 94009, 94013, 94020, 94024, - 94028, 94032, 94036, 94047, 94056, 94065, 94074, 94083, 94095, 94104, - 94113, 94122, 94130, 94139, 94151, 94160, 94169, 94178, 94190, 94199, - 94208, 94220, 94229, 94238, 94250, 94259, 94263, 94267, 94271, 94275, - 94279, 94283, 94287, 94294, 94298, 94302, 94313, 94317, 94321, 94328, - 94334, 94340, 94344, 94351, 94355, 94359, 94363, 94367, 94371, 94375, - 94381, 94389, 94393, 94397, 94400, 94406, 94416, 94420, 94432, 94439, - 94446, 94453, 94460, 94466, 94470, 94474, 94478, 94482, 94489, 94498, - 94505, 94513, 94521, 94527, 94531, 94535, 94539, 94543, 94549, 94558, - 94570, 94577, 94584, 94593, 94604, 94610, 94619, 94628, 94635, 94644, - 94651, 94658, 94668, 94675, 94682, 94689, 94696, 94700, 94706, 94710, - 94721, 94729, 94738, 94750, 94757, 94764, 94774, 94781, 94790, 94797, - 94806, 94813, 94820, 94830, 94837, 94844, 94854, 94861, 94873, 94882, - 94889, 94896, 94903, 94912, 94922, 94935, 94942, 94952, 94962, 94969, - 94978, 94991, 94998, 95005, 95012, 95022, 95032, 95039, 95049, 95056, - 95063, 95073, 95079, 95086, 95093, 95100, 95110, 95117, 95124, 95131, - 95137, 95144, 95154, 95161, 95165, 95173, 95177, 95189, 95193, 95207, - 95211, 95215, 95219, 95223, 95229, 95236, 95244, 95248, 95252, 95256, - 95260, 95267, 95271, 95277, 95283, 95291, 95295, 95302, 95310, 95314, - 95318, 95324, 95328, 95337, 95346, 95353, 95363, 95369, 95373, 95377, - 95385, 95392, 95399, 95405, 95409, 95417, 95421, 95428, 95440, 95447, - 95457, 95463, 95467, 95476, 95483, 95492, 95496, 95500, 95507, 95511, - 95515, 95519, 95523, 95526, 95532, 95538, 95542, 95546, 95553, 95560, - 95567, 95574, 95581, 95588, 95595, 95602, 95608, 95612, 95616, 95623, - 95630, 95637, 95644, 95651, 95655, 95658, 95663, 95667, 95671, 95680, - 95689, 95693, 95697, 95703, 95709, 95726, 95732, 95736, 95745, 95749, - 95753, 95760, 95768, 95776, 95782, 95786, 95790, 95794, 95798, 95801, - 95807, 95814, 95824, 95831, 95838, 95845, 95851, 95858, 95865, 95872, - 95879, 95886, 95895, 95902, 95914, 95921, 95928, 95938, 95949, 95956, - 95963, 95970, 95977, 95984, 95991, 95998, 96005, 96012, 96019, 96029, - 96039, 96049, 96056, 96066, 96073, 96080, 96087, 96094, 96101, 96108, - 96115, 96122, 96129, 96136, 96143, 96150, 96157, 96163, 96170, 96177, - 96186, 96193, 96200, 96204, 96212, 96216, 96220, 96224, 96228, 96232, - 96239, 96243, 96252, 96256, 96263, 96271, 96275, 96279, 96283, 96296, - 96312, 96316, 96320, 96327, 96333, 96340, 96344, 96348, 96352, 96356, - 96360, 96367, 96371, 96389, 96393, 96397, 96404, 96408, 96412, 96418, - 96422, 96426, 96434, 96438, 96442, 96446, 96450, 96456, 96467, 96476, - 96485, 96492, 96499, 96510, 96517, 96524, 96531, 96538, 96545, 96552, - 96559, 96569, 96575, 96582, 96592, 96601, 96608, 96617, 96627, 96634, - 96641, 96648, 96655, 96667, 96674, 96681, 96688, 96695, 96702, 96712, - 96719, 96726, 96736, 96749, 96761, 96768, 96778, 96785, 96792, 96799, - 96813, 96819, 96827, 96837, 96847, 96854, 96861, 96867, 96871, 96878, - 96888, 96894, 96907, 96911, 96915, 96922, 96926, 96933, 96943, 96947, - 96951, 96955, 96959, 96963, 96970, 96974, 96981, 96988, 96995, 97004, - 97013, 97023, 97030, 97037, 97044, 97054, 97061, 97071, 97078, 97088, - 97095, 97102, 97112, 97122, 97129, 97135, 97143, 97151, 97157, 97163, - 97167, 97171, 97178, 97186, 97192, 97196, 97200, 97204, 97211, 97223, - 97226, 97233, 97239, 97243, 97247, 97251, 97255, 97259, 97263, 97267, - 97271, 97275, 97279, 97286, 97290, 97296, 97300, 97304, 97308, 97314, - 97321, 97328, 97335, 97346, 97354, 97358, 97364, 97373, 97380, 97386, - 97389, 97393, 97397, 97403, 97412, 97420, 97424, 97430, 97434, 97438, - 97442, 97448, 97455, 97461, 97465, 97471, 97475, 97479, 97488, 97500, - 97504, 97511, 97518, 97528, 97535, 97547, 97554, 97561, 97568, 97579, - 97589, 97602, 97612, 97619, 97623, 97627, 97631, 97635, 97644, 97653, - 97662, 97679, 97688, 97694, 97701, 97709, 97722, 97726, 97735, 97744, - 97753, 97762, 97773, 97782, 97791, 97800, 97809, 97818, 97827, 97837, - 97840, 97844, 97848, 97852, 97856, 97860, 97866, 97873, 97880, 97887, - 97893, 97899, 97906, 97912, 97919, 97927, 97931, 97938, 97945, 97952, - 97960, 97963, 97967, 97971, 97975, 97979, 97985, 97989, 97995, 98002, - 98009, 98015, 98022, 98029, 98036, 98043, 98050, 98057, 98064, 98071, - 98078, 98085, 98092, 98099, 98106, 98113, 98119, 98123, 98132, 98136, - 98140, 98144, 98148, 98154, 98161, 98168, 98175, 98182, 98189, 98195, - 98203, 98207, 98211, 98215, 98219, 98225, 98242, 98259, 98263, 98267, - 98271, 98275, 98279, 98283, 98289, 98296, 98300, 98306, 98313, 98320, - 98327, 98334, 98341, 98350, 98357, 98364, 98371, 98378, 98382, 98386, - 98392, 98404, 98408, 98412, 98421, 98425, 98429, 98433, 98439, 98443, - 98447, 98456, 98460, 98464, 98468, 98475, 98479, 98483, 98487, 98491, - 98495, 98499, 98503, 98507, 98513, 98520, 98527, 98533, 98537, 98554, - 98560, 98564, 98570, 98576, 98582, 98588, 98594, 98600, 98604, 98608, - 98612, 98618, 98622, 98628, 98632, 98636, 98643, 98650, 98667, 98671, - 98675, 98679, 98683, 98687, 98699, 98702, 98707, 98712, 98727, 98737, - 98749, 98753, 98757, 98761, 98767, 98774, 98781, 98791, 98803, 98809, - 98815, 98824, 98828, 98832, 98839, 98849, 98856, 98862, 98866, 98870, - 98877, 98883, 98887, 98893, 98897, 98905, 98911, 98915, 98923, 98931, - 98938, 98944, 98951, 98958, 98968, 98978, 98982, 98986, 98990, 98994, - 99000, 99007, 99013, 99020, 99027, 99034, 99043, 99050, 99057, 99063, - 99070, 99077, 99084, 99091, 99098, 99105, 99111, 99118, 99125, 99132, - 99141, 99148, 99155, 99159, 99165, 99169, 99175, 99182, 99189, 99196, - 99200, 99204, 99208, 99212, 99216, 99223, 99227, 99231, 99237, 99245, - 99249, 99253, 99257, 99261, 99268, 99272, 99276, 99284, 99288, 99292, - 99296, 99300, 99306, 99310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99314, 99320, 99326, 99333, 99340, 99347, 99354, 99361, 99368, - 99374, 99381, 99388, 99395, 99402, 99409, 99416, 99422, 99428, 99434, - 99440, 99446, 99452, 99458, 99464, 99470, 99477, 99484, 99491, 99498, - 99505, 99512, 99518, 99524, 99530, 99537, 99544, 99550, 99556, 99565, - 99572, 99579, 99586, 99593, 99600, 99607, 99613, 99619, 99625, 99634, - 99641, 99648, 99659, 99670, 99676, 99682, 99688, 99697, 99704, 99711, - 99721, 99731, 99742, 99753, 99765, 99778, 99789, 99800, 99812, 99825, - 99836, 99847, 99858, 99869, 99880, 99892, 99900, 99908, 99917, 99926, - 99935, 99941, 99947, 99953, 99960, 99970, 99977, 99987, 99992, 99997, - 100003, 100009, 100017, 100025, 100034, 100045, 100056, 100064, 100072, - 100081, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100090, 100101, 100108, - 100116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100124, 100128, 100132, - 100136, 100140, 100144, 100148, 100152, 100156, 100160, 100164, 100168, - 100172, 100176, 100180, 100184, 100188, 100192, 100196, 100200, 100204, - 100208, 100212, 100216, 100220, 100224, 100228, 100232, 100236, 100240, - 100244, 100248, 100252, 100256, 100260, 100264, 100268, 100272, 100276, - 100280, 100284, 100288, 100292, 100296, 100300, 100304, 100308, 100312, - 100316, 100320, 100324, 100328, 100332, 100336, 100340, 100344, 100348, - 100352, 100356, 100360, 100364, 100368, 100372, 100376, 100380, 100384, - 100388, 100392, 100396, 100400, 100404, 100408, 100412, 100416, 100420, - 100424, 100428, 100432, 100436, 100440, 100444, 100448, 100452, 100456, - 100460, 100464, 100468, 100472, 100476, 100480, 100484, 100488, 100492, - 100496, 100500, 100504, 100508, 100512, 100516, 100520, 100524, 100528, - 100532, 100536, 100540, 100544, 100548, 100552, 100556, 100560, 100564, - 100568, 100572, 100576, 100580, 100584, 100588, 100592, 100596, 100600, - 100604, 100608, 100612, 100616, 100620, 100624, 100628, 100632, 100636, - 100640, 100644, 100648, 100652, 100656, 100660, 100664, 100668, 100672, - 100676, 100680, 100684, 100688, 100692, 100696, 100700, 100704, 100708, - 100712, 100716, 100720, 100724, 100728, 100732, 100736, 100740, 100744, - 100748, 100752, 100756, 100760, 100764, 100768, 100772, 100776, 100780, - 100784, 100788, 100792, 100796, 100800, 100804, 100808, 100812, 100816, - 100820, 100824, 100828, 100832, 100836, 100840, 100844, 100848, 100852, - 100856, 100860, 100864, 100868, 100872, 100876, 100880, 100884, 100888, - 100892, 100896, 100900, 100904, 100908, 100912, 100916, 100920, 100924, - 100928, 100932, 100936, 100940, 100944, 100948, 100952, 100956, 100960, - 100964, 100968, 100972, 100976, 100980, 100984, 100988, 100992, 100996, - 101000, 101004, 101008, 101012, 101016, 101020, 101024, 101028, 101032, - 101036, 101040, 101044, 101048, 101052, 101056, 101060, 101064, 101068, - 101072, 101076, 101080, 101084, 101088, 101092, 101096, 101100, 101104, - 101108, 101112, 101116, 101120, 101124, 101128, 101132, 101136, 101140, - 101144, 101148, 101152, 101156, 101160, 101164, 101168, 101172, 101176, - 101180, 101184, 101188, 101192, 101196, 101200, 101204, 101208, 101212, - 101216, 101220, 101224, 101228, 101232, 101236, 101240, 101244, 101248, - 101252, 101256, 101260, 101264, 101268, 101272, 101276, 101280, 101284, - 101288, 101292, 101296, 101300, 101304, 101308, 101312, 101316, 101320, - 101324, 101328, 101332, 101336, 101340, 101344, 101348, 101352, 101356, - 101360, 101364, 101368, 101372, 101376, 101380, 101384, 101388, 101392, - 101396, 101400, 101404, 101408, 101412, 101416, 101420, 101424, 101428, - 101432, 101436, 101440, 101444, 101448, 101452, 101456, 101460, 101464, - 101468, 101472, 101476, 101480, 101484, 101488, 101492, 101496, 101500, - 101504, 101508, 101512, 101516, 101520, 101524, 101528, 101532, 101536, - 101540, 101544, 101548, 101552, 101556, 101560, 101564, 101568, 101572, - 101576, 101580, 101584, 101588, 101592, 101596, 101600, 101604, 101608, - 101612, 101616, 101620, 101624, 101628, 101632, 101636, 101640, 101644, - 101648, 101652, 101656, 101660, 101664, 101668, 101672, 101676, 101680, - 101684, 101688, 101692, 101696, 101700, 101704, 101708, 101712, 101716, - 101720, 101724, 101728, 101732, 101736, 101740, 101744, 101748, 101752, - 101756, 101760, 101764, 101768, 101772, 101776, 101780, 101784, 101788, - 101792, 101796, 101800, 101804, 101808, 101812, 101816, 101820, 101824, - 101828, 101832, 101836, 101840, 101844, 101848, 101852, 101856, 101860, - 101864, 101868, 101872, 101876, 101880, 101884, 101888, 101892, 101896, - 101900, 101904, 101908, 101912, 101916, 101920, 101924, 101928, 101932, - 101936, 101940, 101944, 101948, 101952, 101956, 101960, 101964, 101968, - 101972, 101976, 101980, 101984, 101988, 101992, 101996, 102000, 102004, - 102008, 102012, 102016, 102020, 102024, 102028, 102032, 102036, 102040, - 102044, 102048, 102052, 102056, 102060, 102064, 102068, 102072, 102076, - 102080, 102084, 102088, 102092, 102096, 102100, 102104, 102108, 102112, - 102116, 102120, 102124, 102128, 102132, 102136, 102140, 102144, 102148, - 102152, 102156, 102160, 102164, 102168, 102172, 102176, 102180, 102184, - 102188, 102192, 102196, 102200, 102204, 102208, 102212, 102216, 102220, - 102224, 102228, 102232, 102236, 102240, 102244, 102248, 102252, 102256, - 102260, 102264, 102268, 102272, 102276, 102280, 102284, 102288, 102292, - 102296, 102300, 102304, 102308, 102312, 102316, 102320, 102324, 102328, - 102332, 102336, 102340, 102344, 102348, 102352, 102356, 102360, 102364, - 102368, 102372, 102376, 102380, 102384, 102388, 102392, 102396, 102400, - 102404, 102408, 102412, 102416, 102420, 102424, 102428, 102432, 102436, - 102440, 102444, 102448, 102452, 102456, 102460, 102464, 102468, 102472, - 102476, 102480, 102484, 102488, 102492, 102496, 102500, 102504, 102508, - 102512, 102516, 102520, 102524, 102528, 102532, 102536, 102540, 102544, - 102548, 102552, 102556, 102560, 102564, 102568, 102572, 102576, 102580, - 102584, 102588, 102592, 102596, 102600, 102604, 102608, 102612, 102616, - 102620, 102624, 102628, 102632, 102636, 102640, 102644, 102648, 102652, - 102656, 102660, 102664, 102668, 102672, 102676, 102680, 102684, 102688, - 102692, 102696, 102700, 102704, 102708, 102712, 102716, 102720, 102724, - 102728, 102732, 102736, 102740, 102744, 102748, 102752, 102756, 102760, - 102764, 102768, 102772, 102776, 102780, 102784, 102788, 102792, 102796, - 102800, 102804, 102808, 102812, 102816, 102820, 102824, 102828, 102832, - 102836, 102840, 102844, 102848, 102852, 102856, 102860, 102864, 102868, - 102872, 102876, 102880, 102884, 102888, 102892, 102896, 102900, 102904, - 102908, 102912, 102916, 102920, 102924, 102928, 102932, 102936, 102940, - 102944, 102948, 102952, 102956, 102960, 102964, 102968, 102972, 102976, - 102980, 102984, 102988, 102992, 102996, 103000, 103004, 103008, 103012, - 103016, 103020, 103024, 103028, 103032, 103036, 103040, 103044, 103048, - 103052, 103056, 103060, 103064, 103068, 103072, 103076, 103080, 103084, - 103088, 103092, 103096, 103100, 103104, 103108, 103112, 103116, 103120, - 103124, 103128, 103132, 103136, 103140, 103144, 103148, 103152, 103156, - 103160, 103164, 103168, 103172, 103176, 103180, 103184, 103188, 103192, - 103196, 103200, 103204, 103208, 103212, 103216, 103220, 103224, 103228, - 103232, 103236, 103240, 103244, 103248, 103252, 103256, 103260, 103264, - 103268, 103272, 103276, 103280, 103284, 103288, 103292, 103296, 103300, - 103304, 103308, 103312, 103316, 103320, 103324, 103328, 103332, 103336, - 103340, 103344, 103348, 103352, 103356, 103360, 103364, 103368, 103372, - 103376, 103380, 103384, 103388, 103392, 103396, 103400, 103404, 103408, - 103412, 103416, 103420, 103424, 103428, 103432, 103436, 103440, 103444, - 103448, 103452, 103456, 103460, 103464, 103468, 103472, 103476, 103480, - 103484, 103488, 103492, 103496, 103500, 103504, 103508, 103512, 103516, - 103520, 103524, 103528, 103532, 103536, 103540, 103544, 103548, 103552, - 103556, 103560, 103564, 103568, 103572, 103576, 103580, 103584, 103588, - 103592, 103596, 103600, 103604, 103608, 103612, 103616, 103620, 103624, - 103628, 103632, 103636, 103640, 103644, 103648, 103652, 103656, 103660, - 103664, 103668, 103672, 103676, 103680, 103684, 103688, 103692, 103696, - 103700, 103704, 103708, 103712, 103716, 103720, 103724, 103728, 103732, - 103736, 103740, 103744, 103748, 103752, 103756, 103760, 103764, 103768, - 103772, 103776, 103780, 103784, 103788, 103792, 103796, 103800, 103804, - 103808, 103812, 103816, 103820, 103824, 103828, 103832, 103836, 103840, - 103844, 103848, 103852, 103856, 103860, 103864, 103868, 103872, 103876, - 103880, 103884, 103888, 103892, 103896, 103900, 103904, 103908, 103912, - 103916, 103920, 103924, 103928, 103932, 103936, 103940, 103944, 103948, - 103952, 103956, 103960, 103964, 103968, 103972, 103976, 103980, 103984, - 103988, 103992, 103996, 104000, 104004, 104008, 104012, 104016, 104020, - 104024, 104028, 104032, 104036, 104040, 104044, 104048, 104052, 104056, - 104060, 104064, 104068, 104072, 104076, 104080, 104084, 104088, 104092, - 104096, 104100, 104104, 104108, 104112, 104116, 104120, 104124, 104128, - 104132, 104136, 104140, 104144, 104148, 104152, 104156, 104160, 104164, - 104168, 104172, 104176, 104180, 104184, 104188, 104192, 104196, 104200, - 104204, 104208, 104212, 104216, 104220, 104224, 104228, 104232, 104236, - 104240, 104244, 104248, 104252, 104256, 104260, 104264, 104268, 104272, - 104276, 104280, 104284, 104288, 104292, 104296, 104300, 104304, 104308, - 104312, 104316, 104320, 104324, 104328, 104332, 104336, 104340, 104344, - 104348, 104352, 104356, 104360, 104364, 104368, 104372, 104376, 104380, - 104384, 104388, 104392, 104396, 104400, 104404, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 104408, 104415, 104422, 104431, 104440, 104447, 104452, 104459, - 104466, 104475, 104486, 104497, 104502, 104509, 104514, 104519, 104524, - 104529, 104534, 104539, 104544, 104549, 104554, 104559, 104564, 104571, - 104578, 104583, 104588, 104593, 104598, 104605, 104612, 104620, 104625, - 104632, 104637, 104642, 104647, 104652, 104657, 104664, 104671, 104676, - 104681, 104686, 104691, 104696, 104701, 104706, 104711, 104716, 104721, - 104726, 104731, 104736, 104741, 104746, 104751, 104756, 104761, 104766, - 104773, 104778, 104783, 104792, 104799, 104804, 104809, 104814, 104819, - 104824, 104829, 104834, 104839, 104844, 104849, 104854, 104859, 104864, - 104869, 104874, 104879, 104884, 104889, 104894, 104899, 104904, 104910, - 104918, 104924, 104932, 104940, 104948, 104954, 104960, 104966, 104972, - 104978, 104986, 104996, 105004, 105012, 105018, 105024, 105032, 105040, - 105046, 105054, 105062, 105070, 105076, 105082, 105088, 105094, 105100, - 105106, 105114, 105122, 105128, 105134, 105140, 105146, 105152, 105160, - 105166, 105172, 105178, 105184, 105190, 105196, 105204, 105210, 105216, - 105222, 105228, 105236, 105244, 105250, 105256, 105262, 105267, 105273, - 105279, 105286, 105291, 105296, 105301, 105306, 105311, 105316, 105321, - 105326, 105331, 105340, 105347, 105352, 105357, 105362, 105369, 105374, - 105379, 105384, 105391, 105396, 105401, 105406, 105411, 105416, 105421, - 105426, 105431, 105436, 105441, 105446, 105453, 105458, 105465, 105470, - 105475, 105482, 105487, 105492, 105497, 105502, 105507, 105512, 105517, - 105522, 105527, 105532, 105537, 105542, 105547, 105552, 105557, 105562, - 105567, 105572, 105577, 105584, 105589, 105594, 105599, 105604, 105609, - 105614, 105619, 105624, 105629, 105634, 105639, 105644, 105649, 105656, - 105661, 105666, 105673, 105678, 105683, 105688, 105693, 105698, 105703, - 105708, 105713, 105718, 105723, 105730, 105735, 105740, 105745, 105750, - 105755, 105762, 105769, 105774, 105779, 105784, 105789, 105794, 105799, - 105804, 105809, 105814, 105819, 105824, 105829, 105834, 105839, 105844, - 105849, 105854, 105859, 105864, 105869, 105874, 105879, 105884, 105889, - 105894, 105899, 105904, 105909, 105914, 105919, 105924, 105929, 105934, - 105939, 105944, 105949, 105956, 105961, 105966, 105971, 105976, 105981, - 105986, 105991, 105996, 106001, 106006, 106011, 106016, 106021, 106026, - 106031, 106036, 106041, 106046, 106051, 106056, 106061, 106066, 106071, - 106076, 106081, 106086, 106091, 106096, 106101, 106106, 106111, 106116, - 106121, 106126, 106131, 106136, 106141, 106146, 106151, 106156, 106161, - 106166, 106171, 106176, 106181, 106186, 106191, 106196, 106201, 106206, - 106211, 106216, 106221, 106226, 106231, 106236, 106241, 106246, 106253, - 106258, 106263, 106268, 106273, 106278, 106283, 106287, 106292, 106297, - 106302, 106307, 106312, 106317, 106322, 106327, 106332, 106337, 106342, - 106347, 106352, 106357, 106364, 106369, 106374, 106380, 106385, 106390, - 106395, 106400, 106405, 106410, 106415, 106420, 106425, 106430, 106435, - 106440, 106445, 106450, 106455, 106460, 106465, 106470, 106475, 106480, - 106485, 106490, 106495, 106500, 106505, 106510, 106515, 106520, 106525, - 106530, 106535, 106540, 106545, 106550, 106555, 106560, 106565, 106570, - 106575, 106580, 106585, 106590, 106595, 106602, 106607, 106612, 106619, - 106626, 106631, 106636, 106641, 106646, 106651, 106656, 106661, 106666, - 106671, 106676, 106681, 106686, 106691, 106696, 106701, 106706, 106711, - 106716, 106721, 106726, 106731, 106736, 106741, 106746, 106751, 106758, - 106763, 106768, 106773, 106778, 106783, 106788, 106793, 106798, 106803, - 106808, 106813, 106818, 106823, 106828, 106833, 106838, 106843, 106848, - 106855, 106860, 106865, 106870, 106875, 106880, 106885, 106890, 106896, - 106901, 106906, 106911, 106916, 106921, 106926, 106931, 106936, 106943, - 106950, 106955, 106960, 106964, 106969, 106973, 106977, 106982, 106989, - 106994, 106999, 107008, 107013, 107018, 107023, 107028, 107035, 107042, - 107047, 107052, 107057, 107062, 107069, 107074, 107079, 107084, 107089, - 107094, 107099, 107104, 107109, 107114, 107119, 107124, 107129, 107136, - 107140, 107145, 107150, 107155, 107160, 107164, 107169, 107174, 107179, - 107184, 107189, 107194, 107199, 107204, 107209, 107215, 107221, 107227, - 107233, 107239, 107245, 107251, 107257, 107263, 107269, 107275, 107281, - 107286, 107292, 107298, 107304, 107310, 107316, 107322, 107328, 107334, - 107340, 107346, 107352, 107357, 107363, 107369, 107375, 107381, 107387, - 107393, 107399, 107405, 107411, 107417, 107423, 107429, 107435, 107441, - 107447, 107453, 107459, 107465, 107471, 107477, 107482, 107488, 107494, - 107500, 107506, 107512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 107518, 107523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107529, 107534, - 107539, 107544, 107551, 107558, 107565, 107572, 107577, 107582, 107587, - 107592, 107599, 107604, 107611, 107618, 107623, 107628, 107633, 107640, - 107645, 107650, 107657, 107664, 107669, 107674, 107679, 107686, 107693, - 107700, 107705, 107710, 107717, 107724, 107731, 107738, 107743, 107748, - 107753, 107760, 107765, 107770, 107775, 107782, 107791, 107798, 107803, - 107808, 107813, 107818, 107823, 107828, 107837, 107844, 107849, 107856, - 107863, 107868, 107873, 107878, 107885, 107890, 107897, 107904, 107909, - 107914, 107919, 107926, 107933, 107938, 107943, 107950, 107957, 107964, - 107969, 107974, 107979, 107984, 107991, 108000, 108009, 108014, 108021, - 108030, 108035, 108040, 108045, 108050, 108057, 108064, 108071, 108078, - 108083, 108088, 108093, 108100, 108107, 108114, 108119, 108124, 108131, - 108136, 108143, 108148, 108155, 108160, 108167, 108174, 108179, 108184, - 108189, 108194, 108199, 108204, 108209, 108214, 108219, 108226, 108233, - 108240, 108247, 108254, 108263, 108268, 108273, 108280, 108287, 108292, - 108299, 108306, 108313, 108320, 108327, 108334, 108339, 108344, 108349, - 108354, 108359, 108368, 108377, 108386, 108395, 108404, 108413, 108422, - 108431, 108436, 108447, 108458, 108467, 108472, 108477, 108482, 108487, - 108496, 108503, 108510, 108517, 108524, 108531, 108538, 108547, 108556, - 108567, 108576, 108587, 108596, 108603, 108612, 108623, 108632, 108641, - 108650, 108659, 108666, 108673, 108680, 108689, 108698, 108709, 108718, - 108727, 108738, 108743, 108748, 108759, 108767, 108776, 108785, 108794, - 108805, 108814, 108823, 108834, 108845, 108856, 108867, 108878, 108889, - 108896, 108903, 108910, 108917, 108928, 108937, 108944, 108951, 108958, - 108969, 108980, 108991, 109002, 109013, 109024, 109035, 109046, 109053, - 109060, 109069, 109078, 109085, 109092, 109099, 109108, 109117, 109126, - 109133, 109142, 109151, 109160, 109167, 109174, 109179, 109185, 109192, - 109199, 109206, 109213, 109220, 109227, 109236, 109245, 109254, 109263, - 109270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109279, 109285, 109290, 109295, - 109302, 109308, 109314, 109320, 109326, 109332, 109338, 109344, 109348, - 109352, 109358, 109364, 109370, 109374, 109379, 109384, 109388, 109392, - 109395, 109401, 109407, 109413, 109419, 109425, 109431, 109437, 109443, - 109449, 109459, 109469, 109475, 109481, 109491, 109501, 109507, 0, 0, - 109513, 109521, 109526, 109531, 109537, 109543, 109549, 109555, 109561, - 109567, 109574, 109581, 109587, 109593, 109599, 109605, 109611, 109617, - 109623, 109629, 109634, 109640, 109646, 109652, 109658, 109664, 109673, - 109679, 109684, 109692, 109699, 109706, 109715, 109724, 109733, 109742, - 109751, 109760, 109769, 109778, 109788, 109798, 109806, 109814, 109823, - 109832, 109838, 109844, 109850, 109856, 109864, 109872, 109876, 109882, - 109887, 109893, 109899, 109905, 109911, 109917, 109926, 109931, 109938, - 109943, 109948, 109953, 109959, 109965, 109971, 109978, 109983, 109988, - 109993, 109998, 110003, 110009, 110015, 110021, 110027, 110033, 110039, - 110045, 110051, 110056, 110061, 110066, 110071, 110076, 110081, 110086, - 110091, 110097, 110103, 110108, 110113, 110118, 110123, 110128, 110134, - 110141, 110145, 110149, 110153, 110157, 110161, 110165, 110169, 110173, - 110181, 110191, 110195, 110199, 110205, 110211, 110217, 110223, 110229, - 110235, 110241, 110247, 110253, 110259, 110265, 110271, 110277, 110283, - 110287, 110291, 110298, 110304, 110310, 110316, 110321, 110328, 110333, - 110339, 110345, 110351, 110357, 110362, 110366, 110372, 110376, 110380, - 110384, 110390, 110396, 110400, 110406, 110412, 110418, 110424, 110430, - 110438, 110446, 110452, 110458, 110464, 110470, 110482, 110494, 110508, - 110520, 110532, 110546, 110560, 110574, 110578, 110586, 110594, 110599, - 110603, 110607, 110611, 110615, 110619, 110623, 110627, 110633, 110639, - 110645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110651, 110657, 110663, 110669, - 110675, 110681, 110687, 110693, 110699, 110705, 110711, 110717, 110723, - 110729, 110735, 110741, 110747, 110753, 110759, 110765, 110771, 110777, - 110783, 110789, 110795, 110801, 110807, 110813, 110819, 110825, 110831, - 110837, 110843, 110849, 110855, 110861, 110867, 110873, 110879, 110885, - 110891, 110897, 110903, 110909, 110915, 110921, 110927, 110933, 110939, - 110945, 110951, 110957, 110963, 110969, 110975, 110981, 110987, 110993, - 110999, 111005, 111011, 111017, 111023, 111029, 111035, 111041, 111047, - 111052, 111057, 111062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111066, 111071, - 111078, 111085, 111092, 111099, 111104, 111108, 111114, 111118, 111122, - 111128, 111132, 111136, 111140, 111146, 111153, 111157, 111161, 111165, - 111169, 111173, 111177, 111183, 111187, 111191, 111195, 111199, 111203, - 111207, 111211, 111215, 111219, 111223, 111227, 111231, 111236, 111240, - 111244, 111248, 111252, 111256, 111260, 111264, 111268, 111272, 111279, - 111283, 111291, 111295, 111299, 111303, 111307, 111311, 111315, 111319, - 111326, 111330, 111334, 111338, 111342, 111346, 111352, 111356, 111362, - 111366, 111370, 111374, 111378, 111382, 111386, 111390, 111394, 111398, - 111402, 111406, 111410, 111414, 111418, 111422, 111426, 111430, 111434, - 111438, 111446, 111450, 111454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111458, - 111466, 111474, 111482, 111490, 111498, 111506, 111514, 111522, 111530, - 111538, 111546, 111554, 111562, 111570, 111578, 111586, 111594, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111602, 111606, 111611, 111616, 111621, - 111625, 111630, 111635, 111640, 111644, 111649, 111654, 111658, 111662, - 111666, 111670, 111675, 111680, 111684, 111688, 111693, 111697, 111702, - 111707, 111712, 111717, 111722, 111726, 111731, 111736, 111741, 111745, - 111750, 111755, 111760, 111764, 111769, 111774, 111778, 111782, 111786, - 111790, 111795, 111800, 111804, 111808, 111813, 111817, 111822, 111827, - 111832, 111837, 111842, 111846, 111851, 111856, 111861, 111865, 111870, - 111875, 111880, 111884, 111889, 111894, 111898, 111902, 111906, 111910, - 111915, 111920, 111924, 111928, 111933, 111937, 111942, 111947, 111952, - 111957, 111962, 111966, 111971, 111976, 111981, 111985, 111990, 0, - 111995, 111999, 112004, 112009, 112013, 112017, 112021, 112025, 112030, - 112035, 112039, 112043, 112048, 112052, 112057, 112062, 112067, 112072, - 112077, 112082, 112088, 112094, 112100, 112105, 112111, 112117, 112123, - 112128, 112134, 112140, 112145, 112150, 112155, 112160, 112166, 112172, - 112177, 112182, 112188, 112193, 112199, 112205, 112211, 112217, 112223, - 112228, 112234, 112240, 112246, 112251, 112257, 112263, 112269, 112274, - 112280, 112286, 112291, 112296, 112301, 112306, 112312, 112318, 112323, - 112328, 112334, 112339, 112345, 112351, 112357, 112363, 112369, 0, - 112373, 112378, 0, 0, 112383, 0, 0, 112388, 112393, 0, 0, 112398, 112402, - 112406, 112411, 0, 112416, 112420, 112425, 112429, 112434, 112439, - 112444, 112449, 112454, 112458, 112463, 112468, 0, 112473, 0, 112478, - 112483, 112487, 112492, 112497, 112501, 112505, 0, 112509, 112514, - 112519, 112523, 112527, 112532, 112536, 112541, 112546, 112551, 112556, - 112561, 112566, 112572, 112578, 112584, 112589, 112595, 112601, 112607, - 112612, 112618, 112624, 112629, 112634, 112639, 112644, 112650, 112656, - 112661, 112666, 112672, 112677, 112683, 112689, 112695, 112701, 112707, - 112712, 112718, 112724, 112730, 112735, 112741, 112747, 112753, 112758, - 112764, 112770, 112775, 112780, 112785, 112790, 112796, 112802, 112807, - 112812, 112818, 112823, 112829, 112835, 112841, 112847, 112853, 112857, - 0, 112862, 112867, 112871, 112876, 0, 0, 112881, 112886, 112891, 112895, - 112899, 112903, 112907, 112912, 0, 112917, 112921, 112926, 112930, - 112935, 112940, 112945, 0, 112950, 112954, 112959, 112964, 112969, - 112973, 112978, 112983, 112988, 112992, 112997, 113002, 113006, 113010, - 113014, 113018, 113023, 113028, 113032, 113036, 113041, 113045, 113050, - 113055, 113060, 113065, 113070, 113074, 0, 113079, 113084, 113088, - 113093, 0, 113098, 113102, 113107, 113112, 113116, 0, 113120, 0, 0, 0, - 113124, 113128, 113133, 113137, 113142, 113147, 113152, 0, 113157, - 113161, 113166, 113171, 113176, 113180, 113185, 113190, 113195, 113199, - 113204, 113209, 113213, 113217, 113221, 113225, 113230, 113235, 113239, - 113243, 113248, 113252, 113257, 113262, 113267, 113272, 113277, 113282, - 113288, 113294, 113300, 113305, 113311, 113317, 113323, 113328, 113334, - 113340, 113345, 113350, 113355, 113360, 113366, 113372, 113377, 113382, - 113388, 113393, 113399, 113405, 113411, 113417, 113423, 113428, 113434, - 113440, 113446, 113451, 113457, 113463, 113469, 113474, 113480, 113486, - 113491, 113496, 113501, 113506, 113512, 113518, 113523, 113528, 113534, - 113539, 113545, 113551, 113557, 113563, 113569, 113573, 113578, 113583, - 113588, 113592, 113597, 113602, 113607, 113611, 113616, 113621, 113625, - 113629, 113633, 113637, 113642, 113647, 113651, 113655, 113660, 113664, - 113669, 113674, 113679, 113684, 113689, 113693, 113698, 113703, 113708, - 113712, 113717, 113722, 113727, 113731, 113736, 113741, 113745, 113749, - 113753, 113757, 113762, 113767, 113771, 113775, 113780, 113784, 113789, - 113794, 113799, 113804, 113809, 113814, 113820, 113826, 113832, 113837, - 113843, 113849, 113855, 113860, 113866, 113872, 113877, 113882, 113887, - 113892, 113898, 113904, 113909, 113914, 113920, 113925, 113931, 113937, - 113943, 113949, 113955, 113960, 113966, 113972, 113978, 113983, 113989, - 113995, 114001, 114006, 114012, 114018, 114023, 114028, 114033, 114038, - 114044, 114050, 114055, 114060, 114066, 114071, 114077, 114083, 114089, - 114095, 114101, 114106, 114112, 114118, 114124, 114129, 114135, 114141, - 114147, 114152, 114158, 114164, 114169, 114174, 114179, 114184, 114190, - 114196, 114201, 114206, 114212, 114217, 114223, 114229, 114235, 114241, - 114247, 114252, 114258, 114264, 114270, 114275, 114281, 114287, 114293, - 114298, 114304, 114310, 114315, 114320, 114325, 114330, 114336, 114342, - 114347, 114352, 114358, 114363, 114369, 114375, 114381, 114387, 114393, - 114399, 114406, 114413, 114420, 114426, 114433, 114440, 114447, 114453, - 114460, 114467, 114473, 114479, 114485, 114491, 114498, 114505, 114511, - 114517, 114524, 114530, 114537, 114544, 114551, 114558, 114565, 114571, - 114578, 114585, 114592, 114598, 114605, 114612, 114619, 114625, 114632, - 114639, 114645, 114651, 114657, 114663, 114670, 114677, 114683, 114689, - 114696, 114702, 114709, 114716, 114723, 114730, 114737, 114742, 114748, - 114754, 114760, 114765, 114771, 114777, 114783, 114788, 114794, 114800, - 114805, 114810, 114815, 114820, 114826, 114832, 114837, 114842, 114848, - 114853, 114859, 114865, 114871, 114877, 114883, 114888, 114894, 114900, - 114906, 114911, 114917, 114923, 114929, 114934, 114940, 114946, 114951, - 114956, 114961, 114966, 114972, 114978, 114983, 114988, 114994, 114999, - 115005, 115011, 115017, 115023, 115029, 115035, 0, 0, 115042, 115047, - 115052, 115057, 115062, 115067, 115072, 115077, 115082, 115087, 115092, - 115097, 115102, 115107, 115112, 115117, 115122, 115127, 115133, 115138, - 115143, 115148, 115153, 115158, 115163, 115168, 115172, 115177, 115182, - 115187, 115192, 115197, 115202, 115207, 115212, 115217, 115222, 115227, - 115232, 115237, 115242, 115247, 115252, 115257, 115263, 115268, 115273, - 115278, 115283, 115288, 115293, 115298, 115304, 115309, 115314, 115319, - 115324, 115329, 115334, 115339, 115344, 115349, 115354, 115359, 115364, - 115369, 115374, 115379, 115384, 115389, 115394, 115399, 115404, 115409, - 115414, 115419, 115425, 115430, 115435, 115440, 115445, 115450, 115455, - 115460, 115464, 115469, 115474, 115479, 115484, 115489, 115494, 115499, - 115504, 115509, 115514, 115519, 115524, 115529, 115534, 115539, 115544, - 115549, 115555, 115560, 115565, 115570, 115575, 115580, 115585, 115590, - 115596, 115601, 115606, 115611, 115616, 115621, 115626, 115632, 115638, - 115644, 115650, 115656, 115662, 115668, 115674, 115680, 115686, 115692, - 115698, 115704, 115710, 115716, 115722, 115728, 115735, 115741, 115747, - 115753, 115759, 115765, 115771, 115777, 115782, 115788, 115794, 115800, - 115806, 115812, 115818, 115824, 115830, 115836, 115842, 115848, 115854, - 115860, 115866, 115872, 115878, 115884, 115891, 115897, 115903, 115909, - 115915, 115921, 115927, 115933, 115940, 115946, 115952, 115958, 115964, - 115970, 115976, 115982, 115988, 115994, 116000, 116006, 116012, 116018, - 116024, 116030, 116036, 116042, 116048, 116054, 116060, 116066, 116072, - 116078, 116085, 116091, 116097, 116103, 116109, 116115, 116121, 116127, - 116132, 116138, 116144, 116150, 116156, 116162, 116168, 116174, 116180, - 116186, 116192, 116198, 116204, 116210, 116216, 116222, 116228, 116234, - 116241, 116247, 116253, 116259, 116265, 116271, 116277, 116283, 116290, - 116296, 116302, 116308, 116314, 116320, 116326, 116333, 116340, 116347, - 116354, 116361, 116368, 116375, 116382, 116389, 116396, 116403, 116410, - 116417, 116424, 116431, 116438, 116445, 116453, 116460, 116467, 116474, - 116481, 116488, 116495, 116502, 116508, 116515, 116522, 116529, 116536, - 116543, 116550, 116557, 116564, 116571, 116578, 116585, 116592, 116599, - 116606, 116613, 116620, 116627, 116635, 116642, 116649, 116656, 116663, - 116670, 116677, 116684, 116692, 116699, 116706, 116713, 116720, 116727, - 116734, 116739, 0, 0, 116744, 116749, 116753, 116757, 116761, 116765, - 116769, 116773, 116777, 116781, 116785, 116790, 116794, 116798, 116802, - 116806, 116810, 116814, 116818, 116822, 116826, 116831, 116835, 116839, - 116843, 116847, 116851, 116855, 116859, 116863, 116867, 116873, 116878, - 116883, 116888, 116893, 116898, 116903, 116908, 116913, 116918, 116924, - 116929, 116934, 116939, 116944, 116949, 116954, 116959, 116964, 116969, - 116976, 116983, 116990, 116997, 117004, 117011, 117017, 117024, 117031, - 117038, 117046, 117054, 117062, 117070, 117078, 117086, 117093, 117100, - 117107, 117115, 117123, 117131, 117139, 117147, 117155, 117162, 117169, - 117176, 117184, 117192, 117200, 117208, 117216, 117224, 117229, 117234, - 117239, 117244, 117249, 117254, 117259, 117264, 117269, 0, 0, 0, 0, - 117274, 117279, 117283, 117287, 117291, 117295, 117299, 117303, 117307, - 117311, 117315, 117319, 117323, 117327, 117331, 117335, 117339, 117343, - 117347, 117351, 117355, 117359, 117363, 117367, 117371, 117375, 117379, - 117383, 117387, 117391, 117395, 117399, 117403, 117407, 117411, 117415, - 117419, 117423, 117427, 117431, 117435, 117439, 117443, 117447, 117451, - 117455, 117459, 117463, 117467, 117471, 117475, 117480, 117484, 117488, - 117492, 117496, 117500, 117504, 117508, 117512, 117516, 117520, 117524, - 117528, 117532, 117536, 117540, 117544, 117548, 117552, 117556, 117560, - 117564, 117568, 117572, 117576, 117580, 117584, 117588, 117592, 117596, - 117600, 117604, 117608, 117612, 117616, 117620, 117624, 117628, 117632, - 117636, 117640, 117644, 117648, 117652, 117656, 117660, 117664, 117668, - 117672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117676, 117682, 117691, - 117699, 117707, 117716, 117725, 117734, 117743, 117752, 117761, 117770, - 117779, 117788, 117797, 0, 0, 117806, 117815, 117823, 117831, 117840, - 117849, 117858, 117867, 117876, 117885, 117894, 117903, 117912, 117921, - 0, 0, 117930, 117939, 117947, 117955, 117964, 117973, 117982, 117991, - 118000, 118009, 118018, 118027, 118036, 118045, 118054, 0, 118061, - 118070, 118078, 118086, 118095, 118104, 118113, 118122, 118131, 118140, - 118149, 118158, 118167, 118176, 118185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118192, - 118199, 118204, 118208, 118212, 118216, 118221, 118226, 118231, 118236, - 118241, 0, 0, 0, 0, 0, 118246, 118251, 118257, 118263, 118269, 118274, - 118280, 118286, 118292, 118297, 118303, 118309, 118314, 118319, 118324, - 118329, 118335, 118341, 118346, 118351, 118357, 118362, 118368, 118374, - 118380, 118386, 118392, 118402, 118409, 118415, 118418, 0, 118421, - 118426, 118432, 118438, 118444, 118449, 118455, 118461, 118467, 118472, - 118478, 118484, 118489, 118494, 118499, 118504, 118510, 118516, 118521, - 118526, 118532, 118537, 118543, 118549, 118555, 118561, 118567, 118570, - 118573, 118576, 118579, 118582, 118585, 118591, 118598, 118605, 118612, - 118618, 118625, 118632, 118639, 118645, 118652, 118659, 118665, 118671, - 118677, 118683, 118690, 118697, 118703, 118709, 118716, 118722, 118729, - 118736, 118743, 118750, 0, 0, 0, 0, 0, 0, 118757, 118763, 118770, 118777, - 118784, 118790, 118797, 118804, 118811, 118817, 118824, 118831, 118837, - 118843, 118849, 118855, 118862, 118869, 118875, 118881, 118888, 118894, - 118901, 118908, 118915, 118922, 118929, 118938, 118942, 118945, 118949, - 118953, 118957, 118960, 118963, 118966, 118969, 118972, 118975, 118978, - 118981, 118984, 118990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118993, 119000, 119008, 119016, 119024, - 119031, 119039, 119047, 119055, 119062, 119070, 119078, 119085, 119092, - 119099, 119106, 119114, 119122, 119129, 119136, 119144, 119151, 119159, - 119167, 119175, 119183, 119191, 119195, 119199, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 119203, 119209, 119215, 119221, 119225, 119231, 119237, - 119243, 119249, 119255, 119261, 119267, 119273, 119279, 119285, 119291, - 119297, 119303, 119309, 119315, 119321, 119327, 119333, 119339, 119345, - 119351, 119357, 119363, 119369, 119375, 119381, 119387, 119393, 119399, - 119405, 119411, 119417, 119423, 119429, 119435, 119441, 119447, 119453, - 0, 0, 0, 0, 0, 119459, 119470, 119481, 119492, 119503, 119514, 119525, - 119536, 119547, 0, 0, 0, 0, 0, 0, 0, 119558, 119562, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119566, 119568, 119570, - 119574, 119579, 119584, 119586, 119592, 119597, 119599, 119605, 119609, - 119611, 119615, 119621, 119627, 119633, 119638, 119642, 119649, 119656, - 119663, 119668, 119675, 119682, 119689, 119693, 119699, 119708, 119717, - 119724, 119729, 119733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 119737, 119739, 119741, 119745, 119749, 119753, 0, 119755, 119757, - 119761, 119763, 119765, 119767, 119769, 119774, 119779, 119781, 119787, - 119791, 119795, 119803, 119805, 119807, 119809, 119811, 119813, 119815, - 119817, 119819, 119821, 119823, 119827, 119831, 119833, 119835, 119837, - 119839, 119841, 119846, 119852, 119856, 119860, 119864, 119868, 119873, - 119877, 119879, 119881, 119885, 119891, 119893, 119895, 119897, 119901, - 119910, 119916, 119920, 119924, 119926, 119928, 119931, 119933, 119935, - 119937, 119941, 119943, 119947, 119952, 119954, 119959, 119965, 119972, - 119976, 119980, 119984, 119988, 119994, 0, 0, 0, 119998, 120000, 120004, - 120008, 120010, 120014, 120018, 120020, 120024, 120026, 120030, 120034, - 120038, 120042, 120046, 120050, 120054, 120058, 120064, 120068, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 120072, 120076, 120080, 120084, 120091, - 120093, 120097, 120099, 120101, 120105, 120109, 120113, 120115, 120119, - 120123, 120127, 120131, 120135, 120137, 120141, 120143, 120149, 120152, - 120157, 120159, 120161, 120164, 120166, 120168, 120171, 120178, 120185, - 120192, 120197, 120201, 120203, 120205, 0, 120207, 120209, 120213, - 120217, 120221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120223, 120227, 120232, 120236, 120242, 120248, 120250, 120252, - 120258, 120260, 120264, 120268, 120270, 120274, 120276, 120280, 120284, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120288, 120290, 120292, - 120294, 120298, 120300, 120302, 120304, 120306, 120308, 120310, 120312, - 120314, 120316, 120318, 120320, 120322, 120324, 120326, 120328, 120330, - 120332, 120334, 120336, 120338, 120340, 120342, 120346, 120348, 120350, - 120352, 120356, 120358, 120362, 120364, 120366, 120370, 120374, 120380, - 120382, 120384, 120386, 120388, 120392, 120396, 120398, 120402, 120406, - 120410, 120414, 120418, 120422, 120426, 120430, 120434, 120438, 120442, - 120446, 120450, 120454, 120458, 120462, 120466, 0, 120470, 0, 120472, - 120474, 120476, 120478, 120480, 120488, 120496, 120504, 120512, 120517, - 120522, 120527, 120531, 120535, 120540, 120545, 120547, 120551, 120553, - 120555, 120557, 120559, 120561, 120563, 120565, 120569, 120571, 120573, - 120575, 120579, 120583, 120587, 120591, 120595, 120597, 120603, 120609, - 120611, 120613, 120615, 120617, 120619, 120628, 120635, 120642, 120646, - 120653, 120658, 120665, 120674, 120679, 120683, 120687, 120689, 120693, - 120695, 120699, 120703, 120705, 120709, 120713, 120717, 120719, 120721, - 120727, 120729, 120731, 120733, 120737, 120741, 120743, 120747, 120749, - 120751, 120754, 120758, 120760, 120764, 120766, 120768, 120773, 120775, - 120779, 120783, 120786, 120790, 120794, 120798, 120802, 120806, 120810, - 120814, 120819, 120823, 120827, 120836, 120841, 120844, 120846, 120849, - 120852, 120857, 120859, 120862, 120867, 120871, 120874, 120878, 120882, - 120885, 120890, 120894, 120898, 120902, 120906, 120912, 120918, 120924, - 120930, 120935, 120946, 120948, 120952, 120954, 120956, 120960, 120964, - 120966, 120970, 120976, 120981, 120987, 120989, 120993, 120997, 121004, - 121011, 121015, 121017, 121019, 121023, 121025, 121029, 121033, 121037, - 121039, 121041, 121048, 121052, 121056, 121060, 121064, 121068, 121070, - 121074, 121076, 121078, 121082, 121084, 121088, 121092, 121098, 121102, - 121106, 121110, 121112, 121115, 121119, 121126, 121135, 121144, 121153, - 121162, 121164, 121168, 121170, 121174, 121185, 121189, 121195, 121201, - 121206, 0, 121208, 121212, 121214, 121216, 0, 0, 0, 121218, 121223, - 121234, 121250, 121263, 121276, 121280, 121284, 121290, 121292, 121300, - 121308, 121310, 121314, 121320, 121326, 121333, 121340, 121342, 121344, - 121348, 121350, 121356, 121358, 121361, 121365, 121371, 121377, 121388, - 121394, 121401, 121409, 121413, 121421, 121429, 121435, 121441, 121448, - 121450, 121454, 121456, 121458, 121463, 121465, 121467, 121469, 121471, - 121475, 121486, 121492, 121496, 121500, 121504, 121510, 121516, 121522, - 121528, 121533, 121538, 121544, 121550, 121557, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121564, 121571, 121578, 121585, 121593, - 121601, 121609, 121617, 121625, 121633, 121641, 121649, 121657, 121663, - 121669, 121675, 121681, 121687, 121693, 121699, 121705, 121711, 121717, - 121723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121729, 121733, 121737, 121742, 121747, 0, 121749, 121758, - 121766, 121775, 121789, 121803, 121817, 121824, 121831, 121835, 121844, - 121852, 121856, 121865, 121872, 121876, 0, 121880, 121884, 121891, 0, - 121895, 0, 121899, 0, 121906, 0, 121915, 121927, 121939, 0, 121943, - 121947, 121951, 121955, 121959, 121967, 0, 0, 121975, 121979, 121983, - 121987, 0, 121991, 0, 0, 121997, 122009, 122017, 122021, 0, 122025, - 122029, 122035, 122042, 122053, 122063, 122074, 122085, 122094, 122105, - 122111, 122117, 0, 0, 0, 0, 122123, 122132, 122139, 122145, 122149, - 122153, 122157, 122166, 122178, 122182, 122189, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122196, 122198, 122200, - 122204, 122208, 122212, 122221, 122223, 122225, 122228, 122230, 122232, - 122236, 122238, 122242, 122244, 122248, 122250, 122252, 122256, 122260, - 122266, 122268, 122272, 122274, 122278, 122282, 122286, 122290, 122292, - 122294, 122298, 122302, 122306, 122310, 122312, 122314, 122316, 122321, - 122326, 122329, 122337, 122345, 122347, 122352, 122355, 122360, 122371, - 122378, 122383, 122388, 122390, 122394, 122396, 122400, 122402, 122406, - 122410, 122413, 122416, 122418, 122421, 122423, 122427, 122429, 122431, - 122433, 122437, 122439, 122443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122446, - 122451, 122456, 122461, 122466, 122471, 122476, 122483, 122490, 122497, - 122504, 122509, 122514, 122519, 122524, 122531, 122537, 122544, 122551, - 122558, 122563, 122568, 122573, 122578, 122583, 122590, 122597, 122602, - 122607, 122614, 122621, 122629, 122637, 122644, 122651, 122659, 122667, - 122675, 122682, 122692, 122703, 122708, 122715, 122722, 122729, 122737, - 122745, 122756, 122764, 122772, 122780, 122785, 122790, 122795, 122800, - 122805, 122810, 122815, 122820, 122825, 122830, 122835, 122840, 122847, - 122852, 122857, 122864, 122869, 122874, 122879, 122884, 122889, 122894, - 122899, 122904, 122909, 122914, 122919, 122924, 122931, 122939, 122944, - 122949, 122956, 122961, 122966, 122971, 122978, 122983, 122990, 122995, - 123002, 123007, 123016, 123025, 123030, 123035, 123040, 123045, 123050, - 123055, 123060, 123065, 123070, 123075, 123080, 123085, 123090, 123098, - 123106, 123111, 123116, 123121, 123126, 123131, 123137, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 123143, 123147, 123151, 123155, 123159, 123163, 123167, - 123171, 123175, 123179, 123183, 123187, 123191, 123195, 123199, 123203, - 123207, 123211, 123215, 123219, 123223, 123227, 123231, 123235, 123239, - 123243, 123247, 123251, 123255, 123259, 123263, 123267, 123271, 123275, - 123279, 123283, 123287, 123291, 123295, 123299, 123303, 123307, 123311, - 123315, 123319, 123323, 123327, 123331, 123335, 123339, 123343, 123347, - 123351, 123355, 123359, 123363, 123367, 123371, 123375, 123379, 123383, - 123387, 123391, 123395, 123399, 123403, 123407, 123411, 123415, 123419, - 123423, 123427, 123431, 123435, 123439, 123443, 123447, 123451, 123455, - 123459, 123463, 123467, 123471, 123475, 123479, 123483, 123487, 123491, - 123495, 123499, 123503, 123507, 123511, 123515, 123519, 123523, 123527, - 123531, 123535, 123539, 123543, 123547, 123551, 123555, 123559, 123563, - 123567, 123571, 123575, 123579, 123583, 123587, 123591, 123595, 123599, - 123603, 123607, 123611, 123615, 123619, 123623, 123627, 123631, 123635, - 123639, 123643, 123647, 123651, 123655, 123659, 123663, 123667, 123671, - 123675, 123679, 123683, 123687, 123691, 123695, 123699, 123703, 123707, - 123711, 123715, 123719, 123723, 123727, 123731, 123735, 123739, 123743, - 123747, 123751, 123755, 123759, 123763, 123767, 123771, 123775, 123779, - 123783, 123787, 123791, 123795, 123799, 123803, 123807, 123811, 123815, - 123819, 123823, 123827, 123831, 123835, 123839, 123843, 123847, 123851, - 123855, 123859, 123863, 123867, 123871, 123875, 123879, 123883, 123887, - 123891, 123895, 123899, 123903, 123907, 123911, 123915, 123919, 123923, - 123927, 123931, 123935, 123939, 123943, 123947, 123951, 123955, 123959, - 123963, 123967, 123971, 123975, 123979, 123983, 123987, 123991, 123995, - 123999, 124003, 124007, 124011, 124015, 124019, 124023, 124027, 124031, - 124035, 124039, 124043, 124047, 124051, 124055, 124059, 124063, 124067, - 124071, 124075, 124079, 124083, 124087, 124091, 124095, 124099, 124103, - 124107, 124111, 124115, 124119, 124123, 124127, 124131, 124135, 124139, - 124143, 124147, 124151, 124155, 124159, 124163, 124167, 124171, 124175, - 124179, 124183, 124187, 124191, 124195, 124199, 124203, 124207, 124211, - 124215, 124219, 124223, 124227, 124231, 124235, 124239, 124243, 124247, - 124251, 124255, 124259, 124263, 124267, 124271, 124275, 124279, 124283, - 124287, 124291, 124295, 124299, 124303, 124307, 124311, 124315, 124319, - 124323, 124327, 124331, 124335, 124339, 124343, 124347, 124351, 124355, - 124359, 124363, 124367, 124371, 124375, 124379, 124383, 124387, 124391, - 124395, 124399, 124403, 124407, 124411, 124415, 124419, 124423, 124427, - 124431, 124435, 124439, 124443, 124447, 124451, 124455, 124459, 124463, - 124467, 124471, 124475, 124479, 124483, 124487, 124491, 124495, 124499, - 124503, 124507, 124511, 124515, 124519, 124523, 124527, 124531, 124535, - 124539, 124543, 124547, 124551, 124555, 124559, 124563, 124567, 124571, - 124575, 124579, 124583, 124587, 124591, 124595, 124599, 124603, 124607, - 124611, 124615, 124619, 124623, 124627, 124631, 124635, 124639, 124643, - 124647, 124651, 124655, 124659, 124663, 124667, 124671, 124675, 124679, - 124683, 124687, 124691, 124695, 124699, 124703, 124707, 124711, 124715, - 124719, 124723, 124727, 124731, 124735, 124739, 124743, 124747, 124751, - 124755, 124759, 124763, 124767, 124771, 124775, 124779, 124783, 124787, - 124791, 124795, 124799, 124803, 124807, 124811, 124815, 124819, 124823, - 124827, 124831, 124835, 124839, 124843, 124847, 124851, 124855, 124859, - 124863, 124867, 124871, 124875, 124879, 124883, 124887, 124891, 124895, - 124899, 124903, 124907, 124911, 124915, 124919, 124923, 124927, 124931, - 124935, 124939, 124943, 124947, 124951, 124955, 124959, 124963, 124967, - 124971, 124975, 124979, 124983, 124987, 124991, 124995, 124999, 125003, - 125007, 125011, 125015, 125019, 125023, 125027, 125031, 125035, 125039, - 125043, 125047, 125051, 125055, 125059, 125063, 125067, 125071, 125075, - 125079, 125083, 125087, 125091, 125095, 125099, 125103, 125107, 125111, - 125115, 125119, 125123, 125127, 125131, 125135, 125139, 125143, 125147, - 125151, 125155, 125159, 125163, 125167, 125171, 125175, 125179, 125183, - 125187, 125191, 125195, 125199, 125203, 125207, 125211, 125215, 125219, - 125223, 125227, 125231, 125235, 125239, 125243, 125247, 125251, 125255, - 125259, 125263, 125267, 125271, 125275, 125279, 125283, 125287, 125291, - 125295, 125299, 125303, 125307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125311, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125315, - 125318, 125322, 125326, 125329, 125333, 125337, 125340, 125343, 125347, - 125351, 125354, 125357, 125360, 125363, 125368, 125371, 125375, 125378, - 125381, 125384, 125387, 125390, 125393, 125396, 125399, 125402, 125405, - 125408, 125412, 125416, 125420, 125424, 125429, 125434, 125440, 125446, - 125452, 125457, 125463, 125469, 125475, 125480, 125486, 125492, 125497, - 125502, 125507, 125512, 125518, 125524, 125529, 125534, 125540, 125545, - 125551, 125557, 125563, 125569, 125575, 125579, 125584, 125588, 125593, - 125597, 125602, 125607, 125613, 125619, 125625, 125630, 125636, 125642, - 125648, 125653, 125659, 125665, 125670, 125675, 125680, 125685, 125691, - 125697, 125702, 125707, 125713, 125718, 125724, 125730, 125736, 125742, - 125748, 125753, 125757, 125762, 125765, 125769, 125772, 125775, 125778, - 125781, 125784, 125787, 125790, 125793, 125796, 125799, 125802, 125805, - 125808, 125811, 125814, 125817, 125820, 125823, 125826, 125829, 125832, - 125835, 125838, 125841, 125844, 125847, 125850, 125853, 125856, 125859, - 125862, 125865, 125868, 125871, 125874, 125877, 125880, 125883, 125886, - 125889, 125892, 125895, 125898, 125901, 125904, 125907, 125910, 125913, - 125916, 125919, 125922, 125925, 125928, 125931, 125934, 125937, 125940, - 125943, 125946, 125949, 125952, 125955, 125958, 125961, 125964, 125967, - 125970, 125973, 125976, 125979, 125982, 125985, 125988, 125991, 125994, - 125997, 126000, 126003, 126006, 126009, 126012, 126015, 126018, 126021, - 126024, 126027, 126030, 126033, 126036, 126039, 126042, 126045, 126048, - 126051, 126054, 126057, 126060, 126063, 126066, 126069, 126072, 126075, - 126078, 126081, 126084, 126087, 126090, 126093, 126096, 126099, 126102, - 126105, 126108, 126111, 126114, 126117, 126120, 126123, 126126, 126129, - 126132, 126135, 126138, 126141, 126144, 126147, 126150, 126153, 126156, - 126159, 126162, 126165, 126168, 126171, 126174, 126177, 126180, 126183, - 126186, 126189, 126192, 126195, 126198, 126201, 126204, 126207, 126210, - 126213, 126216, 126219, 126222, 126225, 126228, 126231, 126234, 126237, - 126240, 126243, 126246, 126249, 126252, 126255, 126258, 126261, 126264, - 126267, 126270, 126273, 126276, 126279, 126282, 126285, 126288, 126291, - 126294, 126297, 126300, 126303, 126306, 126309, 126312, 126315, 126318, - 126321, 126324, 126327, 126330, 126333, 126336, 126339, 126342, 126345, - 126348, 126351, 126354, 126357, 126360, 126363, 126366, 126369, 126372, - 126375, 126378, 126381, 126384, 126387, 126390, 126393, 126396, 126399, - 126402, 126405, 126408, 126411, 126414, 126417, 126420, 126423, 126426, - 126429, 126432, 126435, 126438, 126441, 126444, 126447, 126450, 126453, - 126456, 126459, 126462, 126465, 126468, 126471, 126474, 126477, 126480, - 126483, 126486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 73700, 73703, 73706, 73709, 73712, 73716, 73719, 73722, 73726, 73730, + 73734, 73738, 73742, 73746, 73750, 73754, 73758, 73762, 73766, 73770, + 73774, 73778, 73782, 73786, 73790, 73793, 73797, 73800, 73804, 73808, + 73812, 73816, 73820, 73823, 73827, 73830, 73833, 73837, 73841, 73845, + 73849, 73852, 73857, 73861, 73866, 73871, 73875, 73880, 73884, 73889, + 73894, 73899, 73903, 73907, 73912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73917, + 73922, 73927, 73932, 73938, 73943, 73948, 73952, 73957, 73962, 73966, + 73970, 73975, 73980, 0, 0, 73986, 73990, 73993, 73996, 73999, 74002, + 74005, 74008, 74011, 74014, 0, 0, 74017, 74022, 74027, 74033, 74040, + 74046, 74052, 74058, 74064, 74070, 74076, 74082, 74088, 74094, 74100, + 74106, 74111, 74117, 74122, 74128, 74134, 74141, 74147, 74153, 74158, + 74165, 74172, 74179, 74185, 74190, 74195, 74200, 0, 0, 0, 0, 74208, + 74214, 74220, 74226, 74232, 74238, 74244, 74250, 74256, 74262, 74268, + 74274, 74280, 74286, 74292, 74298, 74304, 74310, 74316, 74322, 74328, + 74333, 74338, 74344, 74350, 74356, 74362, 74368, 74374, 74380, 74386, + 74392, 74398, 74404, 74410, 74416, 74422, 74428, 74434, 74440, 74446, + 74452, 74458, 74464, 74470, 74476, 74482, 74487, 74492, 74498, 74503, + 74507, 74512, 74516, 74520, 74524, 74530, 74535, 74540, 74545, 74550, + 74555, 74560, 74565, 74572, 74579, 74586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74593, 74598, 74603, 74608, + 74615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74622, 74626, 74630, 74634, 74638, + 74642, 0, 0, 74646, 74650, 74654, 74658, 74662, 74666, 0, 0, 74670, + 74674, 74678, 74682, 74686, 74690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74694, + 74698, 74702, 74706, 74710, 74714, 74718, 0, 74722, 74726, 74730, 74734, + 74738, 74742, 74746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74750, 74757, 74764, 74771, 74778, 74784, 74790, + 74797, 74804, 74811, 74818, 74825, 74832, 74839, 74846, 74853, 74859, + 74866, 74873, 74880, 74887, 74894, 74901, 74908, 74915, 74922, 74929, + 74936, 74945, 74954, 74963, 74972, 74981, 74990, 74999, 75008, 75016, + 75024, 75032, 75040, 75048, 75056, 75064, 75072, 75078, 75086, 0, 0, + 75094, 75101, 75107, 75113, 75119, 75125, 75131, 75137, 75143, 75149, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 75155, 75159, 75163, 75167, 75171, 75175, 75179, 75183, + 75187, 75191, 75195, 75199, 75203, 75207, 75211, 75215, 75219, 75223, + 75227, 75231, 75235, 75239, 75243, 0, 0, 0, 0, 75247, 75251, 75255, + 75259, 75263, 75267, 75271, 75275, 75279, 75283, 75287, 75291, 75295, + 75299, 75303, 75307, 75311, 75315, 75319, 75323, 75327, 75331, 75335, + 75339, 75343, 75347, 75351, 75355, 75359, 75363, 75367, 75371, 75375, + 75379, 75383, 75387, 75391, 75395, 75399, 75403, 75407, 75411, 75415, + 75419, 75423, 75427, 75431, 75435, 75439, 0, 0, 0, 0, 75443, 75447, + 75451, 75455, 75459, 75463, 75467, 75471, 75475, 75479, 75483, 75487, + 75491, 75495, 75499, 75503, 75507, 75511, 75515, 75519, 75523, 75527, + 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, 75567, + 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, 75607, + 75611, 75615, 75619, 75623, 75627, 75631, 75635, 75639, 75643, 75647, + 75651, 75655, 75659, 75663, 75667, 75671, 75675, 75679, 75683, 75687, + 75691, 75695, 75699, 75703, 75707, 75711, 75715, 75719, 75723, 75727, + 75731, 75735, 75739, 75743, 75747, 75751, 75755, 75759, 75763, 75767, + 75771, 75775, 75779, 75783, 75787, 75791, 75795, 75799, 75803, 75807, + 75811, 75815, 75819, 75823, 75827, 75831, 75835, 75839, 75843, 75847, + 75851, 75855, 75859, 75863, 75867, 75871, 75875, 75879, 75883, 75887, + 75891, 75895, 75899, 75903, 75907, 75911, 75915, 75919, 75923, 75927, + 75931, 75935, 75939, 75943, 75947, 75951, 75955, 75959, 75963, 75967, + 75971, 75975, 75979, 75983, 75987, 75991, 75995, 75999, 76003, 76007, + 76011, 76015, 76019, 76023, 76027, 76031, 76035, 76039, 76043, 76047, + 76051, 76055, 76059, 76063, 76067, 76071, 76075, 76079, 76083, 76087, + 76091, 76095, 76099, 76103, 76107, 76111, 76115, 76119, 76123, 76127, + 76131, 76135, 76139, 76143, 76147, 76151, 76155, 76159, 76163, 76167, + 76171, 76175, 76179, 76183, 76187, 76191, 76195, 76199, 76203, 76207, + 76211, 76215, 76219, 76223, 76227, 76231, 76235, 76239, 76243, 76247, + 76251, 76255, 76259, 76263, 76267, 76271, 76275, 76279, 76283, 76287, + 76291, 76295, 76299, 76303, 76307, 76311, 76315, 76319, 76323, 76327, + 76331, 76335, 76339, 76343, 76347, 76351, 76355, 76359, 76363, 76367, + 76371, 76375, 76379, 76383, 76387, 76391, 76395, 76399, 76403, 76407, + 76411, 76415, 76419, 76423, 76427, 76431, 76435, 76439, 76443, 76447, + 76451, 76455, 76459, 76463, 76467, 76471, 76475, 76479, 76483, 76487, + 76491, 76495, 76499, 76503, 76507, 76511, 76515, 76519, 76523, 76527, + 76531, 76535, 76539, 76543, 76547, 76551, 76555, 76559, 76563, 76567, + 76571, 76575, 76579, 76583, 76587, 76591, 76595, 76599, 76603, 76607, + 76611, 76615, 76619, 76623, 76627, 76631, 76635, 76639, 76643, 76647, 0, + 0, 76651, 76655, 76659, 76663, 76667, 76671, 76675, 76679, 76683, 76687, + 76691, 76695, 76699, 76703, 76707, 76711, 76715, 76719, 76723, 76727, + 76731, 76735, 76739, 76743, 76747, 76751, 76755, 76759, 76763, 76767, + 76771, 76775, 76779, 76783, 76787, 76791, 76795, 76799, 76803, 76807, + 76811, 76815, 76819, 76823, 76827, 76831, 76835, 76839, 76843, 76847, + 76851, 76855, 76859, 76863, 76867, 76871, 76875, 76879, 76883, 76887, + 76891, 76895, 0, 0, 76899, 76903, 76907, 76911, 76915, 76919, 76923, + 76927, 76931, 76935, 76939, 76943, 76947, 76951, 76955, 76959, 76963, + 76967, 76971, 76975, 76979, 76983, 76987, 76991, 76995, 76999, 77003, + 77007, 77011, 77015, 77019, 77023, 77027, 77031, 77035, 77039, 77043, + 77047, 77051, 77055, 77059, 77063, 77067, 77071, 77075, 77079, 77083, + 77087, 77091, 77095, 77099, 77103, 77107, 77111, 77115, 77119, 77123, + 77127, 77131, 77135, 77139, 77143, 77147, 77151, 77155, 77159, 77163, + 77167, 77171, 77175, 77179, 77183, 77187, 77191, 77195, 77199, 77203, + 77207, 77211, 77215, 77219, 77223, 77227, 77231, 77235, 77239, 77243, + 77247, 77251, 77255, 77259, 77263, 77267, 77271, 77275, 77279, 77283, + 77287, 77291, 77295, 77299, 77303, 77307, 77311, 77315, 77319, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77323, 77328, 77333, 77338, 77343, + 77348, 77356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77361, 77368, 77375, + 77382, 77389, 0, 0, 0, 0, 0, 77396, 77403, 77410, 77420, 77426, 77432, + 77438, 77444, 77450, 77456, 77463, 77469, 77475, 77481, 77490, 77499, + 77511, 77523, 77529, 77535, 77541, 77548, 77555, 77562, 77569, 77576, 0, + 77583, 77590, 77597, 77605, 77612, 0, 77619, 0, 77626, 77633, 0, 77640, + 77648, 0, 77655, 77662, 77669, 77676, 77683, 77690, 77697, 77704, 77711, + 77718, 77723, 77730, 77737, 77743, 77749, 77755, 77761, 77767, 77773, + 77779, 77785, 77791, 77797, 77803, 77809, 77815, 77821, 77827, 77833, + 77839, 77845, 77851, 77857, 77863, 77869, 77875, 77881, 77887, 77893, + 77899, 77905, 77911, 77917, 77923, 77929, 77935, 77941, 77947, 77953, + 77959, 77965, 77971, 77977, 77983, 77989, 77995, 78001, 78007, 78013, + 78019, 78025, 78031, 78037, 78043, 78049, 78055, 78061, 78067, 78073, + 78079, 78085, 78091, 78097, 78103, 78109, 78115, 78121, 78127, 78133, + 78139, 78145, 78151, 78157, 78163, 78169, 78175, 78181, 78187, 78193, + 78201, 78209, 78215, 78221, 78227, 78233, 78242, 78251, 78259, 78267, + 78275, 78283, 78291, 78299, 78307, 78315, 78322, 78329, 78339, 78349, + 78353, 78357, 78362, 78367, 78372, 78377, 78386, 78395, 78401, 78407, + 78414, 78421, 78428, 78432, 78438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 78444, 78450, 78456, 78462, 78468, 78473, 78478, 78484, + 78490, 78496, 78502, 78510, 78516, 78522, 78530, 78538, 78546, 78554, + 78559, 78564, 78569, 78574, 78587, 78600, 78610, 78620, 78631, 78642, + 78653, 78664, 78674, 78684, 78695, 78706, 78717, 78728, 78738, 78748, + 78758, 78774, 78790, 78806, 78813, 78820, 78827, 78834, 78844, 78854, + 78864, 78876, 78886, 78894, 78902, 78911, 78919, 78929, 78937, 78945, + 78953, 78962, 78970, 78980, 78988, 78996, 79004, 79014, 79022, 79029, + 79036, 79043, 79050, 79058, 79066, 79074, 79082, 79090, 79099, 79107, + 79115, 79123, 79131, 79139, 79148, 79156, 79164, 79172, 79180, 79188, + 79196, 79204, 79212, 79220, 79228, 79237, 79245, 79255, 79263, 79271, + 79279, 79289, 79297, 79305, 79313, 79321, 79330, 79339, 79347, 79357, + 79365, 79373, 79381, 79390, 79398, 79408, 79416, 79423, 79430, 79438, + 79445, 79454, 79461, 79469, 79477, 79486, 79494, 79504, 79512, 79520, + 79528, 79538, 79546, 79553, 79560, 79568, 79575, 79584, 79591, 79601, + 79611, 79622, 79631, 79640, 79649, 79658, 79667, 79677, 79688, 79699, + 79709, 79720, 79732, 79742, 79751, 79760, 79768, 79777, 79787, 79795, + 79804, 79813, 79821, 79830, 79840, 79848, 79857, 79866, 79874, 79883, + 79893, 79901, 79911, 79919, 79929, 79937, 79945, 79954, 79962, 79972, + 79980, 79988, 79998, 80006, 80013, 80020, 80029, 80038, 80046, 80055, + 80065, 80073, 80084, 80092, 80100, 80107, 80115, 80124, 80131, 80141, + 80151, 80162, 80172, 80183, 80191, 80199, 80208, 80216, 80225, 80233, + 80241, 80250, 80258, 80267, 80275, 80282, 80289, 80296, 80303, 80311, + 80319, 80327, 80335, 80344, 80352, 80360, 80369, 80377, 80385, 80393, + 80402, 80410, 80418, 80426, 80434, 80442, 80450, 80458, 80466, 80474, + 80483, 80491, 80499, 80507, 80515, 80523, 80532, 80541, 80549, 80557, + 80565, 80574, 80582, 80591, 80598, 80605, 80613, 80620, 80628, 80636, + 80645, 80653, 80662, 80670, 80678, 80688, 80695, 80702, 80710, 80717, + 80725, 80735, 80746, 80754, 80763, 80771, 80780, 80788, 80797, 80805, + 80814, 80822, 80831, 80840, 80848, 80856, 80864, 80873, 80880, 80888, + 80897, 80906, 80915, 80925, 80933, 80943, 80951, 80961, 80969, 80979, + 80987, 80997, 81005, 81014, 81021, 81030, 81037, 81047, 81055, 81065, + 81073, 81083, 81091, 81099, 81107, 81116, 81124, 81133, 81142, 81151, + 81160, 81170, 81178, 81188, 81196, 81206, 81214, 81224, 81232, 81242, + 81250, 81259, 81266, 81275, 81282, 81292, 81300, 81310, 81318, 81328, + 81336, 81344, 81352, 81361, 81369, 81378, 81387, 81396, 81405, 81413, + 81421, 81430, 81438, 81447, 81456, 81464, 81472, 81480, 81489, 81497, + 81505, 81514, 81522, 81530, 81538, 81546, 81551, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 81556, 81566, 81576, 81586, 81596, 81607, 81617, + 81627, 81638, 81647, 81656, 81665, 81676, 81686, 81696, 81708, 81718, + 81728, 81738, 81748, 81758, 81768, 81778, 81788, 81798, 81808, 81818, + 81829, 81840, 81850, 81860, 81872, 81883, 81894, 81904, 81914, 81924, + 81934, 81944, 81954, 81964, 81976, 81986, 81996, 82008, 82019, 82030, + 82040, 82050, 82060, 82070, 82082, 82092, 82102, 82113, 82124, 82134, + 82144, 82153, 82162, 82171, 82180, 82189, 82199, 0, 0, 82209, 82219, + 82229, 82239, 82249, 82261, 82271, 82281, 82293, 82303, 82315, 82324, + 82333, 82344, 82354, 82366, 82377, 82390, 82400, 82412, 82421, 82432, + 82443, 82456, 82466, 82476, 82486, 82496, 82506, 82515, 82524, 82533, + 82542, 82552, 82562, 82572, 82582, 82592, 82602, 82612, 82622, 82632, + 82642, 82652, 82662, 82671, 82680, 82689, 82699, 82709, 82719, 82729, + 82739, 82750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82760, 82775, + 82790, 82796, 82802, 82808, 82814, 82820, 82826, 82832, 82838, 82846, + 82850, 82853, 0, 0, 82861, 82864, 82867, 82870, 82873, 82876, 82879, + 82882, 82885, 82888, 82891, 82894, 82897, 82900, 82903, 82906, 82909, + 82917, 82926, 82937, 82945, 82953, 82962, 82971, 82982, 82994, 0, 0, 0, + 0, 0, 0, 83003, 83008, 83013, 83020, 83027, 83033, 83039, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 83044, 83054, 83064, 83074, 83083, 83094, 83103, 83112, + 83122, 83132, 83144, 83156, 83167, 83178, 83189, 83200, 83210, 83220, + 83230, 83240, 83251, 83262, 83266, 83271, 83280, 83289, 83293, 83297, + 83301, 83306, 83311, 83316, 83321, 83324, 83328, 0, 83333, 83336, 83339, + 83343, 83347, 83352, 83356, 83360, 83365, 83370, 83377, 83384, 83387, + 83390, 83393, 83396, 83399, 83403, 83407, 0, 83411, 83416, 83420, 83424, + 0, 0, 0, 0, 83429, 83434, 83441, 83446, 83451, 0, 83456, 83461, 83466, + 83471, 83476, 83481, 83486, 83491, 83496, 83501, 83506, 83511, 83520, + 83529, 83537, 83545, 83554, 83563, 83572, 83581, 83589, 83597, 83605, + 83613, 83618, 83623, 83629, 83635, 83641, 83647, 83655, 83663, 83669, + 83675, 83681, 83687, 83693, 83699, 83705, 83711, 83716, 83721, 83726, + 83731, 83736, 83741, 83746, 83751, 83757, 83763, 83769, 83775, 83781, + 83787, 83793, 83799, 83805, 83811, 83817, 83823, 83829, 83835, 83841, + 83847, 83853, 83859, 83865, 83871, 83877, 83883, 83889, 83895, 83901, + 83907, 83913, 83919, 83925, 83931, 83937, 83943, 83949, 83955, 83961, + 83967, 83973, 83979, 83985, 83991, 83997, 84003, 84009, 84015, 84021, + 84027, 84033, 84039, 84045, 84051, 84057, 84063, 84069, 84075, 84081, + 84087, 84093, 84099, 84105, 84111, 84116, 84121, 84126, 84131, 84137, + 84143, 84149, 84155, 84161, 84167, 84173, 84179, 84185, 84191, 84198, + 84205, 84210, 84215, 84220, 84225, 84237, 84249, 84260, 84271, 84283, + 84295, 84303, 0, 0, 84311, 0, 84319, 84323, 84327, 84330, 84334, 84338, + 84341, 84344, 84348, 84352, 84355, 84358, 84361, 84364, 84369, 84372, + 84376, 84379, 84382, 84385, 84388, 84391, 84394, 84397, 84400, 84403, + 84406, 84409, 84413, 84417, 84421, 84425, 84430, 84435, 84441, 84447, + 84453, 84458, 84464, 84470, 84476, 84481, 84487, 84493, 84498, 84503, + 84508, 84513, 84519, 84525, 84530, 84535, 84541, 84546, 84552, 84558, + 84564, 84570, 84576, 84580, 84585, 84589, 84594, 84598, 84603, 84608, + 84614, 84620, 84626, 84631, 84637, 84643, 84649, 84654, 84660, 84666, + 84671, 84676, 84681, 84686, 84692, 84698, 84703, 84708, 84714, 84719, + 84725, 84731, 84737, 84743, 84749, 84754, 84758, 84763, 84765, 84770, + 84775, 84781, 84786, 84791, 84795, 84801, 84806, 84811, 84816, 84821, + 84826, 84831, 84836, 84842, 84848, 84854, 84862, 84866, 84870, 84874, + 84878, 84882, 84886, 84891, 84896, 84901, 84906, 84911, 84916, 84921, + 84926, 84931, 84936, 84941, 84946, 84951, 84955, 84959, 84964, 84969, + 84974, 84979, 84983, 84988, 84993, 84998, 85003, 85007, 85012, 85017, + 85022, 85027, 85031, 85036, 85041, 85045, 85050, 85055, 85060, 85065, + 85070, 85074, 85081, 85088, 85092, 85097, 85102, 85107, 85112, 85117, + 85122, 85127, 85132, 85137, 85142, 85147, 85152, 85157, 85162, 85167, + 85172, 85177, 85182, 85187, 85192, 85197, 85202, 85207, 85212, 85217, + 85222, 85227, 85232, 85237, 0, 0, 0, 85242, 85246, 85251, 85255, 85260, + 85265, 0, 0, 85269, 85274, 85279, 85283, 85288, 85293, 0, 0, 85298, + 85303, 85307, 85312, 85317, 85322, 0, 0, 85327, 85332, 85337, 0, 0, 0, + 85341, 85345, 85349, 85353, 85356, 85360, 85364, 0, 85368, 85374, 85377, + 85381, 85384, 85388, 85392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85396, 85402, + 85408, 85414, 85420, 0, 0, 85424, 85430, 85436, 85442, 85448, 85454, + 85461, 85468, 85475, 85482, 85489, 85496, 0, 85503, 85510, 85517, 85523, + 85530, 85537, 85544, 85551, 85557, 85564, 85571, 85578, 85585, 85591, + 85598, 85605, 85612, 85619, 85625, 85632, 85639, 85646, 85653, 85660, + 85667, 85674, 0, 85681, 85687, 85694, 85701, 85708, 85715, 85722, 85729, + 85736, 85743, 85750, 85757, 85764, 85771, 85777, 85784, 85791, 85798, + 85805, 0, 85812, 85819, 0, 85826, 85833, 85840, 85847, 85854, 85861, + 85868, 85875, 85882, 85889, 85896, 85903, 85910, 85917, 85924, 0, 0, + 85930, 85935, 85940, 85945, 85950, 85955, 85960, 85965, 85970, 85975, + 85980, 85985, 85990, 85995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86000, 86007, + 86014, 86021, 86028, 86035, 86042, 86049, 86056, 86063, 86070, 86077, + 86084, 86091, 86098, 86105, 86112, 86119, 86126, 86133, 86141, 86149, + 86156, 86163, 86168, 86176, 86184, 86191, 86198, 86203, 86210, 86215, + 86220, 86227, 86232, 86237, 86242, 86250, 86255, 86260, 86267, 86272, + 86277, 86284, 86291, 86296, 86301, 86306, 86311, 86316, 86321, 86326, + 86331, 86336, 86343, 86348, 86355, 86360, 86365, 86370, 86375, 86380, + 86385, 86390, 86395, 86400, 86405, 86410, 86417, 86424, 86431, 86438, + 86444, 86449, 86456, 86461, 86466, 86475, 86482, 86491, 86498, 86503, + 86508, 86516, 86521, 86526, 86531, 86536, 86541, 86548, 86553, 86558, + 86563, 86568, 86573, 86580, 86587, 86594, 86601, 86608, 86615, 86622, + 86629, 86636, 86643, 86650, 86657, 86664, 86671, 86678, 86685, 86692, + 86699, 86706, 86713, 86720, 86727, 86734, 86741, 86748, 86755, 86762, + 86769, 0, 0, 0, 0, 0, 86776, 86784, 86792, 0, 0, 0, 0, 86797, 86801, + 86805, 86809, 86813, 86817, 86821, 86825, 86829, 86833, 86838, 86843, + 86848, 86853, 86858, 86863, 86868, 86873, 86878, 86884, 86890, 86896, + 86903, 86910, 86917, 86924, 86931, 86938, 86944, 86950, 86956, 86963, + 86970, 86977, 86984, 86991, 86998, 87005, 87012, 87019, 87026, 87033, + 87040, 87047, 87054, 0, 0, 0, 87061, 87069, 87077, 87085, 87093, 87101, + 87111, 87121, 87129, 87137, 87145, 87153, 87161, 87167, 87174, 87183, + 87192, 87201, 87210, 87219, 87228, 87238, 87249, 87259, 87270, 87279, + 87288, 87297, 87307, 87318, 87328, 87339, 87350, 87359, 87367, 87373, + 87379, 87385, 87391, 87399, 87407, 87413, 87420, 87430, 87437, 87444, + 87451, 87458, 87465, 87475, 87482, 87489, 87497, 87505, 87514, 87523, + 87532, 87541, 87550, 87558, 87567, 87576, 87585, 87589, 87596, 87601, + 87606, 87610, 87614, 87618, 87622, 87627, 87632, 87638, 87644, 87648, + 87654, 87658, 87662, 87666, 87670, 87674, 87678, 87684, 0, 0, 0, 0, 0, + 87688, 87693, 87698, 87703, 87708, 87715, 87720, 87725, 87730, 87735, + 87740, 87745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 87750, 87757, 87766, 87775, 87782, 87789, 87796, + 87803, 87810, 87817, 87823, 87830, 87837, 87844, 87851, 87858, 87865, + 87872, 87879, 87888, 87895, 87902, 87909, 87916, 87923, 87930, 87937, + 87944, 87953, 87960, 87967, 87974, 87981, 87988, 87995, 88004, 88011, + 88018, 88025, 88032, 88041, 88048, 88055, 88062, 88070, 88079, 0, 0, + 88088, 88092, 88096, 88101, 88106, 88111, 88116, 88120, 88125, 88130, + 88135, 88140, 88145, 88150, 88154, 88158, 88162, 88167, 88172, 88176, + 88181, 88186, 88190, 88194, 88199, 88204, 88209, 88214, 88219, 0, 0, 0, + 88224, 88228, 88233, 88238, 88242, 88247, 88251, 88256, 88261, 88266, + 88271, 88275, 88279, 88284, 88289, 88294, 88299, 88303, 88308, 88312, + 88317, 88322, 88326, 88331, 88336, 88341, 88345, 88349, 88354, 88359, + 88364, 88369, 88374, 88379, 88384, 88389, 88394, 88399, 88404, 88409, + 88414, 88419, 88424, 88429, 88434, 88439, 88444, 88449, 88454, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88459, 88463, + 88468, 88473, 88478, 88482, 88487, 88492, 88497, 88502, 88506, 88510, + 88515, 88520, 88525, 88530, 88534, 88539, 88544, 88549, 88554, 88559, + 88564, 88568, 88573, 88578, 88583, 88588, 88593, 88598, 88603, 0, 88608, + 88613, 88618, 88624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88630, 88635, + 88640, 88645, 88650, 88655, 88660, 88665, 88670, 88675, 88680, 88685, + 88690, 88695, 88700, 88705, 88710, 88715, 88720, 88725, 88730, 88735, + 88740, 88745, 88750, 88755, 88760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88767, 88772, 88777, + 88782, 88787, 88792, 88797, 88802, 88807, 88812, 88817, 88822, 88827, + 88832, 88837, 88842, 88847, 88852, 88857, 88862, 88867, 88872, 88877, + 88882, 88887, 88892, 88897, 88901, 88905, 88909, 0, 88914, 88920, 88925, + 88930, 88935, 88940, 88946, 88952, 88958, 88964, 88970, 88976, 88982, + 88988, 88994, 89000, 89006, 89012, 89018, 89023, 89029, 89035, 89040, + 89046, 89051, 89057, 89063, 89068, 89074, 89080, 89085, 89091, 89097, + 89103, 89109, 89115, 89121, 0, 0, 0, 0, 89126, 89132, 89138, 89144, + 89150, 89156, 89162, 89168, 89174, 89181, 89186, 89191, 89197, 89203, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89209, 89214, 89219, + 89224, 89230, 89235, 89241, 89247, 89253, 89259, 89266, 89272, 89279, + 89284, 89289, 89294, 89299, 89304, 89309, 89314, 89319, 89324, 89329, + 89334, 89339, 89344, 89349, 89354, 89359, 89364, 89369, 89374, 89379, + 89384, 89389, 89394, 89399, 89404, 89409, 89414, 89419, 89424, 89429, + 89434, 89440, 89445, 89451, 89457, 89463, 89469, 89476, 89482, 89489, + 89494, 89499, 89504, 89509, 89514, 89519, 89524, 89529, 89534, 89539, + 89544, 89549, 89554, 89559, 89564, 89569, 89574, 89579, 89584, 89589, + 89594, 89599, 89604, 89609, 89614, 89619, 89624, 89629, 89634, 89639, + 89644, 89649, 89654, 89659, 89664, 89669, 89674, 89679, 89684, 89689, + 89694, 89699, 89704, 89709, 89714, 89719, 89724, 89729, 89734, 89739, + 89744, 89749, 89754, 89759, 89764, 89769, 89774, 89779, 89784, 89789, + 89794, 89799, 89804, 89809, 89814, 89819, 89824, 89829, 89834, 89839, + 89844, 89849, 89854, 89859, 89864, 89869, 89874, 89879, 89884, 89889, + 89894, 89899, 89904, 89908, 89913, 89918, 89923, 89928, 89933, 89938, + 89943, 89948, 89953, 89958, 89963, 89968, 89972, 89976, 89980, 89984, + 89988, 89992, 89996, 90001, 90006, 0, 0, 90011, 90016, 90020, 90024, + 90028, 90032, 90036, 90040, 90044, 90048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90052, 90056, 90060, 90064, 90068, 90072, 0, 0, 90077, 0, + 90082, 90086, 90091, 90096, 90101, 90106, 90111, 90116, 90121, 90126, + 90131, 90135, 90140, 90145, 90150, 90155, 90159, 90164, 90169, 90174, + 90179, 90183, 90188, 90193, 90198, 90203, 90207, 90212, 90217, 90222, + 90227, 90232, 90237, 90242, 90247, 90252, 90257, 90262, 90267, 90271, + 90276, 90281, 90286, 90291, 0, 90296, 90301, 0, 0, 0, 90306, 0, 0, 90311, + 90316, 90323, 90330, 90337, 90344, 90351, 90358, 90365, 90372, 90379, + 90386, 90393, 90400, 90407, 90414, 90421, 90428, 90435, 90442, 90449, + 90456, 90463, 0, 90470, 90477, 90483, 90489, 90495, 90502, 90509, 90517, + 90525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90534, 90539, 90544, 90549, 90554, 90559, + 90564, 90569, 90574, 90579, 90584, 90589, 90594, 90599, 90604, 90609, + 90614, 90619, 90624, 90629, 90634, 90639, 90644, 90648, 90653, 90658, + 90664, 90668, 0, 0, 0, 90672, 90678, 90682, 90687, 90692, 90697, 90701, + 90706, 90710, 90715, 90720, 90724, 90728, 90732, 90736, 90740, 90745, + 90750, 90754, 90759, 90764, 90768, 90773, 90778, 90783, 90788, 90793, 0, + 0, 0, 0, 0, 90798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90803, + 90807, 90812, 90817, 0, 90823, 90828, 0, 0, 0, 0, 0, 90833, 90839, 90846, + 90851, 90856, 90860, 90865, 90870, 0, 90875, 90880, 90885, 0, 90890, + 90895, 90900, 90905, 90910, 90915, 90920, 90925, 90930, 90935, 90940, + 90944, 90948, 90953, 90958, 90963, 90967, 90971, 90975, 90980, 90985, + 90990, 90995, 91000, 91005, 91009, 91014, 0, 0, 0, 0, 91019, 91025, + 91030, 0, 0, 0, 0, 91035, 91039, 91043, 91047, 91051, 91055, 91060, + 91065, 91071, 0, 0, 0, 0, 0, 0, 0, 0, 91077, 91083, 91090, 91096, 91103, + 91109, 91115, 91121, 91128, 0, 0, 0, 0, 0, 0, 0, 91134, 91142, 91150, + 91158, 91166, 91174, 91182, 91190, 91198, 91206, 91214, 91222, 91230, + 91238, 91246, 91254, 91262, 91270, 91278, 91286, 91294, 91302, 91310, + 91318, 91326, 91334, 91342, 91350, 91358, 91366, 91373, 91381, 91389, + 91393, 91398, 91403, 91408, 91413, 91418, 91423, 91428, 91432, 91437, + 91441, 91446, 91450, 91455, 91459, 91464, 91469, 91474, 91479, 91484, + 91489, 91494, 91499, 91504, 91509, 91514, 91519, 91524, 91529, 91534, + 91539, 91544, 91549, 91554, 91559, 91564, 91569, 91574, 91579, 91584, + 91589, 91594, 91599, 91604, 91609, 91614, 91619, 91624, 91629, 91634, + 91639, 91644, 91649, 0, 0, 0, 91654, 91659, 91668, 91676, 91685, 91694, + 91705, 91716, 91723, 91730, 91737, 91744, 91751, 91758, 91765, 91772, + 91779, 91786, 91793, 91800, 91807, 91814, 91821, 91828, 91835, 91842, + 91849, 91856, 91863, 0, 0, 91870, 91876, 91882, 91888, 91894, 91901, + 91908, 91916, 91924, 91931, 91938, 91945, 91952, 91959, 91966, 91973, + 91980, 91987, 91994, 92001, 92008, 92015, 92022, 92029, 92036, 92043, + 92050, 0, 0, 0, 0, 0, 92057, 92063, 92069, 92075, 92081, 92088, 92095, + 92103, 92111, 92117, 92123, 92130, 92136, 92142, 92148, 92154, 92161, + 92168, 92175, 92182, 92189, 92196, 92203, 92210, 92217, 92224, 92231, + 92238, 92245, 92252, 92259, 92266, 92273, 92280, 92287, 92294, 92301, + 92308, 92315, 92322, 92329, 92336, 92343, 92350, 92357, 92364, 92371, + 92378, 92385, 92392, 92399, 92406, 92413, 92420, 92427, 92434, 92441, + 92448, 92455, 92462, 92469, 92476, 92483, 92490, 92497, 92504, 92511, + 92518, 92525, 92532, 92539, 92546, 92553, 92560, 92567, 92574, 92581, + 92588, 92595, 92602, 92609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92616, 92620, 92624, + 92628, 92632, 92636, 92640, 92644, 92648, 92652, 92657, 92662, 92667, + 92672, 92677, 92682, 92687, 92692, 92697, 92703, 92709, 92715, 92722, + 92729, 92736, 92743, 92750, 92757, 92764, 92771, 92778, 0, 92785, 92789, + 92793, 92797, 92801, 92805, 92808, 92812, 92815, 92819, 92822, 92826, + 92830, 92835, 92839, 92844, 92847, 92851, 92854, 92858, 92861, 92865, + 92869, 92873, 92877, 92881, 92885, 92889, 92893, 92897, 92901, 92905, + 92909, 92913, 92917, 92921, 92925, 92929, 92933, 92936, 92939, 92943, + 92947, 92951, 92954, 92957, 92960, 92964, 92968, 92972, 92976, 92980, + 92983, 92987, 92993, 92999, 93005, 93010, 93017, 93021, 93026, 93030, + 93035, 93040, 93046, 93051, 93057, 93061, 93066, 93070, 93075, 93078, + 93081, 93085, 93090, 93096, 93101, 93107, 0, 0, 0, 0, 93112, 93115, + 93118, 93121, 93124, 93127, 93130, 93133, 93136, 93139, 93143, 93147, + 93151, 93155, 93159, 93163, 93167, 93171, 93175, 93180, 93185, 93189, + 93192, 93195, 93198, 93201, 93204, 93207, 93210, 93213, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93216, 93221, 93226, 93231, 93235, 93240, + 93244, 93249, 93253, 93258, 93262, 93267, 93271, 93276, 93280, 93285, + 93290, 93295, 93300, 93305, 93310, 93315, 93320, 93325, 93330, 93335, + 93340, 93345, 93350, 93355, 93360, 93365, 93370, 93375, 93380, 93384, + 93388, 93393, 93398, 93403, 93407, 93411, 93415, 93420, 93425, 93430, + 93435, 93440, 93444, 93450, 93455, 93461, 93466, 93472, 93477, 93483, + 93488, 93494, 93499, 93504, 93509, 93514, 93518, 93523, 93529, 93533, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93538, 93541, 93546, 93552, 93560, + 93565, 93571, 93579, 93585, 93591, 93595, 93599, 93606, 93615, 93622, + 93631, 93637, 93646, 93653, 93660, 93667, 93677, 93683, 93687, 93694, + 93703, 93713, 93720, 93727, 93731, 93735, 93742, 93752, 93756, 93763, + 93770, 93777, 93783, 93790, 93797, 93804, 93811, 93815, 93819, 93823, + 93830, 93834, 93841, 93848, 93862, 93871, 93875, 93879, 93883, 93890, + 93894, 93898, 93902, 93910, 93918, 93937, 93947, 93967, 93971, 93975, + 93979, 93983, 93987, 93991, 93995, 94002, 94006, 94009, 94013, 94017, + 94023, 94030, 94039, 94043, 94052, 94061, 94069, 94073, 94080, 94084, + 94088, 94092, 94096, 94107, 94116, 94125, 94134, 94143, 94155, 94164, + 94173, 94182, 94190, 94199, 94211, 94220, 94229, 94238, 94250, 94259, + 94268, 94280, 94289, 94298, 94310, 94319, 94323, 94327, 94331, 94335, + 94339, 94343, 94347, 94354, 94358, 94362, 94373, 94377, 94381, 94388, + 94394, 94400, 94404, 94411, 94415, 94419, 94423, 94427, 94431, 94435, + 94441, 94449, 94453, 94457, 94460, 94466, 94476, 94480, 94492, 94499, + 94506, 94513, 94520, 94526, 94530, 94534, 94538, 94542, 94549, 94558, + 94565, 94573, 94581, 94587, 94591, 94595, 94599, 94603, 94609, 94618, + 94630, 94637, 94644, 94653, 94664, 94670, 94679, 94688, 94695, 94704, + 94711, 94718, 94728, 94735, 94742, 94749, 94756, 94760, 94766, 94770, + 94781, 94789, 94798, 94810, 94817, 94824, 94834, 94841, 94850, 94857, + 94866, 94873, 94880, 94890, 94897, 94904, 94914, 94921, 94933, 94942, + 94949, 94956, 94963, 94972, 94982, 94995, 95002, 95012, 95022, 95029, + 95038, 95051, 95058, 95065, 95072, 95082, 95092, 95099, 95109, 95116, + 95123, 95133, 95139, 95146, 95153, 95160, 95170, 95177, 95184, 95191, + 95197, 95204, 95214, 95221, 95225, 95233, 95237, 95249, 95253, 95267, + 95271, 95275, 95279, 95283, 95289, 95296, 95304, 95308, 95312, 95316, + 95320, 95327, 95331, 95337, 95343, 95351, 95355, 95362, 95370, 95374, + 95378, 95384, 95388, 95397, 95406, 95413, 95423, 95429, 95433, 95437, + 95445, 95452, 95459, 95465, 95469, 95477, 95481, 95488, 95500, 95507, + 95517, 95523, 95527, 95536, 95543, 95552, 95556, 95560, 95567, 95571, + 95575, 95579, 95583, 95586, 95592, 95598, 95602, 95606, 95613, 95620, + 95627, 95634, 95641, 95648, 95655, 95662, 95668, 95672, 95676, 95683, + 95690, 95697, 95704, 95711, 95715, 95718, 95723, 95727, 95731, 95740, + 95749, 95753, 95757, 95763, 95769, 95786, 95792, 95796, 95805, 95809, + 95813, 95820, 95828, 95836, 95842, 95846, 95850, 95854, 95858, 95861, + 95867, 95874, 95884, 95891, 95898, 95905, 95911, 95918, 95925, 95932, + 95939, 95946, 95955, 95962, 95974, 95981, 95988, 95998, 96009, 96016, + 96023, 96030, 96037, 96044, 96051, 96058, 96065, 96072, 96079, 96089, + 96099, 96109, 96116, 96126, 96133, 96140, 96147, 96154, 96161, 96168, + 96175, 96182, 96189, 96196, 96203, 96210, 96217, 96223, 96230, 96237, + 96246, 96253, 96260, 96264, 96272, 96276, 96280, 96284, 96288, 96292, + 96299, 96303, 96312, 96316, 96323, 96331, 96335, 96339, 96343, 96356, + 96372, 96376, 96380, 96387, 96393, 96400, 96404, 96408, 96412, 96416, + 96420, 96427, 96431, 96449, 96453, 96457, 96464, 96468, 96472, 96478, + 96482, 96486, 96494, 96498, 96502, 96506, 96510, 96516, 96527, 96536, + 96545, 96552, 96559, 96570, 96577, 96584, 96591, 96598, 96605, 96612, + 96619, 96629, 96635, 96642, 96652, 96661, 96668, 96677, 96687, 96694, + 96701, 96708, 96715, 96727, 96734, 96741, 96748, 96755, 96762, 96772, + 96779, 96786, 96796, 96809, 96821, 96828, 96838, 96845, 96852, 96859, + 96873, 96879, 96887, 96897, 96907, 96914, 96921, 96927, 96931, 96938, + 96948, 96954, 96967, 96971, 96975, 96982, 96986, 96993, 97003, 97007, + 97011, 97015, 97019, 97023, 97030, 97034, 97041, 97048, 97055, 97064, + 97073, 97083, 97090, 97097, 97104, 97114, 97121, 97131, 97138, 97148, + 97155, 97162, 97172, 97182, 97189, 97195, 97203, 97211, 97217, 97223, + 97227, 97231, 97238, 97246, 97252, 97256, 97260, 97264, 97271, 97283, + 97286, 97293, 97299, 97303, 97307, 97311, 97315, 97319, 97323, 97327, + 97331, 97335, 97339, 97346, 97350, 97356, 97360, 97364, 97368, 97374, + 97381, 97388, 97395, 97406, 97414, 97418, 97424, 97433, 97440, 97446, + 97449, 97453, 97457, 97463, 97472, 97480, 97484, 97490, 97494, 97498, + 97502, 97508, 97515, 97521, 97525, 97531, 97535, 97539, 97548, 97560, + 97564, 97571, 97578, 97588, 97595, 97607, 97614, 97621, 97628, 97639, + 97649, 97662, 97672, 97679, 97683, 97687, 97691, 97695, 97704, 97713, + 97722, 97739, 97748, 97754, 97761, 97769, 97782, 97786, 97795, 97804, + 97813, 97822, 97833, 97842, 97851, 97860, 97869, 97878, 97887, 97897, + 97900, 97904, 97908, 97912, 97916, 97920, 97926, 97933, 97940, 97947, + 97953, 97959, 97966, 97972, 97979, 97987, 97991, 97998, 98005, 98012, + 98020, 98023, 98027, 98031, 98035, 98039, 98045, 98049, 98055, 98062, + 98069, 98075, 98082, 98089, 98096, 98103, 98110, 98117, 98124, 98131, + 98138, 98145, 98152, 98159, 98166, 98173, 98179, 98183, 98192, 98196, + 98200, 98204, 98208, 98214, 98221, 98228, 98235, 98242, 98249, 98255, + 98263, 98267, 98271, 98275, 98279, 98285, 98302, 98319, 98323, 98327, + 98331, 98335, 98339, 98343, 98349, 98356, 98360, 98366, 98373, 98380, + 98387, 98394, 98401, 98410, 98417, 98424, 98431, 98438, 98442, 98446, + 98452, 98464, 98468, 98472, 98481, 98485, 98489, 98493, 98499, 98503, + 98507, 98516, 98520, 98524, 98528, 98535, 98539, 98543, 98547, 98551, + 98555, 98559, 98563, 98567, 98573, 98580, 98587, 98593, 98597, 98614, + 98620, 98624, 98630, 98636, 98642, 98648, 98654, 98660, 98664, 98668, + 98672, 98678, 98682, 98688, 98692, 98696, 98703, 98710, 98727, 98731, + 98735, 98739, 98743, 98747, 98759, 98762, 98767, 98772, 98787, 98797, + 98809, 98813, 98817, 98821, 98827, 98834, 98841, 98851, 98863, 98869, + 98875, 98884, 98888, 98892, 98899, 98909, 98916, 98922, 98926, 98930, + 98937, 98943, 98947, 98953, 98957, 98965, 98971, 98975, 98983, 98991, + 98998, 99004, 99011, 99018, 99028, 99038, 99042, 99046, 99050, 99054, + 99060, 99067, 99073, 99080, 99087, 99094, 99103, 99110, 99117, 99123, + 99130, 99137, 99144, 99151, 99158, 99165, 99171, 99178, 99185, 99192, + 99201, 99208, 99215, 99219, 99225, 99229, 99235, 99242, 99249, 99256, + 99260, 99264, 99268, 99272, 99276, 99283, 99287, 99291, 99297, 99305, + 99309, 99313, 99317, 99321, 99328, 99332, 99336, 99344, 99348, 99352, + 99356, 99360, 99366, 99370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 99374, 99380, 99386, 99393, 99400, 99407, 99414, 99421, 99428, + 99434, 99441, 99448, 99455, 99462, 99469, 99476, 99482, 99488, 99494, + 99500, 99506, 99512, 99518, 99524, 99530, 99537, 99544, 99551, 99558, + 99565, 99572, 99578, 99584, 99590, 99597, 99604, 99610, 99616, 99625, + 99632, 99639, 99646, 99653, 99660, 99667, 99673, 99679, 99685, 99694, + 99701, 99708, 99719, 99730, 99736, 99742, 99748, 99757, 99764, 99771, + 99781, 99791, 99802, 99813, 99825, 99838, 99849, 99860, 99872, 99885, + 99896, 99907, 99918, 99929, 99940, 99952, 99960, 99968, 99977, 99986, + 99995, 100001, 100007, 100013, 100020, 100030, 100037, 100047, 100052, + 100057, 100063, 100069, 100077, 100085, 100094, 100105, 100116, 100124, + 100132, 100141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100150, 100161, + 100168, 100176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100184, 100188, + 100192, 100196, 100200, 100204, 100208, 100212, 100216, 100220, 100224, + 100228, 100232, 100236, 100240, 100244, 100248, 100252, 100256, 100260, + 100264, 100268, 100272, 100276, 100280, 100284, 100288, 100292, 100296, + 100300, 100304, 100308, 100312, 100316, 100320, 100324, 100328, 100332, + 100336, 100340, 100344, 100348, 100352, 100356, 100360, 100364, 100368, + 100372, 100376, 100380, 100384, 100388, 100392, 100396, 100400, 100404, + 100408, 100412, 100416, 100420, 100424, 100428, 100432, 100436, 100440, + 100444, 100448, 100452, 100456, 100460, 100464, 100468, 100472, 100476, + 100480, 100484, 100488, 100492, 100496, 100500, 100504, 100508, 100512, + 100516, 100520, 100524, 100528, 100532, 100536, 100540, 100544, 100548, + 100552, 100556, 100560, 100564, 100568, 100572, 100576, 100580, 100584, + 100588, 100592, 100596, 100600, 100604, 100608, 100612, 100616, 100620, + 100624, 100628, 100632, 100636, 100640, 100644, 100648, 100652, 100656, + 100660, 100664, 100668, 100672, 100676, 100680, 100684, 100688, 100692, + 100696, 100700, 100704, 100708, 100712, 100716, 100720, 100724, 100728, + 100732, 100736, 100740, 100744, 100748, 100752, 100756, 100760, 100764, + 100768, 100772, 100776, 100780, 100784, 100788, 100792, 100796, 100800, + 100804, 100808, 100812, 100816, 100820, 100824, 100828, 100832, 100836, + 100840, 100844, 100848, 100852, 100856, 100860, 100864, 100868, 100872, + 100876, 100880, 100884, 100888, 100892, 100896, 100900, 100904, 100908, + 100912, 100916, 100920, 100924, 100928, 100932, 100936, 100940, 100944, + 100948, 100952, 100956, 100960, 100964, 100968, 100972, 100976, 100980, + 100984, 100988, 100992, 100996, 101000, 101004, 101008, 101012, 101016, + 101020, 101024, 101028, 101032, 101036, 101040, 101044, 101048, 101052, + 101056, 101060, 101064, 101068, 101072, 101076, 101080, 101084, 101088, + 101092, 101096, 101100, 101104, 101108, 101112, 101116, 101120, 101124, + 101128, 101132, 101136, 101140, 101144, 101148, 101152, 101156, 101160, + 101164, 101168, 101172, 101176, 101180, 101184, 101188, 101192, 101196, + 101200, 101204, 101208, 101212, 101216, 101220, 101224, 101228, 101232, + 101236, 101240, 101244, 101248, 101252, 101256, 101260, 101264, 101268, + 101272, 101276, 101280, 101284, 101288, 101292, 101296, 101300, 101304, + 101308, 101312, 101316, 101320, 101324, 101328, 101332, 101336, 101340, + 101344, 101348, 101352, 101356, 101360, 101364, 101368, 101372, 101376, + 101380, 101384, 101388, 101392, 101396, 101400, 101404, 101408, 101412, + 101416, 101420, 101424, 101428, 101432, 101436, 101440, 101444, 101448, + 101452, 101456, 101460, 101464, 101468, 101472, 101476, 101480, 101484, + 101488, 101492, 101496, 101500, 101504, 101508, 101512, 101516, 101520, + 101524, 101528, 101532, 101536, 101540, 101544, 101548, 101552, 101556, + 101560, 101564, 101568, 101572, 101576, 101580, 101584, 101588, 101592, + 101596, 101600, 101604, 101608, 101612, 101616, 101620, 101624, 101628, + 101632, 101636, 101640, 101644, 101648, 101652, 101656, 101660, 101664, + 101668, 101672, 101676, 101680, 101684, 101688, 101692, 101696, 101700, + 101704, 101708, 101712, 101716, 101720, 101724, 101728, 101732, 101736, + 101740, 101744, 101748, 101752, 101756, 101760, 101764, 101768, 101772, + 101776, 101780, 101784, 101788, 101792, 101796, 101800, 101804, 101808, + 101812, 101816, 101820, 101824, 101828, 101832, 101836, 101840, 101844, + 101848, 101852, 101856, 101860, 101864, 101868, 101872, 101876, 101880, + 101884, 101888, 101892, 101896, 101900, 101904, 101908, 101912, 101916, + 101920, 101924, 101928, 101932, 101936, 101940, 101944, 101948, 101952, + 101956, 101960, 101964, 101968, 101972, 101976, 101980, 101984, 101988, + 101992, 101996, 102000, 102004, 102008, 102012, 102016, 102020, 102024, + 102028, 102032, 102036, 102040, 102044, 102048, 102052, 102056, 102060, + 102064, 102068, 102072, 102076, 102080, 102084, 102088, 102092, 102096, + 102100, 102104, 102108, 102112, 102116, 102120, 102124, 102128, 102132, + 102136, 102140, 102144, 102148, 102152, 102156, 102160, 102164, 102168, + 102172, 102176, 102180, 102184, 102188, 102192, 102196, 102200, 102204, + 102208, 102212, 102216, 102220, 102224, 102228, 102232, 102236, 102240, + 102244, 102248, 102252, 102256, 102260, 102264, 102268, 102272, 102276, + 102280, 102284, 102288, 102292, 102296, 102300, 102304, 102308, 102312, + 102316, 102320, 102324, 102328, 102332, 102336, 102340, 102344, 102348, + 102352, 102356, 102360, 102364, 102368, 102372, 102376, 102380, 102384, + 102388, 102392, 102396, 102400, 102404, 102408, 102412, 102416, 102420, + 102424, 102428, 102432, 102436, 102440, 102444, 102448, 102452, 102456, + 102460, 102464, 102468, 102472, 102476, 102480, 102484, 102488, 102492, + 102496, 102500, 102504, 102508, 102512, 102516, 102520, 102524, 102528, + 102532, 102536, 102540, 102544, 102548, 102552, 102556, 102560, 102564, + 102568, 102572, 102576, 102580, 102584, 102588, 102592, 102596, 102600, + 102604, 102608, 102612, 102616, 102620, 102624, 102628, 102632, 102636, + 102640, 102644, 102648, 102652, 102656, 102660, 102664, 102668, 102672, + 102676, 102680, 102684, 102688, 102692, 102696, 102700, 102704, 102708, + 102712, 102716, 102720, 102724, 102728, 102732, 102736, 102740, 102744, + 102748, 102752, 102756, 102760, 102764, 102768, 102772, 102776, 102780, + 102784, 102788, 102792, 102796, 102800, 102804, 102808, 102812, 102816, + 102820, 102824, 102828, 102832, 102836, 102840, 102844, 102848, 102852, + 102856, 102860, 102864, 102868, 102872, 102876, 102880, 102884, 102888, + 102892, 102896, 102900, 102904, 102908, 102912, 102916, 102920, 102924, + 102928, 102932, 102936, 102940, 102944, 102948, 102952, 102956, 102960, + 102964, 102968, 102972, 102976, 102980, 102984, 102988, 102992, 102996, + 103000, 103004, 103008, 103012, 103016, 103020, 103024, 103028, 103032, + 103036, 103040, 103044, 103048, 103052, 103056, 103060, 103064, 103068, + 103072, 103076, 103080, 103084, 103088, 103092, 103096, 103100, 103104, + 103108, 103112, 103116, 103120, 103124, 103128, 103132, 103136, 103140, + 103144, 103148, 103152, 103156, 103160, 103164, 103168, 103172, 103176, + 103180, 103184, 103188, 103192, 103196, 103200, 103204, 103208, 103212, + 103216, 103220, 103224, 103228, 103232, 103236, 103240, 103244, 103248, + 103252, 103256, 103260, 103264, 103268, 103272, 103276, 103280, 103284, + 103288, 103292, 103296, 103300, 103304, 103308, 103312, 103316, 103320, + 103324, 103328, 103332, 103336, 103340, 103344, 103348, 103352, 103356, + 103360, 103364, 103368, 103372, 103376, 103380, 103384, 103388, 103392, + 103396, 103400, 103404, 103408, 103412, 103416, 103420, 103424, 103428, + 103432, 103436, 103440, 103444, 103448, 103452, 103456, 103460, 103464, + 103468, 103472, 103476, 103480, 103484, 103488, 103492, 103496, 103500, + 103504, 103508, 103512, 103516, 103520, 103524, 103528, 103532, 103536, + 103540, 103544, 103548, 103552, 103556, 103560, 103564, 103568, 103572, + 103576, 103580, 103584, 103588, 103592, 103596, 103600, 103604, 103608, + 103612, 103616, 103620, 103624, 103628, 103632, 103636, 103640, 103644, + 103648, 103652, 103656, 103660, 103664, 103668, 103672, 103676, 103680, + 103684, 103688, 103692, 103696, 103700, 103704, 103708, 103712, 103716, + 103720, 103724, 103728, 103732, 103736, 103740, 103744, 103748, 103752, + 103756, 103760, 103764, 103768, 103772, 103776, 103780, 103784, 103788, + 103792, 103796, 103800, 103804, 103808, 103812, 103816, 103820, 103824, + 103828, 103832, 103836, 103840, 103844, 103848, 103852, 103856, 103860, + 103864, 103868, 103872, 103876, 103880, 103884, 103888, 103892, 103896, + 103900, 103904, 103908, 103912, 103916, 103920, 103924, 103928, 103932, + 103936, 103940, 103944, 103948, 103952, 103956, 103960, 103964, 103968, + 103972, 103976, 103980, 103984, 103988, 103992, 103996, 104000, 104004, + 104008, 104012, 104016, 104020, 104024, 104028, 104032, 104036, 104040, + 104044, 104048, 104052, 104056, 104060, 104064, 104068, 104072, 104076, + 104080, 104084, 104088, 104092, 104096, 104100, 104104, 104108, 104112, + 104116, 104120, 104124, 104128, 104132, 104136, 104140, 104144, 104148, + 104152, 104156, 104160, 104164, 104168, 104172, 104176, 104180, 104184, + 104188, 104192, 104196, 104200, 104204, 104208, 104212, 104216, 104220, + 104224, 104228, 104232, 104236, 104240, 104244, 104248, 104252, 104256, + 104260, 104264, 104268, 104272, 104276, 104280, 104284, 104288, 104292, + 104296, 104300, 104304, 104308, 104312, 104316, 104320, 104324, 104328, + 104332, 104336, 104340, 104344, 104348, 104352, 104356, 104360, 104364, + 104368, 104372, 104376, 104380, 104384, 104388, 104392, 104396, 104400, + 104404, 104408, 104412, 104416, 104420, 104424, 104428, 104432, 104436, + 104440, 104444, 104448, 104452, 104456, 104460, 104464, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 104468, 104475, 104482, 104491, 104500, 104507, 104512, 104519, + 104526, 104535, 104546, 104557, 104562, 104569, 104574, 104579, 104584, + 104589, 104594, 104599, 104604, 104609, 104614, 104619, 104624, 104631, + 104638, 104643, 104648, 104653, 104658, 104665, 104672, 104680, 104685, + 104692, 104697, 104702, 104707, 104712, 104717, 104724, 104731, 104736, + 104741, 104746, 104751, 104756, 104761, 104766, 104771, 104776, 104781, + 104786, 104791, 104796, 104801, 104806, 104811, 104816, 104821, 104826, + 104833, 104838, 104843, 104852, 104859, 104864, 104869, 104874, 104879, + 104884, 104889, 104894, 104899, 104904, 104909, 104914, 104919, 104924, + 104929, 104934, 104939, 104944, 104949, 104954, 104959, 104964, 104970, + 104978, 104984, 104992, 105000, 105008, 105014, 105020, 105026, 105032, + 105038, 105046, 105056, 105064, 105072, 105078, 105084, 105092, 105100, + 105106, 105114, 105122, 105130, 105136, 105142, 105148, 105154, 105160, + 105166, 105174, 105182, 105188, 105194, 105200, 105206, 105212, 105220, + 105226, 105232, 105238, 105244, 105250, 105256, 105264, 105270, 105276, + 105282, 105288, 105296, 105304, 105310, 105316, 105322, 105327, 105333, + 105339, 105346, 105351, 105356, 105361, 105366, 105371, 105376, 105381, + 105386, 105391, 105400, 105407, 105412, 105417, 105422, 105429, 105434, + 105439, 105444, 105451, 105456, 105461, 105466, 105471, 105476, 105481, + 105486, 105491, 105496, 105501, 105506, 105513, 105518, 105525, 105530, + 105535, 105542, 105547, 105552, 105557, 105562, 105567, 105572, 105577, + 105582, 105587, 105592, 105597, 105602, 105607, 105612, 105617, 105622, + 105627, 105632, 105637, 105644, 105649, 105654, 105659, 105664, 105669, + 105674, 105679, 105684, 105689, 105694, 105699, 105704, 105709, 105716, + 105721, 105726, 105733, 105738, 105743, 105748, 105753, 105758, 105763, + 105768, 105773, 105778, 105783, 105790, 105795, 105800, 105805, 105810, + 105815, 105822, 105829, 105834, 105839, 105844, 105849, 105854, 105859, + 105864, 105869, 105874, 105879, 105884, 105889, 105894, 105899, 105904, + 105909, 105914, 105919, 105924, 105929, 105934, 105939, 105944, 105949, + 105954, 105959, 105964, 105969, 105974, 105979, 105984, 105989, 105994, + 105999, 106004, 106009, 106016, 106021, 106026, 106031, 106036, 106041, + 106046, 106051, 106056, 106061, 106066, 106071, 106076, 106081, 106086, + 106091, 106096, 106101, 106106, 106111, 106116, 106121, 106126, 106131, + 106136, 106141, 106146, 106151, 106156, 106161, 106166, 106171, 106176, + 106181, 106186, 106191, 106196, 106201, 106206, 106211, 106216, 106221, + 106226, 106231, 106236, 106241, 106246, 106251, 106256, 106261, 106266, + 106271, 106276, 106281, 106286, 106291, 106296, 106301, 106306, 106313, + 106318, 106323, 106328, 106333, 106338, 106343, 106347, 106352, 106357, + 106362, 106367, 106372, 106377, 106382, 106387, 106392, 106397, 106402, + 106407, 106412, 106417, 106424, 106429, 106434, 106440, 106445, 106450, + 106455, 106460, 106465, 106470, 106475, 106480, 106485, 106490, 106495, + 106500, 106505, 106510, 106515, 106520, 106525, 106530, 106535, 106540, + 106545, 106550, 106555, 106560, 106565, 106570, 106575, 106580, 106585, + 106590, 106595, 106600, 106605, 106610, 106615, 106620, 106625, 106630, + 106635, 106640, 106645, 106650, 106655, 106662, 106667, 106672, 106679, + 106686, 106691, 106696, 106701, 106706, 106711, 106716, 106721, 106726, + 106731, 106736, 106741, 106746, 106751, 106756, 106761, 106766, 106771, + 106776, 106781, 106786, 106791, 106796, 106801, 106806, 106811, 106818, + 106823, 106828, 106833, 106838, 106843, 106848, 106853, 106858, 106863, + 106868, 106873, 106878, 106883, 106888, 106893, 106898, 106903, 106908, + 106915, 106920, 106925, 106930, 106935, 106940, 106945, 106950, 106956, + 106961, 106966, 106971, 106976, 106981, 106986, 106991, 106996, 107003, + 107010, 107015, 107020, 107024, 107029, 107033, 107037, 107042, 107049, + 107054, 107059, 107068, 107073, 107078, 107083, 107088, 107095, 107102, + 107107, 107112, 107117, 107122, 107129, 107134, 107139, 107144, 107149, + 107154, 107159, 107164, 107169, 107174, 107179, 107184, 107189, 107196, + 107200, 107205, 107210, 107215, 107220, 107224, 107229, 107234, 107239, + 107244, 107249, 107254, 107259, 107264, 107269, 107275, 107281, 107287, + 107293, 107299, 107305, 107311, 107317, 107323, 107329, 107335, 107341, + 107346, 107352, 107358, 107364, 107370, 107376, 107382, 107388, 107394, + 107400, 107406, 107412, 107417, 107423, 107429, 107435, 107441, 107447, + 107453, 107459, 107465, 107471, 107477, 107483, 107489, 107495, 107501, + 107507, 107513, 107519, 107525, 107531, 107537, 107542, 107548, 107554, + 107560, 107566, 107572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 107578, 107583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107589, 107594, + 107599, 107604, 107611, 107618, 107625, 107632, 107637, 107642, 107647, + 107652, 107659, 107664, 107671, 107678, 107683, 107688, 107693, 107700, + 107705, 107710, 107717, 107724, 107729, 107734, 107739, 107746, 107753, + 107760, 107765, 107770, 107777, 107784, 107791, 107798, 107803, 107808, + 107813, 107820, 107825, 107830, 107835, 107842, 107851, 107858, 107863, + 107868, 107873, 107878, 107883, 107888, 107897, 107904, 107909, 107916, + 107923, 107928, 107933, 107938, 107945, 107950, 107957, 107964, 107969, + 107974, 107979, 107986, 107993, 107998, 108003, 108010, 108017, 108024, + 108029, 108034, 108039, 108044, 108051, 108060, 108069, 108074, 108081, + 108090, 108095, 108100, 108105, 108110, 108117, 108124, 108131, 108138, + 108143, 108148, 108153, 108160, 108167, 108174, 108179, 108184, 108191, + 108196, 108203, 108208, 108215, 108220, 108227, 108234, 108239, 108244, + 108249, 108254, 108259, 108264, 108269, 108274, 108279, 108286, 108293, + 108300, 108307, 108314, 108323, 108328, 108333, 108340, 108347, 108352, + 108359, 108366, 108373, 108380, 108387, 108394, 108399, 108404, 108409, + 108414, 108419, 108428, 108437, 108446, 108455, 108464, 108473, 108482, + 108491, 108496, 108507, 108518, 108527, 108532, 108537, 108542, 108547, + 108556, 108563, 108570, 108577, 108584, 108591, 108598, 108607, 108616, + 108627, 108636, 108647, 108656, 108663, 108672, 108683, 108692, 108701, + 108710, 108719, 108726, 108733, 108740, 108749, 108758, 108769, 108778, + 108787, 108798, 108803, 108808, 108819, 108827, 108836, 108845, 108854, + 108865, 108874, 108883, 108894, 108905, 108916, 108927, 108938, 108949, + 108956, 108963, 108970, 108977, 108988, 108997, 109004, 109011, 109018, + 109029, 109040, 109051, 109062, 109073, 109084, 109095, 109106, 109113, + 109120, 109129, 109138, 109145, 109152, 109159, 109168, 109177, 109186, + 109193, 109202, 109211, 109220, 109227, 109234, 109239, 109245, 109252, + 109259, 109266, 109273, 109280, 109287, 109296, 109305, 109314, 109323, + 109330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109339, 109345, 109350, 109355, + 109362, 109368, 109374, 109380, 109386, 109392, 109398, 109404, 109408, + 109412, 109418, 109424, 109430, 109434, 109439, 109444, 109448, 109452, + 109455, 109461, 109467, 109473, 109479, 109485, 109491, 109497, 109503, + 109509, 109519, 109529, 109535, 109541, 109551, 109561, 109567, 0, 0, + 109573, 109581, 109586, 109591, 109597, 109603, 109609, 109615, 109621, + 109627, 109634, 109641, 109647, 109653, 109659, 109665, 109671, 109677, + 109683, 109689, 109694, 109700, 109706, 109712, 109718, 109724, 109733, + 109739, 109744, 109752, 109759, 109766, 109775, 109784, 109793, 109802, + 109811, 109820, 109829, 109838, 109848, 109858, 109866, 109874, 109883, + 109892, 109898, 109904, 109910, 109916, 109924, 109932, 109936, 109942, + 109947, 109953, 109959, 109965, 109971, 109977, 109986, 109991, 109998, + 110003, 110008, 110013, 110019, 110025, 110031, 110038, 110043, 110048, + 110053, 110058, 110063, 110069, 110075, 110081, 110087, 110093, 110099, + 110105, 110111, 110116, 110121, 110126, 110131, 110136, 110141, 110146, + 110151, 110157, 110163, 110168, 110173, 110178, 110183, 110188, 110194, + 110201, 110205, 110209, 110213, 110217, 110221, 110225, 110229, 110233, + 110241, 110251, 110255, 110259, 110265, 110271, 110277, 110283, 110289, + 110295, 110301, 110307, 110313, 110319, 110325, 110331, 110337, 110343, + 110347, 110351, 110358, 110364, 110370, 110376, 110381, 110388, 110393, + 110399, 110405, 110411, 110417, 110422, 110426, 110432, 110436, 110440, + 110444, 110450, 110456, 110460, 110466, 110472, 110478, 110484, 110490, + 110498, 110506, 110512, 110518, 110524, 110530, 110542, 110554, 110568, + 110580, 110592, 110606, 110620, 110634, 110638, 110646, 110654, 110659, + 110663, 110667, 110671, 110675, 110679, 110683, 110687, 110693, 110699, + 110705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110711, 110717, 110723, 110729, + 110735, 110741, 110747, 110753, 110759, 110765, 110771, 110777, 110783, + 110789, 110795, 110801, 110807, 110813, 110819, 110825, 110831, 110837, + 110843, 110849, 110855, 110861, 110867, 110873, 110879, 110885, 110891, + 110897, 110903, 110909, 110915, 110921, 110927, 110933, 110939, 110945, + 110951, 110957, 110963, 110969, 110975, 110981, 110987, 110993, 110999, + 111005, 111011, 111017, 111023, 111029, 111035, 111041, 111047, 111053, + 111059, 111065, 111071, 111077, 111083, 111089, 111095, 111101, 111107, + 111112, 111117, 111122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111126, 111131, + 111138, 111145, 111152, 111159, 111164, 111168, 111174, 111178, 111182, + 111188, 111192, 111196, 111200, 111206, 111213, 111217, 111221, 111225, + 111229, 111233, 111237, 111243, 111247, 111251, 111255, 111259, 111263, + 111267, 111271, 111275, 111279, 111283, 111287, 111291, 111296, 111300, + 111304, 111308, 111312, 111316, 111320, 111324, 111328, 111332, 111339, + 111343, 111351, 111355, 111359, 111363, 111367, 111371, 111375, 111379, + 111386, 111390, 111394, 111398, 111402, 111406, 111412, 111416, 111422, + 111426, 111430, 111434, 111438, 111442, 111446, 111450, 111454, 111458, + 111462, 111466, 111470, 111474, 111478, 111482, 111486, 111490, 111494, + 111498, 111506, 111510, 111514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111518, + 111526, 111534, 111542, 111550, 111558, 111566, 111574, 111582, 111590, + 111598, 111606, 111614, 111622, 111630, 111638, 111646, 111654, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111662, 111666, 111671, 111676, 111681, + 111685, 111690, 111695, 111700, 111704, 111709, 111714, 111718, 111722, + 111726, 111730, 111735, 111740, 111744, 111748, 111753, 111757, 111762, + 111767, 111772, 111777, 111782, 111786, 111791, 111796, 111801, 111805, + 111810, 111815, 111820, 111824, 111829, 111834, 111838, 111842, 111846, + 111850, 111855, 111860, 111864, 111868, 111873, 111877, 111882, 111887, + 111892, 111897, 111902, 111906, 111911, 111916, 111921, 111925, 111930, + 111935, 111940, 111944, 111949, 111954, 111958, 111962, 111966, 111970, + 111975, 111980, 111984, 111988, 111993, 111997, 112002, 112007, 112012, + 112017, 112022, 112026, 112031, 112036, 112041, 112045, 112050, 0, + 112055, 112059, 112064, 112069, 112073, 112077, 112081, 112085, 112090, + 112095, 112099, 112103, 112108, 112112, 112117, 112122, 112127, 112132, + 112137, 112142, 112148, 112154, 112160, 112165, 112171, 112177, 112183, + 112188, 112194, 112200, 112205, 112210, 112215, 112220, 112226, 112232, + 112237, 112242, 112248, 112253, 112259, 112265, 112271, 112277, 112283, + 112288, 112294, 112300, 112306, 112311, 112317, 112323, 112329, 112334, + 112340, 112346, 112351, 112356, 112361, 112366, 112372, 112378, 112383, + 112388, 112394, 112399, 112405, 112411, 112417, 112423, 112429, 0, + 112433, 112438, 0, 0, 112443, 0, 0, 112448, 112453, 0, 0, 112458, 112462, + 112466, 112471, 0, 112476, 112480, 112485, 112489, 112494, 112499, + 112504, 112509, 112514, 112518, 112523, 112528, 0, 112533, 0, 112538, + 112543, 112547, 112552, 112557, 112561, 112565, 0, 112569, 112574, + 112579, 112583, 112587, 112592, 112596, 112601, 112606, 112611, 112616, + 112621, 112626, 112632, 112638, 112644, 112649, 112655, 112661, 112667, + 112672, 112678, 112684, 112689, 112694, 112699, 112704, 112710, 112716, + 112721, 112726, 112732, 112737, 112743, 112749, 112755, 112761, 112767, + 112772, 112778, 112784, 112790, 112795, 112801, 112807, 112813, 112818, + 112824, 112830, 112835, 112840, 112845, 112850, 112856, 112862, 112867, + 112872, 112878, 112883, 112889, 112895, 112901, 112907, 112913, 112917, + 0, 112922, 112927, 112931, 112936, 0, 0, 112941, 112946, 112951, 112955, + 112959, 112963, 112967, 112972, 0, 112977, 112981, 112986, 112990, + 112995, 113000, 113005, 0, 113010, 113014, 113019, 113024, 113029, + 113033, 113038, 113043, 113048, 113052, 113057, 113062, 113066, 113070, + 113074, 113078, 113083, 113088, 113092, 113096, 113101, 113105, 113110, + 113115, 113120, 113125, 113130, 113134, 0, 113139, 113144, 113148, + 113153, 0, 113158, 113162, 113167, 113172, 113176, 0, 113180, 0, 0, 0, + 113184, 113188, 113193, 113197, 113202, 113207, 113212, 0, 113217, + 113221, 113226, 113231, 113236, 113240, 113245, 113250, 113255, 113259, + 113264, 113269, 113273, 113277, 113281, 113285, 113290, 113295, 113299, + 113303, 113308, 113312, 113317, 113322, 113327, 113332, 113337, 113342, + 113348, 113354, 113360, 113365, 113371, 113377, 113383, 113388, 113394, + 113400, 113405, 113410, 113415, 113420, 113426, 113432, 113437, 113442, + 113448, 113453, 113459, 113465, 113471, 113477, 113483, 113488, 113494, + 113500, 113506, 113511, 113517, 113523, 113529, 113534, 113540, 113546, + 113551, 113556, 113561, 113566, 113572, 113578, 113583, 113588, 113594, + 113599, 113605, 113611, 113617, 113623, 113629, 113633, 113638, 113643, + 113648, 113652, 113657, 113662, 113667, 113671, 113676, 113681, 113685, + 113689, 113693, 113697, 113702, 113707, 113711, 113715, 113720, 113724, + 113729, 113734, 113739, 113744, 113749, 113753, 113758, 113763, 113768, + 113772, 113777, 113782, 113787, 113791, 113796, 113801, 113805, 113809, + 113813, 113817, 113822, 113827, 113831, 113835, 113840, 113844, 113849, + 113854, 113859, 113864, 113869, 113874, 113880, 113886, 113892, 113897, + 113903, 113909, 113915, 113920, 113926, 113932, 113937, 113942, 113947, + 113952, 113958, 113964, 113969, 113974, 113980, 113985, 113991, 113997, + 114003, 114009, 114015, 114020, 114026, 114032, 114038, 114043, 114049, + 114055, 114061, 114066, 114072, 114078, 114083, 114088, 114093, 114098, + 114104, 114110, 114115, 114120, 114126, 114131, 114137, 114143, 114149, + 114155, 114161, 114166, 114172, 114178, 114184, 114189, 114195, 114201, + 114207, 114212, 114218, 114224, 114229, 114234, 114239, 114244, 114250, + 114256, 114261, 114266, 114272, 114277, 114283, 114289, 114295, 114301, + 114307, 114312, 114318, 114324, 114330, 114335, 114341, 114347, 114353, + 114358, 114364, 114370, 114375, 114380, 114385, 114390, 114396, 114402, + 114407, 114412, 114418, 114423, 114429, 114435, 114441, 114447, 114453, + 114459, 114466, 114473, 114480, 114486, 114493, 114500, 114507, 114513, + 114520, 114527, 114533, 114539, 114545, 114551, 114558, 114565, 114571, + 114577, 114584, 114590, 114597, 114604, 114611, 114618, 114625, 114631, + 114638, 114645, 114652, 114658, 114665, 114672, 114679, 114685, 114692, + 114699, 114705, 114711, 114717, 114723, 114730, 114737, 114743, 114749, + 114756, 114762, 114769, 114776, 114783, 114790, 114797, 114802, 114808, + 114814, 114820, 114825, 114831, 114837, 114843, 114848, 114854, 114860, + 114865, 114870, 114875, 114880, 114886, 114892, 114897, 114902, 114908, + 114913, 114919, 114925, 114931, 114937, 114943, 114948, 114954, 114960, + 114966, 114971, 114977, 114983, 114989, 114994, 115000, 115006, 115011, + 115016, 115021, 115026, 115032, 115038, 115043, 115048, 115054, 115059, + 115065, 115071, 115077, 115083, 115089, 115095, 0, 0, 115102, 115107, + 115112, 115117, 115122, 115127, 115132, 115137, 115142, 115147, 115152, + 115157, 115162, 115167, 115172, 115177, 115182, 115187, 115193, 115198, + 115203, 115208, 115213, 115218, 115223, 115228, 115232, 115237, 115242, + 115247, 115252, 115257, 115262, 115267, 115272, 115277, 115282, 115287, + 115292, 115297, 115302, 115307, 115312, 115317, 115323, 115328, 115333, + 115338, 115343, 115348, 115353, 115358, 115364, 115369, 115374, 115379, + 115384, 115389, 115394, 115399, 115404, 115409, 115414, 115419, 115424, + 115429, 115434, 115439, 115444, 115449, 115454, 115459, 115464, 115469, + 115474, 115479, 115485, 115490, 115495, 115500, 115505, 115510, 115515, + 115520, 115524, 115529, 115534, 115539, 115544, 115549, 115554, 115559, + 115564, 115569, 115574, 115579, 115584, 115589, 115594, 115599, 115604, + 115609, 115615, 115620, 115625, 115630, 115635, 115640, 115645, 115650, + 115656, 115661, 115666, 115671, 115676, 115681, 115686, 115692, 115698, + 115704, 115710, 115716, 115722, 115728, 115734, 115740, 115746, 115752, + 115758, 115764, 115770, 115776, 115782, 115788, 115795, 115801, 115807, + 115813, 115819, 115825, 115831, 115837, 115842, 115848, 115854, 115860, + 115866, 115872, 115878, 115884, 115890, 115896, 115902, 115908, 115914, + 115920, 115926, 115932, 115938, 115944, 115951, 115957, 115963, 115969, + 115975, 115981, 115987, 115993, 116000, 116006, 116012, 116018, 116024, + 116030, 116036, 116042, 116048, 116054, 116060, 116066, 116072, 116078, + 116084, 116090, 116096, 116102, 116108, 116114, 116120, 116126, 116132, + 116138, 116145, 116151, 116157, 116163, 116169, 116175, 116181, 116187, + 116192, 116198, 116204, 116210, 116216, 116222, 116228, 116234, 116240, + 116246, 116252, 116258, 116264, 116270, 116276, 116282, 116288, 116294, + 116301, 116307, 116313, 116319, 116325, 116331, 116337, 116343, 116350, + 116356, 116362, 116368, 116374, 116380, 116386, 116393, 116400, 116407, + 116414, 116421, 116428, 116435, 116442, 116449, 116456, 116463, 116470, + 116477, 116484, 116491, 116498, 116505, 116513, 116520, 116527, 116534, + 116541, 116548, 116555, 116562, 116568, 116575, 116582, 116589, 116596, + 116603, 116610, 116617, 116624, 116631, 116638, 116645, 116652, 116659, + 116666, 116673, 116680, 116687, 116695, 116702, 116709, 116716, 116723, + 116730, 116737, 116744, 116752, 116759, 116766, 116773, 116780, 116787, + 116794, 116799, 0, 0, 116804, 116809, 116813, 116817, 116821, 116825, + 116829, 116833, 116837, 116841, 116845, 116850, 116854, 116858, 116862, + 116866, 116870, 116874, 116878, 116882, 116886, 116891, 116895, 116899, + 116903, 116907, 116911, 116915, 116919, 116923, 116927, 116933, 116938, + 116943, 116948, 116953, 116958, 116963, 116968, 116973, 116978, 116984, + 116989, 116994, 116999, 117004, 117009, 117014, 117019, 117024, 117029, + 117036, 117043, 117050, 117057, 117064, 117071, 117077, 117084, 117091, + 117098, 117106, 117114, 117122, 117130, 117138, 117146, 117153, 117160, + 117167, 117175, 117183, 117191, 117199, 117207, 117215, 117222, 117229, + 117236, 117244, 117252, 117260, 117268, 117276, 117284, 117289, 117294, + 117299, 117304, 117309, 117314, 117319, 117324, 117329, 0, 0, 0, 0, + 117334, 117339, 117343, 117347, 117351, 117355, 117359, 117363, 117367, + 117371, 117375, 117379, 117383, 117387, 117391, 117395, 117399, 117403, + 117407, 117411, 117415, 117419, 117423, 117427, 117431, 117435, 117439, + 117443, 117447, 117451, 117455, 117459, 117463, 117467, 117471, 117475, + 117479, 117483, 117487, 117491, 117495, 117499, 117503, 117507, 117511, + 117515, 117519, 117523, 117527, 117531, 117535, 117540, 117544, 117548, + 117552, 117556, 117560, 117564, 117568, 117572, 117576, 117580, 117584, + 117588, 117592, 117596, 117600, 117604, 117608, 117612, 117616, 117620, + 117624, 117628, 117632, 117636, 117640, 117644, 117648, 117652, 117656, + 117660, 117664, 117668, 117672, 117676, 117680, 117684, 117688, 117692, + 117696, 117700, 117704, 117708, 117712, 117716, 117720, 117724, 117728, + 117732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117736, 117742, 117751, + 117759, 117767, 117776, 117785, 117794, 117803, 117812, 117821, 117830, + 117839, 117848, 117857, 0, 0, 117866, 117875, 117883, 117891, 117900, + 117909, 117918, 117927, 117936, 117945, 117954, 117963, 117972, 117981, + 0, 0, 117990, 117999, 118007, 118015, 118024, 118033, 118042, 118051, + 118060, 118069, 118078, 118087, 118096, 118105, 118114, 0, 118121, + 118130, 118138, 118146, 118155, 118164, 118173, 118182, 118191, 118200, + 118209, 118218, 118227, 118236, 118245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118252, + 118259, 118264, 118268, 118272, 118276, 118281, 118286, 118291, 118296, + 118301, 0, 0, 0, 0, 0, 118306, 118311, 118317, 118323, 118329, 118334, + 118340, 118346, 118352, 118357, 118363, 118369, 118374, 118379, 118384, + 118389, 118395, 118401, 118406, 118411, 118417, 118422, 118428, 118434, + 118440, 118446, 118452, 118462, 118469, 118475, 118478, 0, 118481, + 118486, 118492, 118498, 118504, 118509, 118515, 118521, 118527, 118532, + 118538, 118544, 118549, 118554, 118559, 118564, 118570, 118576, 118581, + 118586, 118592, 118597, 118603, 118609, 118615, 118621, 118627, 118630, + 118633, 118636, 118639, 118642, 118645, 118651, 118658, 118665, 118672, + 118678, 118685, 118692, 118699, 118705, 118712, 118719, 118725, 118731, + 118737, 118743, 118750, 118757, 118763, 118769, 118776, 118782, 118789, + 118796, 118803, 118810, 0, 0, 0, 0, 0, 0, 118817, 118823, 118830, 118837, + 118844, 118850, 118857, 118864, 118871, 118877, 118884, 118891, 118897, + 118903, 118909, 118915, 118922, 118929, 118935, 118941, 118948, 118954, + 118961, 118968, 118975, 118982, 118989, 118998, 119002, 119005, 119009, + 119013, 119017, 119020, 119023, 119026, 119029, 119032, 119035, 119038, + 119041, 119044, 119050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119053, 119060, 119068, 119076, 119084, + 119091, 119099, 119107, 119115, 119122, 119130, 119138, 119145, 119152, + 119159, 119166, 119174, 119182, 119189, 119196, 119204, 119211, 119219, + 119227, 119235, 119243, 119251, 119255, 119259, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 119263, 119269, 119275, 119281, 119285, 119291, 119297, + 119303, 119309, 119315, 119321, 119327, 119333, 119339, 119345, 119351, + 119357, 119363, 119369, 119375, 119381, 119387, 119393, 119399, 119405, + 119411, 119417, 119423, 119429, 119435, 119441, 119447, 119453, 119459, + 119465, 119471, 119477, 119483, 119489, 119495, 119501, 119507, 119513, + 0, 0, 0, 0, 0, 119519, 119530, 119541, 119552, 119563, 119574, 119585, + 119596, 119607, 0, 0, 0, 0, 0, 0, 0, 119618, 119622, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119626, 119628, 119630, + 119634, 119639, 119644, 119646, 119652, 119657, 119659, 119665, 119669, + 119671, 119675, 119681, 119687, 119693, 119698, 119702, 119709, 119716, + 119723, 119728, 119735, 119742, 119749, 119753, 119759, 119768, 119777, + 119784, 119789, 119793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 119797, 119799, 119801, 119805, 119809, 119813, 0, 119815, 119817, + 119821, 119823, 119825, 119827, 119829, 119834, 119839, 119841, 119847, + 119851, 119855, 119863, 119865, 119867, 119869, 119871, 119873, 119875, + 119877, 119879, 119881, 119883, 119887, 119891, 119893, 119895, 119897, + 119899, 119901, 119906, 119912, 119916, 119920, 119924, 119928, 119933, + 119937, 119939, 119941, 119945, 119951, 119953, 119955, 119957, 119961, + 119970, 119976, 119980, 119984, 119986, 119988, 119991, 119993, 119995, + 119997, 120001, 120003, 120007, 120012, 120014, 120019, 120025, 120032, + 120036, 120040, 120044, 120048, 120054, 0, 0, 0, 120058, 120060, 120064, + 120068, 120070, 120074, 120078, 120080, 120084, 120086, 120090, 120094, + 120098, 120102, 120106, 120110, 120114, 120118, 120124, 120128, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 120132, 120136, 120140, 120144, 120151, + 120153, 120157, 120159, 120161, 120165, 120169, 120173, 120175, 120179, + 120183, 120187, 120191, 120195, 120197, 120201, 120203, 120209, 120212, + 120217, 120219, 120221, 120224, 120226, 120228, 120231, 120238, 120245, + 120252, 120257, 120261, 120263, 120265, 0, 120267, 120269, 120273, + 120277, 120281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 120283, 120287, 120292, 120296, 120302, 120308, 120310, 120312, + 120318, 120320, 120324, 120328, 120330, 120334, 120336, 120340, 120344, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120348, 120350, 120352, + 120354, 120358, 120360, 120362, 120364, 120366, 120368, 120370, 120372, + 120374, 120376, 120378, 120380, 120382, 120384, 120386, 120388, 120390, + 120392, 120394, 120396, 120398, 120400, 120402, 120406, 120408, 120410, + 120412, 120416, 120418, 120422, 120424, 120426, 120430, 120434, 120440, + 120442, 120444, 120446, 120448, 120452, 120456, 120458, 120462, 120466, + 120470, 120474, 120478, 120482, 120486, 120490, 120494, 120498, 120502, + 120506, 120510, 120514, 120518, 120522, 120526, 0, 120530, 0, 120532, + 120534, 120536, 120538, 120540, 120548, 120556, 120564, 120572, 120577, + 120582, 120587, 120591, 120595, 120600, 120604, 120606, 120610, 120612, + 120614, 120616, 120618, 120620, 120622, 120624, 120628, 120630, 120632, + 120634, 120638, 120642, 120646, 120650, 120654, 120656, 120662, 120668, + 120670, 120672, 120674, 120676, 120678, 120687, 120694, 120701, 120705, + 120712, 120717, 120724, 120733, 120738, 120742, 120746, 120748, 120752, + 120754, 120758, 120762, 120764, 120768, 120772, 120776, 120778, 120780, + 120786, 120788, 120790, 120792, 120796, 120800, 120802, 120806, 120808, + 120810, 120813, 120817, 120819, 120823, 120825, 120827, 120832, 120834, + 120838, 120842, 120845, 120849, 120853, 120857, 120861, 120865, 120869, + 120873, 120878, 120882, 120886, 120895, 120900, 120903, 120905, 120908, + 120911, 120916, 120918, 120921, 120926, 120930, 120933, 120937, 120941, + 120944, 120949, 120953, 120957, 120961, 120965, 120971, 120977, 120983, + 120989, 120994, 121005, 121007, 121011, 121013, 121015, 121019, 121023, + 121025, 121029, 121034, 121039, 121045, 121047, 121051, 121055, 121062, + 121069, 121073, 121075, 121077, 121081, 121083, 121087, 121091, 121095, + 121097, 121099, 121106, 121110, 121113, 121117, 121121, 121125, 121127, + 121131, 121133, 121135, 121139, 121141, 121145, 121149, 121155, 121159, + 121163, 121167, 121169, 121172, 121176, 121183, 121192, 121201, 121209, + 121217, 121219, 121223, 121225, 121229, 121240, 121244, 121250, 121256, + 121261, 0, 121263, 121267, 121269, 121271, 0, 0, 0, 121273, 121278, + 121288, 121303, 121315, 121327, 121331, 121335, 121341, 121343, 121351, + 121359, 121361, 121365, 121371, 121377, 121384, 121391, 121393, 121395, + 121398, 121400, 121406, 121408, 121411, 121415, 121421, 121427, 121438, + 121444, 121451, 121459, 121463, 121471, 121479, 121485, 121491, 121498, + 121500, 121504, 121506, 121508, 121513, 121515, 121517, 121519, 121521, + 121525, 121536, 121542, 121546, 121550, 121554, 121560, 121566, 121572, + 121578, 121583, 121588, 121594, 121600, 121607, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121614, 121621, 121628, 121635, 121643, + 121651, 121659, 121667, 121675, 121683, 121691, 121699, 121707, 121713, + 121719, 121725, 121731, 121737, 121743, 121749, 121755, 121761, 121767, + 121773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 121779, 121783, 121787, 121792, 121797, 0, 121799, 121808, + 121816, 121824, 121837, 121850, 121863, 121870, 121877, 121881, 121890, + 121898, 121902, 121911, 121918, 121922, 0, 121926, 121930, 121937, 0, + 121941, 0, 121945, 0, 121952, 0, 121961, 121973, 121985, 0, 121989, + 121993, 121997, 122001, 122005, 122013, 0, 0, 122021, 122025, 122029, + 122033, 0, 122037, 0, 0, 122043, 122054, 122062, 122066, 0, 122070, + 122074, 122080, 122087, 122098, 122108, 122118, 122129, 122138, 122149, + 122155, 122161, 0, 0, 0, 0, 122167, 122176, 122183, 122189, 122193, + 122197, 122201, 122210, 122222, 122226, 122233, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122240, 122242, 122244, + 122248, 122252, 122256, 122265, 122267, 122269, 122272, 122274, 122276, + 122280, 122282, 122286, 122288, 122292, 122294, 122296, 122300, 122304, + 122310, 122312, 122316, 122318, 122322, 122326, 122330, 122334, 122336, + 122338, 122342, 122346, 122350, 122354, 122356, 122358, 122360, 122365, + 122370, 122373, 122381, 122389, 122391, 122396, 122399, 122404, 122415, + 122422, 122427, 122432, 122434, 122438, 122440, 122444, 122446, 122450, + 122454, 122457, 122460, 122462, 122465, 122467, 122471, 122473, 122475, + 122477, 122481, 122483, 122487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122490, + 122495, 122500, 122505, 122510, 122515, 122520, 122527, 122534, 122541, + 122548, 122553, 122558, 122563, 122568, 122575, 122581, 122588, 122595, + 122602, 122607, 122612, 122617, 122622, 122627, 122634, 122641, 122646, + 122651, 122658, 122665, 122673, 122681, 122688, 122695, 122703, 122711, + 122719, 122726, 122736, 122747, 122752, 122759, 122766, 122773, 122781, + 122789, 122800, 122808, 122816, 122824, 122829, 122834, 122839, 122844, + 122849, 122854, 122859, 122864, 122869, 122874, 122879, 122884, 122891, + 122896, 122901, 122908, 122913, 122918, 122923, 122928, 122933, 122938, + 122943, 122948, 122953, 122958, 122963, 122968, 122975, 122983, 122988, + 122993, 123000, 123005, 123010, 123015, 123022, 123027, 123034, 123039, + 123046, 123051, 123060, 123069, 123074, 123079, 123084, 123089, 123094, + 123099, 123104, 123109, 123114, 123119, 123124, 123129, 123134, 123142, + 123150, 123155, 123160, 123165, 123170, 123175, 123181, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 123187, 123191, 123195, 123199, 123203, 123207, 123211, + 123215, 123219, 123223, 123227, 123231, 123235, 123239, 123243, 123247, + 123251, 123255, 123259, 123263, 123267, 123271, 123275, 123279, 123283, + 123287, 123291, 123295, 123299, 123303, 123307, 123311, 123315, 123319, + 123323, 123327, 123331, 123335, 123339, 123343, 123347, 123351, 123355, + 123359, 123363, 123367, 123371, 123375, 123379, 123383, 123387, 123391, + 123395, 123399, 123403, 123407, 123411, 123415, 123419, 123423, 123427, + 123431, 123435, 123439, 123443, 123447, 123451, 123455, 123459, 123463, + 123467, 123471, 123475, 123479, 123483, 123487, 123491, 123495, 123499, + 123503, 123507, 123511, 123515, 123519, 123523, 123527, 123531, 123535, + 123539, 123543, 123547, 123551, 123555, 123559, 123563, 123567, 123571, + 123575, 123579, 123583, 123587, 123591, 123595, 123599, 123603, 123607, + 123611, 123615, 123619, 123623, 123627, 123631, 123635, 123639, 123643, + 123647, 123651, 123655, 123659, 123663, 123667, 123671, 123675, 123679, + 123683, 123687, 123691, 123695, 123699, 123703, 123707, 123711, 123715, + 123719, 123723, 123727, 123731, 123735, 123739, 123743, 123747, 123751, + 123755, 123759, 123763, 123767, 123771, 123775, 123779, 123783, 123787, + 123791, 123795, 123799, 123803, 123807, 123811, 123815, 123819, 123823, + 123827, 123831, 123835, 123839, 123843, 123847, 123851, 123855, 123859, + 123863, 123867, 123871, 123875, 123879, 123883, 123887, 123891, 123895, + 123899, 123903, 123907, 123911, 123915, 123919, 123923, 123927, 123931, + 123935, 123939, 123943, 123947, 123951, 123955, 123959, 123963, 123967, + 123971, 123975, 123979, 123983, 123987, 123991, 123995, 123999, 124003, + 124007, 124011, 124015, 124019, 124023, 124027, 124031, 124035, 124039, + 124043, 124047, 124051, 124055, 124059, 124063, 124067, 124071, 124075, + 124079, 124083, 124087, 124091, 124095, 124099, 124103, 124107, 124111, + 124115, 124119, 124123, 124127, 124131, 124135, 124139, 124143, 124147, + 124151, 124155, 124159, 124163, 124167, 124171, 124175, 124179, 124183, + 124187, 124191, 124195, 124199, 124203, 124207, 124211, 124215, 124219, + 124223, 124227, 124231, 124235, 124239, 124243, 124247, 124251, 124255, + 124259, 124263, 124267, 124271, 124275, 124279, 124283, 124287, 124291, + 124295, 124299, 124303, 124307, 124311, 124315, 124319, 124323, 124327, + 124331, 124335, 124339, 124343, 124347, 124351, 124355, 124359, 124363, + 124367, 124371, 124375, 124379, 124383, 124387, 124391, 124395, 124399, + 124403, 124407, 124411, 124415, 124419, 124423, 124427, 124431, 124435, + 124439, 124443, 124447, 124451, 124455, 124459, 124463, 124467, 124471, + 124475, 124479, 124483, 124487, 124491, 124495, 124499, 124503, 124507, + 124511, 124515, 124519, 124523, 124527, 124531, 124535, 124539, 124543, + 124547, 124551, 124555, 124559, 124563, 124567, 124571, 124575, 124579, + 124583, 124587, 124591, 124595, 124599, 124603, 124607, 124611, 124615, + 124619, 124623, 124627, 124631, 124635, 124639, 124643, 124647, 124651, + 124655, 124659, 124663, 124667, 124671, 124675, 124679, 124683, 124687, + 124691, 124695, 124699, 124703, 124707, 124711, 124715, 124719, 124723, + 124727, 124731, 124735, 124739, 124743, 124747, 124751, 124755, 124759, + 124763, 124767, 124771, 124775, 124779, 124783, 124787, 124791, 124795, + 124799, 124803, 124807, 124811, 124815, 124819, 124823, 124827, 124831, + 124835, 124839, 124843, 124847, 124851, 124855, 124859, 124863, 124867, + 124871, 124875, 124879, 124883, 124887, 124891, 124895, 124899, 124903, + 124907, 124911, 124915, 124919, 124923, 124927, 124931, 124935, 124939, + 124943, 124947, 124951, 124955, 124959, 124963, 124967, 124971, 124975, + 124979, 124983, 124987, 124991, 124995, 124999, 125003, 125007, 125011, + 125015, 125019, 125023, 125027, 125031, 125035, 125039, 125043, 125047, + 125051, 125055, 125059, 125063, 125067, 125071, 125075, 125079, 125083, + 125087, 125091, 125095, 125099, 125103, 125107, 125111, 125115, 125119, + 125123, 125127, 125131, 125135, 125139, 125143, 125147, 125151, 125155, + 125159, 125163, 125167, 125171, 125175, 125179, 125183, 125187, 125191, + 125195, 125199, 125203, 125207, 125211, 125215, 125219, 125223, 125227, + 125231, 125235, 125239, 125243, 125247, 125251, 125255, 125259, 125263, + 125267, 125271, 125275, 125279, 125283, 125287, 125291, 125295, 125299, + 125303, 125307, 125311, 125315, 125319, 125323, 125327, 125331, 125335, + 125339, 125343, 125347, 125351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125355, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125359, + 125362, 125366, 125370, 125373, 125377, 125381, 125384, 125387, 125391, + 125395, 125398, 125401, 125404, 125407, 125412, 125415, 125419, 125422, + 125425, 125428, 125431, 125434, 125437, 125440, 125443, 125446, 125449, + 125452, 125456, 125460, 125464, 125468, 125473, 125478, 125484, 125490, + 125496, 125501, 125507, 125513, 125519, 125524, 125530, 125536, 125541, + 125546, 125551, 125556, 125562, 125568, 125573, 125578, 125584, 125589, + 125595, 125601, 125607, 125613, 125619, 125623, 125628, 125632, 125637, + 125641, 125646, 125651, 125657, 125663, 125669, 125674, 125680, 125686, + 125692, 125697, 125703, 125709, 125714, 125719, 125724, 125729, 125735, + 125741, 125746, 125751, 125757, 125762, 125768, 125774, 125780, 125786, + 125792, 125797, 125801, 125806, 125808, 125812, 125815, 125818, 125821, + 125824, 125827, 125830, 125833, 125836, 125839, 125842, 125845, 125848, + 125851, 125854, 125857, 125860, 125863, 125866, 125869, 125872, 125875, + 125878, 125881, 125884, 125887, 125890, 125893, 125896, 125899, 125902, + 125905, 125908, 125911, 125914, 125917, 125920, 125923, 125926, 125929, + 125932, 125935, 125938, 125941, 125944, 125947, 125950, 125953, 125956, + 125959, 125962, 125965, 125968, 125971, 125974, 125977, 125980, 125983, + 125986, 125989, 125992, 125995, 125998, 126001, 126004, 126007, 126010, + 126013, 126016, 126019, 126022, 126025, 126028, 126031, 126034, 126037, + 126040, 126043, 126046, 126049, 126052, 126055, 126058, 126061, 126064, + 126067, 126070, 126073, 126076, 126079, 126082, 126085, 126088, 126091, + 126094, 126097, 126100, 126103, 126106, 126109, 126112, 126115, 126118, + 126121, 126124, 126127, 126130, 126133, 126136, 126139, 126142, 126145, + 126148, 126151, 126154, 126157, 126160, 126163, 126166, 126169, 126172, + 126175, 126178, 126181, 126184, 126187, 126190, 126193, 126196, 126199, + 126202, 126205, 126208, 126211, 126214, 126217, 126220, 126223, 126226, + 126229, 126232, 126235, 126238, 126241, 126244, 126247, 126250, 126253, + 126256, 126259, 126262, 126265, 126268, 126271, 126274, 126277, 126280, + 126283, 126286, 126289, 126292, 126295, 126298, 126301, 126304, 126307, + 126310, 126313, 126316, 126319, 126322, 126325, 126328, 126331, 126334, + 126337, 126340, 126343, 126346, 126349, 126352, 126355, 126358, 126361, + 126364, 126367, 126370, 126373, 126376, 126379, 126382, 126385, 126388, + 126391, 126394, 126397, 126400, 126403, 126406, 126409, 126412, 126415, + 126418, 126421, 126424, 126427, 126430, 126433, 126436, 126439, 126442, + 126445, 126448, 126451, 126454, 126457, 126460, 126463, 126466, 126469, + 126472, 126475, 126478, 126481, 126484, 126487, 126490, 126493, 126496, + 126499, 126502, 126505, 126508, 126511, 126514, 126517, 126520, 126523, + 126526, 126529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126532, + 126537, 126542, 126546, 126552, 126558, 126562, 126566, 126578, 126583, + 126594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 126605, 126614, 126623, 126632, 126641, 126653, 126665, 126677, 126689, + 126699, 126709, 126719, 126729, 126739, 126749, 126759, 126768, 126777, + 126786, 126798, 126810, 126822, 126834, 126844, 126854, 126863, 126872, + 126881, 126890, 126899, 126908, 126917, 126926, 126935, 126944, 126953, + 126962, 126971, 126980, 126990, 127000, 127010, 127023, 127033, 127046, + 127053, 127063, 127070, 127077, 127084, 127091, 127098, 127105, 127114, + 127123, 127132, 127141, 127150, 127159, 127168, 127177, 127184, 127191, + 127198, 127207, 127216, 127223, 127230, 127239, 127248, 127252, 127256, + 127260, 127264, 127268, 127272, 127276, 127280, 127283, 127287, 127290, + 127294, 127297, 127300, 127304, 127308, 127312, 127316, 127320, 127324, + 127328, 127332, 127335, 127339, 127343, 127347, 127351, 127355, 127359, + 127363, 127367, 127371, 127375, 127379, 127383, 127387, 127391, 127395, + 127399, 127403, 127407, 127411, 127415, 127419, 127423, 127427, 127431, + 127435, 127439, 127443, 127447, 127451, 127455, 127459, 127463, 127467, + 127471, 127475, 127479, 127483, 127487, 127491, 127495, 127499, 127503, + 127507, 127511, 127515, 127519, 127523, 127527, 127531, 127535, 127539, + 127543, 127547, 127551, 127555, 127559, 127563, 127567, 127571, 127575, + 127579, 127583, 127587, 127591, 127595, 127599, 127603, 127607, 127611, + 127615, 127619, 127623, 127627, 127631, 127635, 127639, 127642, 127646, + 127650, 127654, 127658, 127662, 127666, 127670, 127674, 127678, 127682, + 127686, 127690, 127694, 127698, 127702, 127706, 127710, 127714, 127718, + 127722, 127726, 127730, 127734, 127738, 127742, 127746, 127750, 127754, + 127758, 127762, 127766, 127770, 127774, 127778, 127782, 127786, 127790, + 127794, 127798, 127802, 127806, 127810, 127814, 127818, 127822, 127826, + 127830, 127834, 127838, 127842, 127846, 127850, 127854, 127858, 127862, + 127866, 127870, 127874, 127878, 127882, 127886, 127890, 127894, 127898, + 127902, 127906, 127910, 127914, 127918, 127922, 127926, 127930, 127934, + 127938, 127942, 127946, 127950, 127954, 127958, 127962, 127966, 127970, + 127974, 127978, 127982, 127986, 127990, 127994, 127998, 128002, 128006, + 128010, 128014, 128018, 128022, 128026, 128030, 128034, 128038, 128042, + 128046, 128050, 128054, 128058, 128062, 128066, 128070, 128074, 128078, + 128082, 128086, 128090, 128094, 128098, 128102, 128106, 128110, 128114, + 128118, 128122, 128126, 128130, 128134, 128138, 128142, 128146, 128150, + 128154, 128158, 128162, 128166, 128170, 128174, 128178, 128182, 128186, + 128190, 128194, 128198, 128202, 128206, 128210, 128214, 128218, 128222, + 128226, 128230, 128234, 128238, 128242, 128246, 128250, 128254, 128258, + 128262, 128266, 128270, 128274, 128278, 128282, 128286, 128290, 128294, + 128298, 128302, 128306, 128310, 128314, 128318, 128322, 128326, 128330, + 128334, 128338, 128342, 128346, 128350, 128354, 128358, 128362, 128366, + 128370, 128374, 128378, 128382, 128386, 128390, 128394, 128398, 128402, + 128406, 128410, 128416, 128423, 128430, 128437, 128444, 128451, 128458, + 128465, 128472, 128479, 128486, 128493, 128500, 128507, 128513, 128520, + 128527, 128533, 128540, 128547, 128554, 128561, 128568, 128575, 128582, + 128589, 128596, 128603, 128610, 128617, 128624, 128631, 128637, 128644, + 128651, 128660, 128669, 128678, 128687, 128692, 128697, 128703, 128709, + 128715, 128721, 128727, 128733, 128739, 128745, 128751, 128757, 128763, + 128769, 128774, 128780, 128790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, }; /* name->code dictionary */ @@ -16190,60 +16406,61 @@ 66480, 0, 42833, 74529, 12064, 0, 596, 0, 128103, 13192, 8651, 0, 0, 120218, 12995, 64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 42897, 4233, 4234, 4232, 917836, 74415, 120210, 6384, 917840, 78108, 8851, 0, - 128553, 0, 41601, 8874, 0, 7748, 0, 0, 0, 127939, 41603, 9784, 0, 9188, - 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0, 3404, - 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 0, 127764, 65859, - 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 0, 65288, 0, 11398, 0, - 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824, 3350, 120817, - 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830, 78573, 0, - 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562, 2121, - 64138, 4043, 8712, 64134, 64133, 11297, 0, 0, 11966, 64128, 128587, 0, 0, - 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 66002, 10167, 9471, 0, - 66021, 0, 0, 5457, 5440, 8857, 128771, 65282, 2843, 5355, 127928, 0, 0, - 5194, 11657, 43984, 128292, 0, 0, 0, 0, 127027, 10717, 64570, 5630, - 74350, 64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, - 64146, 64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, - 6960, 0, 0, 5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, - 64108, 8090, 0, 74401, 917811, 587, 0, 128131, 0, 0, 0, 78214, 2750, - 74218, 556, 64158, 64157, 0, 12213, 194678, 2760, 0, 0, 0, 194794, 64156, - 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, 11093, 64153, 64152, - 0, 0, 4839, 0, 0, 1874, 119016, 0, 6577, 64125, 64124, 64123, 0, 127531, - 92534, 7007, 7590, 65443, 9036, 92550, 64122, 74422, 66609, 0, 64117, - 64116, 6287, 64114, 2725, 64120, 64119, 43981, 42128, 127842, 1177, - 65601, 12322, 64106, 69640, 127306, 64102, 7859, 1945, 64099, 0, 10453, - 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, 9571, 528, 128671, - 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, 64313, 6188, 120019, - 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, 7233, 92212, 0, 41904, - 6639, 64064, 0, 128344, 0, 1176, 118959, 127930, 8162, 128667, 0, 0, - 120519, 66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, - 7714, 66222, 0, 7768, 0, 4199, 64708, 0, 0, 0, 8708, 9560, 64077, 64076, - 8996, 4992, 4471, 42622, 64079, 64078, 92179, 0, 0, 0, 64615, 41915, 0, - 12075, 92211, 0, 5174, 0, 0, 127557, 3123, 0, 12685, 127904, 8408, 64704, - 0, 0, 9223, 0, 41616, 0, 73797, 0, 1116, 128204, 43049, 7136, 43050, - 8548, 120485, 0, 119061, 917999, 0, 13115, 43675, 64091, 9322, 0, 120595, - 64095, 64094, 8111, 66247, 42332, 64089, 64088, 6199, 0, 0, 11434, 64083, - 64082, 11329, 7737, 64087, 64086, 64085, 64084, 194817, 9927, 41335, - 4118, 1797, 0, 41334, 0, 46, 43448, 127881, 298, 0, 128114, 0, 42627, 0, - 32, 6187, 119052, 11495, 11459, 3665, 0, 42871, 0, 19923, 74335, 0, - 127192, 66239, 42264, 64403, 4412, 7240, 92495, 0, 0, 65758, 12750, 4181, - 8544, 0, 120199, 917897, 120198, 69809, 6181, 65014, 0, 0, 0, 3639, - 119588, 0, 0, 118904, 10073, 120206, 128862, 127186, 68409, 42844, 7498, - 1098, 92565, 120205, 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0, - 65058, 0, 0, 0, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 118907, - 0, 66238, 12844, 0, 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, - 64405, 41337, 0, 41631, 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408, - 6579, 0, 64618, 0, 120147, 2138, 6583, 7761, 127010, 120504, 194828, 0, - 5058, 41010, 9992, 128299, 5057, 0, 0, 74538, 5054, 118951, 194971, - 78606, 0, 1437, 41617, 658, 3497, 128509, 7486, 5061, 5060, 4235, 0, 0, - 0, 12113, 4236, 4727, 0, 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0, - 41619, 10239, 68611, 0, 66209, 0, 128700, 9748, 0, 127524, 0, 0, 0, 0, - 195083, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, 67854, - 8125, 120545, 6743, 119175, 917940, 2369, 0, 0, 0, 119235, 74092, 73936, - 7008, 43660, 0, 0, 0, 2367, 127827, 0, 264, 2375, 8060, 6194, 119858, - 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839, 0, 8800, 0, 42862, 4463, - 65581, 6192, 194676, 42771, 0, 92333, 725, 65042, 118797, 120800, 0, - 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, 0, 0, 5074, 5073, 128790, 8983, - 118981, 74493, 0, 5072, 128071, 6198, 11614, 0, 196, 0, 0, 0, 4929, + 128553, 0, 41601, 8874, 983518, 7748, 0, 0, 0, 127939, 41603, 9784, 0, + 9188, 41600, 0, 120618, 128343, 1457, 3535, 0, 0, 0, 0, 65240, 11951, 0, + 3404, 0, 0, 0, 1759, 0, 41076, 68383, 120572, 119205, 66577, 0, 127764, + 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983595, 65288, 0, + 11398, 0, 92417, 119255, 0, 0, 603, 74398, 43548, 0, 0, 917824, 3350, + 120817, 64318, 917828, 127089, 3390, 74483, 43265, 120599, 917830, 78573, + 0, 1919, 3400, 120651, 127944, 11647, 917540, 66446, 64141, 8562, 2121, + 64138, 4043, 8712, 64134, 64133, 11297, 983423, 0, 11966, 64128, 128587, + 0, 0, 64132, 10867, 64130, 64129, 983579, 43374, 9779, 2764, 66002, + 10167, 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 128771, 65282, 2843, 5355, + 127928, 983697, 0, 5194, 11657, 43984, 128292, 0, 983364, 0, 0, 127027, + 10717, 64570, 5630, 74350, 64143, 10682, 0, 10602, 800, 42499, 66186, 0, + 0, 64930, 11631, 64146, 64145, 64144, 762, 13172, 118859, 194661, 64468, + 10906, 1353, 6960, 0, 0, 5828, 8724, 917806, 8933, 1601, 42244, 858, + 7080, 64109, 64108, 8090, 0, 74401, 917811, 587, 0, 128131, 0, 0, 0, + 78214, 2750, 74218, 556, 64158, 64157, 983681, 12213, 194678, 2760, 0, 0, + 0, 194794, 64156, 64155, 42496, 0, 64151, 64150, 12679, 10053, 10421, + 11093, 64153, 64152, 0, 0, 4839, 0, 0, 1874, 119016, 0, 6577, 64125, + 64124, 64123, 0, 127531, 92534, 7007, 7590, 65443, 9036, 92550, 64122, + 74422, 66609, 0, 64117, 64116, 6287, 64114, 2725, 64120, 64119, 43981, + 42128, 127842, 1177, 65601, 12322, 64106, 69640, 127306, 64102, 7859, + 1945, 64099, 0, 10453, 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, + 9571, 528, 128671, 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, + 64313, 6188, 120019, 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, + 7233, 92212, 0, 41904, 6639, 64064, 983510, 128344, 0, 1176, 118959, + 127930, 8162, 128667, 983566, 0, 120519, 66376, 66242, 11415, 4333, 9855, + 64112, 64642, 0, 5388, 0, 0, 0, 7714, 66222, 0, 7768, 0, 4199, 64708, 0, + 0, 0, 8708, 9560, 64077, 64076, 8996, 4992, 4471, 42622, 64079, 64078, + 92179, 0, 0, 0, 64615, 41915, 0, 12075, 92211, 0, 5174, 0, 0, 127557, + 3123, 0, 12685, 127904, 8408, 64704, 0, 0, 9223, 0, 41616, 0, 73797, 0, + 1116, 128204, 43049, 7136, 43050, 8548, 120485, 0, 119061, 917999, 0, + 13115, 43675, 64091, 9322, 0, 120595, 64095, 64094, 8111, 66247, 42332, + 64089, 64088, 6199, 0, 0, 11434, 64083, 64082, 11329, 7737, 64087, 64086, + 64085, 64084, 194817, 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, + 127881, 298, 0, 128114, 0, 42627, 0, 32, 6187, 119052, 11495, 11459, + 3665, 983344, 42871, 0, 19923, 74335, 0, 127192, 66239, 42264, 64403, + 4412, 7240, 92495, 0, 983365, 65758, 12750, 4181, 8544, 0, 120199, + 917897, 120198, 69809, 6181, 65014, 0, 0, 0, 3639, 119588, 0, 0, 118904, + 10073, 120206, 128862, 127186, 68409, 42844, 7498, 1098, 92565, 120205, + 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0, 65058, 0, 0, 0, 0, 5471, + 9461, 5573, 118936, 5473, 44, 0, 66244, 118907, 0, 66238, 12844, 0, 1622, + 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, 41337, 0, 41631, + 8947, 68390, 127844, 41694, 0, 0, 7908, 0, 10408, 6579, 0, 64618, 0, + 120147, 2138, 6583, 7761, 127010, 120504, 194828, 0, 5058, 41010, 9992, + 128299, 5057, 0, 0, 74538, 5054, 118951, 194971, 78606, 0, 1437, 41617, + 658, 3497, 128509, 7486, 5061, 5060, 4235, 0, 0, 0, 12113, 4236, 4727, 0, + 0, 7693, 10749, 0, 7488, 5773, 978, 128134, 0, 41619, 10239, 68611, 0, + 66209, 0, 128700, 9748, 983688, 127524, 0, 0, 0, 0, 195083, 0, 983578, 0, + 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, 67854, 8125, 120545, + 6743, 119175, 917940, 2369, 0, 983704, 983705, 119235, 74092, 73936, + 7008, 43660, 0, 0, 0, 2367, 127827, 983592, 264, 2375, 8060, 6194, + 119858, 1844, 119084, 0, 6019, 0, 0, 6961, 0, 118839, 0, 8800, 0, 42862, + 4463, 65581, 6192, 194676, 42771, 0, 92333, 725, 65042, 118797, 120800, + 0, 12892, 0, 0, 0, 0, 0, 0, 127261, 120707, 0, 0, 5074, 5073, 128790, + 8983, 118981, 74493, 0, 5072, 128071, 6198, 11614, 0, 196, 0, 0, 0, 4929, 120342, 0, 0, 0, 0, 42847, 0, 0, 0, 4934, 0, 41323, 9758, 0, 92289, 127917, 42584, 0, 4329, 41321, 4979, 3048, 7752, 41320, 0, 74418, 12819, 0, 5071, 0, 3642, 0, 5070, 10042, 118835, 3987, 5068, 0, 8909, 78650, @@ -16258,86 +16475,87 @@ 8143, 127115, 11983, 92249, 624, 74508, 4057, 43788, 5078, 74258, 12478, 0, 5076, 0, 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 92523, 120102, 7138, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, - 64775, 5036, 5035, 120590, 42604, 0, 0, 8074, 275, 13291, 1907, 78838, - 4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546, - 127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409, - 127256, 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, - 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 0, 5030, 0, 0, - 0, 73869, 9622, 0, 0, 6787, 0, 0, 0, 0, 10544, 12919, 0, 92218, 0, 0, 0, - 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, 7613, 92562, - 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, 43567, - 74056, 917910, 118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395, - 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 0, 74141, 8880, - 7685, 66459, 120173, 65540, 119618, 625, 8187, 42861, 1113, 7236, 7915, - 3630, 120176, 8179, 74264, 67886, 9316, 10980, 2489, 65624, 8150, 1359, - 67652, 127329, 127330, 73756, 5042, 5041, 42769, 12084, 127324, 127321, - 92279, 127319, 127320, 127317, 127318, 127315, 12283, 1616, 3795, 0, - 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, 127311, 0, 0, 8431, - 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, 0, 0, 0, 78420, 0, - 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, 64648, 0, 9359, 78416, 0, - 128770, 65157, 6662, 0, 0, 3863, 73909, 4835, 55266, 43432, 127822, 4309, - 7127, 194569, 0, 194568, 1301, 0, 42589, 569, 0, 73813, 711, 4389, 7133, - 0, 73880, 11610, 11368, 0, 194570, 41331, 1006, 74240, 0, 1550, 8201, - 73737, 7627, 5499, 5031, 77908, 42738, 65784, 77907, 65267, 3758, 0, - 65781, 64734, 0, 2440, 65780, 77913, 8449, 0, 5008, 0, 2118, 0, 12121, - 8255, 5512, 73875, 2128, 2130, 2131, 2126, 2133, 1119, 127068, 2114, - 2116, 2455, 0, 2122, 2123, 2124, 2125, 0, 8714, 0, 2113, 0, 2115, 128177, - 127907, 43713, 5052, 66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, - 42647, 5050, 302, 388, 41115, 735, 6637, 5907, 65088, 0, 12726, 74594, - 9117, 0, 12003, 5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470, - 78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, 0, 0, 92313, 0, 74497, - 92395, 8089, 6929, 639, 0, 68179, 64442, 0, 92348, 4599, 41402, 6674, - 43397, 43294, 1476, 648, 0, 65819, 3233, 0, 41782, 6951, 0, 0, 3530, - 9750, 128317, 0, 6656, 92367, 0, 5046, 8512, 65856, 74261, 8967, 0, 5045, - 0, 1916, 7986, 5044, 120556, 9006, 13128, 5043, 0, 7853, 74068, 74004, - 9669, 12341, 12703, 8402, 0, 119070, 917600, 41750, 3586, 64508, 43148, - 0, 0, 119606, 0, 13296, 517, 0, 128534, 194946, 41528, 123, 65454, 0, 0, - 74478, 10531, 7784, 41526, 10829, 73991, 8057, 1126, 73895, 0, 194591, 0, - 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, 120441, 120452, 43151, 0, - 194851, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, 7623, - 118925, 194853, 9235, 12760, 74176, 69662, 66445, 43540, 10062, 3743, - 11514, 11078, 0, 12136, 0, 0, 120435, 0, 7726, 0, 19922, 267, 3393, - 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, 10652, 41612, - 41077, 3402, 9050, 3398, 0, 0, 0, 3391, 41075, 2476, 0, 128017, 0, 10625, - 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, 13013, 0, 6673, 0, - 0, 0, 12438, 0, 0, 0, 0, 0, 9053, 13015, 74523, 0, 704, 66215, 6195, 0, - 6660, 78758, 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, - 127940, 0, 74547, 0, 65448, 78100, 12948, 119001, 195002, 119238, 195004, - 78099, 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0, - 42533, 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, 3653, 0, 791, - 9162, 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 119303, 0, 7557, - 119339, 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925, - 3946, 78078, 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449, - 8890, 194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864, - 8729, 78456, 0, 7845, 917917, 78692, 4408, 4122, 6772, 11039, 8723, - 194990, 127833, 119302, 731, 119304, 92286, 2438, 64855, 119300, 119299, - 1175, 0, 42135, 373, 119172, 2119, 11457, 11521, 7723, 0, 0, 0, 41952, 0, - 5273, 2127, 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, - 12963, 127864, 6189, 4125, 1314, 12133, 0, 118873, 1271, 0, 0, 66024, - 41482, 3864, 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0, - 41390, 5384, 41882, 67647, 92548, 5759, 0, 0, 41388, 92362, 41392, 64288, - 41387, 0, 8706, 5552, 0, 700, 0, 5553, 0, 7088, 5356, 7499, 78110, 66596, - 0, 0, 10263, 5554, 0, 12344, 10311, 78113, 6665, 0, 0, 7618, 8517, 11455, + 64775, 5036, 5035, 120590, 42604, 983391, 0, 8074, 275, 13291, 1907, + 78838, 4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, + 64546, 127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, + 8858, 6409, 127256, 120252, 128100, 0, 0, 66321, 0, 12814, 127248, 3432, + 10218, 0, 6094, 7641, 42445, 0, 92487, 42406, 1676, 74320, 194607, 0, + 5030, 0, 0, 0, 73869, 9622, 0, 0, 6787, 0, 0, 0, 983327, 10544, 12919, 0, + 92218, 0, 0, 0, 120789, 0, 947, 119835, 194586, 194585, 10969, 119935, + 7613, 92562, 119936, 4795, 119930, 7018, 7376, 120181, 120192, 120268, 0, + 43567, 74056, 917910, 118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, + 4395, 43538, 119926, 119929, 119928, 7213, 119922, 7214, 7215, 983571, + 74141, 8880, 7685, 66459, 120173, 65540, 119618, 625, 8187, 42861, 1113, + 7236, 7915, 3630, 120176, 8179, 74264, 67886, 9316, 10980, 2489, 65624, + 8150, 1359, 67652, 127329, 127330, 73756, 5042, 5041, 42769, 12084, + 127324, 127321, 92279, 127319, 127320, 127317, 127318, 127315, 12283, + 1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, + 127311, 0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, + 0, 0, 0, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, 64648, + 0, 9359, 78416, 0, 128770, 65157, 6662, 0, 0, 3863, 73909, 4835, 55266, + 43432, 127822, 4309, 7127, 194569, 0, 194568, 1301, 0, 42589, 569, 0, + 73813, 711, 4389, 7133, 0, 73880, 11610, 11368, 0, 194570, 41331, 1006, + 74240, 0, 1550, 8201, 73737, 7627, 5499, 5031, 77908, 42738, 65784, + 77907, 65267, 3758, 0, 65781, 64734, 0, 2440, 65780, 77913, 8449, 0, + 5008, 983316, 2118, 0, 12121, 8255, 5512, 73875, 2128, 2130, 2131, 2126, + 2133, 1119, 127068, 2114, 2116, 2455, 0, 2122, 2123, 2124, 2125, 0, 8714, + 0, 2113, 0, 2115, 128177, 127907, 43713, 5052, 66220, 5821, 6186, 65778, + 65775, 5051, 65773, 1429, 42647, 5050, 302, 388, 41115, 735, 6637, 5907, + 65088, 0, 12726, 74594, 9117, 0, 12003, 5513, 6666, 5053, 74230, 5510, + 78451, 0, 78447, 2470, 78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, + 0, 0, 92313, 0, 74497, 92395, 8089, 6929, 639, 983307, 68179, 64442, 0, + 92348, 4599, 41402, 6674, 43397, 43294, 1476, 648, 0, 65819, 3233, 0, + 41782, 6951, 0, 983708, 3530, 9750, 128317, 0, 6656, 92367, 0, 5046, + 8512, 65856, 74261, 8967, 0, 5045, 0, 1916, 7986, 5044, 120556, 9006, + 13128, 5043, 0, 7853, 74068, 74004, 9669, 12341, 12703, 8402, 0, 119070, + 917600, 41750, 3586, 64508, 43148, 0, 0, 119606, 0, 13296, 517, 0, + 128534, 194946, 41528, 123, 65454, 0, 0, 74478, 10531, 7784, 41526, + 10829, 73991, 8057, 1126, 73895, 0, 194591, 0, 3925, 4251, 8069, 10517, + 120439, 489, 0, 4250, 120441, 120452, 43151, 0, 194851, 66200, 0, 0, 0, + 78423, 0, 0, 8711, 6183, 0, 0, 0, 120448, 7623, 118925, 194853, 9235, + 12760, 74176, 69662, 66445, 43540, 10062, 3743, 11514, 11078, 0, 12136, + 0, 0, 120435, 0, 7726, 0, 19922, 267, 3393, 42198, 1371, 194849, 69233, + 2458, 0, 6201, 0, 41074, 4266, 10652, 41612, 41077, 3402, 9050, 3398, 0, + 0, 0, 3391, 41075, 2476, 0, 128017, 0, 10625, 0, 12767, 13017, 78743, + 64261, 64934, 127537, 13014, 13013, 0, 6673, 0, 0, 0, 12438, 0, 0, 0, + 983615, 0, 9053, 13015, 74523, 0, 704, 66215, 6195, 983563, 6660, 78758, + 917760, 917793, 42212, 12629, 11435, 0, 55256, 65538, 0, 127940, 0, + 74547, 0, 65448, 78100, 12948, 119001, 195002, 119238, 195004, 78099, + 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, 66728, 1816, 0, 42533, + 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, 3653, 0, 791, 9162, + 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 119303, 0, 7557, 119339, + 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925, 3946, 78078, + 10998, 78080, 673, 194867, 64397, 128276, 74599, 78449, 8890, 194977, + 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864, 8729, 78456, 0, + 7845, 917917, 78692, 4408, 4122, 6772, 11039, 8723, 194990, 127833, + 119302, 731, 119304, 92286, 2438, 64855, 119300, 119299, 1175, 0, 42135, + 373, 119172, 2119, 11457, 11521, 7723, 0, 0, 0, 41952, 0, 5273, 2127, + 5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, 12963, 127864, + 6189, 4125, 1314, 12133, 0, 118873, 1271, 983375, 0, 66024, 41482, 3864, + 74539, 0, 3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0, 41390, 5384, + 41882, 67647, 92548, 5759, 0, 0, 41388, 92362, 41392, 64288, 41387, 0, + 8706, 5552, 0, 700, 0, 5553, 0, 7088, 5356, 7499, 78110, 66596, 0, 0, + 10263, 5554, 0, 12344, 10311, 78113, 6665, 0, 0, 7618, 8517, 11455, 78440, 64632, 64447, 5555, 78088, 78093, 78091, 0, 42803, 65033, 9143, 6668, 195067, 195066, 195069, 656, 195071, 65037, 4577, 64624, 0, 0, 0, - 0, 4269, 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895, + 983384, 4269, 73885, 917775, 42846, 69644, 950, 0, 92273, 66580, 118895, 66683, 10554, 917778, 119121, 0, 5098, 917770, 0, 119099, 5097, 4935, - 9848, 10381, 0, 128870, 0, 3651, 0, 194610, 127556, 5102, 5101, 10269, - 12983, 8138, 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, 5099, - 78373, 1441, 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, 9031, - 120790, 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 0, 0, 2676, - 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, 9857, 7014, 9856, 195033, - 92620, 12129, 0, 8481, 0, 6202, 195035, 10920, 128237, 5203, 195039, - 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, 74772, 0, 12613, 5284, - 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 0, 5103, 127861, - 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, 11438, 0, 0, - 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, 195030, - 69720, 6476, 5104, 0, 304, 3176, 0, 0, 932, 128663, 6567, 238, 69656, - 195011, 194595, 19905, 120577, 195015, 78870, 41044, 67640, 194902, - 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, 309, - 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 10814, 43275, 6950, - 9712, 68680, 43970, 0, 65165, 92725, 0, 66466, 0, 0, 0, 66725, 6191, - 11351, 10437, 11316, 67634, 0, 0, 41754, 67635, 9370, 2720, 194975, + 9848, 10381, 0, 128870, 983436, 3651, 0, 194610, 127556, 5102, 5101, + 10269, 12983, 8138, 4517, 1932, 5100, 1439, 12093, 1247, 10034, 195064, + 5099, 78373, 1441, 42087, 3063, 650, 0, 7838, 0, 195041, 195040, 119142, + 9031, 120790, 128582, 9078, 8545, 66356, 128799, 0, 9154, 9118, 0, 0, + 2676, 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, 9857, 7014, 9856, + 195033, 92620, 12129, 0, 8481, 0, 6202, 195035, 10920, 128237, 5203, + 195039, 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, 74772, 0, 12613, + 5284, 6657, 207, 128806, 4275, 74819, 854, 68147, 74381, 0, 0, 5103, + 127861, 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, 11438, 0, + 0, 92694, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, 5105, + 195030, 69720, 6476, 5104, 983484, 304, 3176, 0, 0, 932, 128663, 6567, + 238, 69656, 195011, 194595, 19905, 120577, 195015, 78870, 41044, 67640, + 194902, 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, + 309, 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 10814, 43275, + 6950, 9712, 68680, 43970, 983040, 65165, 92725, 0, 66466, 0, 0, 0, 66725, + 6191, 11351, 10437, 11316, 67634, 0, 0, 41754, 67635, 9370, 2720, 194975, 68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732, 0, 917547, 92682, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, 12077, 0, 64586, 917620, 42396, 55255, 3475, 128035, 2479, 0, 3632, 120728, @@ -16347,71 +16565,72 @@ 2529, 0, 0, 0, 42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634, 92380, 9988, 0, 41068, 0, 0, 65264, 0, 0, 92545, 0, 785, 8236, 128647, 9027, 68160, 67623, 64383, 128821, 925, 127156, 0, 41985, 41071, 9586, 0, - 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 0, 0, 381, 0, 0, 42077, 0, - 127483, 5184, 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, 0, - 0, 812, 3615, 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605, - 10692, 1166, 64429, 42639, 924, 0, 67631, 0, 120670, 2442, 10703, 78789, - 67632, 917924, 12771, 12736, 12753, 0, 73933, 67626, 42401, 0, 0, 127373, - 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626, 3883, - 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, 2715, - 806, 65208, 41884, 917883, 1318, 64731, 0, 0, 0, 66325, 3465, 2405, 9240, - 0, 12756, 65259, 0, 0, 12752, 5833, 1432, 0, 41883, 73912, 9799, 0, - 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0, 194587, 0, 1211, 0, - 0, 0, 118832, 12318, 0, 0, 0, 10622, 0, 0, 78654, 6566, 78659, 0, 73780, - 0, 64864, 0, 78660, 0, 8284, 13081, 0, 3589, 42051, 4035, 6492, 92236, - 4265, 6642, 3977, 74186, 41778, 836, 119216, 2488, 0, 4582, 0, 0, 41777, - 12926, 0, 7528, 10550, 0, 92706, 0, 11439, 0, 1374, 64878, 119014, 0, - 42389, 41374, 0, 0, 78492, 41377, 127909, 0, 400, 12597, 120586, 0, 0, - 6661, 0, 64827, 0, 73817, 390, 0, 74755, 0, 3473, 7718, 0, 0, 0, 55285, - 0, 0, 0, 11969, 0, 127841, 6365, 1887, 6763, 0, 8080, 7006, 0, 0, 6757, - 64351, 1544, 0, 6766, 64677, 120716, 0, 6146, 0, 771, 0, 0, 12812, 13168, - 42272, 12200, 917927, 7904, 0, 953, 12917, 119560, 12300, 0, 11491, 9724, - 10341, 0, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0, 471, 7484, 7482, - 6753, 7480, 7479, 7478, 7477, 6501, 7475, 6918, 7473, 7472, 2474, 7470, - 7468, 10232, 10615, 10213, 127288, 92357, 10049, 78884, 3544, 0, 6017, - 65311, 127481, 120216, 13306, 10533, 7870, 73949, 7625, 0, 120544, 0, 0, - 92660, 0, 0, 0, 19961, 2472, 42665, 92341, 0, 2139, 4256, 120776, 74380, - 0, 42675, 42658, 12845, 0, 0, 65138, 119355, 67862, 0, 65671, 120000, - 120008, 8066, 7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, 445, 120566, - 128308, 0, 0, 8330, 0, 0, 42797, 0, 120215, 0, 3902, 0, 1770, 0, 128866, - 1560, 120209, 194972, 4584, 73843, 0, 11712, 10866, 118928, 1118, 92209, - 0, 0, 1081, 7436, 68420, 7252, 0, 5996, 0, 4903, 0, 41386, 5162, 119189, - 1330, 0, 7139, 0, 12047, 41384, 0, 0, 1848, 4334, 6324, 41975, 64777, - 10674, 12308, 12186, 0, 0, 0, 12715, 128349, 0, 0, 2018, 66672, 41979, - 66685, 119157, 0, 92464, 0, 126984, 0, 9334, 92705, 92315, 0, 7975, 0, - 77957, 0, 66621, 4884, 66597, 69732, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, - 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 0, 0, 42279, 194577, 0, - 78415, 0, 195008, 0, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, - 1471, 0, 0, 42247, 12378, 73925, 69664, 0, 12374, 0, 0, 0, 0, 2460, 0, - 11944, 12376, 127868, 64679, 0, 12380, 10557, 64473, 5870, 0, 2024, - 127180, 0, 0, 539, 0, 127765, 0, 3853, 65180, 127923, 120796, 120245, - 92324, 0, 8659, 0, 12474, 92579, 9503, 194969, 2478, 0, 4162, 0, 4260, - 12953, 69633, 120089, 12470, 0, 74189, 2742, 12476, 11798, 10946, 127310, - 5000, 0, 0, 0, 69672, 8213, 74017, 7771, 6161, 0, 6709, 0, 78885, 0, - 127971, 120582, 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0, 0, 0, - 0, 4014, 12842, 73952, 12015, 127290, 8275, 3893, 0, 0, 12210, 7221, - 42147, 0, 74550, 74465, 64747, 118841, 0, 12516, 4444, 0, 92271, 74537, - 10892, 8231, 0, 6473, 41968, 78388, 41973, 3591, 41969, 0, 2453, 128549, - 92666, 64705, 0, 0, 10349, 10413, 43591, 41962, 3202, 74353, 0, 8316, 0, - 0, 0, 687, 0, 0, 0, 1840, 0, 68671, 119809, 4883, 285, 4723, 77927, - 92692, 4459, 74577, 42921, 41720, 11089, 240, 19906, 0, 42323, 0, 9743, - 120232, 13134, 0, 0, 0, 0, 0, 42634, 0, 43437, 3081, 11463, 120154, 0, 0, - 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, 0, 120236, 65221, 63883, - 43334, 64852, 0, 120235, 66201, 0, 66578, 5001, 41879, 74427, 4121, 5003, - 884, 66700, 63879, 4943, 5150, 73889, 74182, 127915, 643, 3086, 0, 42448, - 42299, 58, 0, 917952, 120083, 63873, 8491, 0, 0, 0, 4530, 42409, 7126, - 194575, 2721, 120074, 119096, 19929, 0, 194574, 0, 4242, 4264, 120077, - 128132, 66179, 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102, - 4437, 73948, 128692, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026, - 4306, 41380, 68432, 92586, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0, - 5088, 6948, 0, 8524, 0, 0, 12385, 0, 0, 69646, 1386, 64580, 11480, 6116, - 65039, 65038, 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710, - 77999, 11663, 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0, - 63896, 12061, 42096, 43621, 3362, 12377, 0, 0, 68449, 7461, 73901, 1244, - 331, 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, - 41964, 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, - 13032, 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 2935, 8698, 12665, 0, - 1930, 0, 78229, 12427, 66514, 0, 13031, 0, 63901, 0, 3657, 128572, 65202, + 41984, 9217, 0, 0, 0, 9186, 2067, 4016, 983538, 0, 381, 983404, 0, 42077, + 0, 127483, 5184, 42078, 194947, 10810, 128531, 4585, 19943, 5860, 67633, + 0, 0, 812, 3615, 0, 5178, 44000, 120548, 78807, 5188, 74287, 67629, 3605, + 10692, 1166, 64429, 42639, 924, 0, 67631, 983464, 120670, 2442, 10703, + 78789, 67632, 917924, 12771, 12736, 12753, 0, 73933, 67626, 42401, 0, 0, + 127373, 42288, 12751, 0, 8542, 13145, 194963, 2468, 66706, 41294, 3626, + 3883, 64388, 42479, 0, 41117, 0, 92580, 0, 0, 67624, 0, 1290, 0, 65585, + 2715, 806, 65208, 41884, 917883, 1318, 64731, 0, 0, 0, 66325, 3465, 2405, + 9240, 0, 12756, 65259, 0, 983516, 12752, 5833, 1432, 0, 41883, 73912, + 9799, 0, 41886, 2480, 0, 2062, 127293, 6494, 5537, 78656, 0, 194587, 0, + 1211, 0, 0, 0, 118832, 12318, 0, 0, 0, 10622, 983514, 0, 78654, 6566, + 78659, 0, 73780, 0, 64864, 0, 78660, 0, 8284, 13081, 0, 3589, 42051, + 4035, 6492, 92236, 4265, 6642, 3977, 74186, 41778, 836, 119216, 2488, 0, + 4582, 0, 0, 41777, 12926, 0, 7528, 10550, 0, 92706, 0, 11439, 0, 1374, + 64878, 119014, 0, 42389, 41374, 0, 0, 78492, 41377, 127909, 0, 400, + 12597, 120586, 0, 0, 6661, 0, 64827, 0, 73817, 390, 0, 74755, 983597, + 3473, 7718, 0, 0, 0, 55285, 0, 0, 0, 11969, 0, 127841, 6365, 1887, 6763, + 0, 8080, 7006, 0, 0, 6757, 64351, 1544, 0, 6766, 64677, 120716, 0, 6146, + 0, 771, 0, 0, 12812, 13168, 42272, 12200, 917927, 7904, 0, 953, 12917, + 119560, 12300, 0, 11491, 9724, 10341, 983508, 9524, 7490, 11389, 7489, + 3379, 0, 7487, 0, 471, 7484, 7482, 6753, 7480, 7479, 7478, 7477, 6501, + 7475, 6918, 7473, 7472, 2474, 7470, 7468, 10232, 10615, 10213, 127288, + 92357, 10049, 78884, 3544, 0, 6017, 65311, 127481, 120216, 13306, 10533, + 7870, 73949, 7625, 0, 120544, 0, 0, 92660, 0, 0, 0, 19961, 2472, 42665, + 92341, 0, 2139, 4256, 120776, 74380, 0, 42675, 42658, 12845, 0, 0, 65138, + 119355, 67862, 0, 65671, 120000, 120008, 8066, 7678, 74865, 0, 0, 0, 0, + 7186, 0, 120555, 0, 445, 120566, 128308, 0, 0, 8330, 0, 0, 42797, 0, + 120215, 0, 3902, 0, 1770, 0, 128866, 1560, 120209, 194972, 4584, 73843, + 0, 11712, 10866, 118928, 1118, 92209, 0, 0, 1081, 7436, 68420, 7252, 0, + 5996, 0, 4903, 0, 41386, 5162, 119189, 1330, 0, 7139, 0, 12047, 41384, 0, + 0, 1848, 4334, 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, 983476, + 12715, 128349, 0, 0, 2018, 66672, 41979, 66685, 119157, 0, 92464, 0, + 126984, 0, 9334, 92705, 92315, 0, 7975, 0, 77957, 0, 66621, 4884, 66597, + 69732, 0, 0, 6313, 65513, 0, 0, 0, 0, 2345, 43697, 463, 0, 0, 119607, + 3117, 5460, 0, 0, 0, 0, 42279, 194577, 0, 78415, 0, 195008, 0, 13248, 0, + 0, 0, 0, 0, 0, 5663, 0, 0, 0, 0, 2482, 1471, 0, 0, 42247, 12378, 73925, + 69664, 0, 12374, 0, 0, 0, 983429, 2460, 0, 11944, 12376, 127868, 64679, + 0, 12380, 10557, 64473, 5870, 0, 2024, 127180, 0, 0, 539, 0, 127765, 0, + 3853, 65180, 127923, 120796, 120245, 92324, 0, 8659, 0, 12474, 92579, + 9503, 194969, 2478, 0, 4162, 0, 4260, 12953, 69633, 120089, 12470, 0, + 74189, 2742, 12476, 11798, 10946, 127310, 5000, 0, 983323, 0, 69672, + 8213, 74017, 7771, 6161, 0, 6709, 0, 78885, 983443, 127971, 120582, + 78547, 0, 10301, 10333, 10397, 0, 0, 73791, 0, 0, 0, 0, 0, 4014, 12842, + 73952, 12015, 127290, 8275, 3893, 0, 0, 12210, 7221, 42147, 0, 74550, + 74465, 64747, 118841, 0, 12516, 4444, 0, 92271, 74537, 10892, 8231, 0, + 6473, 41968, 78388, 41973, 3591, 41969, 0, 2453, 128549, 92666, 64705, 0, + 0, 10349, 10413, 43591, 41962, 3202, 74353, 0, 8316, 0, 0, 0, 687, 0, 0, + 0, 1840, 0, 68671, 119809, 4883, 285, 4723, 77927, 92692, 4459, 74577, + 42921, 41720, 11089, 240, 19906, 0, 42323, 0, 9743, 120232, 13134, 0, 0, + 0, 0, 0, 42634, 0, 43437, 3081, 11463, 120154, 0, 0, 10445, 0, 0, 66717, + 2614, 9125, 119023, 1729, 0, 120236, 65221, 63883, 43334, 64852, 0, + 120235, 66201, 0, 66578, 5001, 41879, 74427, 4121, 5003, 884, 66700, + 63879, 4943, 5150, 73889, 74182, 127915, 643, 3086, 0, 42448, 42299, 58, + 0, 917952, 120083, 63873, 8491, 0, 0, 0, 4530, 42409, 7126, 194575, 2721, + 120074, 119096, 19929, 0, 194574, 0, 4242, 4264, 120077, 128132, 66179, + 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, 119102, 4437, 73948, + 128692, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, 66026, 4306, 41380, + 68432, 92586, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0, 5088, 6948, 0, + 8524, 0, 0, 12385, 0, 0, 69646, 1386, 64580, 11480, 6116, 65039, 65038, + 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710, 77999, 11663, + 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0, 63896, 12061, + 42096, 43621, 3362, 12377, 983567, 0, 68449, 7461, 73901, 1244, 331, + 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, 41964, + 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, 13032, + 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 2935, 8698, 12665, 0, 1930, + 0, 78229, 12427, 66514, 983357, 13031, 0, 63901, 0, 3657, 128572, 65202, 6000, 119206, 12426, 127181, 0, 41740, 12428, 41283, 41916, 119210, 0, 0, 12429, 6727, 0, 7562, 0, 5170, 0, 41755, 676, 0, 66704, 66664, 9978, 66491, 3536, 0, 9752, 92397, 6162, 0, 69228, 10113, 41829, 65886, 5159, @@ -16423,103 +16642,104 @@ 41501, 0, 42031, 5719, 7172, 42687, 8368, 0, 41499, 0, 0, 42242, 41498, 917794, 42025, 78567, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213, 73941, 0, 42330, 917784, 3969, 0, 0, 7169, 1992, 9652, 73977, 7246, - 42086, 917790, 917789, 0, 0, 128801, 0, 0, 327, 0, 9042, 917777, 917776, - 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 0, 917782, - 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0, 128014, - 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436, 0, 42021, 0, - 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, 11348, 0, 78037, 9194, - 0, 0, 19914, 12179, 0, 9648, 194923, 63836, 63832, 917773, 10967, 63816, - 2594, 3444, 63817, 64651, 0, 41503, 127478, 11265, 0, 120756, 194922, 0, - 5664, 3972, 0, 0, 0, 128508, 12416, 917764, 119608, 10816, 917769, - 917768, 12418, 74111, 3882, 8532, 917771, 1573, 128648, 119847, 4596, - 66339, 12417, 66001, 65343, 194782, 12414, 8287, 68219, 195017, 68108, - 1143, 119169, 119846, 12415, 6626, 42763, 0, 118884, 9021, 120783, 0, - 11724, 0, 0, 127104, 128526, 0, 0, 8027, 10997, 9171, 12741, 11400, - 74197, 194799, 0, 128239, 0, 128881, 119604, 127523, 120190, 194773, - 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514, 68651, 0, 0, - 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, 8521, 5083, - 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 120715, 0, 120183, - 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, 8407, 0, - 10805, 8518, 10779, 120188, 0, 0, 12367, 42170, 0, 92557, 629, 1924, 0, - 12037, 74366, 5987, 8462, 8005, 12365, 63933, 69735, 120815, 12369, - 10649, 0, 5077, 127108, 10880, 63927, 5075, 917881, 0, 65075, 0, 11007, - 0, 66659, 92607, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, 5272, - 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, - 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, 0, 66461, 5177, - 41324, 12055, 8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, - 41325, 0, 721, 10182, 9108, 0, 0, 119185, 42229, 194912, 0, 5998, 0, - 42353, 74825, 0, 12587, 0, 78571, 0, 0, 194562, 41576, 42215, 78570, - 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, 63949, 64767, - 2670, 4167, 0, 11723, 0, 74120, 0, 65076, 938, 43414, 73854, 11737, 9721, - 0, 0, 0, 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, 10793, 5250, - 12407, 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, 43997, 0, - 42002, 12404, 0, 0, 4940, 12410, 7683, 1167, 73729, 4983, 0, 861, 0, 0, - 0, 0, 65577, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, 12816, 74583, - 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, 195044, 0, 12577, - 0, 0, 853, 42693, 195014, 0, 0, 5016, 43535, 63893, 42835, 9491, 917913, - 0, 917914, 0, 12712, 7105, 127807, 65060, 120797, 9900, 0, 0, 194919, 0, - 127830, 0, 64778, 12585, 10565, 128151, 12177, 0, 0, 0, 77824, 0, 4900, - 127874, 12878, 92630, 8984, 4119, 74768, 8971, 78593, 43113, 9702, 78594, - 11025, 9245, 13048, 4927, 4138, 74185, 92481, 92710, 12397, 77827, 0, - 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, 5010, 1680, 10507, - 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 128181, 5993, 2819, 0, - 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, 63997, 63910, - 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 128313, 0, 43339, 0, 9836, - 120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, 1664, 1850, - 128841, 3079, 11340, 42408, 42447, 127140, 120020, 42307, 12386, 42304, - 917555, 0, 12389, 0, 92366, 41996, 11526, 63985, 5864, 1147, 63992, - 42887, 1987, 92718, 5480, 7858, 11653, 4116, 12391, 66193, 0, 4939, - 12384, 0, 0, 41686, 63905, 119601, 194688, 0, 0, 12649, 0, 0, 8247, 507, - 91, 2042, 120775, 43643, 194689, 66028, 10036, 41844, 119813, 774, - 119831, 0, 119815, 5994, 12539, 0, 78375, 120597, 119833, 0, 119600, 0, - 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, 41073, 9687, 41681, - 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, 42379, 0, 7534, - 12219, 0, 127528, 42810, 10492, 0, 0, 0, 43119, 0, 120753, 12403, 2500, - 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103, 19946, 74112, 77851, - 13112, 0, 195012, 12859, 0, 120148, 66369, 5861, 127758, 11999, 12400, 0, - 0, 12645, 5146, 11320, 68410, 6748, 65040, 0, 64184, 12974, 64183, 67613, - 120645, 5147, 0, 0, 74524, 0, 1928, 0, 67649, 5991, 3445, 67609, 4976, - 64176, 0, 67610, 8241, 0, 77868, 4206, 0, 0, 0, 128298, 0, 10138, 0, 0, - 8897, 0, 0, 8357, 4124, 77862, 65836, 120641, 127926, 77859, 0, 0, 1123, - 963, 41553, 10120, 12405, 120150, 92664, 398, 13278, 9723, 6366, 120311, - 7945, 0, 4402, 9970, 12402, 0, 42392, 1305, 12408, 0, 44007, 0, 0, 41464, - 12411, 12969, 120824, 41465, 0, 8528, 1575, 0, 63955, 165, 3024, 41467, - 119163, 0, 9093, 0, 9147, 0, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750, - 195018, 0, 9594, 0, 0, 43527, 0, 727, 194703, 0, 5805, 0, 6726, 0, 42176, - 12370, 11655, 119095, 10591, 12364, 0, 12372, 120642, 120307, 0, 92343, - 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, - 4132, 120306, 68474, 92473, 0, 0, 74837, 120155, 1499, 0, 8055, 42740, - 63965, 0, 63962, 74042, 8924, 43123, 5988, 3660, 63969, 11781, 42718, - 8788, 1357, 64851, 65743, 0, 8774, 0, 127086, 9941, 120172, 0, 1933, - 69655, 9564, 0, 92435, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615, - 0, 78302, 12220, 67616, 120598, 127475, 0, 68200, 6675, 128144, 0, 67592, - 120685, 0, 64771, 1198, 9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101, - 1398, 0, 92554, 74034, 41569, 92684, 11406, 8167, 12127, 0, 840, 0, 0, 0, - 6967, 0, 0, 9796, 0, 333, 0, 0, 8144, 2117, 0, 0, 12406, 0, 19931, - 119089, 6678, 7769, 0, 12621, 0, 127366, 10227, 4764, 43101, 9981, 0, - 40986, 4127, 66487, 0, 42202, 12754, 195022, 0, 0, 0, 67594, 2048, 12944, - 4050, 67595, 917967, 43102, 10581, 12985, 4533, 195021, 74003, 6490, 0, - 12038, 0, 0, 120704, 65461, 9798, 69704, 0, 1948, 119007, 0, 952, 128235, - 0, 0, 120802, 6449, 9494, 120313, 0, 43098, 4843, 8142, 64160, 4098, - 64170, 0, 0, 3436, 119973, 0, 12817, 67597, 6676, 3930, 66708, 0, 0, - 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, 0, 8500, 42222, 120142, - 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, 67606, 119083, 0, 42217, - 13102, 0, 66003, 6672, 0, 0, 0, 0, 63841, 9613, 9001, 4526, 11274, 67601, - 64520, 64210, 6664, 78704, 42056, 10228, 64957, 11281, 0, 64213, 1469, - 66640, 65381, 42197, 4988, 42372, 0, 9598, 904, 352, 42225, 1451, 8061, - 8453, 4134, 0, 74847, 66576, 127916, 0, 10520, 8575, 9960, 1201, 127289, - 12846, 127291, 127292, 11919, 64962, 127287, 43739, 127281, 8511, 9460, - 823, 11587, 12305, 0, 64695, 127305, 12387, 1253, 13183, 65766, 500, - 42783, 65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702, - 66498, 9821, 64304, 0, 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323, - 120062, 92669, 0, 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, - 5260, 43143, 0, 326, 120131, 68423, 0, 10771, 2876, 74074, 92530, 194924, - 41398, 7382, 9802, 127077, 127076, 453, 41396, 120524, 42720, 12140, - 9572, 0, 7003, 194883, 42334, 7704, 0, 194885, 43144, 4123, 8494, 43146, - 9977, 0, 0, 65759, 10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, - 9589, 64755, 0, 64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024, - 128072, 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 0, - 64005, 4058, 119019, 0, 64660, 0, 119050, 0, 0, 1139, 43298, 64027, + 42086, 917790, 917789, 0, 0, 128801, 983543, 0, 327, 0, 9042, 917777, + 917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 983570, + 917782, 5999, 0, 7712, 12432, 128243, 43653, 1726, 1015, 0, 8212, 0, + 128014, 42423, 119066, 0, 128108, 66709, 0, 8811, 927, 0, 0, 12436, 0, + 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, 11348, 0, + 78037, 9194, 0, 0, 19914, 12179, 983547, 9648, 194923, 63836, 63832, + 917773, 10967, 63816, 2594, 3444, 63817, 64651, 0, 41503, 127478, 11265, + 0, 120756, 194922, 0, 5664, 3972, 0, 0, 0, 128508, 12416, 917764, 119608, + 10816, 917769, 917768, 12418, 74111, 3882, 8532, 917771, 1573, 128648, + 119847, 4596, 66339, 12417, 66001, 65343, 194782, 12414, 8287, 68219, + 195017, 68108, 1143, 119169, 119846, 12415, 6626, 42763, 0, 118884, 9021, + 120783, 0, 11724, 0, 0, 127104, 128526, 0, 0, 8027, 10997, 9171, 12741, + 11400, 74197, 194799, 0, 128239, 0, 128881, 119604, 127523, 120190, + 194773, 67608, 128214, 42368, 0, 7715, 3881, 41487, 12118, 42514, 68651, + 0, 983630, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, + 8521, 5083, 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 120715, 0, + 120183, 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, + 8407, 0, 10805, 8518, 10779, 120188, 0, 983665, 12367, 42170, 0, 92557, + 629, 1924, 0, 12037, 74366, 5987, 8462, 8005, 12365, 63933, 69735, + 120815, 12369, 10649, 0, 5077, 127108, 10880, 63927, 5075, 917881, 0, + 65075, 0, 11007, 983440, 66659, 92607, 0, 66684, 0, 3434, 4954, 1904, 0, + 5266, 126980, 5272, 10499, 4507, 9578, 63923, 120177, 7979, 0, 9831, 0, + 194926, 461, 9803, 0, 4504, 1505, 0, 6325, 5276, 43021, 120488, 0, 55236, + 0, 66461, 5177, 41324, 12055, 8722, 0, 41327, 0, 66695, 4114, 409, 4383, + 8900, 8948, 41325, 0, 721, 10182, 9108, 0, 0, 119185, 42229, 194912, 0, + 5998, 0, 42353, 74825, 0, 12587, 0, 78571, 0, 0, 194562, 41576, 42215, + 78570, 119207, 0, 8578, 5995, 7573, 41575, 74789, 74752, 63944, 63949, + 64767, 2670, 4167, 0, 11723, 0, 74120, 0, 65076, 938, 43414, 73854, + 11737, 9721, 0, 0, 0, 11742, 2419, 0, 11493, 12334, 194913, 4153, 12302, + 10793, 5250, 12407, 11978, 4404, 9189, 12401, 42007, 5775, 6759, 65806, + 43997, 0, 42002, 12404, 983297, 0, 4940, 12410, 7683, 1167, 73729, 4983, + 0, 861, 0, 0, 0, 0, 65577, 43370, 0, 0, 11956, 0, 0, 0, 9616, 6631, 0, + 12816, 74583, 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, + 195044, 0, 12577, 0, 0, 853, 42693, 195014, 0, 983382, 5016, 43535, + 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, 7105, 127807, 65060, + 120797, 9900, 0, 0, 194919, 0, 127830, 0, 64778, 12585, 10565, 128151, + 12177, 0, 0, 0, 77824, 0, 4900, 127874, 12878, 92630, 8984, 4119, 74768, + 8971, 78593, 43113, 9702, 78594, 11025, 9245, 13048, 4927, 4138, 74185, + 92481, 92710, 12397, 77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, 3948, + 10781, 1546, 0, 5010, 1680, 10507, 78590, 78583, 0, 0, 0, 194915, 7267, + 0, 74833, 128181, 5993, 2819, 0, 12706, 77840, 1893, 7266, 63915, 7264, + 7265, 0, 1363, 0, 63997, 63910, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, + 128313, 0, 43339, 0, 9836, 120727, 0, 41481, 43335, 7832, 42343, 3090, + 43337, 817, 1664, 1850, 128841, 3079, 11340, 42408, 42447, 127140, + 120020, 42307, 12386, 42304, 917555, 0, 12389, 0, 92366, 41996, 11526, + 63985, 5864, 1147, 63992, 42887, 1987, 92718, 5480, 7858, 11653, 4116, + 12391, 66193, 0, 4939, 12384, 0, 0, 41686, 63905, 119601, 194688, 983603, + 0, 12649, 0, 0, 8247, 507, 91, 2042, 120775, 43643, 194689, 66028, 10036, + 41844, 119813, 774, 119831, 0, 119815, 5994, 12539, 0, 78375, 120597, + 119833, 0, 119600, 0, 0, 7719, 6026, 2486, 128312, 119808, 162, 0, 65219, + 41073, 9687, 41681, 6304, 119812, 66196, 194881, 5262, 0, 55233, 12681, + 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, 983396, 0, 43119, 0, + 120753, 12403, 2500, 195013, 0, 4899, 12729, 0, 0, 74113, 2343, 4103, + 19946, 74112, 77851, 13112, 0, 195012, 12859, 983569, 120148, 66369, + 5861, 127758, 11999, 12400, 0, 983574, 12645, 5146, 11320, 68410, 6748, + 65040, 0, 64184, 12974, 64183, 67613, 120645, 5147, 0, 0, 74524, 0, 1928, + 0, 67649, 5991, 3445, 67609, 4976, 64176, 0, 67610, 8241, 0, 77868, 4206, + 0, 0, 0, 128298, 0, 10138, 0, 0, 8897, 0, 0, 8357, 4124, 77862, 65836, + 120641, 127926, 77859, 0, 0, 1123, 963, 41553, 10120, 12405, 120150, + 92664, 398, 13278, 9723, 6366, 120311, 7945, 0, 4402, 9970, 12402, 0, + 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, 12969, 120824, 41465, + 983309, 8528, 1575, 0, 63955, 165, 3024, 41467, 119163, 0, 9093, 0, 9147, + 0, 63958, 0, 9148, 9692, 4096, 53, 73776, 6750, 195018, 0, 9594, 0, 0, + 43527, 0, 727, 194703, 0, 5805, 0, 6726, 0, 42176, 12370, 11655, 119095, + 10591, 12364, 0, 12372, 120642, 120307, 0, 92343, 0, 12366, 10963, 6066, + 1329, 0, 3052, 9220, 0, 64478, 194701, 10803, 4132, 120306, 68474, 92473, + 0, 0, 74837, 120155, 1499, 0, 8055, 42740, 63965, 0, 63962, 74042, 8924, + 43123, 5988, 3660, 63969, 11781, 42718, 8788, 1357, 64851, 65743, 0, + 8774, 0, 127086, 9941, 120172, 0, 1933, 69655, 9564, 0, 92435, 73866, 0, + 0, 2487, 67614, 3121, 1804, 3311, 67615, 0, 78302, 12220, 67616, 120598, + 127475, 0, 68200, 6675, 128144, 0, 67592, 120685, 0, 64771, 1198, 9132, + 0, 64619, 510, 64663, 0, 0, 4561, 2101, 1398, 0, 92554, 74034, 41569, + 92684, 11406, 8167, 12127, 0, 840, 0, 0, 0, 6967, 0, 0, 9796, 0, 333, 0, + 0, 8144, 2117, 0, 983339, 12406, 0, 19931, 119089, 6678, 7769, 0, 12621, + 0, 127366, 10227, 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, 42202, + 12754, 195022, 0, 0, 0, 67594, 2048, 12944, 4050, 67595, 917967, 43102, + 10581, 12985, 4533, 195021, 74003, 6490, 0, 12038, 0, 0, 120704, 65461, + 9798, 69704, 0, 1948, 119007, 0, 952, 128235, 0, 0, 120802, 6449, 9494, + 120313, 0, 43098, 4843, 8142, 64160, 4098, 64170, 0, 0, 3436, 119973, 0, + 12817, 67597, 6676, 3930, 66708, 0, 0, 67598, 0, 0, 0, 65591, 41581, + 65916, 1453, 0, 0, 0, 8500, 42222, 120142, 73743, 120400, 4317, 11543, + 67676, 64676, 0, 0, 67606, 119083, 0, 42217, 13102, 0, 66003, 6672, 0, 0, + 0, 983482, 63841, 9613, 9001, 4526, 11274, 67601, 64520, 64210, 6664, + 78704, 42056, 10228, 64957, 11281, 0, 64213, 1469, 66640, 65381, 42197, + 4988, 42372, 0, 9598, 904, 352, 42225, 1451, 8061, 8453, 4134, 0, 74847, + 66576, 127916, 0, 10520, 8575, 9960, 1201, 127289, 12846, 127291, 127292, + 11919, 64962, 127287, 43739, 127281, 8511, 9460, 823, 11587, 12305, 0, + 64695, 127305, 12387, 1253, 13183, 65766, 500, 42783, 65765, 64208, + 64369, 65760, 65761, 119585, 11606, 64784, 11702, 66498, 9821, 64304, 0, + 5152, 11048, 7533, 68366, 64410, 92305, 0, 4323, 120062, 92669, 0, + 127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, 5260, 43143, 0, + 326, 120131, 68423, 0, 10771, 2876, 74074, 92530, 194924, 41398, 7382, + 9802, 127077, 127076, 453, 41396, 120524, 42720, 12140, 9572, 0, 7003, + 194883, 42334, 7704, 0, 194885, 43144, 4123, 8494, 43146, 9977, 0, 0, + 65759, 10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, 9589, + 64755, 0, 64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024, 128072, + 679, 64013, 0, 5850, 758, 7536, 0, 92234, 41441, 10693, 64006, 983311, + 64005, 4058, 119019, 0, 64660, 0, 119050, 0, 983434, 1139, 43298, 64027, 64029, 8970, 0, 9934, 0, 10774, 128020, 42201, 12421, 128216, 0, 1852, 3057, 128113, 73744, 64034, 64039, 0, 0, 0, 0, 92322, 7645, 12854, 74338, 3496, 0, 0, 0, 9102, 627, 127795, 6158, 8327, 74553, 66632, 12419, 13309, @@ -16529,143 +16749,145 @@ 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, 120387, 9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, 65693, 0, 0, 0, 69695, 42240, 0, 0, 42864, 0, 64667, 41868, 1184, 0, 815, 11484, - 127535, 67840, 0, 0, 128793, 0, 10986, 64683, 0, 0, 194709, 0, 0, 9879, - 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, 5142, 2407, - 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 92390, - 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, 2652, - 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562, + 127535, 67840, 983386, 0, 128793, 0, 10986, 64683, 983520, 0, 194709, 0, + 0, 9879, 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, + 5142, 2407, 69643, 42199, 0, 92404, 74373, 0, 55217, 0, 63870, 43163, 0, + 0, 92390, 42867, 1834, 0, 92461, 69817, 10940, 65249, 119040, 8662, 0, 0, + 2652, 120527, 7164, 10784, 195093, 67674, 0, 92233, 92482, 194749, 74562, 917505, 1828, 74474, 120327, 78620, 8531, 12499, 6280, 12324, 118854, 65238, 68374, 4832, 65573, 0, 6279, 12508, 12904, 12502, 9161, 0, 1620, 64436, 3601, 195094, 128073, 0, 609, 11555, 0, 12496, 127839, 74181, 4343, 12505, 0, 127863, 0, 11377, 239, 0, 637, 0, 0, 42671, 0, 0, 0, - 43565, 127082, 0, 12696, 128256, 0, 194796, 12929, 0, 712, 0, 4197, 0, - 42818, 128688, 0, 120490, 0, 119137, 1506, 43562, 0, 0, 0, 12651, 0, - 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592, 118844, 0, + 43565, 127082, 983656, 12696, 128256, 0, 194796, 12929, 0, 712, 0, 4197, + 983045, 42818, 128688, 0, 120490, 0, 119137, 1506, 43562, 0, 0, 0, 12651, + 0, 64628, 74517, 12058, 74084, 917838, 7494, 0, 4924, 65592, 118844, 0, 127088, 355, 9719, 127087, 13066, 64796, 0, 0, 12033, 42178, 0, 69760, 42571, 92635, 0, 0, 0, 0, 0, 127176, 3178, 0, 0, 92704, 0, 9080, 127000, 120352, 0, 68209, 0, 11082, 0, 5699, 195100, 66000, 9488, 65166, 119112, 0, 0, 0, 0, 128208, 0, 5265, 69235, 0, 11487, 67858, 12464, 0, 43045, 0, 0, 43345, 0, 10770, 118994, 6807, 465, 9829, 0, 74348, 0, 43346, 8116, - 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, 0, 120811, 0, - 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, 55257, 73771, 1766, - 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, 64595, 127294, 0, - 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, 0, 0, 119060, + 795, 0, 0, 12462, 10930, 10831, 0, 118952, 64362, 74334, 983346, 120811, + 0, 12468, 8607, 1008, 0, 10092, 195078, 917842, 67855, 55257, 73771, + 1766, 11282, 11996, 1820, 4547, 0, 0, 0, 0, 13223, 128665, 64595, 127294, + 0, 92311, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, 5382, 0, 0, 0, 119060, 64953, 5406, 19920, 92216, 66510, 3590, 0, 1130, 0, 0, 42016, 11823, 43023, 0, 118896, 7742, 0, 13280, 0, 9326, 73826, 5310, 74812, 78584, - 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, 0, - 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, 0, 0, - 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, 0, 118990, + 92229, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, 120803, + 983583, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 127182, 0, 0, + 0, 69783, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 128247, 0, 118990, 10491, 0, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981, 12382, 42133, 120755, 9706, 69738, 0, 66610, 10461, 12103, 0, 8642, 0, - 42766, 0, 66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, 8041, - 1461, 910, 119133, 0, 6749, 3658, 0, 120525, 0, 7617, 194841, 12888, 0, - 67668, 13143, 0, 9193, 11097, 5703, 0, 41517, 41504, 41519, 10016, 64305, - 0, 65864, 623, 781, 670, 10660, 5769, 613, 7543, 120279, 477, 41083, - 92521, 0, 592, 1578, 12459, 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, - 0, 647, 0, 633, 120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, 120529, - 74199, 12482, 0, 12489, 0, 3195, 5550, 0, 7897, 0, 1203, 74396, 1813, - 64544, 41311, 12090, 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, 10595, 0, - 119077, 0, 0, 0, 0, 0, 43244, 0, 0, 0, 119561, 0, 0, 194921, 128160, - 9939, 0, 0, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, 65372, 0, 74038, - 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, 9282, 66489, - 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, 0, 10732, - 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, 68627, 0, 11544, 10203, - 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311, 777, 120187, - 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 0, 9454, 63778, 8658, - 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 0, - 2701, 0, 0, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 0, 63745, 1748, - 63770, 0, 0, 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, 6096, - 0, 7694, 0, 7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, 1591, 0, - 6386, 63783, 0, 0, 127173, 0, 0, 0, 74575, 0, 65719, 13083, 64574, 65012, - 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, 1922, 0, 12498, 10987, - 0, 0, 3894, 65543, 0, 194842, 0, 493, 0, 43197, 1717, 4228, 479, 10303, - 74020, 0, 917935, 10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, - 6233, 42681, 1002, 12491, 0, 64911, 92615, 2096, 65120, 0, 0, 0, 11611, - 11632, 127041, 66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, - 8507, 66236, 66211, 66218, 92672, 66240, 78041, 66233, 8928, 0, 7909, - 66234, 11605, 63759, 0, 66208, 73999, 63799, 63803, 244, 11542, 12898, - 12494, 73761, 12492, 12669, 0, 0, 74153, 0, 128278, 120680, 4882, 13040, - 0, 8612, 4885, 74053, 0, 13042, 4880, 64662, 2429, 1360, 248, 0, 63797, - 92394, 42358, 0, 7292, 0, 63756, 42786, 66693, 0, 1870, 78040, 470, - 78038, 78035, 78036, 0, 78034, 4579, 128090, 0, 12511, 74453, 12514, 0, - 74579, 7239, 7001, 8623, 0, 128052, 128048, 7378, 12512, 11615, 6104, 0, - 0, 659, 6098, 0, 12234, 127307, 127067, 8311, 12510, 41803, 13039, - 127072, 12513, 10202, 12471, 0, 8747, 0, 0, 0, 2323, 0, 2319, 77917, - 12477, 77916, 2311, 0, 4415, 237, 6281, 127280, 0, 0, 2309, 1312, 8173, - 128871, 12469, 0, 78505, 64335, 10609, 0, 128111, 9397, 11524, 9395, - 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, 9383, - 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, 128167, - 7948, 9236, 0, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082, - 10924, 3147, 0, 120684, 12524, 119081, 2310, 11818, 9381, 9382, 9379, - 9380, 9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 12444, 0, 0, 13016, - 8210, 0, 42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 0, 4155, 0, 0, - 42030, 5007, 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, 0, - 12525, 0, 12016, 65770, 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, - 92567, 65691, 63998, 1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0, - 12231, 0, 12500, 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, - 120321, 78395, 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, - 9076, 8862, 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, - 128817, 8546, 11553, 63995, 13177, 9043, 6303, 0, 498, 64471, 120324, - 128567, 12529, 8042, 0, 2344, 12528, 8031, 2414, 0, 69719, 3231, 0, 6422, - 66512, 69653, 12530, 2537, 78405, 41429, 12658, 13036, 65772, 0, 78738, - 41433, 4719, 469, 0, 4363, 3313, 41428, 78407, 2023, 1772, 78224, 78225, - 65706, 10051, 64812, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, 119363, - 9607, 0, 9663, 0, 119634, 6503, 41110, 0, 1491, 0, 0, 127304, 41061, 0, - 0, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, 41108, 9738, - 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717, 127776, - 9940, 127299, 7692, 0, 8008, 41131, 330, 8566, 65083, 41133, 9816, - 128074, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139, + 42766, 983601, 66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, + 8041, 1461, 910, 119133, 0, 6749, 3658, 0, 120525, 0, 7617, 194841, + 12888, 0, 67668, 13143, 0, 9193, 11097, 5703, 0, 41517, 41504, 41519, + 10016, 64305, 0, 65864, 623, 781, 670, 10660, 5769, 613, 7543, 120279, + 477, 41083, 92521, 0, 592, 1578, 12459, 43449, 0, 0, 8225, 0, 654, 11345, + 653, 652, 0, 647, 0, 633, 120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, + 120529, 74199, 12482, 0, 12489, 0, 3195, 5550, 983298, 7897, 0, 1203, + 74396, 1813, 64544, 41311, 12090, 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, + 10595, 0, 119077, 0, 983355, 0, 0, 0, 43244, 0, 0, 983651, 119561, 0, 0, + 194921, 128160, 9939, 0, 0, 77860, 0, 0, 270, 0, 10714, 0, 0, 0, 0, 0, + 65372, 0, 74038, 119558, 6273, 66679, 364, 9595, 194908, 0, 0, 707, 0, 0, + 9282, 66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, 0, 3841, 68634, + 0, 10732, 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, 68627, 983453, + 11544, 10203, 9608, 0, 0, 11962, 194694, 12507, 1196, 128687, 128311, + 777, 120187, 4375, 65271, 67678, 0, 12198, 0, 64824, 119343, 0, 9454, + 63778, 8658, 42528, 78000, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, + 8280, 0, 2701, 0, 0, 5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 983549, + 63745, 1748, 63770, 0, 0, 0, 65542, 63766, 55244, 3061, 0, 63764, 63787, + 9067, 6096, 0, 7694, 0, 7257, 63768, 3485, 12987, 0, 127522, 120628, + 63807, 1591, 0, 6386, 63783, 0, 0, 127173, 0, 0, 0, 74575, 0, 65719, + 13083, 64574, 65012, 0, 1640, 12495, 66691, 7624, 3138, 10996, 92247, + 1922, 0, 12498, 10987, 0, 0, 3894, 65543, 0, 194842, 983332, 493, 0, + 43197, 1717, 4228, 479, 10303, 74020, 0, 917935, 10335, 3520, 917932, + 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002, 12491, 0, 64911, + 92615, 2096, 65120, 0, 0, 0, 11611, 11632, 127041, 66213, 63864, 66221, + 66226, 66229, 13218, 66231, 66216, 8507, 66236, 66211, 66218, 92672, + 66240, 78041, 66233, 8928, 983296, 7909, 66234, 11605, 63759, 983389, + 66208, 73999, 63799, 63803, 244, 11542, 12898, 12494, 73761, 12492, + 12669, 0, 0, 74153, 0, 128278, 120680, 4882, 13040, 0, 8612, 4885, 74053, + 0, 13042, 4880, 64662, 2429, 1360, 248, 0, 63797, 92394, 42358, 0, 7292, + 0, 63756, 42786, 66693, 0, 1870, 78040, 470, 78038, 78035, 78036, 983313, + 78034, 4579, 128090, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, 8623, + 0, 128052, 128048, 7378, 12512, 11615, 6104, 0, 0, 659, 6098, 0, 12234, + 127307, 127067, 8311, 12510, 41803, 13039, 127072, 12513, 10202, 12471, + 0, 8747, 983655, 0, 0, 2323, 0, 2319, 77917, 12477, 77916, 2311, 0, 4415, + 237, 6281, 127280, 0, 0, 2309, 1312, 8173, 128871, 12469, 0, 78505, + 64335, 10609, 0, 128111, 9397, 11524, 9395, 9396, 9393, 9394, 9391, 9392, + 9389, 6209, 9387, 9388, 4932, 9386, 9383, 9384, 6740, 0, 65451, 8185, 0, + 917832, 43024, 43336, 67659, 2313, 128167, 7948, 9236, 0, 0, 0, 10570, + 43473, 6289, 10484, 0, 0, 11998, 12082, 10924, 3147, 0, 120684, 12524, + 119081, 2310, 11818, 9381, 9382, 9379, 9380, 9377, 9378, 9375, 9376, + 1683, 9374, 983513, 9372, 12444, 0, 0, 13016, 8210, 983690, 42029, 11079, + 12331, 43451, 42032, 8744, 726, 0, 983572, 4155, 0, 0, 42030, 5007, + 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, 983576, 12525, 0, + 12016, 65770, 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 92567, + 65691, 63998, 1819, 10496, 0, 0, 119920, 0, 194668, 0, 12506, 0, 12231, + 0, 12500, 44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, + 78395, 78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, 9076, + 8862, 69743, 41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, + 128817, 8546, 11553, 63995, 13177, 9043, 6303, 983679, 498, 64471, + 120324, 128567, 12529, 8042, 0, 2344, 12528, 8031, 2414, 0, 69719, 3231, + 0, 6422, 66512, 69653, 12530, 2537, 78405, 41429, 12658, 13036, 65772, 0, + 78738, 41433, 4719, 469, 0, 4363, 3313, 41428, 78407, 2023, 1772, 78224, + 78225, 65706, 10051, 64812, 78220, 0, 9920, 12215, 0, 4931, 1951, 12497, + 119363, 9607, 0, 9663, 0, 119634, 6503, 41110, 0, 1491, 0, 0, 127304, + 41061, 0, 0, 127187, 65026, 41993, 41509, 11045, 65028, 78602, 66476, + 41108, 9738, 41995, 1075, 1958, 12535, 41992, 41506, 0, 41687, 0, 120717, + 127776, 9940, 127299, 7692, 0, 8008, 41131, 330, 8566, 65083, 41133, + 9816, 128074, 12532, 78550, 78546, 3508, 127058, 43235, 0, 127298, 64139, 78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, 0, 64136, 12536, - 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, 128810, 0, 65599, - 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207, 0, 6117, - 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, 127286, - 12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 128571, 73766, 0, - 6295, 901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, 78560, - 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, 74031, - 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, 6762, - 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 0, 0, - 9325, 6818, 6283, 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, - 0, 194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, - 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, 10024, 194764, 194767, - 74340, 69681, 0, 64945, 8029, 0, 0, 0, 3335, 0, 0, 9776, 120526, 194748, - 5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, 78581, - 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 74542, 3337, - 4537, 67895, 11736, 0, 68608, 6482, 4214, 73790, 11945, 0, 13046, 8838, - 425, 4025, 10709, 78595, 2108, 2392, 13047, 0, 0, 6819, 13049, 6499, - 92243, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 127919, 0, 128069, - 3277, 8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, 64626, 66034, - 7751, 194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, 12420, 4024, - 194730, 41054, 1078, 9757, 69736, 41057, 0, 0, 0, 0, 0, 92210, 92411, 0, - 41496, 0, 9165, 1572, 11911, 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, - 43183, 6401, 5831, 0, 0, 13043, 8056, 92494, 65681, 208, 127382, 41514, - 0, 0, 0, 10699, 6408, 92227, 7825, 5661, 0, 120630, 3603, 41109, 2398, - 3548, 0, 0, 119933, 0, 3115, 9918, 0, 11321, 42912, 0, 0, 194726, 4876, - 65804, 0, 0, 43468, 0, 41558, 41471, 73950, 8158, 9944, 41472, 120298, - 13051, 78689, 3143, 194674, 6701, 41559, 1896, 66256, 13052, 194680, - 5665, 0, 119071, 7025, 63974, 0, 74352, 74161, 4154, 9863, 43550, 12310, - 5662, 42382, 194686, 73924, 1121, 194665, 63959, 0, 9942, 13231, 0, - 64752, 4732, 194666, 11596, 119931, 65187, 1626, 63983, 10110, 64772, - 42024, 6420, 42028, 0, 10509, 2795, 4910, 194728, 69231, 64753, 6275, - 917808, 118830, 63978, 11044, 3229, 6423, 42774, 0, 0, 0, 12823, 2331, - 917810, 42026, 6137, 0, 7524, 0, 917809, 8346, 0, 8338, 128315, 65043, 0, - 822, 127984, 9903, 64721, 42722, 194656, 194659, 78655, 78661, 194660, - 78662, 41265, 5311, 1795, 965, 118791, 10587, 78055, 11278, 78632, - 194640, 0, 12946, 194641, 119341, 120349, 6294, 3144, 194648, 194647, - 65019, 194649, 73990, 0, 0, 748, 41067, 2330, 535, 3148, 12375, 194652, - 194629, 10556, 2475, 12388, 4889, 8968, 67863, 3593, 0, 0, 2342, 0, - 194634, 65206, 4894, 194635, 4890, 194637, 917804, 581, 4893, 0, 6571, - 65545, 4888, 4157, 78048, 78049, 78046, 78047, 0, 10119, 6415, 42893, 0, - 69702, 0, 0, 11375, 64746, 2332, 78063, 412, 78061, 64932, 42880, 43587, - 0, 0, 0, 0, 65197, 78066, 12203, 78064, 78065, 8913, 65854, 4875, 65811, - 120381, 120389, 118888, 9344, 8826, 120386, 120395, 13104, 74781, 11997, - 120393, 78075, 0, 3134, 0, 65696, 92331, 0, 66217, 0, 8334, 119344, 0, - 3449, 0, 0, 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, - 10734, 127014, 0, 127914, 7804, 78272, 10811, 6250, 11339, 4914, 11367, - 0, 78054, 4917, 74516, 74208, 64285, 4912, 5464, 127836, 118893, 2361, - 7971, 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, - 40977, 10960, 40962, 8305, 12573, 0, 40980, 0, 13202, 0, 12582, 78282, 0, - 0, 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, - 74045, 120165, 0, 0, 4913, 0, 0, 0, 42326, 128194, 12728, 92685, 42478, + 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, 128810, 983380, + 65599, 65717, 9966, 0, 4948, 12484, 4032, 128149, 12623, 0, 6207, 0, + 6117, 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, + 127286, 12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 128571, 73766, + 0, 6295, 901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, + 78560, 78557, 78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, + 74031, 78563, 78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, + 6762, 78579, 78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, + 983558, 0, 9325, 6818, 6283, 11738, 0, 983666, 0, 11741, 0, 0, 9216, + 8263, 11279, 194752, 983560, 194754, 13021, 64494, 3136, 194758, 194757, + 194760, 13022, 42737, 9956, 0, 0, 74552, 10014, 0, 41260, 119340, 13020, + 10024, 194764, 194767, 74340, 69681, 0, 64945, 8029, 0, 0, 983515, 3335, + 0, 0, 9776, 120526, 194748, 5215, 42644, 3333, 1632, 194751, 64849, 3342, + 78582, 5363, 12957, 78581, 4156, 0, 0, 6421, 78591, 1611, 78589, 13018, + 74257, 78588, 74542, 3337, 4537, 67895, 11736, 0, 68608, 6482, 4214, + 73790, 11945, 0, 13046, 8838, 425, 4025, 10709, 78595, 2108, 2392, 13047, + 0, 0, 6819, 13049, 6499, 92243, 12424, 68614, 73944, 13050, 9924, 194745, + 6507, 127919, 0, 128069, 3277, 8929, 4947, 41055, 0, 194722, 194721, + 194724, 13045, 64626, 66034, 7751, 194727, 8371, 194729, 3997, 12806, + 8768, 13044, 0, 12420, 4024, 194730, 41054, 1078, 9757, 69736, 41057, 0, + 0, 0, 0, 0, 92210, 92411, 0, 41496, 0, 9165, 1572, 11911, 0, 118842, + 2346, 13270, 8958, 0, 9646, 3773, 43183, 6401, 5831, 0, 0, 13043, 8056, + 92494, 65681, 208, 127382, 41514, 0, 0, 0, 10699, 6408, 92227, 7825, + 5661, 0, 120630, 3603, 41109, 2398, 3548, 0, 0, 119933, 0, 3115, 9918, 0, + 11321, 42912, 0, 0, 194726, 4876, 65804, 0, 0, 43468, 0, 41558, 41471, + 73950, 8158, 9944, 41472, 120298, 13051, 78689, 3143, 194674, 6701, + 41559, 1896, 66256, 13052, 194680, 5665, 0, 119071, 7025, 63974, 0, + 74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382, 194686, 73924, 1121, + 194665, 63959, 0, 9942, 13231, 0, 64752, 4732, 194666, 11596, 119931, + 65187, 1626, 63983, 10110, 64772, 42024, 6420, 42028, 0, 10509, 2795, + 4910, 194728, 69231, 64753, 6275, 917808, 118830, 63978, 11044, 3229, + 6423, 42774, 0, 0, 0, 12823, 2331, 917810, 42026, 6137, 0, 7524, 0, + 917809, 8346, 0, 8338, 128315, 65043, 0, 822, 127984, 9903, 64721, 42722, + 194656, 194659, 78655, 78661, 194660, 78662, 41265, 5311, 1795, 965, + 118791, 10587, 78055, 11278, 78632, 194640, 0, 12946, 194641, 119341, + 120349, 6294, 3144, 194648, 194647, 65019, 194649, 73990, 0, 983692, 748, + 41067, 2330, 535, 3148, 12375, 194652, 194629, 10556, 2475, 12388, 4889, + 8968, 67863, 3593, 0, 0, 2342, 0, 194634, 65206, 4894, 194635, 4890, + 194637, 917804, 581, 4893, 0, 6571, 65545, 4888, 4157, 78048, 78049, + 78046, 78047, 0, 10119, 6415, 42893, 0, 69702, 0, 0, 11375, 64746, 2332, + 78063, 412, 78061, 64932, 42880, 43587, 0, 0, 0, 0, 65197, 78066, 12203, + 78064, 78065, 8913, 65854, 4875, 65811, 120381, 120389, 118888, 9344, + 8826, 120386, 120395, 13104, 74781, 11997, 120393, 78075, 0, 3134, 0, + 65696, 92331, 0, 66217, 0, 8334, 119344, 0, 3449, 0, 0, 78414, 78413, + 118950, 74011, 0, 0, 0, 0, 1908, 120167, 4328, 10734, 127014, 0, 127914, + 7804, 78272, 10811, 6250, 11339, 4914, 11367, 0, 78054, 4917, 74516, + 74208, 64285, 4912, 5464, 127836, 118893, 2361, 7971, 78072, 78073, + 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, 40977, 10960, 40962, + 8305, 12573, 983352, 40980, 983696, 13202, 0, 12582, 78282, 0, 983427, + 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, 74045, + 120165, 0, 0, 4913, 0, 983691, 0, 42326, 128194, 12728, 92685, 42478, 2327, 0, 12563, 42287, 12705, 0, 0, 12588, 8821, 6153, 2867, 194708, 66312, 698, 128007, 194606, 10356, 74075, 194713, 651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, 78463, 78464, 128851, 78461, 194697, 74356, @@ -16673,373 +16895,377 @@ 120676, 8703, 5462, 917629, 0, 10101, 0, 0, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 128654, 0, 119194, 74050, 92701, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, 0, 2699, 0, 73845, 2985, - 92568, 0, 917845, 12192, 119314, 0, 119312, 9827, 119310, 119311, 119308, - 119309, 119306, 11481, 41210, 119305, 0, 35, 78481, 78482, 66694, 68479, - 78477, 78478, 43596, 6090, 64257, 7812, 10534, 0, 78485, 73848, 78483, - 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, 0, 64497, 12138, - 7930, 0, 43303, 68216, 0, 917826, 5244, 4189, 127098, 67596, 127504, - 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, 917827, 65555, 12574, 0, 0, - 0, 74490, 127099, 43657, 0, 0, 0, 42682, 12578, 12720, 0, 41227, 0, - 12346, 127101, 64848, 0, 0, 7251, 0, 0, 118850, 119141, 128546, 66015, 0, - 959, 8885, 12564, 66457, 78808, 9469, 9632, 92323, 74761, 64323, 0, 0, 0, - 0, 310, 0, 41281, 10976, 0, 92190, 0, 74266, 10054, 6497, 8574, 0, 9012, - 19958, 74420, 65089, 13215, 12730, 65163, 74044, 374, 43195, 816, 0, 0, - 0, 41934, 7465, 0, 128168, 0, 4715, 6101, 0, 41936, 0, 4879, 0, 65446, 0, - 307, 127147, 9585, 5374, 0, 128059, 0, 0, 0, 0, 0, 65567, 120614, 1929, - 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, 194623, 5378, 78791, - 128679, 41421, 0, 4462, 0, 0, 128092, 821, 0, 2498, 5800, 120157, 0, - 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, 43597, - 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, 0, - 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, 1810, - 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592, - 78092, 74357, 194597, 4748, 92228, 194598, 194601, 42260, 5871, 119075, - 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, 8775, 127945, 0, 2963, - 0, 8410, 4454, 723, 127882, 966, 4449, 92330, 92238, 0, 7819, 2320, - 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, - 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, 0, 1584, 66645, 6045, - 6729, 120640, 65218, 78777, 0, 78062, 7537, 0, 11370, 0, 10330, 0, 10394, - 0, 74194, 0, 127929, 9780, 0, 13092, 194576, 119605, 194578, 7074, 92648, - 194579, 194582, 11414, 128868, 2531, 13034, 0, 0, 4211, 1259, 7517, 0, 0, - 194561, 40996, 13037, 7092, 641, 5219, 194567, 194566, 11064, 41129, 0, - 42850, 13035, 9075, 92387, 5466, 128153, 0, 64098, 65793, 4535, 194573, - 4271, 78417, 128357, 6769, 41410, 0, 64262, 6767, 41407, 0, 0, 6755, - 118864, 9046, 127934, 0, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, 2563, 13033, - 247, 118915, 0, 12338, 4651, 0, 11270, 0, 0, 11933, 0, 0, 41903, 43447, - 11001, 0, 42255, 0, 92661, 69821, 41905, 0, 0, 10775, 9793, 5009, 0, - 42269, 64587, 0, 42535, 69812, 64529, 41408, 42853, 3877, 120795, 42674, - 8147, 43566, 119021, 0, 10236, 65918, 43782, 0, 0, 64506, 69652, 118921, - 4747, 128058, 0, 43200, 5832, 0, 0, 5141, 42600, 0, 43203, 0, 0, 43286, - 0, 128211, 43778, 0, 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0, - 0, 0, 6059, 126985, 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 0, - 120786, 42233, 64140, 9946, 63885, 0, 11822, 0, 43189, 0, 0, 1788, 1579, - 120482, 917817, 0, 0, 0, 9028, 119571, 69234, 0, 0, 1285, 64882, 41242, - 0, 0, 12640, 0, 7401, 0, 12625, 68198, 0, 92254, 3940, 41597, 55260, - 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516, - 120523, 0, 8815, 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142, - 68454, 42485, 118837, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, - 12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, - 42777, 10139, 980, 43698, 65386, 0, 0, 43701, 43198, 7184, 120673, - 194797, 917819, 10085, 119992, 0, 119993, 6634, 92373, 0, 119323, 8072, - 119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, 12395, 0, - 126977, 120565, 9914, 127011, 917854, 73975, 6367, 6351, 66688, 0, 78107, - 0, 64735, 41243, 92199, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, 0, - 120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, 9741, - 78329, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 128225, 13213, - 42452, 78331, 0, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, 41132, - 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, 12632, - 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, 1091, - 12638, 7977, 4501, 41099, 0, 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, 10494, - 92655, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0, - 120462, 74106, 12413, 194829, 917994, 0, 917995, 5570, 1881, 7210, 0, - 1012, 66630, 0, 120709, 7208, 66442, 5569, 0, 42339, 0, 6063, 0, 0, - 119594, 6053, 65602, 0, 92201, 64727, 9160, 194827, 0, 0, 92180, 10503, - 118810, 6055, 3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, - 92204, 0, 0, 120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, - 3674, 9740, 9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, - 120101, 589, 7050, 0, 43281, 10233, 41263, 66251, 65729, 66253, 0, 74099, - 42645, 0, 194815, 8583, 0, 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204, - 917962, 19966, 77856, 42561, 120626, 0, 0, 8120, 120701, 0, 0, 128012, - 41063, 0, 10664, 0, 8369, 0, 4551, 194964, 3369, 0, 0, 9673, 66334, - 65580, 10478, 118960, 12517, 557, 9457, 12034, 0, 6355, 12519, 41004, 0, - 195025, 74094, 0, 0, 77970, 0, 0, 128175, 12111, 3927, 0, 12515, 1474, - 67893, 5492, 6923, 128099, 10441, 73836, 0, 43990, 5493, 0, 74319, 0, - 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, 917959, 5853, 13063, - 10363, 0, 12956, 128169, 120729, 11314, 917582, 12060, 0, 78392, 12826, - 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, - 43420, 78396, 127057, 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693, - 12125, 12766, 0, 1164, 0, 0, 41918, 0, 127542, 8687, 66009, 12178, 7053, - 128001, 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, - 41126, 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, - 42843, 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, - 8922, 128068, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, - 13262, 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, - 5295, 917569, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, - 41413, 3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, - 8070, 6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, - 0, 67648, 120499, 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0, - 77949, 0, 68135, 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971, - 78453, 92556, 73898, 11979, 0, 118900, 917894, 0, 9635, 12600, 8871, 0, - 0, 0, 6469, 74227, 0, 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, - 0, 0, 42916, 0, 0, 0, 7282, 78728, 65733, 4445, 127138, 128082, 3494, - 74606, 6555, 0, 77976, 0, 0, 78566, 0, 0, 65898, 0, 65312, 5447, 0, - 12895, 65593, 4010, 0, 41106, 0, 64448, 0, 41105, 0, 65820, 6232, 0, - 128280, 0, 43608, 119091, 0, 6538, 4335, 78364, 3941, 41122, 11061, - 78363, 64892, 9113, 1954, 12155, 0, 42878, 11500, 0, 0, 74578, 0, 65832, - 0, 0, 0, 77975, 119230, 4586, 0, 350, 10951, 0, 509, 0, 0, 92307, 0, 0, - 5133, 0, 0, 9500, 0, 4957, 64741, 2422, 9354, 0, 0, 0, 2496, 11516, 944, - 118851, 3890, 12168, 1438, 0, 0, 0, 41947, 1220, 120828, 128555, 0, 0, - 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, 41980, 0, 0, 78120, - 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, 41120, 65121, 10862, - 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, 917986, 11532, 74073, 0, - 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, 11428, 1730, 2457, 0, - 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 92491, 0, 6129, 0, 0, 128268, - 0, 7874, 8681, 119092, 0, 13136, 0, 0, 74278, 63886, 118881, 9605, 73892, - 13220, 128776, 120274, 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, 3096, - 0, 0, 0, 66676, 65873, 0, 0, 0, 9501, 0, 1272, 64536, 65465, 64654, 7467, - 0, 1467, 10158, 10040, 0, 9519, 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, - 0, 19935, 0, 92162, 69676, 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, - 11471, 43554, 65862, 11474, 66332, 66603, 128138, 2426, 12042, 92194, 0, - 9537, 3961, 12115, 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, - 11667, 42686, 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, - 68215, 0, 8541, 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 10060, - 41940, 8299, 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493, - 0, 41699, 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012, - 10395, 0, 43633, 65447, 0, 0, 11004, 695, 739, 696, 7611, 0, 42755, - 74802, 9227, 7506, 7510, 92281, 691, 738, 7511, 7512, 7515, 3868, 688, - 41847, 690, 2548, 737, 974, 8003, 7406, 917911, 0, 0, 3985, 917912, - 65860, 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, 92505, 10879, - 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, 41958, 119176, - 917908, 0, 0, 42657, 92468, 7643, 42373, 11714, 67587, 43568, 0, 11717, - 7650, 10594, 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0, - 0, 2337, 1735, 74324, 67860, 2363, 0, 0, 43561, 0, 0, 74146, 1860, 7495, - 7580, 5812, 7497, 7584, 119140, 127853, 0, 120347, 7727, 0, 8498, 69818, - 8949, 3065, 42719, 7135, 1569, 92375, 12534, 12124, 7690, 0, 12533, 0, - 6418, 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 128650, 0, 63894, 120760, + 92568, 983498, 917845, 12192, 119314, 0, 119312, 9827, 119310, 119311, + 119308, 119309, 119306, 11481, 41210, 119305, 0, 35, 78481, 78482, 66694, + 68479, 78477, 78478, 43596, 6090, 64257, 7812, 10534, 0, 78485, 73848, + 78483, 4272, 0, 40967, 40964, 917825, 12704, 78487, 43306, 0, 64497, + 12138, 7930, 0, 43303, 68216, 0, 917826, 5244, 4189, 127098, 67596, + 127504, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, 917827, 65555, + 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682, 12578, 12720, 0, + 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0, 118850, 119141, 128546, + 66015, 0, 959, 8885, 12564, 66457, 78808, 9469, 9632, 92323, 74761, + 64323, 0, 0, 0, 0, 310, 0, 41281, 10976, 0, 92190, 0, 74266, 10054, 6497, + 8574, 0, 9012, 19958, 74420, 65089, 13215, 12730, 65163, 74044, 374, + 43195, 816, 0, 0, 0, 41934, 7465, 0, 128168, 0, 4715, 6101, 0, 41936, 0, + 4879, 0, 65446, 0, 307, 127147, 9585, 5374, 0, 128059, 0, 0, 0, 983303, + 0, 65567, 120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 120610, 12982, + 194623, 5378, 78791, 128679, 41421, 0, 4462, 0, 0, 128092, 821, 0, 2498, + 5800, 120157, 983618, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, + 1185, 0, 78770, 43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, + 10942, 7713, 2348, 0, 64374, 4380, 194608, 119044, 9982, 64324, 41240, + 862, 65626, 78462, 1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, + 64688, 194593, 194592, 78092, 74357, 194597, 4748, 92228, 194598, 194601, + 42260, 5871, 119075, 0, 74576, 44019, 0, 128189, 3967, 194604, 13137, + 8775, 127945, 0, 2963, 0, 8410, 4454, 723, 127882, 966, 4449, 92330, + 92238, 0, 7819, 2320, 194589, 339, 4968, 194590, 120399, 8075, 55276, 0, + 8047, 0, 78827, 12634, 41542, 78780, 7466, 6705, 12174, 42610, 0, 74452, + 0, 1584, 66645, 6045, 6729, 120640, 65218, 78777, 0, 78062, 7537, 0, + 11370, 0, 10330, 0, 10394, 0, 74194, 0, 127929, 9780, 0, 13092, 194576, + 119605, 194578, 7074, 92648, 194579, 194582, 11414, 128868, 2531, 13034, + 0, 0, 4211, 1259, 7517, 0, 0, 194561, 40996, 13037, 7092, 641, 5219, + 194567, 194566, 11064, 41129, 0, 42850, 13035, 9075, 92387, 5466, 128153, + 0, 64098, 65793, 4535, 194573, 4271, 78417, 128357, 6769, 41410, 0, + 64262, 6767, 41407, 0, 0, 6755, 118864, 9046, 127934, 0, 0, 0, 0, 0, + 67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, 12338, 4651, 0, + 11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, 0, 92661, 69821, + 41905, 0, 0, 10775, 9793, 5009, 0, 42269, 64587, 0, 42535, 69812, 64529, + 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 983511, 10236, + 65918, 43782, 0, 0, 64506, 69652, 118921, 4747, 128058, 0, 43200, 5832, + 0, 0, 5141, 42600, 0, 43203, 0, 983534, 43286, 0, 128211, 43778, 0, + 41305, 78776, 43781, 11303, 65547, 0, 7031, 859, 0, 0, 0, 6059, 126985, + 55235, 0, 8535, 0, 65196, 194787, 66032, 11488, 0, 120786, 42233, 64140, + 9946, 63885, 0, 11822, 0, 43189, 983633, 0, 1788, 1579, 120482, 917817, + 0, 0, 0, 9028, 119571, 69234, 0, 0, 1285, 64882, 41242, 0, 0, 12640, 0, + 7401, 0, 12625, 68198, 0, 92254, 3940, 41597, 55260, 3396, 12642, 8665, + 0, 0, 12630, 1653, 917815, 10153, 0, 6166, 120516, 120523, 0, 8815, + 66673, 65046, 9285, 913, 42259, 119317, 119318, 2142, 68454, 42485, + 118837, 7878, 8211, 42293, 64377, 0, 92643, 0, 194673, 12032, 0, 9725, 0, + 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, 42777, 10139, 980, + 43698, 65386, 0, 0, 43701, 43198, 7184, 120673, 194797, 917819, 10085, + 119992, 0, 119993, 6634, 92373, 0, 119323, 8072, 119321, 43700, 0, 8872, + 7783, 917992, 12398, 8237, 0, 0, 12395, 0, 126977, 120565, 9914, 127011, + 917854, 73975, 6367, 6351, 66688, 0, 78107, 0, 64735, 41243, 92199, 7808, + 1829, 0, 41937, 4358, 43272, 6353, 0, 0, 120422, 0, 1710, 0, 0, 65607, 0, + 49, 6627, 0, 6258, 10683, 78672, 9741, 78329, 5649, 78441, 43443, 64418, + 1643, 65213, 8405, 3470, 128225, 13213, 42452, 78331, 0, 78445, 0, 1072, + 78457, 78452, 78454, 6576, 41988, 41132, 65675, 1080, 120002, 9886, + 55225, 1101, 68404, 12309, 55227, 0, 12632, 1086, 1869, 78685, 7680, 0, + 65458, 120714, 12639, 3380, 8123, 1091, 12638, 7977, 4501, 41099, 0, + 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, 10494, 92655, 65872, 12363, 11386, + 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, 0, 120462, 74106, 12413, 194829, + 917994, 0, 917995, 5570, 1881, 7210, 0, 1012, 66630, 0, 120709, 7208, + 66442, 5569, 0, 42339, 0, 6063, 0, 0, 119594, 6053, 65602, 0, 92201, + 64727, 9160, 194827, 0, 0, 92180, 10503, 118810, 6055, 3870, 4279, 8490, + 120114, 4319, 64786, 8602, 120110, 11326, 92204, 0, 0, 120119, 78333, + 120117, 120118, 120099, 120100, 65087, 5571, 3674, 9740, 9121, 5568, + 120107, 120108, 42085, 10107, 42159, 42870, 120101, 589, 7050, 0, 43281, + 10233, 41263, 66251, 65729, 66253, 0, 74099, 42645, 0, 194815, 8583, 0, + 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204, 917962, 19966, 77856, 42561, + 120626, 0, 0, 8120, 120701, 0, 0, 128012, 41063, 0, 10664, 0, 8369, 0, + 4551, 194964, 3369, 0, 0, 9673, 66334, 65580, 10478, 118960, 12517, 557, + 9457, 12034, 983406, 6355, 12519, 41004, 0, 195025, 74094, 0, 0, 77970, + 0, 0, 128175, 12111, 3927, 0, 12515, 1474, 67893, 5492, 6923, 128099, + 10441, 73836, 0, 43990, 5493, 0, 74319, 0, 66635, 12019, 0, 1618, 0, + 120474, 9645, 10430, 917959, 5853, 13063, 10363, 0, 12956, 128169, + 120729, 11314, 917582, 12060, 0, 78392, 12826, 6329, 0, 10514, 65517, + 74395, 2707, 8309, 0, 127054, 78398, 43570, 2697, 43420, 78396, 127057, + 2695, 42171, 0, 0, 0, 67617, 118971, 0, 2693, 12125, 12766, 0, 1164, 0, + 0, 41918, 0, 127542, 8687, 66009, 12178, 7053, 128001, 7469, 0, 5248, + 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, 41126, 9991, 41128, + 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, 42843, 6591, 9340, + 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, 8922, 128068, 74600, + 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, 13262, 65590, 5299, + 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, 5295, 917569, 74114, + 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, 41413, 3212, 41459, + 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, 8070, 6150, 6636, + 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0, 67648, 120499, + 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0, 77949, 0, 68135, + 917576, 77946, 0, 69679, 69684, 9890, 78561, 12971, 78453, 92556, 73898, + 11979, 0, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469, 74227, 0, + 65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0, 42916, 0, 0, 0, + 7282, 78728, 65733, 4445, 127138, 128082, 3494, 74606, 6555, 0, 77976, 0, + 0, 78566, 0, 0, 65898, 0, 65312, 5447, 0, 12895, 65593, 4010, 0, 41106, + 0, 64448, 0, 41105, 0, 65820, 6232, 0, 128280, 0, 43608, 119091, 0, 6538, + 4335, 78364, 3941, 41122, 11061, 78363, 64892, 9113, 1954, 12155, 983409, + 42878, 11500, 0, 0, 74578, 0, 65832, 0, 0, 0, 77975, 119230, 4586, 0, + 350, 10951, 0, 509, 0, 0, 92307, 0, 0, 5133, 0, 0, 9500, 0, 4957, 64741, + 2422, 9354, 0, 0, 0, 2496, 11516, 944, 118851, 3890, 12168, 1438, 0, 0, + 0, 41947, 1220, 120828, 128555, 0, 0, 1571, 42630, 41949, 42805, 8270, + 943, 564, 0, 312, 41980, 983676, 0, 78120, 8877, 269, 4429, 6272, 9617, + 1460, 6954, 78657, 41120, 65121, 10862, 6060, 41119, 41416, 74355, 4173, + 0, 0, 0, 1906, 917986, 11532, 74073, 0, 0, 1985, 6296, 9582, 917895, + 64287, 0, 78115, 11428, 1730, 2457, 0, 19918, 10469, 0, 0, 7703, 8840, + 8035, 0, 0, 92491, 0, 6129, 0, 0, 128268, 0, 7874, 8681, 119092, 0, + 13136, 0, 0, 74278, 63886, 118881, 9605, 73892, 13220, 128776, 120274, + 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, 3096, 0, 0, 0, 66676, 65873, + 0, 0, 0, 9501, 0, 1272, 64536, 65465, 64654, 7467, 0, 1467, 10158, 10040, + 0, 9519, 0, 917812, 0, 118899, 12193, 0, 0, 0, 0, 0, 19935, 0, 92162, + 69676, 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, 11471, 43554, 65862, + 11474, 66332, 66603, 128138, 2426, 12042, 92194, 983646, 9537, 3961, + 12115, 77953, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, 42686, + 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, 68215, 0, 8541, + 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 10060, 41940, 8299, + 41945, 7132, 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0, 41699, + 10762, 43780, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012, 10395, + 983335, 43633, 65447, 0, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, + 9227, 7506, 7510, 92281, 691, 738, 7511, 7512, 7515, 3868, 688, 41847, + 690, 2548, 737, 974, 8003, 7406, 917911, 0, 0, 3985, 917912, 65860, + 63921, 7051, 69777, 4682, 917805, 12809, 6406, 4685, 92505, 10879, 10347, + 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, 0, 41958, 119176, 917908, 0, + 0, 42657, 92468, 7643, 42373, 11714, 67587, 43568, 0, 11717, 7650, 10594, + 64951, 7647, 7649, 128155, 7646, 0, 78082, 9651, 0, 3891, 0, 0, 2337, + 1735, 74324, 67860, 2363, 0, 0, 43561, 0, 0, 74146, 1860, 7495, 7580, + 5812, 7497, 7584, 119140, 127853, 0, 120347, 7727, 0, 8498, 69818, 8949, + 3065, 42719, 7135, 1569, 92375, 12534, 12124, 7690, 0, 12533, 0, 6418, + 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 128650, 983536, 63894, 120760, 12282, 66192, 0, 74592, 8850, 74275, 9238, 10617, 917545, 0, 92625, 0, 12791, 0, 0, 0, 4447, 73732, 12793, 12900, 92377, 10950, 0, 78087, 12790, 41400, 119128, 66607, 12792, 42232, 194938, 1744, 12789, 10366, 12317, - 41310, 0, 41399, 0, 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, 2974, - 9010, 11315, 0, 278, 0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, - 0, 6002, 0, 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, - 0, 77829, 0, 0, 6413, 6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, - 10044, 0, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, - 10297, 0, 3742, 0, 3959, 0, 0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, - 63845, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, 78168, 92361, - 11540, 43546, 6692, 0, 41060, 0, 0, 9083, 0, 0, 78144, 1559, 63831, 9677, - 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, 120423, 41716, - 128236, 0, 120472, 5516, 2845, 7717, 8036, 41717, 73827, 544, 12045, - 6278, 0, 5515, 0, 0, 0, 65339, 43221, 65194, 0, 5517, 0, 0, 74841, 67884, - 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, 127188, 1902, - 67887, 9638, 12976, 0, 12483, 12368, 41769, 42726, 41765, 128819, 6667, - 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, 1311, 917966, - 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, 949, 78162, 0, - 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, 41796, 1269, - 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, 128675, 41834, - 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, 0, 0, 6428, - 42270, 0, 0, 43059, 42666, 5256, 1067, 255, 12131, 0, 9493, 0, 41014, - 11793, 0, 0, 74394, 43460, 10653, 42723, 0, 119632, 0, 6560, 7016, 74274, - 0, 43556, 3929, 73900, 6614, 2768, 92504, 9746, 5135, 11811, 12796, - 11953, 0, 69761, 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, - 127753, 74315, 74361, 8253, 8817, 1136, 0, 43563, 92232, 0, 194750, 7392, - 8230, 9365, 0, 0, 0, 0, 0, 4041, 0, 2357, 43240, 12786, 229, 119885, - 119884, 44004, 7142, 119881, 12350, 65554, 119882, 119877, 119876, 12785, - 63863, 43795, 7770, 10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, - 10470, 0, 11059, 10791, 917944, 450, 0, 0, 10432, 12097, 5450, 64691, - 1233, 0, 44009, 78284, 66338, 0, 0, 1839, 118799, 0, 10927, 1701, 0, - 2388, 41749, 41761, 5453, 8361, 119865, 41758, 5444, 41763, 64889, 7143, - 92493, 78677, 0, 92429, 78174, 66432, 8801, 3053, 4340, 0, 0, 65812, - 917831, 0, 41824, 0, 120203, 194800, 194803, 42700, 194805, 127980, - 194807, 78676, 92356, 194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826, - 119325, 194811, 42439, 64638, 42327, 43528, 4489, 194791, 0, 194793, - 1912, 42385, 10306, 10370, 0, 0, 8867, 10250, 10258, 2712, 1635, 78821, - 1410, 92671, 0, 118878, 0, 0, 9919, 0, 559, 128157, 41825, 127975, 78188, - 4892, 74016, 194781, 6542, 41957, 128865, 5777, 0, 759, 65749, 2079, - 65248, 12788, 64487, 64552, 0, 10223, 42062, 0, 0, 0, 3668, 65754, 43560, - 12226, 0, 65149, 2340, 41959, 194786, 194785, 194788, 43618, 65747, - 10937, 2962, 0, 2321, 3587, 65745, 92436, 8921, 9952, 0, 0, 42714, 9951, - 43409, 194770, 2949, 66012, 194775, 194774, 2958, 68359, 41820, 43038, - 2395, 0, 9976, 120043, 120050, 120058, 68220, 128143, 42809, 42807, 0, - 120046, 10198, 4150, 64371, 8318, 41790, 0, 41898, 2360, 41794, 917942, - 0, 127818, 0, 0, 2418, 0, 2411, 11336, 799, 63823, 10276, 10308, 10372, - 917541, 41772, 42813, 2317, 10260, 118980, 55284, 92203, 0, 10384, 0, 0, - 0, 7753, 2351, 6655, 64489, 0, 0, 77872, 4443, 42779, 230, 0, 0, 43549, - 4855, 42150, 65739, 5441, 41896, 10288, 10320, 0, 855, 7046, 6109, 65045, - 63839, 78198, 2049, 10098, 0, 74145, 127943, 10264, 10280, 9184, 10376, - 7013, 4467, 0, 0, 0, 41887, 0, 4862, 9735, 6537, 120591, 74286, 3914, - 92178, 0, 9065, 12961, 0, 0, 92253, 0, 289, 0, 4694, 11420, 4690, 0, - 120514, 917978, 4693, 0, 42724, 0, 4688, 120454, 0, 0, 119629, 8238, - 3110, 120162, 0, 120163, 6528, 127553, 43035, 120161, 218, 0, 1520, 0, - 4786, 0, 43225, 4602, 0, 78167, 10088, 6548, 0, 120156, 43978, 8988, - 8888, 0, 0, 0, 0, 10666, 0, 73902, 69740, 0, 0, 9975, 0, 119902, 4689, - 8932, 0, 65560, 119209, 74441, 78810, 0, 0, 0, 0, 0, 0, 0, 0, 10065, - 8207, 0, 92613, 128011, 0, 662, 0, 9244, 194863, 0, 119261, 0, 0, 0, 0, - 41929, 0, 0, 66674, 41926, 120408, 120443, 10513, 64637, 194862, 0, 52, - 13118, 6475, 0, 120341, 12095, 10225, 4812, 92578, 0, 0, 74085, 0, 3978, - 0, 917945, 127823, 11582, 120761, 12281, 0, 6544, 13241, 0, 69782, - 128557, 194860, 11765, 65258, 10369, 0, 1585, 7192, 10249, 422, 1500, - 2036, 986, 194859, 64394, 5781, 5599, 64294, 2494, 120450, 4861, 74021, - 64334, 78203, 127808, 0, 92266, 65102, 8961, 65842, 10243, 10245, 917933, - 120410, 0, 120453, 64821, 9478, 2508, 92683, 0, 202, 128246, 74131, 1242, - 65514, 0, 63940, 128706, 64533, 120129, 0, 67842, 11990, 92430, 63939, - 43375, 65440, 2504, 0, 78671, 64829, 0, 6943, 917934, 5859, 0, 2858, 0, - 74294, 0, 69239, 0, 119027, 12992, 2753, 1936, 74491, 92574, 2751, 12662, - 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, 74128, - 2856, 119910, 47, 119911, 126986, 65858, 0, 0, 0, 7899, 0, 8417, 43798, - 7072, 0, 0, 4033, 128164, 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, 0, - 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155, - 8505, 68379, 12062, 0, 0, 65487, 92189, 41837, 120611, 120432, 0, 0, 0, - 120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426, 0, 194948, 0, 0, - 65664, 6693, 9843, 0, 8674, 119887, 128812, 92715, 0, 12624, 0, 1673, - 4811, 92383, 5986, 9338, 3046, 74480, 5985, 917928, 119598, 9820, 0, - 12187, 0, 0, 5984, 0, 43308, 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0, - 3491, 0, 0, 128219, 3514, 65485, 0, 7492, 0, 74605, 92483, 7514, 0, 0, - 194731, 7502, 7587, 68353, 0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588, - 74433, 41635, 43241, 9688, 7147, 9535, 0, 0, 0, 64530, 0, 64610, 11804, - 0, 7149, 7453, 0, 8013, 0, 92301, 0, 8895, 5253, 0, 5458, 0, 2866, 0, - 127860, 65111, 68433, 6700, 120484, 0, 0, 0, 8962, 77960, 9641, 43694, - 7059, 0, 0, 9604, 78700, 7441, 63826, 78706, 118941, 64392, 194735, 0, - 2844, 0, 41974, 0, 12139, 0, 0, 0, 3358, 65295, 0, 3104, 194734, 0, - 194765, 0, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 0, 0, 3268, 66591, 0, - 6552, 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528, - 65903, 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163, - 65270, 0, 0, 0, 9112, 74431, 863, 9490, 119898, 917837, 43323, 120513, - 119897, 9071, 127333, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, - 119899, 66587, 195098, 0, 92401, 0, 11006, 12927, 7807, 8073, 0, 10629, - 0, 74088, 3056, 10823, 128797, 127327, 8762, 10508, 69689, 73770, 43969, - 43193, 10737, 3463, 0, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0, - 5195, 195081, 0, 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, 6561, 19939, - 0, 0, 0, 119906, 0, 0, 0, 0, 0, 119907, 64612, 11991, 0, 0, 0, 1502, 0, - 0, 9107, 127316, 5702, 3655, 67661, 8430, 0, 74132, 120758, 0, 74057, - 9603, 0, 5254, 120742, 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, - 5614, 5893, 92280, 11720, 92496, 11721, 0, 4798, 0, 119316, 66038, 4793, - 67851, 11726, 127541, 74204, 68610, 0, 68626, 894, 300, 917813, 12306, - 66235, 8004, 0, 0, 2562, 0, 0, 42503, 0, 11652, 0, 0, 119241, 92649, 0, - 5096, 5095, 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0, - 10832, 5093, 0, 0, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, - 78599, 78601, 1215, 42712, 5744, 12272, 9832, 11777, 0, 127371, 42881, 0, - 8980, 118988, 67861, 8844, 7209, 0, 0, 4278, 0, 0, 194789, 0, 9074, 4348, - 0, 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 0, 586, - 74414, 64359, 1267, 0, 65468, 0, 65731, 0, 127179, 3621, 120473, 66666, - 64211, 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, 74406, - 127831, 0, 0, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, 0, 10291, - 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999, 92164, 12206, - 5839, 1702, 1240, 74065, 6286, 0, 0, 65833, 77848, 0, 1765, 0, 0, 65588, - 0, 0, 0, 8401, 0, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 0, + 41310, 983604, 41399, 0, 0, 55258, 0, 12690, 0, 0, 43672, 127840, 41652, + 2974, 9010, 11315, 0, 278, 0, 41405, 119254, 0, 10077, 63853, 74557, + 42586, 0, 0, 6002, 0, 43553, 0, 67903, 0, 12787, 41308, 7934, 65306, 0, + 0, 0, 8646, 983554, 77829, 0, 0, 6413, 6550, 0, 1940, 0, 43637, 220, + 65193, 43551, 10678, 10044, 0, 0, 0, 68659, 6403, 5707, 10393, 127532, 0, + 66614, 0, 0, 0, 10297, 0, 3742, 0, 3959, 0, 0, 0, 2467, 0, 6003, 63844, + 6663, 8040, 0, 63845, 4182, 78171, 4676, 120501, 0, 0, 2510, 0, 10208, + 78168, 92361, 11540, 43546, 6692, 0, 41060, 0, 0, 9083, 0, 0, 78144, + 1559, 63831, 9677, 120260, 0, 65256, 0, 74070, 0, 0, 365, 12056, 43027, + 120423, 41716, 128236, 0, 120472, 5516, 2845, 7717, 8036, 41717, 73827, + 544, 12045, 6278, 0, 5515, 0, 0, 0, 65339, 43221, 65194, 0, 5517, 0, 0, + 74841, 67884, 0, 67890, 67885, 67880, 67881, 67882, 67883, 0, 0, 67879, + 127188, 1902, 67887, 9638, 12976, 0, 12483, 12368, 41769, 42726, 41765, + 128819, 6667, 67874, 7556, 67878, 74351, 11264, 989, 42677, 67889, 0, + 1311, 917966, 4326, 11000, 63824, 13068, 10932, 128880, 6917, 78155, 0, + 949, 78162, 0, 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, + 41796, 1269, 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, + 128675, 41834, 5279, 0, 10336, 8312, 0, 42701, 128825, 0, 78165, 66036, + 0, 0, 6428, 42270, 0, 983340, 43059, 42666, 5256, 1067, 255, 12131, 0, + 9493, 0, 41014, 11793, 0, 0, 74394, 43460, 10653, 42723, 983589, 119632, + 0, 6560, 7016, 74274, 983359, 43556, 3929, 73900, 6614, 2768, 92504, + 9746, 5135, 11811, 12796, 11953, 0, 69761, 5139, 346, 74303, 6305, 12795, + 4675, 5168, 78552, 127753, 74315, 74361, 8253, 8817, 1136, 0, 43563, + 92232, 0, 194750, 7392, 8230, 9365, 0, 0, 983351, 0, 0, 4041, 0, 2357, + 43240, 12786, 229, 119885, 119884, 44004, 7142, 119881, 12350, 65554, + 119882, 119877, 119876, 12785, 63863, 43795, 7770, 10712, 64853, 12686, + 118916, 42375, 0, 127238, 66352, 10470, 0, 11059, 10791, 917944, 450, 0, + 0, 10432, 12097, 5450, 64691, 1233, 0, 44009, 78284, 66338, 0, 0, 1839, + 118799, 0, 10927, 1701, 983399, 2388, 41749, 41761, 5453, 8361, 119865, + 41758, 5444, 41763, 64889, 7143, 92493, 78677, 0, 92429, 78174, 66432, + 8801, 3053, 4340, 0, 0, 65812, 917831, 0, 41824, 0, 120203, 194800, + 194803, 42700, 194805, 127980, 194807, 78676, 92356, 194808, 0, 0, 4493, + 4336, 0, 2314, 43602, 78826, 119325, 194811, 42439, 64638, 42327, 43528, + 4489, 194791, 0, 194793, 1912, 42385, 10306, 10370, 0, 0, 8867, 10250, + 10258, 2712, 1635, 78821, 1410, 92671, 0, 118878, 0, 0, 9919, 0, 559, + 128157, 41825, 127975, 78188, 4892, 74016, 194781, 6542, 41957, 128865, + 5777, 0, 759, 65749, 2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, + 0, 0, 0, 3668, 65754, 43560, 12226, 0, 65149, 2340, 41959, 194786, + 194785, 194788, 43618, 65747, 10937, 2962, 0, 2321, 3587, 65745, 92436, + 8921, 9952, 0, 0, 42714, 9951, 43409, 194770, 2949, 66012, 194775, + 194774, 2958, 68359, 41820, 43038, 2395, 0, 9976, 120043, 120050, 120058, + 68220, 128143, 42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, + 0, 41898, 2360, 41794, 917942, 0, 127818, 0, 0, 2418, 0, 2411, 11336, + 799, 63823, 10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, + 118980, 55284, 92203, 0, 10384, 0, 0, 0, 7753, 2351, 6655, 64489, 0, 0, + 77872, 4443, 42779, 230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896, + 10288, 10320, 0, 855, 7046, 6109, 65045, 63839, 78198, 2049, 10098, 0, + 74145, 127943, 10264, 10280, 9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0, + 4862, 9735, 6537, 120591, 74286, 3914, 92178, 0, 9065, 12961, 0, 0, + 92253, 0, 289, 0, 4694, 11420, 4690, 0, 120514, 917978, 4693, 0, 42724, + 0, 4688, 120454, 0, 0, 119629, 8238, 3110, 120162, 983643, 120163, 6528, + 127553, 43035, 120161, 218, 0, 1520, 0, 4786, 0, 43225, 4602, 0, 78167, + 10088, 6548, 0, 120156, 43978, 8988, 8888, 0, 0, 0, 0, 10666, 0, 73902, + 69740, 0, 0, 9975, 0, 119902, 4689, 8932, 0, 65560, 119209, 74441, 78810, + 0, 0, 0, 0, 0, 0, 0, 0, 10065, 8207, 0, 92613, 128011, 0, 662, 0, 9244, + 194863, 0, 119261, 0, 0, 0, 0, 41929, 0, 0, 66674, 41926, 120408, 120443, + 10513, 64637, 194862, 0, 52, 13118, 6475, 0, 120341, 12095, 10225, 4812, + 92578, 0, 0, 74085, 0, 3978, 0, 917945, 127823, 11582, 120761, 12281, 0, + 6544, 13241, 0, 69782, 128557, 194860, 11765, 65258, 10369, 0, 1585, + 7192, 10249, 422, 1500, 2036, 986, 194859, 64394, 5781, 5599, 64294, + 2494, 120450, 4861, 74021, 64334, 78203, 127808, 0, 92266, 65102, 8961, + 65842, 10243, 10245, 917933, 120410, 0, 120453, 64821, 9478, 2508, 92683, + 0, 202, 128246, 74131, 1242, 65514, 0, 63940, 128706, 64533, 120129, 0, + 67842, 11990, 92430, 63939, 43375, 65440, 2504, 0, 78671, 64829, 983645, + 6943, 917934, 5859, 0, 2858, 983647, 74294, 983649, 69239, 0, 119027, + 12992, 2753, 1936, 74491, 92574, 2751, 12662, 2763, 8953, 64701, 10731, + 12922, 7052, 917839, 0, 0, 0, 63920, 74128, 2856, 119910, 47, 119911, + 126986, 65858, 0, 0, 0, 7899, 0, 8417, 43798, 7072, 0, 0, 4033, 128164, + 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, 0, 0, 8915, 2759, 945, 6689, + 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155, 8505, 68379, 12062, 0, 0, + 65487, 92189, 41837, 120611, 120432, 0, 0, 0, 120433, 0, 63935, 73962, + 120806, 64787, 43524, 0, 64426, 0, 194948, 0, 0, 65664, 6693, 9843, 0, + 8674, 119887, 128812, 92715, 0, 12624, 0, 1673, 4811, 92383, 5986, 9338, + 3046, 74480, 5985, 917928, 119598, 9820, 0, 12187, 0, 0, 5984, 0, 43308, + 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0, 3491, 0, 0, 128219, 3514, 65485, + 0, 7492, 0, 74605, 92483, 7514, 0, 0, 194731, 7502, 7587, 68353, 0, 0, + 63925, 0, 7610, 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, 7147, + 9535, 0, 0, 0, 64530, 0, 64610, 11804, 0, 7149, 7453, 0, 8013, 0, 92301, + 0, 8895, 5253, 0, 5458, 0, 2866, 0, 127860, 65111, 68433, 6700, 120484, + 0, 0, 0, 8962, 77960, 9641, 43694, 7059, 983412, 0, 9604, 78700, 7441, + 63826, 78706, 118941, 64392, 194735, 983422, 2844, 983673, 41974, 0, + 12139, 0, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983048, 5308, 0, + 290, 0, 0, 2862, 2792, 195088, 0, 0, 3268, 66591, 0, 6552, 42367, 7035, + 120558, 0, 0, 1814, 0, 10240, 92338, 74305, 0, 74528, 65903, 0, 42646, + 7606, 2591, 2837, 4341, 77956, 64482, 127337, 8163, 65270, 0, 0, 0, 9112, + 74431, 863, 9490, 119898, 917837, 43323, 120513, 119897, 9071, 127333, 0, + 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, 119899, 66587, 195098, 0, + 92401, 983629, 11006, 12927, 7807, 8073, 0, 10629, 0, 74088, 3056, 10823, + 128797, 127327, 8762, 10508, 69689, 73770, 43969, 43193, 10737, 3463, 0, + 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0, 5195, 195081, 0, + 66639, 0, 0, 0, 128041, 0, 92385, 1262, 0, 6561, 19939, 0, 0, 0, 119906, + 0, 0, 0, 0, 983402, 119907, 64612, 11991, 0, 0, 0, 1502, 0, 0, 9107, + 127316, 5702, 3655, 67661, 8430, 0, 74132, 120758, 0, 74057, 9603, 0, + 5254, 120742, 7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, 5614, + 5893, 92280, 11720, 92496, 11721, 0, 4798, 0, 119316, 66038, 4793, 67851, + 11726, 127541, 74204, 68610, 0, 68626, 894, 300, 917813, 12306, 66235, + 8004, 0, 0, 2562, 0, 0, 42503, 0, 11652, 0, 0, 119241, 92649, 0, 5096, + 5095, 2863, 3424, 92244, 10454, 42530, 5094, 119638, 0, 13156, 0, 10832, + 5093, 0, 0, 0, 5092, 10708, 11327, 0, 5091, 176, 0, 9153, 4104, 78599, + 78601, 1215, 42712, 5744, 12272, 9832, 11777, 0, 127371, 42881, 0, 8980, + 118988, 67861, 8844, 7209, 0, 0, 4278, 0, 0, 194789, 0, 9074, 4348, 0, + 65558, 65946, 8113, 7087, 5255, 1786, 661, 0, 0, 0, 74423, 0, 586, 74414, + 64359, 1267, 0, 65468, 0, 65731, 0, 127179, 3621, 120473, 66666, 64211, + 0, 6562, 12928, 0, 1228, 65490, 11383, 0, 0, 0, 1714, 74406, 127831, 0, + 0, 0, 66225, 0, 0, 42660, 11436, 2070, 64, 120694, 0, 10291, 10323, 2826, + 0, 0, 0, 42008, 9708, 42710, 0, 42011, 41999, 92164, 12206, 5839, 1702, + 1240, 74065, 6286, 0, 983701, 65833, 77848, 0, 1765, 0, 0, 65588, 0, 0, + 0, 8401, 0, 42014, 0, 7030, 194704, 10479, 64959, 2852, 0, 0, 0, 0, 128586, 917951, 6963, 0, 12667, 64540, 74786, 10147, 12935, 127568, 0, 0, 0, 0, 78757, 0, 0, 0, 0, 9994, 12467, 2864, 64719, 1148, 10435, 11462, 41675, 0, 2765, 0, 0, 0, 120719, 128188, 92516, 66662, 0, 78133, 9364, - 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 0, 77986, - 0, 6931, 69722, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, 42020, - 0, 6806, 6992, 42019, 0, 41290, 0, 750, 0, 0, 10163, 63913, 74066, 7032, - 5954, 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, 78891, - 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, 6938, - 92222, 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, 6712, - 66045, 41470, 64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 92667, 7796, - 69669, 43254, 73831, 0, 10293, 5952, 1281, 0, 0, 0, 10677, 604, 41097, - 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202, 0, 0, - 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374, 917956, - 0, 2822, 68122, 4436, 92519, 0, 73752, 0, 64872, 92340, 1331, 0, 0, 0, - 12708, 0, 5090, 5089, 0, 0, 119109, 0, 128681, 319, 118847, 43479, 9477, - 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0, 5085, 64286, 92665, 0, - 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 0, 0, 127165, 127241, - 6677, 7601, 0, 591, 64419, 118953, 92262, 0, 118923, 73734, 0, 10939, - 6106, 6933, 41271, 6760, 119903, 4534, 41270, 128876, 0, 65574, 0, 9224, - 0, 3671, 8976, 0, 0, 41275, 6372, 128084, 55261, 7963, 6371, 0, 568, 0, - 41273, 0, 0, 6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42, - 0, 43688, 0, 0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254, - 42721, 66336, 8045, 11550, 0, 0, 0, 42858, 11789, 65868, 5557, 10133, - 9737, 13109, 0, 9467, 5558, 8878, 128136, 195036, 7451, 6706, 10146, 0, - 9086, 64566, 0, 64584, 7437, 7454, 12594, 128690, 68362, 4546, 7731, 0, - 119909, 74243, 0, 3805, 0, 194565, 44001, 41008, 0, 6307, 19949, 0, 7544, - 0, 43469, 0, 0, 10152, 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, - 42302, 43711, 43523, 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, - 9630, 92633, 0, 0, 5506, 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, - 8889, 0, 2098, 0, 64751, 0, 66622, 0, 0, 74364, 0, 0, 0, 74365, 7552, 0, - 0, 65384, 7223, 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077, - 65175, 10184, 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 0, 0, 0, - 4357, 0, 119837, 0, 74233, 9967, 119852, 42860, 119838, 10941, 65721, - 6962, 0, 0, 119324, 0, 11014, 127972, 8942, 12000, 69224, 92267, 128536, - 11974, 92213, 42772, 127518, 11650, 5013, 92663, 128677, 66210, 118914, - 6613, 92476, 0, 43819, 0, 0, 64714, 0, 0, 12162, 12120, 43476, 0, 11024, - 74811, 66228, 10563, 0, 127196, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, - 120559, 4952, 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005, - 127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 127924, - 3483, 119593, 1989, 0, 69678, 9104, 3503, 65375, 92509, 6694, 42633, - 1864, 0, 74306, 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705, - 74124, 8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, - 127862, 1403, 128839, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, - 0, 0, 0, 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549, - 10861, 0, 63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221, - 0, 0, 8823, 128697, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039, - 0, 7446, 1684, 63979, 10974, 458, 120620, 0, 69791, 127161, 11916, 65016, - 0, 69671, 42115, 0, 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, - 13080, 0, 65808, 6610, 6030, 8059, 7508, 13131, 0, 0, 0, 8794, 41278, - 41629, 12154, 128192, 41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0, - 0, 65371, 7078, 0, 833, 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, - 19916, 6913, 933, 1341, 9842, 6720, 65744, 0, 0, 128295, 0, 7405, 10105, - 65810, 0, 41632, 7493, 55290, 0, 41622, 0, 0, 119556, 74584, 7632, 9716, - 19954, 9805, 5990, 900, 0, 63957, 0, 0, 3612, 0, 64376, 0, 5389, 92597, - 0, 65938, 2839, 9621, 582, 0, 74368, 3749, 6949, 7569, 74061, 0, 0, 6956, - 4403, 19962, 65559, 3299, 0, 917566, 119127, 9002, 0, 74372, 74236, 8478, - 7598, 546, 42469, 65569, 1918, 9542, 472, 7716, 10319, 10383, 6996, 0, - 63952, 8425, 3602, 8328, 11764, 118894, 0, 69796, 41183, 12907, 10271, - 10287, 684, 43525, 0, 2854, 119586, 4592, 65755, 0, 92256, 11963, 43620, - 0, 78889, 0, 0, 128809, 9881, 43115, 65757, 3415, 0, 0, 8648, 0, 6741, - 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, 10391, 41752, - 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, 41751, - 69776, 8941, 0, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, 11437, 43741, - 92163, 120700, 63967, 0, 41206, 120724, 9049, 41185, 43166, 0, 11680, - 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0, 92183, 64523, 10343, - 10407, 0, 66671, 11466, 0, 128003, 42890, 0, 12050, 68201, 2860, 0, 0, 0, - 42792, 5743, 10424, 12065, 42872, 0, 92342, 0, 8875, 0, 0, 917991, 7531, - 12847, 2413, 0, 78635, 962, 0, 12855, 41196, 42564, 0, 1582, 0, 5508, 0, - 0, 0, 10801, 0, 92354, 0, 7173, 496, 10439, 4313, 64607, 69638, 7860, 0, - 906, 42793, 2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, - 92173, 64788, 0, 8054, 9174, 128652, 917976, 9964, 0, 41611, 4642, 66574, - 11556, 917982, 0, 78857, 42089, 78855, 9008, 0, 0, 195096, 42079, 917981, - 77924, 42513, 0, 42842, 73985, 65285, 118974, 127003, 0, 0, 0, 0, 11335, - 64069, 42093, 3920, 0, 0, 0, 0, 4580, 41967, 0, 64384, 92167, 119158, - 3021, 42004, 0, 0, 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0, - 68113, 42690, 9880, 42010, 74824, 64589, 10111, 64875, 127880, 68399, - 43998, 11360, 0, 0, 0, 118826, 42149, 0, 0, 0, 64941, 77919, 120421, - 128077, 0, 55247, 4110, 66005, 6959, 10929, 119110, 0, 66703, 77921, - 8617, 41982, 6025, 69242, 0, 0, 0, 0, 9597, 42099, 43172, 0, 10117, 0, - 92297, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0, - 127517, 0, 8964, 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160, - 10081, 13226, 42121, 42475, 42663, 128210, 41766, 0, 65882, 78849, 41760, - 1189, 905, 480, 10985, 41733, 67859, 9629, 6742, 1745, 43625, 73835, - 7888, 0, 3980, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867, - 69218, 6236, 0, 0, 10505, 0, 12851, 118948, 348, 5474, 128843, 3103, 0, - 41753, 128540, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756, - 43347, 42560, 5391, 41746, 119147, 92591, 41259, 5561, 74360, 2691, 0, - 65553, 7933, 5562, 69800, 128265, 41262, 128146, 64421, 74846, 41251, 0, - 0, 3979, 0, 0, 74813, 0, 0, 0, 0, 92524, 41266, 0, 0, 128836, 10585, - 65741, 41737, 9574, 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0, - 6434, 0, 6939, 7766, 6432, 128106, 0, 916, 769, 41742, 11968, 74805, - 6433, 5563, 547, 1943, 6439, 5560, 4994, 487, 0, 4497, 3754, 127056, - 120424, 9039, 0, 41776, 0, 8716, 1595, 41615, 0, 0, 74260, 0, 42854, - 43219, 128709, 0, 12185, 128879, 0, 68355, 68357, 0, 42856, 8634, 0, 0, - 4209, 120702, 0, 65879, 41538, 65612, 127543, 669, 5679, 0, 69786, 92540, - 0, 0, 5678, 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, 78050, 119022, - 0, 0, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, - 128079, 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 0, 0, 78119, 1549, 0, - 0, 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, 0, 69768, 1449, + 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 983477, + 77986, 0, 6931, 69722, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, + 42020, 0, 6806, 6992, 42019, 0, 41290, 983451, 750, 0, 0, 10163, 63913, + 74066, 7032, 5954, 64931, 4314, 0, 198, 68453, 730, 120094, 63907, 77993, + 78891, 13165, 7107, 74171, 42804, 678, 8240, 78015, 128784, 41378, 11008, + 6938, 92222, 92637, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 69642, + 6712, 66045, 41470, 64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 92667, + 7796, 69669, 43254, 73831, 0, 10293, 5952, 1281, 0, 0, 0, 10677, 604, + 41097, 9182, 1859, 0, 92603, 3425, 127488, 0, 2836, 0, 0, 9707, 0, 43202, + 0, 0, 65199, 1738, 917818, 128158, 2832, 92702, 9670, 12937, 0, 66374, + 917956, 0, 2822, 68122, 4436, 92519, 983458, 73752, 0, 64872, 92340, + 1331, 0, 0, 0, 12708, 0, 5090, 5089, 0, 0, 119109, 0, 128681, 319, + 118847, 43479, 9477, 0, 0, 5087, 92325, 7640, 96, 5086, 0, 92379, 0, + 5085, 64286, 92665, 0, 41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, + 0, 0, 127165, 127241, 6677, 7601, 0, 591, 64419, 118953, 92262, 0, + 118923, 73734, 0, 10939, 6106, 6933, 41271, 6760, 119903, 4534, 41270, + 128876, 0, 65574, 0, 9224, 0, 3671, 8976, 0, 0, 41275, 6372, 128084, + 55261, 7963, 6371, 0, 568, 0, 41273, 983465, 0, 6728, 0, 9715, 0, 8258, + 11753, 74820, 0, 9602, 118919, 42, 0, 43688, 0, 0, 7458, 0, 0, 65385, + 119900, 0, 11958, 0, 917822, 0, 6254, 42721, 66336, 8045, 11550, 0, 0, + 983341, 42858, 11789, 65868, 5557, 10133, 9737, 13109, 0, 9467, 5558, + 8878, 128136, 195036, 7451, 6706, 10146, 0, 9086, 64566, 0, 64584, 7437, + 7454, 12594, 128690, 68362, 4546, 7731, 0, 119909, 74243, 0, 3805, 0, + 194565, 44001, 41008, 0, 6307, 19949, 0, 7544, 0, 43469, 0, 0, 10152, + 64422, 65091, 119113, 7602, 64729, 0, 43521, 0, 42302, 43711, 43523, + 41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, 9630, 92633, 0, 0, 5506, + 0, 1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0, 2098, 0, 64751, + 0, 66622, 0, 0, 74364, 0, 0, 983540, 74365, 7552, 0, 0, 65384, 7223, + 4559, 0, 1956, 43138, 7024, 65728, 64501, 1210, 195077, 65175, 10184, + 43140, 43654, 0, 0, 0, 38, 8533, 66669, 119124, 0, 0, 0, 4357, 0, 119837, + 0, 74233, 9967, 119852, 42860, 119838, 10941, 65721, 6962, 0, 0, 119324, + 0, 11014, 127972, 8942, 12000, 69224, 92267, 128536, 11974, 92213, 42772, + 127518, 11650, 5013, 92663, 128677, 66210, 118914, 6613, 92476, 0, 43819, + 983505, 0, 64714, 0, 0, 12162, 12120, 43476, 983501, 11024, 74811, 66228, + 10563, 0, 127196, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, 120559, 4952, + 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005, 127119, 3109, + 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 127924, 3483, 119593, + 1989, 0, 69678, 9104, 3503, 65375, 92509, 6694, 42633, 1864, 0, 74306, + 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705, 74124, 8604, 6955, + 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, 127862, 1403, + 128839, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, 0, 0, 0, + 43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549, 10861, 0, + 63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221, 0, 0, 8823, + 128697, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039, 0, 7446, + 1684, 63979, 10974, 458, 120620, 0, 69791, 127161, 11916, 65016, 0, + 69671, 42115, 0, 12288, 78057, 0, 1493, 42111, 7553, 4097, 128199, 13080, + 0, 65808, 6610, 6030, 8059, 7508, 13131, 0, 0, 0, 8794, 41278, 41629, + 12154, 128192, 41277, 64658, 0, 64380, 6625, 74354, 19904, 0, 0, 0, + 65371, 7078, 0, 833, 0, 6369, 0, 10979, 41953, 0, 41434, 6062, 0, 0, + 19916, 6913, 933, 1341, 9842, 6720, 65744, 0, 983336, 128295, 0, 7405, + 10105, 65810, 0, 41632, 7493, 55290, 0, 41622, 0, 0, 119556, 74584, 7632, + 9716, 19954, 9805, 5990, 900, 0, 63957, 0, 0, 3612, 0, 64376, 0, 5389, + 92597, 0, 65938, 2839, 9621, 582, 0, 74368, 3749, 6949, 7569, 74061, 0, + 0, 6956, 4403, 19962, 65559, 3299, 0, 917566, 119127, 9002, 0, 74372, + 74236, 8478, 7598, 546, 42469, 65569, 1918, 9542, 472, 7716, 10319, + 10383, 6996, 0, 63952, 8425, 3602, 8328, 11764, 118894, 0, 69796, 41183, + 12907, 10271, 10287, 684, 43525, 0, 2854, 119586, 4592, 65755, 0, 92256, + 11963, 43620, 0, 78889, 0, 0, 128809, 9881, 43115, 65757, 3415, 0, 0, + 8648, 0, 6741, 43047, 0, 13180, 128517, 418, 917972, 64495, 10295, 10327, + 10391, 41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, + 42849, 41751, 69776, 8941, 983300, 4554, 0, 9023, 11685, 0, 9928, 78617, + 0, 11437, 43741, 92163, 120700, 63967, 0, 41206, 120724, 9049, 41185, + 43166, 0, 11680, 92619, 11686, 78544, 65224, 4565, 4655, 119553, 0, + 92183, 64523, 10343, 10407, 0, 66671, 11466, 0, 128003, 42890, 0, 12050, + 68201, 2860, 0, 0, 0, 42792, 5743, 10424, 12065, 42872, 0, 92342, 0, + 8875, 0, 0, 917991, 7531, 12847, 2413, 0, 78635, 962, 0, 12855, 41196, + 42564, 0, 1582, 983450, 5508, 0, 0, 0, 10801, 0, 92354, 0, 7173, 496, + 10439, 4313, 64607, 69638, 7860, 0, 906, 42793, 2842, 6405, 64722, 13132, + 798, 64694, 12801, 8406, 1153, 92173, 64788, 0, 8054, 9174, 128652, + 917976, 9964, 0, 41611, 4642, 66574, 11556, 917982, 0, 78857, 42089, + 78855, 9008, 0, 0, 195096, 42079, 917981, 77924, 42513, 0, 42842, 73985, + 65285, 118974, 127003, 983437, 0, 0, 0, 11335, 64069, 42093, 3920, 0, 0, + 0, 0, 4580, 41967, 983467, 64384, 92167, 119158, 3021, 42004, 0, 0, + 42317, 41998, 0, 6946, 0, 0, 0, 128193, 65204, 0, 68113, 42690, 9880, + 42010, 74824, 64589, 10111, 64875, 127880, 68399, 43998, 11360, 0, 0, 0, + 118826, 42149, 0, 0, 0, 64941, 77919, 120421, 128077, 0, 55247, 4110, + 66005, 6959, 10929, 119110, 0, 66703, 77921, 8617, 41982, 6025, 69242, 0, + 0, 0, 0, 9597, 42099, 43172, 0, 10117, 983527, 92297, 41636, 0, 0, + 120681, 8301, 0, 0, 187, 0, 65669, 128339, 4963, 0, 127517, 0, 8964, + 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160, 10081, 13226, 42121, + 42475, 42663, 128210, 41766, 0, 65882, 78849, 41760, 1189, 905, 480, + 10985, 41733, 67859, 9629, 6742, 1745, 43625, 73835, 7888, 0, 3980, 0, + 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867, 69218, 6236, 0, 0, + 10505, 0, 12851, 118948, 348, 5474, 128843, 3103, 0, 41753, 128540, 0, 0, + 78844, 78845, 41739, 78843, 42515, 10931, 41756, 43347, 42560, 5391, + 41746, 119147, 92591, 41259, 5561, 74360, 2691, 0, 65553, 7933, 5562, + 69800, 128265, 41262, 128146, 64421, 74846, 41251, 0, 0, 3979, 0, 0, + 74813, 0, 0, 0, 0, 92524, 41266, 0, 0, 128836, 10585, 65741, 41737, 9574, + 2666, 0, 41738, 831, 419, 13126, 10716, 0, 42822, 0, 6434, 0, 6939, 7766, + 6432, 128106, 0, 916, 769, 41742, 11968, 74805, 6433, 5563, 547, 1943, + 6439, 5560, 4994, 487, 0, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, + 8716, 1595, 41615, 0, 0, 74260, 0, 42854, 43219, 128709, 0, 12185, + 128879, 0, 68355, 68357, 0, 42856, 8634, 0, 983469, 4209, 120702, 0, + 65879, 41538, 65612, 127543, 669, 5679, 0, 69786, 92540, 0, 0, 5678, + 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, 78050, 119022, 0, 0, 0, + 7782, 9044, 4974, 11760, 78494, 7577, 65711, 41912, 1216, 0, 128079, + 5792, 0, 0, 78501, 0, 2933, 12244, 0, 5683, 0, 0, 78119, 1549, 0, 0, + 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, 0, 69768, 1449, 10241, 78290, 128228, 0, 10552, 64342, 41922, 128548, 8584, 0, 5567, - 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 0, 128026, 0, 65708, 65709, - 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468, + 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 983050, 128026, 0, 65708, + 65709, 5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468, 120561, 10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, 78703, 78690, 457, 78502, 65701, 1934, 43006, 0, 8802, 78710, 65130, 11747, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, 65694, 64485, 43534, 10457, 0, 11961, 78725, 78722, 78723, 78720, 78721, 0, 65515, 9499, 10035, 13069, 0, 0, 9889, 68184, 42806, 0, 7256, 0, 0, 1667, - 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, 0, - 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, 10875, - 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0, 3874, 0, - 0, 0, 0, 0, 0, 65603, 0, 65687, 0, 41038, 74009, 119570, 42239, 8536, - 78740, 0, 78726, 74432, 724, 0, 1455, 78749, 7183, 64583, 78747, 68443, - 4175, 78741, 43614, 69801, 939, 0, 43520, 68613, 74569, 917958, 0, 78763, - 78764, 78760, 10788, 6088, 78759, 78755, 190, 0, 12593, 0, 8188, 64408, - 0, 4417, 0, 92261, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 128205, 0, 0, - 74382, 73781, 7918, 73988, 0, 0, 917884, 1728, 0, 120710, 178, 12972, - 92679, 0, 917887, 92563, 0, 0, 78327, 120405, 65690, 0, 0, 119054, 0, - 9252, 917889, 4652, 68371, 0, 0, 0, 13065, 9923, 10806, 0, 11763, 0, - 120688, 6723, 78187, 0, 6993, 0, 0, 8333, 0, 0, 11390, 0, 74464, 0, - 92320, 74080, 0, 0, 11910, 92559, 8278, 8963, 4034, 128560, 0, 65344, - 120517, 41747, 0, 0, 8677, 0, 12707, 9350, 66037, 128180, 8836, 12315, - 12747, 8300, 0, 0, 7491, 8856, 128064, 0, 43150, 127768, 120404, 65389, - 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, 6536, 120238, - 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, 9588, 120248, - 1596, 120383, 41994, 65801, 128808, 0, 66572, 0, 0, 10613, 6697, 12805, - 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, 65940, - 43259, 0, 6107, 0, 119177, 0, 78401, 128641, 11783, 335, 120227, 64689, - 438, 4510, 5765, 8721, 120233, 119227, 6092, 12840, 43112, 8876, 120231, - 8096, 10284, 128515, 0, 0, 10380, 8733, 0, 128240, 41602, 0, 92308, - 74831, 917901, 0, 73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, - 0, 917898, 2065, 41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159, - 1953, 9579, 41938, 1256, 3910, 9407, 6242, 0, 0, 41257, 41900, 8675, - 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 0, 0, 0, 73882, 499, 0, - 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 0, 0, 11967, 1775, 0, 0, 0, - 0, 128009, 9458, 0, 6470, 9180, 120380, 43176, 0, 0, 42782, 0, 0, 0, + 42161, 0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, + 983041, 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, + 10875, 128662, 5477, 65692, 0, 128532, 120397, 12896, 10456, 917954, 0, + 3874, 0, 0, 983363, 0, 0, 0, 65603, 0, 65687, 0, 41038, 74009, 119570, + 42239, 8536, 78740, 0, 78726, 74432, 724, 0, 1455, 78749, 7183, 64583, + 78747, 68443, 4175, 78741, 43614, 69801, 939, 0, 43520, 68613, 74569, + 917958, 0, 78763, 78764, 78760, 10788, 6088, 78759, 78755, 190, 0, 12593, + 0, 8188, 64408, 0, 4417, 0, 92261, 6370, 0, 7827, 68441, 6965, 0, 0, + 13201, 128205, 0, 0, 74382, 73781, 7918, 73988, 0, 0, 917884, 1728, 0, + 120710, 178, 12972, 92679, 0, 917887, 92563, 0, 0, 78327, 120405, 65690, + 0, 0, 119054, 0, 9252, 917889, 4652, 68371, 0, 0, 0, 13065, 9923, 10806, + 0, 11763, 0, 120688, 6723, 78187, 0, 6993, 0, 0, 8333, 0, 0, 11390, 0, + 74464, 0, 92320, 74080, 0, 0, 11910, 92559, 8278, 8963, 4034, 128560, 0, + 65344, 120517, 41747, 0, 0, 8677, 0, 12707, 9350, 66037, 128180, 8836, + 12315, 12747, 8300, 0, 0, 7491, 8856, 128064, 0, 43150, 127768, 120404, + 65389, 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, 6536, + 120238, 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, 9588, + 120248, 1596, 120383, 41994, 65801, 128808, 0, 66572, 0, 0, 10613, 6697, + 12805, 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, + 65940, 43259, 0, 6107, 0, 119177, 0, 78401, 128641, 11783, 335, 120227, + 64689, 438, 4510, 5765, 8721, 120233, 119227, 6092, 12840, 43112, 8876, + 120231, 8096, 10284, 128515, 0, 0, 10380, 8733, 0, 128240, 41602, 0, + 92308, 74831, 917901, 0, 73747, 65399, 0, 64591, 42405, 0, 120820, 843, + 11541, 0, 917898, 2065, 41935, 74496, 41902, 0, 0, 215, 41258, 77875, + 43159, 1953, 9579, 41938, 1256, 3910, 9407, 6242, 0, 0, 41257, 41900, + 8675, 10700, 8805, 1742, 0, 9333, 8202, 127750, 0, 0, 0, 0, 73882, 499, + 0, 43467, 0, 43818, 0, 1712, 5932, 77845, 41762, 0, 0, 11967, 1775, 0, 0, + 0, 0, 128009, 9458, 0, 6470, 9180, 120380, 43176, 0, 0, 42782, 0, 0, 0, 128309, 74777, 120669, 9414, 120382, 73782, 73969, 565, 42484, 5794, 201, 2662, 42292, 0, 8254, 0, 10975, 0, 120625, 74763, 1022, 4108, 3880, 74247, 0, 0, 92263, 917980, 7507, 0, 43149, 0, 65031, 7961, 1636, 0, @@ -17058,12 +17284,12 @@ 10480, 0, 0, 77936, 8264, 12610, 0, 645, 0, 7609, 40973, 0, 73833, 78249, 5824, 984, 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369, 0, 128140, 68415, 0, 4538, 120406, 43141, 0, 0, 74214, 73886, 0, 0, - 118902, 43005, 78448, 9552, 0, 0, 0, 12997, 0, 0, 0, 0, 2381, 12883, + 118902, 43005, 78448, 9552, 0, 0, 983322, 12997, 0, 0, 0, 0, 2381, 12883, 10994, 10529, 41906, 0, 0, 0, 12425, 10661, 10856, 9614, 2428, 41478, 8582, 10064, 73930, 0, 0, 0, 64896, 119162, 1952, 92181, 8455, 10082, 11575, 0, 119566, 0, 12808, 12183, 6145, 118955, 64929, 92433, 0, 0, - 43186, 42509, 0, 3922, 9187, 0, 0, 10191, 119057, 11752, 3353, 9358, 0, - 917957, 66680, 120090, 8248, 7931, 8558, 9795, 68380, 0, 0, 120082, + 43186, 42509, 0, 3922, 9187, 983358, 0, 10191, 119057, 11752, 3353, 9358, + 0, 917957, 66680, 120090, 8248, 7931, 8558, 9795, 68380, 0, 0, 120082, 120081, 120084, 41027, 120086, 0, 120088, 120087, 7019, 120073, 0, 11751, 120078, 78294, 64657, 8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0, 43154, 41029, 0, 11332, 65380, 7728, 0, 11294, 0, 66665, @@ -17075,179 +17301,180 @@ 1009, 92171, 2402, 2333, 6440, 0, 0, 65125, 41244, 0, 13271, 9103, 41180, 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, 127070, 41261, 119362, 43640, 8613, 0, 118989, 6736, 195092, 41492, 12005, 127889, 0, 1890, 120056, 0, 0, 0, - 7293, 7991, 0, 10578, 0, 78076, 194738, 78077, 0, 0, 78800, 92653, 64445, - 42668, 6635, 0, 6164, 65170, 0, 0, 7676, 11664, 0, 0, 69707, 0, 118812, - 0, 0, 128045, 9175, 11925, 78045, 9088, 0, 64545, 1396, 0, 7546, 3847, 0, - 127835, 4985, 13288, 672, 8098, 43196, 194746, 0, 128126, 0, 74043, - 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, 10180, 0, - 128584, 12622, 0, 0, 0, 194714, 127139, 13310, 773, 19933, 1539, 0, - 126983, 42731, 92205, 0, 0, 0, 3051, 5862, 7823, 92478, 0, 120411, 3250, - 43991, 69687, 66649, 9510, 66237, 0, 0, 41066, 64673, 917963, 917964, 0, - 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, 917970, 5479, 882, - 6686, 119584, 11613, 120772, 42754, 0, 0, 92696, 0, 0, 0, 128523, 3225, - 917996, 4433, 41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757, - 64879, 917949, 917950, 127848, 13227, 0, 10021, 5160, 1387, 0, 917953, - 41418, 0, 65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158, - 119257, 4274, 0, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, 0, - 41252, 66682, 0, 119637, 41249, 1366, 64635, 65047, 12466, 0, 0, 4397, - 128037, 128336, 41296, 9545, 41291, 128049, 0, 41485, 3511, 41282, 5923, - 10400, 0, 128818, 760, 0, 12088, 5786, 0, 42256, 119869, 119860, 417, - 41474, 119562, 41565, 0, 5934, 119867, 66583, 119231, 64877, 0, 64481, - 78614, 66013, 41956, 43455, 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, - 0, 0, 65910, 127747, 10246, 120816, 0, 1237, 10274, 4552, 119576, 0, 0, - 1375, 66705, 43573, 65260, 42063, 0, 42811, 10312, 74192, 120794, 7840, - 0, 43630, 10252, 0, 128104, 43185, 0, 4396, 0, 119880, 10769, 9676, - 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, 6072, 43025, 10299, 0, 0, - 120608, 66326, 0, 0, 0, 43811, 9330, 0, 7222, 10283, 10315, 10379, 4996, - 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, 0, 0, 7565, 66363, 12952, - 64806, 43180, 77928, 68096, 77929, 43982, 74288, 622, 74023, 885, 43405, - 1602, 0, 0, 852, 0, 12160, 0, 10212, 65435, 0, 12071, 9609, 12156, - 917983, 917984, 43586, 11035, 10411, 917988, 10255, 6710, 10279, 4194, - 10375, 917993, 0, 4315, 12644, 127516, 77937, 43639, 43343, 0, 917998, - 11501, 41177, 128689, 0, 917792, 0, 92413, 8715, 0, 41179, 0, 43313, 0, - 41176, 0, 994, 0, 8452, 127103, 73966, 0, 0, 5921, 0, 2597, 0, 5922, - 118903, 77943, 4186, 92531, 127106, 127105, 6718, 0, 4406, 74601, 8480, - 9192, 9747, 128699, 4413, 92196, 42268, 3198, 5924, 5920, 92469, 6921, - 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, 10772, - 65276, 5937, 1914, 2553, 11682, 6756, 128590, 128646, 8363, 0, 2993, - 7772, 3916, 0, 120494, 1141, 42407, 8159, 718, 7572, 973, 0, 120718, - 3235, 2415, 43164, 0, 8018, 42333, 74756, 10675, 6937, 42486, 43381, - 65390, 10067, 0, 1202, 0, 0, 65863, 0, 0, 0, 78182, 64542, 3260, 73829, - 65388, 9945, 8419, 78042, 6738, 0, 43681, 69728, 2059, 0, 0, 55237, 1431, - 0, 66565, 10821, 0, 12804, 128076, 8229, 1235, 3307, 11472, 78089, 78184, - 4544, 0, 0, 0, 1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102, - 0, 10141, 0, 63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106, - 78103, 78104, 0, 119572, 10665, 64616, 41572, 0, 127160, 0, 41573, 0, - 3931, 120295, 74143, 0, 0, 0, 0, 11982, 0, 0, 0, 128016, 64484, 0, 41167, - 0, 41735, 0, 717, 10754, 0, 0, 127979, 0, 63767, 0, 1780, 6936, 0, 0, - 819, 10611, 9694, 126978, 0, 0, 0, 0, 8343, 8342, 8345, 8344, 6578, 7009, - 7523, 6922, 8348, 8347, 7525, 3346, 8339, 128165, 128338, 575, 268, - 78111, 8563, 5754, 120343, 41541, 65565, 8336, 5936, 7290, 78117, 8337, - 8341, 308, 11388, 7522, 120721, 78123, 65466, 11090, 6953, 0, 120346, 0, - 78132, 5926, 78128, 78130, 78126, 78127, 78124, 78125, 9038, 7887, 43456, - 7830, 11651, 13093, 64002, 0, 65742, 12874, 119597, 11590, 0, 74048, - 128350, 8595, 0, 917947, 43703, 13097, 0, 64643, 13283, 12697, 0, 12381, - 3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, 119153, 1955, 0, 5349, - 42538, 0, 0, 65308, 9462, 917554, 0, 0, 0, 42736, 0, 5756, 0, 7638, - 41642, 42764, 0, 43109, 7637, 5752, 120600, 0, 73832, 128827, 120635, - 128231, 78334, 0, 7636, 65171, 9124, 0, 78892, 0, 291, 0, 0, 2027, 66230, - 10080, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431, - 120430, 0, 128351, 127489, 127148, 0, 92499, 0, 119094, 74213, 7824, 0, - 0, 41274, 5778, 6302, 0, 0, 12680, 119130, 1417, 77889, 194914, 9452, 0, - 74393, 11552, 0, 127855, 0, 65391, 0, 10172, 65453, 63789, 41264, 78658, - 6426, 4641, 9179, 64819, 55278, 41255, 42036, 41469, 41269, 120412, - 41267, 4646, 120425, 865, 42034, 78274, 78273, 4645, 42033, 78270, - 127982, 0, 64728, 0, 78673, 78674, 1659, 919, 42784, 1671, 195089, 6069, - 9219, 195090, 1661, 13120, 63784, 69819, 10140, 9713, 119143, 0, 0, 0, - 2306, 10485, 118943, 6068, 10612, 195099, 119567, 195101, 92561, 41462, - 120470, 195079, 5422, 128234, 0, 0, 0, 10229, 10635, 826, 128081, 195082, - 195085, 195084, 195087, 6483, 0, 1808, 7848, 0, 8100, 78227, 78669, - 78670, 13301, 78667, 9667, 78665, 78872, 0, 11003, 9904, 0, 0, 120690, - 9144, 10921, 0, 78680, 9840, 65131, 78678, 77841, 10313, 0, 0, 64320, - 10265, 78686, 10962, 78684, 43008, 8945, 78683, 0, 41, 195072, 1792, - 120515, 195073, 8655, 195075, 92544, 77951, 12066, 0, 385, 4152, 2585, - 127804, 119068, 3126, 0, 74136, 10957, 0, 43258, 0, 127873, 13157, 0, 0, - 3570, 0, 7443, 0, 44006, 6997, 0, 0, 7879, 8739, 11075, 0, 65216, 0, - 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, 119912, 9691, 4411, - 78802, 0, 0, 43442, 78799, 65254, 10066, 0, 0, 0, 0, 13061, 8016, 78687, - 19932, 64831, 0, 119923, 12390, 119171, 1634, 68115, 0, 11056, 0, 119925, - 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, 171, 5941, 12452, - 917544, 12458, 12531, 78779, 43013, 63800, 74162, 127569, 120483, 9969, - 0, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, 5209, 297, - 5810, 8522, 8415, 119937, 78429, 78428, 7077, 2497, 128651, 960, 74156, - 6981, 92374, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875, 127505, - 78876, 2503, 73778, 1762, 69794, 2495, 78873, 5844, 78874, 118838, 0, - 12654, 4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0, - 92339, 0, 0, 5782, 420, 0, 0, 43796, 10797, 63794, 0, 0, 64814, 63796, - 77965, 0, 66581, 119204, 41608, 0, 0, 63792, 4659, 120788, 0, 43676, 0, - 69673, 0, 0, 0, 329, 77968, 92707, 917548, 7399, 0, 41188, 13244, 120466, - 42167, 7435, 78193, 5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, - 65684, 0, 5601, 65192, 42765, 63752, 0, 7987, 0, 1172, 69799, 6786, - 43601, 120476, 74126, 5603, 0, 4473, 0, 194823, 0, 65347, 65346, 65345, - 0, 127384, 5347, 69802, 0, 73868, 118944, 10588, 0, 0, 63755, 0, 5343, - 78422, 0, 4555, 5341, 0, 0, 128670, 5351, 0, 43104, 65244, 917892, 64541, - 42519, 74472, 0, 0, 74765, 917888, 194892, 6638, 0, 65113, 271, 74180, - 65370, 8835, 65368, 12653, 65366, 42172, 41086, 65363, 65362, 65361, - 11912, 43410, 11323, 65357, 11800, 65355, 5345, 65353, 65352, 65351, 761, - 65349, 19959, 69718, 63856, 0, 2423, 77958, 64647, 77959, 11957, 4699, 0, - 0, 0, 0, 64605, 0, 0, 0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773, - 13167, 12918, 41096, 73980, 69245, 78254, 917893, 10684, 0, 917896, 0, - 7946, 12541, 8182, 67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0, - 0, 8847, 0, 65876, 5535, 8329, 74590, 0, 92609, 0, 0, 3127, 2595, 65713, - 42013, 0, 5607, 41089, 0, 0, 74256, 2665, 11304, 0, 74200, 4970, 8764, + 7293, 7991, 0, 10578, 0, 78076, 194738, 78077, 983462, 0, 78800, 92653, + 64445, 42668, 6635, 0, 6164, 65170, 0, 0, 7676, 11664, 0, 983393, 69707, + 0, 118812, 0, 0, 128045, 9175, 11925, 78045, 9088, 0, 64545, 1396, 0, + 7546, 3847, 0, 127835, 4985, 13288, 672, 8098, 43196, 194746, 0, 128126, + 0, 74043, 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, + 10180, 0, 128584, 12622, 0, 0, 0, 194714, 127139, 13310, 773, 19933, + 1539, 0, 126983, 42731, 92205, 0, 0, 0, 3051, 5862, 7823, 92478, 0, + 120411, 3250, 43991, 69687, 66649, 9510, 66237, 0, 0, 41066, 64673, + 917963, 917964, 0, 3505, 8707, 917968, 6725, 128013, 917971, 92314, 3471, + 917970, 5479, 882, 6686, 119584, 11613, 120772, 42754, 0, 0, 92696, 0, 0, + 0, 128523, 3225, 917996, 4433, 41156, 43973, 43173, 1443, 4381, 0, 0, + 10926, 11756, 11757, 64879, 917949, 917950, 127848, 13227, 0, 10021, + 5160, 1387, 0, 917953, 41418, 0, 65914, 6721, 217, 917955, 917960, + 917961, 10443, 10789, 41158, 119257, 4274, 0, 41483, 0, 41250, 0, 42179, + 0, 5931, 11744, 69232, 0, 41252, 66682, 0, 119637, 41249, 1366, 64635, + 65047, 12466, 0, 0, 4397, 128037, 128336, 41296, 9545, 41291, 128049, 0, + 41485, 3511, 41282, 5923, 10400, 0, 128818, 760, 0, 12088, 5786, 0, + 42256, 119869, 119860, 417, 41474, 119562, 41565, 0, 5934, 119867, 66583, + 119231, 64877, 0, 64481, 78614, 66013, 41956, 43455, 126995, 0, 0, 0, + 42273, 5819, 0, 917556, 0, 0, 0, 65910, 127747, 10246, 120816, 0, 1237, + 10274, 4552, 119576, 0, 0, 1375, 66705, 43573, 65260, 42063, 0, 42811, + 10312, 74192, 120794, 7840, 0, 43630, 10252, 0, 128104, 43185, 0, 4396, + 0, 119880, 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, 0, + 6072, 43025, 10299, 0, 0, 120608, 66326, 0, 0, 0, 43811, 9330, 0, 7222, + 10283, 10315, 10379, 4996, 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, + 0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 68096, 77929, 43982, + 74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212, + 65435, 0, 12071, 9609, 12156, 917983, 917984, 43586, 11035, 10411, + 917988, 10255, 6710, 10279, 4194, 10375, 917993, 0, 4315, 12644, 127516, + 77937, 43639, 43343, 0, 917998, 11501, 41177, 128689, 0, 917792, 0, + 92413, 8715, 0, 41179, 0, 43313, 0, 41176, 0, 994, 0, 8452, 127103, + 73966, 0, 0, 5921, 0, 2597, 0, 5922, 118903, 77943, 4186, 92531, 127106, + 127105, 6718, 0, 4406, 74601, 8480, 9192, 9747, 128699, 4413, 92196, + 42268, 3198, 5924, 5920, 92469, 6921, 78081, 74007, 42869, 8418, 11681, + 43169, 10176, 0, 742, 0, 2893, 10772, 65276, 5937, 1914, 2553, 11682, + 6756, 128590, 128646, 8363, 0, 2993, 7772, 3916, 0, 120494, 1141, 42407, + 8159, 718, 7572, 973, 0, 120718, 3235, 2415, 43164, 0, 8018, 42333, + 74756, 10675, 6937, 42486, 43381, 65390, 10067, 0, 1202, 0, 0, 65863, 0, + 0, 0, 78182, 64542, 3260, 73829, 65388, 9945, 8419, 78042, 6738, 0, + 43681, 69728, 2059, 0, 0, 55237, 1431, 0, 66565, 10821, 0, 12804, 128076, + 8229, 1235, 3307, 11472, 78089, 78184, 4544, 0, 0, 0, 1740, 78097, 8758, + 985, 12872, 64511, 78094, 12068, 78102, 0, 10141, 0, 63761, 8785, 4476, + 78109, 63763, 12655, 8907, 78105, 78106, 78103, 78104, 0, 119572, 10665, + 64616, 41572, 0, 127160, 0, 41573, 0, 3931, 120295, 74143, 0, 0, 0, 0, + 11982, 0, 0, 0, 128016, 64484, 0, 41167, 0, 41735, 0, 717, 10754, 0, 0, + 127979, 0, 63767, 0, 1780, 6936, 0, 0, 819, 10611, 9694, 126978, 0, 0, 0, + 0, 8343, 8342, 8345, 8344, 6578, 7009, 7523, 6922, 8348, 8347, 7525, + 3346, 8339, 128165, 128338, 575, 268, 78111, 8563, 5754, 120343, 41541, + 65565, 8336, 5936, 7290, 78117, 8337, 8341, 308, 11388, 7522, 120721, + 78123, 65466, 11090, 6953, 0, 120346, 0, 78132, 5926, 78128, 78130, + 78126, 78127, 78124, 78125, 9038, 7887, 43456, 7830, 11651, 13093, 64002, + 0, 65742, 12874, 119597, 11590, 0, 74048, 128350, 8595, 0, 917947, 43703, + 13097, 0, 64643, 13283, 12697, 0, 12381, 3488, 5933, 10033, 73738, 66241, + 65570, 0, 12297, 119153, 1955, 0, 5349, 42538, 0, 0, 65308, 9462, 917554, + 0, 0, 0, 42736, 0, 5756, 0, 7638, 41642, 42764, 0, 43109, 7637, 5752, + 120600, 0, 73832, 128827, 120635, 128231, 78334, 0, 7636, 65171, 9124, 0, + 78892, 0, 291, 0, 0, 2027, 66230, 10080, 78136, 10403, 0, 4640, 64713, + 10224, 120429, 42512, 120431, 120430, 0, 128351, 127489, 127148, 0, + 92499, 0, 119094, 74213, 7824, 0, 0, 41274, 5778, 6302, 0, 0, 12680, + 119130, 1417, 77889, 194914, 9452, 0, 74393, 11552, 0, 127855, 0, 65391, + 0, 10172, 65453, 63789, 41264, 78658, 6426, 4641, 9179, 64819, 55278, + 41255, 42036, 41469, 41269, 120412, 41267, 4646, 120425, 865, 42034, + 78274, 78273, 4645, 42033, 78270, 127982, 0, 64728, 0, 78673, 78674, + 1659, 919, 42784, 1671, 195089, 6069, 9219, 195090, 1661, 13120, 63784, + 69819, 10140, 9713, 119143, 0, 0, 0, 2306, 10485, 118943, 6068, 10612, + 195099, 119567, 195101, 92561, 41462, 120470, 195079, 5422, 128234, 0, 0, + 0, 10229, 10635, 826, 128081, 195082, 195085, 195084, 195087, 6483, 0, + 1808, 7848, 0, 8100, 78227, 78669, 78670, 13301, 78667, 9667, 78665, + 78872, 0, 11003, 9904, 0, 0, 120690, 9144, 10921, 0, 78680, 9840, 65131, + 78678, 77841, 10313, 0, 0, 64320, 10265, 78686, 10962, 78684, 43008, + 8945, 78683, 0, 41, 195072, 1792, 120515, 195073, 8655, 195075, 92544, + 77951, 12066, 0, 385, 4152, 2585, 127804, 119068, 3126, 0, 74136, 10957, + 983438, 43258, 0, 127873, 13157, 0, 0, 3570, 0, 7443, 0, 44006, 6997, 0, + 0, 7879, 8739, 11075, 0, 65216, 0, 69795, 2593, 8463, 7810, 917862, 7839, + 119913, 78806, 119912, 9691, 4411, 78802, 0, 0, 43442, 78799, 65254, + 10066, 983624, 0, 0, 0, 13061, 8016, 78687, 19932, 64831, 0, 119923, + 12390, 119171, 1634, 68115, 0, 11056, 0, 119925, 0, 41165, 11328, 12450, + 0, 41166, 0, 12456, 119914, 171, 5941, 12452, 917544, 12458, 12531, + 78779, 43013, 63800, 74162, 127569, 120483, 9969, 0, 12454, 63806, 42132, + 12063, 78425, 78424, 3230, 0, 0, 0, 5209, 297, 5810, 8522, 8415, 119937, + 78429, 78428, 7077, 2497, 128651, 960, 74156, 6981, 92374, 12938, 4292, + 0, 74815, 10512, 0, 74814, 78875, 127505, 78876, 2503, 73778, 1762, + 69794, 2495, 78873, 5844, 78874, 118838, 0, 12654, 4663, 1899, 78877, + 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0, 92339, 0, 0, 5782, 420, 0, 0, + 43796, 10797, 63794, 0, 0, 64814, 63796, 77965, 0, 66581, 119204, 41608, + 0, 0, 63792, 4659, 120788, 0, 43676, 0, 69673, 0, 0, 0, 329, 77968, + 92707, 917548, 7399, 0, 41188, 13244, 120466, 42167, 7435, 78193, 5380, + 119086, 69225, 1155, 11365, 43126, 77972, 0, 65684, 0, 5601, 65192, + 42765, 63752, 0, 7987, 0, 1172, 69799, 6786, 43601, 120476, 74126, 5603, + 0, 4473, 0, 194823, 0, 65347, 65346, 65345, 0, 127384, 5347, 69802, + 983367, 73868, 118944, 10588, 0, 0, 63755, 0, 5343, 78422, 0, 4555, 5341, + 0, 0, 128670, 5351, 0, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, + 74765, 917888, 194892, 6638, 0, 65113, 271, 74180, 65370, 8835, 65368, + 12653, 65366, 42172, 41086, 65363, 65362, 65361, 11912, 43410, 11323, + 65357, 11800, 65355, 5345, 65353, 65352, 65351, 761, 65349, 19959, 69718, + 63856, 0, 2423, 77958, 64647, 77959, 11957, 4699, 0, 0, 0, 0, 64605, 0, + 0, 0, 4916, 0, 380, 10958, 66563, 77955, 69773, 9773, 13167, 12918, + 41096, 73980, 69245, 78254, 917893, 10684, 0, 917896, 0, 7946, 12541, + 8182, 67586, 69780, 0, 0, 0, 0, 9005, 1225, 6630, 0, 0, 0, 0, 8847, 0, + 65876, 5535, 8329, 74590, 983047, 92609, 0, 0, 3127, 2595, 65713, 42013, + 983593, 5607, 41089, 0, 0, 74256, 2665, 11304, 0, 74200, 4970, 8764, 120459, 8934, 92726, 41566, 4492, 0, 65011, 41090, 0, 0, 1188, 7254, 1100, 0, 128301, 41081, 2912, 11749, 69792, 0, 0, 3572, 10023, 4959, 13079, 0, 0, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, 13304, 128290, 127260, 41451, 0, 11095, 8273, 127533, 3451, 0, 972, 41453, 0, 0, - 73883, 92408, 73945, 0, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, 11396, - 0, 11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 64446, 0, 10696, - 0, 6073, 9838, 118920, 0, 6075, 128563, 282, 0, 6437, 74078, 128000, - 9801, 0, 0, 0, 0, 3474, 118787, 0, 120655, 6081, 0, 127843, 74076, 78879, - 0, 0, 0, 0, 0, 8751, 11499, 120273, 7816, 12636, 4665, 12628, 4670, - 92608, 120272, 0, 9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0, - 4669, 0, 68099, 13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, - 917875, 8664, 9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251, - 9772, 7255, 8886, 1389, 127932, 120257, 120258, 120259, 12941, 42661, - 92381, 120255, 120256, 12301, 120266, 69820, 41102, 66604, 120262, - 120263, 120264, 1017, 66600, 523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, - 120613, 128704, 0, 119196, 11307, 66707, 917871, 127751, 11745, 7919, 0, - 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, 6744, 128355, 1699, 74191, 74843, 0, - 0, 6306, 10169, 0, 119251, 10068, 3766, 2389, 120456, 120455, 6611, 257, - 43170, 13153, 0, 42386, 0, 9436, 2599, 0, 6496, 9449, 5930, 11476, 11033, - 11447, 10541, 5622, 120436, 8477, 3760, 1718, 9442, 66433, 3776, 0, - 41435, 4352, 0, 2435, 120809, 5621, 120385, 4201, 3778, 4203, 4202, 4205, - 4204, 120447, 3768, 68142, 765, 41440, 3764, 8473, 6373, 8469, 120438, - 12947, 4564, 0, 0, 74271, 73753, 8374, 0, 0, 6829, 5225, 128807, 127385, - 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 0, 127236, 128019, 0, 5353, - 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 0, 6952, 0, 120752, - 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471, 120038, 120027, - 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400, 5627, 120017, - 120018, 120023, 64275, 120021, 10961, 0, 203, 0, 0, 0, 0, 78350, 0, - 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, 127878, - 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, 3047, 10317, 175, 0, 0, - 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118, 128024, - 1129, 0, 0, 65900, 1986, 7846, 78804, 8661, 917772, 65255, 0, 3845, 4490, - 118969, 6649, 74400, 1456, 7530, 11977, 7249, 8366, 0, 7756, 12342, - 128568, 51, 41516, 0, 8570, 9568, 917863, 456, 7026, 8145, 1168, 9251, - 9082, 119964, 64055, 42781, 3866, 12323, 41512, 73805, 68121, 0, 41494, - 92316, 4660, 0, 10405, 0, 78803, 0, 0, 42040, 73918, 119627, 7944, 41454, - 12605, 0, 42205, 41455, 236, 64051, 78867, 8214, 0, 0, 0, 41457, 0, - 119589, 1969, 2384, 8097, 917864, 0, 127380, 78029, 8766, 0, 78079, 5854, - 127974, 10583, 0, 119989, 0, 10416, 917869, 3872, 917868, 0, 8429, 0, - 118806, 2838, 128802, 0, 917866, 0, 0, 0, 0, 0, 11096, 120813, 10553, - 1662, 8483, 120396, 43605, 5892, 43418, 0, 73742, 66, 65, 68, 67, 70, 69, - 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, 83, 86, 85, 88, 87, - 90, 89, 119862, 10357, 7385, 8170, 1704, 8556, 0, 9659, 0, 0, 0, 9556, 0, - 4503, 11353, 9647, 0, 78185, 0, 0, 92713, 78886, 0, 0, 74229, 66593, - 6438, 917979, 9109, 78882, 1289, 64599, 0, 0, 0, 65507, 2447, 0, 0, - 128042, 0, 0, 0, 6334, 0, 0, 19937, 0, 92368, 0, 5675, 254, 0, 0, 69686, - 42425, 8918, 64003, 5716, 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0, - 92645, 74796, 64400, 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 0, - 11785, 0, 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7775, - 128293, 0, 74588, 120748, 3140, 128854, 7960, 43271, 0, 12518, 10909, - 127508, 1428, 12472, 0, 128787, 7699, 12393, 0, 0, 0, 74518, 8223, 0, - 4261, 0, 0, 0, 0, 0, 128302, 0, 128046, 43419, 0, 64554, 10574, 3878, 0, - 42352, 1752, 73785, 0, 42506, 128541, 10199, 0, 0, 0, 65919, 0, 6695, - 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, 0, 43474, 0, 64488, 0, 0, - 64041, 74787, 0, 78865, 92258, 65597, 0, 78863, 0, 1302, 0, 78861, 0, 0, - 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, 65608, 3714, 0, 0, 0, - 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, 8130, 8672, 10845, - 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, 0, 468, 612, 0, - 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, 74564, 119017, - 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, 64684, - 126992, 3359, 7800, 128644, 65177, 6226, 353, 12396, 0, 119612, 64742, - 128682, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418, - 0, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0, - 12409, 0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 0, 0, - 118986, 0, 4788, 0, 0, 65734, 0, 43790, 0, 13075, 74429, 0, 64569, 43532, - 10837, 2492, 127197, 118901, 68637, 41136, 43785, 11813, 9649, 41154, - 119617, 5128, 4038, 41143, 65604, 64859, 41592, 6771, 1648, 5435, 0, - 6734, 41343, 119848, 65439, 12709, 6986, 92364, 0, 0, 41349, 119123, + 73883, 92408, 73945, 983470, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, + 11396, 0, 11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 64446, 0, + 10696, 0, 6073, 9838, 118920, 0, 6075, 128563, 282, 0, 6437, 74078, + 128000, 9801, 0, 0, 0, 0, 3474, 118787, 0, 120655, 6081, 0, 127843, + 74076, 78879, 0, 0, 0, 0, 0, 8751, 11499, 120273, 7816, 12636, 4665, + 12628, 4670, 92608, 120272, 0, 9642, 10912, 958, 0, 11387, 78878, 4666, + 0, 4915, 0, 4669, 0, 68099, 13287, 4664, 10836, 120550, 0, 69775, 0, + 43595, 7450, 0, 917875, 8664, 9697, 3606, 917873, 0, 0, 64815, 1063, + 120250, 120251, 9772, 7255, 8886, 1389, 127932, 120257, 120258, 120259, + 12941, 42661, 92381, 120255, 120256, 12301, 120266, 69820, 41102, 66604, + 120262, 120263, 120264, 1017, 66600, 523, 505, 1447, 74436, 0, 0, 0, + 8608, 42789, 120613, 128704, 0, 119196, 11307, 66707, 917871, 127751, + 11745, 7919, 0, 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, 6744, 128355, 1699, + 74191, 74843, 0, 0, 6306, 10169, 983046, 119251, 10068, 3766, 2389, + 120456, 120455, 6611, 257, 43170, 13153, 0, 42386, 0, 9436, 2599, 0, + 6496, 9449, 5930, 11476, 11033, 11447, 10541, 5622, 120436, 8477, 3760, + 1718, 9442, 66433, 3776, 0, 41435, 4352, 983354, 2435, 120809, 5621, + 120385, 4201, 3778, 4203, 4202, 4205, 4204, 120447, 3768, 68142, 765, + 41440, 3764, 8473, 6373, 8469, 120438, 12947, 4564, 0, 0, 74271, 73753, + 8374, 0, 0, 6829, 5225, 128807, 127385, 0, 0, 119615, 0, 74793, 5626, + 73807, 11771, 0, 127236, 128019, 0, 5353, 5625, 74179, 0, 0, 1010, 64572, + 41780, 42623, 64277, 0, 6952, 0, 120752, 78762, 2590, 5629, 65552, 7551, + 10325, 5632, 10471, 120038, 120027, 120028, 120025, 5628, 120031, 970, + 120029, 4772, 2400, 5627, 120017, 120018, 120023, 64275, 120021, 10961, + 0, 203, 0, 0, 0, 0, 78350, 0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, + 12182, 42048, 11065, 127878, 73891, 0, 0, 5694, 7689, 69798, 9323, 4325, + 3047, 10317, 175, 0, 0, 69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, + 43651, 0, 68118, 128024, 1129, 0, 0, 65900, 1986, 7846, 78804, 8661, + 917772, 65255, 0, 3845, 4490, 118969, 6649, 74400, 1456, 7530, 11977, + 7249, 8366, 0, 7756, 12342, 128568, 51, 41516, 0, 8570, 9568, 917863, + 456, 7026, 8145, 1168, 9251, 9082, 119964, 64055, 42781, 3866, 12323, + 41512, 73805, 68121, 0, 41494, 92316, 4660, 0, 10405, 0, 78803, 0, 0, + 42040, 73918, 119627, 7944, 41454, 12605, 0, 42205, 41455, 236, 64051, + 78867, 8214, 0, 0, 0, 41457, 983702, 119589, 1969, 2384, 8097, 917864, 0, + 127380, 78029, 8766, 0, 78079, 5854, 127974, 10583, 0, 119989, 0, 10416, + 917869, 3872, 917868, 0, 8429, 0, 118806, 2838, 128802, 0, 917866, 0, 0, + 0, 0, 0, 11096, 120813, 10553, 1662, 8483, 120396, 43605, 5892, 43418, 0, + 73742, 66, 65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, + 82, 81, 84, 83, 86, 85, 88, 87, 90, 89, 119862, 10357, 7385, 8170, 1704, + 8556, 0, 9659, 0, 0, 0, 9556, 0, 4503, 11353, 9647, 0, 78185, 0, 0, + 92713, 78886, 0, 0, 74229, 66593, 6438, 917979, 9109, 78882, 1289, 64599, + 0, 0, 0, 65507, 2447, 0, 0, 128042, 0, 0, 0, 6334, 0, 0, 19937, 0, 92368, + 0, 5675, 254, 0, 0, 69686, 42425, 8918, 64003, 5716, 42312, 0, 0, 6972, + 42826, 0, 42464, 120567, 0, 92645, 74796, 64400, 64693, 0, 77861, 65429, + 9515, 4435, 0, 42522, 0, 0, 11785, 0, 64671, 41978, 1412, 4594, 1391, + 10536, 8067, 9901, 7775, 128293, 0, 74588, 120748, 3140, 128854, 7960, + 43271, 0, 12518, 10909, 127508, 1428, 12472, 0, 128787, 7699, 12393, 0, + 0, 0, 74518, 8223, 0, 4261, 0, 0, 0, 0, 0, 128302, 0, 128046, 43419, 0, + 64554, 10574, 3878, 0, 42352, 1752, 73785, 0, 42506, 128541, 10199, 0, 0, + 0, 65919, 0, 6695, 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, 0, + 43474, 0, 64488, 0, 0, 64041, 74787, 0, 78865, 92258, 65597, 0, 78863, 0, + 1302, 0, 78861, 0, 0, 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, + 65608, 3714, 0, 0, 0, 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, + 8130, 8672, 10845, 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, + 0, 468, 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, + 74564, 119017, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, + 0, 64684, 126992, 3359, 7800, 128644, 65177, 6226, 353, 12396, 0, 119612, + 64742, 128682, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, + 42418, 0, 41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, + 0, 12409, 0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 983460, + 0, 118986, 0, 4788, 0, 0, 65734, 0, 43790, 0, 13075, 74429, 0, 64569, + 43532, 10837, 2492, 127197, 118901, 68637, 41136, 43785, 11813, 9649, + 41154, 119617, 5128, 4038, 41143, 65604, 64859, 41592, 6771, 1648, 5435, + 0, 6734, 41343, 119848, 65439, 12709, 6986, 92364, 0, 0, 41349, 119123, 12581, 10374, 5175, 0, 73806, 10254, 0, 10278, 10262, 77950, 41346, 0, 607, 0, 119853, 128846, 12923, 10314, 10282, 65477, 10378, 120297, 40976, - 8265, 0, 119834, 40975, 5840, 42838, 0, 40978, 0, 119840, 0, 0, 0, 66444, - 10538, 0, 2550, 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, 5619, - 65822, 0, 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0, + 8265, 0, 119834, 40975, 5840, 42838, 0, 40978, 983632, 119840, 0, 0, 0, + 66444, 10538, 0, 2550, 119836, 6779, 0, 0, 3525, 6824, 118886, 0, 0, + 5619, 65822, 0, 194882, 7455, 0, 5616, 11486, 9656, 0, 0, 10727, 5615, 0, 120551, 42380, 64895, 43693, 66451, 808, 5455, 11347, 0, 1026, 5620, 194887, 0, 11350, 5617, 0, 9225, 64639, 127073, 9145, 128060, 1338, 120581, 0, 12739, 4603, 3084, 0, 92484, 9858, 6037, 0, 3974, 78213, @@ -17259,126 +17486,128 @@ 917624, 43740, 0, 40966, 917623, 13286, 3998, 42598, 42596, 503, 74237, 8735, 2690, 66488, 42836, 127150, 41954, 917617, 1652, 772, 6688, 8310, 65428, 3487, 43416, 3585, 10194, 43320, 119159, 128183, 194874, 6468, - 41976, 9720, 917606, 11767, 41970, 0, 5836, 12358, 0, 4355, 9048, 12180, - 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362, 12435, - 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0, 3638, - 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 0, 119182, 69244, 0, 0, 11759, - 194903, 6368, 74823, 0, 41423, 8078, 10504, 0, 41698, 42237, 0, 7002, 0, - 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, 10466, 13099, 0, 0, 0, - 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625, 78157, 41409, 0, 69639, - 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0, 41424, 917598, 120546, 0, - 128212, 0, 41417, 1261, 0, 0, 12102, 119662, 41401, 0, 127538, 0, 78251, - 0, 42290, 3275, 92472, 42329, 74759, 0, 0, 0, 92388, 69649, 10989, 74234, - 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, 74603, 64504, 19928, 0, 0, - 3917, 0, 11732, 0, 0, 41448, 41461, 128823, 0, 127912, 0, 8819, 12663, 0, - 41184, 74014, 232, 74835, 120646, 9168, 65786, 0, 0, 0, 9094, 0, 11758, - 68425, 0, 1064, 42467, 128044, 10115, 19924, 92711, 0, 7862, 64551, - 13224, 8516, 41862, 66650, 7561, 78618, 69793, 1878, 0, 0, 2911, 0, - 41178, 5427, 64823, 0, 0, 3787, 41174, 0, 41458, 0, 41463, 42413, 11292, - 2406, 775, 0, 65584, 0, 6074, 9618, 128668, 0, 43440, 0, 194901, 41436, - 3656, 0, 194899, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, 1613, 0, 68456, - 12598, 0, 120734, 78745, 74500, 41460, 10145, 10542, 9937, 78746, 0, - 9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, 11497, 64687, - 74008, 42592, 3871, 0, 128305, 9111, 5741, 0, 194846, 120366, 119111, - 120745, 0, 120368, 0, 11648, 0, 194873, 120364, 41587, 120365, 0, 74322, - 42113, 0, 127155, 12172, 0, 74530, 65298, 65723, 194840, 73871, 65724, - 7928, 120354, 0, 41595, 73730, 0, 42118, 73830, 66042, 10355, 0, 7875, 0, - 41598, 3993, 0, 1545, 40971, 536, 128521, 43029, 0, 0, 65173, 65286, 0, - 0, 0, 0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 0, 0, 78194, 64326, - 40969, 10526, 78753, 8323, 40968, 1339, 11731, 78756, 0, 65460, 12242, - 128513, 8020, 10843, 11554, 0, 0, 8266, 41006, 65722, 0, 10710, 0, - 118942, 67667, 64567, 119155, 195091, 0, 119636, 67857, 120687, 0, 0, - 11755, 66305, 0, 0, 10917, 120767, 0, 11272, 2040, 41247, 41326, 195060, - 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, 1984, 194621, - 0, 92293, 40984, 128306, 9373, 0, 12916, 6284, 0, 41663, 0, 0, 0, 9237, - 9385, 41648, 0, 0, 0, 41666, 1830, 73783, 2056, 41287, 92610, 0, 0, - 42219, 128257, 0, 41987, 41676, 0, 120823, 0, 41670, 0, 92590, 2796, - 55291, 11683, 9902, 74521, 0, 11451, 0, 128822, 42631, 2359, 0, 67844, - 74164, 41238, 548, 11405, 13133, 64368, 0, 128795, 0, 397, 43622, 42139, - 9547, 9590, 128238, 1614, 43661, 64356, 66307, 6651, 1358, 0, 428, 9620, - 1466, 78112, 10982, 118831, 1333, 7104, 407, 6425, 128834, 74253, 0, 0, - 0, 5804, 11976, 8554, 92721, 0, 0, 9057, 42294, 41218, 0, 0, 78137, 1883, - 10952, 8048, 78142, 41225, 92621, 42915, 0, 128684, 0, 4407, 0, 65809, - 119074, 194821, 8448, 7141, 74183, 0, 12675, 12659, 0, 42363, 120624, - 194824, 55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, - 120500, 0, 7140, 10977, 127378, 4164, 9081, 0, 120569, 42049, 42042, - 8709, 128283, 0, 120637, 42419, 64799, 42047, 0, 0, 8470, 11807, 65897, - 577, 0, 0, 74300, 0, 127308, 74840, 0, 0, 128791, 92224, 8736, 1414, - 42643, 9683, 43486, 74344, 0, 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, - 917612, 66315, 2106, 120222, 11273, 0, 43004, 7541, 0, 0, 961, 64307, - 66324, 64906, 128591, 3106, 65917, 41284, 1696, 0, 891, 12105, 0, 42624, - 12802, 3264, 8824, 13268, 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322, - 120371, 0, 11449, 128187, 42868, 41285, 3547, 0, 0, 0, 0, 43216, 6089, - 78682, 0, 120578, 4170, 1029, 127761, 127036, 119224, 42374, 0, 744, 0, - 0, 0, 65823, 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 0, 65136, - 127136, 0, 0, 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, 78648, - 11972, 78646, 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177, - 9020, 78652, 78653, 6178, 120249, 120242, 128027, 67673, 7518, 8754, 0, - 120237, 2137, 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0, - 74149, 0, 2318, 0, 66361, 8198, 0, 64360, 12601, 42536, 65266, 120827, - 74307, 0, 6970, 5404, 43332, 3667, 7936, 12925, 126989, 6385, 0, 0, - 118949, 10874, 65505, 128083, 0, 42053, 2075, 42057, 11083, 42052, 0, 0, - 67651, 0, 9665, 92300, 0, 13181, 0, 0, 0, 0, 74148, 0, 0, 120225, 120229, - 120224, 74172, 41145, 0, 0, 0, 41148, 8683, 7594, 127519, 0, 119090, - 10869, 43458, 41146, 92407, 11441, 0, 3512, 119633, 0, 8103, 0, 0, 65184, - 11780, 41563, 42796, 0, 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0, - 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 0, 0, 0, 3804, 13070, - 11557, 42044, 0, 1095, 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, - 66697, 0, 11684, 0, 92486, 0, 0, 42043, 43232, 66677, 0, 42046, 78241, - 4036, 0, 0, 128213, 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441, - 92722, 0, 0, 127772, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, - 41190, 3973, 119365, 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792, - 0, 118968, 6417, 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0, - 0, 64548, 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 0, 1617, 8050, - 0, 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, + 41976, 9720, 917606, 11767, 41970, 983318, 5836, 12358, 0, 4355, 9048, + 12180, 65027, 64680, 13038, 43699, 0, 41488, 128087, 8527, 194917, 12362, + 12435, 12360, 41053, 3266, 0, 12356, 8616, 41466, 0, 92588, 11450, 0, + 3638, 12354, 0, 3216, 0, 2358, 92606, 8633, 0, 983480, 119182, 69244, 0, + 0, 11759, 194903, 6368, 74823, 0, 41423, 8078, 10504, 0, 41698, 42237, 0, + 7002, 983413, 41430, 42267, 41051, 41484, 0, 0, 41050, 41473, 10466, + 13099, 0, 0, 0, 6435, 0, 11362, 0, 0, 65382, 0, 41420, 0, 3625, 78157, + 41409, 0, 69639, 2041, 9178, 9672, 41427, 43541, 43317, 0, 0, 0, 41424, + 917598, 120546, 0, 128212, 0, 41417, 1261, 0, 0, 12102, 119662, 41401, 0, + 127538, 0, 78251, 0, 42290, 3275, 92472, 42329, 74759, 0, 0, 0, 92388, + 69649, 10989, 74234, 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, + 74603, 64504, 19928, 0, 0, 3917, 0, 11732, 0, 983496, 41448, 41461, + 128823, 0, 127912, 0, 8819, 12663, 0, 41184, 74014, 232, 74835, 120646, + 9168, 65786, 0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467, 128044, + 10115, 19924, 92711, 0, 7862, 64551, 13224, 8516, 41862, 66650, 7561, + 78618, 69793, 1878, 0, 0, 2911, 0, 41178, 5427, 64823, 0, 0, 3787, 41174, + 0, 41458, 0, 41463, 42413, 11292, 2406, 775, 0, 65584, 0, 6074, 9618, + 128668, 983684, 43440, 0, 194901, 41436, 3656, 0, 194899, 41456, 0, 1599, + 11333, 0, 6703, 8513, 0, 1613, 0, 68456, 12598, 0, 120734, 78745, 74500, + 41460, 10145, 10542, 9937, 78746, 0, 9905, 0, 65730, 0, 120374, 8427, + 120375, 55246, 120376, 0, 11497, 64687, 74008, 42592, 3871, 0, 128305, + 9111, 5741, 0, 194846, 120366, 119111, 120745, 0, 120368, 0, 11648, 0, + 194873, 120364, 41587, 120365, 0, 74322, 42113, 0, 127155, 12172, 0, + 74530, 65298, 65723, 194840, 73871, 65724, 7928, 120354, 0, 41595, 73730, + 0, 42118, 73830, 66042, 10355, 0, 7875, 0, 41598, 3993, 0, 1545, 40971, + 536, 128521, 43029, 0, 0, 65173, 65286, 0, 0, 0, 0, 0, 0, 41375, 5402, 0, + 0, 1687, 120503, 0, 0, 78194, 64326, 40969, 10526, 78753, 8323, 40968, + 1339, 11731, 78756, 0, 65460, 12242, 128513, 8020, 10843, 11554, 0, 0, + 8266, 41006, 65722, 0, 10710, 0, 118942, 67667, 64567, 119155, 195091, 0, + 119636, 67857, 120687, 0, 0, 11755, 66305, 0, 0, 10917, 120767, 0, 11272, + 2040, 41247, 41326, 195060, 1741, 42370, 1227, 0, 0, 11413, 0, 0, 5283, + 1586, 4978, 0, 1984, 194621, 0, 92293, 40984, 128306, 9373, 0, 12916, + 6284, 0, 41663, 0, 0, 0, 9237, 9385, 41648, 0, 0, 0, 41666, 1830, 73783, + 2056, 41287, 92610, 0, 0, 42219, 128257, 0, 41987, 41676, 0, 120823, 0, + 41670, 0, 92590, 2796, 55291, 11683, 9902, 74521, 0, 11451, 0, 128822, + 42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133, 64368, 0, 128795, + 0, 397, 43622, 42139, 9547, 9590, 128238, 1614, 43661, 64356, 66307, + 6651, 1358, 0, 428, 9620, 1466, 78112, 10982, 118831, 1333, 7104, 407, + 6425, 128834, 74253, 0, 0, 0, 5804, 11976, 8554, 92721, 0, 0, 9057, + 42294, 41218, 0, 0, 78137, 1883, 10952, 8048, 78142, 41225, 92621, 42915, + 983411, 128684, 0, 4407, 0, 65809, 119074, 194821, 8448, 7141, 74183, 0, + 12675, 12659, 0, 42363, 120624, 194824, 55273, 10766, 12012, 2386, 64732, + 9170, 917821, 9123, 64585, 120500, 983401, 7140, 10977, 127378, 4164, + 9081, 0, 120569, 42049, 42042, 8709, 128283, 983317, 120637, 42419, + 64799, 42047, 0, 0, 8470, 11807, 65897, 577, 0, 983495, 74300, 0, 127308, + 74840, 0, 0, 128791, 92224, 8736, 1414, 42643, 9683, 43486, 74344, 0, + 2536, 0, 66330, 0, 0, 0, 0, 0, 0, 0, 66317, 917612, 66315, 2106, 120222, + 11273, 0, 43004, 7541, 0, 0, 961, 64307, 66324, 64906, 128591, 3106, + 65917, 41284, 1696, 0, 891, 12105, 0, 42624, 12802, 3264, 8824, 13268, + 43003, 10936, 0, 0, 0, 194826, 92688, 0, 2322, 120371, 983328, 11449, + 128187, 42868, 41285, 3547, 0, 0, 0, 0, 43216, 6089, 78682, 0, 120578, + 4170, 1029, 127761, 127036, 119224, 42374, 0, 744, 0, 0, 0, 65823, + 127826, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 0, 65136, 127136, 0, 0, + 10851, 0, 6179, 92602, 6180, 0, 11952, 120778, 78648, 11972, 78646, + 78647, 78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177, 9020, 78652, + 78653, 6178, 120249, 120242, 128027, 67673, 7518, 8754, 0, 120237, 2137, + 43081, 0, 0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0, 74149, 0, 2318, + 0, 66361, 8198, 0, 64360, 12601, 42536, 65266, 120827, 74307, 0, 6970, + 5404, 43332, 3667, 7936, 12925, 126989, 6385, 0, 0, 118949, 10874, 65505, + 128083, 0, 42053, 2075, 42057, 11083, 42052, 0, 0, 67651, 0, 9665, 92300, + 0, 13181, 0, 0, 0, 0, 74148, 0, 0, 120225, 120229, 120224, 74172, 41145, + 0, 0, 983678, 41148, 8683, 7594, 127519, 0, 119090, 10869, 43458, 41146, + 92407, 11441, 0, 3512, 119633, 983444, 8103, 0, 0, 65184, 11780, 41563, + 42796, 0, 69742, 41544, 65146, 0, 0, 0, 0, 19942, 0, 118908, 7988, 10436, + 74273, 3271, 73804, 64711, 0, 0, 0, 0, 3804, 13070, 11557, 42044, 0, + 1095, 0, 3599, 127774, 0, 128861, 8514, 0, 0, 0, 74346, 66697, 0, 11684, + 0, 92486, 0, 0, 42043, 43232, 66677, 0, 42046, 78241, 4036, 0, 0, 128213, + 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441, 92722, 0, 0, 127772, 0, + 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, 41190, 3973, 119365, + 4575, 41193, 7982, 429, 0, 127194, 0, 194854, 65792, 0, 118968, 6417, + 118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0, 0, 64548, + 120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 983403, 1617, 8050, 0, + 5015, 0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, 7555, 13103, 5408, 2817, 1214, 0, 92335, 0, 0, 0, 0, 127195, 7957, 8689, - 64723, 1056, 42896, 74147, 194813, 0, 55286, 7073, 65850, 12327, 0, + 64723, 1056, 42896, 74147, 194813, 0, 55286, 7073, 65850, 12327, 983680, 119028, 0, 0, 0, 2341, 8450, 8484, 8474, 0, 0, 0, 8461, 128102, 12153, 12799, 0, 43709, 43708, 9451, 7571, 13073, 0, 0, 681, 0, 703, 0, 3272, 8781, 12894, 0, 11709, 92288, 74446, 0, 92532, 0, 11338, 120768, 3276, 0, 0, 65928, 0, 0, 65021, 64795, 74574, 0, 10047, 78814, 3262, 78811, 42711, 0, 0, 68478, 163, 576, 9895, 1655, 78817, 74591, 78815, 78816, 0, 0, 0, - 0, 10039, 0, 0, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, 92382, 0, - 0, 0, 67848, 0, 0, 0, 8887, 0, 7295, 11031, 0, 43157, 0, 8946, 10348, - 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 0, 8810, 74499, 686, 0, - 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, 65118, 0, - 119151, 74205, 92651, 0, 2401, 68144, 8792, 0, 0, 65455, 0, 92246, 0, - 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, 10396, 74135, 0, - 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 128672, 0, 0, - 11479, 0, 0, 6350, 12864, 69674, 78114, 1061, 64780, 2001, 43111, 55230, - 128686, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, 43707, 74127, 0, - 0, 8486, 0, 73758, 2335, 4362, 0, 0, 69221, 1025, 0, 42625, 917627, - 78084, 41443, 0, 128206, 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567, - 41442, 3988, 0, 78237, 118910, 0, 65274, 8564, 78199, 78238, 127515, 0, - 0, 43446, 0, 66513, 6256, 0, 579, 55218, 10206, 0, 6375, 2673, 0, 11814, - 0, 4488, 0, 127336, 68451, 10444, 118846, 127334, 11799, 74407, 68466, - 4487, 127849, 42832, 1032, 120267, 43450, 78257, 7203, 0, 614, 78191, - 127325, 120615, 0, 78262, 128669, 127323, 0, 43121, 0, 0, 92513, 1050, - 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 127313, 0, 66504, 0, 0, - 2307, 0, 64333, 127312, 128547, 73873, 0, 0, 0, 127973, 128708, 0, 10360, - 6746, 0, 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, 0, 66447, 8046, - 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 0, 10487, 0, - 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, 65771, 0, 0, 5237, - 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 5764, 0, 0, 3008, 4896, 0, - 12087, 0, 55231, 41103, 0, 64565, 4773, 0, 92717, 0, 4770, 0, 917567, - 8731, 65378, 127362, 120619, 9122, 128033, 0, 4774, 3019, 9997, 12834, 0, - 9456, 10215, 120547, 0, 0, 0, 0, 74776, 4281, 4768, 0, 41535, 4099, 9017, - 0, 0, 78095, 0, 78096, 0, 0, 0, 78098, 0, 42814, 880, 0, 0, 128021, 2134, - 0, 10116, 9877, 92329, 0, 0, 7095, 0, 74116, 6778, 0, 78090, 8243, 2427, - 128141, 7093, 0, 11585, 195003, 9962, 0, 12223, 0, 0, 1434, 120254, 5637, - 11573, 0, 0, 0, 19951, 0, 78121, 0, 0, 55283, 0, 0, 74437, 1156, 8740, - 92415, 3782, 64331, 0, 41370, 1014, 8261, 0, 0, 10835, 0, 65536, 0, - 120463, 0, 7702, 118824, 0, 43010, 65779, 65783, 1150, 10547, 5700, 0, - 120603, 65383, 2339, 42594, 5697, 118788, 0, 128576, 0, 42257, 5696, - 92677, 120465, 3862, 9643, 0, 0, 7634, 65167, 9845, 0, 0, 5701, 9722, - 41490, 0, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 78067, 0, - 78818, 92719, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712, - 10744, 0, 990, 5647, 0, 7387, 78734, 41114, 11477, 5646, 12879, 11018, 0, - 3945, 92589, 0, 0, 0, 0, 78212, 127746, 1020, 73763, 0, 78731, 5648, - 64748, 194910, 0, 10205, 3545, 0, 6984, 0, 74051, 0, 43242, 120458, 2667, - 0, 0, 0, 9911, 0, 65020, 10097, 119166, 127145, 0, 118836, 0, 78427, - 1140, 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, - 3267, 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0, + 0, 10039, 0, 983677, 5623, 5717, 5776, 0, 0, 0, 41591, 11036, 65252, + 92382, 0, 0, 0, 67848, 0, 0, 0, 8887, 0, 7295, 11031, 0, 43157, 0, 8946, + 10348, 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, 0, 8810, 74499, + 686, 0, 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, 65689, 10128, + 65118, 0, 119151, 74205, 92651, 0, 2401, 68144, 8792, 983383, 0, 65455, + 0, 92246, 0, 119129, 0, 12886, 127920, 66624, 0, 43557, 10300, 10161, + 10396, 74135, 0, 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, + 128672, 0, 0, 11479, 0, 0, 6350, 12864, 69674, 78114, 1061, 64780, 2001, + 43111, 55230, 128686, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, + 43707, 74127, 0, 0, 8486, 0, 73758, 2335, 4362, 0, 0, 69221, 1025, 0, + 42625, 917627, 78084, 41443, 0, 128206, 0, 1774, 1523, 0, 0, 41445, + 78236, 0, 8567, 41442, 3988, 0, 78237, 118910, 0, 65274, 8564, 78199, + 78238, 127515, 0, 0, 43446, 0, 66513, 6256, 0, 579, 55218, 10206, 0, + 6375, 2673, 0, 11814, 0, 4488, 0, 127336, 68451, 10444, 118846, 127334, + 11799, 74407, 68466, 4487, 127849, 42832, 1032, 120267, 43450, 78257, + 7203, 0, 614, 78191, 127325, 120615, 0, 78262, 128669, 127323, 0, 43121, + 0, 0, 92513, 1050, 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 127313, + 0, 66504, 0, 0, 2307, 0, 64333, 127312, 128547, 73873, 0, 0, 0, 127973, + 128708, 0, 10360, 6746, 0, 92245, 440, 0, 13085, 9233, 74216, 0, 0, 9957, + 0, 66447, 8046, 64963, 65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, + 0, 10487, 0, 12527, 0, 7970, 0, 128660, 0, 65769, 5243, 9849, 5239, + 65771, 0, 0, 5237, 69714, 0, 10103, 5247, 4769, 0, 118977, 12873, 5764, + 0, 0, 3008, 4896, 0, 12087, 0, 55231, 41103, 0, 64565, 4773, 0, 92717, + 983653, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033, + 983325, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0, + 74776, 4281, 4768, 0, 41535, 4099, 9017, 0, 0, 78095, 0, 78096, 0, 0, 0, + 78098, 0, 42814, 880, 0, 0, 128021, 2134, 0, 10116, 9877, 92329, 0, 0, + 7095, 0, 74116, 6778, 0, 78090, 8243, 2427, 128141, 7093, 0, 11585, + 195003, 9962, 0, 12223, 0, 0, 1434, 120254, 5637, 11573, 0, 0, 0, 19951, + 0, 78121, 0, 0, 55283, 0, 0, 74437, 1156, 8740, 92415, 3782, 64331, 0, + 41370, 1014, 8261, 0, 0, 10835, 0, 65536, 0, 120463, 0, 7702, 118824, 0, + 43010, 65779, 65783, 1150, 10547, 5700, 0, 120603, 65383, 2339, 42594, + 5697, 118788, 0, 128576, 0, 42257, 5696, 92677, 120465, 3862, 9643, 0, 0, + 7634, 65167, 9845, 0, 0, 5701, 9722, 41490, 0, 1426, 68217, 0, 68447, + 42204, 55270, 8571, 194991, 78067, 0, 78818, 92719, 43182, 12184, 0, + 42022, 0, 10281, 0, 5650, 43194, 64712, 10744, 0, 990, 5647, 0, 7387, + 78734, 41114, 11477, 5646, 12879, 11018, 983662, 3945, 92589, 0, 0, 0, 0, + 78212, 127746, 1020, 73763, 0, 78731, 5648, 64748, 194910, 0, 10205, + 3545, 983329, 6984, 0, 74051, 983390, 43242, 120458, 2667, 0, 0, 0, 9911, + 0, 65020, 10097, 119166, 127145, 983397, 118836, 983483, 78427, 1140, + 78426, 0, 10159, 0, 0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267, + 92291, 0, 10123, 0, 4410, 1041, 10576, 6354, 92581, 580, 74232, 0, 128347, 0, 0, 0, 19938, 65906, 127819, 0, 0, 3298, 5375, 10142, 0, 8215, 0, 6134, 41246, 64402, 0, 128215, 0, 0, 0, 41382, 0, 128653, 5173, 65348, 527, 0, 0, 92612, 128250, 78797, 11915, 0, 0, 10072, 0, 42695, 2329, @@ -17393,7 +17622,7 @@ 9090, 65377, 41596, 0, 42920, 1698, 0, 64477, 0, 43813, 1053, 0, 78269, 0, 0, 1052, 1051, 459, 1060, 74349, 66479, 0, 0, 0, 0, 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 0, 12130, 0, 42337, 64596, 64375, - 66481, 127850, 0, 0, 6359, 0, 43471, 0, 0, 0, 127274, 0, 6358, 6361, + 66481, 127850, 0, 0, 6359, 0, 43471, 983503, 0, 0, 127274, 0, 6358, 6361, 1926, 6356, 92627, 7898, 8110, 10935, 0, 10069, 5830, 0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 0, 120413, 0, 127257, 65894, 0, 0, 0, 0, 0, 0, 119187, 2135, 78868, 0, 0, 78869, 42313, 5579, 92412, 0, 0, 0, 0, 5578, @@ -17406,116 +17635,118 @@ 917763, 5211, 0, 6400, 0, 194983, 0, 8189, 11276, 0, 0, 372, 128829, 0, 118874, 42102, 41585, 128202, 0, 42101, 276, 78402, 0, 33, 74226, 127303, 9007, 118796, 41588, 66033, 427, 10763, 118819, 0, 127884, 0, 1031, 6257, - 0, 42104, 0, 0, 2328, 92409, 1071, 0, 0, 74848, 0, 0, 0, 1047, 0, 0, - 64790, 0, 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, 12098, - 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, 64611, - 41623, 195001, 5715, 69654, 0, 0, 5712, 2761, 41620, 68124, 3074, 5722, - 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, 6479, - 0, 0, 0, 78607, 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, - 0, 8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, 0, 0, 0, - 64946, 10992, 0, 120009, 0, 0, 9318, 120661, 13249, 65679, 73808, 0, - 65457, 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, - 0, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, - 9218, 1731, 0, 0, 0, 195010, 0, 0, 0, 120001, 127018, 92492, 5155, 0, - 5358, 0, 0, 917767, 64424, 0, 3840, 64314, 41432, 0, 0, 68430, 119116, - 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, 11580, 0, 64601, - 12205, 0, 0, 64507, 8868, 399, 0, 74842, 0, 0, 12149, 13088, 551, 0, - 10156, 12119, 92572, 0, 2544, 65074, 119211, 0, 0, 78011, 351, 119149, 0, - 0, 55229, 0, 74268, 0, 0, 0, 42377, 0, 0, 0, 0, 0, 9013, 4054, 0, 0, 0, - 0, 73960, 5585, 65881, 2549, 74469, 0, 0, 5584, 8358, 0, 74411, 92219, - 10919, 0, 7980, 0, 0, 0, 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, - 11356, 0, 0, 43452, 78609, 0, 42573, 67856, 0, 78129, 0, 0, 92535, 8135, - 6450, 10055, 77996, 0, 0, 0, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, - 92573, 120799, 0, 0, 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, - 74509, 0, 5659, 0, 127510, 66729, 5655, 0, 42168, 0, 1055, 917628, - 127792, 66310, 74030, 0, 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, - 10304, 10368, 42518, 594, 10244, 10248, 7407, 0, 64870, 0, 3467, 0, 0, - 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 0, 69696, - 69769, 64656, 0, 0, 194837, 0, 5666, 65227, 5318, 63994, 0, 9091, 10798, - 0, 128166, 10186, 0, 7732, 0, 64556, 0, 0, 5668, 74445, 0, 0, 5670, 0, + 0, 42104, 0, 983712, 2328, 92409, 1071, 0, 0, 74848, 0, 983324, 0, 1047, + 0, 0, 64790, 0, 69723, 10651, 0, 0, 0, 0, 92206, 119181, 5711, 41633, + 12098, 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 69716, 69726, 0, + 64611, 41623, 195001, 5715, 69654, 0, 0, 5712, 2761, 41620, 68124, 3074, + 5722, 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, + 6479, 0, 0, 0, 78607, 9196, 69670, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, + 120010, 0, 8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, + 0, 0, 0, 64946, 10992, 0, 120009, 0, 0, 9318, 120661, 13249, 65679, + 73808, 0, 65457, 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, + 120005, 0, 983698, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, + 78435, 41677, 0, 9218, 1731, 0, 983481, 0, 195010, 0, 0, 0, 120001, + 127018, 92492, 5155, 0, 5358, 983479, 0, 917767, 64424, 0, 3840, 64314, + 41432, 0, 0, 68430, 119116, 43253, 65943, 0, 3371, 10988, 0, 8771, 1479, + 0, 0, 1109, 11580, 0, 64601, 12205, 0, 0, 64507, 8868, 399, 0, 74842, 0, + 983456, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074, + 119211, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, 0, 42377, + 0, 0, 0, 0, 0, 9013, 4054, 0, 983314, 0, 0, 73960, 5585, 65881, 2549, + 74469, 0, 0, 5584, 8358, 0, 74411, 92219, 10919, 0, 7980, 0, 983519, 0, + 41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, 43452, 78609, + 0, 42573, 67856, 0, 78129, 0, 0, 92535, 8135, 6450, 10055, 77996, 0, 0, + 0, 5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 92573, 120799, 0, 0, + 5652, 10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509, 983587, 5659, 0, + 127510, 66729, 5655, 0, 42168, 0, 1055, 917628, 127792, 66310, 74030, 0, + 12146, 73955, 73956, 11618, 0, 126990, 0, 10272, 10304, 10368, 42518, + 594, 10244, 10248, 7407, 983622, 64870, 0, 3467, 983626, 0, 3331, 946, + 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 983457, 69696, 69769, + 64656, 983461, 0, 194837, 0, 5666, 65227, 5318, 63994, 0, 9091, 10798, 0, + 128166, 10186, 0, 7732, 983459, 64556, 0, 0, 5668, 74445, 0, 0, 5670, 0, 127297, 11820, 2992, 7826, 5667, 19952, 120807, 0, 12749, 74551, 0, 0, - 66496, 4361, 119260, 1306, 9286, 1497, 0, 0, 0, 0, 3571, 13247, 0, 7973, - 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, 0, 128554, - 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, 119927, 0, 0, - 0, 64905, 0, 9512, 120671, 12742, 6443, 0, 0, 9135, 0, 41564, 0, 55219, - 128832, 0, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, - 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, 78410, 328, 0, 0, - 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, 64938, 43223, 0, 5635, 3373, - 2986, 78292, 74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, 1657, - 41561, 78299, 78295, 5639, 2954, 5660, 5640, 78303, 0, 78300, 42227, 0, - 0, 41637, 67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, 5642, 0, - 5486, 0, 4356, 11710, 0, 12051, 0, 0, 5641, 8259, 0, 1058, 0, 67630, 0, - 0, 1144, 78750, 0, 42228, 0, 73890, 118972, 0, 65322, 0, 5645, 64964, - 8652, 2547, 66484, 43634, 0, 5608, 65890, 43808, 0, 67621, 119934, 9000, - 0, 0, 92673, 1865, 0, 5613, 74267, 0, 0, 5610, 0, 0, 65826, 2069, 0, - 10787, 43999, 2997, 0, 5609, 78316, 65319, 78313, 12316, 65376, 2412, 0, - 8186, 9807, 74269, 0, 13130, 65874, 0, 5807, 0, 10030, 5306, 12936, 0, 0, - 11704, 0, 92583, 10211, 0, 0, 0, 0, 11706, 9710, 0, 0, 0, 413, 65623, - 7118, 0, 9133, 74262, 0, 1042, 0, 64779, 12171, 119240, 6185, 64776, - 4984, 0, 708, 11391, 0, 12241, 92720, 0, 1308, 0, 2534, 810, 0, 0, 0, 0, - 0, 1917, 3000, 0, 0, 120739, 2364, 92443, 74470, 66618, 65680, 0, 10027, - 0, 128154, 12337, 120722, 127368, 0, 2980, 755, 69774, 931, 13124, 68182, - 6363, 2748, 0, 0, 65041, 0, 44011, 8730, 0, 127854, 78312, 7274, 119250, - 0, 7275, 78304, 935, 0, 65840, 377, 42325, 11649, 127363, 65253, 64301, - 128835, 78308, 42341, 65284, 2417, 0, 12884, 19912, 7907, 10768, 0, - 194998, 0, 10673, 119217, 7248, 0, 128346, 1781, 5496, 3627, 62, 1649, 0, - 964, 0, 127876, 78226, 128775, 127512, 0, 0, 0, 0, 43689, 127911, 13142, - 78812, 42415, 66575, 4542, 74037, 43547, 0, 0, 7677, 2991, 4946, 42454, - 0, 7949, 0, 0, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, - 6478, 9898, 43673, 65237, 6241, 7106, 4877, 0, 6238, 0, 10548, 127049, - 4409, 0, 0, 64798, 0, 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231, - 65884, 12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, - 0, 2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, 43635, - 73928, 127529, 0, 0, 0, 128510, 65482, 0, 9142, 0, 0, 0, 10938, 0, - 118790, 1182, 2542, 4826, 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790, - 10839, 66023, 41593, 41207, 0, 0, 41594, 225, 42828, 0, 0, 0, 11376, - 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, - 0, 41873, 120575, 11324, 120531, 0, 8420, 64918, 128844, 41871, 41338, - 3734, 7734, 43683, 8750, 66605, 66011, 0, 40965, 127937, 0, 5161, 10572, - 0, 0, 0, 64349, 7287, 42162, 127552, 0, 0, 11948, 69220, 12359, 43429, - 41369, 1697, 12191, 0, 68633, 7286, 0, 68635, 10031, 0, 9870, 68645, - 8620, 65824, 0, 11938, 0, 7285, 0, 119577, 42678, 0, 43677, 41583, 0, - 65799, 92623, 0, 0, 0, 78169, 66199, 0, 3609, 68624, 0, 832, 120693, - 120770, 78473, 66007, 78471, 65703, 0, 0, 42732, 5180, 92699, 41395, - 41530, 11691, 64773, 92214, 74002, 0, 0, 128645, 6348, 243, 13200, 0, - 6024, 92309, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195, - 0, 4230, 0, 13307, 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0, - 214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 128277, 2603, 0, - 0, 0, 0, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, - 41121, 3885, 92, 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453, - 128128, 0, 74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 92358, - 66637, 7995, 8759, 43421, 78277, 12449, 128552, 0, 0, 8752, 3197, 4720, - 10165, 0, 119249, 0, 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, - 1946, 741, 0, 5494, 4639, 0, 1990, 66589, 4498, 78664, 119183, 0, 0, - 69734, 2960, 73779, 0, 8969, 128117, 43424, 127059, 0, 2950, 119579, - 6210, 65753, 370, 0, 0, 0, 4953, 0, 0, 0, 0, 69230, 0, 0, 65688, 0, 5063, - 3517, 2964, 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, - 66016, 78253, 0, 0, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, - 0, 65883, 0, 917774, 120602, 3761, 0, 0, 0, 0, 12912, 119012, 3850, - 128191, 0, 0, 0, 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978, - 120540, 119135, 41586, 10527, 0, 917848, 3848, 78739, 194937, 127536, - 65241, 5336, 0, 128786, 663, 0, 10780, 0, 0, 78767, 0, 127163, 68193, - 347, 0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143, - 69657, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681, - 0, 0, 73938, 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609, - 10434, 0, 11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172, - 41728, 41721, 0, 0, 0, 41203, 0, 13110, 41726, 0, 0, 1000, 69651, 0, - 41140, 1209, 73978, 0, 73750, 1073, 6321, 77878, 41138, 0, 68213, 0, - 12167, 1115, 41605, 9794, 127062, 67671, 55248, 12237, 78787, 66314, - 6587, 9290, 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0, 64398, 0, - 119970, 12311, 0, 78796, 78798, 78794, 78795, 68434, 78793, 66670, 0, 0, - 12290, 120169, 0, 119873, 42142, 9968, 8205, 0, 5131, 0, 9627, 78536, - 78542, 78535, 0, 1944, 1248, 10148, 127755, 119990, 119991, 12701, 78376, - 11308, 119995, 0, 119997, 119998, 65305, 65100, 4031, 42794, 120003, - 7075, 8154, 119985, 120007, 41817, 73934, 42275, 120011, 120012, 78526, - 120014, 120015, 6041, 0, 41899, 0, 8002, 0, 4364, 0, 0, 64332, 0, 7813, - 9064, 119986, 10124, 7526, 8601, 7281, 78455, 7279, 12041, 1418, 10885, - 12673, 0, 0, 9660, 0, 13012, 4571, 0, 0, 0, 12078, 2970, 0, 10933, 0, - 77870, 0, 0, 0, 41599, 0, 128831, 0, 12950, 92160, 3486, 0, 78311, 4239, - 0, 127799, 66511, 0, 2637, 64629, 8460, 127053, 8476, 0, 0, 0, 0, 65673, - 1019, 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 0, 5412, 66243, 9935, 0, - 73864, 0, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, 7120, - 41736, 92546, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, + 66496, 4361, 119260, 1306, 9286, 1497, 983360, 0, 0, 0, 3571, 13247, 0, + 7973, 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, 0, + 128554, 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, + 119927, 0, 0, 0, 64905, 0, 9512, 120671, 12742, 6443, 983541, 0, 9135, 0, + 41564, 0, 55219, 128832, 983586, 0, 12148, 0, 78297, 0, 64256, 0, 11669, + 0, 5634, 4524, 0, 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, + 78410, 328, 0, 983544, 69815, 5636, 0, 5329, 0, 5638, 119918, 7940, + 64938, 43223, 0, 5635, 3373, 2986, 78292, 74223, 3437, 78291, 6203, 4247, + 0, 11920, 8274, 0, 0, 1657, 41561, 78299, 78295, 5639, 2954, 5660, 5640, + 78303, 983420, 78300, 42227, 0, 0, 41637, 67872, 0, 78310, 41625, 43362, + 78309, 120713, 11705, 5642, 0, 5486, 0, 4356, 11710, 0, 12051, 0, 0, + 5641, 8259, 0, 1058, 0, 67630, 0, 0, 1144, 78750, 0, 42228, 0, 73890, + 118972, 0, 65322, 0, 5645, 64964, 8652, 2547, 66484, 43634, 0, 5608, + 65890, 43808, 0, 67621, 119934, 9000, 0, 0, 92673, 1865, 0, 5613, 74267, + 0, 0, 5610, 0, 0, 65826, 2069, 0, 10787, 43999, 2997, 0, 5609, 78316, + 65319, 78313, 12316, 65376, 2412, 0, 8186, 9807, 74269, 0, 13130, 65874, + 0, 5807, 0, 10030, 5306, 12936, 983557, 0, 11704, 0, 92583, 10211, 0, 0, + 0, 0, 11706, 9710, 0, 0, 0, 413, 65623, 7118, 0, 9133, 74262, 0, 1042, 0, + 64779, 12171, 119240, 6185, 64776, 4984, 0, 708, 11391, 0, 12241, 92720, + 0, 1308, 0, 2534, 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, 2364, + 92443, 74470, 66618, 65680, 0, 10027, 0, 128154, 12337, 120722, 127368, + 0, 2980, 755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 0, + 44011, 8730, 0, 127854, 78312, 7274, 119250, 0, 7275, 78304, 935, 0, + 65840, 377, 42325, 11649, 127363, 65253, 64301, 128835, 78308, 42341, + 65284, 2417, 0, 12884, 19912, 7907, 10768, 0, 194998, 0, 10673, 119217, + 7248, 0, 128346, 1781, 5496, 3627, 62, 1649, 0, 964, 0, 127876, 78226, + 128775, 127512, 0, 0, 0, 0, 43689, 127911, 13142, 78812, 42415, 66575, + 4542, 74037, 43547, 0, 0, 7677, 2991, 4946, 42454, 0, 7949, 0, 0, 11341, + 42494, 3073, 65625, 9714, 11692, 4657, 0, 92724, 6478, 9898, 43673, + 65237, 6241, 7106, 4877, 0, 6238, 0, 10548, 127049, 4409, 0, 0, 64798, 0, + 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231, 65884, 12678, 78748, + 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, 0, 2461, 11052, + 7091, 5342, 8317, 0, 68163, 5340, 0, 127820, 43635, 73928, 127529, 0, 0, + 0, 128510, 65482, 0, 9142, 0, 0, 0, 10938, 0, 118790, 1182, 2542, 4826, + 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790, 10839, 66023, 41593, 41207, + 0, 0, 41594, 225, 42828, 0, 0, 983670, 11376, 74379, 10721, 67664, 3438, + 42097, 127267, 11084, 3194, 41870, 266, 78305, 0, 41873, 120575, 11324, + 120531, 0, 8420, 64918, 128844, 41871, 41338, 3734, 7734, 43683, 8750, + 66605, 66011, 0, 40965, 127937, 0, 5161, 10572, 0, 0, 0, 64349, 7287, + 42162, 127552, 0, 0, 11948, 69220, 12359, 43429, 41369, 1697, 12191, 0, + 68633, 7286, 0, 68635, 10031, 0, 9870, 68645, 8620, 65824, 0, 11938, 0, + 7285, 0, 119577, 42678, 0, 43677, 41583, 0, 65799, 92623, 0, 0, 983668, + 78169, 66199, 0, 3609, 68624, 0, 832, 120693, 120770, 78473, 66007, + 78471, 65703, 0, 0, 42732, 5180, 92699, 41395, 41530, 11691, 64773, + 92214, 74002, 0, 0, 128645, 6348, 243, 13200, 983548, 6024, 92309, 9979, + 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, 66195, 0, 4230, 0, 13307, + 43256, 92353, 7563, 42376, 0, 68442, 120512, 0, 0, 214, 0, 0, 78466, + 65893, 12208, 9973, 0, 66311, 65589, 128277, 2603, 0, 0, 0, 0, 0, 6022, + 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, 41121, 3885, 92, + 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453, 128128, 983561, + 74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 92358, 66637, 7995, + 8759, 43421, 78277, 12449, 128552, 0, 0, 8752, 3197, 4720, 10165, 0, + 119249, 0, 11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, + 0, 5494, 4639, 0, 1990, 66589, 4498, 78664, 119183, 0, 0, 69734, 2960, + 73779, 0, 8969, 128117, 43424, 127059, 0, 2950, 119579, 6210, 65753, 370, + 0, 0, 0, 4953, 983417, 0, 0, 0, 69230, 0, 0, 65688, 0, 5063, 3517, 2964, + 43663, 917762, 6344, 74791, 10566, 10144, 66333, 8252, 729, 66016, 78253, + 0, 0, 64923, 128040, 43669, 9032, 78263, 78264, 0, 41215, 0, 65883, 0, + 917774, 120602, 3761, 0, 0, 0, 0, 12912, 119012, 3850, 128191, 0, 0, 0, + 0, 908, 0, 8611, 0, 0, 127555, 43691, 41197, 0, 8978, 120540, 119135, + 41586, 10527, 0, 917848, 3848, 78739, 194937, 127536, 65241, 5336, 0, + 128786, 663, 0, 10780, 0, 0, 78767, 0, 127163, 68193, 347, 0, 0, 78775, + 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143, 69657, 78512, 0, + 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681, 0, 983430, 73938, + 0, 128022, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609, 10434, 0, + 11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172, 41728, 41721, + 0, 0, 0, 41203, 0, 13110, 41726, 983590, 0, 1000, 69651, 0, 41140, 1209, + 73978, 0, 73750, 1073, 6321, 77878, 41138, 0, 68213, 0, 12167, 1115, + 41605, 9794, 127062, 67671, 55248, 12237, 78787, 66314, 6587, 9290, + 78782, 78783, 9231, 78781, 2959, 7926, 0, 0, 0, 64398, 0, 119970, 12311, + 0, 78796, 78798, 78794, 78795, 68434, 78793, 66670, 0, 0, 12290, 120169, + 0, 119873, 42142, 9968, 8205, 0, 5131, 0, 9627, 78536, 78542, 78535, 0, + 1944, 1248, 10148, 127755, 119990, 119991, 12701, 78376, 11308, 119995, + 0, 119997, 119998, 65305, 65100, 4031, 42794, 120003, 7075, 8154, 119985, + 120007, 41817, 73934, 42275, 120011, 120012, 78526, 120014, 120015, 6041, + 0, 41899, 0, 8002, 0, 4364, 0, 0, 64332, 0, 7813, 9064, 119986, 10124, + 7526, 8601, 7281, 78455, 7279, 12041, 1418, 10885, 12673, 0, 0, 9660, 0, + 13012, 4571, 0, 0, 983594, 12078, 2970, 0, 10933, 0, 77870, 0, 0, 0, + 41599, 0, 128831, 0, 12950, 92160, 3486, 0, 78311, 4239, 0, 127799, + 66511, 0, 2637, 64629, 8460, 127053, 8476, 983707, 0, 0, 0, 65673, 1019, + 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 983636, 5412, 66243, 9935, 0, + 73864, 983042, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, 7622, + 7120, 41736, 92546, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, 127284, 0, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 92272, 7115, 66030, 73932, 5498, 73942, 41536, 0, 68204, 92587, 3459, 8997, 0, 0, 0, 0, 92512, 0, 66377, 69781, 0, 0, 78511, 3161, 295, 120207, 0, @@ -17530,61 +17761,62 @@ 9497, 0, 63891, 63890, 63889, 63888, 5538, 9987, 0, 118932, 1678, 13274, 552, 120654, 44010, 10785, 0, 119170, 4557, 74459, 9159, 10171, 13125, 63860, 5540, 63858, 63865, 281, 13242, 63862, 74154, 0, 5536, 65568, - 63857, 1388, 74169, 0, 1077, 0, 65099, 11531, 5834, 0, 0, 0, 0, 42773, 0, - 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, 0, 5334, 65081, 43249, - 74778, 127968, 11077, 0, 6509, 0, 5327, 0, 19907, 63869, 3478, 7583, - 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, 1915, 4846, 0, + 63857, 1388, 74169, 0, 1077, 983321, 65099, 11531, 5834, 0, 0, 0, 0, + 42773, 0, 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, 0, 5334, 65081, + 43249, 74778, 127968, 11077, 0, 6509, 0, 5327, 0, 19907, 63869, 3478, + 7583, 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, 1915, 4846, 0, 66371, 118984, 42105, 2990, 120128, 805, 69238, 64438, 12070, 8760, 1117, 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, 78240, 12225, - 63838, 63837, 0, 0, 63833, 6042, 66360, 8083, 0, 0, 63821, 63820, 63819, - 63818, 0, 5227, 9047, 63822, 127162, 6091, 0, 10691, 560, 5643, 8226, - 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, 63813, 6047, - 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, 1093, - 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605, 77934, 9806, 43472, - 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, 4618, 42209, - 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, 1084, 1085, - 63829, 1083, 10131, 7283, 0, 63970, 128358, 1092, 4754, 7273, 5252, - 44016, 43627, 127921, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, - 4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0, 74494, 12463, - 2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938, 74343, 0, 0, 660, - 10127, 666, 9022, 5532, 43667, 5533, 77941, 78507, 6118, 222, 979, 3884, - 0, 74151, 92652, 6502, 0, 127118, 128695, 63951, 12465, 0, 0, 128782, - 63946, 1707, 63924, 12461, 63950, 63897, 63948, 63947, 63945, 6038, - 63943, 63942, 64685, 63895, 65838, 0, 7776, 0, 0, 127773, 120444, 69730, - 801, 43165, 1690, 63919, 63918, 63917, 13277, 43659, 12951, 120638, 9906, - 2054, 2334, 78515, 63916, 5483, 63914, 69737, 63911, 5484, 63909, 63908, - 2539, 0, 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0, - 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0, 128816, 0, 10474, - 43426, 13257, 42354, 0, 0, 0, 195065, 0, 8413, 0, 0, 5693, 7272, 0, - 13209, 64470, 65831, 78460, 195063, 0, 0, 0, 0, 0, 0, 0, 128133, 127767, - 66608, 3111, 41863, 8804, 42913, 92187, 7270, 0, 66606, 6628, 1076, 7433, - 1436, 73844, 55226, 128353, 63982, 7393, 12807, 43413, 63906, 1598, - 63904, 0, 0, 41729, 4423, 1307, 0, 10515, 41589, 128698, 0, 6218, 0, - 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, 74032, 11549, 10735, - 41743, 73937, 6801, 0, 4518, 10990, 65073, 5167, 4481, 3771, 0, 2710, 0, - 69243, 41724, 0, 43073, 41690, 12479, 0, 0, 0, 0, 119659, 1628, 127149, - 0, 0, 65262, 6333, 10783, 42315, 0, 63855, 120683, 0, 0, 5339, 74323, 0, - 13004, 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, 65807, 0, 68464, - 12633, 12870, 69705, 65183, 5688, 11926, 6033, 6310, 5686, 0, 74251, 0, - 120647, 0, 50, 10558, 9871, 0, 43655, 0, 0, 0, 66468, 0, 13259, 4448, 0, - 0, 0, 0, 67853, 0, 10640, 11539, 1151, 0, 917607, 127544, 127079, 195050, - 127852, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, 11538, 8673, - 12650, 11020, 0, 66467, 2105, 8087, 78163, 69632, 9894, 0, 0, 0, 4636, - 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 128284, 12277, 194627, - 11995, 92553, 0, 12158, 0, 8741, 10197, 0, 92426, 0, 6531, 0, 127846, - 473, 43415, 0, 0, 1873, 1087, 0, 0, 0, 78527, 66439, 43218, 0, 194716, - 7237, 12504, 74282, 0, 0, 0, 9489, 0, 0, 4384, 74220, 195055, 2058, - 128863, 13295, 43191, 128030, 0, 1154, 3857, 1205, 0, 0, 13100, 12958, - 120706, 74168, 0, 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0, - 6347, 0, 7654, 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, - 119180, 4997, 64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0, - 8044, 74834, 194643, 41789, 128142, 10809, 0, 0, 0, 1779, 6600, 6601, - 41543, 5325, 642, 64187, 13058, 120449, 12875, 0, 92186, 13229, 0, 10575, - 43399, 0, 0, 41791, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, - 6569, 0, 0, 0, 0, 6783, 0, 12993, 8049, 41548, 44021, 6458, 0, 128882, - 4761, 63828, 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, - 6322, 10483, 0, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, - 8503, 5122, 41527, 0, 66320, 0, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, + 63838, 63837, 983588, 983539, 63833, 6042, 66360, 8083, 0, 0, 63821, + 63820, 63819, 63818, 983639, 5227, 9047, 63822, 127162, 6091, 0, 10691, + 560, 5643, 8226, 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, + 63813, 6047, 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, + 2076, 1093, 9882, 63934, 2082, 63932, 128150, 63929, 3546, 1605, 77934, + 9806, 43472, 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, + 4618, 42209, 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, + 1084, 1085, 63829, 1083, 10131, 7283, 0, 63970, 128358, 1092, 4754, 7273, + 5252, 44016, 43627, 127921, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, + 1089, 4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0, 74494, + 12463, 2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938, 74343, 0, 0, + 660, 10127, 666, 9022, 5532, 43667, 5533, 77941, 78507, 6118, 222, 979, + 3884, 0, 74151, 92652, 6502, 0, 127118, 128695, 63951, 12465, 0, 0, + 128782, 63946, 1707, 63924, 12461, 63950, 63897, 63948, 63947, 63945, + 6038, 63943, 63942, 64685, 63895, 65838, 0, 7776, 0, 0, 127773, 120444, + 69730, 801, 43165, 1690, 63919, 63918, 63917, 13277, 43659, 12951, + 120638, 9906, 2054, 2334, 78515, 63916, 5483, 63914, 69737, 63911, 5484, + 63909, 63908, 2539, 0, 43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, + 253, 0, 68208, 0, 9203, 74231, 0, 11530, 92542, 68668, 0, 128816, 0, + 10474, 43426, 13257, 42354, 0, 983433, 0, 195065, 0, 8413, 983551, 0, + 5693, 7272, 0, 13209, 64470, 65831, 78460, 195063, 0, 0, 0, 0, 0, 0, 0, + 128133, 127767, 66608, 3111, 41863, 8804, 42913, 92187, 7270, 0, 66606, + 6628, 1076, 7433, 1436, 73844, 55226, 128353, 63982, 7393, 12807, 43413, + 63906, 1598, 63904, 0, 0, 41729, 4423, 1307, 0, 10515, 41589, 128698, 0, + 6218, 0, 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, 74032, 11549, + 10735, 41743, 73937, 6801, 983368, 4518, 10990, 65073, 5167, 4481, 3771, + 0, 2710, 0, 69243, 41724, 0, 43073, 41690, 12479, 983370, 0, 0, 983553, + 119659, 1628, 127149, 0, 983466, 65262, 6333, 10783, 42315, 0, 63855, + 120683, 0, 0, 5339, 74323, 0, 13004, 0, 4457, 0, 0, 0, 0, 5684, 8678, + 10914, 0, 5689, 65807, 0, 68464, 12633, 12870, 69705, 65183, 5688, 11926, + 6033, 6310, 5686, 0, 74251, 0, 120647, 0, 50, 10558, 9871, 0, 43655, 0, + 0, 0, 66468, 0, 13259, 4448, 0, 983580, 0, 0, 67853, 0, 10640, 11539, + 1151, 0, 917607, 127544, 127079, 195050, 127852, 0, 0, 0, 12501, 64604, + 0, 11527, 118870, 8812, 0, 11538, 8673, 12650, 11020, 0, 66467, 2105, + 8087, 78163, 69632, 9894, 0, 0, 0, 4636, 55262, 78513, 4515, 2382, 0, + 127055, 0, 120495, 0, 128284, 12277, 194627, 11995, 92553, 0, 12158, 0, + 8741, 10197, 0, 92426, 0, 6531, 0, 127846, 473, 43415, 0, 983385, 1873, + 1087, 0, 0, 0, 78527, 66439, 43218, 983439, 194716, 7237, 12504, 74282, + 0, 983315, 0, 9489, 0, 0, 4384, 74220, 195055, 2058, 128863, 13295, + 43191, 128030, 0, 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, 74168, 0, + 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0, 6347, 0, 7654, + 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, + 64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0, 8044, 74834, + 194643, 41789, 128142, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, + 642, 64187, 13058, 120449, 12875, 0, 92186, 13229, 0, 10575, 43399, 0, 0, + 41791, 1104, 0, 0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, + 0, 6783, 0, 12993, 8049, 41548, 44021, 6458, 983542, 128882, 4761, 63828, + 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, + 983347, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, + 5122, 41527, 0, 66320, 983546, 0, 0, 0, 41537, 69683, 8303, 8282, 11817, 73857, 10003, 73859, 65904, 194663, 1686, 0, 78406, 11467, 3664, 65921, 64299, 194664, 0, 0, 4324, 126, 42246, 119152, 0, 74378, 65926, 7744, 194636, 74277, 74302, 78052, 43817, 6966, 43822, 8136, 0, 65600, 1633, 0, @@ -17602,54 +17834,54 @@ 864, 0, 118926, 8972, 0, 7849, 120092, 92533, 13240, 195068, 5192, 4338, 0, 10948, 917601, 13199, 92575, 1236, 13208, 13261, 13189, 13188, 120164, 0, 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780, - 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 0, 92168, 0, 917858, - 11354, 0, 0, 42795, 0, 119195, 11394, 194646, 13236, 13272, 13194, 1334, - 0, 4479, 1178, 65586, 120663, 66681, 119193, 4601, 0, 0, 0, 0, 0, 194658, - 0, 6809, 63786, 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153, - 754, 10192, 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 0, - 0, 41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757, - 43145, 12217, 63754, 41532, 1349, 63750, 63749, 0, 0, 0, 63753, 63802, - 41084, 120622, 68133, 41930, 63805, 63804, 43632, 63801, 41082, 8140, - 63798, 6260, 0, 0, 119225, 63793, 11988, 3898, 128241, 10201, 12238, - 63795, 42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, - 0, 42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, 0, - 0, 63769, 9530, 0, 12232, 13135, 8596, 5681, 63762, 4595, 63760, 792, 0, - 64803, 0, 8742, 0, 11053, 128796, 63744, 128107, 0, 7588, 63748, 1693, - 63746, 43204, 5055, 68426, 917853, 1090, 120679, 128356, 11665, 74133, - 4558, 65685, 9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, 63773, - 13191, 12170, 3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, 64433, - 0, 0, 941, 0, 0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 0, 0, 92455, - 7386, 0, 64444, 0, 119863, 43603, 0, 65397, 288, 0, 0, 0, 10025, 917916, - 2918, 0, 65300, 119871, 9883, 64726, 2790, 65395, 3793, 0, 127829, 65393, - 0, 74138, 0, 0, 0, 74139, 92712, 65394, 11548, 5270, 0, 65396, 0, 65813, - 13256, 1282, 120771, 0, 0, 10888, 0, 65242, 0, 3330, 0, 0, 0, 0, 0, - 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, - 0, 43094, 0, 43650, 0, 0, 9035, 0, 0, 128005, 0, 92207, 68125, 0, 164, 0, - 0, 0, 6958, 0, 43116, 0, 0, 13245, 0, 0, 127376, 0, 73893, 127756, 12666, - 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0, 65509, 0, 7449, - 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0, 65195, 10164, - 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882, 13275, 128161, - 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, 12229, 41523, 0, - 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, 64958, 0, 0, 73989, - 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, 4796, 12292, 0, - 65479, 0, 41781, 10486, 41480, 43002, 9899, 0, 0, 404, 12821, 3741, 0, - 5788, 8092, 68212, 41222, 1831, 66020, 3982, 0, 4388, 0, 746, 120784, 0, - 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, 119357, 0, 74430, - 0, 11700, 4374, 0, 128179, 1364, 0, 8038, 0, 917597, 12868, 69814, 0, - 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, 7841, 0, - 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 12617, 64172, 13173, 4372, - 119354, 0, 0, 0, 0, 92402, 128062, 12965, 384, 64512, 10404, 10340, - 119352, 1556, 5274, 13210, 120125, 10017, 9733, 41787, 0, 126994, 41373, - 78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703, - 119883, 12861, 4398, 8543, 65618, 128018, 1096, 0, 0, 42688, 12441, - 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 0, - 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, 0, - 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 128123, + 63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 983650, 92168, + 983507, 917858, 11354, 0, 0, 42795, 0, 119195, 11394, 194646, 13236, + 13272, 13194, 1334, 0, 4479, 1178, 65586, 120663, 66681, 119193, 4601, 0, + 0, 983500, 0, 0, 194658, 0, 6809, 63786, 6031, 0, 63791, 63790, 1145, + 63788, 7910, 63785, 43153, 754, 10192, 13105, 8183, 120741, 2037, 0, 0, + 10747, 125, 0, 64890, 0, 0, 0, 41719, 63758, 3523, 1074, 13258, 9536, + 74077, 0, 4427, 74242, 63757, 43145, 12217, 63754, 41532, 1349, 63750, + 63749, 0, 0, 0, 63753, 63802, 41084, 120622, 68133, 41930, 63805, 63804, + 43632, 63801, 41082, 8140, 63798, 6260, 0, 0, 119225, 63793, 11988, 3898, + 128241, 10201, 12238, 63795, 42194, 10367, 12521, 10431, 42114, 41932, + 1068, 0, 12523, 12945, 0, 42203, 7950, 10804, 63771, 42787, 4386, 12224, + 6973, 2793, 12475, 0, 0, 63769, 9530, 0, 12232, 13135, 8596, 5681, 63762, + 4595, 63760, 792, 0, 64803, 0, 8742, 0, 11053, 128796, 63744, 128107, 0, + 7588, 63748, 1693, 63746, 43204, 5055, 68426, 917853, 1090, 120679, + 128356, 11665, 74133, 4558, 65685, 9523, 0, 0, 78681, 11513, 0, 6157, + 63775, 63774, 63773, 13191, 12170, 3500, 3139, 0, 3170, 12485, 0, 10872, + 78271, 13006, 64433, 0, 0, 941, 0, 0, 0, 65541, 11063, 0, 8228, 0, 42065, + 0, 0, 0, 0, 92455, 7386, 0, 64444, 0, 119863, 43603, 0, 65397, 288, 0, 0, + 0, 10025, 917916, 2918, 0, 65300, 119871, 9883, 64726, 2790, 65395, 3793, + 0, 127829, 65393, 0, 74138, 0, 0, 0, 74139, 92712, 65394, 11548, 5270, 0, + 65396, 0, 65813, 13256, 1282, 120771, 0, 0, 10888, 0, 65242, 0, 3330, 0, + 0, 983706, 0, 0, 74259, 3304, 42753, 0, 0, 0, 1627, 0, 0, 0, 5371, 13116, + 0, 1826, 118794, 0, 43094, 0, 43650, 0, 0, 9035, 0, 0, 128005, 0, 92207, + 68125, 0, 164, 0, 0, 0, 6958, 0, 43116, 0, 0, 13245, 0, 0, 127376, 0, + 73893, 127756, 12666, 13175, 13207, 120414, 66014, 120428, 7447, 5929, 0, + 65509, 0, 7449, 11306, 0, 73920, 3180, 0, 63808, 9054, 971, 13062, 0, 0, + 65195, 10164, 92252, 74428, 0, 78146, 92611, 0, 0, 0, 10045, 12882, + 13275, 128161, 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, + 12229, 41523, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, + 64958, 0, 0, 73989, 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, + 4796, 12292, 0, 65479, 0, 41781, 10486, 41480, 43002, 9899, 0, 0, 404, + 12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 3982, 0, 4388, 0, + 746, 120784, 0, 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, + 119357, 0, 74430, 0, 11700, 4374, 0, 128179, 1364, 0, 8038, 0, 917597, + 12868, 69814, 0, 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, + 2365, 7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 12617, 64172, + 13173, 4372, 119354, 0, 983312, 0, 0, 92402, 128062, 12965, 384, 64512, + 10404, 10340, 119352, 1556, 5274, 13210, 120125, 10017, 9733, 41787, 0, + 126994, 41373, 78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, + 120703, 119883, 12861, 4398, 8543, 65618, 128018, 1096, 0, 0, 42688, + 12441, 12355, 119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, + 0, 119101, 0, 64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, + 0, 13195, 41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 128123, 41533, 66337, 0, 92184, 0, 4965, 43445, 917536, 73849, 0, 43638, 78537, 128287, 6261, 119342, 43147, 66570, 1957, 10420, 982, 2756, 13292, 13206, 128828, 0, 2925, 73809, 13056, 127559, 13212, 43238, 0, 13190, 13187, 92541, 13198, 118793, 0, 5242, 119179, 64476, 1694, 8216, 0, 6770, 43331, - 0, 65620, 0, 43544, 0, 0, 41444, 65621, 120325, 9197, 5246, 119106, + 0, 65620, 983463, 43544, 0, 0, 41444, 65621, 120325, 9197, 5246, 119106, 13185, 9709, 120323, 120322, 12314, 65616, 5238, 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, 0, 3936, 119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, 13239, 12692, 7969, 127266, 7219, 127250, 0, @@ -17671,7 +17903,7 @@ 120039, 42683, 0, 0, 7114, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929, 6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69727, 68141, 8372, 0, 65116, 0, 120022, 10175, 10388, 42799, 0, 41013, - 10568, 0, 0, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, + 10568, 0, 983362, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, 42608, 78469, 9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908, 1609, 902, 0, 63936, 128875, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028, 2554, 5158, 5714, 127015, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, @@ -17680,37 +17912,38 @@ 120016, 74283, 11005, 0, 66656, 66044, 0, 194698, 0, 0, 43393, 10094, 0, 11529, 10857, 120643, 66436, 6546, 93, 8102, 0, 68405, 0, 0, 8171, 0, 119097, 127064, 917543, 383, 7154, 41656, 92634, 0, 0, 5187, 0, 127277, - 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 0, 8292, 195074, - 4980, 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, 10631, 66031, - 7972, 0, 78785, 0, 7900, 0, 11309, 78319, 4198, 42725, 0, 67656, 9995, 0, - 92552, 0, 12931, 0, 42684, 74285, 2088, 0, 64366, 65156, 8814, 42238, - 74771, 0, 0, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, - 65865, 0, 194650, 127144, 0, 9342, 120464, 0, 64516, 0, 78792, 10129, - 41007, 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, 40992, 92264, - 127153, 68653, 43558, 5522, 0, 61, 0, 74105, 3633, 0, 65162, 41234, - 12089, 78281, 9771, 0, 13251, 128701, 0, 6262, 2784, 42743, 0, 8126, - 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, 43266, 7108, 194779, - 10890, 74481, 65834, 8324, 119103, 64417, 74817, 127465, 64737, 0, 0, - 8930, 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, 0, 0, 7743, 0, - 0, 77904, 92640, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, 10338, - 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, 43064, 41025, 911, 7539, - 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, 42812, 0, 0, - 12326, 0, 0, 42808, 128337, 9348, 64901, 0, 0, 0, 0, 0, 0, 917584, 43702, - 0, 5857, 65342, 92727, 119120, 120079, 8644, 0, 0, 0, 74296, 41909, 0, - 120332, 2791, 69663, 1891, 69824, 0, 41907, 66647, 118939, 8761, 12942, - 5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 127185, - 63931, 0, 65902, 2882, 0, 0, 12843, 4520, 120345, 92459, 0, 0, 0, 73860, - 0, 0, 64345, 0, 9201, 128314, 194940, 0, 0, 43679, 917585, 65117, 92270, - 0, 10427, 0, 3844, 120675, 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783, - 194935, 0, 0, 0, 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, - 74250, 0, 67657, 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 0, 9839, - 0, 12891, 0, 0, 63999, 2016, 41917, 9788, 63928, 0, 1862, 65800, 9155, - 66623, 9786, 65082, 41919, 8579, 41914, 7981, 0, 66017, 4508, 64883, - 92456, 92522, 127814, 0, 64592, 74276, 120080, 6784, 78788, 68181, 0, 0, - 0, 127534, 12147, 9024, 66378, 66472, 0, 64289, 65289, 78151, 66658, + 11286, 68620, 64217, 0, 5232, 0, 41009, 0, 41005, 0, 0, 983562, 8292, + 195074, 4980, 8860, 73947, 10028, 65291, 7076, 13182, 194705, 0, 0, + 10631, 66031, 7972, 0, 78785, 0, 7900, 0, 11309, 78319, 4198, 42725, 0, + 67656, 9995, 0, 92552, 0, 12931, 0, 42684, 74285, 2088, 0, 64366, 65156, + 8814, 42238, 74771, 0, 0, 12836, 0, 0, 74342, 8593, 0, 0, 68445, 13255, + 0, 0, 7464, 0, 65865, 0, 194650, 127144, 0, 9342, 120464, 0, 64516, 0, + 78792, 10129, 41007, 74375, 0, 40995, 12209, 41012, 119136, 0, 0, 69724, + 40992, 92264, 127153, 68653, 43558, 5522, 0, 61, 0, 74105, 3633, 983635, + 65162, 41234, 12089, 78281, 9771, 983640, 13251, 128701, 0, 6262, 2784, + 42743, 0, 8126, 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, 119623, + 43266, 7108, 194779, 10890, 74481, 65834, 8324, 119103, 64417, 74817, + 127465, 64737, 0, 983394, 8930, 66678, 74249, 1193, 10056, 1800, 13253, + 13252, 7829, 0, 0, 7743, 0, 0, 77904, 92640, 77905, 9034, 6039, 0, 10075, + 0, 41018, 65683, 10338, 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, + 43064, 41025, 911, 7539, 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, + 0, 65330, 42812, 0, 0, 12326, 983591, 0, 42808, 128337, 9348, 64901, + 983596, 0, 0, 0, 0, 0, 917584, 43702, 983320, 5857, 65342, 92727, 119120, + 120079, 8644, 0, 0, 0, 74296, 41909, 0, 120332, 2791, 69663, 1891, 69824, + 0, 41907, 66647, 118939, 8761, 12942, 5748, 0, 10773, 0, 0, 8796, 78149, + 6412, 2061, 8520, 13146, 127185, 63931, 0, 65902, 2882, 0, 0, 12843, + 4520, 120345, 92459, 0, 983395, 0, 73860, 0, 0, 64345, 0, 9201, 128314, + 194940, 0, 0, 43679, 917585, 65117, 92270, 0, 10427, 0, 3844, 120675, + 9755, 1110, 6612, 12222, 0, 128789, 0, 0, 783, 194935, 0, 0, 983525, + 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, 74250, 0, 67657, + 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 0, 9839, 0, 12891, 983490, + 983371, 63999, 2016, 41917, 9788, 63928, 0, 1862, 65800, 9155, 66623, + 9786, 65082, 41919, 8579, 41914, 7981, 0, 66017, 4508, 64883, 92456, + 92522, 127814, 0, 64592, 74276, 120080, 6784, 78788, 68181, 0, 0, 0, + 127534, 12147, 9024, 66378, 66472, 983661, 64289, 65289, 78151, 66658, 194929, 64509, 78152, 0, 0, 11051, 0, 0, 11355, 65885, 0, 128310, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0, 9963, 68649, 0, 4040, 120570, 6167, - 0, 63922, 6594, 0, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, + 0, 63922, 6594, 983475, 0, 0, 3624, 43036, 0, 6387, 63990, 19947, 63988, 41955, 0, 63993, 10440, 9611, 0, 6803, 0, 7738, 63986, 11446, 63984, 92641, 3435, 78164, 43814, 43810, 7029, 64258, 41292, 118898, 12748, 42742, 9517, 11518, 0, 78790, 0, 194777, 63956, 42458, 63954, 63953, @@ -17725,133 +17958,135 @@ 1966, 43628, 0, 0, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973, 402, 0, 13147, 0, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, 0, 11302, 6259, 43395, 0, 0, 194670, 0, 92351, 0, 74425, 11299, 1561, 0, - 92359, 64942, 0, 194733, 0, 194732, 0, 74301, 0, 11280, 0, 69784, 74060, - 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379, 194669, 7402, - 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 0, 0, 5405, 127875, - 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, 64690, 3254, 0, 0, - 0, 42390, 43678, 194725, 0, 65077, 0, 6388, 3355, 9508, 9867, 5723, - 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, 0, 42691, 917886, 127198, - 74767, 0, 127075, 1379, 246, 0, 0, 3788, 0, 11041, 92549, 66304, 0, 0, - 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, 65214, 119242, 42567, - 92217, 13163, 0, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, 42169, 4755, - 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, 64206, 11483, - 74510, 0, 74485, 42442, 65470, 0, 64202, 13160, 7759, 42482, 485, 128006, - 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, 6916, 1208, 0, - 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, 120633, 43539, 5411, - 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, 10643, - 55271, 0, 12166, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, 74310, - 6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, 92560, 2713, 0, 9650, 43330, - 0, 194675, 1406, 0, 0, 92659, 0, 68223, 4143, 194677, 0, 65748, 4141, - 9682, 65287, 1508, 127013, 8779, 10569, 8725, 13299, 66638, 65750, 42263, - 4145, 6380, 65751, 66613, 43994, 65738, 55250, 9185, 9550, 0, 43403, 0, - 0, 0, 65736, 41951, 64816, 65756, 0, 12955, 10596, 2888, 0, 0, 0, 9657, - 9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 43552, 7501, 6328, 0, - 10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986, 0, 10632, - 11934, 11452, 1332, 0, 0, 0, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0, - 43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512, 7289, 74055, 0, 8854, - 64162, 5858, 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, - 128813, 13158, 92166, 7211, 0, 9371, 73973, 0, 6828, 1625, 92302, 0, - 1342, 68440, 64171, 0, 10903, 0, 0, 0, 0, 0, 4482, 41606, 0, 128569, 0, - 0, 64381, 0, 0, 0, 42245, 0, 41972, 0, 444, 0, 9127, 66687, 66619, 0, - 78025, 0, 11349, 40991, 0, 0, 119599, 120830, 0, 1197, 128282, 1149, - 194970, 0, 0, 40990, 0, 0, 3492, 0, 127942, 0, 0, 0, 12838, 0, 19948, 0, - 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, 41309, 0, 0, 8152, 0, 64428, - 12227, 0, 0, 12828, 127511, 0, 0, 120708, 0, 0, 10386, 119574, 0, 0, - 92680, 0, 68154, 0, 1743, 0, 0, 92239, 65186, 0, 0, 9606, 0, 0, 64439, 0, - 0, 92686, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0, - 0, 41091, 3426, 1344, 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 0, - 74818, 5396, 0, 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, - 11929, 0, 7170, 9596, 6130, 128826, 43629, 11579, 194741, 0, 194740, - 128691, 92185, 66699, 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0, - 68414, 0, 43619, 43382, 11300, 43304, 9686, 5890, 11776, 7558, 127158, - 65627, 0, 10718, 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628, - 78019, 0, 0, 41708, 12860, 2641, 12069, 10838, 5403, 10352, 73917, 10061, - 43237, 0, 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0, - 10899, 65469, 0, 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232, - 0, 119253, 0, 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 0, - 4224, 1336, 41518, 0, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0, - 0, 0, 272, 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, 1190, 4109, - 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, 5120, 2409, - 7799, 0, 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, - 0, 64914, 917787, 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, - 10842, 41354, 42123, 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, - 0, 9972, 73865, 4519, 6114, 10898, 43072, 0, 0, 128858, 0, 0, 10695, 0, - 7540, 0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, - 8359, 0, 12689, 0, 194594, 0, 0, 0, 68183, 0, 0, 1287, 5436, 0, 0, 74142, + 92359, 64942, 0, 194733, 983421, 194732, 0, 74301, 0, 11280, 0, 69784, + 74060, 0, 0, 119664, 5145, 12486, 65018, 66516, 5409, 127379, 194669, + 7402, 5399, 9685, 74089, 7952, 5401, 0, 66616, 68421, 983654, 0, 5405, + 127875, 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, 64690, + 3254, 0, 0, 0, 42390, 43678, 194725, 983644, 65077, 0, 6388, 3355, 9508, + 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, 983497, 42691, + 917886, 127198, 74767, 0, 127075, 1379, 246, 0, 0, 3788, 0, 11041, 92549, + 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, 65214, 119242, + 42567, 92217, 13163, 983043, 120831, 74597, 3182, 0, 0, 0, 65034, 65889, + 42169, 4755, 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, 3934, + 64206, 11483, 74510, 0, 74485, 42442, 65470, 983642, 64202, 13160, 7759, + 42482, 485, 128006, 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, + 42431, 6916, 1208, 0, 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, + 120633, 43539, 5411, 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, + 9337, 12052, 10643, 55271, 0, 12166, 2546, 194683, 213, 118852, 65611, 0, + 0, 194756, 74310, 6554, 0, 11914, 5452, 0, 0, 0, 0, 0, 194681, 92560, + 2713, 0, 9650, 43330, 0, 194675, 1406, 0, 0, 92659, 0, 68223, 4143, + 194677, 0, 65748, 4141, 9682, 65287, 1508, 127013, 8779, 10569, 8725, + 13299, 66638, 65750, 42263, 4145, 6380, 65751, 66613, 43994, 65738, + 55250, 9185, 9550, 0, 43403, 0, 0, 0, 65736, 41951, 64816, 65756, 983044, + 12955, 10596, 2888, 0, 0, 0, 9657, 9019, 194766, 0, 2878, 5390, 0, + 194961, 0, 68679, 43552, 7501, 6328, 0, 10429, 10365, 0, 0, 41946, 7503, + 5235, 803, 68381, 0, 0, 8986, 0, 10632, 11934, 11452, 1332, 0, 0, 0, 0, + 118887, 1791, 5191, 9288, 64822, 2892, 0, 43394, 555, 0, 0, 66646, 0, + 119002, 13151, 74512, 7289, 74055, 0, 8854, 64162, 5858, 41927, 10582, 0, + 1784, 1361, 195047, 0, 7905, 0, 64868, 128813, 13158, 92166, 7211, 0, + 9371, 73973, 0, 6828, 1625, 92302, 0, 1342, 68440, 64171, 0, 10903, 0, 0, + 0, 0, 0, 4482, 41606, 0, 128569, 0, 0, 64381, 0, 0, 0, 42245, 0, 41972, + 0, 444, 0, 9127, 66687, 66619, 0, 78025, 0, 11349, 40991, 0, 0, 119599, + 120830, 0, 1197, 128282, 1149, 194970, 0, 0, 40990, 0, 0, 3492, 0, + 127942, 0, 0, 0, 12838, 983710, 19948, 0, 3099, 0, 0, 41087, 0, 0, 0, + 119059, 12036, 41309, 0, 0, 8152, 0, 64428, 12227, 0, 0, 12828, 127511, + 0, 0, 120708, 0, 0, 10386, 119574, 0, 0, 92680, 983524, 68154, 0, 1743, + 0, 0, 92239, 65186, 0, 0, 9606, 0, 0, 64439, 0, 0, 92686, 0, 0, 194967, + 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, 0, 0, 41091, 3426, 1344, + 8870, 0, 0, 4735, 127017, 6119, 12822, 42699, 0, 0, 74818, 5396, 0, + 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, 11929, 0, 7170, + 9596, 6130, 128826, 43629, 11579, 194741, 0, 194740, 128691, 92185, + 66699, 64440, 1004, 92584, 194737, 43234, 66008, 12627, 0, 68414, 0, + 43619, 43382, 11300, 43304, 9686, 5890, 11776, 7558, 127158, 65627, 0, + 10718, 13154, 3461, 9139, 0, 0, 0, 0, 65365, 73877, 65628, 78019, 0, 0, + 41708, 12860, 2641, 12069, 10838, 5403, 10352, 73917, 10061, 43237, 0, + 5140, 209, 128847, 41704, 41056, 43078, 128125, 118809, 0, 10899, 65469, + 0, 0, 0, 2410, 993, 0, 120589, 120689, 78693, 0, 0, 7232, 0, 119253, 0, + 7110, 74462, 2066, 10489, 42166, 43463, 10659, 3600, 0, 4224, 1336, + 41518, 0, 0, 0, 0, 41139, 64820, 92538, 12966, 41134, 0, 0, 0, 0, 272, + 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, 1190, 4109, 1335, 841, + 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, 5120, 2409, 7799, 0, + 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, 0, 9913, 0, 0, + 64914, 917787, 65101, 0, 11694, 92475, 11690, 5835, 127164, 66625, 10842, + 41354, 42123, 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, 0, 9972, + 73865, 4519, 6114, 10898, 43072, 0, 0, 128858, 0, 0, 10695, 0, 7540, 0, + 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, + 12689, 0, 194594, 0, 0, 983616, 68183, 0, 0, 1287, 5436, 0, 0, 74142, 92328, 74152, 119078, 6051, 10497, 69668, 8985, 12109, 0, 0, 0, 0, 0, 3652, 10537, 0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, 1489, 0, 0, 0, - 3899, 1007, 42124, 0, 42122, 92337, 0, 0, 11985, 1345, 78600, 0, 0, 8956, - 43083, 119830, 42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, - 78612, 78613, 65942, 492, 8685, 0, 0, 0, 78622, 43712, 2582, 11470, - 64538, 7444, 78615, 78616, 41550, 0, 73837, 119823, 2527, 119824, 197, - 2799, 92594, 41944, 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, + 3899, 1007, 42124, 983301, 42122, 92337, 0, 0, 11985, 1345, 78600, 0, 0, + 8956, 43083, 119830, 42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, + 78603, 78612, 78613, 65942, 492, 8685, 0, 983494, 0, 78622, 43712, 2582, + 11470, 64538, 7444, 78615, 78616, 41550, 0, 73837, 119823, 2527, 119824, + 197, 2799, 92594, 41944, 120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 119828, 78633, 10896, 0, 1799, 120497, 6971, 74336, - 128342, 0, 65340, 118979, 41551, 2434, 0, 0, 120579, 0, 4631, 0, 0, 6407, - 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 0, - 3171, 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, 64603, 0, - 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, 8994, 10944, - 41208, 0, 41168, 8178, 0, 3367, 92334, 42510, 78641, 78636, 6804, 78634, - 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, 74798, 9181, 65359, 0, - 8017, 0, 65096, 66720, 0, 43475, 0, 4909, 12126, 128673, 120696, 4904, 0, - 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0, - 5398, 0, 127386, 0, 0, 0, 119015, 0, 0, 9476, 0, 0, 12763, 0, 3629, 0, - 13005, 0, 3628, 0, 0, 92502, 3469, 42107, 42116, 917578, 64809, 2928, - 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, 0, 42583, 9315, 4822, 4906, - 3852, 2847, 119821, 3236, 11317, 1251, 7777, 41852, 11410, 10964, 0, - 43222, 12646, 120269, 10259, 9865, 65821, 0, 6018, 92290, 0, 12276, 0, - 68372, 0, 92259, 119244, 0, 0, 10467, 0, 2443, 10918, 78217, 119825, - 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0, 118828, 120271, 65678, - 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, 518, 65857, 0, 128674, - 13204, 4387, 857, 0, 65369, 0, 92336, 43125, 120592, 0, 0, 0, 0, 5136, - 1968, 0, 195023, 1337, 64967, 1629, 0, 796, 66506, 0, 74123, 12877, 0, - 42314, 43388, 0, 74403, 6120, 478, 65151, 68128, 128147, 43082, 6016, 0, - 42284, 128507, 4276, 1206, 3619, 41638, 69691, 3843, 12011, 8853, 3361, - 0, 490, 10715, 7578, 68384, 0, 65350, 10530, 12348, 8653, 74314, 42435, - 6154, 9551, 65354, 78522, 784, 42397, 334, 0, 42416, 65356, 65273, 77987, - 69666, 4442, 10364, 0, 778, 41626, 42455, 7989, 74063, 3227, 0, 127275, - 73983, 2915, 11502, 41022, 41702, 10309, 127035, 78320, 0, 6975, 0, 5415, - 12176, 0, 74193, 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, 78324, - 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, 4051, - 10460, 43364, 118917, 1356, 12161, 42713, 128857, 127268, 1619, 9703, - 43152, 42489, 42112, 0, 1875, 10808, 42109, 120284, 41860, 64862, 13305, - 64907, 5289, 13144, 128658, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 0, - 0, 43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759, - 43100, 74449, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, 65178, - 4684, 78701, 119653, 0, 0, 0, 6048, 74460, 42110, 73965, 10870, 8557, - 11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, 6035, 0, - 7651, 10296, 64443, 0, 0, 917987, 0, 118966, 74144, 40997, 0, 10392, - 10328, 40998, 43462, 74488, 0, 9800, 8979, 0, 119131, 41000, 0, 119239, - 6487, 3386, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200, - 128583, 4425, 0, 0, 0, 43074, 73799, 0, 78147, 0, 12173, 78545, 0, 0, - 65338, 0, 0, 119582, 4474, 0, 43093, 0, 1587, 0, 127372, 64475, 128098, - 1369, 0, 9959, 7927, 0, 4560, 0, 0, 92277, 0, 64948, 4430, 74347, 42601, - 4514, 66434, 0, 8194, 65462, 10626, 10965, 0, 8893, 0, 12542, 0, 65341, - 0, 65829, 7925, 119822, 10475, 0, 0, 1352, 11069, 7707, 127560, 0, 65279, - 127102, 68207, 127100, 65605, 6040, 127097, 10071, 0, 9336, 128824, 0, - 8899, 7798, 64474, 64259, 0, 65188, 7820, 43018, 0, 0, 7746, 1492, 78551, - 10884, 77982, 0, 5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849, - 5730, 2999, 6342, 68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, - 6323, 194684, 8224, 0, 8938, 6043, 12738, 0, 0, 5321, 0, 194798, 0, 2589, - 74332, 1689, 7802, 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, - 128163, 74513, 6049, 0, 4027, 834, 118962, 1803, 0, 1503, 0, 0, 0, 5731, - 1381, 2387, 0, 0, 8289, 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668, - 9766, 0, 5729, 917833, 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0, - 3526, 6298, 0, 77897, 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895, - 43155, 0, 119849, 3146, 10959, 9483, 0, 77893, 10981, 166, 917841, 8635, - 0, 10623, 408, 119058, 127507, 13298, 0, 7426, 41641, 12717, 0, 7607, - 10639, 66713, 0, 0, 41643, 74134, 0, 8713, 41640, 10221, 41645, 66712, - 6645, 646, 66726, 66711, 42129, 0, 77901, 3472, 8697, 0, 0, 0, 0, 0, 0, - 5809, 1950, 119356, 92432, 74572, 0, 42136, 0, 0, 0, 0, 3247, 119854, - 65017, 0, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, 0, 0, 194624, 0, - 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 92592, 0, 41727, 0, - 42848, 2396, 917766, 0, 74018, 917538, 64940, 7027, 3886, 0, 42457, - 119008, 0, 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939, - 92454, 92460, 127801, 917592, 128359, 8534, 127154, 40983, 0, 0, 0, 7201, - 12561, 0, 42371, 12558, 0, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0, - 917559, 0, 0, 1563, 128034, 9619, 0, 0, 0, 127872, 0, 5803, 7797, 6070, - 10006, 0, 2922, 6082, 0, 65009, 0, 12567, 128703, 0, 41412, 0, 0, 3607, - 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, 0, - 43085, 6057, 508, 128585, 128015, 120265, 0, 92405, 0, 0, 638, 6083, + 128342, 0, 65340, 118979, 41551, 2434, 983559, 0, 120579, 0, 4631, 0, 0, + 6407, 0, 6338, 43214, 0, 7570, 0, 3192, 0, 8414, 0, 0, 0, 0, 0, 9164, + 66612, 0, 3171, 6623, 4961, 68396, 886, 55216, 8654, 78832, 9993, 74390, + 64603, 0, 69241, 9599, 78629, 43084, 78627, 78628, 78625, 2399, 69693, + 8994, 10944, 41208, 983448, 41168, 8178, 0, 3367, 92334, 42510, 78641, + 78636, 6804, 78634, 1947, 0, 0, 92681, 42759, 11068, 1705, 9331, 0, + 74798, 9181, 65359, 0, 8017, 0, 65096, 66720, 0, 43475, 0, 4909, 12126, + 128673, 120696, 4904, 0, 69650, 1365, 9253, 42757, 43436, 7462, 0, 0, 0, + 0, 119587, 64415, 0, 0, 5398, 0, 127386, 0, 0, 0, 119015, 0, 0, 9476, 0, + 983512, 12763, 0, 3629, 0, 13005, 0, 3628, 0, 0, 92502, 3469, 42107, + 42116, 917578, 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, 43086, 9114, + 0, 42583, 9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, 1251, 7777, + 41852, 11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, 65821, 0, + 6018, 92290, 0, 12276, 0, 68372, 0, 92259, 119244, 0, 0, 10467, 0, 2443, + 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 127885, 0, 0, + 118828, 120271, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, + 518, 65857, 0, 128674, 13204, 4387, 857, 0, 65369, 0, 92336, 43125, + 120592, 0, 0, 0, 0, 5136, 1968, 0, 195023, 1337, 64967, 1629, 0, 796, + 66506, 0, 74123, 12877, 0, 42314, 43388, 0, 74403, 6120, 478, 65151, + 68128, 128147, 43082, 6016, 0, 42284, 128507, 4276, 1206, 3619, 41638, + 69691, 3843, 12011, 8853, 3361, 0, 490, 10715, 7578, 68384, 0, 65350, + 10530, 12348, 8653, 74314, 42435, 6154, 9551, 65354, 78522, 784, 42397, + 334, 0, 42416, 65356, 65273, 77987, 69666, 4442, 10364, 0, 778, 41626, + 42455, 7989, 74063, 3227, 0, 127275, 73983, 2915, 11502, 41022, 41702, + 10309, 127035, 78320, 0, 6975, 0, 5415, 12176, 0, 74193, 3462, 65215, + 42629, 78691, 73784, 0, 0, 9759, 0, 78324, 127254, 8114, 78698, 78697, + 78696, 78695, 8710, 42495, 118956, 0, 4051, 10460, 43364, 118917, 1356, + 12161, 42713, 128857, 127268, 1619, 9703, 43152, 42489, 42112, 0, 1875, + 10808, 42109, 120284, 41860, 64862, 13305, 64907, 5289, 13144, 128658, 0, + 5575, 9675, 0, 5940, 226, 2649, 6336, 0, 0, 43236, 3382, 42449, 6498, + 1658, 11936, 78232, 0, 11269, 10151, 73759, 43100, 74449, 65508, 0, 0, 0, + 8935, 917985, 0, 0, 0, 616, 74753, 65178, 4684, 78701, 119653, 0, 0, 0, + 6048, 74460, 42110, 73965, 10870, 8557, 11054, 68664, 119049, 9681, 4475, + 0, 41142, 2100, 0, 120731, 6035, 0, 7651, 10296, 64443, 0, 0, 917987, 0, + 118966, 74144, 40997, 0, 10392, 10328, 40998, 43462, 74488, 0, 9800, + 8979, 0, 119131, 41000, 0, 119239, 6487, 3386, 0, 10344, 0, 65299, 5394, + 43246, 78243, 10220, 66505, 41200, 128583, 4425, 0, 0, 0, 43074, 73799, + 0, 78147, 0, 12173, 78545, 0, 0, 65338, 0, 0, 119582, 4474, 0, 43093, 0, + 1587, 0, 127372, 64475, 128098, 1369, 983407, 9959, 7927, 0, 4560, 0, 0, + 92277, 0, 64948, 4430, 74347, 42601, 4514, 66434, 983682, 8194, 65462, + 10626, 10965, 0, 8893, 0, 12542, 0, 65341, 0, 65829, 7925, 119822, 10475, + 0, 0, 1352, 11069, 7707, 127560, 0, 65279, 127102, 68207, 127100, 65605, + 6040, 127097, 10071, 0, 9336, 128824, 0, 8899, 7798, 64474, 64259, 0, + 65188, 7820, 43018, 0, 0, 7746, 1492, 78551, 10884, 77982, 0, 5127, + 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, 68636, + 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, 194684, 8224, 0, + 8938, 6043, 12738, 0, 0, 5321, 0, 194798, 0, 2589, 74332, 1689, 7802, + 4683, 74318, 42704, 120296, 11905, 0, 0, 128516, 128163, 74513, 6049, 0, + 4027, 834, 118962, 1803, 0, 1503, 0, 0, 0, 5731, 1381, 2387, 0, 0, 8289, + 64525, 65817, 2881, 43142, 0, 9601, 2879, 9668, 9766, 0, 5729, 917833, + 74410, 6036, 64881, 4026, 9361, 127091, 2887, 0, 3526, 6298, 0, 77897, + 120095, 78519, 0, 8572, 6021, 77896, 128288, 77895, 43155, 0, 119849, + 3146, 10959, 9483, 0, 77893, 10981, 166, 917841, 8635, 0, 10623, 408, + 119058, 127507, 13298, 0, 7426, 41641, 12717, 0, 7607, 10639, 66713, 0, + 0, 41643, 74134, 0, 8713, 41640, 10221, 41645, 66712, 6645, 646, 66726, + 66711, 42129, 0, 77901, 3472, 8697, 0, 0, 983550, 0, 0, 0, 5809, 1950, + 119356, 92432, 74572, 0, 42136, 0, 0, 0, 0, 3247, 119854, 65017, 983685, + 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, 0, 0, 194624, 0, 0, 0, + 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 92592, 0, 41727, 0, 42848, + 2396, 917766, 0, 74018, 917538, 64940, 7027, 3886, 0, 42457, 119008, 0, + 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939, 92454, 92460, + 127801, 917592, 128359, 8534, 127154, 40983, 0, 983348, 0, 7201, 12561, + 0, 42371, 12558, 0, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, + 0, 1563, 128034, 9619, 983672, 0, 0, 127872, 983471, 5803, 7797, 6070, + 10006, 0, 2922, 6082, 0, 65009, 983674, 12567, 128703, 0, 41412, 0, 0, + 3607, 9200, 10046, 9612, 42153, 8218, 9485, 0, 2032, 78354, 0, 0, 0, 0, + 0, 43085, 6057, 508, 128585, 128015, 120265, 0, 92405, 0, 0, 638, 6083, 119072, 0, 0, 2305, 78348, 0, 0, 6056, 6659, 0, 0, 6085, 0, 0, 3915, 41634, 0, 41639, 63912, 11941, 0, 4028, 1787, 42180, 43096, 92690, 3249, 1768, 0, 12328, 501, 127074, 10601, 0, 583, 0, 41977, 0, 66004, 119350, @@ -17860,65 +18095,66 @@ 78341, 119115, 78342, 0, 0, 74101, 0, 11762, 0, 92422, 77997, 128788, 66475, 0, 5027, 78172, 128878, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026, 0, 68639, 6331, 10079, 8931, 0, 1415, 8866, 41901, 74790, 78138, - 119361, 0, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, 3440, - 78215, 1562, 128656, 127175, 119358, 1716, 0, 10600, 917867, 620, 41001, - 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, 128269, 0, 0, - 119328, 0, 65557, 0, 74541, 0, 11599, 128209, 11602, 6243, 11574, 11581, - 11597, 11598, 6253, 6105, 11584, 74195, 11569, 65275, 8906, 127096, 5755, - 2636, 0, 10815, 11619, 78717, 41540, 7815, 11616, 6979, 12080, 7721, - 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, 829, 0, 92406, 19950, 0, - 128217, 6616, 0, 118875, 10953, 391, 0, 69785, 482, 42296, 11588, 0, - 43606, 0, 68397, 66370, 74506, 42335, 0, 0, 0, 7538, 5315, 120644, 42491, - 0, 42061, 128088, 4576, 0, 68417, 43809, 4277, 0, 4039, 64472, 42338, - 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, 3958, 12132, 1849, - 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, 78338, - 0, 43300, 5156, 92629, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, 66435, - 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, 42578, 128794, 41661, - 78715, 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 0, 42476, 7730, 0, - 128522, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, - 917923, 8763, 128304, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, - 6915, 42310, 4377, 8559, 0, 120234, 0, 13193, 64350, 11666, 8679, 41924, - 1576, 7735, 92398, 0, 73840, 0, 11374, 78043, 10889, 43461, 7757, 42462, - 120226, 10029, 66493, 2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0, - 77948, 363, 11015, 77947, 77944, 64296, 127090, 66692, 120826, 0, 66492, - 6593, 64625, 41963, 92177, 119329, 0, 10013, 64434, 92520, 127095, 9492, - 11782, 64382, 12833, 77830, 0, 1297, 41630, 630, 127094, 0, 120774, - 92465, 1043, 43652, 66223, 10090, 0, 128664, 313, 917563, 41881, 0, - 42311, 7445, 0, 5750, 10759, 9419, 55222, 9405, 11268, 42919, 9398, 8526, - 9399, 9422, 0, 66495, 0, 0, 127239, 41718, 10707, 1603, 0, 119003, 0, - 631, 77952, 69703, 13161, 65272, 0, 10546, 74210, 78101, 11600, 77961, - 2797, 73821, 42427, 306, 714, 3058, 42381, 77962, 127080, 12351, 42395, - 0, 11607, 0, 42282, 77971, 77967, 9157, 73765, 66364, 42433, 77964, 7603, - 12803, 180, 42141, 0, 120612, 66494, 12674, 8244, 362, 92439, 0, 8037, - 43777, 11535, 0, 74845, 5185, 7165, 5521, 10334, 2093, 77983, 10302, - 128112, 10104, 1027, 5181, 0, 0, 10523, 1446, 42320, 41646, 991, 5189, - 42472, 41647, 120105, 1722, 5581, 77979, 3405, 0, 194644, 5523, 0, 42620, - 92447, 0, 9549, 0, 10549, 55282, 9661, 43682, 0, 77910, 120026, 78708, 0, - 77911, 0, 41991, 0, 0, 7630, 9846, 7684, 10350, 0, 1174, 77981, 42733, - 77978, 77980, 66485, 77977, 42277, 77974, 42456, 65667, 127037, 12330, - 128272, 0, 42417, 42383, 0, 41344, 6293, 0, 66252, 77984, 74443, 0, - 10209, 8313, 4195, 74435, 1316, 66690, 120032, 6332, 64894, 0, 65871, - 78060, 1736, 0, 3901, 12228, 120151, 65200, 3383, 10446, 78841, 693, - 9130, 314, 64149, 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, 64154, - 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, 12824, 0, - 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0, - 0, 0, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 0, - 74095, 127981, 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 0, 1023, - 474, 0, 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 92518, 9835, - 66499, 0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, - 128008, 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 92695, - 42182, 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583, 65802, 0, - 64597, 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, 0, 0, 41835, - 4047, 41842, 0, 64107, 0, 0, 11017, 0, 0, 293, 77966, 92169, 64791, - 41827, 42466, 43422, 10579, 8560, 0, 65413, 77963, 4803, 12964, 1739, - 1941, 3900, 0, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098, - 64105, 128080, 42481, 11716, 66473, 7179, 42289, 0, 64103, 969, 0, 9352, - 0, 6165, 64100, 0, 6632, 73861, 42402, 74327, 7806, 0, 8914, 0, 0, 3183, + 119361, 983308, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, + 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983414, 10600, 917867, + 620, 41001, 6028, 0, 42892, 0, 74822, 5024, 120829, 41003, 0, 5025, + 128269, 0, 0, 119328, 0, 65557, 0, 74541, 983331, 11599, 128209, 11602, + 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569, 65275, + 8906, 127096, 5755, 2636, 0, 10815, 11619, 78717, 41540, 7815, 11616, + 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, 829, 0, + 92406, 19950, 0, 128217, 6616, 0, 118875, 10953, 391, 0, 69785, 482, + 42296, 11588, 0, 43606, 0, 68397, 66370, 74506, 42335, 0, 0, 0, 7538, + 5315, 120644, 42491, 0, 42061, 128088, 4576, 0, 68417, 43809, 4277, 0, + 4039, 64472, 42338, 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, + 3958, 12132, 1849, 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, + 41160, 0, 3618, 78338, 0, 43300, 5156, 92629, 0, 929, 6827, 42035, 42437, + 1555, 0, 8691, 66435, 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, + 42578, 128794, 41661, 78715, 43267, 9356, 0, 0, 0, 1286, 10166, 0, 0, + 64707, 0, 42476, 7730, 0, 128522, 42483, 0, 0, 42324, 42291, 10020, + 43359, 0, 6641, 525, 41627, 917923, 8763, 128304, 41628, 533, 11931, + 65225, 8321, 42504, 42581, 0, 6915, 42310, 4377, 8559, 0, 120234, 0, + 13193, 64350, 11666, 8679, 41924, 1576, 7735, 92398, 0, 73840, 0, 11374, + 78043, 10889, 43461, 7757, 42462, 120226, 10029, 66493, 2718, 4168, + 73842, 13308, 120112, 0, 1179, 4440, 0, 77948, 363, 11015, 77947, 77944, + 64296, 127090, 66692, 120826, 0, 66492, 6593, 64625, 41963, 92177, + 119329, 0, 10013, 64434, 92520, 127095, 9492, 11782, 64382, 12833, 77830, + 0, 1297, 41630, 630, 127094, 0, 120774, 92465, 1043, 43652, 66223, 10090, + 0, 128664, 313, 917563, 41881, 0, 42311, 7445, 0, 5750, 10759, 9419, + 55222, 9405, 11268, 42919, 9398, 8526, 9399, 9422, 0, 66495, 0, 0, + 127239, 41718, 10707, 1603, 0, 119003, 0, 631, 77952, 69703, 13161, + 65272, 0, 10546, 74210, 78101, 11600, 77961, 2797, 73821, 42427, 306, + 714, 3058, 42381, 77962, 127080, 12351, 42395, 0, 11607, 0, 42282, 77971, + 77967, 9157, 73765, 66364, 42433, 77964, 7603, 12803, 180, 42141, 0, + 120612, 66494, 12674, 8244, 362, 92439, 0, 8037, 43777, 11535, 0, 74845, + 5185, 7165, 5521, 10334, 2093, 77983, 10302, 128112, 10104, 1027, 5181, + 0, 0, 10523, 1446, 42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, + 5581, 77979, 3405, 0, 194644, 5523, 0, 42620, 92447, 0, 9549, 0, 10549, + 55282, 9661, 43682, 0, 77910, 120026, 78708, 0, 77911, 0, 41991, 983628, + 0, 7630, 9846, 7684, 10350, 0, 1174, 77981, 42733, 77978, 77980, 66485, + 77977, 42277, 77974, 42456, 65667, 127037, 12330, 128272, 0, 42417, + 42383, 0, 41344, 6293, 0, 66252, 77984, 74443, 0, 10209, 8313, 4195, + 74435, 1316, 66690, 120032, 6332, 64894, 0, 65871, 78060, 1736, 983419, + 3901, 12228, 120151, 65200, 3383, 10446, 78841, 693, 9130, 314, 64149, + 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, 64154, 12635, 127007, + 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, 12824, 0, 4528, 5320, + 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, 3757, 0, 0, 0, 65869, + 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, 7921, 0, 74095, 127981, + 41848, 2567, 66006, 0, 4044, 92646, 0, 12233, 983606, 1023, 474, 0, + 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 92518, 9835, 66499, 0, + 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, 128008, + 73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 92695, 42182, + 7581, 19940, 43668, 41667, 128057, 0, 1923, 65583, 65802, 0, 64597, + 43444, 119184, 92197, 0, 6464, 7036, 2996, 1937, 983486, 0, 41835, 4047, + 41842, 0, 64107, 0, 0, 11017, 0, 0, 293, 77966, 92169, 64791, 41827, + 42466, 43422, 10579, 8560, 0, 65413, 77963, 4803, 12964, 1739, 1941, + 3900, 0, 1713, 77969, 0, 73957, 11407, 42441, 41971, 6297, 120098, 64105, + 128080, 42481, 11716, 66473, 7179, 42289, 0, 64103, 969, 0, 9352, 0, + 6165, 64100, 0, 6632, 73861, 42402, 74327, 7806, 0, 8914, 0, 0, 3183, 1435, 64876, 2969, 6046, 64441, 6208, 67849, 5746, 73749, 0, 64416, 42422, 0, 0, 7082, 73775, 338, 5059, 194719, 0, 42328, 10767, 0, 8115, 0, 74758, 0, 8227, 2073, 1218, 0, 0, 65848, 0, 0, 0, 0, 126987, 4486, 0, 0, - 0, 10925, 0, 0, 0, 0, 42309, 10257, 65191, 10273, 0, 10305, 42461, 0, - 42349, 8832, 78051, 64127, 10644, 42662, 78828, 42278, 74451, 126988, + 0, 10925, 0, 0, 0, 983330, 42309, 10257, 65191, 10273, 0, 10305, 42461, + 0, 42349, 8832, 78051, 64127, 10644, 42662, 78828, 42278, 74451, 126988, 917857, 7794, 0, 42429, 6377, 42316, 119026, 3669, 3968, 42468, 0, 69658, 0, 65402, 119581, 0, 0, 64933, 0, 41960, 6699, 0, 0, 128354, 6823, 42391, 1588, 65400, 8409, 78223, 19967, 65398, 787, 0, 917939, 127744, 6115, @@ -17930,266 +18166,269 @@ 74602, 9955, 119557, 4055, 42817, 0, 65212, 11715, 12190, 12319, 78630, 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 127357, 78835, 92410, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, - 10477, 0, 8636, 0, 8315, 65444, 0, 0, 74595, 6152, 0, 0, 6629, 128251, - 120171, 0, 74589, 43993, 0, 69790, 64435, 0, 43690, 11046, 11490, 42730, - 4485, 127107, 0, 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0, - 12825, 0, 0, 12725, 0, 0, 78642, 223, 0, 69675, 120166, 42444, 0, 64499, - 65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, 78619, - 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, 1213, - 0, 64075, 797, 64074, 8734, 4212, 0, 64387, 4115, 0, 5005, 64070, 64073, - 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0, 2120, - 43302, 1224, 0, 65576, 120158, 10701, 1764, 3101, 127815, 12858, 120159, - 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, 9222, - 0, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, 0, 0, - 1293, 7947, 2132, 0, 74593, 120308, 2454, 42717, 3613, 128837, 0, 0, - 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304, 0, 8822, 0, - 1157, 64903, 8638, 0, 0, 0, 0, 120319, 8235, 120316, 4405, 10086, 120247, - 0, 69216, 0, 65430, 74013, 6079, 6817, 10764, 127910, 64291, 128051, 998, - 120312, 11062, 1317, 64327, 1558, 0, 1991, 7882, 42254, 0, 41700, 530, 0, - 10428, 119335, 12002, 119336, 5742, 43076, 4692, 64630, 41823, 4007, - 5004, 119334, 7896, 751, 6595, 6596, 0, 66373, 0, 0, 64908, 92691, 6311, - 0, 12004, 119192, 12049, 43108, 120326, 0, 41705, 92188, 6598, 0, 6599, - 120334, 0, 42148, 118825, 66027, 0, 6597, 9412, 8340, 11824, 64745, 0, 0, - 0, 1988, 5407, 67865, 2430, 41678, 0, 120243, 2336, 0, 0, 78871, 120442, - 0, 1921, 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, - 9229, 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, - 65403, 0, 1854, 10794, 0, 67660, 0, 0, 78359, 5280, 0, 4344, 12905, - 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, 12934, - 41682, 65432, 41693, 0, 6071, 65434, 127467, 4804, 4053, 0, 127469, - 194653, 41696, 467, 69823, 127463, 69797, 0, 0, 8421, 127472, 69682, - 43705, 502, 0, 65431, 119056, 0, 12043, 1303, 316, 92462, 2029, 2136, - 119246, 11533, 64365, 43480, 92639, 4860, 194645, 127877, 42488, 0, 9583, - 128849, 5546, 8019, 73856, 0, 0, 0, 5544, 2355, 12150, 65725, 5543, - 77989, 63751, 12137, 5548, 77985, 0, 65727, 68388, 65726, 6077, 128352, - 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, 0, 1319, 3050, 65410, - 0, 0, 78016, 78017, 42830, 43996, 66716, 128137, 4691, 92242, 9345, 621, - 92709, 128222, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, - 10545, 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, - 92363, 9996, 8508, 0, 7012, 8195, 127834, 9566, 0, 3722, 0, 41707, 8493, - 545, 9575, 41379, 10050, 12718, 0, 8859, 6820, 74345, 65110, 120740, 0, - 0, 9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, - 78022, 410, 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, - 10126, 12116, 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, - 41345, 120362, 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, - 64858, 361, 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 917919, - 4569, 74130, 0, 43487, 194630, 611, 74129, 64871, 118891, 65629, 0, - 194858, 0, 0, 127545, 120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, - 0, 0, 74054, 127754, 195029, 0, 839, 0, 7695, 8769, 65246, 4829, 0, 4859, - 64467, 0, 0, 118998, 7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, 0, - 127936, 804, 0, 0, 12298, 0, 66653, 0, 64924, 10091, 73931, 9468, 74245, - 0, 0, 74246, 92503, 12839, 64669, 92202, 0, 1279, 1425, 6224, 119229, - 11049, 0, 92697, 43239, 8482, 92440, 0, 5032, 69677, 11940, 67888, 664, - 120437, 5034, 0, 0, 127525, 42702, 73888, 0, 13294, 67873, 64869, 6032, - 0, 9115, 7430, 120377, 0, 120819, 68387, 120168, 73913, 120170, 41161, - 5518, 4174, 10993, 41162, 120160, 64528, 1169, 434, 41437, 1905, 6034, - 41164, 64744, 9528, 118867, 128800, 524, 0, 74029, 788, 74027, 0, 194638, - 0, 1663, 10419, 74025, 42636, 0, 69725, 0, 120656, 0, 67876, 0, 0, 0, - 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, 0, 10855, 5445, - 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, 4962, 69772, - 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 92299, 0, 120427, 10451, 0, - 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, 8367, 0, 120146, - 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, 6217, 5896, 0, - 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, 74402, 118860, 0, - 120419, 92497, 74052, 0, 0, 120549, 119082, 64295, 120418, 0, 64765, - 73923, 120417, 120662, 120730, 194702, 6216, 0, 10755, 9455, 0, 8124, - 127042, 9470, 6944, 127540, 0, 69680, 2828, 0, 531, 42638, 0, 0, 0, - 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, 19936, - 7833, 120691, 0, 42599, 42597, 42709, 120409, 127044, 0, 8537, 0, 0, 0, - 0, 0, 41199, 10121, 2028, 0, 0, 69715, 0, 3062, 0, 74447, 12608, 0, - 66440, 7545, 9700, 12580, 0, 120777, 120502, 41155, 0, 74071, 0, 0, - 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040, 64594, 2456, 231, 0, 74167, - 542, 0, 118786, 0, 0, 1230, 0, 0, 3597, 4446, 10584, 74235, 92215, 4037, - 127938, 8352, 0, 5687, 0, 64515, 0, 194801, 55265, 67846, 78434, 9704, 0, - 0, 74284, 128285, 0, 8660, 0, 0, 0, 78773, 74482, 4483, 1709, 69721, - 9909, 6080, 0, 120358, 1746, 1315, 8667, 0, 0, 13140, 65899, 10604, 0, - 4480, 11266, 128152, 1226, 6930, 0, 0, 6360, 10897, 41230, 605, 0, 74785, - 120356, 0, 0, 41500, 0, 311, 11453, 6221, 10608, 64943, 74280, 10877, - 118868, 64885, 74272, 0, 0, 0, 120736, 74312, 345, 0, 74456, 64606, 9917, - 0, 92231, 5037, 0, 1776, 8422, 0, 118814, 41508, 41201, 323, 43328, 0, - 42698, 1295, 0, 4625, 0, 4630, 13117, 0, 128772, 65123, 11293, 2668, - 11288, 0, 42640, 65666, 2519, 92369, 65420, 92479, 0, 4252, 5049, 42659, - 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, 66702, 0, - 12670, 1013, 0, 64919, 705, 0, 65422, 127803, 1183, 0, 7017, 42852, 0, - 8157, 9736, 64503, 65418, 0, 0, 74035, 0, 11913, 73874, 6696, 0, 8920, 0, - 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, 1857, 0, - 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, 119173, 0, 0, - 7805, 0, 0, 6935, 92292, 78325, 78326, 78323, 43327, 43989, 119046, 8492, - 8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543, 78335, 78332, 77832, - 65849, 77831, 0, 0, 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0, - 195062, 9949, 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, - 120617, 74397, 41468, 0, 0, 5292, 55272, 0, 1939, 5302, 3970, 917879, - 12455, 1793, 0, 0, 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, - 0, 13219, 9569, 0, 74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0, - 78340, 43631, 5324, 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, - 3360, 78344, 11523, 0, 92488, 9926, 7197, 0, 68429, 42894, 41821, 1249, - 78360, 78361, 78356, 78358, 78353, 64899, 64763, 41149, 41807, 43162, - 41815, 41150, 0, 10571, 10096, 0, 0, 78074, 6947, 41152, 887, 9249, 6565, - 78510, 41990, 78509, 41811, 74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0, - 10168, 0, 9781, 128655, 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, - 127383, 315, 12813, 0, 78432, 78256, 78351, 78352, 0, 0, 0, 0, 1378, - 9509, 0, 0, 74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379, - 194616, 41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366, - 42088, 0, 195061, 7176, 128833, 10137, 6121, 10995, 78259, 74534, 8119, - 64874, 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0, - 74515, 0, 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, - 119100, 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657, - 194600, 0, 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, - 65080, 0, 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366, - 42790, 42006, 0, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, - 65335, 65334, 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, - 118885, 42073, 6785, 64590, 0, 4371, 7196, 65318, 2035, 65316, 4106, - 65314, 65313, 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533, - 78459, 7189, 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695, - 127752, 0, 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762, - 66455, 64738, 3219, 68654, 0, 0, 1037, 0, 2025, 128263, 13098, 78442, - 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, - 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 92327, 0, 0, 120593, - 13071, 0, 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, - 64703, 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, - 0, 42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065, - 5323, 8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, - 127295, 8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300, - 92296, 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, - 11403, 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 0, 0, 0, - 64857, 128105, 2855, 127828, 66308, 41621, 68214, 127283, 127817, 10654, - 0, 119226, 12164, 3246, 7906, 43972, 65847, 7182, 0, 13024, 194822, - 74270, 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466, 0, - 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0, 64634, - 128279, 0, 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, 5286, - 119297, 0, 0, 64925, 120283, 194584, 118982, 194583, 7705, 11942, 11305, - 194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, 0, - 66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491, - 66010, 119552, 6078, 9954, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062, - 0, 0, 3256, 128640, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0, 0, - 127762, 10562, 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635, - 64337, 0, 0, 0, 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613, - 77909, 92420, 73997, 0, 0, 119218, 7984, 8600, 74434, 127770, 4176, 0, - 2034, 92551, 120805, 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649, - 13149, 42145, 42798, 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402, - 42146, 120134, 74238, 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812, - 65379, 68386, 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0, 41680, 0, - 128203, 11534, 1514, 11668, 67891, 9313, 7015, 0, 67877, 0, 12989, 66474, - 9368, 12848, 1624, 43270, 0, 194563, 10818, 128207, 9953, 0, 78421, 1194, - 3242, 9761, 9555, 8598, 120299, 6169, 12871, 1551, 2798, 65176, 4958, - 42752, 119025, 0, 67875, 120301, 3495, 66648, 194768, 0, 68364, 0, 4891, - 0, 10641, 0, 73746, 0, 68352, 0, 73787, 0, 194633, 7199, 64955, 0, 0, 0, - 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0, 5271, 92318, 92517, 118882, - 1362, 13297, 0, 128094, 0, 0, 73789, 0, 6658, 4426, 0, 92628, 0, 92319, - 7276, 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, 0, 127977, 0, 0, - 3223, 65492, 1284, 194771, 4549, 0, 0, 0, 127763, 10807, 9558, 194613, 0, - 8515, 8688, 12866, 0, 3294, 0, 8529, 128101, 43385, 7564, 0, 43329, 0, - 92458, 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198, - 3215, 0, 7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, - 66354, 1501, 0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, - 7476, 74399, 0, 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, - 92571, 0, 0, 10414, 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, - 6805, 8631, 2545, 120672, 127166, 0, 74190, 0, 0, 0, 42762, 0, 42914, - 1650, 262, 1637, 0, 7901, 3238, 128173, 41861, 0, 0, 65158, 10860, 0, - 43658, 7527, 0, 43319, 6419, 0, 45, 0, 64588, 0, 0, 119810, 7194, 5291, - 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620, - 0, 0, 0, 0, 179, 65896, 0, 64756, 2853, 78443, 118813, 0, 118996, 119009, - 2850, 8084, 0, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, - 119843, 119842, 10398, 0, 0, 8377, 127116, 8245, 68401, 3158, 92396, - 3983, 43656, 923, 119857, 119856, 292, 13002, 119845, 119844, 3221, 1763, - 92463, 4612, 119851, 119850, 7253, 127110, 68391, 0, 10782, 3637, 12996, - 43542, 0, 64578, 0, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, - 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, 0, - 64500, 43674, 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, 74775, 0, - 0, 92389, 74072, 55269, 0, 0, 0, 2033, 78577, 78576, 195026, 55254, 7740, - 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, 74006, 64909, 6646, - 11790, 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, 7230, - 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, 73903, - 66721, 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, 10723, 967, - 0, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 43526, 0, 0, 1886, 42342, 10089, - 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879, 43692, - 4563, 0, 0, 7591, 65887, 867, 9520, 872, 0, 868, 873, 7642, 0, 869, 874, - 7644, 0, 875, 790, 128303, 0, 0, 0, 66182, 0, 5429, 0, 66180, 0, 66181, - 68452, 0, 0, 42067, 0, 5433, 10657, 7911, 194622, 1547, 66176, 42012, - 120576, 5425, 4977, 9999, 5317, 5423, 4611, 0, 67637, 0, 9679, 74122, 0, - 0, 0, 66194, 4418, 66184, 4628, 4245, 119648, 0, 0, 1851, 0, 127189, - 11908, 0, 9360, 118897, 0, 42776, 66187, 12837, 8829, 7711, 92714, 0, - 92321, 43318, 0, 8809, 119974, 0, 0, 120604, 0, 0, 0, 0, 0, 0, 7427, - 9958, 4588, 43680, 0, 74484, 0, 2433, 0, 119622, 3352, 74363, 0, 0, 793, - 74404, 0, 305, 567, 67662, 842, 128519, 8208, 0, 41695, 1647, 118877, 0, - 7837, 917625, 818, 5337, 917622, 917621, 41376, 119978, 917618, 120594, - 74086, 917615, 917614, 917613, 10973, 66359, 1372, 127172, 917608, 4969, - 1254, 917605, 917604, 917603, 917602, 65228, 78221, 0, 0, 2840, 0, - 119982, 0, 0, 3245, 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 128528, 0, - 917611, 127026, 128883, 0, 0, 43648, 120812, 0, 43322, 92662, 0, 0, - 64372, 92698, 3226, 655, 752, 7457, 7456, 7452, 3285, 128779, 127821, - 119988, 65610, 2391, 0, 92248, 671, 250, 7434, 618, 668, 610, 42800, - 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 0, 128266, - 64749, 67850, 2107, 0, 0, 4605, 128174, 0, 43372, 65945, 128838, 0, - 119590, 0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0, - 128297, 0, 0, 0, 0, 11334, 43326, 12609, 11519, 11503, 5530, 5210, 0, - 4627, 0, 5208, 0, 128842, 10332, 5218, 7976, 9156, 0, 3244, 5529, 69647, - 73894, 128852, 5432, 64965, 5527, 74033, 10516, 7790, 5528, 0, 42140, - 120281, 0, 0, 43545, 9887, 0, 4000, 7429, 7428, 665, 7424, 3206, 120278, - 7884, 0, 128566, 917989, 128666, 211, 2509, 0, 120573, 68672, 3220, - 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, 4590, 127258, 5852, 0, - 0, 127259, 1708, 0, 0, 2623, 11943, 0, 69226, 0, 4698, 66509, 1066, - 119921, 4701, 0, 120285, 74225, 119114, 8267, 0, 127265, 0, 7516, 0, - 2625, 0, 8034, 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, 0, 43384, - 12660, 0, 0, 0, 74850, 41069, 0, 128156, 12099, 4310, 10032, 6252, 713, - 7990, 0, 3990, 0, 0, 66368, 5017, 64956, 7071, 0, 119144, 1030, 118800, - 0, 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, - 94, 1880, 74766, 0, 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, 0, - 41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 0, 64785, 7394, 3641, 5419, - 128055, 0, 127883, 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, - 936, 13289, 127521, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 119108, - 0, 12913, 74206, 7529, 0, 0, 0, 120782, 4113, 0, 2372, 336, 0, 7509, - 12152, 0, 682, 66458, 41505, 0, 64743, 10593, 1703, 0, 0, 8033, 0, 0, - 9810, 127269, 0, 12970, 0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0, - 74291, 1965, 7069, 43312, 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0, - 0, 74239, 41317, 92614, 2091, 74545, 2090, 0, 9353, 7117, 2077, 77886, 0, - 10498, 2083, 77888, 0, 0, 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, - 9654, 12856, 6924, 0, 7066, 0, 0, 128135, 41037, 42692, 7786, 12959, + 10477, 0, 8636, 983659, 8315, 65444, 983528, 0, 74595, 6152, 0, 0, 6629, + 128251, 120171, 0, 74589, 43993, 0, 69790, 64435, 0, 43690, 11046, 11490, + 42730, 4485, 127107, 0, 64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, + 3588, 0, 12825, 0, 0, 12725, 0, 0, 78642, 223, 0, 69675, 120166, 42444, + 0, 64499, 65245, 0, 1171, 0, 69717, 0, 1805, 8772, 43820, 0, 9930, 65247, + 78619, 120111, 2338, 0, 118853, 0, 42676, 0, 64800, 65236, 67644, 68126, + 1213, 0, 64075, 797, 64074, 8734, 4212, 0, 64387, 4115, 0, 5005, 64070, + 64073, 10679, 0, 77954, 9402, 64276, 426, 0, 0, 8251, 10136, 65436, 0, + 2120, 43302, 1224, 0, 65576, 120158, 10701, 1764, 3101, 127815, 12858, + 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, + 9222, 983473, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, + 0, 0, 1293, 7947, 2132, 983502, 74593, 120308, 2454, 42717, 3613, 128837, + 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, 43087, 12595, 120304, 0, + 8822, 0, 1157, 64903, 8638, 0, 0, 0, 0, 120319, 8235, 120316, 4405, + 10086, 120247, 0, 69216, 0, 65430, 74013, 6079, 6817, 10764, 127910, + 64291, 128051, 998, 120312, 11062, 1317, 64327, 1558, 0, 1991, 7882, + 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, 43076, 4692, + 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, 983416, 66373, + 0, 0, 64908, 92691, 6311, 0, 12004, 119192, 12049, 43108, 120326, 0, + 41705, 92188, 6598, 0, 6599, 120334, 0, 42148, 118825, 66027, 0, 6597, + 9412, 8340, 11824, 64745, 0, 0, 0, 1988, 5407, 67865, 2430, 41678, 0, + 120243, 2336, 983638, 0, 78871, 120442, 983504, 1921, 10947, 19927, 0, + 65406, 0, 19913, 4284, 13217, 0, 43789, 12841, 9229, 10956, 42285, 41674, + 19964, 41679, 65084, 3521, 0, 5774, 8325, 0, 65403, 0, 1854, 10794, 0, + 67660, 0, 0, 78359, 5280, 0, 4344, 12905, 65433, 6076, 64793, 41610, 768, + 12074, 442, 0, 68162, 64081, 12934, 41682, 65432, 41693, 0, 6071, 65434, + 127467, 4804, 4053, 0, 127469, 194653, 41696, 467, 69823, 127463, 69797, + 0, 0, 8421, 127472, 69682, 43705, 502, 0, 65431, 119056, 0, 12043, 1303, + 316, 92462, 2029, 2136, 119246, 11533, 64365, 43480, 92639, 4860, 194645, + 127877, 42488, 0, 9583, 128849, 5546, 8019, 73856, 0, 0, 0, 5544, 2355, + 12150, 65725, 5543, 77989, 63751, 12137, 5548, 77985, 0, 65727, 68388, + 65726, 6077, 128352, 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, + 0, 1319, 3050, 65410, 0, 0, 78016, 78017, 42830, 43996, 66716, 128137, + 4691, 92242, 9345, 621, 92709, 128222, 0, 65411, 0, 41182, 73881, 65408, + 73899, 78024, 9474, 10545, 119118, 10887, 3786, 65409, 8894, 43179, + 119611, 7923, 3716, 92363, 9996, 8508, 0, 7012, 8195, 127834, 9566, 0, + 3722, 0, 41707, 8493, 545, 9575, 41379, 10050, 12718, 0, 8859, 6820, + 74345, 65110, 120740, 0, 0, 9119, 2787, 7920, 118823, 4021, 2012, 7985, + 0, 119663, 0, 0, 78021, 78022, 410, 78020, 1802, 78018, 74107, 0, 41659, + 41671, 1827, 0, 64396, 10126, 12116, 41673, 120370, 11422, 78141, 120373, + 3860, 120367, 68412, 41345, 120362, 120363, 11748, 42158, 7941, 11076, + 8749, 120361, 2104, 64858, 361, 120357, 845, 0, 41560, 11970, 4562, + 917920, 2926, 917919, 4569, 74130, 0, 43487, 194630, 611, 74129, 64871, + 118891, 65629, 0, 194858, 0, 0, 127545, 120543, 0, 0, 6291, 0, 78639, + 41669, 7094, 917921, 0, 0, 74054, 127754, 195029, 0, 839, 0, 7695, 8769, + 65246, 4829, 0, 4859, 64467, 0, 983695, 118998, 7206, 0, 6647, 43986, 0, + 69766, 0, 64764, 4210, 983598, 127936, 804, 0, 0, 12298, 0, 66653, 0, + 64924, 10091, 73931, 9468, 74245, 0, 0, 74246, 92503, 12839, 64669, + 92202, 0, 1279, 1425, 6224, 119229, 11049, 0, 92697, 43239, 8482, 92440, + 0, 5032, 69677, 11940, 67888, 664, 120437, 5034, 0, 0, 127525, 42702, + 73888, 0, 13294, 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, 120819, + 68387, 120168, 73913, 120170, 41161, 5518, 4174, 10993, 41162, 120160, + 64528, 1169, 434, 41437, 1905, 6034, 41164, 64744, 9528, 118867, 128800, + 524, 0, 74029, 788, 74027, 0, 194638, 0, 1663, 10419, 74025, 42636, 0, + 69725, 0, 120656, 0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, 0, + 119107, 43612, 64344, 0, 0, 10855, 5445, 9355, 0, 65198, 7391, 8989, 221, + 65686, 0, 0, 8010, 7191, 4962, 69772, 8855, 0, 0, 64469, 120426, 10555, + 0, 43333, 92299, 0, 120427, 10451, 0, 67653, 7245, 12443, 74405, 9947, + 120149, 78317, 3873, 8367, 0, 120146, 43433, 43649, 11987, 0, 0, 11010, + 12723, 74059, 74062, 6217, 5896, 0, 7682, 74049, 1462, 10235, 0, 0, 0, 0, + 0, 0, 42595, 0, 74402, 118860, 0, 120419, 92497, 74052, 0, 0, 120549, + 119082, 64295, 120418, 0, 64765, 73923, 120417, 120662, 120730, 194702, + 6216, 0, 10755, 9455, 0, 8124, 127042, 9470, 6944, 127540, 0, 69680, + 2828, 0, 531, 42638, 0, 0, 0, 43428, 8204, 3614, 2827, 9696, 0, 0, 8728, + 4354, 10904, 78562, 19936, 7833, 120691, 0, 42599, 42597, 42709, 120409, + 127044, 0, 8537, 0, 0, 0, 0, 0, 41199, 10121, 2028, 0, 0, 69715, 0, 3062, + 0, 74447, 12608, 0, 66440, 7545, 9700, 12580, 0, 120777, 120502, 41155, + 0, 74071, 0, 0, 12713, 0, 0, 0, 78772, 0, 1734, 0, 0, 127040, 64594, + 2456, 231, 0, 74167, 542, 0, 118786, 0, 983711, 1230, 0, 0, 3597, 4446, + 10584, 74235, 92215, 4037, 127938, 8352, 0, 5687, 0, 64515, 0, 194801, + 55265, 67846, 78434, 9704, 0, 0, 74284, 128285, 0, 8660, 0, 0, 0, 78773, + 74482, 4483, 1709, 69721, 9909, 6080, 0, 120358, 1746, 1315, 8667, 0, 0, + 13140, 65899, 10604, 0, 4480, 11266, 128152, 1226, 6930, 0, 0, 6360, + 10897, 41230, 605, 0, 74785, 120356, 0, 0, 41500, 0, 311, 11453, 6221, + 10608, 64943, 74280, 10877, 118868, 64885, 74272, 0, 0, 0, 120736, 74312, + 345, 0, 74456, 64606, 9917, 0, 92231, 5037, 0, 1776, 8422, 0, 118814, + 41508, 41201, 323, 43328, 0, 42698, 1295, 0, 4625, 0, 4630, 13117, 0, + 128772, 65123, 11293, 2668, 11288, 0, 42640, 65666, 2519, 92369, 65420, + 92479, 0, 4252, 5049, 42659, 119011, 706, 7754, 10854, 8738, 0, 65419, 0, + 0, 649, 65421, 0, 66702, 0, 12670, 1013, 0, 64919, 705, 0, 65422, 127803, + 1183, 0, 7017, 42852, 0, 8157, 9736, 64503, 65418, 0, 983613, 74035, 0, + 11913, 73874, 6696, 0, 8920, 0, 0, 7962, 12211, 9837, 2051, 66227, 0, + 4184, 0, 0, 10177, 73777, 1857, 0, 4626, 8464, 8472, 0, 4629, 8499, + 78321, 78322, 4624, 7818, 119173, 0, 0, 7805, 0, 0, 6935, 92292, 78325, + 78326, 78323, 43327, 43989, 119046, 8492, 8250, 8459, 0, 8497, 8496, 0, + 0, 78336, 78339, 9543, 78335, 78332, 77832, 65849, 77831, 983693, 0, + 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0, 195062, 9949, 119826, + 43617, 119215, 0, 12073, 0, 0, 77863, 13108, 120617, 74397, 41468, + 983492, 0, 5292, 55272, 0, 1939, 5302, 3970, 917879, 12455, 1793, 0, 0, + 0, 6643, 92477, 65263, 0, 78330, 41293, 78328, 65923, 0, 13219, 9569, 0, + 74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0, 78340, 43631, 5324, + 66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, 3360, 78344, 11523, + 0, 92488, 9926, 7197, 0, 68429, 42894, 41821, 1249, 78360, 78361, 78356, + 78358, 78353, 64899, 64763, 41149, 41807, 43162, 41815, 41150, 0, 10571, + 10096, 0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, + 41811, 74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, + 128655, 9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 127383, 315, + 12813, 0, 78432, 78256, 78351, 78352, 0, 983392, 0, 0, 1378, 9509, 0, 0, + 74475, 3066, 92220, 67847, 0, 92355, 0, 78365, 8787, 120379, 194616, + 41618, 194615, 78261, 194614, 0, 64652, 0, 194612, 0, 78366, 42088, 0, + 195061, 7176, 128833, 10137, 6121, 10995, 78259, 74534, 8119, 64874, + 917816, 127199, 194939, 0, 74525, 0, 0, 12930, 1394, 74514, 0, 74515, 0, + 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, 119100, + 41236, 92235, 42005, 42003, 41237, 5848, 0, 0, 3670, 128657, 194600, 0, + 0, 7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, 65080, 0, + 128002, 4120, 65337, 65336, 0, 11808, 119214, 74115, 9366, 42790, 42006, + 0, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, 65334, + 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, 118885, 42073, + 6785, 64590, 983565, 4371, 7196, 65318, 2035, 65316, 4106, 65314, 65313, + 42074, 127847, 41228, 0, 65609, 41241, 7903, 41239, 43533, 78459, 7189, + 0, 0, 0, 12357, 42802, 78450, 8487, 9131, 0, 4615, 12695, 127752, 0, + 12175, 0, 64535, 0, 7809, 0, 0, 562, 12169, 6590, 69762, 66455, 64738, + 3219, 68654, 983522, 0, 1037, 0, 2025, 128263, 13098, 78442, 10637, 4568, + 549, 1570, 0, 2835, 0, 10624, 43623, 11072, 127191, 0, 0, 12606, 78433, + 2825, 0, 10825, 8079, 2821, 41046, 92327, 0, 983488, 120593, 13071, 0, + 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, 5212, 0, 64703, + 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, 0, 1187, 0, + 42628, 78575, 0, 128777, 0, 3240, 128518, 12194, 0, 11591, 41065, 5323, + 8166, 0, 0, 0, 74535, 1623, 65297, 128856, 571, 0, 4918, 0, 5288, 127295, + 8916, 65048, 1909, 8864, 0, 0, 10736, 92508, 11571, 7615, 127300, 92296, + 4237, 92576, 1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, 11403, + 0, 0, 127146, 3796, 6800, 0, 3994, 11421, 0, 195076, 0, 0, 0, 0, 64857, + 128105, 2855, 127828, 66308, 41621, 68214, 127283, 127817, 10654, 0, + 119226, 12164, 3246, 7906, 43972, 65847, 7182, 0, 13024, 194822, 74270, + 128289, 0, 0, 0, 1496, 747, 0, 942, 2378, 43136, 127905, 8466, 0, 9320, + 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, 6382, 0, 64634, 128279, 0, + 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, 5286, 119297, 0, 0, + 64925, 120283, 194584, 118982, 194583, 7705, 11942, 11305, 194581, 3309, + 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, 0, 66615, 42565, + 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491, 66010, 119552, + 6078, 9954, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062, 0, 0, 3256, + 128640, 42076, 43252, 78823, 917906, 8727, 0, 65875, 0, 0, 127762, 10562, + 74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635, 64337, 0, 0, 0, + 7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613, 77909, 92420, 73997, + 0, 0, 119218, 7984, 8600, 74434, 127770, 4176, 0, 2034, 92551, 120805, + 65891, 127038, 0, 318, 2038, 128860, 78596, 0, 3649, 13149, 42145, 42798, + 3634, 120291, 118927, 67677, 120124, 7866, 0, 11402, 42146, 120134, + 74238, 42664, 2849, 127034, 0, 7938, 12960, 1761, 11812, 65379, 68386, + 128185, 1159, 0, 69729, 0, 0, 7178, 194632, 0, 41680, 0, 128203, 11534, + 1514, 11668, 67891, 9313, 7015, 0, 67877, 0, 12989, 66474, 9368, 12848, + 1624, 43270, 0, 194563, 10818, 128207, 9953, 0, 78421, 1194, 3242, 9761, + 9555, 8598, 120299, 6169, 12871, 1551, 2798, 65176, 4958, 42752, 119025, + 0, 67875, 120301, 3495, 66648, 194768, 0, 68364, 0, 4891, 0, 10641, 0, + 73746, 0, 68352, 0, 73787, 0, 194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, + 42679, 193, 0, 0, 0, 42667, 0, 5271, 92318, 92517, 118882, 1362, 13297, + 0, 128094, 0, 0, 73789, 0, 6658, 4426, 0, 92628, 983577, 92319, 7276, + 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, 0, 127977, 0, 0, 3223, + 65492, 1284, 194771, 4549, 0, 0, 0, 127763, 10807, 9558, 194613, 0, 8515, + 8688, 12866, 0, 3294, 0, 8529, 128101, 43385, 7564, 0, 43329, 0, 92458, + 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 92198, 3215, 0, + 7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, 66354, 1501, + 0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, 7476, 74399, 0, + 0, 7152, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, 92571, 0, 0, 10414, + 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, 6805, 8631, 2545, + 120672, 127166, 0, 74190, 0, 0, 983521, 42762, 0, 42914, 1650, 262, 1637, + 0, 7901, 3238, 128173, 41861, 0, 0, 65158, 10860, 983575, 43658, 7527, 0, + 43319, 6419, 0, 45, 0, 64588, 0, 0, 119810, 7194, 5291, 0, 43666, 13129, + 0, 9084, 0, 8737, 0, 12881, 0, 12906, 9639, 7912, 2620, 0, 0, 0, 0, 179, + 65896, 0, 64756, 2853, 78443, 118813, 983625, 118996, 119009, 2850, 8084, + 0, 73850, 2801, 92284, 42069, 119839, 74754, 119841, 42072, 119843, + 119842, 10398, 0, 0, 8377, 127116, 8245, 68401, 3158, 92396, 3983, 43656, + 923, 119857, 119856, 292, 13002, 119845, 119844, 3221, 1763, 92463, 4612, + 119851, 119850, 7253, 127110, 68391, 0, 10782, 3637, 12996, 43542, 0, + 64578, 0, 3228, 69636, 8783, 0, 119614, 2731, 0, 0, 78585, 4102, 7696, + 73878, 0, 0, 78586, 43316, 4177, 11283, 9089, 0, 73996, 0, 64500, 43674, + 0, 64947, 1856, 0, 0, 6379, 0, 0, 0, 3208, 12975, 74775, 0, 983663, + 92389, 74072, 55269, 0, 0, 983418, 2033, 78577, 78576, 195026, 55254, + 7740, 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, 74006, 64909, + 6646, 11790, 74019, 0, 128066, 128031, 8561, 4573, 0, 5326, 0, 120605, + 7230, 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, 65092, + 73903, 66721, 11342, 128561, 0, 0, 128226, 127001, 0, 11810, 13164, + 10723, 967, 983683, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 43526, 0, 0, + 1886, 42342, 10089, 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, + 42015, 879, 43692, 4563, 0, 0, 7591, 65887, 867, 9520, 872, 983614, 868, + 873, 7642, 0, 869, 874, 7644, 983610, 875, 790, 128303, 0, 0, 0, 66182, + 0, 5429, 0, 66180, 0, 66181, 68452, 0, 0, 42067, 0, 5433, 10657, 7911, + 194622, 1547, 66176, 42012, 120576, 5425, 4977, 9999, 5317, 5423, 4611, + 0, 67637, 0, 9679, 74122, 0, 0, 0, 66194, 4418, 66184, 4628, 4245, + 119648, 0, 0, 1851, 0, 127189, 11908, 0, 9360, 118897, 983530, 42776, + 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809, 119974, 0, 0, + 120604, 0, 983617, 0, 0, 0, 0, 7427, 9958, 4588, 43680, 0, 74484, 0, + 2433, 0, 119622, 3352, 74363, 983620, 0, 793, 74404, 0, 305, 567, 67662, + 842, 128519, 8208, 0, 41695, 1647, 118877, 0, 7837, 917625, 818, 5337, + 917622, 917621, 41376, 119978, 917618, 120594, 74086, 917615, 917614, + 917613, 10973, 66359, 1372, 127172, 917608, 4969, 1254, 917605, 917604, + 917603, 917602, 65228, 78221, 0, 0, 2840, 0, 119982, 983671, 0, 3245, + 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 128528, 983619, 917611, 127026, + 128883, 0, 0, 43648, 120812, 0, 43322, 92662, 0, 0, 64372, 92698, 3226, + 655, 752, 7457, 7456, 7452, 3285, 128779, 127821, 119988, 65610, 2391, 0, + 92248, 671, 250, 7434, 618, 668, 610, 42800, 7431, 1152, 42801, 640, + 120666, 7448, 7439, 628, 3905, 73810, 0, 128266, 64749, 67850, 2107, 0, + 0, 4605, 128174, 0, 43372, 65945, 128838, 0, 119590, 0, 0, 0, 987, 6927, + 11572, 42261, 11464, 3365, 9971, 0, 0, 128297, 0, 0, 0, 0, 11334, 43326, + 12609, 11519, 11503, 5530, 5210, 0, 4627, 983627, 5208, 0, 128842, 10332, + 5218, 7976, 9156, 0, 3244, 5529, 69647, 73894, 128852, 5432, 64965, 5527, + 74033, 10516, 7790, 5528, 0, 42140, 120281, 0, 0, 43545, 9887, 0, 4000, + 7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 128566, 917989, 128666, + 211, 2509, 0, 120573, 68672, 3220, 42235, 0, 10690, 8951, 5214, 42474, + 8118, 0, 7048, 4590, 127258, 5852, 0, 0, 127259, 1708, 0, 0, 2623, 11943, + 0, 69226, 0, 4698, 66509, 1066, 119921, 4701, 983611, 120285, 74225, + 119114, 8267, 0, 127265, 0, 7516, 0, 2625, 983709, 8034, 74309, 0, 3631, + 10955, 7850, 120293, 8416, 0, 0, 0, 43384, 12660, 0, 0, 0, 74850, 41069, + 0, 128156, 12099, 4310, 10032, 6252, 713, 7990, 0, 3990, 0, 0, 66368, + 5017, 64956, 7071, 0, 119144, 1030, 118800, 0, 9513, 41059, 9357, 0, + 1773, 0, 120350, 0, 6339, 7745, 9844, 0, 64650, 94, 1880, 74766, 983573, + 8908, 0, 128707, 65913, 78470, 10752, 13003, 0, 0, 41307, 8732, 120338, + 0, 1757, 6964, 4696, 0, 0, 64785, 7394, 3641, 5419, 128055, 0, 127883, 0, + 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, 936, 13289, 127521, + 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 119108, 0, 12913, 74206, + 7529, 0, 0, 983689, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, 682, + 66458, 41505, 0, 64743, 10593, 1703, 0, 983687, 8033, 0, 0, 9810, 127269, + 0, 12970, 0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0, 74291, 1965, + 7069, 43312, 0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0, 0, 74239, + 41317, 92614, 2091, 74545, 2090, 0, 9353, 7117, 2077, 77886, 0, 10498, + 2083, 77888, 0, 0, 119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, 9654, + 12856, 6924, 0, 7066, 983454, 0, 128135, 41037, 42692, 7786, 12959, 41039, 0, 0, 680, 6274, 128200, 1181, 7056, 3174, 0, 0, 92668, 65665, 127375, 0, 6920, 0, 92295, 0, 118965, 0, 64644, 126981, 0, 0, 41028, 0, - 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, 0, 0, 40987, 4667, 0, - 0, 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, 4744, 0, - 12702, 242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, 74505, 43274, - 5313, 951, 0, 0, 0, 7604, 0, 4009, 127816, 0, 120562, 0, 0, 64860, - 119138, 119069, 0, 127370, 4048, 0, 0, 120596, 1646, 77890, 64534, 73995, - 120705, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, - 2975, 74442, 9822, 0, 55220, 10084, 73943, 118840, 0, 917562, 0, 3399, - 9851, 0, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 0, 0, 0, 1777, 9151, - 1137, 69767, 749, 42366, 0, 5385, 128574, 128218, 0, 0, 5989, 0, 0, - 128091, 0, 41685, 69223, 0, 9769, 41684, 0, 519, 0, 11740, 5766, 0, 0, - 2600, 8848, 120138, 41297, 0, 3666, 74473, 41300, 74468, 65160, 0, 69688, - 69771, 74479, 0, 6558, 0, 0, 69765, 120750, 252, 0, 41302, 0, 0, 0, - 69763, 0, 11729, 8719, 9060, 0, 120139, 10761, 0, 0, 0, 118792, 11734, 0, - 11730, 0, 9593, 5757, 2403, 64808, 55275, 0, 11728, 43572, 0, 0, 7764, 0, - 11094, 120825, 0, 0, 4282, 8298, 0, 0, 0, 0, 0, 64449, 0, 127509, 63854, - 8456, 0, 74783, 65670, 0, 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, - 120764, 0, 10019, 74762, 0, 3458, 4365, 0, 0, 3647, 0, 2602, 128341, 0, - 194707, 41135, 0, 0, 0, 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, - 0, 92193, 7597, 10528, 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, - 9062, 119252, 0, 0, 0, 64479, 9232, 92596, 0, 0, 194712, 10900, 41531, - 1263, 3720, 12048, 0, 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354, - 127345, 299, 0, 8525, 127347, 3524, 917565, 8831, 127349, 92564, 3075, - 67867, 127352, 0, 66362, 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200, - 65114, 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680, - 7204, 0, 2588, 2914, 7011, 55281, 0, 2471, 194631, 2883, 2749, 119563, - 73774, 10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, - 10928, 0, 41153, 41229, 118967, 0, 3738, 127369, 0, 12711, 3181, 66212, - 74289, 68472, 42857, 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, - 0, 0, 64674, 0, 0, 73846, 2934, 12722, 120762, 922, 43983, 74507, 0, - 74461, 3218, 120471, 74290, 120469, 64562, 120475, 8569, 11404, 11932, - 73728, 3214, 120461, 120468, 12128, 3207, 65486, 78729, 1901, 78727, - 127326, 120460, 7425, 3205, 0, 78737, 78736, 78735, 43383, 78733, 65459, - 2606, 78730, 73897, 0, 11496, 1173, 0, 41272, 119661, 0, 0, 0, 120737, 0, - 0, 0, 378, 2610, 0, 65079, 0, 65695, 0, 37, 7068, 0, 120480, 120479, - 3209, 120477, 0, 10638, 9768, 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 0, - 5233, 0, 64792, 0, 0, 0, 0, 7060, 9847, 120144, 1685, 595, 0, 73971, - 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243, 9014, - 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 0, 8203, 78488, 0, 8458, - 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, 2465, 0, 8193, 55279, - 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0, 92414, 8982, 0, 0, 0, - 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548, 68650, 0, 1832, 5604, - 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 0, 3869, - 11937, 5725, 127539, 1783, 68648, 5728, 0, 0, 0, 11918, 66567, 5724, 0, - 5727, 78521, 0, 0, 764, 0, 128116, 43531, 0, 9033, 0, 42532, 6223, 11042, + 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, 983310, 0, 40987, 4667, + 0, 983664, 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 92675, 0, 921, + 4744, 0, 12702, 242, 0, 1566, 8217, 0, 64653, 78386, 128121, 74036, + 74505, 43274, 5313, 951, 0, 0, 983602, 7604, 0, 4009, 127816, 983445, + 120562, 0, 983455, 64860, 119138, 119069, 0, 127370, 4048, 983342, 0, + 120596, 1646, 77890, 64534, 73995, 120705, 0, 119890, 2579, 119905, 3177, + 11357, 9099, 4107, 3441, 119894, 2975, 74442, 9822, 983667, 55220, 10084, + 73943, 118840, 0, 917562, 0, 3399, 9851, 983452, 11909, 9059, 0, 7687, 0, + 6789, 0, 0, 0, 0, 0, 0, 1777, 9151, 1137, 69767, 749, 42366, 0, 5385, + 128574, 128218, 0, 0, 5989, 0, 0, 128091, 0, 41685, 69223, 0, 9769, + 41684, 0, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, 41297, 0, 3666, + 74473, 41300, 74468, 65160, 0, 69688, 69771, 74479, 0, 6558, 0, 0, 69765, + 120750, 252, 0, 41302, 0, 0, 0, 69763, 0, 11729, 8719, 9060, 0, 120139, + 10761, 0, 0, 0, 118792, 11734, 0, 11730, 0, 9593, 5757, 2403, 64808, + 55275, 0, 11728, 43572, 0, 0, 7764, 983449, 11094, 120825, 0, 0, 4282, + 8298, 0, 0, 0, 0, 0, 64449, 0, 127509, 63854, 8456, 0, 74783, 65670, 0, + 78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, + 3458, 4365, 0, 983447, 3647, 0, 2602, 128341, 0, 194707, 41135, 0, 0, 0, + 64631, 172, 4971, 41219, 41137, 1889, 7238, 6545, 0, 92193, 7597, 10528, + 0, 0, 3732, 73910, 194588, 5344, 0, 43366, 43363, 9062, 119252, 0, 0, 0, + 64479, 9232, 92596, 0, 0, 194712, 10900, 41531, 1263, 3720, 12048, 0, + 64292, 41524, 7227, 119635, 6099, 41534, 0, 127354, 127345, 299, 0, 8525, + 127347, 3524, 917565, 8831, 127349, 92564, 3075, 67867, 127352, 0, 66362, + 0, 64353, 0, 0, 5845, 0, 0, 0, 2581, 8200, 65114, 68460, 0, 43283, 5551, + 0, 120735, 0, 6340, 118855, 0, 78134, 8680, 7204, 0, 2588, 2914, 7011, + 55281, 0, 2471, 194631, 2883, 2749, 119563, 73774, 10913, 0, 0, 8666, + 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, 10928, 0, 41153, 41229, + 118967, 0, 3738, 127369, 0, 12711, 3181, 66212, 74289, 68472, 42857, + 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 64674, 0, 0, + 73846, 2934, 12722, 120762, 922, 43983, 74507, 0, 74461, 3218, 120471, + 74290, 120469, 64562, 120475, 8569, 11404, 11932, 73728, 3214, 120461, + 120468, 12128, 3207, 65486, 78729, 1901, 78727, 127326, 120460, 7425, + 3205, 0, 78737, 78736, 78735, 43383, 78733, 65459, 2606, 78730, 73897, 0, + 11496, 1173, 0, 41272, 119661, 0, 0, 0, 120737, 0, 983703, 0, 378, 2610, + 0, 65079, 983517, 65695, 0, 37, 7068, 0, 120480, 120479, 3209, 120477, 0, + 10638, 9768, 120481, 0, 0, 0, 0, 0, 0, 65510, 0, 0, 5233, 0, 64792, 0, 0, + 0, 0, 7060, 9847, 120144, 1685, 595, 0, 73971, 1292, 8940, 7380, 11088, + 0, 10004, 126997, 0, 6541, 0, 0, 0, 3243, 9014, 5606, 0, 538, 64620, + 5602, 8467, 74391, 6547, 983338, 8203, 78488, 0, 8458, 65211, 8495, + 119904, 0, 917552, 779, 78314, 64367, 2465, 0, 8193, 55279, 9730, 9280, + 0, 7065, 74155, 4346, 0, 73798, 504, 0, 92414, 8982, 0, 0, 0, 782, 0, + 10883, 0, 194852, 732, 3737, 127253, 1548, 68650, 0, 1832, 5604, 5735, + 41141, 119020, 4376, 0, 11787, 3745, 0, 0, 42888, 65712, 0, 3869, 11937, + 5725, 127539, 1783, 68648, 5728, 0, 0, 0, 11918, 66567, 5724, 0, 5727, + 78521, 0, 0, 764, 0, 128116, 43531, 0, 9033, 0, 42532, 6223, 11042, 120749, 11423, 0, 119861, 0, 43465, 0, 128267, 6559, 64557, 0, 0, 120648, 43019, 43477, 10238, 0, 0, 43377, 92282, 0, 1478, 9783, 11825, 2607, 64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 0, 41144, 0, 92438, @@ -18201,99 +18440,100 @@ 119650, 41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 0, 41216, 7844, 2616, 119190, 68461, 65234, 0, 13076, 3135, 0, 78143, 119139, 3142, 92451, 0, 10819, 119580, 10183, 0, 2608, 1470, 73967, 0, - 6227, 0, 0, 69741, 0, 6163, 0, 0, 127314, 0, 0, 8603, 0, 119866, 3306, - 10876, 43392, 119573, 127931, 5751, 0, 6222, 0, 0, 12086, 7403, 1600, - 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0, - 43110, 0, 1234, 6540, 6974, 0, 0, 0, 5002, 0, 41286, 0, 127019, 0, 43585, - 0, 6551, 0, 128229, 0, 41289, 0, 194602, 0, 8977, 602, 120814, 0, 128778, - 128661, 0, 0, 41279, 0, 0, 0, 11081, 43615, 0, 0, 0, 0, 12727, 0, 0, - 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, 7831, 0, 194571, 0, - 73915, 8076, 43048, 8290, 8291, 43051, 92570, 0, 2596, 43584, 0, 13113, - 0, 127757, 2393, 7058, 9087, 74067, 68673, 41574, 78337, 0, 74058, 6376, - 0, 0, 0, 0, 9854, 127748, 64696, 0, 128220, 0, 6994, 0, 1720, 0, 0, 0, - 6529, 7063, 0, 3751, 9120, 0, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, - 12430, 8137, 0, 92642, 0, 0, 245, 128097, 11456, 41233, 7070, 0, 0, 6136, - 917609, 65677, 8682, 41235, 92595, 42045, 9804, 0, 432, 3595, 0, 65437, - 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052, - 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, 0, 64640, 0, 119104, 0, - 74137, 0, 10063, 12652, 12199, 92480, 0, 2566, 11971, 0, 0, 1065, 0, 0, - 43400, 2576, 66696, 0, 0, 43604, 0, 0, 74082, 514, 74502, 0, 2921, 43215, - 64493, 5772, 12968, 0, 194944, 74580, 43398, 2580, 0, 41341, 41223, 6564, - 1463, 41342, 0, 5293, 0, 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0, - 13091, 0, 0, 0, 917915, 0, 127025, 0, 74821, 0, 0, 119042, 0, 127865, - 13090, 66643, 0, 1270, 1132, 42360, 0, 74096, 66655, 42569, 127824, 0, - 64761, 0, 41021, 8510, 42432, 0, 0, 0, 0, 64496, 74109, 0, 9915, 0, 0, - 7061, 41336, 3854, 69700, 13141, 68413, 43401, 42319, 13082, 0, 7067, - 68221, 0, 0, 127171, 0, 0, 127797, 9029, 43543, 119315, 2353, 6308, 0, - 74792, 2611, 119186, 0, 0, 0, 43664, 92399, 66627, 0, 4484, 8509, 118976, - 78116, 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0, - 12107, 44002, 10905, 65010, 194986, 697, 66018, 9284, 4244, 0, 0, 92644, - 13121, 120036, 0, 12010, 128573, 128221, 0, 0, 0, 127193, 65816, 68111, - 0, 127933, 65668, 92257, 6618, 118784, 66365, 0, 42234, 12648, 128039, - 7123, 0, 5785, 9198, 9764, 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, - 128258, 0, 0, 0, 13122, 0, 191, 74119, 8585, 8000, 64411, 120652, 42889, - 64850, 41072, 41578, 0, 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683, - 396, 41580, 68146, 0, 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0, - 4743, 0, 0, 74040, 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 92514, - 0, 3964, 6592, 0, 128693, 66040, 0, 42568, 69806, 0, 1778, 3956, 0, - 42070, 6563, 43075, 9018, 0, 0, 12067, 41312, 0, 5547, 74531, 127969, 0, - 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750, - 0, 4394, 68368, 1807, 0, 92298, 0, 5889, 0, 7180, 0, 119145, 0, 917558, - 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, 65230, - 128109, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, 3975, 0, 74087, 0, - 12672, 3798, 2703, 0, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 2932, - 41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 128230, - 41846, 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 128032, 0, 42531, 0, - 1510, 0, 8256, 0, 11393, 0, 8879, 128075, 92474, 8770, 0, 0, 78377, 1910, - 8671, 78374, 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, - 65106, 42761, 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0, - 0, 1733, 4392, 2568, 10786, 69661, 0, 8184, 41486, 0, 7396, 7116, 0, - 69788, 0, 7185, 7965, 0, 0, 92347, 0, 41350, 9129, 0, 0, 0, 0, 92489, 0, - 10481, 0, 127486, 7171, 0, 340, 92498, 0, 0, 0, 92200, 0, 0, 6764, - 127487, 0, 0, 0, 0, 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 0, 0, 0, - 127970, 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 128244, - 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, - 120535, 0, 8630, 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 0, 0, - 0, 0, 64293, 68098, 2635, 0, 0, 0, 0, 0, 7835, 0, 0, 194988, 92285, + 6227, 0, 0, 69741, 983326, 6163, 983302, 0, 127314, 0, 0, 8603, 0, + 119866, 3306, 10876, 43392, 119573, 127931, 5751, 0, 6222, 0, 0, 12086, + 7403, 1600, 64309, 64939, 0, 64783, 92658, 11310, 0, 8882, 0, 0, 2570, + 7021, 0, 0, 43110, 0, 1234, 6540, 6974, 0, 0, 0, 5002, 0, 41286, 0, + 127019, 0, 43585, 0, 6551, 983694, 128229, 0, 41289, 0, 194602, 0, 8977, + 602, 120814, 0, 128778, 128661, 0, 0, 41279, 0, 0, 0, 11081, 43615, 0, 0, + 0, 983356, 12727, 0, 0, 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, + 7831, 983564, 194571, 0, 73915, 8076, 43048, 8290, 8291, 43051, 92570, 0, + 2596, 43584, 0, 13113, 0, 127757, 2393, 7058, 9087, 74067, 68673, 41574, + 78337, 0, 74058, 6376, 0, 0, 0, 0, 9854, 127748, 64696, 0, 128220, 0, + 6994, 0, 1720, 0, 0, 0, 6529, 7063, 0, 3751, 9120, 0, 0, 1798, 709, 0, + 1354, 1876, 13152, 6557, 12430, 8137, 0, 92642, 0, 0, 245, 128097, 11456, + 41233, 7070, 0, 0, 6136, 917609, 65677, 8682, 41235, 92595, 42045, 9804, + 0, 432, 3595, 0, 65437, 0, 74455, 42399, 0, 0, 128274, 0, 119658, 0, 0, + 0, 77894, 8797, 0, 9052, 64888, 7167, 2356, 95, 74784, 10580, 0, 42286, + 0, 64640, 0, 119104, 0, 74137, 0, 10063, 12652, 12199, 92480, 0, 2566, + 11971, 983472, 0, 1065, 0, 0, 43400, 2576, 66696, 0, 0, 43604, 0, 0, + 74082, 514, 74502, 0, 2921, 43215, 64493, 5772, 12968, 983350, 194944, + 74580, 43398, 2580, 983545, 41341, 41223, 6564, 1463, 41342, 0, 5293, 0, + 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, 0, + 127025, 0, 74821, 0, 983468, 119042, 0, 127865, 13090, 66643, 0, 1270, + 1132, 42360, 0, 74096, 66655, 42569, 127824, 0, 64761, 0, 41021, 8510, + 42432, 0, 0, 0, 0, 64496, 74109, 0, 9915, 0, 0, 7061, 41336, 3854, 69700, + 13141, 68413, 43401, 42319, 13082, 0, 7067, 68221, 0, 0, 127171, 0, 0, + 127797, 9029, 43543, 119315, 2353, 6308, 0, 74792, 2611, 119186, 0, 0, 0, + 43664, 92399, 66627, 0, 4484, 8509, 118976, 78116, 65233, 0, 41224, + 41017, 0, 3747, 10522, 0, 0, 1691, 41226, 0, 12107, 44002, 10905, 65010, + 194986, 697, 66018, 9284, 4244, 0, 0, 92644, 13121, 120036, 0, 12010, + 128573, 128221, 0, 0, 0, 127193, 65816, 68111, 0, 127933, 65668, 92257, + 6618, 118784, 66365, 0, 42234, 12648, 128039, 7123, 0, 5785, 9198, 9764, + 41316, 65877, 7383, 13230, 41299, 0, 0, 68365, 128258, 0, 0, 0, 13122, 0, + 191, 74119, 8585, 8000, 64411, 120652, 42889, 64850, 41072, 41578, 0, + 41577, 0, 10002, 0, 6533, 73802, 41570, 0, 683, 396, 41580, 68146, 0, + 12901, 43058, 0, 343, 7129, 42680, 41360, 78154, 0, 4743, 0, 0, 74040, + 74108, 8743, 1724, 1433, 119322, 0, 3739, 6263, 92514, 0, 3964, 6592, 0, + 128693, 66040, 0, 42568, 69806, 0, 1778, 3956, 0, 42070, 6563, 43075, + 9018, 0, 0, 12067, 41312, 0, 5547, 74531, 127969, 0, 8175, 0, 284, 8108, + 934, 0, 74001, 173, 66460, 7174, 92703, 118822, 1750, 0, 4394, 68368, + 1807, 983623, 92298, 0, 5889, 0, 7180, 0, 119145, 0, 917558, 42471, 6982, + 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, 65230, 128109, 0, 0, + 3855, 0, 0, 0, 0, 74295, 0, 0, 92416, 3975, 0, 74087, 0, 12672, 3798, + 2703, 983343, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 2932, 41101, + 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 128230, 41846, + 0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 128032, 0, 42531, 0, 1510, + 0, 8256, 0, 11393, 0, 8879, 128075, 92474, 8770, 0, 0, 78377, 1910, 8671, + 78374, 4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, 65106, + 42761, 12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, + 1733, 4392, 2568, 10786, 69661, 0, 8184, 41486, 0, 7396, 7116, 0, 69788, + 0, 7185, 7965, 0, 0, 92347, 0, 41350, 9129, 0, 0, 0, 0, 92489, 0, 10481, + 0, 127486, 7171, 0, 340, 92498, 0, 0, 0, 92200, 0, 0, 6764, 127487, 0, 0, + 0, 0, 65203, 11392, 119098, 119359, 0, 3210, 0, 0, 0, 0, 0, 127970, + 917619, 0, 0, 10043, 0, 1186, 41571, 6999, 617, 9464, 128244, 3675, 5207, + 65062, 5213, 194769, 2617, 41348, 41568, 128803, 3253, 120535, 0, 8630, + 128544, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, 983555, 0, 0, 0, + 64293, 68098, 2635, 0, 0, 983581, 0, 983376, 7835, 0, 0, 194988, 92285, 64558, 127122, 0, 127121, 0, 127913, 0, 5784, 0, 0, 0, 0, 4011, 917616, 68101, 0, 7864, 4254, 65095, 0, 5600, 3903, 127083, 10447, 5598, 1207, 120521, 66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, 194778, 194772, - 9321, 0, 0, 0, 0, 1719, 68356, 68354, 9671, 1125, 4399, 127479, 917610, - 0, 7631, 5488, 7128, 120532, 0, 5491, 0, 8937, 43044, 2604, 74187, 5490, - 43046, 5489, 7212, 11768, 43043, 6300, 0, 7122, 0, 4390, 454, 41397, 0, - 9875, 7593, 194792, 92274, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746, - 11016, 65752, 120037, 0, 43423, 128683, 11989, 0, 0, 0, 0, 0, 8249, - 128172, 0, 78531, 6640, 74806, 2598, 513, 0, 6586, 8656, 0, 127002, - 65008, 0, 194784, 194989, 194795, 0, 92515, 68475, 0, 0, 0, 78637, 12647, - 0, 128043, 0, 1036, 0, 92419, 1723, 128056, 0, 0, 41579, 2444, 0, 10705, - 73876, 0, 74486, 0, 740, 119222, 194978, 194984, 0, 4238, 11071, 9459, - 68437, 78140, 78139, 194985, 8121, 10438, 74487, 42574, 13285, 55263, - 11907, 195000, 5690, 92255, 0, 0, 43181, 13095, 0, 127857, 64498, 0, - 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, 0, 0, 0, - 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, 5226, - 12602, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, 41725, - 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, 233, - 127490, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, 41175, 0, - 0, 0, 5296, 0, 42492, 43402, 92466, 3302, 0, 0, 6516, 6515, 6514, 6513, - 6512, 0, 7856, 8690, 0, 0, 12122, 119602, 43976, 0, 1785, 92507, 68622, - 65153, 194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322, - 4643, 5132, 0, 6389, 0, 5143, 0, 8790, 128694, 0, 194802, 0, 8869, - 120601, 0, 42060, 0, 0, 194804, 127012, 10270, 10286, 10318, 10382, - 43529, 66477, 0, 0, 74170, 0, 3234, 0, 0, 74376, 43139, 118815, 127084, - 120627, 8767, 0, 74489, 9695, 120746, 5201, 0, 6215, 12714, 6214, 13101, - 0, 194999, 65268, 0, 0, 0, 11027, 0, 10059, 10511, 42075, 9767, 789, - 1749, 78890, 127071, 0, 320, 0, 8647, 0, 3049, 0, 6471, 42071, 43156, - 9925, 127356, 127355, 66478, 4960, 5549, 127359, 127346, 8485, 4671, - 5418, 127350, 3351, 127006, 127351, 10610, 5414, 3064, 6212, 4286, 5421, - 127344, 9554, 0, 127794, 127109, 6653, 128811, 0, 64510, 6213, 12885, 0, - 119045, 64720, 0, 120759, 73741, 12603, 7131, 11430, 4566, 7843, 9317, - 3801, 10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, 9183, - 127361, 74458, 73825, 395, 5482, 5198, 8786, 10390, 74202, 5196, 43224, - 6113, 42009, 5205, 0, 43307, 0, 118973, 0, 12134, 0, 0, 118843, 9126, - 435, 0, 12014, 10377, 8093, 9079, 3203, 192, 65109, 3385, 0, 64430, 5383, - 10294, 10326, 128178, 5738, 0, 3336, 78355, 5361, 3623, 41159, 0, 68112, - 7872, 8581, 0, 1260, 3149, 5359, 0, 0, 7914, 5357, 92170, 128659, 2624, - 5364, 0, 11431, 120030, 9101, 11058, 78288, 0, 78293, 42271, 78289, + 9321, 983526, 0, 0, 0, 1719, 68356, 68354, 9671, 1125, 4399, 127479, + 917610, 0, 7631, 5488, 7128, 120532, 0, 5491, 0, 8937, 43044, 2604, + 74187, 5490, 43046, 5489, 7212, 11768, 43043, 6300, 0, 7122, 0, 4390, + 454, 41397, 0, 9875, 7593, 194792, 92274, 118913, 7207, 0, 65901, 2394, + 2575, 0, 3746, 11016, 65752, 120037, 0, 43423, 128683, 11989, 0, 0, 0, 0, + 0, 8249, 128172, 0, 78531, 6640, 74806, 2598, 513, 0, 6586, 8656, 0, + 127002, 65008, 0, 194784, 194989, 194795, 0, 92515, 68475, 0, 0, 0, + 78637, 12647, 0, 128043, 0, 1036, 0, 92419, 1723, 128056, 0, 0, 41579, + 2444, 0, 10705, 73876, 0, 74486, 0, 740, 119222, 194978, 194984, 0, 4238, + 11071, 9459, 68437, 78140, 78139, 194985, 8121, 10438, 74487, 42574, + 13285, 55263, 11907, 195000, 5690, 92255, 0, 0, 43181, 13095, 0, 127857, + 64498, 0, 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 127845, 1122, 317, + 0, 0, 0, 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, + 119564, 5226, 12602, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, + 5692, 41725, 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, + 866, 233, 127490, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, + 41175, 0, 0, 0, 5296, 0, 42492, 43402, 92466, 3302, 0, 0, 6516, 6515, + 6514, 6513, 6512, 0, 7856, 8690, 0, 0, 12122, 119602, 43976, 0, 1785, + 92507, 68622, 65153, 194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, + 5134, 0, 322, 4643, 5132, 0, 6389, 0, 5143, 0, 8790, 128694, 0, 194802, + 0, 8869, 120601, 0, 42060, 0, 0, 194804, 127012, 10270, 10286, 10318, + 10382, 43529, 66477, 0, 0, 74170, 0, 3234, 0, 0, 74376, 43139, 118815, + 127084, 120627, 8767, 0, 74489, 9695, 120746, 5201, 0, 6215, 12714, 6214, + 13101, 0, 194999, 65268, 0, 0, 0, 11027, 0, 10059, 10511, 42075, 9767, + 789, 1749, 78890, 127071, 983405, 320, 0, 8647, 0, 3049, 0, 6471, 42071, + 43156, 9925, 127356, 127355, 66478, 4960, 5549, 127359, 127346, 8485, + 4671, 5418, 127350, 3351, 127006, 127351, 10610, 5414, 3064, 6212, 4286, + 5421, 127344, 9554, 0, 127794, 127109, 6653, 128811, 0, 64510, 6213, + 12885, 0, 119045, 64720, 0, 120759, 73741, 12603, 7131, 11430, 4566, + 7843, 9317, 3801, 10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, + 9183, 127361, 74458, 73825, 395, 5482, 5198, 8786, 10390, 74202, 5196, + 43224, 6113, 42009, 5205, 0, 43307, 0, 118973, 0, 12134, 0, 0, 118843, + 9126, 435, 0, 12014, 10377, 8093, 9079, 3203, 192, 65109, 3385, 0, 64430, + 5383, 10294, 10326, 128178, 5738, 0, 3336, 78355, 5361, 3623, 41159, 0, + 68112, 7872, 8581, 0, 1260, 3149, 5359, 0, 0, 7914, 5357, 92170, 128659, + 2624, 5364, 0, 11431, 120030, 9101, 11058, 78288, 0, 78293, 42271, 78289, 42917, 120793, 0, 65566, 6717, 10619, 43360, 78385, 78384, 78383, 78382, 78381, 78380, 78379, 9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0, 41889, 92453, 0, 1161, 41895, 74103, 9701, 8622, 0, 0, @@ -18308,261 +18548,264 @@ 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411, 3662, 9413, 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423, 5165, 5126, 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 7119, 9403, 9404, 3507, - 9406, 7629, 0, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, 41130, - 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, 64825, - 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, 917922, - 77825, 73828, 5448, 41058, 5446, 69709, 41322, 42211, 5442, 4190, 77834, - 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, 65867, - 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, 7111, - 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, 9862, - 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, 7125, - 9819, 41357, 8011, 42885, 5507, 12044, 92636, 0, 10026, 5472, 7109, 1191, - 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, 42876, - 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, 0, - 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 69731, 64633, - 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 7137, 0, - 128296, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199, - 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, 5894, - 0, 0, 41171, 92511, 74313, 0, 13162, 0, 3334, 0, 118803, 77881, 66022, 0, - 0, 1651, 0, 8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, 0, 4002, 43626, - 10442, 10676, 3344, 0, 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, - 0, 78853, 0, 78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, - 120359, 11012, 0, 78856, 92400, 77879, 4973, 8784, 77877, 74804, 77874, - 77869, 77871, 42440, 0, 43118, 0, 42364, 6774, 6773, 917560, 120369, - 10346, 10410, 78859, 9243, 2464, 74263, 6108, 3372, 0, 6247, 43117, - 74526, 7121, 74166, 0, 120355, 92537, 0, 0, 195034, 0, 0, 0, 74217, 3354, - 195037, 4192, 9289, 118999, 41191, 3876, 0, 127983, 120660, 43696, 43380, - 0, 0, 0, 0, 11603, 0, 0, 6589, 128588, 194679, 0, 0, 0, 0, 0, 42572, - 128264, 10630, 74827, 1963, 118889, 127978, 11654, 0, 7550, 10686, 5903, - 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 0, 11013, 127927, - 128300, 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 0, 43367, 64579, - 917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416, - 12296, 68457, 73834, 68177, 11050, 10984, 92208, 0, 0, 92182, 0, 0, 9532, - 66355, 0, 0, 917925, 64343, 195032, 128281, 195031, 0, 0, 195057, 11445, - 0, 2112, 195056, 128814, 10185, 1021, 128130, 9507, 10210, 74544, 8023, - 1200, 12243, 78001, 5282, 78003, 9624, 11545, 0, 120493, 3343, 4424, - 11047, 1885, 43268, 3896, 78626, 66497, 2947, 392, 7894, 4391, 68139, 0, - 13059, 74816, 77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, - 78235, 7044, 1265, 0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 0, 8221, - 78307, 41864, 0, 0, 0, 0, 167, 0, 78301, 0, 74211, 41897, 68477, 0, - 917583, 0, 0, 2493, 0, 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, - 0, 92450, 0, 917573, 43030, 42027, 12114, 0, 917579, 64936, 194695, 0, - 120629, 10561, 0, 8365, 120539, 0, 65841, 120787, 11601, 0, 74121, 0, - 917575, 7834, 74159, 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, - 74157, 6327, 6724, 0, 128086, 92566, 0, 4817, 78446, 194759, 92536, 7043, - 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761, - 12343, 657, 195054, 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, 0, 0, - 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 0, 917595, 65550, 260, 4816, - 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, 195048, 41403, 119977, 0, - 0, 41406, 43273, 74160, 119983, 73939, 92638, 119984, 119979, 41404, - 1165, 119980, 4451, 13087, 0, 11284, 119987, 73855, 65155, 43014, 5439, - 9363, 127558, 3375, 128869, 5900, 0, 7889, 2722, 42262, 0, 0, 128774, 0, - 0, 0, 127810, 11401, 0, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, 127887, 0, - 127381, 4868, 119967, 119966, 118798, 0, 0, 43161, 0, 92360, 0, 5182, 0, - 120542, 0, 0, 4226, 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0, - 64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 92240, 0, 786, 0, 43174, - 64340, 0, 0, 120723, 43026, 7612, 10132, 64413, 65025, 0, 0, 0, 0, 0, - 68444, 0, 92437, 0, 119160, 10204, 92656, 0, 127809, 0, 1399, 0, 65217, - 0, 8852, 0, 241, 128780, 4907, 0, 0, 7932, 9727, 128873, 74255, 8748, 0, - 0, 0, 0, 42780, 0, 0, 0, 4217, 0, 8650, 0, 0, 0, 0, 118872, 43099, 3965, - 119119, 6719, 0, 13300, 78439, 128261, 43057, 66588, 118991, 0, 0, 73815, - 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, 43188, - 2626, 7762, 0, 0, 0, 92601, 42825, 41854, 5304, 0, 78516, 6919, 8619, - 119655, 10038, 66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0, + 9406, 7629, 983361, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, + 41130, 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, + 64825, 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, + 917922, 77825, 73828, 5448, 41058, 5446, 69709, 41322, 42211, 5442, 4190, + 77834, 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, + 65867, 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, + 7111, 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, + 9862, 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, + 7125, 9819, 41357, 8011, 42885, 5507, 12044, 92636, 0, 10026, 5472, 7109, + 1191, 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, + 42876, 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, + 0, 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 69731, + 64633, 77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, + 7137, 0, 128296, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, + 5199, 9936, 1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, + 5894, 983410, 0, 41171, 92511, 74313, 0, 13162, 0, 3334, 0, 118803, + 77881, 66022, 0, 0, 1651, 0, 8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, + 0, 4002, 43626, 10442, 10676, 3344, 0, 0, 12920, 194560, 0, 0, 66642, + 1277, 0, 7871, 0, 0, 78853, 0, 78854, 120360, 0, 11784, 0, 78012, 4700, + 66366, 78858, 120359, 11012, 0, 78856, 92400, 77879, 4973, 8784, 77877, + 74804, 77874, 77869, 77871, 42440, 0, 43118, 0, 42364, 6774, 6773, + 917560, 120369, 10346, 10410, 78859, 9243, 2464, 74263, 6108, 3372, 0, + 6247, 43117, 74526, 7121, 74166, 0, 120355, 92537, 0, 0, 195034, 0, 0, 0, + 74217, 3354, 195037, 4192, 9289, 118999, 41191, 3876, 0, 127983, 120660, + 43696, 43380, 0, 0, 0, 0, 11603, 983686, 0, 6589, 128588, 194679, 0, 0, + 983435, 0, 0, 42572, 128264, 10630, 74827, 1963, 118889, 127978, 11654, + 0, 7550, 10686, 5903, 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, + 0, 0, 11013, 127927, 128300, 0, 78621, 194672, 6925, 0, 0, 917929, 0, + 11568, 983408, 43367, 64579, 917930, 7852, 0, 0, 6754, 6312, 0, 64672, + 65296, 0, 118957, 0, 416, 12296, 68457, 73834, 68177, 11050, 10984, + 92208, 0, 0, 92182, 0, 983349, 9532, 66355, 0, 983049, 917925, 64343, + 195032, 128281, 195031, 0, 0, 195057, 11445, 0, 2112, 195056, 128814, + 10185, 1021, 128130, 9507, 10210, 74544, 8023, 1200, 12243, 78001, 5282, + 78003, 9624, 11545, 0, 120493, 3343, 4424, 11047, 1885, 43268, 3896, + 78626, 66497, 2947, 392, 7894, 4391, 68139, 0, 13059, 74816, 77998, 3381, + 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, 78235, 7044, 1265, 0, 6309, + 7045, 7175, 7047, 78239, 11791, 0, 0, 8221, 78307, 41864, 0, 0, 0, 0, + 167, 983641, 78301, 0, 74211, 41897, 68477, 0, 917583, 983369, 0, 2493, + 0, 118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, 0, 92450, 0, 917573, + 43030, 42027, 12114, 0, 917579, 64936, 194695, 0, 120629, 10561, 0, 8365, + 120539, 983509, 65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, + 0, 917574, 10298, 6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0, + 128086, 92566, 0, 4817, 78446, 194759, 92536, 7043, 9600, 11022, 0, 0, 0, + 0, 0, 0, 7548, 64794, 42050, 12291, 55289, 194761, 12343, 657, 195054, + 42705, 4461, 1134, 1838, 78438, 2057, 0, 4468, 0, 0, 0, 4456, 5206, + 10720, 0, 42523, 127520, 0, 0, 917595, 65550, 260, 4816, 67658, 10687, 0, + 4821, 4466, 0, 195043, 4818, 195048, 41403, 119977, 0, 0, 41406, 43273, + 74160, 119983, 73939, 92638, 119984, 119979, 41404, 1165, 119980, 4451, + 13087, 0, 11284, 119987, 73855, 65155, 43014, 5439, 9363, 127558, 3375, + 128869, 5900, 0, 7889, 2722, 42262, 0, 0, 128774, 0, 0, 0, 127810, 11401, + 0, 0, 68459, 0, 0, 0, 0, 65438, 0, 7280, 127887, 0, 127381, 4868, 119967, + 119966, 118798, 0, 0, 43161, 0, 92360, 0, 5182, 0, 120542, 0, 0, 4226, + 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0, 64770, 74838, 0, 344, + 0, 194790, 1395, 64279, 0, 92240, 0, 786, 0, 43174, 64340, 0, 0, 120723, + 43026, 7612, 10132, 64413, 65025, 0, 0, 0, 0, 0, 68444, 0, 92437, 0, + 119160, 10204, 92656, 0, 127809, 983379, 1399, 983387, 65217, 0, 8852, 0, + 241, 128780, 4907, 0, 983374, 7932, 9727, 128873, 74255, 8748, 0, 0, + 983378, 0, 42780, 0, 0, 0, 4217, 0, 8650, 0, 0, 0, 0, 118872, 43099, + 3965, 119119, 6719, 0, 13300, 78439, 128261, 43057, 66588, 118991, 0, 0, + 73815, 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, 7294, 0, 0, 0, 9066, 0, 11993, + 43188, 2626, 7762, 0, 0, 0, 92601, 42825, 41854, 5304, 0, 78516, 6919, + 8619, 119655, 10038, 66454, 9592, 42851, 126993, 1542, 92303, 0, 0, 0, 0, 74311, 78497, 0, 10181, 0, 43624, 0, 7779, 0, 10195, 9479, 6029, 0, 92268, 9689, 0, 0, 8993, 66358, 0, 42378, 3368, 606, 127030, 7697, 69237, 69787, 2030, 0, 6027, 8370, 4322, 0, 65207, 0, 0, 0, 0, 0, 2735, 42831, - 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, 0, 9576, - 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, 7709, 41112, - 0, 66560, 42041, 4572, 12876, 66561, 0, 6758, 0, 1615, 5855, 809, 0, - 92283, 128316, 128004, 5799, 0, 0, 0, 7260, 0, 43031, 64425, 65128, - 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, 0, 0, 0, - 127060, 65828, 0, 283, 68665, 78813, 532, 78663, 0, 0, 120609, 0, 3370, - 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 0, 0, 0, 65495, 64706, - 0, 43344, 0, 7144, 9466, 78866, 9824, 0, 0, 0, 0, 915, 43425, 0, 0, 0, 0, - 127178, 43264, 0, 0, 0, 0, 78864, 6730, 78862, 68161, 64550, 5186, 12890, - 127837, 0, 12108, 0, 65124, 43127, 66043, 0, 6326, 43107, 77826, 0, - 42562, 0, 0, 0, 128520, 11485, 6103, 127123, 0, 11718, 0, 12889, 92657, - 127137, 0, 0, 0, 55245, 0, 1630, 128232, 65483, 0, 12565, 0, 65476, - 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, 0, 64593, 512, 3376, - 68210, 0, 0, 77892, 632, 12940, 77891, 42529, 78587, 0, 5957, 110593, - 8926, 0, 0, 128273, 10745, 10174, 7379, 64581, 5386, 120686, 11713, - 10633, 69708, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 0, 128038, - 0, 0, 127174, 64278, 92370, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, - 119029, 0, 73823, 0, 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, - 0, 0, 128570, 12106, 0, 74207, 1755, 10482, 12863, 77898, 1163, 2951, - 9522, 74079, 78266, 120674, 0, 3384, 69227, 10702, 830, 77902, 77899, - 77900, 8451, 0, 0, 0, 69739, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0, - 12239, 0, 0, 4441, 0, 0, 73940, 64352, 127513, 0, 411, 0, 9199, 0, 4056, - 118992, 41890, 0, 2730, 41604, 0, 5428, 194743, 3364, 42265, 64437, - 127935, 118816, 194742, 9684, 216, 0, 1401, 128053, 44012, 0, 0, 92585, - 9158, 77842, 120664, 5768, 0, 0, 0, 484, 194739, 0, 0, 65895, 0, 0, 3338, - 73935, 572, 7041, 2736, 67605, 0, 128680, 2794, 8807, 64491, 77847, 5438, - 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, 77846, 194747, 9534, 0, 0, - 0, 3430, 0, 0, 0, 0, 981, 0, 4330, 73929, 120536, 1824, 10908, 0, 7034, - 41683, 64617, 0, 73754, 3957, 64358, 64547, 128259, 674, 63991, 0, 2946, - 5354, 5251, 5328, 5307, 3759, 11411, 8364, 5123, 119628, 5281, 5469, - 5121, 119245, 118993, 0, 5130, 0, 0, 77990, 0, 120726, 1221, 2733, 11746, - 77991, 5216, 0, 0, 0, 0, 3468, 7033, 9230, 5939, 195052, 0, 0, 120677, - 68400, 7278, 10321, 10289, 64613, 10385, 41706, 0, 0, 0, 0, 11739, 0, - 41981, 0, 5938, 0, 0, 12448, 7576, 10401, 10337, 73852, 0, 13057, 0, - 126976, 0, 10009, 0, 41703, 0, 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, - 0, 0, 92457, 0, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 128340, 0, - 0, 0, 10970, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 92345, 11468, - 64636, 7575, 0, 2724, 0, 0, 12313, 110592, 515, 119947, 42791, 63987, - 78286, 119943, 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629, - 9141, 0, 78850, 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, - 3303, 41372, 11786, 9473, 66203, 66177, 92446, 11593, 43007, 4478, 66178, - 0, 0, 2744, 0, 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, - 66198, 41880, 66188, 66197, 78148, 11955, 66190, 66191, 41111, 66189, - 73788, 7788, 4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430, - 78160, 55259, 78158, 128036, 5278, 4945, 42883, 4950, 0, 68625, 0, 7269, - 0, 5964, 12908, 0, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0, - 4944, 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931, + 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, 68140, 983660, + 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, 7709, + 41112, 0, 66560, 42041, 4572, 12876, 66561, 983493, 6758, 983658, 1615, + 5855, 809, 0, 92283, 128316, 128004, 5799, 0, 0, 0, 7260, 0, 43031, + 64425, 65128, 78819, 64386, 65257, 0, 68616, 120607, 9347, 128067, 6532, + 0, 0, 0, 127060, 65828, 0, 283, 68665, 78813, 532, 78663, 0, 983531, + 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 0, 0, + 983652, 65495, 64706, 0, 43344, 0, 7144, 9466, 78866, 9824, 0, 0, 0, 0, + 915, 43425, 0, 0, 0, 0, 127178, 43264, 0, 0, 0, 0, 78864, 6730, 78862, + 68161, 64550, 5186, 12890, 127837, 0, 12108, 0, 65124, 43127, 66043, 0, + 6326, 43107, 77826, 0, 42562, 0, 0, 0, 128520, 11485, 6103, 127123, 0, + 11718, 0, 12889, 92657, 127137, 0, 0, 0, 55245, 0, 1630, 128232, 65483, + 0, 12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, + 0, 64593, 512, 3376, 68210, 0, 0, 77892, 632, 12940, 77891, 42529, 78587, + 0, 5957, 110593, 8926, 0, 0, 128273, 10745, 10174, 7379, 64581, 5386, + 120686, 11713, 10633, 69708, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, + 0, 0, 128038, 0, 0, 127174, 64278, 92370, 43466, 0, 0, 64389, 2953, + 73879, 1801, 12835, 119029, 0, 73823, 0, 66375, 2085, 702, 42579, 77884, + 77885, 13074, 77883, 0, 0, 128570, 12106, 0, 74207, 1755, 10482, 12863, + 77898, 1163, 2951, 9522, 74079, 78266, 120674, 0, 3384, 69227, 10702, + 830, 77902, 77899, 77900, 8451, 0, 0, 0, 69739, 0, 0, 0, 0, 2908, 0, + 43386, 64902, 4243, 0, 12239, 0, 0, 4441, 0, 0, 73940, 64352, 127513, 0, + 411, 0, 9199, 0, 4056, 118992, 41890, 0, 2730, 41604, 983669, 5428, + 194743, 3364, 42265, 64437, 127935, 118816, 194742, 9684, 216, 0, 1401, + 128053, 44012, 0, 0, 92585, 9158, 77842, 120664, 5768, 0, 0, 0, 484, + 194739, 0, 0, 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 0, + 128680, 2794, 8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, + 5456, 5509, 77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 0, 0, 981, 0, 4330, + 73929, 120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, + 64547, 128259, 674, 63991, 0, 2946, 5354, 5251, 5328, 5307, 3759, 11411, + 8364, 5123, 119628, 5281, 5469, 5121, 119245, 118993, 0, 5130, 0, 0, + 77990, 0, 120726, 1221, 2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033, + 9230, 5939, 195052, 0, 0, 120677, 68400, 7278, 10321, 10289, 64613, + 10385, 41706, 0, 0, 0, 0, 11739, 0, 41981, 0, 5938, 0, 0, 12448, 7576, + 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0, 41703, 983373, + 12165, 0, 0, 9885, 0, 8077, 0, 127908, 0, 0, 0, 92457, 0, 4220, 10725, + 10433, 0, 68395, 4987, 64519, 0, 128340, 0, 0, 0, 10970, 11733, 0, + 120792, 0, 19944, 0, 9009, 8551, 92345, 11468, 64636, 7575, 0, 2724, 0, + 0, 12313, 110592, 515, 119947, 42791, 63987, 78286, 119943, 119940, + 119941, 119938, 9775, 4046, 4589, 4521, 68629, 9141, 0, 78850, 2741, + 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, 3303, 41372, 11786, + 9473, 66203, 66177, 92446, 11593, 43007, 4478, 66178, 0, 0, 2744, 0, + 4477, 118964, 814, 42066, 66183, 66204, 43786, 119961, 66198, 41880, + 66188, 66197, 78148, 11955, 66190, 66191, 41111, 66189, 73788, 7788, + 4847, 0, 127759, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259, + 78158, 128036, 5278, 4945, 42883, 4950, 0, 68625, 0, 7269, 0, 5964, + 12908, 983299, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0, 4944, + 5467, 119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931, 119962, 41306, 73984, 2698, 127159, 0, 12072, 3193, 0, 41304, 824, 128676, 12091, 78893, 78894, 119816, 4673, 64804, 4678, 119820, 119819, 65059, 0, 6739, 0, 5481, 3490, 1199, 119811, 8356, 119829, 119832, 4677, 12688, 3102, 0, 4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166, 4674, 4548, 44005, 119949, 68658, 119946, 8025, 68630, 127024, 1855, 0, 68669, 0, 92445, 127554, 0, 0, 119652, 2745, 11797, 0, 128159, 9202, - 4654, 0, 0, 68638, 73993, 10525, 4649, 65209, 0, 0, 4648, 43080, 0, 0, 0, - 6246, 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, 78005, 92384, - 43187, 8669, 0, 6821, 65093, 0, 78881, 2716, 0, 0, 0, 0, 68369, 120054, - 11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, 4662, 78033, 78032, - 9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, 10130, 68450, 7811, - 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, 4661, 42434, 0, 0, 0, - 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, 10222, 3054, 194956, - 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, 0, 9045, 78888, 4225, 19926, - 78887, 12880, 65307, 4617, 78883, 0, 41732, 4616, 10518, 10423, 10359, 0, - 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, 0, 41313, 522, 5368, 0, - 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, 2696, 0, 0, 4638, 0, - 1790, 78242, 5965, 64363, 66569, 68646, 194968, 5376, 1835, 5335, 194966, - 128089, 4633, 0, 68119, 1180, 4632, 128093, 5387, 5333, 0, 0, 42094, - 5331, 4634, 11928, 0, 5338, 4637, 128170, 5971, 42414, 0, 1268, 65097, - 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, 0, - 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, 74384, 0, - 68377, 6248, 0, 0, 0, 42318, 92582, 5229, 4757, 0, 0, 2728, 4752, 64563, - 65235, 5234, 0, 128145, 0, 10713, 7166, 0, 2622, 7460, 127302, 0, 0, - 8954, 74760, 65189, 2632, 92230, 10108, 1011, 5574, 1853, 2709, 65139, - 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, 5316, 0, 5314, 6451, 5572, - 0, 5312, 0, 5525, 5330, 5319, 0, 0, 194907, 44003, 0, 0, 0, 120498, - 127851, 195009, 0, 74022, 0, 64609, 68643, 120634, 0, 5721, 0, 5519, - 8632, 66465, 11267, 73961, 92278, 5720, 0, 1692, 4219, 4610, 8696, 4305, - 0, 4609, 43478, 4614, 541, 0, 5287, 5309, 5285, 68389, 5961, 4647, 56, - 4216, 10577, 41381, 601, 4613, 0, 0, 92276, 4608, 64260, 41124, 5190, - 67628, 0, 68145, 7086, 0, 119243, 67620, 0, 2734, 11074, 0, 67627, 43593, - 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114, 119939, 0, - 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392, 6239, 119956, - 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254, 128047, 43291, - 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724, 7193, 68137, 0, - 5739, 41024, 4866, 0, 73904, 0, 4869, 120563, 0, 4223, 128201, 6650, 0, - 0, 0, 127890, 4870, 120445, 68661, 6716, 78176, 68667, 68382, 68676, - 127925, 10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, 2732, 42734, 745, - 0, 195097, 92195, 4777, 7821, 0, 68631, 42775, 0, 194954, 0, 3097, 0, - 5966, 0, 4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, 8577, 128562, 68196, - 43285, 10216, 4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776, - 73818, 11492, 8700, 0, 13176, 68363, 10426, 0, 917599, 10362, 194706, - 1715, 4849, 8242, 9561, 73922, 43278, 42635, 0, 0, 5963, 917926, 0, 0, - 4850, 0, 1607, 466, 4853, 118995, 4854, 127918, 5164, 0, 1350, 5124, - 64420, 1993, 5362, 8471, 2708, 92471, 12445, 3785, 234, 3199, 0, 41268, - 4848, 2530, 917909, 2068, 1964, 0, 73762, 10458, 0, 8576, 78543, 0, 2704, - 4794, 0, 68211, 8322, 4797, 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, - 0, 303, 0, 92622, 0, 2437, 0, 4221, 4844, 118869, 0, 0, 0, 0, 0, 43292, - 0, 2441, 10739, 65090, 0, 119327, 0, 2451, 2714, 119326, 0, 43379, 4937, - 43376, 753, 5849, 10597, 43089, 11722, 9248, 92555, 42879, 11725, 0, 0, - 2726, 3107, 73958, 4941, 64937, 119233, 9140, 1408, 5261, 4607, 0, 181, - 0, 4942, 9539, 4938, 0, 65201, 5259, 9369, 64185, 4142, 5257, 0, 0, 4964, - 5264, 64178, 64177, 12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, - 41231, 1822, 42526, 128581, 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0, - 9830, 43642, 389, 10893, 7521, 127879, 4872, 5463, 0, 3125, 9567, 0, - 4878, 5459, 4604, 917931, 9557, 5465, 68617, 0, 11494, 0, 9563, 10865, - 74570, 43279, 64186, 0, 78714, 64191, 64190, 8898, 64188, 0, 41030, - 78836, 0, 917835, 78820, 917834, 0, 78805, 41031, 78801, 11960, 6745, - 3082, 0, 78539, 73919, 10573, 41744, 7079, 5856, 127043, 5163, 78809, - 128162, 1817, 66724, 78538, 0, 10564, 7763, 13077, 41813, 4400, 41745, - 64207, 10275, 8925, 10371, 10307, 41814, 4248, 0, 0, 4541, 6299, 64204, - 64203, 64201, 64200, 64199, 64198, 0, 42156, 78688, 0, 64193, 64192, - 65223, 9943, 64197, 64196, 64195, 64194, 13282, 64175, 64174, 64173, - 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, 12163, 3108, 9745, 64167, - 64166, 64165, 64164, 2110, 92176, 64169, 64168, 64949, 10972, 10251, - 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, 120378, 0, 11352, - 550, 9910, 0, 0, 66579, 11551, 0, 195080, 9504, 7187, 0, 10373, 0, - 120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552, 65222, 6998, - 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, 1146, 5065, - 78196, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, 0, 78200, - 78201, 5062, 1264, 64817, 13254, 11697, 0, 9785, 64716, 0, 3933, 74559, - 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 0, 42130, 0, 5151, - 917829, 917823, 0, 0, 0, 7620, 3800, 65122, 0, 0, 8355, 7854, 0, 954, - 64927, 4185, 41045, 127141, 41438, 41439, 68666, 10711, 4593, 127745, - 120584, 0, 64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, 5166, 9888, - 127800, 5148, 42834, 0, 78205, 78206, 43787, 78204, 64131, 3119, 917814, - 0, 3060, 64135, 9986, 0, 77876, 636, 11698, 0, 0, 9916, 11701, 7836, - 42741, 64137, 8320, 78640, 8863, 92431, 119960, 1477, 43289, 0, 74358, - 8618, 0, 9908, 0, 0, 0, 3937, 12312, 0, 0, 0, 64781, 912, 6349, 4536, - 119963, 74532, 0, 6244, 0, 194580, 3935, 120665, 0, 0, 11950, 5392, - 42248, 65129, 68656, 5397, 0, 12046, 12599, 0, 0, 5395, 0, 5393, 354, - 68615, 119948, 78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, - 0, 0, 128874, 0, 0, 43297, 0, 4311, 4644, 8818, 0, 128186, 0, 7145, 3918, - 66452, 3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, 813, - 119945, 68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, 42117, - 92287, 128224, 0, 0, 74046, 120583, 4911, 988, 917807, 0, 0, 43061, 7054, - 64147, 0, 64920, 68195, 6698, 118933, 92506, 0, 120006, 11981, 12202, 0, - 11032, 67654, 6093, 11608, 975, 68662, 65843, 170, 0, 0, 4169, 0, 41859, - 6058, 120401, 13203, 120657, 0, 0, 68657, 9818, 10178, 10324, 42106, - 5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, 4742, 120564, 92391, - 73736, 0, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, 5300, 4741, 42108, - 0, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, 66620, 0, 127331, - 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, 3928, 917870, 43378, - 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, 4171, 12008, 6251, 3923, - 1490, 0, 119591, 0, 40972, 5245, 0, 10114, 42001, 41888, 4845, 8332, - 40974, 64347, 4840, 9077, 78346, 1747, 917849, 4825, 69240, 917852, - 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, 1472, 917859, 6687, 1274, - 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, 119559, 4830, 9134, - 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, 10614, 120390, 0, 1888, - 1960, 7861, 917856, 78524, 41836, 43012, 6052, 6064, 54, 43009, 12214, 0, - 6211, 0, 358, 41997, 41833, 11442, 10758, 65774, 0, 120384, 64115, 92221, - 0, 0, 0, 119053, 0, 12765, 64118, 126998, 12962, 0, 0, 4017, 12827, 5241, - 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, 917846, 41116, 917844, - 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, 0, 66202, 8957, 4139, - 0, 0, 0, 0, 0, 12740, 128702, 4722, 6816, 127793, 12759, 4725, 0, 4726, - 0, 0, 0, 917904, 917905, 0, 12755, 12762, 4015, 0, 8052, 476, 0, 0, - 128294, 64212, 41020, 1382, 64209, 64216, 64215, 64214, 1656, 41831, 0, - 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 127328, 8552, 64113, 41845, - 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 119085, 0, 0, - 7935, 2420, 0, 1114, 92599, 67585, 78675, 120053, 92350, 120051, 3938, - 120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955, - 6452, 4713, 128196, 66249, 917885, 917890, 917891, 65152, 719, 120044, - 78623, 120042, 6713, 4532, 65412, 69822, 10868, 4717, 2349, 5902, 66450, - 4712, 917902, 917899, 917900, 65416, 8155, 4718, 3942, 4714, 9625, 0, - 6383, 194744, 12006, 128565, 0, 0, 0, 0, 65414, 6454, 1229, 0, 66437, - 66025, 78699, 0, 42500, 120508, 4809, 9623, 917874, 78694, 917880, - 917877, 917878, 65405, 68159, 12893, 917882, 5365, 4545, 8901, 92421, - 119555, 4813, 128262, 0, 5925, 4808, 64330, 0, 65475, 118940, 195028, - 4814, 0, 4810, 0, 0, 64928, 10543, 0, 3522, 0, 414, 65404, 0, 195027, - 6456, 73820, 0, 6691, 42193, 92225, 128171, 0, 74495, 0, 0, 0, 118820, - 9751, 65407, 128085, 11770, 3919, 0, 0, 65061, 0, 0, 0, 12235, 0, 0, - 127233, 64092, 0, 64080, 0, 64090, 0, 0, 10162, 10310, 0, 8454, 127888, - 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, 6732, 0, 0, 0, - 0, 0, 8896, 0, 375, 6976, 66582, 119005, 0, 0, 0, 119202, 119203, 12526, - 43120, 2315, 0, 1938, 119197, 0, 4529, 119200, 119201, 119198, 119199, - 69692, 0, 69698, 13150, 64492, 0, 0, 0, 12902, 0, 42891, 66327, 74298, 0, - 10799, 69690, 2587, 66372, 0, 4193, 92250, 4241, 0, 7998, 0, 0, 0, 0, - 2316, 118821, 0, 0, 0, 64297, 74799, 92442, 74140, 0, 5373, 0, 0, 3762, - 10015, 127335, 119232, 0, 41590, 0, 92378, 3780, 7485, 5779, 0, 42037, 0, - 3906, 12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, - 0, 0, 0, 0, 0, 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, - 43310, 7231, 0, 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 0, 119237, - 0, 128805, 4470, 119613, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, - 127143, 0, 5377, 120585, 68143, 1688, 78245, 0, 69685, 0, 0, 0, 44020, - 6808, 41319, 1300, 10650, 41692, 64505, 4668, 0, 119624, 1465, 10850, - 3943, 0, 41205, 41315, 118961, 0, 0, 5352, 0, 0, 8839, 41314, 7384, 7785, - 41204, 127322, 41209, 69637, 92241, 43607, 0, 0, 5420, 3897, 10134, 0, - 74417, 4018, 7150, 68127, 0, 0, 0, 0, 127526, 2561, 68621, 3542, 7148, - 12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, 78751, 7146, 0, 65150, - 41819, 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 0, 69641, 10753, - 10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, - 0, 0, 0, 2020, 0, 4022, 128783, 0, 77923, 0, 41691, 0, 0, 74329, 0, - 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, 0, + 4654, 0, 983634, 68638, 73993, 10525, 4649, 65209, 983612, 0, 4648, + 43080, 0, 0, 0, 6246, 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, + 78005, 92384, 43187, 8669, 983306, 6821, 65093, 0, 78881, 2716, 0, 0, 0, + 0, 68369, 120054, 11060, 8547, 2711, 42165, 78027, 78026, 7992, 0, 0, + 4662, 78033, 78032, 9149, 9146, 599, 2081, 78031, 78030, 194962, 4656, + 10130, 68450, 7811, 40994, 194965, 6414, 5967, 4658, 3725, 5713, 5814, + 4661, 42434, 0, 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, 10008, + 10222, 3054, 194956, 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, 0, + 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883, 0, 41732, + 4616, 10518, 10423, 10359, 0, 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, + 0, 41313, 522, 5368, 0, 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, + 2696, 0, 0, 4638, 0, 1790, 78242, 5965, 64363, 66569, 68646, 194968, + 5376, 1835, 5335, 194966, 128089, 4633, 0, 68119, 1180, 4632, 128093, + 5387, 5333, 0, 0, 42094, 5331, 4634, 11928, 0, 5338, 4637, 128170, 5971, + 42414, 0, 1268, 65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, + 10358, 10422, 4758, 0, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, + 6240, 5231, 74384, 0, 68377, 6248, 0, 0, 0, 42318, 92582, 5229, 4757, 0, + 0, 2728, 4752, 64563, 65235, 5234, 0, 128145, 0, 10713, 7166, 0, 2622, + 7460, 127302, 0, 0, 8954, 74760, 65189, 2632, 92230, 10108, 1011, 5574, + 1853, 2709, 65139, 5577, 0, 0, 118871, 68641, 8965, 7635, 42177, 5316, 0, + 5314, 6451, 5572, 0, 5312, 0, 5525, 5330, 5319, 0, 983607, 194907, 44003, + 0, 0, 0, 120498, 127851, 195009, 983600, 74022, 0, 64609, 68643, 120634, + 0, 5721, 0, 5519, 8632, 66465, 11267, 73961, 92278, 5720, 0, 1692, 4219, + 4610, 8696, 4305, 0, 4609, 43478, 4614, 541, 0, 5287, 5309, 5285, 68389, + 5961, 4647, 56, 4216, 10577, 41381, 601, 4613, 0, 0, 92276, 4608, 64260, + 41124, 5190, 67628, 0, 68145, 7086, 0, 119243, 67620, 0, 2734, 11074, 0, + 67627, 43593, 0, 67625, 5960, 0, 8992, 42593, 128260, 1782, 67622, 68114, + 119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, 41253, 68392, + 6239, 119956, 41256, 0, 68134, 0, 74209, 917550, 9346, 69660, 41254, + 128047, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 64724, + 7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 0, 4869, 120563, 0, 4223, + 128201, 6650, 0, 0, 0, 127890, 4870, 120445, 68661, 6716, 78176, 68667, + 68382, 68676, 127925, 10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, + 2732, 42734, 745, 0, 195097, 92195, 4777, 7821, 0, 68631, 42775, 0, + 194954, 0, 3097, 0, 5966, 0, 4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, + 8577, 128562, 68196, 43285, 10216, 4782, 0, 0, 120757, 68618, 12325, + 43056, 8717, 0, 0, 4776, 73818, 11492, 8700, 0, 13176, 68363, 10426, 0, + 917599, 10362, 194706, 1715, 4849, 8242, 9561, 73922, 43278, 42635, 0, 0, + 5963, 917926, 0, 0, 4850, 0, 1607, 466, 4853, 118995, 4854, 127918, 5164, + 983605, 1350, 5124, 64420, 1993, 5362, 8471, 2708, 92471, 12445, 3785, + 234, 3199, 0, 41268, 4848, 2530, 917909, 2068, 1964, 0, 73762, 10458, 0, + 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, 4797, 5753, 0, 2694, 4792, 0, + 2439, 65104, 69804, 0, 303, 0, 92622, 0, 2437, 0, 4221, 4844, 118869, 0, + 0, 0, 0, 0, 43292, 0, 2441, 10739, 65090, 0, 119327, 0, 2451, 2714, + 119326, 0, 43379, 4937, 43376, 753, 5849, 10597, 43089, 11722, 9248, + 92555, 42879, 11725, 0, 0, 2726, 3107, 73958, 4941, 64937, 119233, 9140, + 1408, 5261, 4607, 0, 181, 0, 4942, 9539, 4938, 0, 65201, 5259, 9369, + 64185, 4142, 5257, 983345, 0, 4964, 5264, 64178, 64177, 12979, 41411, + 64182, 64181, 64180, 64179, 9482, 4873, 41231, 1822, 42526, 128581, + 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0, 9830, 43642, 389, 10893, 7521, + 127879, 4872, 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 917931, 9557, + 5465, 68617, 0, 11494, 0, 9563, 10865, 74570, 43279, 64186, 0, 78714, + 64191, 64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, + 78805, 41031, 78801, 11960, 6745, 3082, 0, 78539, 73919, 10573, 41744, + 7079, 5856, 127043, 5163, 78809, 128162, 1817, 66724, 78538, 0, 10564, + 7763, 13077, 41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, 41814, + 4248, 0, 0, 4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 0, + 42156, 78688, 0, 64193, 64192, 65223, 9943, 64197, 64196, 64195, 64194, + 13282, 64175, 64174, 64173, 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, + 12163, 3108, 9745, 64167, 64166, 64165, 64164, 2110, 92176, 64169, 64168, + 64949, 10972, 10251, 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, + 120378, 0, 11352, 550, 9910, 0, 0, 66579, 11551, 0, 195080, 9504, 7187, + 0, 10373, 0, 120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552, + 65222, 6998, 78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, + 1146, 5065, 78196, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, + 0, 78200, 78201, 5062, 1264, 64817, 13254, 11697, 0, 9785, 64716, 0, + 3933, 74559, 4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 983608, + 42130, 0, 5151, 917829, 917823, 0, 0, 0, 7620, 3800, 65122, 0, 0, 8355, + 7854, 0, 954, 64927, 4185, 41045, 127141, 41438, 41439, 68666, 10711, + 4593, 127745, 120584, 0, 64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, + 5166, 9888, 127800, 5148, 42834, 0, 78205, 78206, 43787, 78204, 64131, + 3119, 917814, 0, 3060, 64135, 9986, 0, 77876, 636, 11698, 0, 0, 9916, + 11701, 7836, 42741, 64137, 8320, 78640, 8863, 92431, 119960, 1477, 43289, + 0, 74358, 8618, 0, 9908, 983713, 0, 0, 3937, 12312, 0, 0, 0, 64781, 912, + 6349, 4536, 119963, 74532, 0, 6244, 0, 194580, 3935, 120665, 0, 0, 11950, + 5392, 42248, 65129, 68656, 5397, 0, 12046, 12599, 0, 0, 5395, 0, 5393, + 354, 68615, 119948, 78503, 0, 0, 42039, 0, 0, 64142, 626, 0, 5895, 0, 0, + 5780, 0, 0, 128874, 0, 0, 43297, 0, 4311, 4644, 8818, 0, 128186, 0, 7145, + 3918, 66452, 3797, 1644, 92346, 9658, 4140, 11385, 65947, 6455, 9030, + 813, 119945, 68131, 4146, 119957, 5360, 2466, 0, 67669, 119942, 6249, + 42117, 92287, 128224, 0, 0, 74046, 120583, 4911, 988, 917807, 0, 0, + 43061, 7054, 64147, 0, 64920, 68195, 6698, 118933, 92506, 0, 120006, + 11981, 12202, 0, 11032, 67654, 6093, 11608, 975, 68662, 65843, 170, 0, 0, + 4169, 0, 41859, 6058, 120401, 13203, 120657, 0, 0, 68657, 9818, 10178, + 10324, 42106, 5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, 4742, + 120564, 92391, 73736, 0, 9825, 6448, 6715, 127008, 4831, 0, 92525, 0, + 5300, 4741, 42108, 0, 64159, 4736, 64148, 0, 849, 92191, 78491, 43288, 0, + 66620, 0, 127331, 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, + 3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 128129, 0, 4841, 0, + 4171, 12008, 6251, 3923, 1490, 0, 119591, 983474, 40972, 5245, 0, 10114, + 42001, 41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849, + 4825, 69240, 917852, 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, + 1472, 917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261, + 11023, 119559, 4830, 9134, 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, + 10614, 120390, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012, 6052, + 6064, 54, 43009, 12214, 0, 6211, 0, 358, 41997, 41833, 11442, 10758, + 65774, 0, 120384, 64115, 92221, 0, 0, 0, 119053, 0, 12765, 64118, 126998, + 12962, 0, 0, 4017, 12827, 5241, 120392, 0, 41118, 3924, 0, 11366, 917843, + 0, 0, 917846, 41116, 917844, 917564, 0, 11363, 12057, 11917, 1567, 74000, + 4721, 983305, 66202, 8957, 4139, 0, 0, 0, 0, 0, 12740, 128702, 4722, + 6816, 127793, 12759, 4725, 0, 4726, 0, 0, 0, 917904, 917905, 0, 12755, + 12762, 4015, 0, 8052, 476, 0, 0, 128294, 64212, 41020, 1382, 64209, + 64216, 64215, 64214, 1656, 41831, 0, 0, 41843, 8720, 3908, 1452, 13111, + 0, 64067, 127328, 8552, 64113, 41845, 3849, 78732, 66232, 9778, 120066, + 5891, 7064, 55, 9948, 119085, 0, 0, 7935, 2420, 0, 1114, 92599, 67585, + 78675, 120053, 92350, 120051, 3938, 120057, 65417, 64717, 120060, 120061, + 65415, 120059, 6292, 65303, 7955, 6452, 4713, 128196, 66249, 917885, + 917890, 917891, 65152, 719, 120044, 78623, 120042, 6713, 4532, 65412, + 69822, 10868, 4717, 2349, 5902, 66450, 4712, 917902, 917899, 917900, + 65416, 8155, 4718, 3942, 4714, 9625, 0, 6383, 194744, 12006, 128565, 0, + 0, 0, 0, 65414, 6454, 1229, 0, 66437, 66025, 78699, 0, 42500, 120508, + 4809, 9623, 917874, 78694, 917880, 917877, 917878, 65405, 68159, 12893, + 917882, 5365, 4545, 8901, 92421, 119555, 4813, 128262, 0, 5925, 4808, + 64330, 0, 65475, 118940, 195028, 4814, 0, 4810, 0, 0, 64928, 10543, 0, + 3522, 0, 414, 65404, 0, 195027, 6456, 73820, 0, 6691, 42193, 92225, + 128171, 0, 74495, 0, 0, 0, 118820, 9751, 65407, 128085, 11770, 3919, 0, + 0, 65061, 0, 0, 0, 12235, 0, 0, 127233, 64092, 0, 64080, 0, 64090, 0, + 983599, 10162, 10310, 0, 8454, 127888, 42038, 387, 41363, 12737, 0, 4780, + 43368, 0, 64310, 64621, 6732, 0, 0, 0, 0, 0, 8896, 0, 375, 6976, 66582, + 119005, 983609, 0, 0, 119202, 119203, 12526, 43120, 2315, 0, 1938, + 119197, 0, 4529, 119200, 119201, 119198, 119199, 69692, 0, 69698, 13150, + 64492, 0, 0, 0, 12902, 0, 42891, 66327, 74298, 0, 10799, 69690, 2587, + 66372, 0, 4193, 92250, 4241, 0, 7998, 0, 0, 0, 0, 2316, 118821, 0, 0, 0, + 64297, 74799, 92442, 74140, 0, 5373, 0, 983621, 3762, 10015, 127335, + 119232, 0, 41590, 0, 92378, 3780, 7485, 5779, 0, 42037, 0, 3906, 12349, + 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, 0, 0, 0, 0, 0, + 280, 74558, 127332, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, + 11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 983487, 119237, 0, 128805, + 4470, 119613, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0, + 5377, 120585, 68143, 1688, 78245, 0, 69685, 983491, 0, 0, 44020, 6808, + 41319, 1300, 10650, 41692, 64505, 4668, 0, 119624, 1465, 10850, 3943, 0, + 41205, 41315, 118961, 0, 0, 5352, 0, 0, 8839, 41314, 7384, 7785, 41204, + 127322, 41209, 69637, 92241, 43607, 0, 0, 5420, 3897, 10134, 0, 74417, + 4018, 7150, 68127, 0, 0, 0, 0, 127526, 2561, 68621, 3542, 7148, 12076, + 7951, 68152, 118857, 5303, 6276, 1706, 0, 78751, 7146, 0, 65150, 41819, + 0, 73951, 10847, 41822, 9985, 860, 0, 10506, 0, 69641, 10753, 10830, 0, + 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, 0, 0, 0, + 2020, 0, 4022, 128783, 0, 77923, 983446, 41691, 0, 0, 74329, 0, 64622, + 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, 7000, 3904, 0, 128198, 0, 118931, 119630, 13123, 10846, 3450, 127360, 7397, 118807, 0, 42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 69634, 9367, 593, 41085, 3999, 65226, 41713, 12764, 0, 64409, 3596, 0, 0, 9763, @@ -18574,240 +18817,686 @@ 68675, 128054, 1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0, 0, 65292, 6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879, 55223, 0, 0, 41826, 8865, 6402, 0, 13279, 7917, 120340, 0, 7733, 0, 4998, - 0, 92332, 41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, 2014, - 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949, 0, 0, 0, 2015, - 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 10135, 65909, - 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833, 0, 119351, - 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078, 0, 0, 4837, - 127061, 770, 0, 811, 0, 41042, 917551, 41318, 64427, 0, 0, 78848, 3895, - 0, 74341, 3976, 0, 42859, 10193, 3116, 7747, 0, 0, 0, 0, 0, 43686, 78846, - 41877, 0, 2871, 64614, 128785, 999, 0, 6345, 41876, 2663, 2017, 0, 0, - 11040, 10150, 0, 64308, 1522, 597, 4775, 12555, 12571, 12550, 12583, + 983631, 92332, 41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, + 2014, 0, 0, 9765, 0, 0, 0, 195059, 78357, 65281, 127825, 10949, 0, 0, 0, + 2015, 0, 0, 0, 66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 10135, + 65909, 6474, 794, 0, 12656, 128122, 119353, 128270, 1665, 0, 4833, 0, + 119351, 127367, 0, 189, 12611, 0, 0, 2859, 4838, 0, 4834, 65078, 0, 0, + 4837, 127061, 770, 0, 811, 0, 41042, 917551, 41318, 64427, 0, 0, 78848, + 3895, 0, 74341, 3976, 0, 42859, 10193, 3116, 7747, 0, 0, 0, 0, 0, 43686, + 78846, 41877, 0, 2871, 64614, 128785, 999, 0, 6345, 41876, 2663, 2017, 0, + 0, 11040, 10150, 0, 64308, 1522, 597, 4775, 12555, 12571, 12550, 12583, 12560, 2019, 12556, 12584, 3092, 0, 12562, 4783, 12566, 12569, 12554, 0, 10812, 78851, 0, 0, 3078, 1402, 0, 128275, 0, 0, 119248, 394, 3088, 0, 92172, 0, 3991, 64391, 0, 0, 424, 66328, 1999, 69659, 73914, 0, 0, 0, 0, - 42231, 8246, 0, 0, 0, 41840, 0, 2377, 1298, 64011, 12572, 11318, 12557, - 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, 48, 0, 9480, 481, 0, - 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, 9430, 9431, 9432, 9433, - 9434, 9435, 3984, 9437, 0, 0, 9424, 9425, 9426, 9427, 9428, 9429, 64758, - 2362, 9655, 0, 2004, 9096, 9782, 128848, 9172, 128545, 19965, 0, 5955, - 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 92448, 65210, 8798, 0, 92165, - 1392, 0, 0, 127364, 10606, 8065, 118805, 10353, 10417, 0, 0, 64524, - 92418, 4019, 0, 0, 43280, 8219, 68402, 1812, 0, 0, 0, 0, 42410, 74448, - 119132, 6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 128139, 0, - 68678, 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, 3921, 0, 11775, - 64760, 11766, 1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, - 36, 0, 5153, 41805, 0, 73735, 763, 41808, 64910, 0, 2009, 0, 0, 127142, - 9640, 119951, 0, 120695, 8621, 0, 12852, 3031, 0, 64361, 0, 182, 194718, - 92716, 92598, 119950, 0, 9058, 366, 0, 9892, 5969, 11754, 10848, 4570, - 65301, 44013, 4255, 0, 10102, 41189, 4003, 41026, 68109, 13293, 41192, - 69635, 0, 42251, 0, 42534, 65179, 11287, 6128, 0, 11034, 10923, 64423, 0, - 65506, 0, 65861, 74083, 92600, 9932, 0, 92423, 119955, 0, 9817, 0, - 120140, 0, 12117, 66586, 4183, 10540, 66250, 9063, 127045, 0, 119954, 0, - 12897, 3792, 2011, 0, 6065, 43160, 0, 194715, 8692, 41186, 41816, 41023, - 41818, 41187, 11659, 7922, 12614, 2005, 8523, 78002, 0, 7513, 1863, 4710, - 0, 5956, 7621, 78006, 92624, 4705, 716, 78004, 0, 4704, 120040, 120270, - 42241, 161, 43977, 74546, 66214, 4706, 0, 0, 42672, 4709, 10680, 0, - 43293, 119944, 0, 119164, 120328, 92467, 0, 1700, 119223, 0, 0, 128119, - 4004, 0, 10968, 43296, 0, 8506, 0, 0, 126996, 1005, 937, 78216, 4734, - 2870, 0, 78218, 0, 7463, 4729, 0, 235, 1384, 4728, 0, 120420, 92490, - 120331, 8109, 43105, 0, 4730, 447, 13186, 1513, 4733, 120415, 0, 0, - 42527, 12911, 43427, 1383, 8565, 2469, 120024, 6690, 6156, 68117, 43439, - 7993, 4288, 120416, 2674, 13238, 11922, 0, 120330, 3510, 13234, 0, - 120407, 5605, 42095, 11364, 0, 1380, 65617, 120253, 120261, 13196, 13197, - 120309, 120682, 9495, 119346, 0, 5959, 0, 73976, 120305, 43371, 6941, - 119349, 13205, 13211, 5801, 12769, 65905, 41697, 1283, 120302, 4779, 0, - 3719, 4006, 0, 19957, 128773, 2021, 119332, 120699, 119150, 43028, 65493, - 41838, 3875, 5962, 64341, 92616, 9814, 43457, 5827, 3314, 7787, 78234, - 65494, 68153, 0, 0, 120636, 64531, 120692, 194626, 0, 0, 66316, 65467, - 5771, 41298, 0, 9742, 521, 0, 10800, 0, 8404, 194625, 483, 7096, 7089, - 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 0, 65782, 9841, - 8843, 12145, 92470, 10074, 78548, 0, 3769, 0, 0, 0, 0, 9573, 0, 65290, - 8849, 0, 65855, 65112, 1796, 120505, 0, 69665, 8164, 41301, 3502, 0, - 7388, 10621, 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608, - 10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639, - 1390, 0, 0, 421, 43536, 5846, 120120, 4130, 127775, 7595, 42588, 7600, - 120121, 66035, 0, 0, 65851, 42607, 128190, 92403, 3168, 0, 42134, 0, - 2370, 2846, 92605, 0, 0, 120132, 0, 1836, 0, 0, 92558, 3740, 92547, 6290, - 65374, 120451, 2390, 3944, 66628, 120434, 0, 6135, 3118, 74265, 119093, - 120446, 0, 0, 8127, 8975, 64739, 7943, 0, 0, 10618, 2584, 0, 0, 0, 9998, - 0, 0, 0, 0, 0, 6204, 0, 0, 8279, 8776, 64954, 4975, 74809, 120130, 4267, - 1631, 42206, 127866, 0, 195046, 65700, 66562, 0, 64645, 0, 0, 0, 12586, - 0, 9242, 127922, 0, 4523, 5842, 10495, 3122, 0, 7793, 78275, 9328, 0, - 78393, 12604, 0, 6615, 67650, 92344, 3986, 44025, 0, 8912, 64555, 7409, - 0, 0, 9541, 78276, 0, 11275, 8540, 11498, 0, 0, 41040, 2459, 0, 13060, - 41041, 74413, 0, 0, 0, 68427, 10450, 12551, 41043, 7020, 120353, 3765, 0, - 0, 1606, 120348, 120351, 3093, 68436, 0, 0, 120649, 0, 0, 4312, 74091, - 120337, 120336, 11923, 4023, 120333, 5763, 120335, 4827, 10894, 12810, - 64406, 118785, 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 0, 11973, - 13089, 4293, 120329, 42224, 42758, 12196, 42837, 42226, 119319, 0, - 119126, 5817, 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 0, 0, 4895, - 65358, 0, 4359, 585, 2383, 3509, 194920, 486, 4290, 5758, 127546, 0, 0, - 7004, 0, 65880, 127886, 119048, 2380, 11380, 0, 0, 2376, 0, 119320, 0, - 5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0, - 0, 0, 0, 0, 0, 74188, 120241, 0, 0, 120047, 128575, 0, 0, 120049, 0, - 1847, 0, 10339, 0, 42384, 0, 4227, 74158, 0, 92501, 43032, 0, 42365, 0, - 12671, 11384, 0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064, - 120650, 42137, 9893, 2754, 12664, 120063, 0, 7377, 127867, 41799, 65530, - 1711, 12984, 43039, 3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0, - 120055, 0, 43175, 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, - 0, 520, 4200, 12699, 8331, 0, 3091, 41034, 127353, 0, 8360, 0, 78044, - 321, 4229, 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, + 42231, 8246, 0, 0, 0, 41840, 983353, 2377, 1298, 64011, 12572, 11318, + 12557, 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, 48, 0, 9480, + 481, 0, 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, 9430, 9431, 9432, + 9433, 9434, 9435, 3984, 9437, 0, 0, 9424, 9425, 9426, 9427, 9428, 9429, + 64758, 2362, 9655, 0, 2004, 9096, 9782, 128848, 9172, 128545, 19965, 0, + 5955, 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 92448, 65210, 8798, 0, + 92165, 1392, 0, 0, 127364, 10606, 8065, 118805, 10353, 10417, 0, 0, + 64524, 92418, 4019, 0, 983304, 43280, 8219, 68402, 1812, 0, 0, 0, 0, + 42410, 74448, 119132, 6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, + 0, 128139, 0, 68678, 0, 0, 1049, 0, 65707, 2304, 41806, 92326, 42336, + 3921, 0, 11775, 64760, 11766, 1038, 42303, 9823, 127278, 69236, 4008, + 64004, 8773, 10733, 36, 0, 5153, 41805, 0, 73735, 763, 41808, 64910, 0, + 2009, 0, 0, 127142, 9640, 119951, 0, 120695, 8621, 983699, 12852, 3031, + 0, 64361, 0, 182, 194718, 92716, 92598, 119950, 0, 9058, 366, 0, 9892, + 5969, 11754, 10848, 4570, 65301, 44013, 4255, 983700, 10102, 41189, 4003, + 41026, 68109, 13293, 41192, 69635, 0, 42251, 0, 42534, 65179, 11287, + 6128, 0, 11034, 10923, 64423, 0, 65506, 0, 65861, 74083, 92600, 9932, 0, + 92423, 119955, 0, 9817, 0, 120140, 0, 12117, 66586, 4183, 10540, 66250, + 9063, 127045, 0, 119954, 0, 12897, 3792, 2011, 0, 6065, 43160, 0, 194715, + 8692, 41186, 41816, 41023, 41818, 41187, 11659, 7922, 12614, 2005, 8523, + 78002, 0, 7513, 1863, 4710, 0, 5956, 7621, 78006, 92624, 4705, 716, + 78004, 0, 4704, 120040, 120270, 42241, 161, 43977, 74546, 66214, 4706, 0, + 0, 42672, 4709, 10680, 983485, 43293, 119944, 0, 119164, 120328, 92467, + 0, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983377, 8506, 0, 0, + 126996, 1005, 937, 78216, 4734, 2870, 0, 78218, 0, 7463, 4729, 0, 235, + 1384, 4728, 0, 120420, 92490, 120331, 8109, 43105, 983535, 4730, 447, + 13186, 1513, 4733, 120415, 0, 0, 42527, 12911, 43427, 1383, 8565, 2469, + 120024, 6690, 6156, 68117, 43439, 7993, 4288, 120416, 2674, 13238, 11922, + 0, 120330, 3510, 13234, 0, 120407, 5605, 42095, 11364, 0, 1380, 65617, + 120253, 120261, 13196, 13197, 120309, 120682, 9495, 119346, 0, 5959, 0, + 73976, 120305, 43371, 6941, 119349, 13205, 13211, 5801, 12769, 65905, + 41697, 1283, 120302, 4779, 0, 3719, 4006, 0, 19957, 128773, 2021, 119332, + 120699, 119150, 43028, 65493, 41838, 3875, 5962, 64341, 92616, 9814, + 43457, 5827, 3314, 7787, 78234, 65494, 68153, 0, 0, 120636, 64531, + 120692, 194626, 0, 0, 66316, 65467, 5771, 41298, 983529, 9742, 521, 0, + 10800, 0, 8404, 194625, 483, 7096, 7089, 66323, 928, 0, 0, 119018, 10599, + 11586, 3989, 10971, 0, 65782, 9841, 8843, 12145, 92470, 10074, 78548, 0, + 3769, 0, 0, 0, 0, 9573, 0, 65290, 8849, 0, 65855, 65112, 1796, 120505, 0, + 69665, 8164, 41301, 3502, 0, 7388, 10621, 73838, 78553, 5825, 13007, + 68165, 0, 120457, 12661, 7608, 10354, 10418, 42411, 2022, 0, 1409, 12195, + 4001, 3112, 10824, 120639, 1390, 0, 0, 421, 43536, 5846, 120120, 4130, + 127775, 7595, 42588, 7600, 120121, 66035, 983648, 0, 65851, 42607, + 128190, 92403, 3168, 0, 42134, 0, 2370, 2846, 92605, 0, 0, 120132, 0, + 1836, 0, 0, 92558, 3740, 92547, 6290, 65374, 120451, 2390, 3944, 66628, + 120434, 0, 6135, 3118, 74265, 119093, 120446, 0, 0, 8127, 8975, 64739, + 7943, 983478, 0, 10618, 2584, 0, 0, 0, 9998, 0, 0, 0, 0, 0, 6204, 0, 0, + 8279, 8776, 64954, 4975, 74809, 120130, 4267, 1631, 42206, 127866, 0, + 195046, 65700, 66562, 0, 64645, 0, 0, 0, 12586, 0, 9242, 127922, 0, 4523, + 5842, 10495, 3122, 983532, 7793, 78275, 9328, 0, 78393, 12604, 0, 6615, + 67650, 92344, 3986, 44025, 0, 8912, 64555, 7409, 0, 0, 9541, 78276, 0, + 11275, 8540, 11498, 0, 0, 41040, 2459, 0, 13060, 41041, 74413, 983568, 0, + 0, 68427, 10450, 12551, 41043, 7020, 120353, 3765, 0, 0, 1606, 120348, + 120351, 3093, 68436, 0, 0, 120649, 0, 0, 4312, 74091, 120337, 120336, + 11923, 4023, 120333, 5763, 120335, 4827, 10894, 12810, 64406, 118785, + 4455, 74321, 433, 119620, 66660, 2499, 0, 0, 0, 11973, 13089, 4293, + 120329, 42224, 42758, 12196, 42837, 42226, 119319, 0, 119126, 5817, + 127806, 55277, 3120, 9797, 0, 0, 0, 10389, 0, 0, 4895, 65358, 0, 4359, + 585, 2383, 3509, 194920, 486, 4290, 5758, 127546, 0, 0, 7004, 0, 65880, + 127886, 119048, 2380, 11380, 0, 0, 2376, 0, 119320, 0, 5197, 127046, + 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0, 0, 983425, 0, + 0, 0, 74188, 120241, 0, 0, 120047, 128575, 0, 0, 120049, 0, 1847, 0, + 10339, 0, 42384, 0, 4227, 74158, 0, 92501, 43032, 0, 42365, 0, 12671, + 11384, 0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064, 120650, + 42137, 9893, 2754, 12664, 120063, 0, 7377, 127867, 41799, 65530, 1711, + 12984, 43039, 3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0, 120055, + 0, 43175, 0, 43037, 41798, 41035, 11583, 127769, 41801, 119088, 0, 520, + 4200, 12699, 8331, 0, 3091, 41034, 127353, 983533, 8360, 0, 78044, 321, + 4229, 64543, 917946, 65563, 0, 917974, 2861, 43793, 10095, 0, 9195, 92386, 1861, 0, 73733, 0, 0, 43041, 0, 43794, 128530, 3859, 12181, 41660, 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, 0, 743, 4414, 120766, 0, 42632, 917973, 65161, 73896, 128589, 0, 1405, 119063, 43220, 43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, 43342, 119064, 65529, 65364, 128197, 0, 6485, 1397, 0, 41986, 92678, 0, 0, - 74097, 0, 7471, 12079, 0, 12682, 43287, 92317, 0, 0, 0, 0, 0, 1099, + 74097, 0, 7471, 12079, 0, 12682, 43287, 92317, 0, 0, 983442, 0, 0, 1099, 10490, 0, 10501, 65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346, 0, 917631, 64573, 64897, 423, 1818, 65144, 0, 8272, 127812, 19911, 4218, - 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 0, 74359, 12626, 9106, 0, - 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, 0, 43530, - 2752, 0, 0, 0, 59, 0, 0, 0, 92371, 77873, 41810, 0, 7010, 0, 41809, - 41495, 119364, 0, 42252, 42213, 8009, 3305, 43033, 511, 92700, 66255, - 13127, 120067, 0, 0, 0, 917977, 65915, 1400, 41812, 10685, 194870, 2103, - 10387, 4453, 43276, 917783, 13159, 0, 6481, 41213, 0, 0, 0, 0, 41983, - 74198, 6617, 9116, 119654, 0, 462, 68110, 10493, 0, 8129, 0, 0, 74471, - 6644, 11658, 0, 128245, 3452, 11906, 9581, 1385, 3098, 0, 119013, 43340, - 0, 41033, 6493, 42626, 0, 0, 11426, 77887, 1681, 118789, 1204, 3755, - 64661, 7235, 10170, 3966, 8911, 0, 41841, 43338, 0, 0, 5726, 64915, - 42175, 0, 0, 41497, 65044, 120109, 2851, 43017, 0, 0, 4373, 78058, 0, - 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 0, 64922, 0, 8190, - 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 0, 119125, 3439, 1825, - 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, 8990, 2848, 0, 128223, - 92528, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, 68178, 995, 0, 0, - 64826, 0, 917798, 128348, 0, 19945, 8091, 558, 0, 12273, 194814, 0, - 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, 2102, 65445, - 78258, 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, 12446, 43295, 0, - 41894, 0, 6277, 41672, 41893, 10010, 128678, 3540, 128649, 835, 0, 69816, - 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 128127, 8283, 0, 5434, - 0, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 128307, 3464, 6486, - 4819, 128233, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 0, 431, 0, 0, - 128182, 128096, 68167, 0, 13096, 128643, 0, 43408, 9516, 128538, 5268, - 42230, 42220, 0, 4450, 120511, 11547, 43417, 128542, 356, 3477, 227, - 10488, 68203, 382, 11418, 0, 0, 0, 0, 0, 0, 6484, 2541, 66039, 0, 78718, - 92723, 3549, 0, 9110, 119665, 2743, 0, 43290, 194812, 9097, 0, 43015, - 8782, 0, 776, 2524, 42707, 8573, 0, 0, 0, 0, 42694, 64944, 8952, 3856, - 118818, 0, 5872, 6495, 0, 0, 0, 92543, 0, 120733, 12849, 3953, 1897, 0, - 65094, 11994, 4339, 74556, 92654, 67843, 0, 0, 0, 68473, 74104, 5228, - 128804, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, 1162, 0, 2671, 0, - 0, 92632, 92631, 118865, 4553, 73811, 0, 195005, 0, 0, 19921, 74331, - 11424, 195006, 4567, 41891, 0, 0, 55249, 4820, 65239, 194662, 0, 0, - 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, 1753, - 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, 0, - 1898, 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, 64789, - 9169, 838, 127092, 120697, 844, 5014, 0, 256, 0, 9990, 0, 42739, 917851, - 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, 78712, - 11761, 194655, 0, 41094, 0, 0, 0, 0, 92689, 6196, 6945, 194628, 194890, - 128184, 120491, 11816, 194943, 5733, 2930, 0, 0, 41098, 0, 41093, 0, - 66626, 588, 9760, 0, 194717, 1238, 200, 0, 1660, 73916, 0, 118905, 74362, - 0, 92485, 194651, 0, 0, 3394, 194894, 120668, 0, 0, 127358, 66219, - 127183, 43284, 194657, 7817, 1841, 11055, 120533, 194979, 194982, 1669, - 10776, 194981, 7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, - 127530, 41768, 6491, 0, 65324, 914, 65323, 8071, 3538, 0, 78713, 65328, - 92441, 74367, 7614, 0, 11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841, - 43430, 5301, 0, 92618, 5734, 8960, 0, 92527, 65317, 77880, 0, 0, 0, - 12304, 0, 0, 65315, 92670, 128511, 0, 0, 0, 119621, 92529, 74536, 12447, - 64486, 127374, 0, 0, 0, 0, 0, 42767, 10915, 0, 12007, 43695, 120520, - 11975, 194878, 0, 92604, 2555, 8629, 0, 43168, 41872, 43706, 4496, - 194879, 128148, 0, 0, 0, 0, 0, 64730, 0, 66714, 68222, 0, 0, 65596, - 92306, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 127242, 67871, 74386, - 0, 8233, 12820, 0, 6683, 194876, 3442, 12144, 2841, 12543, 0, 1473, - 42820, 64329, 127832, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 0, - 3406, 1054, 119065, 1040, 65450, 0, 4434, 1069, 0, 118862, 65737, 917765, - 128705, 0, 0, 9693, 41943, 0, 41931, 41759, 12757, 4353, 0, 1059, 9790, - 8995, 128286, 0, 65937, 0, 41764, 10646, 0, 118833, 92372, 0, 74830, - 78569, 12743, 0, 6480, 917761, 41779, 42580, 66601, 12207, 119619, 6335, - 66602, 11312, 64807, 0, 0, 41767, 0, 0, 43020, 128271, 3955, 74254, 0, 0, - 917861, 0, 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, - 127093, 12797, 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, - 128061, 78574, 0, 0, 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, - 43812, 42144, 65015, 0, 563, 0, 0, 12798, 11271, 57, 0, 0, 917860, - 119043, 0, 119134, 43137, 694, 0, 9876, 0, 119168, 0, 78822, 64537, 0, - 277, 74385, 7229, 12761, 0, 0, 13025, 64811, 8757, 78824, 0, 1574, 7381, - 0, 2525, 4852, 5749, 68465, 13027, 42824, 120574, 1039, 7151, 10155, - 5745, 188, 41858, 11592, 0, 74015, 9055, 41853, 4858, 917780, 0, 436, - 4771, 0, 2786, 0, 4856, 8051, 0, 119609, 0, 9644, 0, 0, 0, 194916, - 120732, 66710, 118834, 0, 73906, 0, 127114, 0, 10234, 5843, 11939, 0, - 42157, 0, 3157, 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, - 10226, 65142, 0, 3594, 42424, 194959, 40, 12657, 0, 0, 386, 0, 8834, 0, - 12815, 43574, 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 77932, 4304, - 74503, 8160, 78707, 194753, 0, 0, 0, 1348, 92349, 78597, 0, 13303, 0, - 92392, 194755, 7599, 1278, 43616, 13269, 0, 0, 74387, 78179, 78598, - 74492, 6097, 7568, 8780, 4982, 127464, 74501, 194763, 78592, 194762, - 2672, 3735, 127471, 13138, 42266, 9484, 10724, 41202, 119024, 0, 43742, - 0, 9487, 119959, 119117, 3842, 128768, 78668, 12442, 6193, 9791, 127976, - 0, 42516, 7228, 7559, 74803, 78468, 7873, 11399, 119219, 194691, 194855, - 194690, 194857, 3604, 0, 119188, 128877, 78540, 78541, 42507, 1962, - 43305, 78476, 42505, 11660, 0, 2072, 92312, 6995, 74173, 5437, 74174, - 10669, 8702, 7964, 92352, 0, 199, 194843, 4105, 194845, 194699, 194847, - 194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070, 6472, 65814, - 73954, 0, 4724, 0, 0, 9191, 0, 64432, 0, 0, 195024, 10196, 7886, 0, 6585, - 0, 6680, 195042, 0, 195051, 6679, 74412, 92251, 194866, 74421, 11382, 0, - 0, 127891, 127484, 194833, 194832, 6681, 127482, 12693, 194836, 42727, - 194838, 128252, 78195, 65442, 119610, 69733, 9989, 43248, 66248, 194816, - 0, 194818, 128845, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825, - 73927, 92444, 194736, 65746, 127476, 74409, 74389, 128696, 4342, 42839, - 194831, 1677, 0, 0, 194806, 917855, 11091, 11011, 2719, 0, 0, 119595, - 10160, 0, 0, 7585, 65169, 2052, 4308, 92174, 74177, 7505, 543, 64916, - 64736, 0, 0, 64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, - 127170, 0, 0, 0, 0, 12994, 92728, 10828, 0, 6228, 4307, 3482, 128527, 0, - 0, 0, 506, 74573, 41194, 65735, 2055, 43255, 41195, 0, 8169, 0, 8841, 0, - 516, 0, 2063, 119051, 34, 128850, 120186, 11504, 1612, 74333, 120182, - 74520, 74308, 12001, 120178, 10242, 64564, 120179, 120174, 6584, 7749, - 11037, 0, 1758, 0, 10667, 10560, 120197, 92593, 1935, 11517, 120193, - 120196, 120195, 1931, 120189, 74839, 120191, 1217, 64702, 12643, 825, - 127838, 194905, 12294, 92428, 78834, 9138, 78831, 78833, 12631, 78829, - 11080, 74554, 64000, 5591, 1239, 0, 11313, 0, 3403, 0, 0, 64364, 92269, - 0, 74582, 8998, 12988, 0, 9152, 0, 0, 194898, 67589, 41850, 64290, 3433, - 92393, 12615, 1594, 42192, 6914, 67603, 0, 119569, 74565, 41353, 67602, - 67611, 4337, 0, 127296, 918, 65035, 41351, 7681, 194900, 42577, 41393, - 12668, 194904, 2477, 127285, 0, 127301, 0, 67604, 194880, 127235, 573, - 127282, 194884, 11417, 194886, 119814, 194888, 67599, 0, 194889, 67607, - 11482, 0, 3981, 3357, 0, 42223, 4207, 1288, 78842, 78839, 68419, 78837, - 11589, 42195, 194872, 194599, 127263, 64602, 67618, 92539, 0, 42788, - 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, 997, 0, 0, - 92577, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 127760, - 73796, 0, 119228, 12035, 0, 2818, 0, 0, 73793, 0, 4172, 0, 0, 8373, - 10873, 12197, 0, 0, 92265, 69706, 0, 78210, 0, 128110, 194865, 126982, - 74563, 64828, 11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617, - 3274, 127365, 0, 0, 0, 74522, 41989, 0, 0, 128798, 3263, 0, 65672, 0, - 3270, 64539, 11489, 0, 0, 0, 0, 9505, 65518, 194776, 756, 194605, 0, 0, - 0, 7261, 0, 186, 0, 119156, 5770, 13179, 65830, 12612, 12949, 64856, - 12800, 0, 74203, 64718, 0, 0, 92434, 118929, 0, 11578, 0, 119296, 0, 0, - 0, 0, 74568, 9254, 0, 1794, 120217, 64521, 5624, 120220, 120221, 119958, - 120223, 3617, 66636, 64886, 120211, 120212, 120213, 120214, 1872, 66508, - 120467, 41079, 10748, 5502, 119330, 4452, 0, 0, 92526, 4511, 0, 0, 64678, - 11425, 0, 43245, 1231, 194783, 0, 0, 9003, 8192, 0, 5305, 9653, 10616, - 8694, 9546, 0, 0, 120478, 120200, 65205, 120202, 64063, 9878, 74780, - 119626, 78202, 64058, 8799, 42131, 0, 64062, 1028, 64060, 64059, 837, - 10567, 0, 43103, 0, 120754, 11427, 2902, 64043, 64042, 66464, 10756, 0, - 42606, 64045, 64044, 43979, 10076, 64040, 43060, 194942, 1034, 3392, - 127771, 43091, 64033, 64032, 42735, 64038, 64037, 64036, 64035, 4291, - 194928, 64015, 64014, 64681, 194930, 0, 78145, 0, 43090, 0, 3476, 8973, - 64012, 42473, 64010, 64008, 64007, 2003, 7706, 64517, 78153, 2538, 64009, - 204, 0, 4802, 4111, 8239, 9098, 4805, 64001, 64057, 7885, 7247, 64054, 0, - 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, 64052, 43453, 64050, - 41340, 118975, 194835, 10005, 12329, 41333, 0, 8489, 1942, 0, 194834, - 42520, 128249, 0, 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, - 9167, 42151, 78244, 0, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, - 78252, 78248, 77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920, - 7532, 41414, 78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454, - 10751, 9051, 120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030, - 294, 41874, 0, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, - 194844, 0, 118795, 6343, 43247, 119888, 0, 119886, 119891, 119892, - 119889, 11433, 119895, 119896, 0, 7801, 65578, 194839, 12915, 43968, - 3297, 9699, 194955, 1135, 0, 0, 128525, 1995, 6722, 0, 0, 2552, 41546, - 60, 68394, 8649, 41549, 78496, 0, 0, 6682, 0, 78679, 64710, 41547, 0, - 2013, 128291, 78530, 78532, 78528, 78529, 12832, 78493, 8081, 8362, 3537, - 119908, 9137, 7155, 8999, 0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, - 2002, 2000, 120175, 537, 0, 4179, 65119, 1998, 0, 1842, 0, 92674, 9628, - 68446, 12081, 9826, 64502, 1767, 0, 0, 0, 120201, 0, 0, 0, 3059, 44024, - 120204, 119953, 92693, 0, 0, 92452, 4100, 920, 1811, 1355, 0, 0, 3592, - 10078, 0, 0, 0, 8592, 65870, 68164, 128792, 10742, 0, 42918, 1994, 9281, - 3296, 12865, 1997, 1895, + 3087, 64960, 127234, 43564, 0, 0, 9584, 10465, 983637, 74359, 12626, + 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, + 0, 43530, 2752, 0, 0, 0, 59, 0, 983337, 0, 92371, 77873, 41810, 0, 7010, + 0, 41809, 41495, 119364, 0, 42252, 42213, 8009, 3305, 43033, 511, 92700, + 66255, 13127, 120067, 0, 0, 0, 917977, 65915, 1400, 41812, 10685, 194870, + 2103, 10387, 4453, 43276, 917783, 13159, 0, 6481, 41213, 0, 0, 0, 0, + 41983, 74198, 6617, 9116, 119654, 0, 462, 68110, 10493, 0, 8129, 0, 0, + 74471, 6644, 11658, 0, 128245, 3452, 11906, 9581, 1385, 3098, 0, 119013, + 43340, 0, 41033, 6493, 42626, 0, 0, 11426, 77887, 1681, 118789, 1204, + 3755, 64661, 7235, 10170, 3966, 8911, 0, 41841, 43338, 0, 0, 5726, 64915, + 42175, 0, 0, 41497, 65044, 120109, 2851, 43017, 983333, 0, 4373, 78058, + 0, 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 983556, 64922, 0, + 8190, 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 983582, 119125, + 3439, 1825, 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, 8990, 2848, + 0, 128223, 92528, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, 68178, + 995, 0, 0, 64826, 0, 917798, 128348, 0, 19945, 8091, 558, 0, 12273, + 194814, 983585, 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, + 0, 2102, 65445, 78258, 64891, 0, 7725, 65108, 78255, 0, 8624, 69246, + 12446, 43295, 0, 41894, 0, 6277, 41672, 41893, 10010, 128678, 3540, + 128649, 835, 0, 69816, 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, + 128127, 8283, 0, 5434, 983334, 0, 19917, 11408, 0, 11947, 0, 1404, 3095, + 11432, 128307, 3464, 6486, 4819, 128233, 0, 570, 8095, 3672, 119864, + 1498, 67866, 0, 0, 431, 0, 0, 128182, 128096, 68167, 983398, 13096, + 128643, 0, 43408, 9516, 128538, 5268, 42230, 42220, 0, 4450, 120511, + 11547, 43417, 128542, 356, 3477, 227, 10488, 68203, 382, 11418, 0, + 983319, 0, 0, 0, 0, 6484, 2541, 66039, 0, 78718, 92723, 3549, 0, 9110, + 119665, 2743, 0, 43290, 194812, 9097, 0, 43015, 8782, 0, 776, 2524, + 42707, 8573, 0, 0, 0, 0, 42694, 64944, 8952, 3856, 118818, 0, 5872, 6495, + 0, 0, 0, 92543, 0, 120733, 12849, 3953, 1897, 0, 65094, 11994, 4339, + 74556, 92654, 67843, 0, 0, 0, 68473, 74104, 5228, 128804, 7868, 43184, 0, + 0, 73986, 43438, 0, 43022, 0, 1162, 0, 2671, 0, 0, 92632, 92631, 118865, + 4553, 73811, 0, 195005, 0, 0, 19921, 74331, 11424, 195006, 4567, 41891, + 0, 983523, 55249, 4820, 65239, 194662, 0, 0, 43042, 119212, 1377, 12869, + 4897, 42821, 9250, 0, 4438, 64385, 0, 1753, 11331, 6147, 194941, 43282, + 8833, 0, 0, 6504, 78408, 126979, 10719, 0, 1898, 1413, 42443, 0, 802, + 12141, 0, 194671, 6648, 10671, 2528, 0, 64789, 9169, 838, 127092, 120697, + 844, 5014, 0, 256, 0, 9990, 0, 42739, 917851, 7542, 65464, 9726, 0, 6489, + 10048, 74326, 78719, 66573, 0, 78724, 78712, 11761, 194655, 0, 41094, 0, + 0, 0, 0, 92689, 6196, 6945, 194628, 194890, 128184, 120491, 11816, + 194943, 5733, 2930, 0, 0, 41098, 0, 41093, 0, 66626, 588, 9760, 0, + 194717, 1238, 200, 0, 1660, 73916, 0, 118905, 74362, 0, 92485, 194651, 0, + 983441, 3394, 194894, 120668, 0, 0, 127358, 66219, 127183, 43284, 194657, + 7817, 1841, 11055, 120533, 194979, 194982, 1669, 10776, 194981, 7701, + 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, 0, + 65324, 914, 65323, 8071, 3538, 0, 78713, 65328, 92441, 74367, 7614, 0, + 11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 92618, + 5734, 8960, 0, 92527, 65317, 77880, 0, 0, 0, 12304, 0, 0, 65315, 92670, + 128511, 0, 0, 0, 119621, 92529, 74536, 12447, 64486, 127374, 0, 0, 0, 0, + 983537, 42767, 10915, 0, 12007, 43695, 120520, 11975, 194878, 0, 92604, + 2555, 8629, 0, 43168, 41872, 43706, 4496, 194879, 128148, 0, 0, 0, 0, 0, + 64730, 0, 66714, 68222, 0, 0, 65596, 92306, 11416, 4280, 67655, 8765, + 12784, 7792, 1393, 127242, 67871, 74386, 0, 8233, 12820, 0, 6683, 194876, + 3442, 12144, 2841, 12543, 0, 1473, 42820, 64329, 127832, 0, 68642, 6488, + 357, 1048, 41100, 0, 41104, 0, 3406, 1054, 119065, 1040, 65450, 0, 4434, + 1069, 0, 118862, 65737, 917765, 128705, 0, 983428, 9693, 41943, 0, 41931, + 41759, 12757, 4353, 0, 1059, 9790, 8995, 128286, 983431, 65937, 0, 41764, + 10646, 0, 118833, 92372, 0, 74830, 78569, 12743, 983424, 6480, 917761, + 41779, 42580, 66601, 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, + 41767, 0, 983499, 43020, 128271, 3955, 74254, 0, 983489, 917861, 0, + 77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, 127093, 12797, + 2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, 128061, 78574, + 0, 0, 0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, 43812, 42144, + 65015, 0, 563, 0, 983426, 12798, 11271, 57, 0, 0, 917860, 119043, 0, + 119134, 43137, 694, 0, 9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, + 7229, 12761, 0, 0, 13025, 64811, 8757, 78824, 0, 1574, 7381, 0, 2525, + 4852, 5749, 68465, 13027, 42824, 120574, 1039, 7151, 10155, 5745, 188, + 41858, 11592, 0, 74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, + 0, 4856, 8051, 0, 119609, 0, 9644, 0, 0, 0, 194916, 120732, 66710, + 118834, 0, 73906, 0, 127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, + 194918, 68393, 0, 3504, 119178, 0, 10822, 5149, 66029, 10226, 65142, 0, + 3594, 42424, 194959, 40, 12657, 983400, 0, 386, 0, 8834, 0, 12815, 43574, + 0, 73907, 0, 74196, 7220, 74504, 0, 74316, 0, 77932, 4304, 74503, 8160, + 78707, 194753, 0, 0, 0, 1348, 92349, 78597, 0, 13303, 0, 92392, 194755, + 7599, 1278, 43616, 13269, 0, 0, 74387, 78179, 78598, 74492, 6097, 7568, + 8780, 4982, 127464, 74501, 194763, 78592, 194762, 2672, 3735, 127471, + 13138, 42266, 9484, 10724, 41202, 119024, 0, 43742, 0, 9487, 119959, + 119117, 3842, 128768, 78668, 12442, 6193, 9791, 127976, 0, 42516, 7228, + 7559, 74803, 78468, 7873, 11399, 119219, 194691, 194855, 194690, 194857, + 3604, 983388, 119188, 128877, 78540, 78541, 42507, 1962, 43305, 78476, + 42505, 11660, 0, 2072, 92312, 6995, 74173, 5437, 74174, 10669, 8702, + 7964, 92352, 0, 199, 194843, 4105, 194845, 194699, 194847, 194710, + 119875, 13148, 7560, 78479, 9226, 78480, 195070, 6472, 65814, 73954, 0, + 4724, 0, 0, 9191, 0, 64432, 983552, 0, 195024, 10196, 7886, 0, 6585, 0, + 6680, 195042, 0, 195051, 6679, 74412, 92251, 194866, 74421, 11382, + 983366, 983372, 127891, 127484, 194833, 194832, 6681, 127482, 12693, + 194836, 42727, 194838, 128252, 78195, 65442, 119610, 69733, 9989, 43248, + 66248, 194816, 0, 194818, 128845, 194820, 194819, 5297, 7042, 13284, + 6112, 7968, 194825, 73927, 92444, 194736, 65746, 127476, 74409, 74389, + 128696, 4342, 42839, 194831, 1677, 0, 0, 194806, 917855, 11091, 11011, + 2719, 0, 0, 119595, 10160, 0, 0, 7585, 65169, 2052, 4308, 92174, 74177, + 7505, 543, 64916, 64736, 0, 0, 64655, 0, 118922, 2064, 0, 43158, 7902, 0, + 65265, 194639, 0, 127170, 0, 0, 0, 0, 12994, 92728, 10828, 983675, 6228, + 4307, 3482, 128527, 0, 0, 0, 506, 74573, 41194, 65735, 2055, 43255, + 41195, 0, 8169, 983415, 8841, 0, 516, 0, 2063, 119051, 34, 128850, + 120186, 11504, 1612, 74333, 120182, 74520, 74308, 12001, 120178, 10242, + 64564, 120179, 120174, 6584, 7749, 11037, 0, 1758, 0, 10667, 10560, + 120197, 92593, 1935, 11517, 120193, 120196, 120195, 1931, 120189, 74839, + 120191, 1217, 64702, 12643, 825, 127838, 194905, 12294, 92428, 78834, + 9138, 78831, 78833, 12631, 78829, 11080, 74554, 64000, 5591, 1239, 0, + 11313, 0, 3403, 0, 0, 64364, 92269, 0, 74582, 8998, 12988, 0, 9152, + 983584, 0, 194898, 67589, 41850, 64290, 3433, 92393, 12615, 1594, 42192, + 6914, 67603, 0, 119569, 74565, 41353, 67602, 67611, 4337, 0, 127296, 918, + 65035, 41351, 7681, 194900, 42577, 41393, 12668, 194904, 2477, 127285, 0, + 127301, 0, 67604, 194880, 127235, 573, 127282, 194884, 11417, 194886, + 119814, 194888, 67599, 0, 194889, 67607, 11482, 0, 3981, 3357, 0, 42223, + 4207, 1288, 78842, 78839, 68419, 78837, 11589, 42195, 194872, 194599, + 127263, 64602, 67618, 92539, 0, 42788, 68416, 64480, 194875, 8423, 3348, + 448, 68476, 9717, 0, 0, 997, 0, 0, 92577, 0, 11440, 11379, 42000, 13139, + 42221, 65013, 126999, 127760, 73796, 0, 119228, 12035, 0, 2818, 0, 0, + 73793, 0, 4172, 0, 0, 8373, 10873, 12197, 0, 0, 92265, 69706, 0, 78210, + 0, 128110, 194865, 126982, 74563, 64828, 11419, 194868, 766, 1257, 0, + 118845, 11381, 3265, 66617, 3274, 127365, 983432, 0, 0, 74522, 41989, 0, + 0, 128798, 3263, 0, 65672, 0, 3270, 64539, 11489, 0, 0, 0, 0, 9505, + 65518, 194776, 756, 194605, 0, 0, 0, 7261, 0, 186, 0, 119156, 5770, + 13179, 65830, 12612, 12949, 64856, 12800, 0, 74203, 64718, 0, 0, 92434, + 118929, 0, 11578, 0, 119296, 0, 0, 0, 0, 74568, 9254, 0, 1794, 120217, + 64521, 5624, 120220, 120221, 119958, 120223, 3617, 66636, 64886, 120211, + 120212, 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, + 4452, 0, 983506, 92526, 4511, 0, 0, 64678, 11425, 0, 43245, 1231, 194783, + 0, 0, 9003, 8192, 0, 5305, 9653, 10616, 8694, 9546, 0, 0, 120478, 120200, + 65205, 120202, 64063, 9878, 74780, 119626, 78202, 64058, 8799, 42131, 0, + 64062, 1028, 64060, 64059, 837, 10567, 0, 43103, 0, 120754, 11427, 2902, + 64043, 64042, 66464, 10756, 0, 42606, 64045, 64044, 43979, 10076, 64040, + 43060, 194942, 1034, 3392, 127771, 43091, 64033, 64032, 42735, 64038, + 64037, 64036, 64035, 4291, 194928, 64015, 64014, 64681, 194930, 0, 78145, + 0, 43090, 0, 3476, 8973, 64012, 42473, 64010, 64008, 64007, 2003, 7706, + 64517, 78153, 2538, 64009, 204, 0, 4802, 4111, 8239, 9098, 4805, 64001, + 64057, 7885, 7247, 64054, 0, 0, 4767, 9343, 64049, 64048, 120034, 1133, + 64053, 64052, 43453, 64050, 41340, 118975, 194835, 10005, 12329, 41333, + 0, 8489, 1942, 0, 194834, 42520, 128249, 0, 0, 10760, 64023, 64022, + 64021, 6582, 43670, 0, 64025, 9167, 42151, 78244, 0, 2026, 64019, 64018, + 64017, 64016, 12768, 0, 7582, 78252, 78248, 77914, 78246, 78247, 0, + 77915, 78766, 6788, 13094, 77920, 7532, 41414, 78520, 3179, 78518, 64769, + 78514, 78517, 11461, 74454, 10751, 9051, 120720, 6708, 10535, 0, 68218, + 55274, 2008, 64031, 64030, 294, 41874, 0, 126991, 65929, 0, 0, 0, 0, + 64028, 8146, 64026, 41788, 194844, 0, 118795, 6343, 43247, 119888, 0, + 119886, 119891, 119892, 119889, 11433, 119895, 119896, 0, 7801, 65578, + 194839, 12915, 43968, 3297, 9699, 194955, 1135, 0, 0, 128525, 1995, 6722, + 983657, 0, 2552, 41546, 60, 68394, 8649, 41549, 78496, 0, 0, 6682, 0, + 78679, 64710, 41547, 0, 2013, 128291, 78530, 78532, 78528, 78529, 12832, + 78493, 8081, 8362, 3537, 119908, 9137, 7155, 8999, 0, 78533, 3466, 0, 0, + 1996, 0, 3453, 6282, 0, 2002, 2000, 120175, 537, 0, 4179, 65119, 1998, 0, + 1842, 0, 92674, 9628, 68446, 12081, 9826, 64502, 1767, 0, 0, 0, 120201, + 983381, 0, 0, 3059, 44024, 120204, 119953, 92693, 0, 0, 92452, 4100, 920, + 1811, 1355, 0, 0, 3592, 10078, 0, 0, 0, 8592, 65870, 68164, 128792, + 10742, 0, 42918, 1994, 9281, 3296, 12865, 1997, 1895, }; #define code_magic 47 #define code_size 32768 #define code_poly 32771 + +static const unsigned int aliases_start = 0xf0000; +static const unsigned int aliases_end = 0xf000b; +static const unsigned int name_aliases[] = { + 0x01A2, + 0x01A3, + 0x0CDE, + 0x0E9D, + 0x0E9F, + 0x0EA3, + 0x0EA5, + 0x0FD0, + 0xA015, + 0xFE18, + 0x1D0C5, +}; + +typedef struct NamedSequence { + int seqlen; + Py_UCS2 seq[4]; +} named_sequence; + +static const unsigned int named_sequences_start = 0xf0100; +static const unsigned int named_sequences_end = 0xf02a2; +static const named_sequence named_sequences[] = { + {2, {0x0100, 0x0300}}, + {2, {0x0101, 0x0300}}, + {2, {0x0045, 0x0329}}, + {2, {0x0065, 0x0329}}, + {2, {0x00C8, 0x0329}}, + {2, {0x00E8, 0x0329}}, + {2, {0x00C9, 0x0329}}, + {2, {0x00E9, 0x0329}}, + {2, {0x00CA, 0x0304}}, + {2, {0x00EA, 0x0304}}, + {2, {0x00CA, 0x030C}}, + {2, {0x00EA, 0x030C}}, + {2, {0x012A, 0x0300}}, + {2, {0x012B, 0x0300}}, + {3, {0x0069, 0x0307, 0x0301}}, + {3, {0x006E, 0x0360, 0x0067}}, + {2, {0x004F, 0x0329}}, + {2, {0x006F, 0x0329}}, + {2, {0x00D2, 0x0329}}, + {2, {0x00F2, 0x0329}}, + {2, {0x00D3, 0x0329}}, + {2, {0x00F3, 0x0329}}, + {2, {0x0053, 0x0329}}, + {2, {0x0073, 0x0329}}, + {2, {0x016A, 0x0300}}, + {2, {0x016B, 0x0300}}, + {2, {0x0104, 0x0301}}, + {2, {0x0105, 0x0301}}, + {2, {0x0104, 0x0303}}, + {2, {0x0105, 0x0303}}, + {2, {0x0118, 0x0301}}, + {2, {0x0119, 0x0301}}, + {2, {0x0118, 0x0303}}, + {2, {0x0119, 0x0303}}, + {2, {0x0116, 0x0301}}, + {2, {0x0117, 0x0301}}, + {2, {0x0116, 0x0303}}, + {2, {0x0117, 0x0303}}, + {3, {0x0069, 0x0307, 0x0300}}, + {3, {0x0069, 0x0307, 0x0303}}, + {2, {0x012E, 0x0301}}, + {3, {0x012F, 0x0307, 0x0301}}, + {2, {0x012E, 0x0303}}, + {3, {0x012F, 0x0307, 0x0303}}, + {2, {0x004A, 0x0303}}, + {3, {0x006A, 0x0307, 0x0303}}, + {2, {0x004C, 0x0303}}, + {2, {0x006C, 0x0303}}, + {2, {0x004D, 0x0303}}, + {2, {0x006D, 0x0303}}, + {2, {0x0052, 0x0303}}, + {2, {0x0072, 0x0303}}, + {2, {0x0172, 0x0301}}, + {2, {0x0173, 0x0301}}, + {2, {0x0172, 0x0303}}, + {2, {0x0173, 0x0303}}, + {2, {0x016A, 0x0301}}, + {2, {0x016B, 0x0301}}, + {2, {0x016A, 0x0303}}, + {2, {0x016B, 0x0303}}, + {2, {0x00E6, 0x0300}}, + {2, {0x0254, 0x0300}}, + {2, {0x0254, 0x0301}}, + {2, {0x028C, 0x0300}}, + {2, {0x028C, 0x0301}}, + {2, {0x0259, 0x0300}}, + {2, {0x0259, 0x0301}}, + {2, {0x025A, 0x0300}}, + {2, {0x025A, 0x0301}}, + {3, {0x0995, 0x09CD, 0x09B7}}, + {2, {0x0B95, 0x0BCD}}, + {2, {0x0B99, 0x0BCD}}, + {2, {0x0B9A, 0x0BCD}}, + {2, {0x0B9E, 0x0BCD}}, + {2, {0x0B9F, 0x0BCD}}, + {2, {0x0BA3, 0x0BCD}}, + {2, {0x0BA4, 0x0BCD}}, + {2, {0x0BA8, 0x0BCD}}, + {2, {0x0BAA, 0x0BCD}}, + {2, {0x0BAE, 0x0BCD}}, + {2, {0x0BAF, 0x0BCD}}, + {2, {0x0BB0, 0x0BCD}}, + {2, {0x0BB2, 0x0BCD}}, + {2, {0x0BB5, 0x0BCD}}, + {2, {0x0BB4, 0x0BCD}}, + {2, {0x0BB3, 0x0BCD}}, + {2, {0x0BB1, 0x0BCD}}, + {2, {0x0BA9, 0x0BCD}}, + {2, {0x0B9C, 0x0BCD}}, + {2, {0x0BB6, 0x0BCD}}, + {2, {0x0BB7, 0x0BCD}}, + {2, {0x0BB8, 0x0BCD}}, + {2, {0x0BB9, 0x0BCD}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCD}}, + {2, {0x0B95, 0x0BBE}}, + {2, {0x0B95, 0x0BBF}}, + {2, {0x0B95, 0x0BC0}}, + {2, {0x0B95, 0x0BC1}}, + {2, {0x0B95, 0x0BC2}}, + {2, {0x0B95, 0x0BC6}}, + {2, {0x0B95, 0x0BC7}}, + {2, {0x0B95, 0x0BC8}}, + {2, {0x0B95, 0x0BCA}}, + {2, {0x0B95, 0x0BCB}}, + {2, {0x0B95, 0x0BCC}}, + {2, {0x0B99, 0x0BBE}}, + {2, {0x0B99, 0x0BBF}}, + {2, {0x0B99, 0x0BC0}}, + {2, {0x0B99, 0x0BC1}}, + {2, {0x0B99, 0x0BC2}}, + {2, {0x0B99, 0x0BC6}}, + {2, {0x0B99, 0x0BC7}}, + {2, {0x0B99, 0x0BC8}}, + {2, {0x0B99, 0x0BCA}}, + {2, {0x0B99, 0x0BCB}}, + {2, {0x0B99, 0x0BCC}}, + {2, {0x0B9A, 0x0BBE}}, + {2, {0x0B9A, 0x0BBF}}, + {2, {0x0B9A, 0x0BC0}}, + {2, {0x0B9A, 0x0BC1}}, + {2, {0x0B9A, 0x0BC2}}, + {2, {0x0B9A, 0x0BC6}}, + {2, {0x0B9A, 0x0BC7}}, + {2, {0x0B9A, 0x0BC8}}, + {2, {0x0B9A, 0x0BCA}}, + {2, {0x0B9A, 0x0BCB}}, + {2, {0x0B9A, 0x0BCC}}, + {2, {0x0B9E, 0x0BBE}}, + {2, {0x0B9E, 0x0BBF}}, + {2, {0x0B9E, 0x0BC0}}, + {2, {0x0B9E, 0x0BC1}}, + {2, {0x0B9E, 0x0BC2}}, + {2, {0x0B9E, 0x0BC6}}, + {2, {0x0B9E, 0x0BC7}}, + {2, {0x0B9E, 0x0BC8}}, + {2, {0x0B9E, 0x0BCA}}, + {2, {0x0B9E, 0x0BCB}}, + {2, {0x0B9E, 0x0BCC}}, + {2, {0x0B9F, 0x0BBE}}, + {2, {0x0B9F, 0x0BBF}}, + {2, {0x0B9F, 0x0BC0}}, + {2, {0x0B9F, 0x0BC1}}, + {2, {0x0B9F, 0x0BC2}}, + {2, {0x0B9F, 0x0BC6}}, + {2, {0x0B9F, 0x0BC7}}, + {2, {0x0B9F, 0x0BC8}}, + {2, {0x0B9F, 0x0BCA}}, + {2, {0x0B9F, 0x0BCB}}, + {2, {0x0B9F, 0x0BCC}}, + {2, {0x0BA3, 0x0BBE}}, + {2, {0x0BA3, 0x0BBF}}, + {2, {0x0BA3, 0x0BC0}}, + {2, {0x0BA3, 0x0BC1}}, + {2, {0x0BA3, 0x0BC2}}, + {2, {0x0BA3, 0x0BC6}}, + {2, {0x0BA3, 0x0BC7}}, + {2, {0x0BA3, 0x0BC8}}, + {2, {0x0BA3, 0x0BCA}}, + {2, {0x0BA3, 0x0BCB}}, + {2, {0x0BA3, 0x0BCC}}, + {2, {0x0BA4, 0x0BBE}}, + {2, {0x0BA4, 0x0BBF}}, + {2, {0x0BA4, 0x0BC0}}, + {2, {0x0BA4, 0x0BC1}}, + {2, {0x0BA4, 0x0BC2}}, + {2, {0x0BA4, 0x0BC6}}, + {2, {0x0BA4, 0x0BC7}}, + {2, {0x0BA4, 0x0BC8}}, + {2, {0x0BA4, 0x0BCA}}, + {2, {0x0BA4, 0x0BCB}}, + {2, {0x0BA4, 0x0BCC}}, + {2, {0x0BA8, 0x0BBE}}, + {2, {0x0BA8, 0x0BBF}}, + {2, {0x0BA8, 0x0BC0}}, + {2, {0x0BA8, 0x0BC1}}, + {2, {0x0BA8, 0x0BC2}}, + {2, {0x0BA8, 0x0BC6}}, + {2, {0x0BA8, 0x0BC7}}, + {2, {0x0BA8, 0x0BC8}}, + {2, {0x0BA8, 0x0BCA}}, + {2, {0x0BA8, 0x0BCB}}, + {2, {0x0BA8, 0x0BCC}}, + {2, {0x0BAA, 0x0BBE}}, + {2, {0x0BAA, 0x0BBF}}, + {2, {0x0BAA, 0x0BC0}}, + {2, {0x0BAA, 0x0BC1}}, + {2, {0x0BAA, 0x0BC2}}, + {2, {0x0BAA, 0x0BC6}}, + {2, {0x0BAA, 0x0BC7}}, + {2, {0x0BAA, 0x0BC8}}, + {2, {0x0BAA, 0x0BCA}}, + {2, {0x0BAA, 0x0BCB}}, + {2, {0x0BAA, 0x0BCC}}, + {2, {0x0BAE, 0x0BBE}}, + {2, {0x0BAE, 0x0BBF}}, + {2, {0x0BAE, 0x0BC0}}, + {2, {0x0BAE, 0x0BC1}}, + {2, {0x0BAE, 0x0BC2}}, + {2, {0x0BAE, 0x0BC6}}, + {2, {0x0BAE, 0x0BC7}}, + {2, {0x0BAE, 0x0BC8}}, + {2, {0x0BAE, 0x0BCA}}, + {2, {0x0BAE, 0x0BCB}}, + {2, {0x0BAE, 0x0BCC}}, + {2, {0x0BAF, 0x0BBE}}, + {2, {0x0BAF, 0x0BBF}}, + {2, {0x0BAF, 0x0BC0}}, + {2, {0x0BAF, 0x0BC1}}, + {2, {0x0BAF, 0x0BC2}}, + {2, {0x0BAF, 0x0BC6}}, + {2, {0x0BAF, 0x0BC7}}, + {2, {0x0BAF, 0x0BC8}}, + {2, {0x0BAF, 0x0BCA}}, + {2, {0x0BAF, 0x0BCB}}, + {2, {0x0BAF, 0x0BCC}}, + {2, {0x0BB0, 0x0BBE}}, + {2, {0x0BB0, 0x0BBF}}, + {2, {0x0BB0, 0x0BC0}}, + {2, {0x0BB0, 0x0BC1}}, + {2, {0x0BB0, 0x0BC2}}, + {2, {0x0BB0, 0x0BC6}}, + {2, {0x0BB0, 0x0BC7}}, + {2, {0x0BB0, 0x0BC8}}, + {2, {0x0BB0, 0x0BCA}}, + {2, {0x0BB0, 0x0BCB}}, + {2, {0x0BB0, 0x0BCC}}, + {2, {0x0BB2, 0x0BBE}}, + {2, {0x0BB2, 0x0BBF}}, + {2, {0x0BB2, 0x0BC0}}, + {2, {0x0BB2, 0x0BC1}}, + {2, {0x0BB2, 0x0BC2}}, + {2, {0x0BB2, 0x0BC6}}, + {2, {0x0BB2, 0x0BC7}}, + {2, {0x0BB2, 0x0BC8}}, + {2, {0x0BB2, 0x0BCA}}, + {2, {0x0BB2, 0x0BCB}}, + {2, {0x0BB2, 0x0BCC}}, + {2, {0x0BB5, 0x0BBE}}, + {2, {0x0BB5, 0x0BBF}}, + {2, {0x0BB5, 0x0BC0}}, + {2, {0x0BB5, 0x0BC1}}, + {2, {0x0BB5, 0x0BC2}}, + {2, {0x0BB5, 0x0BC6}}, + {2, {0x0BB5, 0x0BC7}}, + {2, {0x0BB5, 0x0BC8}}, + {2, {0x0BB5, 0x0BCA}}, + {2, {0x0BB5, 0x0BCB}}, + {2, {0x0BB5, 0x0BCC}}, + {2, {0x0BB4, 0x0BBE}}, + {2, {0x0BB4, 0x0BBF}}, + {2, {0x0BB4, 0x0BC0}}, + {2, {0x0BB4, 0x0BC1}}, + {2, {0x0BB4, 0x0BC2}}, + {2, {0x0BB4, 0x0BC6}}, + {2, {0x0BB4, 0x0BC7}}, + {2, {0x0BB4, 0x0BC8}}, + {2, {0x0BB4, 0x0BCA}}, + {2, {0x0BB4, 0x0BCB}}, + {2, {0x0BB4, 0x0BCC}}, + {2, {0x0BB3, 0x0BBE}}, + {2, {0x0BB3, 0x0BBF}}, + {2, {0x0BB3, 0x0BC0}}, + {2, {0x0BB3, 0x0BC1}}, + {2, {0x0BB3, 0x0BC2}}, + {2, {0x0BB3, 0x0BC6}}, + {2, {0x0BB3, 0x0BC7}}, + {2, {0x0BB3, 0x0BC8}}, + {2, {0x0BB3, 0x0BCA}}, + {2, {0x0BB3, 0x0BCB}}, + {2, {0x0BB3, 0x0BCC}}, + {2, {0x0BB1, 0x0BBE}}, + {2, {0x0BB1, 0x0BBF}}, + {2, {0x0BB1, 0x0BC0}}, + {2, {0x0BB1, 0x0BC1}}, + {2, {0x0BB1, 0x0BC2}}, + {2, {0x0BB1, 0x0BC6}}, + {2, {0x0BB1, 0x0BC7}}, + {2, {0x0BB1, 0x0BC8}}, + {2, {0x0BB1, 0x0BCA}}, + {2, {0x0BB1, 0x0BCB}}, + {2, {0x0BB1, 0x0BCC}}, + {2, {0x0BA9, 0x0BBE}}, + {2, {0x0BA9, 0x0BBF}}, + {2, {0x0BA9, 0x0BC0}}, + {2, {0x0BA9, 0x0BC1}}, + {2, {0x0BA9, 0x0BC2}}, + {2, {0x0BA9, 0x0BC6}}, + {2, {0x0BA9, 0x0BC7}}, + {2, {0x0BA9, 0x0BC8}}, + {2, {0x0BA9, 0x0BCA}}, + {2, {0x0BA9, 0x0BCB}}, + {2, {0x0BA9, 0x0BCC}}, + {2, {0x0B9C, 0x0BBE}}, + {2, {0x0B9C, 0x0BBF}}, + {2, {0x0B9C, 0x0BC0}}, + {2, {0x0B9C, 0x0BC1}}, + {2, {0x0B9C, 0x0BC2}}, + {2, {0x0B9C, 0x0BC6}}, + {2, {0x0B9C, 0x0BC7}}, + {2, {0x0B9C, 0x0BC8}}, + {2, {0x0B9C, 0x0BCA}}, + {2, {0x0B9C, 0x0BCB}}, + {2, {0x0B9C, 0x0BCC}}, + {2, {0x0BB6, 0x0BBE}}, + {2, {0x0BB6, 0x0BBF}}, + {2, {0x0BB6, 0x0BC0}}, + {2, {0x0BB6, 0x0BC1}}, + {2, {0x0BB6, 0x0BC2}}, + {2, {0x0BB6, 0x0BC6}}, + {2, {0x0BB6, 0x0BC7}}, + {2, {0x0BB6, 0x0BC8}}, + {2, {0x0BB6, 0x0BCA}}, + {2, {0x0BB6, 0x0BCB}}, + {2, {0x0BB6, 0x0BCC}}, + {2, {0x0BB7, 0x0BBE}}, + {2, {0x0BB7, 0x0BBF}}, + {2, {0x0BB7, 0x0BC0}}, + {2, {0x0BB7, 0x0BC1}}, + {2, {0x0BB7, 0x0BC2}}, + {2, {0x0BB7, 0x0BC6}}, + {2, {0x0BB7, 0x0BC7}}, + {2, {0x0BB7, 0x0BC8}}, + {2, {0x0BB7, 0x0BCA}}, + {2, {0x0BB7, 0x0BCB}}, + {2, {0x0BB7, 0x0BCC}}, + {2, {0x0BB8, 0x0BBE}}, + {2, {0x0BB8, 0x0BBF}}, + {2, {0x0BB8, 0x0BC0}}, + {2, {0x0BB8, 0x0BC1}}, + {2, {0x0BB8, 0x0BC2}}, + {2, {0x0BB8, 0x0BC6}}, + {2, {0x0BB8, 0x0BC7}}, + {2, {0x0BB8, 0x0BC8}}, + {2, {0x0BB8, 0x0BCA}}, + {2, {0x0BB8, 0x0BCB}}, + {2, {0x0BB8, 0x0BCC}}, + {2, {0x0BB9, 0x0BBE}}, + {2, {0x0BB9, 0x0BBF}}, + {2, {0x0BB9, 0x0BC0}}, + {2, {0x0BB9, 0x0BC1}}, + {2, {0x0BB9, 0x0BC2}}, + {2, {0x0BB9, 0x0BC6}}, + {2, {0x0BB9, 0x0BC7}}, + {2, {0x0BB9, 0x0BC8}}, + {2, {0x0BB9, 0x0BCA}}, + {2, {0x0BB9, 0x0BCB}}, + {2, {0x0BB9, 0x0BCC}}, + {3, {0x0B95, 0x0BCD, 0x0BB7}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BBE}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BBF}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC0}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC1}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC2}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC6}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC7}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BC8}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCA}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCB}}, + {4, {0x0B95, 0x0BCD, 0x0BB7, 0x0BCC}}, + {4, {0x0BB6, 0x0BCD, 0x0BB0, 0x0BC0}}, + {2, {0x10E3, 0x0302}}, + {2, {0x17D2, 0x1780}}, + {2, {0x17D2, 0x1781}}, + {2, {0x17D2, 0x1782}}, + {2, {0x17D2, 0x1783}}, + {2, {0x17D2, 0x1784}}, + {2, {0x17D2, 0x1785}}, + {2, {0x17D2, 0x1786}}, + {2, {0x17D2, 0x1787}}, + {2, {0x17D2, 0x1788}}, + {2, {0x17D2, 0x1789}}, + {2, {0x17D2, 0x178A}}, + {2, {0x17D2, 0x178B}}, + {2, {0x17D2, 0x178C}}, + {2, {0x17D2, 0x178D}}, + {2, {0x17D2, 0x178E}}, + {2, {0x17D2, 0x178F}}, + {2, {0x17D2, 0x1790}}, + {2, {0x17D2, 0x1791}}, + {2, {0x17D2, 0x1792}}, + {2, {0x17D2, 0x1793}}, + {2, {0x17D2, 0x1794}}, + {2, {0x17D2, 0x1795}}, + {2, {0x17D2, 0x1796}}, + {2, {0x17D2, 0x1797}}, + {2, {0x17D2, 0x1798}}, + {2, {0x17D2, 0x1799}}, + {2, {0x17D2, 0x179A}}, + {2, {0x17D2, 0x179B}}, + {2, {0x17D2, 0x179C}}, + {2, {0x17D2, 0x179D}}, + {2, {0x17D2, 0x179E}}, + {2, {0x17D2, 0x179F}}, + {2, {0x17D2, 0x17A0}}, + {2, {0x17D2, 0x17A1}}, + {2, {0x17D2, 0x17A2}}, + {2, {0x17D2, 0x17A7}}, + {2, {0x17D2, 0x17AB}}, + {2, {0x17D2, 0x17AC}}, + {2, {0x17D2, 0x17AF}}, + {2, {0x17BB, 0x17C6}}, + {2, {0x17B6, 0x17C6}}, + {2, {0x304B, 0x309A}}, + {2, {0x304D, 0x309A}}, + {2, {0x304F, 0x309A}}, + {2, {0x3051, 0x309A}}, + {2, {0x3053, 0x309A}}, + {2, {0x30AB, 0x309A}}, + {2, {0x30AD, 0x309A}}, + {2, {0x30AF, 0x309A}}, + {2, {0x30B1, 0x309A}}, + {2, {0x30B3, 0x309A}}, + {2, {0x30BB, 0x309A}}, + {2, {0x30C4, 0x309A}}, + {2, {0x30C8, 0x309A}}, + {2, {0x31F7, 0x309A}}, + {2, {0x02E5, 0x02E9}}, + {2, {0x02E9, 0x02E5}}, +}; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -5857,7 +5857,7 @@ message = "unknown Unicode character name"; s++; if (ucnhash_CAPI->getcode(NULL, start, (int)(s-start-1), - &chr)) + &chr, 0)) goto store; } } diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -21,11 +21,17 @@ # 2004-05-29 perky add east asian width information # 2006-03-10 mvl update to Unicode 4.1; add UCD 3.2 delta # 2008-06-11 gb add PRINTABLE_MASK for Atsuo Ishimoto's ascii() patch +# 2011-10-21 ezio add support for name aliases and named sequences # # written by Fredrik Lundh (fredrik at pythonware.com) # -import sys, os, zipfile +import os +import sys +import zipfile + +from textwrap import dedent +from operator import itemgetter SCRIPT = sys.argv[0] VERSION = "3.2" @@ -39,6 +45,17 @@ DERIVED_CORE_PROPERTIES = "DerivedCoreProperties%s.txt" DERIVEDNORMALIZATION_PROPS = "DerivedNormalizationProps%s.txt" LINE_BREAK = "LineBreak%s.txt" +NAME_ALIASES = "NameAliases%s.txt" +NAMED_SEQUENCES = "NamedSequences%s.txt" + +# Private Use Areas -- in planes 1, 15, 16 +PUA_1 = range(0xE000, 0xF900) +PUA_15 = range(0xF0000, 0xFFFFE) +PUA_16 = range(0x100000, 0x10FFFE) + +# we use this ranges of PUA_15 to store name aliases and named sequences +NAME_ALIASES_START = 0xF0000 +NAMED_SEQUENCES_START = 0xF0100 old_versions = ["3.2.0"] @@ -692,6 +709,39 @@ print("/* name->code dictionary */", file=fp) codehash.dump(fp, trace) + print(file=fp) + print('static const unsigned int aliases_start = %#x;' % + NAME_ALIASES_START, file=fp) + print('static const unsigned int aliases_end = %#x;' % + (NAME_ALIASES_START + len(unicode.aliases)), file=fp) + + print('static const unsigned int name_aliases[] = {', file=fp) + for name, codepoint in unicode.aliases: + print(' 0x%04X,' % codepoint, file=fp) + print('};', file=fp) + + # In Unicode 6.0.0, the sequences contain at most 4 BMP chars, + # so we are using Py_UCS2 seq[4]. This needs to be updated if longer + # sequences or sequences with non-BMP chars are added. + # unicodedata_lookup should be adapted too. + print(dedent(""" + typedef struct NamedSequence { + int seqlen; + Py_UCS2 seq[4]; + } named_sequence; + """), file=fp) + + print('static const unsigned int named_sequences_start = %#x;' % + NAMED_SEQUENCES_START, file=fp) + print('static const unsigned int named_sequences_end = %#x;' % + (NAMED_SEQUENCES_START + len(unicode.named_sequences)), file=fp) + + print('static const named_sequence named_sequences[] = {', file=fp) + for name, sequence in unicode.named_sequences: + seq_str = ', '.join('0x%04X' % cp for cp in sequence) + print(' {%d, {%s}},' % (len(sequence), seq_str), file=fp) + print('};', file=fp) + fp.close() @@ -726,7 +776,11 @@ for k in range(len(old.table[i])): if old.table[i][k] != new.table[i][k]: value = old.table[i][k] - if k == 2: + if k == 1 and i in PUA_15: + # the name is not set in the old.table, but in the + # new.table we are using it for aliases and named seq + assert value == '' + elif k == 2: #print "CATEGORY",hex(i), old.table[i][k], new.table[i][k] category_changes[i] = CATEGORY_NAMES.index(value) elif k == 4: @@ -855,6 +909,50 @@ self.table = table self.chars = list(range(0x110000)) # unicode 3.2 + # check for name aliases and named sequences, see #12753 + # aliases and named sequences are not in 3.2.0 + if version != '3.2.0': + self.aliases = [] + # store aliases in the Private Use Area 15, in range U+F0000..U+F00FF, + # in order to take advantage of the compression and lookup + # algorithms used for the other characters + pua_index = NAME_ALIASES_START + with open_data(NAME_ALIASES, version) as file: + for s in file: + s = s.strip() + if not s or s.startswith('#'): + continue + char, name = s.split(';') + char = int(char, 16) + self.aliases.append((name, char)) + # also store the name in the PUA 1 + self.table[pua_index][1] = name + pua_index += 1 + assert pua_index - NAME_ALIASES_START == len(self.aliases) + + self.named_sequences = [] + # store named seqences in the PUA 1, in range U+F0100.., + # in order to take advantage of the compression and lookup + # algorithms used for the other characters. + + pua_index = NAMED_SEQUENCES_START + with open_data(NAMED_SEQUENCES, version) as file: + for s in file: + s = s.strip() + if not s or s.startswith('#'): + continue + name, chars = s.split(';') + chars = tuple(int(char, 16) for char in chars.split()) + # check that the structure defined in makeunicodename is OK + assert 2 <= len(chars) <= 4, "change the Py_UCS2 array size" + assert all(c <= 0xFFFF for c in chars), ("use Py_UCS4 in " + "the NamedSequence struct and in unicodedata_lookup") + self.named_sequences.append((name, chars)) + # also store these in the PUA 1 + self.table[pua_index][1] = name + pua_index += 1 + assert pua_index - NAMED_SEQUENCES_START == len(self.named_sequences) + self.exclusions = {} with open_data(COMPOSITION_EXCLUSIONS, version) as file: for s in file: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 22:26:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 21 Oct 2011 22:26:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_test_for_fi?= =?utf8?q?x_of_issue_=231730114=2E?= Message-ID: http://hg.python.org/cpython/rev/c91661e0d714 changeset: 73045:c91661e0d714 branch: 2.7 parent: 73037:d2f303861c98 user: Antoine Pitrou date: Fri Oct 21 22:22:04 2011 +0200 summary: Add test for fix of issue #1730114. files: Lib/test/test_StringIO.py | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py --- a/Lib/test/test_StringIO.py +++ b/Lib/test/test_StringIO.py @@ -4,6 +4,7 @@ import StringIO import cStringIO import types +import array from test import test_support @@ -127,6 +128,13 @@ class TestcStringIO(TestGenericStringIO): MODULE = cStringIO + def test_array_support(self): + # Issue + a = array.array('B', [0,1,2]) + f = self.MODULE.StringIO(a) + self.assertEqual(f.getvalue(), '\x00\x01\x02') + + import sys if sys.platform.startswith('java'): # Jython doesn't have a buffer object, so we just do a useless -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 22:26:49 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 21 Oct 2011 22:26:49 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Oops=2C_forgot_?= =?utf8?q?issue_number?= Message-ID: http://hg.python.org/cpython/rev/d30482d51c25 changeset: 73046:d30482d51c25 branch: 2.7 user: Antoine Pitrou date: Fri Oct 21 22:22:43 2011 +0200 summary: Oops, forgot issue number files: Lib/test/test_StringIO.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py --- a/Lib/test/test_StringIO.py +++ b/Lib/test/test_StringIO.py @@ -129,7 +129,7 @@ MODULE = cStringIO def test_array_support(self): - # Issue + # Issue #1730114: cStringIO should accept array objects a = array.array('B', [0,1,2]) f = self.MODULE.StringIO(a) self.assertEqual(f.getvalue(), '\x00\x01\x02') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 21 23:24:25 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 21 Oct 2011 23:24:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2312753=3A_fix_compilation?= =?utf8?q?_on_Windows=2E?= Message-ID: http://hg.python.org/cpython/rev/329b96fe4472 changeset: 73047:329b96fe4472 parent: 73044:a985d733b3a3 user: Ezio Melotti date: Sat Oct 22 00:24:17 2011 +0300 summary: #12753: fix compilation on Windows. files: Modules/unicodedata.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -953,9 +953,10 @@ if (self && UCD_Check(self)) { /* in 3.2.0 there are no aliases and named sequences */ + const change_record *old; if (IS_ALIAS(code) || IS_NAMED_SEQ(code)) return 0; - const change_record *old = get_old_record(self, code); + old = get_old_record(self, code); if (old->category_changed == 0) { /* unassigned */ return 0; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 00:01:42 2011 From: python-checkins at python.org (ezio.melotti) Date: Sat, 22 Oct 2011 00:01:42 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_unused_variable=2E?= Message-ID: http://hg.python.org/cpython/rev/63f8ab57a859 changeset: 73048:63f8ab57a859 user: Ezio Melotti date: Sat Oct 22 01:01:32 2011 +0300 summary: Remove unused variable. files: Objects/unicodeobject.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7382,7 +7382,6 @@ PyObject *exc = NULL; PyObject *encoding_obj = NULL; char *encoding; - int err; Py_ssize_t startpos, newpos, newoutsize; PyObject *rep; int ret = -1; -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Sat Oct 22 01:31:53 2011 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 22 Oct 2011 09:31:53 +1000 Subject: [Python-checkins] cpython: Issue 13227: Option to make the lru_cache() type specific (suggested by Andrew In-Reply-To: References: Message-ID: On Fri, Oct 21, 2011 at 1:57 AM, raymond.hettinger wrote: > + ? If *typed* is set to True, function arguments of different types will be > + ? cached separately. ?For example, ``f(3)`` and ``f(3.0)`` will be treated > + ? as distinct calls with distinct results. I've been pondering this one a bit since reviewing it on the tracker, and I'm wondering if we have the default behaviour the wrong way around. For "typed=True": - never results in accidental type coercion and potentially wrong answers* (see below) - cache uses additional memory (each entry is larger, more entries may be stored) - additional cache misses - differs from current behaviour For "typed=False" (current default): - matches current (pre-3.3) behaviour - can lead to accidental type coercion and incorrect answers I only just realised this morning that the existing (untyped) caching behaviour can give answers that are *numerically* wrong, not just of the wrong type. This becomes clear once we use division as our test operation rather than multiplication and bring Decimal into the mix: >>> from functools import lru_cache >>> @lru_cache() ... def divide(x, y): ... return x / y ... >>> from decimal import Decimal >>> 10 / 9 1.1111111111111112 >>> Decimal(10) / Decimal(9) Decimal('1.111111111111111111111111111') >>> divide(10, 9) 1.1111111111111112 >>> divide(Decimal(10), Decimal(9)) 1.1111111111111112 At the very least, I think lru_cache should default to typed behaviour in 3.3, with people being able to explicitly switch it off as a cache optimisation technique when they know it doesn't matter. You could even make the case that making the cache type aware under the hood in 3.2 would be a bug fix, and the only new feature in 3.3 would be the ability to switch off the type awareness to save memory. Regards, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From ncoghlan at gmail.com Sat Oct 22 01:37:35 2011 From: ncoghlan at gmail.com (Nick Coghlan) Date: Sat, 22 Oct 2011 09:37:35 +1000 Subject: [Python-checkins] =?windows-1252?q?cpython=3A_Document_that_packa?= =?windows-1252?q?ging_doesn=92t_create_=5F=5Finit=5F=5F=2Epy_files?= =?windows-1252?q?_=28=233902=29=2E?= In-Reply-To: References: Message-ID: On Fri, Oct 21, 2011 at 11:52 PM, eric.araujo wrote: > +To distribute extension modules that live in a package (e.g. ``package.ext``), > +you need to create you need to create a :file:`{package}/__init__.py` file to > +let Python recognize and import your module. "you need to create" is repeated in the new text. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Sat Oct 22 01:45:04 2011 From: python-checkins at python.org (eric.araujo) Date: Sat, 22 Oct 2011 01:45:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_text_duplication=2E__Sp?= =?utf8?q?otted_by_Nick_Coghlan=2C_thanks!?= Message-ID: http://hg.python.org/cpython/rev/0e7720a2a053 changeset: 73049:0e7720a2a053 user: ?ric Araujo date: Sat Oct 22 01:44:36 2011 +0200 summary: Fix text duplication. Spotted by Nick Coghlan, thanks! files: Doc/library/packaging.compiler.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/packaging.compiler.rst b/Doc/library/packaging.compiler.rst --- a/Doc/library/packaging.compiler.rst +++ b/Doc/library/packaging.compiler.rst @@ -677,5 +677,5 @@ +------------------------+--------------------------------+---------------------------+ To distribute extension modules that live in a package (e.g. ``package.ext``), -you need to create you need to create a :file:`{package}/__init__.py` file to -let Python recognize and import your module. +you need to create a :file:`{package}/__init__.py` file to let Python recognize +and import your module. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 03:34:49 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 03:34:49 +0200 Subject: [Python-checkins] =?utf8?q?benchmarks=3A_Fix_the_regex=5Fcompile_?= =?utf8?q?benchmark_under_3=2E3?= Message-ID: http://hg.python.org/benchmarks/rev/9f9ba3f248d5 changeset: 150:9f9ba3f248d5 user: Antoine Pitrou date: Sat Oct 22 03:30:46 2011 +0200 summary: Fix the regex_compile benchmark under 3.3 files: performance/bm_regex_compile.py | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/performance/bm_regex_compile.py b/performance/bm_regex_compile.py --- a/performance/bm_regex_compile.py +++ b/performance/bm_regex_compile.py @@ -56,8 +56,12 @@ try: clear_cache = re._cache.clear except AttributeError: - # Python 3.2+: re uses functools.lru_cache() - clear_cache = re._compile_typed.cache_clear + try: + # Python 3.2: re._compile_typed() uses functools.lru_cache() + clear_cache = re._compile_typed.cache_clear + except AttributeError: + # Python 3.3: re._compile() uses functools.lru_cache() + clear_cache = re._compile.cache_clear regexes = capture_regexes() times = [] -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Sat Oct 22 03:48:49 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 03:48:49 +0200 Subject: [Python-checkins] =?utf8?q?benchmarks=3A_Update_the_list_of_bench?= =?utf8?q?marks_runnable_on_both_2=2Ex_and_3=2Ex?= Message-ID: http://hg.python.org/benchmarks/rev/ae686fb57b43 changeset: 151:ae686fb57b43 user: Antoine Pitrou date: Sat Oct 22 03:44:50 2011 +0200 summary: Update the list of benchmarks runnable on both 2.x and 3.x files: perf.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -1936,7 +1936,8 @@ "math": ["nbody", "float", "pidigits"], "template" : ["slowspitfire", "django", "mako"], # Benchmarks natively 2.x- and 3.x-compatible - "2n3": ["calls", "math", "pickle", "regex", "threading", + "2n3": ["calls", "math", "fastpickle", "fastunpickle", + "json_dump", "json_load", "regex", "threading", "nqueens", "unpack_sequence", "richards", "normal_startup", "startup_nosite"], # After 2to3-conversion -- Repository URL: http://hg.python.org/benchmarks From solipsis at pitrou.net Sat Oct 22 05:33:52 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 22 Oct 2011 05:33:52 +0200 Subject: [Python-checkins] Daily reference leaks (0e7720a2a053): sum=0 Message-ID: results for 0e7720a2a053 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogs6dF0V', '-x'] From python-checkins at python.org Sat Oct 22 11:08:18 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 22 Oct 2011 11:08:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_unicode=5Fsubtype=5Fnew?= =?utf8?q?=28=29_on_debug_build?= Message-ID: http://hg.python.org/cpython/rev/84a70229c05e changeset: 73050:84a70229c05e user: Victor Stinner date: Sat Oct 22 11:08:10 2011 +0200 summary: Fix unicode_subtype_new() on debug build Patch written by Stefan Behnel. files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -13825,11 +13825,11 @@ Py_MEMCPY(data, PyUnicode_DATA(unicode), kind * (length + 1)); - Py_DECREF(unicode); assert(_PyUnicode_CheckConsistency(self, 1)); #ifdef Py_DEBUG _PyUnicode_HASH(self) = _PyUnicode_HASH(unicode); #endif + Py_DECREF(unicode); return (PyObject *)self; onError: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 14:34:54 2011 From: python-checkins at python.org (vinay.sajip) Date: Sat, 22 Oct 2011 14:34:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Closes_=2313235=3A_Changed_?= =?utf8?q?PendingDeprecationWarning_to_DeprecationWarning=2E?= Message-ID: http://hg.python.org/cpython/rev/4a90d1ed115d changeset: 73051:4a90d1ed115d user: Vinay Sajip date: Sat Oct 22 13:34:48 2011 +0100 summary: Closes #13235: Changed PendingDeprecationWarning to DeprecationWarning. files: Lib/logging/__init__.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -251,7 +251,7 @@ # during formatting, we test to see if the arg is present using # 'if self.args:'. If the event being logged is e.g. 'Value is %d' # and if the passed arg fails 'if self.args:' then no formatting - # is done. For example, logger.warn('Value is %d', 0) would log + # is done. For example, logger.warning('Value is %d', 0) would log # 'Value is %d' instead of 'Value is 0'. # For the use case of passing a dictionary, this should not be a # problem. @@ -1245,7 +1245,7 @@ def warn(self, msg, *args, **kwargs): warnings.warn("The 'warn' method is deprecated, " - "use 'warning' instead", PendingDeprecationWarning, 2) + "use 'warning' instead", DeprecationWarning, 2) self.warning(msg, *args, **kwargs) def error(self, msg, *args, **kwargs): @@ -1561,7 +1561,7 @@ def warn(self, msg, *args, **kwargs): warnings.warn("The 'warn' method is deprecated, " - "use 'warning' instead", PendingDeprecationWarning, 2) + "use 'warning' instead", DeprecationWarning, 2) self.warning(msg, *args, **kwargs) def error(self, msg, *args, **kwargs): @@ -1774,7 +1774,7 @@ def warn(msg, *args, **kwargs): warnings.warn("The 'warn' function is deprecated, " - "use 'warning' instead", PendingDeprecationWarning, 2) + "use 'warning' instead", DeprecationWarning, 2) warning(msg, *args, **kwargs) def info(msg, *args, **kwargs): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 18:06:58 2011 From: python-checkins at python.org (georg.brandl) Date: Sat, 22 Oct 2011 18:06:58 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Add_Petri=2E?= Message-ID: http://hg.python.org/devguide/rev/1a5441149f0d changeset: 456:1a5441149f0d user: Georg Brandl date: Sat Oct 22 18:07:04 2011 +0200 summary: Add Petri. files: developers.rst | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/developers.rst b/developers.rst --- a/developers.rst +++ b/developers.rst @@ -24,6 +24,9 @@ Permissions History ------------------- +- Petri Lehtinen was given push privileges on Oct 22 2011 by GFB, for + general contributions, on recommendation by Antoine Pitrou. + - Meador Inge was given push privileges on Sep 19 2011 by GFB, for general contributions, on recommendation by Mark Dickinson. -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sat Oct 22 19:34:38 2011 From: python-checkins at python.org (eric.araujo) Date: Sat, 22 Oct 2011 19:34:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Avoid_relying_on_the_defaul?= =?utf8?q?t_reST_role_in_logging_library_doc?= Message-ID: http://hg.python.org/cpython/rev/5110d723fbb1 changeset: 73052:5110d723fbb1 user: ?ric Araujo date: Sat Oct 22 19:29:48 2011 +0200 summary: Avoid relying on the default reST role in logging library doc files: Doc/library/logging.rst | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -137,7 +137,7 @@ Stack (most recent call last): - This mimics the `Traceback (most recent call last):` which is used when + This mimics the ``Traceback (most recent call last):`` which is used when displaying exception frames. The third keyword argument is *extra* which can be used to pass a @@ -189,9 +189,9 @@ Logs a message with level :const:`WARNING` on this logger. The arguments are interpreted as for :meth:`debug`. - .. note:: There is an obsolete method `warn()` which is functionally - identical to `warning()`. As `warn()` is deprecated, please do not use - it - use `warning()` instead. + .. note:: There is an obsolete method ``warn`` which is functionally + identical to ``warning``. As ``warn`` is deprecated, please do not use + it - use ``warning`` instead. .. method:: Logger.error(msg, *args, **kwargs) @@ -836,7 +836,7 @@ Stack (most recent call last): - This mimics the `Traceback (most recent call last):` which is used when + This mimics the ``Traceback (most recent call last):`` which is used when displaying exception frames. The third optional keyword argument is *extra* which can be used to pass a @@ -886,9 +886,9 @@ Logs a message with level :const:`WARNING` on the root logger. The arguments are interpreted as for :func:`debug`. - .. note:: There is an obsolete function `warn()` which is functionally - identical to `warning()`. As `warn()` is deprecated, please do not use - it - use `warning()` instead. + .. note:: There is an obsolete function ``warn`` which is functionally + identical to ``warning``. As ``warn`` is deprecated, please do not use + it - use ``warning`` instead. .. function:: error(msg, *args, **kwargs) @@ -1094,11 +1094,11 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named 'py.warnings' with a severity of `WARNING`. + logged to a logger named ``'py.warnings'`` with a severity of ``'WARNING'``. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations - (i.e. those in effect before `captureWarnings(True)` was called). + (i.e. those in effect before ``captureWarnings(True)`` was called). .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 21:12:26 2011 From: python-checkins at python.org (meador.inge) Date: Sat, 22 Oct 2011 21:12:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_13243=3A_Rename_=5FPy?= =?utf8?q?=5Fidentifier_to_=5FPy=5FIDENTIFIER_in_asdl=5Fc=2Epy?= Message-ID: http://hg.python.org/cpython/rev/941d015053c6 changeset: 73053:941d015053c6 user: Meador Inge date: Sat Oct 22 14:06:50 2011 -0500 summary: Issue 13243: Rename _Py_identifier to _Py_IDENTIFIER in asdl_c.py Parser/asdl_c.py was missed in commit 7109f31300fb when _Py_identifier was replaced with _Py_IDENTIFIER. Thanks to Eric Snow for the patch. files: Misc/ACKS | 1 + Parser/asdl_c.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -899,6 +899,7 @@ Gregory P. Smith Mark Smith Rafal Smotrzyk +Eric Snow Dirk Soede Paul Sokolovsky Cody Somerville diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -92,7 +92,7 @@ name = str(name) if name in self.identifiers: return - self.emit("_Py_identifier(%s);" % name, 0) + self.emit("_Py_IDENTIFIER(%s);" % name, 0) self.identifiers.add(name) def emit(self, s, depth, reflow=True): @@ -606,7 +606,7 @@ static int ast_type_init(PyObject *self, PyObject *args, PyObject *kw) { - _Py_identifier(_fields); + _Py_IDENTIFIER(_fields); Py_ssize_t i, numfields = 0; int res = -1; PyObject *key, *value, *fields; @@ -660,7 +660,7 @@ ast_type_reduce(PyObject *self, PyObject *unused) { PyObject *res; - _Py_identifier(__dict__); + _Py_IDENTIFIER(__dict__); PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__); if (dict == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 21:31:18 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 21:31:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue_=23154889?= =?utf8?q?1=3A_The_cStringIO=2EStringIO=28=29_constructor_now_encodes_unic?= =?utf8?q?ode?= Message-ID: http://hg.python.org/cpython/rev/27ae7d4e1983 changeset: 73054:27ae7d4e1983 branch: 2.7 parent: 73046:d30482d51c25 user: Antoine Pitrou date: Sat Oct 22 21:26:01 2011 +0200 summary: Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode arguments with the system default encoding just like the write() method does, instead of converting it to a raw buffer. files: Doc/library/stringio.rst | 5 +---- Lib/test/test_StringIO.py | 21 +++++++++++++++++++++ Misc/NEWS | 4 ++++ Modules/cStringIO.c | 6 +++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Doc/library/stringio.rst b/Doc/library/stringio.rst --- a/Doc/library/stringio.rst +++ b/Doc/library/stringio.rst @@ -82,10 +82,7 @@ those cases. Unlike the :mod:`StringIO` module, this module is not able to accept Unicode - strings that cannot be encoded as plain ASCII strings. Calling - :func:`StringIO` with a Unicode string parameter populates the object with - the buffer representation of the Unicode string instead of encoding the - string. + strings that cannot be encoded as plain ASCII strings. Another difference from the :mod:`StringIO` module is that calling :func:`StringIO` with a string parameter creates a read-only object. Unlike an diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py --- a/Lib/test/test_StringIO.py +++ b/Lib/test/test_StringIO.py @@ -134,6 +134,27 @@ f = self.MODULE.StringIO(a) self.assertEqual(f.getvalue(), '\x00\x01\x02') + def test_unicode(self): + + if not test_support.have_unicode: return + + # The cStringIO module converts Unicode strings to character + # strings when writing them to cStringIO objects. + # Check that this works. + + f = self.MODULE.StringIO() + f.write(u'abcde') + s = f.getvalue() + self.assertEqual(s, 'abcde') + self.assertEqual(type(s), str) + + f = self.MODULE.StringIO(u'abcde') + s = f.getvalue() + self.assertEqual(s, 'abcde') + self.assertEqual(type(s), str) + + self.assertRaises(UnicodeEncodeError, self.MODULE.StringIO, u'\xf4') + import sys if sys.platform.startswith('java'): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,10 @@ Library ------- +- Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode + arguments with the system default encoding just like the write() method + does, instead of converting it to a raw buffer. + - Issue #9168: now smtpd is able to bind privileged port. - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c --- a/Modules/cStringIO.c +++ b/Modules/cStringIO.c @@ -661,7 +661,11 @@ char *buf; Py_ssize_t size; - if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) { + if (PyUnicode_Check(s)) { + if (PyObject_AsCharBuffer(s, (const char **)&buf, &size) != 0) + return NULL; + } + else if (PyObject_AsReadBuffer(s, (const void **)&buf, &size)) { PyErr_Format(PyExc_TypeError, "expected read buffer, %.200s found", s->ob_type->tp_name); return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 22:00:21 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 22:00:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Move_deprecated_functions_a?= =?utf8?q?t_the_end_of_their_respective_sections=2E?= Message-ID: http://hg.python.org/cpython/rev/e66b7c62eec0 changeset: 73055:e66b7c62eec0 parent: 73053:941d015053c6 user: Antoine Pitrou date: Sat Oct 22 21:56:20 2011 +0200 summary: Move deprecated functions at the end of their respective sections. files: Doc/c-api/unicode.rst | 376 +++++++++++++++--------------- 1 files changed, 188 insertions(+), 188 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -81,6 +81,112 @@ subtype. +.. c:function:: int PyUnicode_READY(PyObject *o) + + Ensure the string object *o* is in the "canonical" representation. This is + required before using any of the access macros described below. + + .. XXX expand on when it is not required + + Returns 0 on success and -1 with an exception set on failure, which in + particular happens if memory allocation fails. + + .. versionadded:: 3.3 + + +.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) + + Return the length of the Unicode string, in code points. *o* has to be a + Unicode object in the "canonical" representation (not checked). + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o) + Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o) + Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o) + + Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 + integer types for direct character access. No checks are performed if the + canonical representation has the correct character size; use + :c:func:`PyUnicode_KIND` to select the right macro. Make sure + :c:func:`PyUnicode_READY` has been called before accessing this. + + .. versionadded:: 3.3 + + +.. c:macro:: PyUnicode_1BYTE_KIND + PyUnicode_2BYTE_KIND + PyUnicode_4BYTE_KIND + + Return values of the :c:func:`PyUnicode_KIND` macro. + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_KIND(PyObject *o) + + Return one of the PyUnicode kind constants (see above) that indicate how many + bytes per character this Unicode object uses to store its data. *o* has to + be a Unicode object in the "canonical" representation (not checked). + + .. XXX document "0" return value? + + .. versionadded:: 3.3 + + +.. c:function:: void* PyUnicode_DATA(PyObject *o) + + Return a void pointer to the raw unicode buffer. *o* has to be a Unicode + object in the "canonical" representation (not checked). + + .. versionadded:: 3.3 + + +.. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \ + Py_UCS4 value) + + Write into a canonical representation *data* (as obtained with + :c:func:`PyUnicode_DATA`). This macro does not do any sanity checks and is + intended for usage in loops. The caller should cache the *kind* value and + *data* pointer as obtained from other macro calls. *index* is the index in + the string (starts at 0) and *value* is the new code point value which should + be written to that location. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index) + + Read a code point from a canonical representation *data* (as obtained with + :c:func:`PyUnicode_DATA`). No checks or ready calls are performed. + + .. versionadded:: 3.3 + + +.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index) + + Read a character from a Unicode object *o*, which must be in the "canonical" + representation. This is less efficient than :c:func:`PyUnicode_READ` if you + do multiple consecutive reads. + + .. versionadded:: 3.3 + + +.. c:function:: PyUnicode_MAX_CHAR_VALUE(PyObject *o) + + Return the maximum code point that is suitable for creating another string + based on *o*, which must be in the "canonical" representation. This is + always an approximation but more efficient than iterating over the string. + + .. versionadded:: 3.3 + + +.. c:function:: int PyUnicode_ClearFreeList() + + Clear the free list. Return the total number of freed items. + + .. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) Return the size of the deprecated :c:type:`Py_UNICODE` representation, in @@ -121,112 +227,6 @@ :c:func:`PyUnicode_nBYTE_DATA` family of macros. -.. c:function:: int PyUnicode_READY(PyObject *o) - - Ensure the string object *o* is in the "canonical" representation. This is - required before using any of the access macros described below. - - .. XXX expand on when it is not required - - Returns 0 on success and -1 with an exception set on failure, which in - particular happens if memory allocation fails. - - .. versionadded:: 3.3 - - -.. c:function:: Py_ssize_t PyUnicode_GET_LENGTH(PyObject *o) - - Return the length of the Unicode string, in code points. *o* has to be a - Unicode object in the "canonical" representation (not checked). - - .. versionadded:: 3.3 - - -.. c:function:: Py_UCS1* PyUnicode_1BYTE_DATA(PyObject *o) - Py_UCS2* PyUnicode_2BYTE_DATA(PyObject *o) - Py_UCS4* PyUnicode_4BYTE_DATA(PyObject *o) - - Return a pointer to the canonical representation cast to UCS1, UCS2 or UCS4 - integer types for direct character access. No checks are performed if the - canonical representation has the correct character size; use - :c:func:`PyUnicode_KIND` to select the right macro. Make sure - :c:func:`PyUnicode_READY` has been called before accessing this. - - .. versionadded:: 3.3 - - -.. c:macro:: PyUnicode_1BYTE_KIND - PyUnicode_2BYTE_KIND - PyUnicode_4BYTE_KIND - - Return values of the :c:func:`PyUnicode_KIND` macro. - - .. versionadded:: 3.3 - - -.. c:function:: int PyUnicode_KIND(PyObject *o) - - Return one of the PyUnicode kind constants (see above) that indicate how many - bytes per character this Unicode object uses to store its data. *o* has to - be a Unicode object in the "canonical" representation (not checked). - - .. XXX document "0" return value? - - .. versionadded:: 3.3 - - -.. c:function:: void* PyUnicode_DATA(PyObject *o) - - Return a void pointer to the raw unicode buffer. *o* has to be a Unicode - object in the "canonical" representation (not checked). - - .. versionadded:: 3.3 - - -.. c:function:: void PyUnicode_WRITE(int kind, void *data, Py_ssize_t index, \ - Py_UCS4 value) - - Write into a canonical representation *data* (as obtained with - :c:func:`PyUnicode_DATA`). This macro does not do any sanity checks and is - intended for usage in loops. The caller should cache the *kind* value and - *data* pointer as obtained from other macro calls. *index* is the index in - the string (starts at 0) and *value* is the new code point value which should - be written to that location. - - .. versionadded:: 3.3 - - -.. c:function:: Py_UCS4 PyUnicode_READ(int kind, void *data, Py_ssize_t index) - - Read a code point from a canonical representation *data* (as obtained with - :c:func:`PyUnicode_DATA`). No checks or ready calls are performed. - - .. versionadded:: 3.3 - - -.. c:function:: Py_UCS4 PyUnicode_READ_CHAR(PyObject *o, Py_ssize_t index) - - Read a character from a Unicode object *o*, which must be in the "canonical" - representation. This is less efficient than :c:func:`PyUnicode_READ` if you - do multiple consecutive reads. - - .. versionadded:: 3.3 - - -.. c:function:: PyUnicode_MAX_CHAR_VALUE(PyObject *o) - - Return the maximum code point that is suitable for creating another string - based on *o*, which must be in the "canonical" representation. This is - always an approximation but more efficient than iterating over the string. - - .. versionadded:: 3.3 - - -.. c:function:: int PyUnicode_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - Unicode Character Properties """""""""""""""""""""""""""" @@ -856,6 +856,16 @@ the codec. +.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, \ + const char *encoding, const char *errors) + + Encode a Unicode object and return the result as Python bytes object. + *encoding* and *errors* have the same meaning as the parameters of the same + name in the Unicode :meth:`encode` method. The codec to be used is looked up + using the Python codec registry. Return *NULL* if an exception was raised by + the codec. + + .. c:function:: PyObject* PyUnicode_Encode(const Py_UNICODE *s, Py_ssize_t size, \ const char *encoding, const char *errors) @@ -870,16 +880,6 @@ :c:func:`PyUnicode_AsEncodedString`. -.. c:function:: PyObject* PyUnicode_AsEncodedString(PyObject *unicode, \ - const char *encoding, const char *errors) - - Encode a Unicode object and return the result as Python bytes object. - *encoding* and *errors* have the same meaning as the parameters of the same - name in the Unicode :meth:`encode` method. The codec to be used is looked up - using the Python codec registry. Return *NULL* if an exception was raised by - the codec. - - UTF-8 Codecs """""""""""" @@ -901,17 +901,6 @@ that have been decoded will be stored in *consumed*. -.. c:function:: PyObject* PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors) - - Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* using UTF-8 and - return a Python bytes object. Return *NULL* if an exception was raised by - the codec. - - .. deprecated-removed:: 3.3 4.0 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsUTF8String` or :c:func:`PyUnicode_AsUTF8AndSize`. - - .. c:function:: PyObject* PyUnicode_AsUTF8String(PyObject *unicode) Encode a Unicode object using UTF-8 and return the result as Python bytes @@ -942,6 +931,17 @@ .. versionadded:: 3.3 +.. c:function:: PyObject* PyUnicode_EncodeUTF8(const Py_UNICODE *s, Py_ssize_t size, const char *errors) + + Encode the :c:type:`Py_UNICODE` buffer *s* of the given *size* using UTF-8 and + return a Python bytes object. Return *NULL* if an exception was raised by + the codec. + + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsUTF8String` or :c:func:`PyUnicode_AsUTF8AndSize`. + + UTF-32 Codecs """"""""""""" @@ -987,6 +987,13 @@ that have been decoded will be stored in *consumed*. +.. c:function:: PyObject* PyUnicode_AsUTF32String(PyObject *unicode) + + Return a Python byte string using the UTF-32 encoding in native byte + order. The string always starts with a BOM mark. Error handling is "strict". + Return *NULL* if an exception was raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeUTF32(const Py_UNICODE *s, Py_ssize_t size, \ const char *errors, int byteorder) @@ -1010,13 +1017,6 @@ :c:func:`PyUnicode_AsUTF32String`. -.. c:function:: PyObject* PyUnicode_AsUTF32String(PyObject *unicode) - - Return a Python byte string using the UTF-32 encoding in native byte - order. The string always starts with a BOM mark. Error handling is "strict". - Return *NULL* if an exception was raised by the codec. - - UTF-16 Codecs """"""""""""" @@ -1061,6 +1061,13 @@ number of bytes that have been decoded will be stored in *consumed*. +.. c:function:: PyObject* PyUnicode_AsUTF16String(PyObject *unicode) + + Return a Python byte string using the UTF-16 encoding in native byte + order. The string always starts with a BOM mark. Error handling is "strict". + Return *NULL* if an exception was raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeUTF16(const Py_UNICODE *s, Py_ssize_t size, \ const char *errors, int byteorder) @@ -1085,13 +1092,6 @@ :c:func:`PyUnicode_AsUTF16String`. -.. c:function:: PyObject* PyUnicode_AsUTF16String(PyObject *unicode) - - Return a Python byte string using the UTF-16 encoding in native byte - order. The string always starts with a BOM mark. Error handling is "strict". - Return *NULL* if an exception was raised by the codec. - - UTF-7 Codecs """""""""""" @@ -1144,6 +1144,13 @@ string *s*. Return *NULL* if an exception was raised by the codec. +.. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode) + + Encode a Unicode object using Unicode-Escape and return the result as Python + string object. Error handling is "strict". Return *NULL* if an exception was + raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Unicode-Escape and @@ -1155,13 +1162,6 @@ :c:func:`PyUnicode_AsUnicodeEscapeString`. -.. c:function:: PyObject* PyUnicode_AsUnicodeEscapeString(PyObject *unicode) - - Encode a Unicode object using Unicode-Escape and return the result as Python - string object. Error handling is "strict". Return *NULL* if an exception was - raised by the codec. - - Raw-Unicode-Escape Codecs """"""""""""""""""""""""" @@ -1175,6 +1175,13 @@ encoded string *s*. Return *NULL* if an exception was raised by the codec. +.. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) + + Encode a Unicode object using Raw-Unicode-Escape and return the result as + Python string object. Error handling is "strict". Return *NULL* if an exception + was raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeRawUnicodeEscape(const Py_UNICODE *s, \ Py_ssize_t size, const char *errors) @@ -1187,13 +1194,6 @@ :c:func:`PyUnicode_AsRawUnicodeEscapeString`. -.. c:function:: PyObject* PyUnicode_AsRawUnicodeEscapeString(PyObject *unicode) - - Encode a Unicode object using Raw-Unicode-Escape and return the result as - Python string object. Error handling is "strict". Return *NULL* if an exception - was raised by the codec. - - Latin-1 Codecs """""""""""""" @@ -1207,6 +1207,13 @@ *s*. Return *NULL* if an exception was raised by the codec. +.. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode) + + Encode a Unicode object using Latin-1 and return the result as Python bytes + object. Error handling is "strict". Return *NULL* if an exception was + raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeLatin1(const Py_UNICODE *s, Py_ssize_t size, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using Latin-1 and @@ -1218,13 +1225,6 @@ :c:func:`PyUnicode_AsLatin1String`. -.. c:function:: PyObject* PyUnicode_AsLatin1String(PyObject *unicode) - - Encode a Unicode object using Latin-1 and return the result as Python bytes - object. Error handling is "strict". Return *NULL* if an exception was - raised by the codec. - - ASCII Codecs """""""""""" @@ -1238,6 +1238,13 @@ *s*. Return *NULL* if an exception was raised by the codec. +.. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode) + + Encode a Unicode object using ASCII and return the result as Python bytes + object. Error handling is "strict". Return *NULL* if an exception was + raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeASCII(const Py_UNICODE *s, Py_ssize_t size, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using ASCII and @@ -1249,13 +1256,6 @@ :c:func:`PyUnicode_AsASCIIString`. -.. c:function:: PyObject* PyUnicode_AsASCIIString(PyObject *unicode) - - Encode a Unicode object using ASCII and return the result as Python bytes - object. Error handling is "strict". Return *NULL* if an exception was - raised by the codec. - - Character Map Codecs """""""""""""""""""" @@ -1293,18 +1293,6 @@ treated as "undefined mapping". -.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ - PyObject *mapping, const char *errors) - - Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given - *mapping* object and return a Python string object. Return *NULL* if an - exception was raised by the codec. - - .. deprecated-removed:: 3.3 4.0 - Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using - :c:func:`PyUnicode_AsCharmapString`. - - .. c:function:: PyObject* PyUnicode_AsCharmapString(PyObject *unicode, PyObject *mapping) Encode a Unicode object using the given *mapping* object and return the result @@ -1334,6 +1322,18 @@ .. XXX replace with what? +.. c:function:: PyObject* PyUnicode_EncodeCharmap(const Py_UNICODE *s, Py_ssize_t size, \ + PyObject *mapping, const char *errors) + + Encode the :c:type:`Py_UNICODE` buffer of the given *size* using the given + *mapping* object and return a Python string object. Return *NULL* if an + exception was raised by the codec. + + .. deprecated-removed:: 3.3 4.0 + Part of the old-style :c:type:`Py_UNICODE` API; please migrate to using + :c:func:`PyUnicode_AsCharmapString`. + + MBCS codecs for Windows """"""""""""""""""""""" @@ -1357,6 +1357,13 @@ in *consumed*. +.. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode) + + Encode a Unicode object using MBCS and return the result as Python bytes + object. Error handling is "strict". Return *NULL* if an exception was + raised by the codec. + + .. c:function:: PyObject* PyUnicode_EncodeMBCS(const Py_UNICODE *s, Py_ssize_t size, const char *errors) Encode the :c:type:`Py_UNICODE` buffer of the given *size* using MBCS and return @@ -1368,13 +1375,6 @@ :c:func:`PyUnicode_AsMBCSString`. -.. c:function:: PyObject* PyUnicode_AsMBCSString(PyObject *unicode) - - Encode a Unicode object using MBCS and return the result as Python bytes - object. Error handling is "strict". Return *NULL* if an exception was - raised by the codec. - - Methods & Slots """"""""""""""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 22:12:06 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 22:12:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Elaborate_on_representation?= =?utf8?q?s_and_canonical/legacy_unicode_objects?= Message-ID: http://hg.python.org/cpython/rev/4c628ee78cd6 changeset: 73056:4c628ee78cd6 user: Antoine Pitrou date: Sat Oct 22 22:08:05 2011 +0200 summary: Elaborate on representations and canonical/legacy unicode objects files: Doc/c-api/unicode.rst | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -18,7 +18,21 @@ points must be below 1114112 (which is the full Unicode range). :c:type:`Py_UNICODE*` and UTF-8 representations are created on demand and cached -in the Unicode object. +in the Unicode object. The :c:type:`Py_UNICODE*` representation is deprecated +and inefficient; it should be avoided in performance- or memory-sensitive +situations. + +Due to the transition between the old APIs and the new APIs, unicode objects +can internally be in two states depending on how they were created: + +* "canonical" unicode objects are all objects created by a non-deprecated + unicode API. They use the most efficient representation allowed by the + implementation. + +* "legacy" unicode objects have been created through one of the deprecated + APIs (typically :c:func:`PyUnicode_FromUnicode`) and only bear the + :c:type:`Py_UNICODE*` representation; you will have to call + :c:func:`PyUnicode_READY` on them before calling any other API. Unicode Type -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 22:12:48 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 22:12:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_missing_prefixes?= Message-ID: http://hg.python.org/cpython/rev/07ee3c357e1a changeset: 73057:07ee3c357e1a user: Antoine Pitrou date: Sat Oct 22 22:08:46 2011 +0200 summary: Add missing prefixes files: Doc/c-api/unicode.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -819,8 +819,8 @@ Py_UCS4* Py_UCS4_strcat(Py_UCS4 *s1, const Py_UCS4 *s2) int Py_UCS4_strcmp(const Py_UCS4 *s1, const Py_UCS4 *s2) int Py_UCS4_strncmp(const Py_UCS4 *s1, const Py_UCS4 *s2, size_t n) - Py_UCS4* strchr(const Py_UCS4 *s, Py_UCS4 c) - Py_UCS4* strrchr(const Py_UCS4 *s, Py_UCS4 c) + Py_UCS4* Py_UCS4_strchr(const Py_UCS4 *s, Py_UCS4 c) + Py_UCS4* Py_UCS4_strrchr(const Py_UCS4 *s, Py_UCS4 c) These utility functions work on strings of :c:type:`Py_UCS4` characters and otherwise behave like the C standard library functions with the same name. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 23:41:52 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 23:41:52 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_PyExc=5FOSError_directl?= =?utf8?q?y_instead_of_grabbing_it_from_the_socket_module_API?= Message-ID: http://hg.python.org/cpython/rev/b2c30519e8f7 changeset: 73058:b2c30519e8f7 user: Antoine Pitrou date: Sat Oct 22 23:37:51 2011 +0200 summary: Use PyExc_OSError directly instead of grabbing it from the socket module API files: Modules/_ssl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2334,7 +2334,7 @@ /* Add symbols to module dict */ PySSLErrorObject = PyErr_NewException("ssl.SSLError", - PySocketModule.error, + PyExc_OSError, NULL); if (PySSLErrorObject == NULL) return NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 22 23:46:01 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 22 Oct 2011 23:46:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_a_docstring_to_SSLError?= Message-ID: http://hg.python.org/cpython/rev/96d5f53a414a changeset: 73059:96d5f53a414a user: Antoine Pitrou date: Sat Oct 22 23:41:52 2011 +0200 summary: Add a docstring to SSLError files: Modules/_ssl.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2297,6 +2297,10 @@ *major = libver & 0xFF; } +PyDoc_STRVAR(SSLError_doc, +"An error occurred in the SSL implementation."); + + PyMODINIT_FUNC PyInit__ssl(void) { @@ -2333,9 +2337,10 @@ OpenSSL_add_all_algorithms(); /* Add symbols to module dict */ - PySSLErrorObject = PyErr_NewException("ssl.SSLError", - PyExc_OSError, - NULL); + PySSLErrorObject = PyErr_NewExceptionWithDoc("ssl.SSLError", + SSLError_doc, + PyExc_OSError, + NULL); if (PySSLErrorObject == NULL) return NULL; if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 04:37:57 2011 From: python-checkins at python.org (eric.araujo) Date: Sun, 23 Oct 2011 04:37:57 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Note_that_the_?= =?utf8?q?=231548891_fix_indirectly_fixes_shlex_=28=236988=2C_=231170=29?= Message-ID: http://hg.python.org/cpython/rev/0b39f2486314 changeset: 73060:0b39f2486314 branch: 2.7 parent: 73054:27ae7d4e1983 user: ?ric Araujo date: Sun Oct 23 04:37:51 2011 +0200 summary: Note that the #1548891 fix indirectly fixes shlex (#6988, #1170) files: Doc/library/shlex.rst | 4 +--- Misc/NEWS | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Doc/library/shlex.rst b/Doc/library/shlex.rst --- a/Doc/library/shlex.rst +++ b/Doc/library/shlex.rst @@ -21,9 +21,7 @@ writing minilanguages, (for example, in run control files for Python applications) or for parsing quoted strings. -.. note:: - - The :mod:`shlex` module currently does not support Unicode input. +Prior to Python 2.7.3, this module did not support Unicode input. The :mod:`shlex` module defines the following functions: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -68,7 +68,8 @@ - Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode arguments with the system default encoding just like the write() method - does, instead of converting it to a raw buffer. + does, instead of converting it to a raw buffer. This also fixes handling of + unicode input in the shlex module (#6988, #1170). - Issue #9168: now smtpd is able to bind privileged port. -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Oct 23 05:33:11 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 23 Oct 2011 05:33:11 +0200 Subject: [Python-checkins] Daily reference leaks (96d5f53a414a): sum=0 Message-ID: results for 96d5f53a414a on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogNkekMe', '-x'] From python-checkins at python.org Sun Oct 23 13:04:34 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 23 Oct 2011 13:04:34 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Update_NEWS_entry_policy_b?= =?utf8?q?ased_on_recent_mailing_list_discussion_and_forward?= Message-ID: http://hg.python.org/devguide/rev/0541f815d016 changeset: 457:0541f815d016 user: Nick Coghlan date: Sun Oct 23 21:04:21 2011 +1000 summary: Update NEWS entry policy based on recent mailing list discussion and forward porting section based on Issue 13105 files: committing.rst | 27 ++++++++++++++++++++++++++- 1 files changed, 26 insertions(+), 1 deletions(-) diff --git a/committing.rst b/committing.rst --- a/committing.rst +++ b/committing.rst @@ -28,8 +28,8 @@ making a complete patch. -Commit Messages ---------------- +Commit Messages and NEWS Entries +-------------------------------- Every commit has a commit message to document why a change was made and to communicate that reason to other core developers. Python core developers have @@ -52,6 +52,22 @@ understands the justification for the change). Also, if a non-core developer contributed to the resolution, it is good practice to credit them. +Almost all changes made to the code base deserve an entry in ``Misc/NEWS``. +The ``What's New in Python`` document is the place for more subjective +judgments of the "importance" of changes. There are two notable exceptions +to this general principle, and they both relate to changes that *already* +have a NEWS entry, and have not yet been included in any formal release +(including alpha and beta releases). These exceptions are: + +* If a change is reverted prior to release, then the corresponding entry + is simply removed. Otherwise, a new entry must be added noting that the + change has been reverted (e.g. when a feature is released in an alpha and + then cut prior to the first beta) + +* If a change is a fix or other adjustment to an earlier unreleased change + and the original NEWS entry remains valid, then no additional entry is + needed. + Working with Mercurial_ ----------------------- @@ -192,6 +208,14 @@ the :abbr:`DAG (directed acyclic graph)` used by hg to work with the movement of the patch through the codebase instead of against it. +Note that this policy applies only within a major version - the ``2.7`` branch +is an independent thread of development, and should *never* be merged to any +of the ``3.x`` branches of ``default``. If a bug fix applies to both ``2.x`` +and ``3.x``, the two additions are handled as separate commits. It doesn't +matter which is updated first, but any associated tracker issues should be +closed only after all affected versions have been modified in the main +repository. + .. warning:: Even when porting an already committed patch, you should **still** check the test suite runs successfully before committing the patch to another branch. -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sun Oct 23 13:28:23 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 23 Oct 2011 13:28:23 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Minor_fixes_to_last_update?= Message-ID: http://hg.python.org/devguide/rev/52f7c8db1d45 changeset: 458:52f7c8db1d45 user: Nick Coghlan date: Sun Oct 23 21:28:13 2011 +1000 summary: Minor fixes to last update files: committing.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/committing.rst b/committing.rst --- a/committing.rst +++ b/committing.rst @@ -64,7 +64,7 @@ change has been reverted (e.g. when a feature is released in an alpha and then cut prior to the first beta) -* If a change is a fix or other adjustment to an earlier unreleased change +* If a change is a fix (or other adjustment) to an earlier unreleased change and the original NEWS entry remains valid, then no additional entry is needed. @@ -210,7 +210,7 @@ Note that this policy applies only within a major version - the ``2.7`` branch is an independent thread of development, and should *never* be merged to any -of the ``3.x`` branches of ``default``. If a bug fix applies to both ``2.x`` +of the ``3.x`` branches or ``default``. If a bug fix applies to both ``2.x`` and ``3.x``, the two additions are handled as separate commits. It doesn't matter which is updated first, but any associated tracker issues should be closed only after all affected versions have been modified in the main -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sun Oct 23 14:37:12 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 23 Oct 2011 14:37:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_1294232?= =?utf8?q?=3A_Fix_errors_in_metaclass_calculation_affecting_some_cases_of?= Message-ID: http://hg.python.org/cpython/rev/c2a89b509be4 changeset: 73061:c2a89b509be4 branch: 3.2 parent: 73035:7d92b94b0eec user: Nick Coghlan date: Sun Oct 23 22:04:16 2011 +1000 summary: Issue 1294232: Fix errors in metaclass calculation affecting some cases of metaclass inheritance. Patch by Daniel Urban. files: Include/object.h | 1 + Lib/test/test_descr.py | 168 +++++++++++++++++++++++++++++ Misc/NEWS | 4 + Objects/typeobject.c | 105 ++++++++++------- Python/bltinmodule.c | 30 ++++- 5 files changed, 264 insertions(+), 44 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -449,6 +449,7 @@ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, char *, PyObject **); +PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); #endif PyAPI_FUNC(unsigned int) PyType_ClearCache(void); PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -625,6 +625,174 @@ # The most derived metaclass of D is A rather than type. class D(B, C): pass + self.assertIs(A, type(D)) + + # issue1294232: correct metaclass calculation + new_calls = [] # to check the order of __new__ calls + class AMeta(type): + @staticmethod + def __new__(mcls, name, bases, ns): + new_calls.append('AMeta') + return super().__new__(mcls, name, bases, ns) + @classmethod + def __prepare__(mcls, name, bases): + return {} + + class BMeta(AMeta): + @staticmethod + def __new__(mcls, name, bases, ns): + new_calls.append('BMeta') + return super().__new__(mcls, name, bases, ns) + @classmethod + def __prepare__(mcls, name, bases): + ns = super().__prepare__(name, bases) + ns['BMeta_was_here'] = True + return ns + + class A(metaclass=AMeta): + pass + self.assertEqual(['AMeta'], new_calls) + new_calls[:] = [] + + class B(metaclass=BMeta): + pass + # BMeta.__new__ calls AMeta.__new__ with super: + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls[:] = [] + + class C(A, B): + pass + # The most derived metaclass is BMeta: + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls[:] = [] + # BMeta.__prepare__ should've been called: + self.assertIn('BMeta_was_here', C.__dict__) + + # The order of the bases shouldn't matter: + class C2(B, A): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls[:] = [] + self.assertIn('BMeta_was_here', C2.__dict__) + + # Check correct metaclass calculation when a metaclass is declared: + class D(C, metaclass=type): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls[:] = [] + self.assertIn('BMeta_was_here', D.__dict__) + + class E(C, metaclass=AMeta): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls[:] = [] + self.assertIn('BMeta_was_here', E.__dict__) + + # Special case: the given metaclass isn't a class, + # so there is no metaclass calculation. + marker = object() + def func(*args, **kwargs): + return marker + class X(metaclass=func): + pass + class Y(object, metaclass=func): + pass + class Z(D, metaclass=func): + pass + self.assertIs(marker, X) + self.assertIs(marker, Y) + self.assertIs(marker, Z) + + # The given metaclass is a class, + # but not a descendant of type. + prepare_calls = [] # to track __prepare__ calls + class ANotMeta: + def __new__(mcls, *args, **kwargs): + new_calls.append('ANotMeta') + return super().__new__(mcls) + @classmethod + def __prepare__(mcls, name, bases): + prepare_calls.append('ANotMeta') + return {} + class BNotMeta(ANotMeta): + def __new__(mcls, *args, **kwargs): + new_calls.append('BNotMeta') + return super().__new__(mcls) + @classmethod + def __prepare__(mcls, name, bases): + prepare_calls.append('BNotMeta') + return super().__prepare__(name, bases) + + class A(metaclass=ANotMeta): + pass + self.assertIs(ANotMeta, type(A)) + self.assertEqual(['ANotMeta'], prepare_calls) + prepare_calls[:] = [] + self.assertEqual(['ANotMeta'], new_calls) + new_calls[:] = [] + + class B(metaclass=BNotMeta): + pass + self.assertIs(BNotMeta, type(B)) + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + + class C(A, B): + pass + self.assertIs(BNotMeta, type(C)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + + class C2(B, A): + pass + self.assertIs(BNotMeta, type(C2)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + + # This is a TypeError, because of a metaclass conflict: + # BNotMeta is neither a subclass, nor a superclass of type + with self.assertRaises(TypeError): + class D(C, metaclass=type): + pass + + class E(C, metaclass=ANotMeta): + pass + self.assertIs(BNotMeta, type(E)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + + class F(object(), C): + pass + self.assertIs(BNotMeta, type(F)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + + class F2(C, object()): + pass + self.assertIs(BNotMeta, type(F2)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls[:] = [] + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls[:] = [] + + # TypeError: BNotMeta is neither a + # subclass, nor a superclass of int + with self.assertRaises(TypeError): + class X(C, int()): + pass + with self.assertRaises(TypeError): + class X(int(), C): + pass def test_module_subclasses(self): # Testing Python subclass of module... diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #1294232: In a few cases involving metaclass inheritance, the + interpreter would sometimes invoke the wrong metaclass when building a new + class object. These cases now behave correctly. Patch by Daniel Urban. + - Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler warnings. Patch by Josh Triplett and Petri Lehtinen. diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1912,53 +1912,20 @@ return type->tp_flags; } -static PyObject * -type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) -{ - PyObject *name, *bases, *dict; - static char *kwlist[] = {"name", "bases", "dict", 0}; - PyObject *slots, *tmp, *newslots; - PyTypeObject *type, *base, *tmptype, *winner; - PyHeapTypeObject *et; - PyMemberDef *mp; - Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; - int j, may_add_dict, may_add_weak; - - assert(args != NULL && PyTuple_Check(args)); - assert(kwds == NULL || PyDict_Check(kwds)); - - /* Special case: type(x) should return x->ob_type */ - { - const Py_ssize_t nargs = PyTuple_GET_SIZE(args); - const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds); - - if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) { - PyObject *x = PyTuple_GET_ITEM(args, 0); - Py_INCREF(Py_TYPE(x)); - return (PyObject *) Py_TYPE(x); - } - - /* SF bug 475327 -- if that didn't trigger, we need 3 - arguments. but PyArg_ParseTupleAndKeywords below may give - a msg saying type() needs exactly 3. */ - if (nargs + nkwds != 3) { - PyErr_SetString(PyExc_TypeError, - "type() takes 1 or 3 arguments"); - return NULL; - } - } - - /* Check arguments: (name, bases, dict) */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, - &name, - &PyTuple_Type, &bases, - &PyDict_Type, &dict)) - return NULL; +/* Determine the most derived metatype. */ +PyTypeObject * +_PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases) +{ + Py_ssize_t i, nbases; + PyTypeObject *winner; + PyObject *tmp; + PyTypeObject *tmptype; /* Determine the proper metatype to deal with this, and check for metatype conflicts while we're at it. Note that if some other metatype wins to contract, it's possible that its instances are not types. */ + nbases = PyTuple_GET_SIZE(bases); winner = metatype; for (i = 0; i < nbases; i++) { @@ -1970,6 +1937,7 @@ winner = tmptype; continue; } + /* else: */ PyErr_SetString(PyExc_TypeError, "metaclass conflict: " "the metaclass of a derived class " @@ -1977,6 +1945,58 @@ "of the metaclasses of all its bases"); return NULL; } + return winner; +} + +static PyObject * +type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) +{ + PyObject *name, *bases, *dict; + static char *kwlist[] = {"name", "bases", "dict", 0}; + PyObject *slots, *tmp, *newslots; + PyTypeObject *type, *base, *tmptype, *winner; + PyHeapTypeObject *et; + PyMemberDef *mp; + Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; + int j, may_add_dict, may_add_weak; + + assert(args != NULL && PyTuple_Check(args)); + assert(kwds == NULL || PyDict_Check(kwds)); + + /* Special case: type(x) should return x->ob_type */ + { + const Py_ssize_t nargs = PyTuple_GET_SIZE(args); + const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds); + + if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) { + PyObject *x = PyTuple_GET_ITEM(args, 0); + Py_INCREF(Py_TYPE(x)); + return (PyObject *) Py_TYPE(x); + } + + /* SF bug 475327 -- if that didn't trigger, we need 3 + arguments. but PyArg_ParseTupleAndKeywords below may give + a msg saying type() needs exactly 3. */ + if (nargs + nkwds != 3) { + PyErr_SetString(PyExc_TypeError, + "type() takes 1 or 3 arguments"); + return NULL; + } + } + + /* Check arguments: (name, bases, dict) */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, + &name, + &PyTuple_Type, &bases, + &PyDict_Type, &dict)) + return NULL; + + /* Determine the proper metatype to deal with this: */ + winner = _PyType_CalculateMetaclass(metatype, bases); + if (winner == NULL) { + return NULL; + } + if (winner != metatype) { if (winner->tp_new != type_new) /* Pass it to the winner */ return winner->tp_new(winner, args, kwds); @@ -1984,6 +2004,7 @@ } /* Adjust for empty tuple bases */ + nbases = PyTuple_GET_SIZE(bases); if (nbases == 0) { bases = PyTuple_Pack(1, &PyBaseObject_Type); if (bases == NULL) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -35,9 +35,10 @@ static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) { - PyObject *func, *name, *bases, *mkw, *meta, *prep, *ns, *cell; + PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *cell; PyObject *cls = NULL; Py_ssize_t nargs, nbases; + int isclass; assert(args != NULL); if (!PyTuple_Check(args)) { @@ -82,17 +83,42 @@ Py_DECREF(bases); return NULL; } + /* metaclass is explicitly given, check if it's indeed a class */ + isclass = PyType_Check(meta); } } if (meta == NULL) { - if (PyTuple_GET_SIZE(bases) == 0) + /* if there are no bases, use type: */ + if (PyTuple_GET_SIZE(bases) == 0) { meta = (PyObject *) (&PyType_Type); + } + /* else get the type of the first base */ else { PyObject *base0 = PyTuple_GET_ITEM(bases, 0); meta = (PyObject *) (base0->ob_type); } Py_INCREF(meta); + isclass = 1; /* meta is really a class */ } + if (isclass) { + /* meta is really a class, so check for a more derived + metaclass, or possible metaclass conflicts: */ + winner = (PyObject *)_PyType_CalculateMetaclass((PyTypeObject *)meta, + bases); + if (winner == NULL) { + Py_DECREF(meta); + Py_XDECREF(mkw); + Py_DECREF(bases); + return NULL; + } + if (winner != meta) { + Py_DECREF(meta); + meta = winner; + Py_INCREF(meta); + } + } + /* else: meta is not a class, so we cannot do the metaclass + calculation, so we will use the explicitly given object as it is */ prep = PyObject_GetAttrString(meta, "__prepare__"); if (prep == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 14:37:13 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 23 Oct 2011 14:37:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_issue_1294232_patch_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/c72063032a7a changeset: 73062:c72063032a7a parent: 73059:96d5f53a414a parent: 73061:c2a89b509be4 user: Nick Coghlan date: Sun Oct 23 22:36:42 2011 +1000 summary: Merge issue 1294232 patch from 3.2 files: Include/object.h | 1 + Lib/test/test_descr.py | 168 +++++++++++++++++++++++++++++ Misc/NEWS | 4 + Objects/typeobject.c | 105 ++++++++++------- Python/bltinmodule.c | 33 +++++- 5 files changed, 266 insertions(+), 45 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -449,6 +449,7 @@ #ifndef Py_LIMITED_API PyAPI_FUNC(PyObject *) _PyType_Lookup(PyTypeObject *, PyObject *); PyAPI_FUNC(PyObject *) _PyObject_LookupSpecial(PyObject *, char *, PyObject **); +PyAPI_FUNC(PyTypeObject *) _PyType_CalculateMetaclass(PyTypeObject *, PyObject *); #endif PyAPI_FUNC(unsigned int) PyType_ClearCache(void); PyAPI_FUNC(void) PyType_Modified(PyTypeObject *); diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -625,6 +625,174 @@ # The most derived metaclass of D is A rather than type. class D(B, C): pass + self.assertIs(A, type(D)) + + # issue1294232: correct metaclass calculation + new_calls = [] # to check the order of __new__ calls + class AMeta(type): + @staticmethod + def __new__(mcls, name, bases, ns): + new_calls.append('AMeta') + return super().__new__(mcls, name, bases, ns) + @classmethod + def __prepare__(mcls, name, bases): + return {} + + class BMeta(AMeta): + @staticmethod + def __new__(mcls, name, bases, ns): + new_calls.append('BMeta') + return super().__new__(mcls, name, bases, ns) + @classmethod + def __prepare__(mcls, name, bases): + ns = super().__prepare__(name, bases) + ns['BMeta_was_here'] = True + return ns + + class A(metaclass=AMeta): + pass + self.assertEqual(['AMeta'], new_calls) + new_calls.clear() + + class B(metaclass=BMeta): + pass + # BMeta.__new__ calls AMeta.__new__ with super: + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls.clear() + + class C(A, B): + pass + # The most derived metaclass is BMeta: + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls.clear() + # BMeta.__prepare__ should've been called: + self.assertIn('BMeta_was_here', C.__dict__) + + # The order of the bases shouldn't matter: + class C2(B, A): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls.clear() + self.assertIn('BMeta_was_here', C2.__dict__) + + # Check correct metaclass calculation when a metaclass is declared: + class D(C, metaclass=type): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls.clear() + self.assertIn('BMeta_was_here', D.__dict__) + + class E(C, metaclass=AMeta): + pass + self.assertEqual(['BMeta', 'AMeta'], new_calls) + new_calls.clear() + self.assertIn('BMeta_was_here', E.__dict__) + + # Special case: the given metaclass isn't a class, + # so there is no metaclass calculation. + marker = object() + def func(*args, **kwargs): + return marker + class X(metaclass=func): + pass + class Y(object, metaclass=func): + pass + class Z(D, metaclass=func): + pass + self.assertIs(marker, X) + self.assertIs(marker, Y) + self.assertIs(marker, Z) + + # The given metaclass is a class, + # but not a descendant of type. + prepare_calls = [] # to track __prepare__ calls + class ANotMeta: + def __new__(mcls, *args, **kwargs): + new_calls.append('ANotMeta') + return super().__new__(mcls) + @classmethod + def __prepare__(mcls, name, bases): + prepare_calls.append('ANotMeta') + return {} + class BNotMeta(ANotMeta): + def __new__(mcls, *args, **kwargs): + new_calls.append('BNotMeta') + return super().__new__(mcls) + @classmethod + def __prepare__(mcls, name, bases): + prepare_calls.append('BNotMeta') + return super().__prepare__(name, bases) + + class A(metaclass=ANotMeta): + pass + self.assertIs(ANotMeta, type(A)) + self.assertEqual(['ANotMeta'], prepare_calls) + prepare_calls.clear() + self.assertEqual(['ANotMeta'], new_calls) + new_calls.clear() + + class B(metaclass=BNotMeta): + pass + self.assertIs(BNotMeta, type(B)) + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + + class C(A, B): + pass + self.assertIs(BNotMeta, type(C)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + + class C2(B, A): + pass + self.assertIs(BNotMeta, type(C2)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + + # This is a TypeError, because of a metaclass conflict: + # BNotMeta is neither a subclass, nor a superclass of type + with self.assertRaises(TypeError): + class D(C, metaclass=type): + pass + + class E(C, metaclass=ANotMeta): + pass + self.assertIs(BNotMeta, type(E)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + + class F(object(), C): + pass + self.assertIs(BNotMeta, type(F)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + + class F2(C, object()): + pass + self.assertIs(BNotMeta, type(F2)) + self.assertEqual(['BNotMeta', 'ANotMeta'], new_calls) + new_calls.clear() + self.assertEqual(['BNotMeta', 'ANotMeta'], prepare_calls) + prepare_calls.clear() + + # TypeError: BNotMeta is neither a + # subclass, nor a superclass of int + with self.assertRaises(TypeError): + class X(C, int()): + pass + with self.assertRaises(TypeError): + class X(int(), C): + pass def test_module_subclasses(self): # Testing Python subclass of module... diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #1294232: In a few cases involving metaclass inheritance, the + interpreter would sometimes invoke the wrong metaclass when building a new + class object. These cases now behave correctly. Patch by Daniel Urban. + - Issue #12753: Add support for Unicode name aliases and named sequences. Both :func:`unicodedata.lookup()` and '\N{...}' now resolve aliases, and :func:`unicodedata.lookup()` resolves named sequences too. diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1915,53 +1915,20 @@ return type->tp_flags; } -static PyObject * -type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) -{ - PyObject *name, *bases, *dict; - static char *kwlist[] = {"name", "bases", "dict", 0}; - PyObject *slots, *tmp, *newslots; - PyTypeObject *type, *base, *tmptype, *winner; - PyHeapTypeObject *et; - PyMemberDef *mp; - Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; - int j, may_add_dict, may_add_weak; - - assert(args != NULL && PyTuple_Check(args)); - assert(kwds == NULL || PyDict_Check(kwds)); - - /* Special case: type(x) should return x->ob_type */ - { - const Py_ssize_t nargs = PyTuple_GET_SIZE(args); - const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds); - - if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) { - PyObject *x = PyTuple_GET_ITEM(args, 0); - Py_INCREF(Py_TYPE(x)); - return (PyObject *) Py_TYPE(x); - } - - /* SF bug 475327 -- if that didn't trigger, we need 3 - arguments. but PyArg_ParseTupleAndKeywords below may give - a msg saying type() needs exactly 3. */ - if (nargs + nkwds != 3) { - PyErr_SetString(PyExc_TypeError, - "type() takes 1 or 3 arguments"); - return NULL; - } - } - - /* Check arguments: (name, bases, dict) */ - if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, - &name, - &PyTuple_Type, &bases, - &PyDict_Type, &dict)) - return NULL; +/* Determine the most derived metatype. */ +PyTypeObject * +_PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases) +{ + Py_ssize_t i, nbases; + PyTypeObject *winner; + PyObject *tmp; + PyTypeObject *tmptype; /* Determine the proper metatype to deal with this, and check for metatype conflicts while we're at it. Note that if some other metatype wins to contract, it's possible that its instances are not types. */ + nbases = PyTuple_GET_SIZE(bases); winner = metatype; for (i = 0; i < nbases; i++) { @@ -1973,6 +1940,7 @@ winner = tmptype; continue; } + /* else: */ PyErr_SetString(PyExc_TypeError, "metaclass conflict: " "the metaclass of a derived class " @@ -1980,6 +1948,58 @@ "of the metaclasses of all its bases"); return NULL; } + return winner; +} + +static PyObject * +type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds) +{ + PyObject *name, *bases, *dict; + static char *kwlist[] = {"name", "bases", "dict", 0}; + PyObject *slots, *tmp, *newslots; + PyTypeObject *type, *base, *tmptype, *winner; + PyHeapTypeObject *et; + PyMemberDef *mp; + Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak; + int j, may_add_dict, may_add_weak; + + assert(args != NULL && PyTuple_Check(args)); + assert(kwds == NULL || PyDict_Check(kwds)); + + /* Special case: type(x) should return x->ob_type */ + { + const Py_ssize_t nargs = PyTuple_GET_SIZE(args); + const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds); + + if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) { + PyObject *x = PyTuple_GET_ITEM(args, 0); + Py_INCREF(Py_TYPE(x)); + return (PyObject *) Py_TYPE(x); + } + + /* SF bug 475327 -- if that didn't trigger, we need 3 + arguments. but PyArg_ParseTupleAndKeywords below may give + a msg saying type() needs exactly 3. */ + if (nargs + nkwds != 3) { + PyErr_SetString(PyExc_TypeError, + "type() takes 1 or 3 arguments"); + return NULL; + } + } + + /* Check arguments: (name, bases, dict) */ + if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist, + &name, + &PyTuple_Type, &bases, + &PyDict_Type, &dict)) + return NULL; + + /* Determine the proper metatype to deal with this: */ + winner = _PyType_CalculateMetaclass(metatype, bases); + if (winner == NULL) { + return NULL; + } + if (winner != metatype) { if (winner->tp_new != type_new) /* Pass it to the winner */ return winner->tp_new(winner, args, kwds); @@ -1987,6 +2007,7 @@ } /* Adjust for empty tuple bases */ + nbases = PyTuple_GET_SIZE(bases); if (nbases == 0) { bases = PyTuple_Pack(1, &PyBaseObject_Type); if (bases == NULL) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -38,9 +38,10 @@ static PyObject * builtin___build_class__(PyObject *self, PyObject *args, PyObject *kwds) { - PyObject *func, *name, *bases, *mkw, *meta, *prep, *ns, *cell; + PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *cell; PyObject *cls = NULL; - Py_ssize_t nargs; + Py_ssize_t nargs, nbases; + int isclass; _Py_IDENTIFIER(__prepare__); assert(args != NULL); @@ -85,17 +86,43 @@ Py_DECREF(bases); return NULL; } + /* metaclass is explicitly given, check if it's indeed a class */ + isclass = PyType_Check(meta); } } if (meta == NULL) { - if (PyTuple_GET_SIZE(bases) == 0) + /* if there are no bases, use type: */ + if (PyTuple_GET_SIZE(bases) == 0) { meta = (PyObject *) (&PyType_Type); + } + /* else get the type of the first base */ else { PyObject *base0 = PyTuple_GET_ITEM(bases, 0); meta = (PyObject *) (base0->ob_type); } Py_INCREF(meta); + isclass = 1; /* meta is really a class */ } + + if (isclass) { + /* meta is really a class, so check for a more derived + metaclass, or possible metaclass conflicts: */ + winner = (PyObject *)_PyType_CalculateMetaclass((PyTypeObject *)meta, + bases); + if (winner == NULL) { + Py_DECREF(meta); + Py_XDECREF(mkw); + Py_DECREF(bases); + return NULL; + } + if (winner != meta) { + Py_DECREF(meta); + meta = winner; + Py_INCREF(meta); + } + } + /* else: meta is not a class, so we cannot do the metaclass + calculation, so we will use the explicitly given object as it is */ prep = _PyObject_GetAttrId(meta, &PyId___prepare__); if (prep == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 17:29:16 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 17:29:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Reformulate_make=5Fcompiled?= =?utf8?q?=5Fpathname_in_terms_of_unicode_objects=2E?= Message-ID: http://hg.python.org/cpython/rev/1959b2332c6a changeset: 73063:1959b2332c6a user: Martin v. L?wis date: Sun Oct 23 17:29:08 2011 +0200 summary: Reformulate make_compiled_pathname in terms of unicode objects. files: Python/import.c | 177 ++++++++++++----------------------- 1 files changed, 61 insertions(+), 116 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -904,6 +904,25 @@ return found; } +/* Like rightmost_sep, but operate on unicode objects. */ +static Py_ssize_t +rightmost_sep_obj(PyObject* o) +{ + Py_ssize_t found, i; + Py_UCS4 c; + for (found = -1, i = 0; i < PyUnicode_GET_LENGTH(o); i++) { + c = PyUnicode_READ_CHAR(o, i); + if (c == SEP +#ifdef ALTSEP + || c == ALTSEP +#endif + ) + { + found = i; + } + } + return found; +} /* Given a pathname for a Python source file, fill a buffer with the pathname for the corresponding compiled file. Return the pathname @@ -915,123 +934,49 @@ static PyObject* make_compiled_pathname(PyObject *pathstr, int debug) { - Py_UCS4 *pathname; - Py_UCS4 buf[MAXPATHLEN]; - size_t buflen = (size_t)MAXPATHLEN; - size_t len; - size_t i, save; - Py_UCS4 *pos; - int sep = SEP; - - pathname = PyUnicode_AsUCS4Copy(pathstr); - if (!pathname) + PyObject *result; + Py_ssize_t fname, ext, len, i, pos, taglen; + Py_ssize_t pycache_len = sizeof("__pycache__/") - 1; + int kind; + void *data; + + /* Compute the output string size. */ + len = PyUnicode_GET_LENGTH(pathstr); + /* If there is no separator, this returns -1, so + lastsep will be 0. */ + fname = rightmost_sep_obj(pathstr) + 1; + ext = fname - 1; + for(i = fname; i < len; i++) + if (PyUnicode_READ_CHAR(pathstr, i) == '.') + ext = i + 1; + if (ext < fname) + /* No dot in filename; use entire filename */ + ext = len; + + /* result = pathstr[:fname] + "__pycache__" + SEP + + pathstr[fname:ext] + tag + ".py[co]" */ + taglen = strlen(pyc_tag); + result = PyUnicode_New(ext + pycache_len + taglen + 4, + PyUnicode_MAX_CHAR_VALUE(pathstr)); + if (!result) return NULL; - len = Py_UCS4_strlen(pathname); - - /* Sanity check that the buffer has roughly enough space to hold what - will eventually be the full path to the compiled file. The 5 extra - bytes include the slash afer __pycache__, the two extra dots, the - extra trailing character ('c' or 'o') and null. This isn't exact - because the contents of the buffer can affect how many actual - characters of the string get into the buffer. We'll do a final - sanity check before writing the extension to ensure we do not - overflow the buffer. - */ - if (len + Py_UCS4_strlen(CACHEDIR_UNICODE) + Py_UCS4_strlen(PYC_TAG_UNICODE) + 5 > buflen) { - PyMem_Free(pathname); - return NULL; - } - - /* Find the last path separator and copy everything from the start of - the source string up to and including the separator. - */ - pos = rightmost_sep(pathname); - if (pos == NULL) { - i = 0; - } - else { - sep = *pos; - i = pos - pathname + 1; - Py_UCS4_strncpy(buf, pathname, i); - } - - save = i; - buf[i++] = '\0'; - /* Add __pycache__/ */ - Py_UCS4_strcat(buf, CACHEDIR_UNICODE); - i += Py_UCS4_strlen(CACHEDIR_UNICODE) - 1; - buf[i++] = sep; - buf[i] = '\0'; - /* Add the base filename, but remove the .py or .pyw extension, since - the tag name must go before the extension. - */ - Py_UCS4_strcat(buf, pathname + save); - pos = Py_UCS4_strrchr(buf + i, '.'); - if (pos != NULL) - *++pos = '\0'; - - /* pathname is not used from here on. */ - PyMem_Free(pathname); - - Py_UCS4_strcat(buf, PYC_TAG_UNICODE); - /* The length test above assumes that we're only adding one character - to the end of what would normally be the extension. What if there - is no extension, or the string ends in '.' or '.p', and otherwise - fills the buffer? By appending 4 more characters onto the string - here, we could overrun the buffer. - - As a simple example, let's say buflen=32 and the input string is - 'xxx.py'. strlen() would be 6 and the test above would yield: - - (6 + 11 + 10 + 5 == 32) > 32 - - which is false and so the name mangling would continue. This would - be fine because we'd end up with this string in buf: - - __pycache__/xxx.cpython-32.pyc\0 - - strlen(of that) == 30 + the nul fits inside a 32 character buffer. - We can even handle an input string of say 'xxxxx' above because - that's (5 + 11 + 10 + 5 == 31) > 32 which is also false. Name - mangling that yields: - - __pycache__/xxxxxcpython-32.pyc\0 - - which is 32 characters including the nul, and thus fits in the - buffer. However, an input string of 'xxxxxx' would yield a result - string of: - - __pycache__/xxxxxxcpython-32.pyc\0 - - which is 33 characters long (including the nul), thus overflowing - the buffer, even though the first test would fail, i.e.: the input - string is also 6 characters long, so 32 > 32 is false. - - The reason the first test fails but we still overflow the buffer is - that the test above only expects to add one extra character to be - added to the extension, and here we're adding three (pyc). We - don't add the first dot, so that reclaims one of expected - positions, leaving us overflowing by 1 byte (3 extra - 1 reclaimed - dot - 1 expected extra == 1 overflowed). - - The best we can do is ensure that we still have enough room in the - target buffer before we write the extension. Because it's always - only the extension that can cause the overflow, and never the other - path bytes we've written, it's sufficient to just do one more test - here. Still, the assertion that follows can't hurt. - */ -#if 0 - printf("strlen(buf): %d; buflen: %d\n", (int)strlen(buf), (int)buflen); -#endif - len = Py_UCS4_strlen(buf); - if (len + 5 > buflen) - return NULL; - buf[len] = '.'; len++; - buf[len] = 'p'; len++; - buf[len] = 'y'; len++; - buf[len] = debug ? 'c' : 'o'; len++; - assert(len <= buflen); - return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buf, len); + kind = PyUnicode_KIND(result); + data = PyUnicode_DATA(result); + PyUnicode_CopyCharacters(result, 0, pathstr, 0, fname); + pos = fname; + for (i = 0; i < pycache_len - 1; i++) + PyUnicode_WRITE(kind, data, pos++, "__pycache__"[i]); + PyUnicode_WRITE(kind, data, pos++, SEP); + PyUnicode_CopyCharacters(result, pos, pathstr, + fname, ext - fname); + pos += ext - fname; + for (i = 0; pyc_tag[i]; i++) + PyUnicode_WRITE(kind, data, pos++, pyc_tag[i]); + PyUnicode_WRITE(kind, data, pos++, '.'); + PyUnicode_WRITE(kind, data, pos++, 'p'); + PyUnicode_WRITE(kind, data, pos++, 'y'); + PyUnicode_WRITE(kind, data, pos++, debug ? 'c' : 'o'); + return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 18:05:13 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 18:05:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_ready_checks_for_make?= =?utf8?q?=5Fcompiled=5Fpathname=2E?= Message-ID: http://hg.python.org/cpython/rev/fdb0ccf1f4b3 changeset: 73064:fdb0ccf1f4b3 user: Martin v. L?wis date: Sun Oct 23 17:35:46 2011 +0200 summary: Add ready checks for make_compiled_pathname. files: Python/import.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -929,7 +929,10 @@ for the compiled file, or NULL if there's no space in the buffer. Doesn't set an exception. - foo.py -> __pycache__/foo..pyc */ + foo.py -> __pycache__/foo..pyc + + pathstr is assumed to be "ready". +*/ static PyObject* make_compiled_pathname(PyObject *pathstr, int debug) @@ -1458,6 +1461,8 @@ goto error; } #endif + if (PyUnicode_READY(pathname) < 0) + return NULL; cpathname = make_compiled_pathname(pathname, !Py_OptimizeFlag); if (cpathname != NULL) @@ -3949,6 +3954,9 @@ return NULL; } + if (PyUnicode_READY(pathname) < 0) + return NULL; + cpathname = make_compiled_pathname(pathname, debug); Py_DECREF(pathname); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 18:05:13 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 18:05:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Rewrite_make=5Fsource=5Fpat?= =?utf8?q?hname_using_Unicode_API=2E?= Message-ID: http://hg.python.org/cpython/rev/6fa4386d48a9 changeset: 73065:6fa4386d48a9 user: Martin v. L?wis date: Sun Oct 23 18:05:06 2011 +0200 summary: Rewrite make_source_pathname using Unicode API. files: Python/import.c | 81 +++++++++++++++++++----------------- 1 files changed, 42 insertions(+), 39 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -906,11 +906,11 @@ /* Like rightmost_sep, but operate on unicode objects. */ static Py_ssize_t -rightmost_sep_obj(PyObject* o) +rightmost_sep_obj(PyObject* o, Py_ssize_t start, Py_ssize_t end) { Py_ssize_t found, i; Py_UCS4 c; - for (found = -1, i = 0; i < PyUnicode_GET_LENGTH(o); i++) { + for (found = -1, i = start; i < end; i++) { c = PyUnicode_READ_CHAR(o, i); if (c == SEP #ifdef ALTSEP @@ -947,7 +947,7 @@ len = PyUnicode_GET_LENGTH(pathstr); /* If there is no separator, this returns -1, so lastsep will be 0. */ - fname = rightmost_sep_obj(pathstr) + 1; + fname = rightmost_sep_obj(pathstr, 0, len) + 1; ext = fname - 1; for(i = fname; i < len; i++) if (PyUnicode_READ_CHAR(pathstr, i) == '.') @@ -992,63 +992,66 @@ (...)/__pycache__/foo..pyc -> (...)/foo.py */ static PyObject* -make_source_pathname(PyObject *pathobj) +make_source_pathname(PyObject *path) { - Py_UCS4 buf[MAXPATHLEN]; - Py_UCS4 *pathname; - Py_UCS4 *left, *right, *dot0, *dot1, sep; - size_t i, j; - - if (PyUnicode_GET_LENGTH(pathobj) > MAXPATHLEN) - return NULL; - pathname = PyUnicode_AsUCS4Copy(pathobj); - if (!pathname) + Py_ssize_t left, right, dot0, dot1, len; + Py_ssize_t i, j; + PyObject *result; + int kind; + void *data; + + len = PyUnicode_GET_LENGTH(path); + if (len > MAXPATHLEN) return NULL; /* Look back two slashes from the end. In between these two slashes must be the string __pycache__ or this is not a PEP 3147 style path. It's possible for there to be only one slash. */ - right = rightmost_sep(pathname); - if (right == NULL) + right = rightmost_sep_obj(path, 0, len); + if (right == -1) return NULL; - sep = *right; - *right = '\0'; - left = rightmost_sep(pathname); - *right = sep; - if (left == NULL) - left = pathname; + left = rightmost_sep_obj(path, 0, right); + if (left == -1) + left = 0; else left++; - if (right-left != Py_UCS4_strlen(CACHEDIR_UNICODE) || - Py_UCS4_strncmp(left, CACHEDIR_UNICODE, right-left) != 0) - goto error; + if (right-left != sizeof(CACHEDIR)-1) + return NULL; + for (i = 0; i < sizeof(CACHEDIR)-1; i++) + if (PyUnicode_READ_CHAR(path, left+i) != CACHEDIR[i]) + return NULL; /* Now verify that the path component to the right of the last slash has two dots in it. */ - if ((dot0 = Py_UCS4_strchr(right + 1, '.')) == NULL) - goto error; - if ((dot1 = Py_UCS4_strchr(dot0 + 1, '.')) == NULL) - goto error; + dot0 = PyUnicode_FindChar(path, '.', right+1, len, 1); + if (dot0 < 0) + return NULL; + dot1 = PyUnicode_FindChar(path, '.', dot0+1, len, 1); + if (dot1 < 0) + return NULL; /* Too many dots? */ - if (Py_UCS4_strchr(dot1 + 1, '.') != NULL) - goto error; + if (PyUnicode_FindChar(path, '.', dot1+1, len, 1) != -1) + return NULL; /* This is a PEP 3147 path. Start by copying everything from the start of pathname up to and including the leftmost slash. Then copy the file's basename, removing the magic tag and adding a .py suffix. */ - Py_UCS4_strncpy(buf, pathname, (i=left-pathname)); - Py_UCS4_strncpy(buf+i, right+1, (j=dot0-right)); - buf[i+j] = 'p'; - buf[i+j+1] = 'y'; - PyMem_Free(pathname); - return PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buf, i+j+2); - error: - PyMem_Free(pathname); - return NULL; + result = PyUnicode_New(left + (dot0-right) + 2, + PyUnicode_MAX_CHAR_VALUE(path)); + if (!result) + return NULL; + kind = PyUnicode_KIND(result); + data = PyUnicode_DATA(result); + PyUnicode_CopyCharacters(result, 0, path, 0, (i = left)); + PyUnicode_CopyCharacters(result, left, path, right+1, + (j = dot0-right)); + PyUnicode_WRITE(kind, data, i+j, 'p'); + PyUnicode_WRITE(kind, data, i+j+1, 'y'); + return result; } /* Given a pathname for a Python source file, its time of last -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 18:08:31 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 18:08:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Drop_unused_macros=2E_Use_C?= =?utf8?q?ACHEDIR_consistently=2E?= Message-ID: http://hg.python.org/cpython/rev/4cfff313ce65 changeset: 73066:4cfff313ce65 user: Martin v. L?wis date: Sun Oct 23 18:08:20 2011 +0200 summary: Drop unused macros. Use CACHEDIR consistently. files: Python/import.c | 12 ++++-------- 1 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -108,8 +108,8 @@ /* 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) - TAG and PYC_TAG_UNICODE must change for each major Python release. The magic - number will take care of any bytecode changes that occur during development. + TAG must change for each major Python release. The magic number will take + care of any bytecode changes that occur during development. */ #define QUOTE(arg) #arg #define STRIFY(name) QUOTE(name) @@ -118,13 +118,9 @@ #define MAGIC (3190 | ((long)'\r'<<16) | ((long)'\n'<<24)) #define TAG "cpython-" MAJOR MINOR; #define CACHEDIR "__pycache__" -static const Py_UCS4 CACHEDIR_UNICODE[] = { - '_', '_', 'p', 'y', 'c', 'a', 'c', 'h', 'e', '_', '_', '\0'}; /* Current magic word and string tag as globals. */ static long pyc_magic = MAGIC; static const char *pyc_tag = TAG; -static const Py_UCS4 PYC_TAG_UNICODE[] = { - 'c', 'p', 'y', 't', 'h', 'o', 'n', '-', PY_MAJOR_VERSION + 48, PY_MINOR_VERSION + 48, '\0'}; #undef QUOTE #undef STRIFY #undef MAJOR @@ -939,7 +935,7 @@ { PyObject *result; Py_ssize_t fname, ext, len, i, pos, taglen; - Py_ssize_t pycache_len = sizeof("__pycache__/") - 1; + Py_ssize_t pycache_len = sizeof(CACHEDIR) - 1; int kind; void *data; @@ -968,7 +964,7 @@ PyUnicode_CopyCharacters(result, 0, pathstr, 0, fname); pos = fname; for (i = 0; i < pycache_len - 1; i++) - PyUnicode_WRITE(kind, data, pos++, "__pycache__"[i]); + PyUnicode_WRITE(kind, data, pos++, CACHEDIR[i]); PyUnicode_WRITE(kind, data, pos++, SEP); PyUnicode_CopyCharacters(result, pos, pathstr, fname, ext - fname); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 18:42:03 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 18:42:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_off-by-one_error=2E?= Message-ID: http://hg.python.org/cpython/rev/17d046568f0c changeset: 73067:17d046568f0c user: Martin v. L?wis date: Sun Oct 23 18:41:56 2011 +0200 summary: Fix off-by-one error. files: Python/import.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -955,7 +955,7 @@ /* result = pathstr[:fname] + "__pycache__" + SEP + pathstr[fname:ext] + tag + ".py[co]" */ taglen = strlen(pyc_tag); - result = PyUnicode_New(ext + pycache_len + taglen + 4, + result = PyUnicode_New(ext + pycache_len + 1 + taglen + 4, PyUnicode_MAX_CHAR_VALUE(pathstr)); if (!result) return NULL; @@ -963,7 +963,7 @@ data = PyUnicode_DATA(result); PyUnicode_CopyCharacters(result, 0, pathstr, 0, fname); pos = fname; - for (i = 0; i < pycache_len - 1; i++) + for (i = 0; i < pycache_len; i++) PyUnicode_WRITE(kind, data, pos++, CACHEDIR[i]); PyUnicode_WRITE(kind, data, pos++, SEP); PyUnicode_CopyCharacters(result, pos, pathstr, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 18:45:23 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 23 Oct 2011 18:45:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Rewrite_find=5Fmodule=5Fpat?= =?utf8?q?h_using_unicode_API=2E?= Message-ID: http://hg.python.org/cpython/rev/eef1027ab2f0 changeset: 73068:eef1027ab2f0 user: Martin v. L?wis date: Sun Oct 23 18:45:16 2011 +0200 summary: Rewrite find_module_path using unicode API. files: Python/import.c | 81 +++++++++++++++++++++--------------- 1 files changed, 47 insertions(+), 34 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1743,11 +1743,11 @@ PyObject *path_hooks, PyObject *path_importer_cache, PyObject **p_path, PyObject **p_loader, struct filedescr **p_fd) { - Py_UCS4 buf[MAXPATHLEN+1]; - PyObject *path_unicode, *filename; - Py_ssize_t len; + PyObject *path_unicode, *filename = NULL; + Py_ssize_t len, pos; struct stat statbuf; static struct filedescr fd_package = {"", "", PKG_DIRECTORY}; + int result, addsep; if (PyUnicode_Check(path)) { Py_INCREF(path); @@ -1766,15 +1766,10 @@ return -1; len = PyUnicode_GET_LENGTH(path_unicode); - if (!PyUnicode_AsUCS4(path_unicode, buf, Py_ARRAY_LENGTH(buf), 1)) { - Py_DECREF(path_unicode); - PyErr_Clear(); - return 0; + if (PyUnicode_FindChar(path_unicode, 0, 0, len, 1) != -1) { + result = 0; + goto out; /* path contains '\0' */ } - Py_DECREF(path_unicode); - - if (Py_UCS4_strlen(buf) != len) - return 0; /* path contains '\0' */ /* sys.path_hooks import hook */ if (p_loader != NULL) { @@ -1784,43 +1779,54 @@ importer = get_path_importer(path_importer_cache, path_hooks, path); if (importer == NULL) { - return -1; + result = -1; + goto out; } /* Note: importer is a borrowed reference */ if (importer != Py_None) { PyObject *loader; loader = _PyObject_CallMethodId(importer, &PyId_find_module, "O", fullname); - if (loader == NULL) - return -1; /* error */ + if (loader == NULL) { + result = -1; /* error */ + goto out; + } if (loader != Py_None) { /* a loader was found */ *p_loader = loader; *p_fd = &importhookdescr; - return 2; + result = 2; + goto out; } Py_DECREF(loader); - return 0; + result = 0; + goto out; } } /* no hook was found, use builtin import */ - if (len > 0 && buf[len-1] != SEP + addsep = 0; + if (len > 0 && PyUnicode_READ_CHAR(path_unicode, len-1) != SEP #ifdef ALTSEP - && buf[len-1] != ALTSEP + && PyUnicode_READ_CHAR(path_unicode, len-1) != ALTSEP #endif ) - buf[len++] = SEP; - if (!PyUnicode_AsUCS4(name, buf+len, Py_ARRAY_LENGTH(buf)-len, 1)) { - PyErr_Clear(); - return 0; + addsep = 1; + filename = PyUnicode_New(len + PyUnicode_GET_LENGTH(name) + addsep, + Py_MAX(PyUnicode_MAX_CHAR_VALUE(path_unicode), + PyUnicode_MAX_CHAR_VALUE(name))); + if (filename == NULL) { + result = -1; + goto out; } - len += PyUnicode_GET_LENGTH(name); - - filename = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - buf, len); - if (filename == NULL) - return -1; + PyUnicode_CopyCharacters(filename, 0, path_unicode, 0, len); + pos = len; + if (addsep) + PyUnicode_WRITE(PyUnicode_KIND(filename), + PyUnicode_DATA(filename), + pos++, SEP); + PyUnicode_CopyCharacters(filename, pos, name, 0, + PyUnicode_GET_LENGTH(name)); /* Check for package import (buf holds a directory name, and there's an __init__ module in that directory */ @@ -1832,14 +1838,16 @@ match = case_ok(filename, 0, name); if (match < 0) { - Py_DECREF(filename); - return -1; + result = -1; + goto out; } if (match) { /* case matches */ if (find_init_module(filename)) { /* and has __init__.py */ *p_path = filename; + filename = NULL; *p_fd = &fd_package; - return 2; + result = 2; + goto out; } else { int err; @@ -1847,15 +1855,20 @@ "Not importing directory %R: missing __init__.py", filename); if (err) { - Py_DECREF(filename); - return -1; + result = -1; + goto out; } } } } #endif *p_path = filename; - return 1; + filename = NULL; + result = 1; + out: + Py_DECREF(path_unicode); + Py_XDECREF(filename); + return result; } /* Find a module in search_path_list. For each path, try -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 20:33:13 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 23 Oct 2011 20:33:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_the_green_?= =?utf8?q?=22New_reference=22_note_to_the_doc_of_PyException=5FGetTracebac?= =?utf8?b?aygp?= Message-ID: http://hg.python.org/cpython/rev/46c82c4141c9 changeset: 73069:46c82c4141c9 branch: 3.2 parent: 73061:c2a89b509be4 user: Petri Lehtinen date: Sun Oct 23 21:03:33 2011 +0300 summary: Add the green "New reference" note to the doc of PyException_GetTraceback() files: Doc/data/refcounts.dat | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -376,6 +376,8 @@ PyEval_EvalCode:PyObject*:globals:0: PyEval_EvalCode:PyObject*:locals:0: +PyException_GetTraceback:PyObject*::+1: + PyFile_AsFile:FILE*::: PyFile_AsFile:PyFileObject*:p:0: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 20:33:14 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 23 Oct 2011 20:33:14 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e3c5f6778ef5 changeset: 73070:e3c5f6778ef5 parent: 73068:eef1027ab2f0 parent: 73069:46c82c4141c9 user: Petri Lehtinen date: Sun Oct 23 21:07:50 2011 +0300 summary: Merge 3.2 files: Doc/data/refcounts.dat | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -376,6 +376,8 @@ PyEval_EvalCode:PyObject*:globals:0: PyEval_EvalCode:PyObject*:locals:0: +PyException_GetTraceback:PyObject*::+1: + PyFile_AsFile:FILE*::: PyFile_AsFile:PyFileObject*:p:0: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 20:36:01 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 23 Oct 2011 20:36:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_the_green_?= =?utf8?q?=22New_reference=22_note_to_the_doc_of_PyException=5FGetTracebac?= =?utf8?b?aygp?= Message-ID: http://hg.python.org/cpython/rev/11da12600f5b changeset: 73071:11da12600f5b branch: 2.7 parent: 73060:0b39f2486314 user: Petri Lehtinen date: Sun Oct 23 21:34:57 2011 +0300 summary: Add the green "New reference" note to the doc of PyException_GetTraceback() files: Doc/data/refcounts.dat | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -380,6 +380,8 @@ PyEval_EvalCode:PyObject*:globals:0: PyEval_EvalCode:PyObject*:locals:0: +PyException_GetTraceback:PyObject*::+1: + PyFile_AsFile:FILE*::: PyFile_AsFile:PyFileObject*:p:0: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 20:53:08 2011 From: python-checkins at python.org (mark.dickinson) Date: Sun, 23 Oct 2011 20:53:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313201=3A_equality_?= =?utf8?q?for_range_objects_is_now_based_on_equality_of_the?= Message-ID: http://hg.python.org/cpython/rev/479a7dd1ea6a changeset: 73072:479a7dd1ea6a parent: 73070:e3c5f6778ef5 user: Mark Dickinson date: Sun Oct 23 19:53:01 2011 +0100 summary: Issue #13201: equality for range objects is now based on equality of the underlying sequences. Thanks Sven Marnach for the patch. files: Doc/library/functions.rst | 12 ++ Doc/whatsnew/3.3.rst | 6 + Lib/test/test_hash.py | 3 +- Lib/test/test_range.py | 52 ++++++++++ Misc/ACKS | 1 + Misc/NEWS | 4 + Objects/rangeobject.c | 135 +++++++++++++++++++++++++- 7 files changed, 209 insertions(+), 4 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1077,6 +1077,13 @@ >>> r[-1] 18 + Testing range objects for equality with ``==`` and ``!=`` compares + them as sequences. That is, two range objects are considered equal if + they represent the same sequence of values. (Note that two range + objects that compare equal might have different :attr:`start`, + :attr:`stop` and :attr:`step` attributes, for example ``range(0) == + range(2, 1, 3)`` or ``range(0, 3, 2) == range(0, 4, 2)``.) + Ranges containing absolute values larger than :data:`sys.maxsize` are permitted but some features (such as :func:`len`) will raise :exc:`OverflowError`. @@ -1086,6 +1093,11 @@ Test integers for membership in constant time instead of iterating through all items. + .. versionchanged:: 3.3 + Define '==' and '!=' to compare range objects based on the + sequence of values they define (instead of comparing based on + object identity). + .. function:: repr(object) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -186,6 +186,12 @@ (Contributed by Ezio Melotti in :issue:`12753`) +Equality comparisons on :func:`range` objects now return a result reflecting +the equality of the underlying sequences generated by those range objects. + +(:issue:`13021`) + + New, Improved, and Deprecated Modules ===================================== diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -107,8 +107,7 @@ return self.seq[index] class HashBuiltinsTestCase(unittest.TestCase): - hashes_to_check = [range(10), - enumerate(range(10)), + hashes_to_check = [enumerate(range(10)), iter(DefaultIterSeq()), iter(lambda: 0, 0), ] diff --git a/Lib/test/test_range.py b/Lib/test/test_range.py --- a/Lib/test/test_range.py +++ b/Lib/test/test_range.py @@ -507,6 +507,58 @@ for k in values - {0}: r[i:j:k] + def test_comparison(self): + test_ranges = [range(0), range(0, -1), range(1, 1, 3), + range(1), range(5, 6), range(5, 6, 2), + range(5, 7, 2), range(2), range(0, 4, 2), + range(0, 5, 2), range(0, 6, 2)] + test_tuples = list(map(tuple, test_ranges)) + + # Check that equality of ranges matches equality of the corresponding + # tuples for each pair from the test lists above. + ranges_eq = [a == b for a in test_ranges for b in test_ranges] + tuples_eq = [a == b for a in test_tuples for b in test_tuples] + self.assertEqual(ranges_eq, tuples_eq) + + # Check that != correctly gives the logical negation of == + ranges_ne = [a != b for a in test_ranges for b in test_ranges] + self.assertEqual(ranges_ne, [not x for x in ranges_eq]) + + # Equal ranges should have equal hashes. + for a in test_ranges: + for b in test_ranges: + if a == b: + self.assertEqual(hash(a), hash(b)) + + # Ranges are unequal to other types (even sequence types) + self.assertIs(range(0) == (), False) + self.assertIs(() == range(0), False) + self.assertIs(range(2) == [0, 1], False) + + # Huge integers aren't a problem. + self.assertEqual(range(0, 2**100 - 1, 2), + range(0, 2**100, 2)) + self.assertEqual(hash(range(0, 2**100 - 1, 2)), + hash(range(0, 2**100, 2))) + self.assertNotEqual(range(0, 2**100, 2), + range(0, 2**100 + 1, 2)) + self.assertEqual(range(2**200, 2**201 - 2**99, 2**100), + range(2**200, 2**201, 2**100)) + self.assertEqual(hash(range(2**200, 2**201 - 2**99, 2**100)), + hash(range(2**200, 2**201, 2**100))) + self.assertNotEqual(range(2**200, 2**201, 2**100), + range(2**200, 2**201 + 1, 2**100)) + + # Order comparisons are not implemented for ranges. + with self.assertRaises(TypeError): + range(0) < range(0) + with self.assertRaises(TypeError): + range(0) > range(0) + with self.assertRaises(TypeError): + range(0) <= range(0) + with self.assertRaises(TypeError): + range(0) >= range(0) + def test_main(): test.support.run_unittest(RangeTest) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -613,6 +613,7 @@ Vladimir Marangozov David Marek Doug Marien +Sven Marnach Alex Martelli Anthony Martin Owen Martin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- Issue #13201: Define '==' and '!=' to compare range objects based on + the sequence of values they define (instead of comparing based on + object identity). + - Issue #1294232: In a few cases involving metaclass inheritance, the interpreter would sometimes invoke the wrong metaclass when building a new class object. These cases now behave correctly. Patch by Daniel Urban. diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -609,6 +609,137 @@ PY_ITERSEARCH_CONTAINS); } +/* Compare two range objects. Return 1 for equal, 0 for not equal + and -1 on error. The algorithm is roughly the C equivalent of + + if r0 is r1: + return True + if len(r0) != len(r1): + return False + if not len(r0): + return True + if r0.start != r1.start: + return False + if len(r0) == 1: + return True + return r0.step == r1.step +*/ +static int +range_equals(rangeobject *r0, rangeobject *r1) +{ + int cmp_result; + PyObject *one; + + if (r0 == r1) + return 1; + cmp_result = PyObject_RichCompareBool(r0->length, r1->length, Py_EQ); + /* Return False or error to the caller. */ + if (cmp_result != 1) + return cmp_result; + cmp_result = PyObject_Not(r0->length); + /* Return True or error to the caller. */ + if (cmp_result != 0) + return cmp_result; + cmp_result = PyObject_RichCompareBool(r0->start, r1->start, Py_EQ); + /* Return False or error to the caller. */ + if (cmp_result != 1) + return cmp_result; + one = PyLong_FromLong(1); + if (!one) + return -1; + cmp_result = PyObject_RichCompareBool(r0->length, one, Py_EQ); + Py_DECREF(one); + /* Return True or error to the caller. */ + if (cmp_result != 0) + return cmp_result; + return PyObject_RichCompareBool(r0->step, r1->step, Py_EQ); +} + +static PyObject * +range_richcompare(PyObject *self, PyObject *other, int op) +{ + int result; + + if (!PyRange_Check(other)) + Py_RETURN_NOTIMPLEMENTED; + switch (op) { + case Py_NE: + case Py_EQ: + result = range_equals((rangeobject*)self, (rangeobject*)other); + if (result == -1) + return NULL; + if (op == Py_NE) + result = !result; + if (result) + Py_RETURN_TRUE; + else + Py_RETURN_FALSE; + case Py_LE: + case Py_GE: + case Py_LT: + case Py_GT: + Py_RETURN_NOTIMPLEMENTED; + default: + PyErr_BadArgument(); + return NULL; + } +} + +/* Hash function for range objects. Rough C equivalent of + + if not len(r): + return hash((len(r), None, None)) + if len(r) == 1: + return hash((len(r), r.start, None)) + return hash((len(r), r.start, r.step)) +*/ +static Py_hash_t +range_hash(rangeobject *r) +{ + PyObject *t; + Py_hash_t result = -1; + int cmp_result; + + t = PyTuple_New(3); + if (!t) + return -1; + Py_INCREF(r->length); + PyTuple_SET_ITEM(t, 0, r->length); + cmp_result = PyObject_Not(r->length); + if (cmp_result == -1) + goto end; + if (cmp_result == 1) { + Py_INCREF(Py_None); + Py_INCREF(Py_None); + PyTuple_SET_ITEM(t, 1, Py_None); + PyTuple_SET_ITEM(t, 2, Py_None); + } + else { + PyObject *one; + Py_INCREF(r->start); + PyTuple_SET_ITEM(t, 1, r->start); + one = PyLong_FromLong(1); + if (!one) + goto end; + cmp_result = PyObject_RichCompareBool(r->length, one, Py_EQ); + Py_DECREF(one); + if (cmp_result == -1) + goto end; + if (cmp_result == 1) { + Py_INCREF(Py_None); + PyTuple_SET_ITEM(t, 2, Py_None); + } + else { + Py_INCREF(r->step); + PyTuple_SET_ITEM(t, 2, r->step); + } + } + result = PyObject_Hash(t); + end: + Py_DECREF(t); + return result; +} + static PyObject * range_count(rangeobject *r, PyObject *ob) { @@ -763,7 +894,7 @@ 0, /* tp_as_number */ &range_as_sequence, /* tp_as_sequence */ &range_as_mapping, /* tp_as_mapping */ - 0, /* tp_hash */ + (hashfunc)range_hash, /* tp_hash */ 0, /* tp_call */ 0, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ @@ -773,7 +904,7 @@ range_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + range_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ range_iter, /* tp_iter */ 0, /* tp_iternext */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 20:54:22 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 23 Oct 2011 20:54:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Whoops=2C_PyExc?= =?utf8?q?eption=5FGetTraceback=28=29_is_not_documented_on_2=2E7?= Message-ID: http://hg.python.org/cpython/rev/5c4781a237ef changeset: 73073:5c4781a237ef branch: 2.7 parent: 73071:11da12600f5b user: Petri Lehtinen date: Sun Oct 23 21:52:10 2011 +0300 summary: Whoops, PyException_GetTraceback() is not documented on 2.7 files: Doc/data/refcounts.dat | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -380,8 +380,6 @@ PyEval_EvalCode:PyObject*:globals:0: PyEval_EvalCode:PyObject*:locals:0: -PyException_GetTraceback:PyObject*::+1: - PyFile_AsFile:FILE*::: PyFile_AsFile:PyFileObject*:p:0: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 21:07:50 2011 From: python-checkins at python.org (mark.dickinson) Date: Sun, 23 Oct 2011 21:07:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310925=3A_Add_equiv?= =?utf8?q?alent_pure_Python_code_for_the_builtin_int-to-float?= Message-ID: http://hg.python.org/cpython/rev/117d51d3dd7d changeset: 73074:117d51d3dd7d parent: 73072:479a7dd1ea6a user: Mark Dickinson date: Sun Oct 23 20:07:13 2011 +0100 summary: Issue #10925: Add equivalent pure Python code for the builtin int-to-float conversion to test_long. files: Lib/test/test_long.py | 80 +++++++++++++++++++++++++++++++ 1 files changed, 80 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -43,6 +43,53 @@ DBL_MANT_DIG = sys.float_info.mant_dig DBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1) + +# Pure Python version of correctly-rounded integer-to-float conversion. +def int_to_float(n): + """ + Correctly-rounded integer-to-float conversion. + + """ + # Constants, depending only on the floating-point format in use. + # We use an extra 2 bits of precision for rounding purposes. + PRECISION = sys.float_info.mant_dig + 2 + SHIFT_MAX = sys.float_info.max_exp - PRECISION + Q_MAX = 1 << PRECISION + ROUND_HALF_TO_EVEN_CORRECTION = [0, -1, -2, 1, 0, -1, 2, 1] + + # Reduce to the case where n is positive. + if n == 0: + return 0.0 + elif n < 0: + return -int_to_float(-n) + + # Convert n to a 'floating-point' number q * 2**shift, where q is an + # integer with 'PRECISION' significant bits. When shifting n to create q, + # the least significant bit of q is treated as 'sticky'. That is, the + # least significant bit of q is set if either the corresponding bit of n + # was already set, or any one of the bits of n lost in the shift was set. + shift = n.bit_length() - PRECISION + q = n << -shift if shift < 0 else (n >> shift) | bool(n & ~(-1 << shift)) + + # Round half to even (actually rounds to the nearest multiple of 4, + # rounding ties to a multiple of 8). + q += ROUND_HALF_TO_EVEN_CORRECTION[q & 7] + + # Detect overflow. + if shift + (q == Q_MAX) > SHIFT_MAX: + raise OverflowError("integer too large to convert to float") + + # Checks: q is exactly representable, and q**2**shift doesn't overflow. + assert q % 4 == 0 and q // 4 <= 2**(sys.float_info.mant_dig) + assert q * 2**shift <= sys.float_info.max + + # Some circularity here, since float(q) is doing an int-to-float + # conversion. But here q is of bounded size, and is exactly representable + # as a float. In a low-level C-like language, this operation would be a + # simple cast (e.g., from unsigned long long to double). + return math.ldexp(float(q), shift) + + # pure Python version of correctly-rounded true division def truediv(a, b): """Correctly-rounded true division for integers.""" @@ -367,6 +414,23 @@ return 1729 self.assertEqual(int(LongTrunc()), 1729) + def check_float_conversion(self, n): + # Check that int -> float conversion behaviour matches + # that of the pure Python version above. + try: + actual = float(n) + except OverflowError: + actual = 'overflow' + + try: + expected = int_to_float(n) + except OverflowError: + expected = 'overflow' + + msg = ("Error in conversion of integer {} to float. " + "Got {}, expected {}.".format(n, actual, expected)) + self.assertEqual(actual, expected, msg) + @support.requires_IEEE_754 def test_float_conversion(self): @@ -421,6 +485,22 @@ y = 2**p * 2**53 self.assertEqual(int(float(x)), y) + # Compare builtin float conversion with pure Python int_to_float + # function above. + test_values = [ + int_dbl_max-1, int_dbl_max, int_dbl_max+1, + halfway-1, halfway, halfway + 1, + top_power-1, top_power, top_power+1, + 2*top_power-1, 2*top_power, top_power*top_power, + ] + test_values.extend(exact_values) + for p in range(-4, 8): + for x in range(-128, 128): + test_values.append(2**(p+53) + x) + for value in test_values: + self.check_float_conversion(value) + self.check_float_conversion(-value) + def test_float_overflow(self): for x in -2.0, -1.0, 0.0, 1.0, 2.0: self.assertEqual(float(int(x)), x) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 21:47:41 2011 From: python-checkins at python.org (mark.dickinson) Date: Sun, 23 Oct 2011 21:47:41 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312965=3A_Fix_some_?= =?utf8?q?inaccurate_comments_in_Objects/longobject=2Ec=2E__Thanks?= Message-ID: http://hg.python.org/cpython/rev/d4839fea4a5a changeset: 73075:d4839fea4a5a user: Mark Dickinson date: Sun Oct 23 20:47:14 2011 +0100 summary: Issue #12965: Fix some inaccurate comments in Objects/longobject.c. Thanks Stefan Krah. files: Objects/longobject.c | 40 +++++++++++++++++++------------ 1 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -322,8 +322,15 @@ #define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN) #define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN) -/* Get a C long int from a long int object. - Returns -1 and sets an error condition if overflow occurs. */ +/* Get a C long int from a long int object or any object that has an __int__ + method. + + On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of + the result. Otherwise *overflow is 0. + + For other errors (e.g., TypeError), return -1 and set an error condition. + In this case *overflow will be 0. +*/ long PyLong_AsLongAndOverflow(PyObject *vv, int *overflow) @@ -412,6 +419,9 @@ return res; } +/* Get a C long int from a long int object or any object that has an __int__ + method. Return -1 and set an error if overflow occurs. */ + long PyLong_AsLong(PyObject *obj) { @@ -923,7 +933,7 @@ } -/* Create a new long (or int) object from a C pointer */ +/* Create a new long int object from a C pointer */ PyObject * PyLong_FromVoidPtr(void *p) @@ -941,15 +951,11 @@ } -/* Get a C pointer from a long object (or an int object in some cases) */ +/* Get a C pointer from a long int object. */ void * PyLong_AsVoidPtr(PyObject *vv) { - /* This function will allow int or long objects. If vv is neither, - then the PyLong_AsLong*() functions will raise the exception: - PyExc_SystemError, "bad argument to internal function" - */ #if SIZEOF_VOID_P <= SIZEOF_LONG long x; @@ -1130,8 +1136,8 @@ return (PyObject *)v; } -/* Get a C PY_LONG_LONG int from a long int object. - Return -1 and set an error if overflow occurs. */ +/* Get a C long long int from a long int object or any object that has an + __int__ method. Return -1 and set an error if overflow occurs. */ PY_LONG_LONG PyLong_AsLongLong(PyObject *vv) @@ -1287,12 +1293,14 @@ } #undef IS_LITTLE_ENDIAN -/* Get a C long long int from a Python long or Python int object. - On overflow, returns -1 and sets *overflow to 1 or -1 depending - on the sign of the result. Otherwise *overflow is 0. - - For other errors (e.g., type error), returns -1 and sets an error - condition. +/* Get a C long long int from a long int object or any object that has an + __int__ method. + + On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of + the result. Otherwise *overflow is 0. + + For other errors (e.g., TypeError), return -1 and set an error condition. + In this case *overflow will be 0. */ PY_LONG_LONG -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:21:22 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 22:21:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Cleanup_code=3A_remove_int/?= =?utf8?q?long_idioms_and_simplify_a_while_statement=2E?= Message-ID: http://hg.python.org/cpython/rev/67053b135ed9 changeset: 73076:67053b135ed9 user: Florent Xicluna date: Sun Oct 23 22:11:00 2011 +0200 summary: Cleanup code: remove int/long idioms and simplify a while statement. files: Lib/ftplib.py | 17 ++++------------- Lib/optparse.py | 5 +---- Lib/pickletools.py | 5 +---- Lib/xdrlib.py | 6 +----- Lib/xmlrpc/client.py | 12 +++--------- 5 files changed, 10 insertions(+), 35 deletions(-) diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -175,10 +175,8 @@ # Internal: "sanitize" a string for printing def sanitize(self, s): - if s[:5] == 'pass ' or s[:5] == 'PASS ': - i = len(s) - while i > 5 and s[i-1] in {'\r', '\n'}: - i = i-1 + if s[:5] in {'pass ', 'PASS '}: + i = len(s.rstrip('\r\n')) s = s[:5] + '*'*(i-5) + s[i:] return repr(s) @@ -596,10 +594,7 @@ resp = self.sendcmd('SIZE ' + filename) if resp[:3] == '213': s = resp[3:].strip() - try: - return int(s) - except (OverflowError, ValueError): - return int(s) + return int(s) def mkd(self, dirname): '''Make a directory, return its full pathname.''' @@ -861,11 +856,7 @@ m = _150_re.match(resp) if not m: return None - s = m.group(1) - try: - return int(s) - except (OverflowError, ValueError): - return int(s) + return int(m.group(1)) _227_re = None diff --git a/Lib/optparse.py b/Lib/optparse.py --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -417,11 +417,8 @@ def _parse_int(val): return _parse_num(val, int) -def _parse_long(val): - return _parse_num(val, int) - _builtin_cvt = { "int" : (_parse_int, _("integer")), - "long" : (_parse_long, _("long integer")), + "long" : (_parse_int, _("integer")), "float" : (float, _("floating-point")), "complex" : (complex, _("complex")) } diff --git a/Lib/pickletools.py b/Lib/pickletools.py --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -510,10 +510,7 @@ elif s == b"01": return True - try: - return int(s) - except OverflowError: - return int(s) + return int(s) def read_decimalnl_long(f): r""" diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py --- a/Lib/xdrlib.py +++ b/Lib/xdrlib.py @@ -141,11 +141,7 @@ data = self.__buf[i:j] if len(data) < 4: raise EOFError - x = struct.unpack('>L', data)[0] - try: - return int(x) - except OverflowError: - return x + return struct.unpack('>L', data)[0] def unpack_int(self): i = self.__pos diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -535,15 +535,6 @@ write("") dispatch[type(None)] = dump_nil - def dump_int(self, value, write): - # in case ints are > 32 bits - if value > MAXINT or value < MININT: - raise OverflowError("int exceeds XML-RPC limits") - write("") - write(str(value)) - write("\n") - #dispatch[int] = dump_int - def dump_bool(self, value, write): write("") write(value and "1" or "0") @@ -558,6 +549,9 @@ write("\n") dispatch[int] = dump_long + # backward compatible + dump_int = dump_long + def dump_double(self, value, write): write("") write(repr(value)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:24:33 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 22:24:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Documentation_typo=2E?= Message-ID: http://hg.python.org/cpython/rev/94e275e6450c changeset: 73077:94e275e6450c user: Florent Xicluna date: Sun Oct 23 22:23:57 2011 +0200 summary: Documentation typo. files: Doc/library/ftplib.rst | 2 +- Doc/whatsnew/3.3.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -427,7 +427,7 @@ .. method:: FTP_TLS.ccc() - Revert control channel back to plaintex. This can be useful to take + Revert control channel back to plaintext. This can be useful to take advantage of firewalls that know how to handle NAT with non-secure FTP without opening fixed ports. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -267,7 +267,7 @@ The :class:`~ftplib.FTP_TLS` class now provides a new :func:`~ftplib.FTP_TLS.ccc` function to revert control channel back to -plaintex. This can be useful to take advantage of firewalls that know how to +plaintext. This can be useful to take advantage of firewalls that know how to handle NAT with non-secure FTP without opening fixed ports. (Contributed by Giampaolo Rodol? in :issue:`12139`) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:43:00 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 23 Oct 2011 22:43:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_obsolete_FAQ=2E?= Message-ID: http://hg.python.org/cpython/rev/efd2afd7cf16 changeset: 73078:efd2afd7cf16 user: Ezio Melotti date: Sun Oct 23 23:42:51 2011 +0300 summary: Remove obsolete FAQ. files: Doc/faq/extending.rst | 30 ------------------------------ 1 files changed, 0 insertions(+), 30 deletions(-) diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -447,34 +447,3 @@ The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html) provides a way of doing this from C++ (i.e. you can inherit from an extension class written in C++ using the BPL). - - -When importing module X, why do I get "undefined symbol: PyUnicodeUCS2*"? -------------------------------------------------------------------------- - -You are using a version of Python that uses a 4-byte representation for Unicode -characters, but some C extension module you are importing was compiled using a -Python that uses a 2-byte representation for Unicode characters (the default). - -If instead the name of the undefined symbol starts with ``PyUnicodeUCS4``, the -problem is the reverse: Python was built using 2-byte Unicode characters, and -the extension module was compiled using a Python with 4-byte Unicode characters. - -This can easily occur when using pre-built extension packages. RedHat Linux -7.x, in particular, provided a "python2" binary that is compiled with 4-byte -Unicode. This only causes the link failure if the extension uses any of the -``PyUnicode_*()`` functions. It is also a problem if an extension uses any of -the Unicode-related format specifiers for :c:func:`Py_BuildValue` (or similar) or -parameter specifications for :c:func:`PyArg_ParseTuple`. - -You can check the size of the Unicode character a Python interpreter is using by -checking the value of sys.maxunicode: - - >>> import sys - >>> if sys.maxunicode > 65535: - ... print('UCS4 build') - ... else: - ... print('UCS2 build') - -The only way to solve this problem is to use extension modules compiled with a -Python binary built using the same size for Unicode characters. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:48:10 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 22:48:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_13141=3A_?= =?utf8?q?Demonstrate_recommended_style_for_socketserver_examples=2E?= Message-ID: http://hg.python.org/cpython/rev/d34beaaf7060 changeset: 73079:d34beaaf7060 branch: 3.2 parent: 73069:46c82c4141c9 user: Florent Xicluna date: Sun Oct 23 22:40:37 2011 +0200 summary: Issue 13141: Demonstrate recommended style for socketserver examples. files: Doc/library/socketserver.rst | 64 ++++++++++++----------- Misc/NEWS | 6 ++ 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -348,7 +348,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -372,7 +372,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # Likewise, self.wfile is a file-like object used to write back # to the client @@ -395,16 +395,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n","utf8")) + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(bytes(data + "\n", "utf-8")) - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + finally: + sock.close() - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look something like this: @@ -421,10 +423,10 @@ $ python TCPClient.py hello world with TCP Sent: hello world with TCP - Received: b'HELLO WORLD WITH TCP' + Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice - Received: b'PYTHON IS NICE' + Received: PYTHON IS NICE :class:`socketserver.UDPServer` Example @@ -445,7 +447,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(data) socket.sendto(data.upper(), self.client_address) @@ -467,11 +469,11 @@ # As you can see, there is no connect() call; UDP has no connections. # Instead, data is directly sent to the recipient via sendto(). - sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT)) - received = sock.recv(1024) + sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) + received = str(sock.recv(1024), "utf-8") - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look exactly like for the TCP server example. @@ -491,9 +493,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): - data = self.request.recv(1024) + data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() - response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii') + response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') self.request.send(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): @@ -502,10 +504,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print("Received: %s" % response) - sock.close() + try: + sock.send(bytes(message, 'ascii')) + response = str(sock.recv(1024), 'ascii') + print("Received: {}".format(response)) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -518,13 +522,13 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() print("Server loop running in thread:", server_thread.name) - client(ip, port, b"Hello World 1") - client(ip, port, b"Hello World 2") - client(ip, port, b"Hello World 3") + client(ip, port, "Hello World 1") + client(ip, port, "Hello World 2") + client(ip, port, "Hello World 3") server.shutdown() @@ -533,9 +537,9 @@ $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 - Received: b"Thread-2: b'Hello World 1'" - Received: b"Thread-3: b'Hello World 2'" - Received: b"Thread-4: b'Hello World 3'" + Received: Thread-2: Hello World 1 + Received: Thread-3: Hello World 2 + Received: Thread-4: Hello World 3 The :class:`ForkingMixIn` class is used in the same way, except that the server diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -190,6 +190,12 @@ - Issue #12950: Fix passing file descriptors in multiprocessing, under OpenIndiana/Illumos. +Documentation +------------- + +- Issue #13141: Demonstrate recommended style for socketserver examples. + + What's New in Python 3.2.2? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:48:11 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 22:48:11 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/7f8d22a7bec3 changeset: 73080:7f8d22a7bec3 parent: 73077:94e275e6450c parent: 73079:d34beaaf7060 user: Florent Xicluna date: Sun Oct 23 22:44:19 2011 +0200 summary: Merge 3.2 files: Doc/library/socketserver.rst | 64 ++++++++++++----------- Misc/NEWS | 2 + 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -361,7 +361,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -385,7 +385,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # Likewise, self.wfile is a file-like object used to write back # to the client @@ -408,16 +408,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n","utf8")) + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(bytes(data + "\n", "utf-8")) - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + finally: + sock.close() - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look something like this: @@ -434,10 +436,10 @@ $ python TCPClient.py hello world with TCP Sent: hello world with TCP - Received: b'HELLO WORLD WITH TCP' + Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice - Received: b'PYTHON IS NICE' + Received: PYTHON IS NICE :class:`socketserver.UDPServer` Example @@ -458,7 +460,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(data) socket.sendto(data.upper(), self.client_address) @@ -480,11 +482,11 @@ # As you can see, there is no connect() call; UDP has no connections. # Instead, data is directly sent to the recipient via sendto(). - sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT)) - received = sock.recv(1024) + sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) + received = str(sock.recv(1024), "utf-8") - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look exactly like for the TCP server example. @@ -504,9 +506,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): - data = self.request.recv(1024) + data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() - response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii') + response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') self.request.send(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): @@ -515,10 +517,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print("Received: %s" % response) - sock.close() + try: + sock.send(bytes(message, 'ascii')) + response = str(sock.recv(1024), 'ascii') + print("Received: {}".format(response)) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -531,13 +535,13 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() print("Server loop running in thread:", server_thread.name) - client(ip, port, b"Hello World 1") - client(ip, port, b"Hello World 2") - client(ip, port, b"Hello World 3") + client(ip, port, "Hello World 1") + client(ip, port, "Hello World 2") + client(ip, port, "Hello World 3") server.shutdown() @@ -546,9 +550,9 @@ $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 - Received: b"Thread-2: b'Hello World 1'" - Received: b"Thread-3: b'Hello World 2'" - Received: b"Thread-4: b'Hello World 3'" + Received: Thread-2: Hello World 1 + Received: Thread-3: Hello World 2 + Received: Thread-4: Hello World 3 The :class:`ForkingMixIn` class is used in the same way, except that the server diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1678,6 +1678,8 @@ Documentation ------------- +- Issue #13141: Demonstrate recommended style for socketserver examples. + - Issue #11818: Fix tempfile examples for Python 3. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 22:48:12 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 22:48:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge_heads?= Message-ID: http://hg.python.org/cpython/rev/a4f7815e1691 changeset: 73081:a4f7815e1691 parent: 73078:efd2afd7cf16 parent: 73080:7f8d22a7bec3 user: Florent Xicluna date: Sun Oct 23 22:47:56 2011 +0200 summary: Merge heads files: Doc/library/socketserver.rst | 64 ++++++++++++----------- Misc/NEWS | 2 + 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -361,7 +361,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -385,7 +385,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # Likewise, self.wfile is a file-like object used to write back # to the client @@ -408,16 +408,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n","utf8")) + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(bytes(data + "\n", "utf-8")) - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + finally: + sock.close() - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look something like this: @@ -434,10 +436,10 @@ $ python TCPClient.py hello world with TCP Sent: hello world with TCP - Received: b'HELLO WORLD WITH TCP' + Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice - Received: b'PYTHON IS NICE' + Received: PYTHON IS NICE :class:`socketserver.UDPServer` Example @@ -458,7 +460,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(data) socket.sendto(data.upper(), self.client_address) @@ -480,11 +482,11 @@ # As you can see, there is no connect() call; UDP has no connections. # Instead, data is directly sent to the recipient via sendto(). - sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT)) - received = sock.recv(1024) + sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) + received = str(sock.recv(1024), "utf-8") - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look exactly like for the TCP server example. @@ -504,9 +506,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): - data = self.request.recv(1024) + data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() - response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii') + response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') self.request.send(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): @@ -515,10 +517,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print("Received: %s" % response) - sock.close() + try: + sock.send(bytes(message, 'ascii')) + response = str(sock.recv(1024), 'ascii') + print("Received: {}".format(response)) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -531,13 +535,13 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() print("Server loop running in thread:", server_thread.name) - client(ip, port, b"Hello World 1") - client(ip, port, b"Hello World 2") - client(ip, port, b"Hello World 3") + client(ip, port, "Hello World 1") + client(ip, port, "Hello World 2") + client(ip, port, "Hello World 3") server.shutdown() @@ -546,9 +550,9 @@ $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 - Received: b"Thread-2: b'Hello World 1'" - Received: b"Thread-3: b'Hello World 2'" - Received: b"Thread-4: b'Hello World 3'" + Received: Thread-2: Hello World 1 + Received: Thread-3: Hello World 2 + Received: Thread-4: Hello World 3 The :class:`ForkingMixIn` class is used in the same way, except that the server diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1678,6 +1678,8 @@ Documentation ------------- +- Issue #13141: Demonstrate recommended style for socketserver examples. + - Issue #11818: Fix tempfile examples for Python 3. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:08:20 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 23:08:20 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTQx?= =?utf8?q?=3A_Demonstrate_recommended_style_for_SocketServer_examples=2E?= Message-ID: http://hg.python.org/cpython/rev/8de472fb8cfe changeset: 73082:8de472fb8cfe branch: 2.7 parent: 73073:5c4781a237ef user: Florent Xicluna date: Sun Oct 23 23:07:22 2011 +0200 summary: Issue #13141: Demonstrate recommended style for SocketServer examples. files: Doc/library/socketserver.rst | 48 +++++++++++++---------- Misc/NEWS | 5 ++ 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -225,6 +225,7 @@ desired. If :meth:`handle_request` receives no incoming requests within the timeout period, the :meth:`handle_timeout` method is called. + There are various server methods that can be overridden by subclasses of base server classes like :class:`TCPServer`; these methods aren't useful to external users of the server object. @@ -355,7 +356,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -379,7 +380,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # Likewise, self.wfile is a file-like object used to write back # to the client @@ -402,16 +403,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(data + "\n") + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(data + "\n") - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = sock.recv(1024) + finally: + sock.close() - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look something like this: @@ -452,7 +455,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print data socket.sendto(data.upper(), self.client_address) @@ -477,8 +480,8 @@ sock.sendto(data + "\n", (HOST, PORT)) received = sock.recv(1024) - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look exactly like for the TCP server example. @@ -499,8 +502,8 @@ def handle(self): data = self.request.recv(1024) - cur_thread = threading.currentThread() - response = "%s: %s" % (cur_thread.getName(), data) + cur_thread = threading.current_thread() + response = "{}: {}".format(cur_thread.name, data) self.request.send(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): @@ -509,10 +512,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print "Received: %s" % response - sock.close() + try: + sock.send(message) + response = sock.recv(1024) + print "Received: {}".format(response) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -525,9 +530,9 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() - print "Server loop running in thread:", server_thread.getName() + print "Server loop running in thread:", server_thread.name client(ip, port, "Hello World 1") client(ip, port, "Hello World 2") @@ -535,6 +540,7 @@ server.shutdown() + The output of the example should look something like this:: $ python ThreadedTCPServer.py diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -342,6 +342,11 @@ - Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2, iso2022_kr). +Documentation +------------- + +- Issue #13141: Demonstrate recommended style for SocketServer examples. + What's New in Python 2.7.2? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:38:07 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 23 Oct 2011 23:38:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_documentation_formattin?= =?utf8?q?g=2E?= Message-ID: http://hg.python.org/cpython/rev/87360bead0ed changeset: 73083:87360bead0ed parent: 73081:a4f7815e1691 user: Florent Xicluna date: Sun Oct 23 23:37:46 2011 +0200 summary: Fix documentation formatting. files: Doc/whatsnew/3.3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -180,7 +180,7 @@ * Stub Added support for Unicode name aliases and named sequences. -Both :func:`unicodedata.lookup()` and '\N{...}' now resolve name aliases, +Both :func:`unicodedata.lookup()` and ``\N{...}`` now resolve name aliases, and :func:`unicodedata.lookup()` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:44:09 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 23 Oct 2011 23:44:09 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbjogVXNlIGBgLi4uYGAgZm9yIHN0?= =?utf8?q?ring_literals=2E?= Message-ID: http://hg.python.org/cpython/rev/68e140d6d8b9 changeset: 73084:68e140d6d8b9 user: Ezio Melotti date: Mon Oct 24 00:44:03 2011 +0300 summary: Use ``...`` for string literals. files: Doc/whatsnew/3.3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -180,7 +180,7 @@ * Stub Added support for Unicode name aliases and named sequences. -Both :func:`unicodedata.lookup()` and ``\N{...}`` now resolve name aliases, +Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases, and :func:`unicodedata.lookup()` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:54:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 23 Oct 2011 23:54:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_InterruptedError_instea?= =?utf8?q?d_of_checking_for_EINTR?= Message-ID: http://hg.python.org/cpython/rev/90f81045613a changeset: 73085:90f81045613a parent: 73083:87360bead0ed user: Antoine Pitrou date: Sun Oct 23 23:49:42 2011 +0200 summary: Use InterruptedError instead of checking for EINTR files: Lib/_pyio.py | 17 ++++------------- Lib/asyncore.py | 13 ++++--------- Lib/multiprocessing/util.py | 9 +++------ Lib/socket.py | 8 +++----- Lib/subprocess.py | 6 ++---- Lib/test/test_socket.py | 2 +- 6 files changed, 17 insertions(+), 38 deletions(-) diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -14,7 +14,6 @@ import io from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) -from errno import EINTR # open() uses st_blksize whenever we can DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes @@ -948,9 +947,7 @@ # Read until EOF or until read() would block. try: chunk = self.raw.read() - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if chunk in empty_values: nodata_val = chunk @@ -972,9 +969,7 @@ while avail < n: try: chunk = self.raw.read(wanted) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if chunk in empty_values: nodata_val = chunk @@ -1007,9 +1002,7 @@ while True: try: current = self.raw.read(to_read) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue break if current: @@ -1120,9 +1113,7 @@ while self._write_buf: try: n = self.raw.write(self._write_buf) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if n > len(self._write_buf) or n < 0: raise IOError("write() returned incorrect number of bytes") diff --git a/Lib/asyncore.py b/Lib/asyncore.py --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -54,7 +54,7 @@ import os from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \ - ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ + ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ errorcode _DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, @@ -143,11 +143,8 @@ try: r, w, e = select.select(r, w, e, timeout) - except select.error as err: - if err.args[0] != EINTR: - raise - else: - return + except InterruptedError: + return for fd in r: obj = map.get(fd) @@ -190,9 +187,7 @@ pollster.register(fd, flags) try: r = pollster.poll(timeout) - except select.error as err: - if err.args[0] != EINTR: - raise + except InterruptedError: r = [] for fd, flags in r: obj = map.get(fd) diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -327,15 +327,12 @@ # Automatic retry after EINTR # -def _eintr_retry(func, _errors=(EnvironmentError, select.error)): +def _eintr_retry(func): @functools.wraps(func) def wrapped(*args, **kwargs): while True: try: return func(*args, **kwargs) - except _errors as e: - # select.error has no `errno` attribute - if e.args[0] == errno.EINTR: - continue - raise + except InterruptedError: + continue return wrapped diff --git a/Lib/socket.py b/Lib/socket.py --- a/Lib/socket.py +++ b/Lib/socket.py @@ -53,7 +53,6 @@ except ImportError: errno = None EBADF = getattr(errno, 'EBADF', 9) -EINTR = getattr(errno, 'EINTR', 4) EAGAIN = getattr(errno, 'EAGAIN', 11) EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) @@ -280,11 +279,10 @@ except timeout: self._timeout_occurred = True raise + except InterruptedError: + continue except error as e: - n = e.args[0] - if n == EINTR: - continue - if n in _blocking_errnos: + if e.args[0] in _blocking_errnos: return None raise diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -450,10 +450,8 @@ while True: try: return func(*args) - except (OSError, IOError) as e: - if e.errno == errno.EINTR: - continue - raise + except InterruptedError: + continue def call(*popenargs, timeout=None, **kwargs): diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -3584,7 +3584,7 @@ @staticmethod def _raise_eintr(): - raise socket.error(errno.EINTR) + raise socket.error(errno.EINTR, "interrupted") def _textiowrap_mock_socket(self, mock, buffering=-1): raw = socket.SocketIO(mock, "r") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:54:39 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 23 Oct 2011 23:54:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/a30f10482713 changeset: 73086:a30f10482713 parent: 73085:90f81045613a parent: 73084:68e140d6d8b9 user: Antoine Pitrou date: Sun Oct 23 23:50:21 2011 +0200 summary: Merge files: Doc/whatsnew/3.3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -180,7 +180,7 @@ * Stub Added support for Unicode name aliases and named sequences. -Both :func:`unicodedata.lookup()` and ``\N{...}`` now resolve name aliases, +Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases, and :func:`unicodedata.lookup()` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 23 23:56:25 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 23 Oct 2011 23:56:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Mention_InterruptedError_in?= =?utf8?q?_the_doc_for_new_function_signal=2Esigwaitinfo?= Message-ID: http://hg.python.org/cpython/rev/cf18935f8b98 changeset: 73087:cf18935f8b98 user: Antoine Pitrou date: Sun Oct 23 23:52:23 2011 +0200 summary: Mention InterruptedError in the doc for new function signal.sigwaitinfo files: Doc/library/signal.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -353,8 +353,8 @@ signals in *sigset* is already pending for the calling thread, the function will return immediately with information about that signal. The signal handler is not called for the delivered signal. The function raises an - :exc:`OSError` with error number set to :const:`errno.EINTR` if it is - interrupted by a signal that is not in *sigset*. + :exc:`InterruptedError` if it is interrupted by a signal that is not in + *sigset*. The return value is an object representing the data contained in the :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 00:11:04 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 24 Oct 2011 00:11:04 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_description_of_PEP_?= =?utf8?q?3151?= Message-ID: http://hg.python.org/cpython/rev/06836351466a changeset: 73088:06836351466a user: Antoine Pitrou date: Mon Oct 24 00:07:02 2011 +0200 summary: Improve description of PEP 3151 files: Doc/whatsnew/3.3.rst | 59 +++++++++++++++++-------------- 1 files changed, 32 insertions(+), 27 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -113,40 +113,44 @@ ===================================================== :pep:`3151` - Reworking the OS and IO exception hierarchy -PEP written and implemented by Antoine Pitrou. + PEP written and implemented by Antoine Pitrou. -New subclasses of :exc:`OSError` exceptions: +The hierarchy of exceptions raised by operating system errors is now both +simplified and finer-grained. - * :exc:`BlockingIOError` - * :exc:`ChildProcessError` - * :exc:`ConnectionError` +You don't have to worry anymore about choosing the appropriate exception +type between :exc:`OSError`, :exc:`IOError`, :exc:`EnvironmentError`, +:exc:`WindowsError`, :exc:`mmap.error`, :exc:`socket.error` or +:exc:`select.error`. All these exception types are now only one: +:exc:`OSError`. The other names are kept as aliases for compatibility +reasons. - * :exc:`BrokenPipeError` - * :exc:`ConnectionAbortedError` - * :exc:`ConnectionRefusedError` - * :exc:`ConnectionResetError` +Also, it is now easier to catch a specific error condition. Instead of +inspecting the ``errno`` attribute (or ``args[0]``) for a particular +constant from the :mod:`errno` module, you can catch the adequate +:exc:`OSError` subclass. The available subclasses are the following: - * :exc:`FileExistsError` - * :exc:`FileNotFoundError` - * :exc:`InterruptedError` - * :exc:`IsADirectoryError` - * :exc:`NotADirectoryError` - * :exc:`PermissionError` - * :exc:`ProcessLookupError` - * :exc:`TimeoutError` +* :exc:`BlockingIOError` +* :exc:`ChildProcessError` +* :exc:`ConnectionError` +* :exc:`FileExistsError` +* :exc:`FileNotFoundError` +* :exc:`InterruptedError` +* :exc:`IsADirectoryError` +* :exc:`NotADirectoryError` +* :exc:`PermissionError` +* :exc:`ProcessLookupError` +* :exc:`TimeoutError` -The following exceptions have been merged into :exc:`OSError`: +And the :exc:`ConnectionError` itself has finer-grained subclasses: - * :exc:`EnvironmentError` - * :exc:`IOError` - * :exc:`WindowsError` - * :exc:`VMSError` - * :exc:`socket.error` - * :exc:`select.error` - * :exc:`mmap.error` +* :exc:`BrokenPipeError` +* :exc:`ConnectionAbortedError` +* :exc:`ConnectionRefusedError` +* :exc:`ConnectionResetError` Thanks to the new exceptions, common usages of the :mod:`errno` can now be -avoided. For example, the following code written for Python 3.2: :: +avoided. For example, the following code written for Python 3.2:: from errno import ENOENT, EACCES, EPERM @@ -161,7 +165,8 @@ else: raise -can now be written without the :mod:`errno` import: :: +can now be written without the :mod:`errno` import and without manual +inspection of exception attributes:: try: with open("document.txt") as f: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 00:18:45 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 24 Oct 2011 00:18:45 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_/_clean_up_the_PEP_?= =?utf8?q?393_description?= Message-ID: http://hg.python.org/cpython/rev/5880584cafe6 changeset: 73089:5880584cafe6 user: Antoine Pitrou date: Mon Oct 24 00:14:43 2011 +0200 summary: Improve / clean up the PEP 393 description files: Doc/whatsnew/3.3.rst | 36 +++++++++++++++++-------------- 1 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -52,25 +52,27 @@ PEP 393: Flexible String Representation ======================================= -[Abstract copied from the PEP: The Unicode string type is changed to support -multiple internal representations, depending on the character with the largest -Unicode ordinal (1, 2, or 4 bytes). This allows a space-efficient -representation in common cases, but gives access to full UCS-4 on all systems. -For compatibility with existing APIs, several representations may exist in -parallel; over time, this compatibility should be phased out.] +The Unicode string type is changed to support multiple internal +representations, depending on the character with the largest Unicode ordinal +(1, 2, or 4 bytes) in the represented string. This allows a space-efficient +representation in common cases, but gives access to full UCS-4 on all +systems. For compatibility with existing APIs, several representations may +exist in parallel; over time, this compatibility should be phased out. -PEP 393 is fully backward compatible. The legacy API should remain -available at least five years. Applications using the legacy API will not -fully benefit of the memory reduction, or worse may use a little bit more -memory, because Python may have to maintain two versions of each string (in -the legacy format and in the new efficient storage). +On the Python side, there should be no downside to this change. -XXX Add list of changes introduced by :pep:`393` here: +On the C API side, PEP 393 is fully backward compatible. The legacy API +should remain available at least five years. Applications using the legacy +API will not fully benefit of the memory reduction, or - worse - may use +a bit more memory, because Python may have to maintain two versions of each +string (in the legacy format and in the new efficient storage). + +Changes introduced by :pep:`393` are the following: * Python now always supports the full range of Unicode codepoints, including non-BMP ones (i.e. from ``U+0000`` to ``U+10FFFF``). The distinction between narrow and wide builds no longer exists and Python now behaves like a wide - build. + build, even under Windows. * The storage of Unicode strings now depends on the highest codepoint in the string: @@ -86,7 +88,8 @@ XXX The result should be moved in the PEP and a small summary about performances and a link to the PEP should be added here. -* Some of the problems visible on narrow builds have been fixed, for example: +* With the death of narrow builds, the problems specific to narrow builds have + also been fixed, for example: * :func:`len` now always returns 1 for non-BMP characters, so ``len('\U0010FFFF') == 1``; @@ -94,10 +97,11 @@ * surrogate pairs are not recombined in string literals, so ``'\uDBFF\uDFFF' != '\U0010FFFF'``; - * indexing or slicing a non-BMP characters doesn't return surrogates anymore, + * indexing or slicing non-BMP characters returns the expected value, so ``'\U0010FFFF'[0]`` now returns ``'\U0010FFFF'`` and not ``'\uDBFF'``; - * several other functions in the stdlib now handle correctly non-BMP codepoints. + * several other functions in the standard library now handle correctly + non-BMP codepoints. * The value of :data:`sys.maxunicode` is now always ``1114111`` (``0x10FFFF`` in hexadecimal). The :c:func:`PyUnicode_GetMax` function still returns -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 00:29:43 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 24 Oct 2011 00:29:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_the_porting_section?= Message-ID: http://hg.python.org/cpython/rev/4eb65a7f2fbe changeset: 73090:4eb65a7f2fbe user: Antoine Pitrou date: Mon Oct 24 00:25:41 2011 +0200 summary: Improve the porting section files: Doc/whatsnew/3.3.rst | 30 ++++++++++++++++++++++++------ 1 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -49,6 +49,8 @@ This article explains the new features in Python 3.3, compared to 3.2. +.. _pep-393: + PEP 393: Flexible String Representation ======================================= @@ -540,7 +542,10 @@ ===================== This section lists previously described changes and other bugfixes -that may require changes to your code: +that may require changes to your code. + +Porting Python code +------------------- * Issue #12326: On Linux, sys.platform doesn't contain the major version anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending @@ -548,6 +553,24 @@ with sys.platform.startswith('linux'), or directly sys.platform == 'linux' if you don't need to support older Python versions. +Porting C code +-------------- + +* Due to :ref:`PEP 393 `, the :c:type:`Py_UNICODE` type and all + functions using this type are deprecated (but will stay available for + at least five years). If you were using low-level Unicode APIs to + construct and access unicode objects and you want to benefit of the + memory footprint reduction provided by the PEP 393, you have to convert + your code to the new :doc:`Unicode API <../c-api/unicode>`. + + However, if you only have been using high-level functions such as + :c:func:`PyUnicode_Concat()`, :c:func:`PyUnicode_Join` or + :c:func:`PyUnicode_FromFormat()`, your code will automatically take + advantage of the new unicode representations. + +Other issues +------------ + .. Issue #11591: When :program:`python` was started with :option:`-S`, ``import site`` will not add site-specific paths to the module search paths. In previous versions, it did. See changeset for doc changes in @@ -557,8 +580,3 @@ removed. Code checking sys.flags.division_warning will need updating. Contributed by ?ric Araujo. -* :pep:`393`: The :c:type:`Py_UNICODE` type and all functions using this type - are deprecated. To fully benefit of the memory footprint reduction provided - by the PEP 393, you have to convert your code to the new Unicode API. Read - the porting guide: XXX. - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 01:30:38 2011 From: python-checkins at python.org (ezio.melotti) Date: Mon, 24 Oct 2011 01:30:38 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_=2313228=3A_add_a_=22Quick?= =?utf8?q?_Start=22_section_to_the_index_page=2E?= Message-ID: http://hg.python.org/devguide/rev/25f1c003ea01 changeset: 459:25f1c003ea01 user: Ezio Melotti date: Mon Oct 24 02:30:33 2011 +0300 summary: #13228: add a "Quick Start" section to the index page. files: index.rst | 25 +++++++++++++++++++++++-- setup.rst | 6 ++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/index.rst b/index.rst --- a/index.rst +++ b/index.rst @@ -34,13 +34,33 @@ faq +Quick Start +----------- + +Here is a list of the basic step necessary to get set up and make a patch: + +1. get :ref:`a clone of CPython ` with + ``hg clone http://hg.python.org/cpython``; +2. On UNIX, run ``./configure --with-pydebug && make -j2`` to + :ref:`build Python `. + + On :ref:`Windows `, load the project file + :file:`PCbuild\\pcbuild.sln` in Visual Studio, select :menuselection:`Debug`, + and :menuselection:`Build -> Build Solution`; +3. :doc:`run the tests ` with ``./python -m test -j3`` + (use :file:`./python.exe` on :ref:`most ` Mac OS X systems and + :file:`PCbuild\\python_d.exe` on Windows); +4. make the :doc:`patch `; +5. submit it to the `issue tracker`_. + + Quick Links ----------- Here are some links that you may find you reference frequently while contributing to Python. -* `Issue tracker `_ +* `Issue tracker`_ * `Buildbot status`_ * :doc:`faq` * PEPs_ (Python Enhancement Proposals) @@ -138,7 +158,7 @@ * Coding style guides * :PEP:`7` (Style Guide for C Code) * :PEP:`8` (Style Guide for Python Code) -* `Issue tracker `_ +* `Issue tracker`_ * `Meta tracker `_ (issue tracker for the issue tracker) * :doc:`experts` @@ -171,6 +191,7 @@ .. _Jython: http://www.jython.org/ .. _IronPython: http://ironpython.net/ .. _Stackless: http://www.stackless.com/ +.. _Issue tracker: http://bugs.python.org/ Indices and tables diff --git a/setup.rst b/setup.rst --- a/setup.rst +++ b/setup.rst @@ -55,6 +55,8 @@ affected files as described below.) +.. _compiling: + Compiling (for debugging) ------------------------- @@ -122,6 +124,8 @@ Otherwise the build failed and thus should be fixed (at least with a bug being filed on the `issue tracker`_). +.. _python.exe: + Once CPython is done building you will then have a working build that can be run in-place; ``./python`` on most machines (and what is used in all examples), ``./python.exe`` wherever a case-insensitive filesystem is used @@ -148,6 +152,8 @@ still build properly). +.. _windows-compiling: + Windows ''''''' -- Repository URL: http://hg.python.org/devguide From solipsis at pitrou.net Mon Oct 24 05:32:37 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 24 Oct 2011 05:32:37 +0200 Subject: [Python-checkins] Daily reference leaks (4eb65a7f2fbe): sum=0 Message-ID: results for 4eb65a7f2fbe on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogMDORBv', '-x'] From python-checkins at python.org Mon Oct 24 11:32:03 2011 From: python-checkins at python.org (mark.dickinson) Date: Mon, 24 Oct 2011 11:32:03 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313248=2C_issue_=23?= =?utf8?q?8540=3A_Remove_deprecated_Context=2E=5Fclamp_attribute_from?= Message-ID: http://hg.python.org/cpython/rev/221638ba5d2a changeset: 73091:221638ba5d2a user: Mark Dickinson date: Mon Oct 24 10:31:52 2011 +0100 summary: Issue #13248, issue #8540: Remove deprecated Context._clamp attribute from Decimal module. files: Lib/decimal.py | 22 ---------------------- Lib/test/test_decimal.py | 15 +++------------ Misc/NEWS | 2 ++ 3 files changed, 5 insertions(+), 34 deletions(-) diff --git a/Lib/decimal.py b/Lib/decimal.py --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -3903,28 +3903,6 @@ return nc __copy__ = copy - # _clamp is provided for backwards compatibility with third-party - # code. May be removed in Python >= 3.3. - def _get_clamp(self): - "_clamp mirrors the clamp attribute. Its use is deprecated." - import warnings - warnings.warn('Use of the _clamp attribute is deprecated. ' - 'Please use clamp instead.', - DeprecationWarning) - return self.clamp - - def _set_clamp(self, clamp): - "_clamp mirrors the clamp attribute. Its use is deprecated." - import warnings - warnings.warn('Use of the _clamp attribute is deprecated. ' - 'Please use clamp instead.', - DeprecationWarning) - self.clamp = clamp - - # don't bother with _del_clamp; no sane 3rd party code should - # be deleting the _clamp attribute - _clamp = property(_get_clamp, _set_clamp) - def _raise_error(self, condition, explanation = None, *args): """Handles an error diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -1834,18 +1834,9 @@ # only, the attribute should be gettable/settable via both # `clamp` and `_clamp`; in Python 3.3, `_clamp` should be # removed. - c = Context(clamp = 0) - self.assertEqual(c.clamp, 0) - - with check_warnings(("", DeprecationWarning)): - c._clamp = 1 - self.assertEqual(c.clamp, 1) - with check_warnings(("", DeprecationWarning)): - self.assertEqual(c._clamp, 1) - c.clamp = 0 - self.assertEqual(c.clamp, 0) - with check_warnings(("", DeprecationWarning)): - self.assertEqual(c._clamp, 0) + c = Context() + with self.assertRaises(AttributeError): + clamp_value = c._clamp def test_abs(self): c = Context() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -338,6 +338,8 @@ Library ------- +- Issue #8540: Remove deprecated Context._clamp attribute in Decimal module. + - Issue #13235: Added PendingDeprecationWarning to warn() method and function. - Issue #9168: now smtpd is able to bind privileged port. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 13:00:44 2011 From: python-checkins at python.org (ezio.melotti) Date: Mon, 24 Oct 2011 13:00:44 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_a_typo_and_update_a_senten?= =?utf8?b?Y2Uu?= Message-ID: http://hg.python.org/peps/rev/4aef75892059 changeset: 3970:4aef75892059 user: Ezio Melotti date: Mon Oct 24 14:00:39 2011 +0300 summary: Fix a typo and update a sentence. files: pep-0387.txt | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pep-0387.txt b/pep-0387.txt --- a/pep-0387.txt +++ b/pep-0387.txt @@ -87,15 +87,14 @@ PEP or similar document may be written. Hopefully users of the affected API will pipe up to comment. -2. Add a warning [#warnings]_. If behavior is changing, a the API may gain a +2. Add a warning [#warnings]_. If behavior is changing, the API may gain a new function or method to perform the new behavior; old usage should raise the warning. If an API is being removed, simply warn whenever it is entered. DeprecationWarning is the usual warning category to use, but PendingDeprecationWarning may be used in special cases were the old and new versions of the API will coexist for many releases. -3. Wait for a release of whichever tree (trunk or py3k) contains the - warning. +3. Wait for a release of whichever branch contains the warning. 4. See if there's any feedback. Users not involved in the original discussions may comment now after seeing the warning. Perhaps reconsider. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Oct 24 13:17:53 2011 From: python-checkins at python.org (florent.xicluna) Date: Mon, 24 Oct 2011 13:17:53 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMjU1?= =?utf8?q?=3A_wrong_docstrings_in_array_module=2E?= Message-ID: http://hg.python.org/cpython/rev/451fa5782145 changeset: 73092:451fa5782145 branch: 3.2 parent: 73079:d34beaaf7060 user: Florent Xicluna date: Mon Oct 24 13:14:55 2011 +0200 summary: Issue #13255: wrong docstrings in array module. files: Misc/NEWS | 2 ++ Modules/arraymodule.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -58,6 +58,8 @@ Library ------- +- Issue #13255: wrong docstrings in array module. + - Issue #9168: now smtpd is able to bind privileged port. - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1484,7 +1484,7 @@ \n\ Extends this array with data from the unicode string ustr.\n\ The array must be a unicode type array; otherwise a ValueError\n\ -is raised. Use array.frombytes(ustr.decode(...)) to\n\ +is raised. Use array.frombytes(ustr.encode(...)) to\n\ append Unicode data to an array of some other type."); @@ -1506,7 +1506,7 @@ \n\ Convert the array to a unicode string. The array must be\n\ a unicode type array; otherwise a ValueError is raised. Use\n\ -array.tostring().decode() to obtain a unicode string from\n\ +array.tobytes().decode() to obtain a unicode string from\n\ an array of some other type."); @@ -2557,7 +2557,7 @@ extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ -fromstring() -- append items from the string\n\ +frombytes() -- append items from the string\n\ index() -- return index of first occurrence of an object\n\ insert() -- insert a new item into the array at a provided position\n\ pop() -- remove and return item (default last)\n\ @@ -2565,7 +2565,7 @@ reverse() -- reverse the order of the items in the array\n\ tofile() -- write all items to a file object\n\ tolist() -- return the array converted to an ordinary list\n\ -tostring() -- return the array converted to a string\n\ +tobytes() -- return the array converted to a string\n\ \n\ Attributes:\n\ \n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 13:17:54 2011 From: python-checkins at python.org (florent.xicluna) Date: Mon, 24 Oct 2011 13:17:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?b?OiBNZXJnZSAzLjIu?= Message-ID: http://hg.python.org/cpython/rev/b82e68cf3b0d changeset: 73093:b82e68cf3b0d parent: 73091:221638ba5d2a parent: 73092:451fa5782145 user: Florent Xicluna date: Mon Oct 24 13:17:27 2011 +0200 summary: Merge 3.2. files: Misc/NEWS | 2 ++ Modules/arraymodule.c | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -338,6 +338,8 @@ Library ------- +- Issue #13255: wrong docstrings in array module. + - Issue #8540: Remove deprecated Context._clamp attribute in Decimal module. - Issue #13235: Added PendingDeprecationWarning to warn() method and function. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1550,7 +1550,7 @@ \n\ Extends this array with data from the unicode string ustr.\n\ The array must be a unicode type array; otherwise a ValueError\n\ -is raised. Use array.frombytes(ustr.decode(...)) to\n\ +is raised. Use array.frombytes(ustr.encode(...)) to\n\ append Unicode data to an array of some other type."); @@ -1572,7 +1572,7 @@ \n\ Convert the array to a unicode string. The array must be\n\ a unicode type array; otherwise a ValueError is raised. Use\n\ -array.tostring().decode() to obtain a unicode string from\n\ +array.tobytes().decode() to obtain a unicode string from\n\ an array of some other type."); @@ -2636,7 +2636,7 @@ extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ -fromstring() -- append items from the string\n\ +frombytes() -- append items from the string\n\ index() -- return index of first occurrence of an object\n\ insert() -- insert a new item into the array at a provided position\n\ pop() -- remove and return item (default last)\n\ @@ -2644,7 +2644,7 @@ reverse() -- reverse the order of the items in the array\n\ tofile() -- write all items to a file object\n\ tolist() -- return the array converted to an ordinary list\n\ -tostring() -- return the array converted to a string\n\ +tobytes() -- return the array converted to a string\n\ \n\ Attributes:\n\ \n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 14:23:13 2011 From: python-checkins at python.org (nick.coghlan) Date: Mon, 24 Oct 2011 14:23:13 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMjM3?= =?utf8?q?=3A_Rearrange_subprocess_module_documentation_to_emphasise_the?= Message-ID: http://hg.python.org/cpython/rev/2184df0e0f89 changeset: 73094:2184df0e0f89 branch: 2.7 parent: 73082:8de472fb8cfe user: Nick Coghlan date: Mon Oct 24 22:19:40 2011 +1000 summary: Issue #13237: Rearrange subprocess module documentation to emphasise the convenience functions and commonly needed arguments files: Doc/library/subprocess.rst | 255 +++++++++++++++--------- Misc/NEWS | 3 + 2 files changed, 163 insertions(+), 95 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -31,7 +31,142 @@ Using the subprocess Module --------------------------- -This module defines one class called :class:`Popen`: +The recommended interface to this module is to use the following convenience +functions for all use cases they can handle. For more advanced use cases, the +underlying :class:`Popen` interface can be used directly. + + +.. function:: call(args, *, stdin=None, stdout=None, stderr=None) + + Run the command described by *args*. Wait for command to complete, then + return the :attr:`returncode` attribute. + + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments`. The full function signature is the + same as that of the :class:`Popen` constructor - the convenience functions + pass all supplied arguments directly through to that interface. + + Examples:: + + >>> subprocess.call(["ls", "-l"]) + 0 + + >>> subprocess.call(["python", "-c", "import sys; sys.exit(1)"]) + 1 + + .. warning:: + + Like :meth:`Popen.wait`, this will deadlock when using + ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process + generates enough output to a pipe such that it blocks waiting + for the OS pipe buffer to accept more data. + + +.. function:: check_call(*callargs, **kwargs) + + Run command with arguments. Wait for command to complete. If the return + code was zero then return, otherwise raise :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute. + + The arguments are the same as for :func:`call`. Examples:: + + >>> subprocess.check_call(["ls", "-l"]) + 0 + + >>> subprocess.check_call(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + .. versionadded:: 2.5 + + .. warning:: + + See the warning for :func:`call`. + + +.. function:: check_output(*callargs, **kwargs) + + Run command with arguments and return its output as a byte string. + + If the return code was non-zero it raises a :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute and any output in the :attr:`output` + attribute. + + Examples:: + + >>> subprocess.check_output(["ls", "-l", "/dev/null"]) + 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' + + >>> subprocess.check_output(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + The arguments are the same as for :func:`call`, except that *stdout* is + not allowed as it is used internally. To also capture standard error in + the result, use ``stderr=subprocess.STDOUT``:: + + >>> subprocess.check_output( + ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], + ... stderr=subprocess.STDOUT) + 'ls: non_existent_file: No such file or directory\n' + + .. versionadded:: 2.7 + + +.. data:: PIPE + + Special value that can be used as the *stdin*, *stdout* or *stderr* argument + to :class:`Popen` and indicates that a pipe to the standard stream should be + opened. + + +.. data:: STDOUT + + Special value that can be used as the *stderr* argument to :class:`Popen` and + indicates that standard error should go into the same handle as standard + output. + + +.. _frequently-used-arguments: + +Frequently Used Arguments +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To support a wide variety of use cases, the :class:`Popen` constructor (and +the convenience functions) accept a large number of optional arguments. For +most typical use cases, many of these arguments can be safely left at their +default values. The arguments that are most commonly needed are: + + *args* should be a string, or a sequence of program arguments. Providing + a sequence of arguments is generally preferred, as it allows the module to + take care of any required escaping and quoting of arguments (e.g. to permit + spaces in file names) + + *stdin*, *stdout* and *stderr* specify the executed program's standard input, + standard output and standard error file handles, respectively. Valid values + are :data:`PIPE`, an existing file descriptor (a positive integer), an + existing file object, and ``None``. :data:`PIPE` indicates that a new pipe + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. + +These options, along with all of the other options, are described in more +detail in the :class:`Popen` constructor documentation. + + +Popen Constuctor +^^^^^^^^^^^^^^^^ + +The underlying process creation and management in this module is handled by +the :class:`Popen` class. It offers a lot of flexibility so that developers +are able to handle the less common cases not covered by the convenience +functions. .. class:: Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) @@ -126,14 +261,15 @@ You don't need ``shell=True`` to run a batch file, nor to run a console-based executable. - *stdin*, *stdout* and *stderr* specify the executed programs' standard input, + *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, an existing file descriptor (a positive integer), an existing file object, and ``None``. :data:`PIPE` indicates that a new pipe - to the child should be created. With ``None``, no redirection will occur; - the child's file handles will be inherited from the parent. Additionally, - *stderr* can be :data:`STDOUT`, which indicates that the stderr data from the - applications should be captured into the same file handle as for stdout. + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. If *preexec_fn* is set to a callable object, this object will be called in the child process just before the child is executed. (Unix only) @@ -184,87 +320,6 @@ :data:`CREATE_NEW_PROCESS_GROUP`. (Windows only) -.. data:: PIPE - - Special value that can be used as the *stdin*, *stdout* or *stderr* argument - to :class:`Popen` and indicates that a pipe to the standard stream should be - opened. - - -.. data:: STDOUT - - Special value that can be used as the *stderr* argument to :class:`Popen` and - indicates that standard error should go into the same handle as standard - output. - - -Convenience Functions -^^^^^^^^^^^^^^^^^^^^^ - -This module also defines the following shortcut functions: - - -.. function:: call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete, then return the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> retcode = subprocess.call(["ls", "-l"]) - - .. warning:: - - Like :meth:`Popen.wait`, this will deadlock when using - ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process - generates enough output to a pipe such that it blocks waiting - for the OS pipe buffer to accept more data. - - -.. function:: check_call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete. If the exit code was - zero then return, otherwise raise :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_call(["ls", "-l"]) - 0 - - .. versionadded:: 2.5 - - .. warning:: - - See the warning for :func:`call`. - - -.. function:: check_output(*popenargs, **kwargs) - - Run command with arguments and return its output as a byte string. - - If the exit code was non-zero it raises a :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` - attribute and output in the :attr:`output` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_output(["ls", "-l", "/dev/null"]) - 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' - - The stdout argument is not allowed as it is used internally. - To capture standard error in the result, use ``stderr=subprocess.STDOUT``:: - - >>> subprocess.check_output( - ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], - ... stderr=subprocess.STDOUT) - 'ls: non_existent_file: No such file or directory\n' - - .. versionadded:: 2.7 - - Exceptions ^^^^^^^^^^ @@ -523,12 +578,15 @@ Replacing Older Functions with the subprocess Module ---------------------------------------------------- -In this section, "a ==> b" means that b can be used as a replacement for a. +In this section, "a becomes b" means that b can be used as a replacement for a. .. note:: All functions in this section fail (more or less) silently if the executed - program cannot be found; this module raises an :exc:`OSError` exception. + program cannot be found; this module raises an :exc:`OSError` exception. In + addition, the replacements using :func:`check_output` will fail with a + :exc:`CalledProcessError` if the requested operation produces a non-zero + return code. In the following examples, we assume that the subprocess module is imported with "from subprocess import \*". @@ -540,8 +598,8 @@ :: output=`mycmd myarg` - ==> - output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] + # becomes + output = check_output(["mycmd", "myarg"]) Replacing shell pipeline @@ -550,7 +608,7 @@ :: output=`dmesg | grep hda` - ==> + # becomes p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. @@ -559,15 +617,22 @@ The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1. +Alternatively, for trusted input, the shell's pipeline may still be used +directly: + + output=`dmesg | grep hda` + # becomes + output=check_output("dmesg | grep hda", shell=True) + + Replacing :func:`os.system` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sts = os.system("mycmd" + " myarg") - ==> - p = Popen("mycmd" + " myarg", shell=True) - sts = os.waitpid(p.pid, 0)[1] + # becomes + sts = call("mycmd" + " myarg", shell=True) Notes: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -345,6 +345,9 @@ Documentation ------------- +- Issue #13237: Reorganise subprocess documentation to emphasise convenience + functions and the most commonly needed arguments to Popen. + - Issue #13141: Demonstrate recommended style for SocketServer examples. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 14:52:35 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 24 Oct 2011 14:52:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_note_callable_i?= =?utf8?q?s_back_in_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/9b6100b3b746 changeset: 73095:9b6100b3b746 branch: 2.7 parent: 73060:0b39f2486314 user: Benjamin Peterson date: Mon Oct 24 08:51:15 2011 -0400 summary: note callable is back in 3.2 files: Doc/library/2to3.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 14:52:36 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 24 Oct 2011 14:52:36 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/ad49a384adae changeset: 73096:ad49a384adae branch: 2.7 parent: 73095:9b6100b3b746 parent: 73094:2184df0e0f89 user: Benjamin Peterson date: Mon Oct 24 08:51:46 2011 -0400 summary: merge heads files: Doc/library/socketserver.rst | 48 ++- Doc/library/subprocess.rst | 255 ++++++++++++++-------- Misc/NEWS | 8 + 3 files changed, 195 insertions(+), 116 deletions(-) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -225,6 +225,7 @@ desired. If :meth:`handle_request` receives no incoming requests within the timeout period, the :meth:`handle_timeout` method is called. + There are various server methods that can be overridden by subclasses of base server classes like :class:`TCPServer`; these methods aren't useful to external users of the server object. @@ -355,7 +356,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -379,7 +380,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # Likewise, self.wfile is a file-like object used to write back # to the client @@ -402,16 +403,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(data + "\n") + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(data + "\n") - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = sock.recv(1024) + finally: + sock.close() - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look something like this: @@ -452,7 +455,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print data socket.sendto(data.upper(), self.client_address) @@ -477,8 +480,8 @@ sock.sendto(data + "\n", (HOST, PORT)) received = sock.recv(1024) - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look exactly like for the TCP server example. @@ -499,8 +502,8 @@ def handle(self): data = self.request.recv(1024) - cur_thread = threading.currentThread() - response = "%s: %s" % (cur_thread.getName(), data) + cur_thread = threading.current_thread() + response = "{}: {}".format(cur_thread.name, data) self.request.send(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): @@ -509,10 +512,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print "Received: %s" % response - sock.close() + try: + sock.send(message) + response = sock.recv(1024) + print "Received: {}".format(response) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -525,9 +530,9 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() - print "Server loop running in thread:", server_thread.getName() + print "Server loop running in thread:", server_thread.name client(ip, port, "Hello World 1") client(ip, port, "Hello World 2") @@ -535,6 +540,7 @@ server.shutdown() + The output of the example should look something like this:: $ python ThreadedTCPServer.py diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -31,7 +31,142 @@ Using the subprocess Module --------------------------- -This module defines one class called :class:`Popen`: +The recommended interface to this module is to use the following convenience +functions for all use cases they can handle. For more advanced use cases, the +underlying :class:`Popen` interface can be used directly. + + +.. function:: call(args, *, stdin=None, stdout=None, stderr=None) + + Run the command described by *args*. Wait for command to complete, then + return the :attr:`returncode` attribute. + + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments`. The full function signature is the + same as that of the :class:`Popen` constructor - the convenience functions + pass all supplied arguments directly through to that interface. + + Examples:: + + >>> subprocess.call(["ls", "-l"]) + 0 + + >>> subprocess.call(["python", "-c", "import sys; sys.exit(1)"]) + 1 + + .. warning:: + + Like :meth:`Popen.wait`, this will deadlock when using + ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process + generates enough output to a pipe such that it blocks waiting + for the OS pipe buffer to accept more data. + + +.. function:: check_call(*callargs, **kwargs) + + Run command with arguments. Wait for command to complete. If the return + code was zero then return, otherwise raise :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute. + + The arguments are the same as for :func:`call`. Examples:: + + >>> subprocess.check_call(["ls", "-l"]) + 0 + + >>> subprocess.check_call(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + .. versionadded:: 2.5 + + .. warning:: + + See the warning for :func:`call`. + + +.. function:: check_output(*callargs, **kwargs) + + Run command with arguments and return its output as a byte string. + + If the return code was non-zero it raises a :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute and any output in the :attr:`output` + attribute. + + Examples:: + + >>> subprocess.check_output(["ls", "-l", "/dev/null"]) + 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' + + >>> subprocess.check_output(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + The arguments are the same as for :func:`call`, except that *stdout* is + not allowed as it is used internally. To also capture standard error in + the result, use ``stderr=subprocess.STDOUT``:: + + >>> subprocess.check_output( + ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], + ... stderr=subprocess.STDOUT) + 'ls: non_existent_file: No such file or directory\n' + + .. versionadded:: 2.7 + + +.. data:: PIPE + + Special value that can be used as the *stdin*, *stdout* or *stderr* argument + to :class:`Popen` and indicates that a pipe to the standard stream should be + opened. + + +.. data:: STDOUT + + Special value that can be used as the *stderr* argument to :class:`Popen` and + indicates that standard error should go into the same handle as standard + output. + + +.. _frequently-used-arguments: + +Frequently Used Arguments +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To support a wide variety of use cases, the :class:`Popen` constructor (and +the convenience functions) accept a large number of optional arguments. For +most typical use cases, many of these arguments can be safely left at their +default values. The arguments that are most commonly needed are: + + *args* should be a string, or a sequence of program arguments. Providing + a sequence of arguments is generally preferred, as it allows the module to + take care of any required escaping and quoting of arguments (e.g. to permit + spaces in file names) + + *stdin*, *stdout* and *stderr* specify the executed program's standard input, + standard output and standard error file handles, respectively. Valid values + are :data:`PIPE`, an existing file descriptor (a positive integer), an + existing file object, and ``None``. :data:`PIPE` indicates that a new pipe + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. + +These options, along with all of the other options, are described in more +detail in the :class:`Popen` constructor documentation. + + +Popen Constuctor +^^^^^^^^^^^^^^^^ + +The underlying process creation and management in this module is handled by +the :class:`Popen` class. It offers a lot of flexibility so that developers +are able to handle the less common cases not covered by the convenience +functions. .. class:: Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) @@ -126,14 +261,15 @@ You don't need ``shell=True`` to run a batch file, nor to run a console-based executable. - *stdin*, *stdout* and *stderr* specify the executed programs' standard input, + *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, an existing file descriptor (a positive integer), an existing file object, and ``None``. :data:`PIPE` indicates that a new pipe - to the child should be created. With ``None``, no redirection will occur; - the child's file handles will be inherited from the parent. Additionally, - *stderr* can be :data:`STDOUT`, which indicates that the stderr data from the - applications should be captured into the same file handle as for stdout. + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. If *preexec_fn* is set to a callable object, this object will be called in the child process just before the child is executed. (Unix only) @@ -184,87 +320,6 @@ :data:`CREATE_NEW_PROCESS_GROUP`. (Windows only) -.. data:: PIPE - - Special value that can be used as the *stdin*, *stdout* or *stderr* argument - to :class:`Popen` and indicates that a pipe to the standard stream should be - opened. - - -.. data:: STDOUT - - Special value that can be used as the *stderr* argument to :class:`Popen` and - indicates that standard error should go into the same handle as standard - output. - - -Convenience Functions -^^^^^^^^^^^^^^^^^^^^^ - -This module also defines the following shortcut functions: - - -.. function:: call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete, then return the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> retcode = subprocess.call(["ls", "-l"]) - - .. warning:: - - Like :meth:`Popen.wait`, this will deadlock when using - ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process - generates enough output to a pipe such that it blocks waiting - for the OS pipe buffer to accept more data. - - -.. function:: check_call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete. If the exit code was - zero then return, otherwise raise :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_call(["ls", "-l"]) - 0 - - .. versionadded:: 2.5 - - .. warning:: - - See the warning for :func:`call`. - - -.. function:: check_output(*popenargs, **kwargs) - - Run command with arguments and return its output as a byte string. - - If the exit code was non-zero it raises a :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` - attribute and output in the :attr:`output` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_output(["ls", "-l", "/dev/null"]) - 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' - - The stdout argument is not allowed as it is used internally. - To capture standard error in the result, use ``stderr=subprocess.STDOUT``:: - - >>> subprocess.check_output( - ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], - ... stderr=subprocess.STDOUT) - 'ls: non_existent_file: No such file or directory\n' - - .. versionadded:: 2.7 - - Exceptions ^^^^^^^^^^ @@ -523,12 +578,15 @@ Replacing Older Functions with the subprocess Module ---------------------------------------------------- -In this section, "a ==> b" means that b can be used as a replacement for a. +In this section, "a becomes b" means that b can be used as a replacement for a. .. note:: All functions in this section fail (more or less) silently if the executed - program cannot be found; this module raises an :exc:`OSError` exception. + program cannot be found; this module raises an :exc:`OSError` exception. In + addition, the replacements using :func:`check_output` will fail with a + :exc:`CalledProcessError` if the requested operation produces a non-zero + return code. In the following examples, we assume that the subprocess module is imported with "from subprocess import \*". @@ -540,8 +598,8 @@ :: output=`mycmd myarg` - ==> - output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] + # becomes + output = check_output(["mycmd", "myarg"]) Replacing shell pipeline @@ -550,7 +608,7 @@ :: output=`dmesg | grep hda` - ==> + # becomes p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. @@ -559,15 +617,22 @@ The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1. +Alternatively, for trusted input, the shell's pipeline may still be used +directly: + + output=`dmesg | grep hda` + # becomes + output=check_output("dmesg | grep hda", shell=True) + + Replacing :func:`os.system` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sts = os.system("mycmd" + " myarg") - ==> - p = Popen("mycmd" + " myarg", shell=True) - sts = os.waitpid(p.pid, 0)[1] + # becomes + sts = call("mycmd" + " myarg", shell=True) Notes: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -342,6 +342,14 @@ - Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2, iso2022_kr). +Documentation +------------- + +- Issue #13237: Reorganise subprocess documentation to emphasise convenience + functions and the most commonly needed arguments to Popen. + +- Issue #13141: Demonstrate recommended style for SocketServer examples. + What's New in Python 2.7.2? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 14:52:37 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 24 Oct 2011 14:52:37 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_note_callable_i?= =?utf8?q?s_back_in_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/d9571fb37269 changeset: 73097:d9571fb37269 branch: 3.2 parent: 73092:451fa5782145 user: Benjamin Peterson date: Mon Oct 24 08:51:15 2011 -0400 summary: note callable is back in 3.2 files: Doc/library/2to3.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 14:52:37 2011 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 24 Oct 2011 14:52:37 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/9d8a14a550a3 changeset: 73098:9d8a14a550a3 parent: 73093:b82e68cf3b0d parent: 73097:d9571fb37269 user: Benjamin Peterson date: Mon Oct 24 08:52:30 2011 -0400 summary: merge 3.2 files: Doc/library/2to3.rst | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 18:45:24 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 24 Oct 2011 18:45:24 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEwMzMy?= =?utf8?q?=3A_multiprocessing=3A_fix_a_race_condition_when_a_Pool_is_close?= =?utf8?q?d?= Message-ID: http://hg.python.org/cpython/rev/3465a9b2d25c changeset: 73099:3465a9b2d25c branch: 2.7 parent: 73096:ad49a384adae user: Charles-Fran?ois Natali date: Mon Oct 24 18:43:51 2011 +0200 summary: Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. files: Lib/multiprocessing/pool.py | 6 +++++- Lib/test/test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -294,7 +294,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1168,6 +1168,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode arguments with the system default encoding just like the write() method does, instead of converting it to a raw buffer. This also fixes handling of -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 18:45:25 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 24 Oct 2011 18:45:25 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwMzMy?= =?utf8?q?=3A_multiprocessing=3A_fix_a_race_condition_when_a_Pool_is_close?= =?utf8?q?d?= Message-ID: http://hg.python.org/cpython/rev/52c98a729a71 changeset: 73100:52c98a729a71 branch: 3.2 parent: 73097:d9571fb37269 user: Charles-Fran?ois Natali date: Mon Oct 24 18:45:29 2011 +0200 summary: Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. files: Lib/multiprocessing/pool.py | 6 +++++- Lib/test/test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1217,6 +1217,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -58,6 +58,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #13255: wrong docstrings in array module. - Issue #9168: now smtpd is able to bind privileged port. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 18:45:29 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 24 Oct 2011 18:45:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310332=3A_multiprocessing=3A_fix_a_race_condition_wh?= =?utf8?q?en_a_Pool_is_closed?= Message-ID: http://hg.python.org/cpython/rev/c2cdabc44665 changeset: 73101:c2cdabc44665 parent: 73098:9d8a14a550a3 parent: 73100:52c98a729a71 user: Charles-Fran?ois Natali date: Mon Oct 24 18:47:43 2011 +0200 summary: Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. files: Lib/multiprocessing/pool.py | 6 +++++- Lib/test/test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 22 insertions(+), 1 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1266,6 +1266,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -338,6 +338,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #13255: wrong docstrings in array module. - Issue #8540: Remove deprecated Context._clamp attribute in Decimal module. -- Repository URL: http://hg.python.org/cpython From jimjjewett at gmail.com Mon Oct 24 19:04:20 2011 From: jimjjewett at gmail.com (Jim Jewett) Date: Mon, 24 Oct 2011 13:04:20 -0400 Subject: [Python-checkins] Case consistency [was: Re: cpython: Cleanup code: remove int/long idioms and simplify a while statement.] Message-ID: Is there a reason to check for ?if s[:5] == 'pass ' or s[:5] == 'PASS ': instead of if s[:5].lower() == 'pass' ? If so, it should be documented; otherwise, I would rather see the more inclusive form, that would also allow things like "Pass" -jJ On Sun, Oct 23, 2011 at 4:21 PM, florent.xicluna wrote: > http://hg.python.org/cpython/rev/67053b135ed9 > changeset: ? 73076:67053b135ed9 > user: ? ? ? ?Florent Xicluna > date: ? ? ? ?Sun Oct 23 22:11:00 2011 +0200 > summary: > ?Cleanup code: remove int/long idioms and simplify a while statement. > diff --git a/Lib/ftplib.py b/Lib/ftplib.py > --- a/Lib/ftplib.py > +++ b/Lib/ftplib.py > @@ -175,10 +175,8 @@ > > ? ? # Internal: "sanitize" a string for printing > ? ? def sanitize(self, s): > - ? ? ? ?if s[:5] == 'pass ' or s[:5] == 'PASS ': > - ? ? ? ? ? ?i = len(s) > - ? ? ? ? ? ?while i > 5 and s[i-1] in {'\r', '\n'}: > - ? ? ? ? ? ? ? ?i = i-1 > + ? ? ? ?if s[:5] in {'pass ', 'PASS '}: > + ? ? ? ? ? ?i = len(s.rstrip('\r\n')) > ? ? ? ? ? ? s = s[:5] + '*'*(i-5) + s[i:] > ? ? ? ? return repr(s) From eric at trueblade.com Mon Oct 24 20:10:52 2011 From: eric at trueblade.com (Eric V. Smith) Date: Mon, 24 Oct 2011 14:10:52 -0400 Subject: [Python-checkins] Case consistency [was: Re: cpython: Cleanup code: remove int/long idioms and simplify a while statement.] In-Reply-To: References: Message-ID: <4EA5AA2C.20008@trueblade.com> On 10/24/2011 1:04 PM, Jim Jewett wrote: > Is there a reason to check for > if s[:5] == 'pass ' or s[:5] == 'PASS ': > instead of > if s[:5].lower() == 'pass' > ? Just in case anyone copies this code verbatim, note that last string is missing a trailing space. Eric. > > If so, it should be documented; otherwise, I would rather see the more > inclusive form, that would also allow things like "Pass" > > -jJ > > > On Sun, Oct 23, 2011 at 4:21 PM, florent.xicluna > wrote: >> http://hg.python.org/cpython/rev/67053b135ed9 >> changeset: 73076:67053b135ed9 >> user: Florent Xicluna >> date: Sun Oct 23 22:11:00 2011 +0200 >> summary: >> Cleanup code: remove int/long idioms and simplify a while statement. > >> diff --git a/Lib/ftplib.py b/Lib/ftplib.py >> --- a/Lib/ftplib.py >> +++ b/Lib/ftplib.py >> @@ -175,10 +175,8 @@ >> >> # Internal: "sanitize" a string for printing >> def sanitize(self, s): >> - if s[:5] == 'pass ' or s[:5] == 'PASS ': >> - i = len(s) >> - while i > 5 and s[i-1] in {'\r', '\n'}: >> - i = i-1 >> + if s[:5] in {'pass ', 'PASS '}: >> + i = len(s.rstrip('\r\n')) >> s = s[:5] + '*'*(i-5) + s[i:] >> return repr(s) > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From python-checkins at python.org Mon Oct 24 20:33:28 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:28 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDE4?= =?utf8?q?=3A_Fix_reference_leaks_in_error_paths_in_dictobject=2Ec=2E?= Message-ID: http://hg.python.org/cpython/rev/5d7164febff1 changeset: 73102:5d7164febff1 branch: 2.7 parent: 73073:5c4781a237ef user: Petri Lehtinen date: Mon Oct 24 20:59:29 2011 +0300 summary: Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Objects/dictobject.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #13018: Fix reference leaks in error paths in dictobject.c. + Patch by Suman Saha. + - Issue #12604: VTRACE macro expanded to no-op in _sre.c to avoid compiler warnings. Patch by Josh Triplett and Petri Lehtinen. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1335,14 +1335,18 @@ PyObject *key; long hash; - if (dictresize(mp, Py_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } @@ -1353,14 +1357,18 @@ PyObject *key; long hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, PySet_GET_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PySet_NextEntry(seq, &pos, &key, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 20:33:29 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:29 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDE4?= =?utf8?q?=3A_Fix_reference_leaks_in_error_paths_in_dictobject=2Ec=2E?= Message-ID: http://hg.python.org/cpython/rev/df24a8b57148 changeset: 73103:df24a8b57148 branch: 3.2 parent: 73069:46c82c4141c9 user: Petri Lehtinen date: Mon Oct 24 21:12:58 2011 +0300 summary: Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Objects/dictobject.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13018: Fix reference leaks in error paths in dictobject.c. + Patch by Suman Saha. + - Issue #1294232: In a few cases involving metaclass inheritance, the interpreter would sometimes invoke the wrong metaclass when building a new class object. These cases now behave correctly. Patch by Daniel Urban. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1314,14 +1314,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, Py_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } @@ -1332,14 +1336,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, PySet_GET_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PySet_NextEntry(seq, &pos, &key, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 20:33:30 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:30 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/db85b1cdcae2 changeset: 73104:db85b1cdcae2 parent: 73072:479a7dd1ea6a parent: 73103:df24a8b57148 user: Petri Lehtinen date: Mon Oct 24 21:17:52 2011 +0300 summary: Merge 3.2 files: Misc/NEWS | 3 +++ Objects/dictobject.c | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13018: Fix reference leaks in error paths in dictobject.c. + Patch by Suman Saha. + - Issue #13201: Define '==' and '!=' to compare range objects based on the sequence of values they define (instead of comparing based on object identity). diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1314,14 +1314,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, Py_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } @@ -1332,14 +1336,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, PySet_GET_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PySet_NextEntry(seq, &pos, &key, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 20:33:31 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/2358a46b621e changeset: 73105:2358a46b621e parent: 73104:db85b1cdcae2 parent: 73101:c2cdabc44665 user: Petri Lehtinen date: Mon Oct 24 21:22:39 2011 +0300 summary: merge heads files: Doc/faq/extending.rst | 30 ---- Doc/library/2to3.rst | 4 +- Doc/library/ftplib.rst | 2 +- Doc/library/signal.rst | 4 +- Doc/library/socketserver.rst | 64 +++++---- Doc/whatsnew/3.3.rst | 129 +++++++++++------- Lib/_pyio.py | 17 +- Lib/asyncore.py | 13 +- Lib/decimal.py | 22 --- Lib/ftplib.py | 17 +- Lib/multiprocessing/pool.py | 6 +- Lib/multiprocessing/util.py | 9 +- Lib/optparse.py | 5 +- Lib/pickletools.py | 5 +- Lib/socket.py | 8 +- Lib/subprocess.py | 6 +- Lib/test/test_decimal.py | 15 +- Lib/test/test_long.py | 80 +++++++++++ Lib/test/test_multiprocessing.py | 14 ++ Lib/test/test_socket.py | 2 +- Lib/xdrlib.py | 6 +- Lib/xmlrpc/client.py | 12 +- Misc/NEWS | 9 + Modules/arraymodule.c | 8 +- Objects/longobject.c | 40 +++-- 25 files changed, 284 insertions(+), 243 deletions(-) diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst --- a/Doc/faq/extending.rst +++ b/Doc/faq/extending.rst @@ -447,34 +447,3 @@ The Boost Python Library (BPL, http://www.boost.org/libs/python/doc/index.html) provides a way of doing this from C++ (i.e. you can inherit from an extension class written in C++ using the BPL). - - -When importing module X, why do I get "undefined symbol: PyUnicodeUCS2*"? -------------------------------------------------------------------------- - -You are using a version of Python that uses a 4-byte representation for Unicode -characters, but some C extension module you are importing was compiled using a -Python that uses a 2-byte representation for Unicode characters (the default). - -If instead the name of the undefined symbol starts with ``PyUnicodeUCS4``, the -problem is the reverse: Python was built using 2-byte Unicode characters, and -the extension module was compiled using a Python with 4-byte Unicode characters. - -This can easily occur when using pre-built extension packages. RedHat Linux -7.x, in particular, provided a "python2" binary that is compiled with 4-byte -Unicode. This only causes the link failure if the extension uses any of the -``PyUnicode_*()`` functions. It is also a problem if an extension uses any of -the Unicode-related format specifiers for :c:func:`Py_BuildValue` (or similar) or -parameter specifications for :c:func:`PyArg_ParseTuple`. - -You can check the size of the Unicode character a Python interpreter is using by -checking the value of sys.maxunicode: - - >>> import sys - >>> if sys.maxunicode > 65535: - ... print('UCS4 build') - ... else: - ... print('UCS2 build') - -The only way to solve this problem is to use extension modules compiled with a -Python binary built using the same size for Unicode characters. diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -427,7 +427,7 @@ .. method:: FTP_TLS.ccc() - Revert control channel back to plaintex. This can be useful to take + Revert control channel back to plaintext. This can be useful to take advantage of firewalls that know how to handle NAT with non-secure FTP without opening fixed ports. diff --git a/Doc/library/signal.rst b/Doc/library/signal.rst --- a/Doc/library/signal.rst +++ b/Doc/library/signal.rst @@ -353,8 +353,8 @@ signals in *sigset* is already pending for the calling thread, the function will return immediately with information about that signal. The signal handler is not called for the delivered signal. The function raises an - :exc:`OSError` with error number set to :const:`errno.EINTR` if it is - interrupted by a signal that is not in *sigset*. + :exc:`InterruptedError` if it is interrupted by a signal that is not in + *sigset*. The return value is an object representing the data contained in the :c:type:`siginfo_t` structure, namely: :attr:`si_signo`, :attr:`si_code`, diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -361,7 +361,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -385,7 +385,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # Likewise, self.wfile is a file-like object used to write back # to the client @@ -408,16 +408,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n","utf8")) + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(bytes(data + "\n", "utf-8")) - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + finally: + sock.close() - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look something like this: @@ -434,10 +436,10 @@ $ python TCPClient.py hello world with TCP Sent: hello world with TCP - Received: b'HELLO WORLD WITH TCP' + Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice - Received: b'PYTHON IS NICE' + Received: PYTHON IS NICE :class:`socketserver.UDPServer` Example @@ -458,7 +460,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(data) socket.sendto(data.upper(), self.client_address) @@ -480,11 +482,11 @@ # As you can see, there is no connect() call; UDP has no connections. # Instead, data is directly sent to the recipient via sendto(). - sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT)) - received = sock.recv(1024) + sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) + received = str(sock.recv(1024), "utf-8") - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look exactly like for the TCP server example. @@ -504,9 +506,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): - data = self.request.recv(1024) + data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() - response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii') + response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') self.request.send(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): @@ -515,10 +517,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print("Received: %s" % response) - sock.close() + try: + sock.send(bytes(message, 'ascii')) + response = str(sock.recv(1024), 'ascii') + print("Received: {}".format(response)) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -531,13 +535,13 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() print("Server loop running in thread:", server_thread.name) - client(ip, port, b"Hello World 1") - client(ip, port, b"Hello World 2") - client(ip, port, b"Hello World 3") + client(ip, port, "Hello World 1") + client(ip, port, "Hello World 2") + client(ip, port, "Hello World 3") server.shutdown() @@ -546,9 +550,9 @@ $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 - Received: b"Thread-2: b'Hello World 1'" - Received: b"Thread-3: b'Hello World 2'" - Received: b"Thread-4: b'Hello World 3'" + Received: Thread-2: Hello World 1 + Received: Thread-3: Hello World 2 + Received: Thread-4: Hello World 3 The :class:`ForkingMixIn` class is used in the same way, except that the server diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -49,28 +49,32 @@ This article explains the new features in Python 3.3, compared to 3.2. +.. _pep-393: + PEP 393: Flexible String Representation ======================================= -[Abstract copied from the PEP: The Unicode string type is changed to support -multiple internal representations, depending on the character with the largest -Unicode ordinal (1, 2, or 4 bytes). This allows a space-efficient -representation in common cases, but gives access to full UCS-4 on all systems. -For compatibility with existing APIs, several representations may exist in -parallel; over time, this compatibility should be phased out.] +The Unicode string type is changed to support multiple internal +representations, depending on the character with the largest Unicode ordinal +(1, 2, or 4 bytes) in the represented string. This allows a space-efficient +representation in common cases, but gives access to full UCS-4 on all +systems. For compatibility with existing APIs, several representations may +exist in parallel; over time, this compatibility should be phased out. -PEP 393 is fully backward compatible. The legacy API should remain -available at least five years. Applications using the legacy API will not -fully benefit of the memory reduction, or worse may use a little bit more -memory, because Python may have to maintain two versions of each string (in -the legacy format and in the new efficient storage). +On the Python side, there should be no downside to this change. -XXX Add list of changes introduced by :pep:`393` here: +On the C API side, PEP 393 is fully backward compatible. The legacy API +should remain available at least five years. Applications using the legacy +API will not fully benefit of the memory reduction, or - worse - may use +a bit more memory, because Python may have to maintain two versions of each +string (in the legacy format and in the new efficient storage). + +Changes introduced by :pep:`393` are the following: * Python now always supports the full range of Unicode codepoints, including non-BMP ones (i.e. from ``U+0000`` to ``U+10FFFF``). The distinction between narrow and wide builds no longer exists and Python now behaves like a wide - build. + build, even under Windows. * The storage of Unicode strings now depends on the highest codepoint in the string: @@ -86,7 +90,8 @@ XXX The result should be moved in the PEP and a small summary about performances and a link to the PEP should be added here. -* Some of the problems visible on narrow builds have been fixed, for example: +* With the death of narrow builds, the problems specific to narrow builds have + also been fixed, for example: * :func:`len` now always returns 1 for non-BMP characters, so ``len('\U0010FFFF') == 1``; @@ -94,10 +99,11 @@ * surrogate pairs are not recombined in string literals, so ``'\uDBFF\uDFFF' != '\U0010FFFF'``; - * indexing or slicing a non-BMP characters doesn't return surrogates anymore, + * indexing or slicing non-BMP characters returns the expected value, so ``'\U0010FFFF'[0]`` now returns ``'\U0010FFFF'`` and not ``'\uDBFF'``; - * several other functions in the stdlib now handle correctly non-BMP codepoints. + * several other functions in the standard library now handle correctly + non-BMP codepoints. * The value of :data:`sys.maxunicode` is now always ``1114111`` (``0x10FFFF`` in hexadecimal). The :c:func:`PyUnicode_GetMax` function still returns @@ -113,40 +119,44 @@ ===================================================== :pep:`3151` - Reworking the OS and IO exception hierarchy -PEP written and implemented by Antoine Pitrou. + PEP written and implemented by Antoine Pitrou. -New subclasses of :exc:`OSError` exceptions: +The hierarchy of exceptions raised by operating system errors is now both +simplified and finer-grained. - * :exc:`BlockingIOError` - * :exc:`ChildProcessError` - * :exc:`ConnectionError` +You don't have to worry anymore about choosing the appropriate exception +type between :exc:`OSError`, :exc:`IOError`, :exc:`EnvironmentError`, +:exc:`WindowsError`, :exc:`mmap.error`, :exc:`socket.error` or +:exc:`select.error`. All these exception types are now only one: +:exc:`OSError`. The other names are kept as aliases for compatibility +reasons. - * :exc:`BrokenPipeError` - * :exc:`ConnectionAbortedError` - * :exc:`ConnectionRefusedError` - * :exc:`ConnectionResetError` +Also, it is now easier to catch a specific error condition. Instead of +inspecting the ``errno`` attribute (or ``args[0]``) for a particular +constant from the :mod:`errno` module, you can catch the adequate +:exc:`OSError` subclass. The available subclasses are the following: - * :exc:`FileExistsError` - * :exc:`FileNotFoundError` - * :exc:`InterruptedError` - * :exc:`IsADirectoryError` - * :exc:`NotADirectoryError` - * :exc:`PermissionError` - * :exc:`ProcessLookupError` - * :exc:`TimeoutError` +* :exc:`BlockingIOError` +* :exc:`ChildProcessError` +* :exc:`ConnectionError` +* :exc:`FileExistsError` +* :exc:`FileNotFoundError` +* :exc:`InterruptedError` +* :exc:`IsADirectoryError` +* :exc:`NotADirectoryError` +* :exc:`PermissionError` +* :exc:`ProcessLookupError` +* :exc:`TimeoutError` -The following exceptions have been merged into :exc:`OSError`: +And the :exc:`ConnectionError` itself has finer-grained subclasses: - * :exc:`EnvironmentError` - * :exc:`IOError` - * :exc:`WindowsError` - * :exc:`VMSError` - * :exc:`socket.error` - * :exc:`select.error` - * :exc:`mmap.error` +* :exc:`BrokenPipeError` +* :exc:`ConnectionAbortedError` +* :exc:`ConnectionRefusedError` +* :exc:`ConnectionResetError` Thanks to the new exceptions, common usages of the :mod:`errno` can now be -avoided. For example, the following code written for Python 3.2: :: +avoided. For example, the following code written for Python 3.2:: from errno import ENOENT, EACCES, EPERM @@ -161,7 +171,8 @@ else: raise -can now be written without the :mod:`errno` import: :: +can now be written without the :mod:`errno` import and without manual +inspection of exception attributes:: try: with open("document.txt") as f: @@ -180,7 +191,7 @@ * Stub Added support for Unicode name aliases and named sequences. -Both :func:`unicodedata.lookup()` and '\N{...}' now resolve name aliases, +Both :func:`unicodedata.lookup()` and ``'\N{...}'`` now resolve name aliases, and :func:`unicodedata.lookup()` resolves named sequences too. (Contributed by Ezio Melotti in :issue:`12753`) @@ -267,7 +278,7 @@ The :class:`~ftplib.FTP_TLS` class now provides a new :func:`~ftplib.FTP_TLS.ccc` function to revert control channel back to -plaintex. This can be useful to take advantage of firewalls that know how to +plaintext. This can be useful to take advantage of firewalls that know how to handle NAT with non-secure FTP without opening fixed ports. (Contributed by Giampaolo Rodol? in :issue:`12139`) @@ -531,7 +542,10 @@ ===================== This section lists previously described changes and other bugfixes -that may require changes to your code: +that may require changes to your code. + +Porting Python code +------------------- * Issue #12326: On Linux, sys.platform doesn't contain the major version anymore. It is now always 'linux', instead of 'linux2' or 'linux3' depending @@ -539,6 +553,24 @@ with sys.platform.startswith('linux'), or directly sys.platform == 'linux' if you don't need to support older Python versions. +Porting C code +-------------- + +* Due to :ref:`PEP 393 `, the :c:type:`Py_UNICODE` type and all + functions using this type are deprecated (but will stay available for + at least five years). If you were using low-level Unicode APIs to + construct and access unicode objects and you want to benefit of the + memory footprint reduction provided by the PEP 393, you have to convert + your code to the new :doc:`Unicode API <../c-api/unicode>`. + + However, if you only have been using high-level functions such as + :c:func:`PyUnicode_Concat()`, :c:func:`PyUnicode_Join` or + :c:func:`PyUnicode_FromFormat()`, your code will automatically take + advantage of the new unicode representations. + +Other issues +------------ + .. Issue #11591: When :program:`python` was started with :option:`-S`, ``import site`` will not add site-specific paths to the module search paths. In previous versions, it did. See changeset for doc changes in @@ -548,8 +580,3 @@ removed. Code checking sys.flags.division_warning will need updating. Contributed by ?ric Araujo. -* :pep:`393`: The :c:type:`Py_UNICODE` type and all functions using this type - are deprecated. To fully benefit of the memory footprint reduction provided - by the PEP 393, you have to convert your code to the new Unicode API. Read - the porting guide: XXX. - diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -14,7 +14,6 @@ import io from io import (__all__, SEEK_SET, SEEK_CUR, SEEK_END) -from errno import EINTR # open() uses st_blksize whenever we can DEFAULT_BUFFER_SIZE = 8 * 1024 # bytes @@ -948,9 +947,7 @@ # Read until EOF or until read() would block. try: chunk = self.raw.read() - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if chunk in empty_values: nodata_val = chunk @@ -972,9 +969,7 @@ while avail < n: try: chunk = self.raw.read(wanted) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if chunk in empty_values: nodata_val = chunk @@ -1007,9 +1002,7 @@ while True: try: current = self.raw.read(to_read) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue break if current: @@ -1120,9 +1113,7 @@ while self._write_buf: try: n = self.raw.write(self._write_buf) - except IOError as e: - if e.errno != EINTR: - raise + except InterruptedError: continue if n > len(self._write_buf) or n < 0: raise IOError("write() returned incorrect number of bytes") diff --git a/Lib/asyncore.py b/Lib/asyncore.py --- a/Lib/asyncore.py +++ b/Lib/asyncore.py @@ -54,7 +54,7 @@ import os from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \ - ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ + ENOTCONN, ESHUTDOWN, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ errorcode _DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, @@ -143,11 +143,8 @@ try: r, w, e = select.select(r, w, e, timeout) - except select.error as err: - if err.args[0] != EINTR: - raise - else: - return + except InterruptedError: + return for fd in r: obj = map.get(fd) @@ -190,9 +187,7 @@ pollster.register(fd, flags) try: r = pollster.poll(timeout) - except select.error as err: - if err.args[0] != EINTR: - raise + except InterruptedError: r = [] for fd, flags in r: obj = map.get(fd) diff --git a/Lib/decimal.py b/Lib/decimal.py --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -3903,28 +3903,6 @@ return nc __copy__ = copy - # _clamp is provided for backwards compatibility with third-party - # code. May be removed in Python >= 3.3. - def _get_clamp(self): - "_clamp mirrors the clamp attribute. Its use is deprecated." - import warnings - warnings.warn('Use of the _clamp attribute is deprecated. ' - 'Please use clamp instead.', - DeprecationWarning) - return self.clamp - - def _set_clamp(self, clamp): - "_clamp mirrors the clamp attribute. Its use is deprecated." - import warnings - warnings.warn('Use of the _clamp attribute is deprecated. ' - 'Please use clamp instead.', - DeprecationWarning) - self.clamp = clamp - - # don't bother with _del_clamp; no sane 3rd party code should - # be deleting the _clamp attribute - _clamp = property(_get_clamp, _set_clamp) - def _raise_error(self, condition, explanation = None, *args): """Handles an error diff --git a/Lib/ftplib.py b/Lib/ftplib.py --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -175,10 +175,8 @@ # Internal: "sanitize" a string for printing def sanitize(self, s): - if s[:5] == 'pass ' or s[:5] == 'PASS ': - i = len(s) - while i > 5 and s[i-1] in {'\r', '\n'}: - i = i-1 + if s[:5] in {'pass ', 'PASS '}: + i = len(s.rstrip('\r\n')) s = s[:5] + '*'*(i-5) + s[i:] return repr(s) @@ -596,10 +594,7 @@ resp = self.sendcmd('SIZE ' + filename) if resp[:3] == '213': s = resp[3:].strip() - try: - return int(s) - except (OverflowError, ValueError): - return int(s) + return int(s) def mkd(self, dirname): '''Make a directory, return its full pathname.''' @@ -861,11 +856,7 @@ m = _150_re.match(resp) if not m: return None - s = m.group(1) - try: - return int(s) - except (OverflowError, ValueError): - return int(s) + return int(m.group(1)) _227_re = None diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/multiprocessing/util.py b/Lib/multiprocessing/util.py --- a/Lib/multiprocessing/util.py +++ b/Lib/multiprocessing/util.py @@ -327,15 +327,12 @@ # Automatic retry after EINTR # -def _eintr_retry(func, _errors=(EnvironmentError, select.error)): +def _eintr_retry(func): @functools.wraps(func) def wrapped(*args, **kwargs): while True: try: return func(*args, **kwargs) - except _errors as e: - # select.error has no `errno` attribute - if e.args[0] == errno.EINTR: - continue - raise + except InterruptedError: + continue return wrapped diff --git a/Lib/optparse.py b/Lib/optparse.py --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -417,11 +417,8 @@ def _parse_int(val): return _parse_num(val, int) -def _parse_long(val): - return _parse_num(val, int) - _builtin_cvt = { "int" : (_parse_int, _("integer")), - "long" : (_parse_long, _("long integer")), + "long" : (_parse_int, _("integer")), "float" : (float, _("floating-point")), "complex" : (complex, _("complex")) } diff --git a/Lib/pickletools.py b/Lib/pickletools.py --- a/Lib/pickletools.py +++ b/Lib/pickletools.py @@ -510,10 +510,7 @@ elif s == b"01": return True - try: - return int(s) - except OverflowError: - return int(s) + return int(s) def read_decimalnl_long(f): r""" diff --git a/Lib/socket.py b/Lib/socket.py --- a/Lib/socket.py +++ b/Lib/socket.py @@ -53,7 +53,6 @@ except ImportError: errno = None EBADF = getattr(errno, 'EBADF', 9) -EINTR = getattr(errno, 'EINTR', 4) EAGAIN = getattr(errno, 'EAGAIN', 11) EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) @@ -280,11 +279,10 @@ except timeout: self._timeout_occurred = True raise + except InterruptedError: + continue except error as e: - n = e.args[0] - if n == EINTR: - continue - if n in _blocking_errnos: + if e.args[0] in _blocking_errnos: return None raise diff --git a/Lib/subprocess.py b/Lib/subprocess.py --- a/Lib/subprocess.py +++ b/Lib/subprocess.py @@ -450,10 +450,8 @@ while True: try: return func(*args) - except (OSError, IOError) as e: - if e.errno == errno.EINTR: - continue - raise + except InterruptedError: + continue def call(*popenargs, timeout=None, **kwargs): diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py --- a/Lib/test/test_decimal.py +++ b/Lib/test/test_decimal.py @@ -1834,18 +1834,9 @@ # only, the attribute should be gettable/settable via both # `clamp` and `_clamp`; in Python 3.3, `_clamp` should be # removed. - c = Context(clamp = 0) - self.assertEqual(c.clamp, 0) - - with check_warnings(("", DeprecationWarning)): - c._clamp = 1 - self.assertEqual(c.clamp, 1) - with check_warnings(("", DeprecationWarning)): - self.assertEqual(c._clamp, 1) - c.clamp = 0 - self.assertEqual(c.clamp, 0) - with check_warnings(("", DeprecationWarning)): - self.assertEqual(c._clamp, 0) + c = Context() + with self.assertRaises(AttributeError): + clamp_value = c._clamp def test_abs(self): c = Context() diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -43,6 +43,53 @@ DBL_MANT_DIG = sys.float_info.mant_dig DBL_MIN_OVERFLOW = 2**DBL_MAX_EXP - 2**(DBL_MAX_EXP - DBL_MANT_DIG - 1) + +# Pure Python version of correctly-rounded integer-to-float conversion. +def int_to_float(n): + """ + Correctly-rounded integer-to-float conversion. + + """ + # Constants, depending only on the floating-point format in use. + # We use an extra 2 bits of precision for rounding purposes. + PRECISION = sys.float_info.mant_dig + 2 + SHIFT_MAX = sys.float_info.max_exp - PRECISION + Q_MAX = 1 << PRECISION + ROUND_HALF_TO_EVEN_CORRECTION = [0, -1, -2, 1, 0, -1, 2, 1] + + # Reduce to the case where n is positive. + if n == 0: + return 0.0 + elif n < 0: + return -int_to_float(-n) + + # Convert n to a 'floating-point' number q * 2**shift, where q is an + # integer with 'PRECISION' significant bits. When shifting n to create q, + # the least significant bit of q is treated as 'sticky'. That is, the + # least significant bit of q is set if either the corresponding bit of n + # was already set, or any one of the bits of n lost in the shift was set. + shift = n.bit_length() - PRECISION + q = n << -shift if shift < 0 else (n >> shift) | bool(n & ~(-1 << shift)) + + # Round half to even (actually rounds to the nearest multiple of 4, + # rounding ties to a multiple of 8). + q += ROUND_HALF_TO_EVEN_CORRECTION[q & 7] + + # Detect overflow. + if shift + (q == Q_MAX) > SHIFT_MAX: + raise OverflowError("integer too large to convert to float") + + # Checks: q is exactly representable, and q**2**shift doesn't overflow. + assert q % 4 == 0 and q // 4 <= 2**(sys.float_info.mant_dig) + assert q * 2**shift <= sys.float_info.max + + # Some circularity here, since float(q) is doing an int-to-float + # conversion. But here q is of bounded size, and is exactly representable + # as a float. In a low-level C-like language, this operation would be a + # simple cast (e.g., from unsigned long long to double). + return math.ldexp(float(q), shift) + + # pure Python version of correctly-rounded true division def truediv(a, b): """Correctly-rounded true division for integers.""" @@ -367,6 +414,23 @@ return 1729 self.assertEqual(int(LongTrunc()), 1729) + def check_float_conversion(self, n): + # Check that int -> float conversion behaviour matches + # that of the pure Python version above. + try: + actual = float(n) + except OverflowError: + actual = 'overflow' + + try: + expected = int_to_float(n) + except OverflowError: + expected = 'overflow' + + msg = ("Error in conversion of integer {} to float. " + "Got {}, expected {}.".format(n, actual, expected)) + self.assertEqual(actual, expected, msg) + @support.requires_IEEE_754 def test_float_conversion(self): @@ -421,6 +485,22 @@ y = 2**p * 2**53 self.assertEqual(int(float(x)), y) + # Compare builtin float conversion with pure Python int_to_float + # function above. + test_values = [ + int_dbl_max-1, int_dbl_max, int_dbl_max+1, + halfway-1, halfway, halfway + 1, + top_power-1, top_power, top_power+1, + 2*top_power-1, 2*top_power, top_power*top_power, + ] + test_values.extend(exact_values) + for p in range(-4, 8): + for x in range(-128, 128): + test_values.append(2**(p+53) + x) + for value in test_values: + self.check_float_conversion(value) + self.check_float_conversion(-value) + def test_float_overflow(self): for x in -2.0, -1.0, 0.0, 1.0, 2.0: self.assertEqual(float(int(x)), x) diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1266,6 +1266,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -3584,7 +3584,7 @@ @staticmethod def _raise_eintr(): - raise socket.error(errno.EINTR) + raise socket.error(errno.EINTR, "interrupted") def _textiowrap_mock_socket(self, mock, buffering=-1): raw = socket.SocketIO(mock, "r") diff --git a/Lib/xdrlib.py b/Lib/xdrlib.py --- a/Lib/xdrlib.py +++ b/Lib/xdrlib.py @@ -141,11 +141,7 @@ data = self.__buf[i:j] if len(data) < 4: raise EOFError - x = struct.unpack('>L', data)[0] - try: - return int(x) - except OverflowError: - return x + return struct.unpack('>L', data)[0] def unpack_int(self): i = self.__pos diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -535,15 +535,6 @@ write("") dispatch[type(None)] = dump_nil - def dump_int(self, value, write): - # in case ints are > 32 bits - if value > MAXINT or value < MININT: - raise OverflowError("int exceeds XML-RPC limits") - write("") - write(str(value)) - write("\n") - #dispatch[int] = dump_int - def dump_bool(self, value, write): write("") write(value and "1" or "0") @@ -558,6 +549,9 @@ write("\n") dispatch[int] = dump_long + # backward compatible + dump_int = dump_long + def dump_double(self, value, write): write("") write(repr(value)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,13 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + +- Issue #13255: wrong docstrings in array module. + +- Issue #8540: Remove deprecated Context._clamp attribute in Decimal module. + - Issue #13235: Added PendingDeprecationWarning to warn() method and function. - Issue #9168: now smtpd is able to bind privileged port. @@ -1681,6 +1688,8 @@ Documentation ------------- +- Issue #13141: Demonstrate recommended style for socketserver examples. + - Issue #11818: Fix tempfile examples for Python 3. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1550,7 +1550,7 @@ \n\ Extends this array with data from the unicode string ustr.\n\ The array must be a unicode type array; otherwise a ValueError\n\ -is raised. Use array.frombytes(ustr.decode(...)) to\n\ +is raised. Use array.frombytes(ustr.encode(...)) to\n\ append Unicode data to an array of some other type."); @@ -1572,7 +1572,7 @@ \n\ Convert the array to a unicode string. The array must be\n\ a unicode type array; otherwise a ValueError is raised. Use\n\ -array.tostring().decode() to obtain a unicode string from\n\ +array.tobytes().decode() to obtain a unicode string from\n\ an array of some other type."); @@ -2636,7 +2636,7 @@ extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ -fromstring() -- append items from the string\n\ +frombytes() -- append items from the string\n\ index() -- return index of first occurrence of an object\n\ insert() -- insert a new item into the array at a provided position\n\ pop() -- remove and return item (default last)\n\ @@ -2644,7 +2644,7 @@ reverse() -- reverse the order of the items in the array\n\ tofile() -- write all items to a file object\n\ tolist() -- return the array converted to an ordinary list\n\ -tostring() -- return the array converted to a string\n\ +tobytes() -- return the array converted to a string\n\ \n\ Attributes:\n\ \n\ diff --git a/Objects/longobject.c b/Objects/longobject.c --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -322,8 +322,15 @@ #define PY_ABS_LONG_MIN (0-(unsigned long)LONG_MIN) #define PY_ABS_SSIZE_T_MIN (0-(size_t)PY_SSIZE_T_MIN) -/* Get a C long int from a long int object. - Returns -1 and sets an error condition if overflow occurs. */ +/* Get a C long int from a long int object or any object that has an __int__ + method. + + On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of + the result. Otherwise *overflow is 0. + + For other errors (e.g., TypeError), return -1 and set an error condition. + In this case *overflow will be 0. +*/ long PyLong_AsLongAndOverflow(PyObject *vv, int *overflow) @@ -412,6 +419,9 @@ return res; } +/* Get a C long int from a long int object or any object that has an __int__ + method. Return -1 and set an error if overflow occurs. */ + long PyLong_AsLong(PyObject *obj) { @@ -923,7 +933,7 @@ } -/* Create a new long (or int) object from a C pointer */ +/* Create a new long int object from a C pointer */ PyObject * PyLong_FromVoidPtr(void *p) @@ -941,15 +951,11 @@ } -/* Get a C pointer from a long object (or an int object in some cases) */ +/* Get a C pointer from a long int object. */ void * PyLong_AsVoidPtr(PyObject *vv) { - /* This function will allow int or long objects. If vv is neither, - then the PyLong_AsLong*() functions will raise the exception: - PyExc_SystemError, "bad argument to internal function" - */ #if SIZEOF_VOID_P <= SIZEOF_LONG long x; @@ -1130,8 +1136,8 @@ return (PyObject *)v; } -/* Get a C PY_LONG_LONG int from a long int object. - Return -1 and set an error if overflow occurs. */ +/* Get a C long long int from a long int object or any object that has an + __int__ method. Return -1 and set an error if overflow occurs. */ PY_LONG_LONG PyLong_AsLongLong(PyObject *vv) @@ -1287,12 +1293,14 @@ } #undef IS_LITTLE_ENDIAN -/* Get a C long long int from a Python long or Python int object. - On overflow, returns -1 and sets *overflow to 1 or -1 depending - on the sign of the result. Otherwise *overflow is 0. - - For other errors (e.g., type error), returns -1 and sets an error - condition. +/* Get a C long long int from a long int object or any object that has an + __int__ method. + + On overflow, return -1 and set *overflow to 1 or -1 depending on the sign of + the result. Otherwise *overflow is 0. + + For other errors (e.g., TypeError), return -1 and set an error condition. + In this case *overflow will be 0. */ PY_LONG_LONG -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 20:33:32 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:32 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/8d0059c16ee7 changeset: 73106:8d0059c16ee7 branch: 3.2 parent: 73103:df24a8b57148 parent: 73100:52c98a729a71 user: Petri Lehtinen date: Mon Oct 24 21:24:58 2011 +0300 summary: merge heads files: Doc/library/2to3.rst | 4 +- Doc/library/socketserver.rst | 64 ++++++++++--------- Lib/multiprocessing/pool.py | 6 +- Lib/test/test_multiprocessing.py | 14 ++++ Misc/NEWS | 11 +++ Modules/arraymodule.c | 8 +- 6 files changed, 71 insertions(+), 36 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -348,7 +348,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -372,7 +372,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(self.data) # Likewise, self.wfile is a file-like object used to write back # to the client @@ -395,16 +395,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n","utf8")) + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(bytes(data + "\n", "utf-8")) - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = str(sock.recv(1024), "utf-8") + finally: + sock.close() - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look something like this: @@ -421,10 +423,10 @@ $ python TCPClient.py hello world with TCP Sent: hello world with TCP - Received: b'HELLO WORLD WITH TCP' + Received: HELLO WORLD WITH TCP $ python TCPClient.py python is nice Sent: python is nice - Received: b'PYTHON IS NICE' + Received: PYTHON IS NICE :class:`socketserver.UDPServer` Example @@ -445,7 +447,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print("%s wrote:" % self.client_address[0]) + print("{} wrote:".format(self.client_address[0])) print(data) socket.sendto(data.upper(), self.client_address) @@ -467,11 +469,11 @@ # As you can see, there is no connect() call; UDP has no connections. # Instead, data is directly sent to the recipient via sendto(). - sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT)) - received = sock.recv(1024) + sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT)) + received = str(sock.recv(1024), "utf-8") - print("Sent: %s" % data) - print("Received: %s" % received) + print("Sent: {}".format(data)) + print("Received: {}".format(received)) The output of the example should look exactly like for the TCP server example. @@ -491,9 +493,9 @@ class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler): def handle(self): - data = self.request.recv(1024) + data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() - response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii') + response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') self.request.send(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): @@ -502,10 +504,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print("Received: %s" % response) - sock.close() + try: + sock.send(bytes(message, 'ascii')) + response = str(sock.recv(1024), 'ascii') + print("Received: {}".format(response)) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -518,13 +522,13 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() print("Server loop running in thread:", server_thread.name) - client(ip, port, b"Hello World 1") - client(ip, port, b"Hello World 2") - client(ip, port, b"Hello World 3") + client(ip, port, "Hello World 1") + client(ip, port, "Hello World 2") + client(ip, port, "Hello World 3") server.shutdown() @@ -533,9 +537,9 @@ $ python ThreadedTCPServer.py Server loop running in thread: Thread-1 - Received: b"Thread-2: b'Hello World 1'" - Received: b"Thread-3: b'Hello World 2'" - Received: b"Thread-4: b'Hello World 3'" + Received: Thread-2: Hello World 1 + Received: Thread-3: Hello World 2 + Received: Thread-4: Hello World 3 The :class:`ForkingMixIn` class is used in the same way, except that the server diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1217,6 +1217,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,11 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + +- Issue #13255: wrong docstrings in array module. + - Issue #9168: now smtpd is able to bind privileged port. - Issue #12529: fix cgi.parse_header issue on strings with double-quotes and @@ -193,6 +198,12 @@ - Issue #12950: Fix passing file descriptors in multiprocessing, under OpenIndiana/Illumos. +Documentation +------------- + +- Issue #13141: Demonstrate recommended style for socketserver examples. + + What's New in Python 3.2.2? =========================== diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1484,7 +1484,7 @@ \n\ Extends this array with data from the unicode string ustr.\n\ The array must be a unicode type array; otherwise a ValueError\n\ -is raised. Use array.frombytes(ustr.decode(...)) to\n\ +is raised. Use array.frombytes(ustr.encode(...)) to\n\ append Unicode data to an array of some other type."); @@ -1506,7 +1506,7 @@ \n\ Convert the array to a unicode string. The array must be\n\ a unicode type array; otherwise a ValueError is raised. Use\n\ -array.tostring().decode() to obtain a unicode string from\n\ +array.tobytes().decode() to obtain a unicode string from\n\ an array of some other type."); @@ -2557,7 +2557,7 @@ extend() -- extend array by appending multiple elements from an iterable\n\ fromfile() -- read items from a file object\n\ fromlist() -- append items from the list\n\ -fromstring() -- append items from the string\n\ +frombytes() -- append items from the string\n\ index() -- return index of first occurrence of an object\n\ insert() -- insert a new item into the array at a provided position\n\ pop() -- remove and return item (default last)\n\ @@ -2565,7 +2565,7 @@ reverse() -- reverse the order of the items in the array\n\ tofile() -- write all items to a file object\n\ tolist() -- return the array converted to an ordinary list\n\ -tostring() -- return the array converted to a string\n\ +tobytes() -- return the array converted to a string\n\ \n\ Attributes:\n\ \n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 24 20:33:33 2011 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 24 Oct 2011 20:33:33 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/817946aadecb changeset: 73107:817946aadecb branch: 2.7 parent: 73102:5d7164febff1 parent: 73099:3465a9b2d25c user: Petri Lehtinen date: Mon Oct 24 21:29:20 2011 +0300 summary: merge heads files: Doc/library/2to3.rst | 4 +- Doc/library/socketserver.rst | 48 ++- Doc/library/subprocess.rst | 255 +++++++++++------- Lib/multiprocessing/pool.py | 6 +- Lib/test/test_multiprocessing.py | 14 + Misc/NEWS | 11 + 6 files changed, 220 insertions(+), 118 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -123,7 +123,9 @@ .. 2to3fixer:: callable Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding - an import to :mod:`collections` if needed. + an import to :mod:`collections` if needed. Note ``callable(x)`` has returned + in Python 3.2, so if you do not intend to support Python 3.1, you can disable + this fixer. .. 2to3fixer:: dict diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -225,6 +225,7 @@ desired. If :meth:`handle_request` receives no incoming requests within the timeout period, the :meth:`handle_timeout` method is called. + There are various server methods that can be overridden by subclasses of base server classes like :class:`TCPServer`; these methods aren't useful to external users of the server object. @@ -355,7 +356,7 @@ def handle(self): # self.request is the TCP socket connected to the client self.data = self.request.recv(1024).strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased self.request.send(self.data.upper()) @@ -379,7 +380,7 @@ # self.rfile is a file-like object created by the handler; # we can now use e.g. readline() instead of raw recv() calls self.data = self.rfile.readline().strip() - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print self.data # Likewise, self.wfile is a file-like object used to write back # to the client @@ -402,16 +403,18 @@ # Create a socket (SOCK_STREAM means a TCP socket) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - # Connect to server and send data - sock.connect((HOST, PORT)) - sock.send(data + "\n") + try: + # Connect to server and send data + sock.connect((HOST, PORT)) + sock.send(data + "\n") - # Receive data from the server and shut down - received = sock.recv(1024) - sock.close() + # Receive data from the server and shut down + received = sock.recv(1024) + finally: + sock.close() - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look something like this: @@ -452,7 +455,7 @@ def handle(self): data = self.request[0].strip() socket = self.request[1] - print "%s wrote:" % self.client_address[0] + print "{} wrote:".format(self.client_address[0]) print data socket.sendto(data.upper(), self.client_address) @@ -477,8 +480,8 @@ sock.sendto(data + "\n", (HOST, PORT)) received = sock.recv(1024) - print "Sent: %s" % data - print "Received: %s" % received + print "Sent: {}".format(data) + print "Received: {}".format(received) The output of the example should look exactly like for the TCP server example. @@ -499,8 +502,8 @@ def handle(self): data = self.request.recv(1024) - cur_thread = threading.currentThread() - response = "%s: %s" % (cur_thread.getName(), data) + cur_thread = threading.current_thread() + response = "{}: {}".format(cur_thread.name, data) self.request.send(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): @@ -509,10 +512,12 @@ def client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) - sock.send(message) - response = sock.recv(1024) - print "Received: %s" % response - sock.close() + try: + sock.send(message) + response = sock.recv(1024) + print "Received: {}".format(response) + finally: + sock.close() if __name__ == "__main__": # Port 0 means to select an arbitrary unused port @@ -525,9 +530,9 @@ # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates - server_thread.setDaemon(True) + server_thread.daemon = True server_thread.start() - print "Server loop running in thread:", server_thread.getName() + print "Server loop running in thread:", server_thread.name client(ip, port, "Hello World 1") client(ip, port, "Hello World 2") @@ -535,6 +540,7 @@ server.shutdown() + The output of the example should look something like this:: $ python ThreadedTCPServer.py diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -31,7 +31,142 @@ Using the subprocess Module --------------------------- -This module defines one class called :class:`Popen`: +The recommended interface to this module is to use the following convenience +functions for all use cases they can handle. For more advanced use cases, the +underlying :class:`Popen` interface can be used directly. + + +.. function:: call(args, *, stdin=None, stdout=None, stderr=None) + + Run the command described by *args*. Wait for command to complete, then + return the :attr:`returncode` attribute. + + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments`. The full function signature is the + same as that of the :class:`Popen` constructor - the convenience functions + pass all supplied arguments directly through to that interface. + + Examples:: + + >>> subprocess.call(["ls", "-l"]) + 0 + + >>> subprocess.call(["python", "-c", "import sys; sys.exit(1)"]) + 1 + + .. warning:: + + Like :meth:`Popen.wait`, this will deadlock when using + ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process + generates enough output to a pipe such that it blocks waiting + for the OS pipe buffer to accept more data. + + +.. function:: check_call(*callargs, **kwargs) + + Run command with arguments. Wait for command to complete. If the return + code was zero then return, otherwise raise :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute. + + The arguments are the same as for :func:`call`. Examples:: + + >>> subprocess.check_call(["ls", "-l"]) + 0 + + >>> subprocess.check_call(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + .. versionadded:: 2.5 + + .. warning:: + + See the warning for :func:`call`. + + +.. function:: check_output(*callargs, **kwargs) + + Run command with arguments and return its output as a byte string. + + If the return code was non-zero it raises a :exc:`CalledProcessError`. The + :exc:`CalledProcessError` object will have the return code in the + :attr:`returncode` attribute and any output in the :attr:`output` + attribute. + + Examples:: + + >>> subprocess.check_output(["ls", "-l", "/dev/null"]) + 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' + + >>> subprocess.check_output(["python", "-c", "import sys; sys.exit(1)"]) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + + The arguments are the same as for :func:`call`, except that *stdout* is + not allowed as it is used internally. To also capture standard error in + the result, use ``stderr=subprocess.STDOUT``:: + + >>> subprocess.check_output( + ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], + ... stderr=subprocess.STDOUT) + 'ls: non_existent_file: No such file or directory\n' + + .. versionadded:: 2.7 + + +.. data:: PIPE + + Special value that can be used as the *stdin*, *stdout* or *stderr* argument + to :class:`Popen` and indicates that a pipe to the standard stream should be + opened. + + +.. data:: STDOUT + + Special value that can be used as the *stderr* argument to :class:`Popen` and + indicates that standard error should go into the same handle as standard + output. + + +.. _frequently-used-arguments: + +Frequently Used Arguments +^^^^^^^^^^^^^^^^^^^^^^^^^ + +To support a wide variety of use cases, the :class:`Popen` constructor (and +the convenience functions) accept a large number of optional arguments. For +most typical use cases, many of these arguments can be safely left at their +default values. The arguments that are most commonly needed are: + + *args* should be a string, or a sequence of program arguments. Providing + a sequence of arguments is generally preferred, as it allows the module to + take care of any required escaping and quoting of arguments (e.g. to permit + spaces in file names) + + *stdin*, *stdout* and *stderr* specify the executed program's standard input, + standard output and standard error file handles, respectively. Valid values + are :data:`PIPE`, an existing file descriptor (a positive integer), an + existing file object, and ``None``. :data:`PIPE` indicates that a new pipe + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. + +These options, along with all of the other options, are described in more +detail in the :class:`Popen` constructor documentation. + + +Popen Constuctor +^^^^^^^^^^^^^^^^ + +The underlying process creation and management in this module is handled by +the :class:`Popen` class. It offers a lot of flexibility so that developers +are able to handle the less common cases not covered by the convenience +functions. .. class:: Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0) @@ -126,14 +261,15 @@ You don't need ``shell=True`` to run a batch file, nor to run a console-based executable. - *stdin*, *stdout* and *stderr* specify the executed programs' standard input, + *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values are :data:`PIPE`, an existing file descriptor (a positive integer), an existing file object, and ``None``. :data:`PIPE` indicates that a new pipe - to the child should be created. With ``None``, no redirection will occur; - the child's file handles will be inherited from the parent. Additionally, - *stderr* can be :data:`STDOUT`, which indicates that the stderr data from the - applications should be captured into the same file handle as for stdout. + to the child should be created. With the default settings of ``None``, no + redirection will occur; the child's file handles will be inherited from the + parent. Additionally, *stderr* can be :data:`STDOUT`, which indicates that + the stderr data from the child process should be captured into the same file + handle as for stdout. If *preexec_fn* is set to a callable object, this object will be called in the child process just before the child is executed. (Unix only) @@ -184,87 +320,6 @@ :data:`CREATE_NEW_PROCESS_GROUP`. (Windows only) -.. data:: PIPE - - Special value that can be used as the *stdin*, *stdout* or *stderr* argument - to :class:`Popen` and indicates that a pipe to the standard stream should be - opened. - - -.. data:: STDOUT - - Special value that can be used as the *stderr* argument to :class:`Popen` and - indicates that standard error should go into the same handle as standard - output. - - -Convenience Functions -^^^^^^^^^^^^^^^^^^^^^ - -This module also defines the following shortcut functions: - - -.. function:: call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete, then return the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> retcode = subprocess.call(["ls", "-l"]) - - .. warning:: - - Like :meth:`Popen.wait`, this will deadlock when using - ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process - generates enough output to a pipe such that it blocks waiting - for the OS pipe buffer to accept more data. - - -.. function:: check_call(*popenargs, **kwargs) - - Run command with arguments. Wait for command to complete. If the exit code was - zero then return, otherwise raise :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_call(["ls", "-l"]) - 0 - - .. versionadded:: 2.5 - - .. warning:: - - See the warning for :func:`call`. - - -.. function:: check_output(*popenargs, **kwargs) - - Run command with arguments and return its output as a byte string. - - If the exit code was non-zero it raises a :exc:`CalledProcessError`. The - :exc:`CalledProcessError` object will have the return code in the - :attr:`returncode` - attribute and output in the :attr:`output` attribute. - - The arguments are the same as for the :class:`Popen` constructor. Example:: - - >>> subprocess.check_output(["ls", "-l", "/dev/null"]) - 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' - - The stdout argument is not allowed as it is used internally. - To capture standard error in the result, use ``stderr=subprocess.STDOUT``:: - - >>> subprocess.check_output( - ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], - ... stderr=subprocess.STDOUT) - 'ls: non_existent_file: No such file or directory\n' - - .. versionadded:: 2.7 - - Exceptions ^^^^^^^^^^ @@ -523,12 +578,15 @@ Replacing Older Functions with the subprocess Module ---------------------------------------------------- -In this section, "a ==> b" means that b can be used as a replacement for a. +In this section, "a becomes b" means that b can be used as a replacement for a. .. note:: All functions in this section fail (more or less) silently if the executed - program cannot be found; this module raises an :exc:`OSError` exception. + program cannot be found; this module raises an :exc:`OSError` exception. In + addition, the replacements using :func:`check_output` will fail with a + :exc:`CalledProcessError` if the requested operation produces a non-zero + return code. In the following examples, we assume that the subprocess module is imported with "from subprocess import \*". @@ -540,8 +598,8 @@ :: output=`mycmd myarg` - ==> - output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] + # becomes + output = check_output(["mycmd", "myarg"]) Replacing shell pipeline @@ -550,7 +608,7 @@ :: output=`dmesg | grep hda` - ==> + # becomes p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. @@ -559,15 +617,22 @@ The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1. +Alternatively, for trusted input, the shell's pipeline may still be used +directly: + + output=`dmesg | grep hda` + # becomes + output=check_output("dmesg | grep hda", shell=True) + + Replacing :func:`os.system` ^^^^^^^^^^^^^^^^^^^^^^^^^^^ :: sts = os.system("mycmd" + " myarg") - ==> - p = Popen("mycmd" + " myarg", shell=True) - sts = os.waitpid(p.pid, 0)[1] + # becomes + sts = call("mycmd" + " myarg", shell=True) Notes: diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -294,7 +294,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1168,6 +1168,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -69,6 +69,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #1548891: The cStringIO.StringIO() constructor now encodes unicode arguments with the system default encoding just like the write() method does, instead of converting it to a raw buffer. This also fixes handling of @@ -345,6 +348,14 @@ - Issue #12057: Add tests for ISO 2022 codecs (iso2022_jp, iso2022_jp_2, iso2022_kr). +Documentation +------------- + +- Issue #13237: Reorganise subprocess documentation to emphasise convenience + functions and the most commonly needed arguments to Popen. + +- Issue #13141: Demonstrate recommended style for SocketServer examples. + What's New in Python 2.7.2? =========================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 00:26:35 2011 From: python-checkins at python.org (vinay.sajip) Date: Tue, 25 Oct 2011 00:26:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Closes_=2313232?= =?utf8?q?=3A_Handle_multiple_encodings_in_exception_logging=2E?= Message-ID: http://hg.python.org/cpython/rev/4bb1dc4e2cec changeset: 73108:4bb1dc4e2cec branch: 2.7 user: Vinay Sajip date: Mon Oct 24 23:23:02 2011 +0100 summary: Closes #13232: Handle multiple encodings in exception logging. files: Lib/logging/__init__.py | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -478,8 +478,12 @@ except UnicodeError: # Sometimes filenames have non-ASCII chars, which can lead # to errors when s is Unicode and record.exc_text is str - # See issue 8924 - s = s + record.exc_text.decode(sys.getfilesystemencoding()) + # See issue 8924. + # We also use replace for when there are multiple + # encodings, e.g. UTF-898 for the filesystem and latin-1 + # for a script. See issue 13232. + s = s + record.exc_text.decode(sys.getfilesystemencoding(), + 'replace') return s # -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 00:26:36 2011 From: python-checkins at python.org (vinay.sajip) Date: Tue, 25 Oct 2011 00:26:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Updated_NEWS_wi?= =?utf8?q?th_fix_for_13232=2E?= Message-ID: http://hg.python.org/cpython/rev/fc91e02f305e changeset: 73109:fc91e02f305e branch: 2.7 user: Vinay Sajip date: Mon Oct 24 23:26:00 2011 +0100 summary: Updated NEWS with fix for 13232. files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -69,6 +69,9 @@ Library ------- +- Issue #13232: logging: Improved logging of exceptions in the presence of + multiple encodings. + - Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 00:26:38 2011 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 25 Oct 2011 00:26:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_test=5Fimp_failure_unde?= =?utf8?q?r_Windows?= Message-ID: http://hg.python.org/cpython/rev/63ffa07f9258 changeset: 73110:63ffa07f9258 parent: 73105:2358a46b621e user: Antoine Pitrou date: Tue Oct 25 00:21:02 2011 +0200 summary: Fix test_imp failure under Windows files: Python/import.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -938,12 +938,19 @@ Py_ssize_t pycache_len = sizeof(CACHEDIR) - 1; int kind; void *data; + Py_UCS4 lastsep; /* Compute the output string size. */ len = PyUnicode_GET_LENGTH(pathstr); /* If there is no separator, this returns -1, so - lastsep will be 0. */ + fname will be 0. */ fname = rightmost_sep_obj(pathstr, 0, len) + 1; + /* Windows: re-use the last separator character (/ or \\) when + appending the __pycache__ path. */ + if (fname > 0) + lastsep = PyUnicode_READ_CHAR(pathstr, fname -1); + else + lastsep = SEP; ext = fname - 1; for(i = fname; i < len; i++) if (PyUnicode_READ_CHAR(pathstr, i) == '.') @@ -965,7 +972,7 @@ pos = fname; for (i = 0; i < pycache_len; i++) PyUnicode_WRITE(kind, data, pos++, CACHEDIR[i]); - PyUnicode_WRITE(kind, data, pos++, SEP); + PyUnicode_WRITE(kind, data, pos++, lastsep); PyUnicode_CopyCharacters(result, pos, pathstr, fname, ext - fname); pos += ext - fname; -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Oct 25 05:34:27 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 25 Oct 2011 05:34:27 +0200 Subject: [Python-checkins] Daily reference leaks (63ffa07f9258): sum=0 Message-ID: results for 63ffa07f9258 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog6xMeVC', '-x'] From python-checkins at python.org Tue Oct 25 06:07:17 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 25 Oct 2011 06:07:17 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogZG9jdW1lbnQgX19i?= =?utf8?q?ytes=5F=5F_special_method_=28closes_=2313259=29?= Message-ID: http://hg.python.org/cpython/rev/199d9e3fe0ce changeset: 73111:199d9e3fe0ce branch: 3.2 parent: 73097:d9571fb37269 user: Benjamin Peterson date: Tue Oct 25 00:03:51 2011 -0400 summary: document __bytes__ special method (closes #13259) files: Doc/reference/datamodel.rst | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1157,6 +1157,14 @@ .. XXX what about subclasses of string? +.. method:: object.__bytes__(self) + + .. index:: builtin: bytes + + Called by :func:`bytes` to compute a byte-string representation of an + object. This should return a ``bytes`` object. + + .. method:: object.__format__(self, format_spec) .. index:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 06:07:18 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 25 Oct 2011 06:07:18 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?b?OiBtZXJnZSAzLjIgKCMxMzI1OSk=?= Message-ID: http://hg.python.org/cpython/rev/4128de054937 changeset: 73112:4128de054937 parent: 73098:9d8a14a550a3 parent: 73111:199d9e3fe0ce user: Benjamin Peterson date: Tue Oct 25 00:04:10 2011 -0400 summary: merge 3.2 (#13259) files: Doc/reference/datamodel.rst | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1157,6 +1157,14 @@ .. XXX what about subclasses of string? +.. method:: object.__bytes__(self) + + .. index:: builtin: bytes + + Called by :func:`bytes` to compute a byte-string representation of an + object. This should return a ``bytes`` object. + + .. method:: object.__format__(self, format_spec) .. index:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 06:07:19 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 25 Oct 2011 06:07:19 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/b0aabf83afb6 changeset: 73113:b0aabf83afb6 branch: 3.2 parent: 73111:199d9e3fe0ce parent: 73106:8d0059c16ee7 user: Benjamin Peterson date: Tue Oct 25 00:04:37 2011 -0400 summary: merge heads files: Lib/multiprocessing/pool.py | 6 +++++- Lib/test/test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 6 ++++++ Objects/dictobject.c | 16 ++++++++++++---- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1217,6 +1217,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13018: Fix reference leaks in error paths in dictobject.c. + Patch by Suman Saha. + - Issue #1294232: In a few cases involving metaclass inheritance, the interpreter would sometimes invoke the wrong metaclass when building a new class object. These cases now behave correctly. Patch by Daniel Urban. @@ -58,6 +61,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #13255: wrong docstrings in array module. - Issue #9168: now smtpd is able to bind privileged port. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1314,14 +1314,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, Py_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } @@ -1332,14 +1336,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, PySet_GET_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PySet_NextEntry(seq, &pos, &key, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 06:07:20 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 25 Oct 2011 06:07:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/82f720480ae1 changeset: 73114:82f720480ae1 parent: 73112:4128de054937 parent: 73110:63ffa07f9258 user: Benjamin Peterson date: Tue Oct 25 00:06:15 2011 -0400 summary: merge heads files: Lib/multiprocessing/pool.py | 6 +++++- Lib/test/test_multiprocessing.py | 14 ++++++++++++++ Misc/NEWS | 6 ++++++ Objects/dictobject.c | 16 ++++++++++++---- Python/import.c | 11 +++++++++-- 5 files changed, 46 insertions(+), 7 deletions(-) diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -321,7 +321,11 @@ @staticmethod def _handle_workers(pool): - while pool._worker_handler._state == RUN and pool._state == RUN: + thread = threading.current_thread() + + # Keep maintaining workers until the cache gets drained, unless the pool + # is terminated. + while thread._state == RUN or (pool._cache and thread._state != TERMINATE): pool._maintain_pool() time.sleep(0.1) # send sentinel to stop workers diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1266,6 +1266,20 @@ p.close() p.join() + def test_pool_worker_lifetime_early_close(self): + # Issue #10332: closing a pool whose workers have limited lifetimes + # before all the tasks completed would make join() hang. + p = multiprocessing.Pool(3, maxtasksperchild=1) + results = [] + for i in range(6): + results.append(p.apply_async(sqr, (i, 0.3))) + p.close() + p.join() + # check the results + for (j, res) in enumerate(results): + self.assertEqual(res.get(), sqr(j)) + + # # Test that manager has expected number of shared objects left # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13018: Fix reference leaks in error paths in dictobject.c. + Patch by Suman Saha. + - Issue #13201: Define '==' and '!=' to compare range objects based on the sequence of values they define (instead of comparing based on object identity). @@ -338,6 +341,9 @@ Library ------- +- Issue #10332: multiprocessing: fix a race condition when a Pool is closed + before all tasks have completed. + - Issue #13255: wrong docstrings in array module. - Issue #8540: Remove deprecated Context._clamp attribute in Decimal module. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -1314,14 +1314,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, Py_SIZE(seq))) + if (dictresize(mp, Py_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PyDict_Next(seq, &pos, &key, &oldvalue, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } @@ -1332,14 +1336,18 @@ PyObject *key; Py_hash_t hash; - if (dictresize(mp, PySet_GET_SIZE(seq))) + if (dictresize(mp, PySet_GET_SIZE(seq))) { + Py_DECREF(d); return NULL; + } while (_PySet_NextEntry(seq, &pos, &key, &hash)) { Py_INCREF(key); Py_INCREF(value); - if (insertdict(mp, key, hash, value)) + if (insertdict(mp, key, hash, value)) { + Py_DECREF(d); return NULL; + } } return d; } diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -938,12 +938,19 @@ Py_ssize_t pycache_len = sizeof(CACHEDIR) - 1; int kind; void *data; + Py_UCS4 lastsep; /* Compute the output string size. */ len = PyUnicode_GET_LENGTH(pathstr); /* If there is no separator, this returns -1, so - lastsep will be 0. */ + fname will be 0. */ fname = rightmost_sep_obj(pathstr, 0, len) + 1; + /* Windows: re-use the last separator character (/ or \\) when + appending the __pycache__ path. */ + if (fname > 0) + lastsep = PyUnicode_READ_CHAR(pathstr, fname -1); + else + lastsep = SEP; ext = fname - 1; for(i = fname; i < len; i++) if (PyUnicode_READ_CHAR(pathstr, i) == '.') @@ -965,7 +972,7 @@ pos = fname; for (i = 0; i < pycache_len; i++) PyUnicode_WRITE(kind, data, pos++, CACHEDIR[i]); - PyUnicode_WRITE(kind, data, pos++, SEP); + PyUnicode_WRITE(kind, data, pos++, lastsep); PyUnicode_CopyCharacters(result, pos, pathstr, fname, ext - fname); pos += ext - fname; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 06:07:21 2011 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 25 Oct 2011 06:07:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/b81f400b2f88 changeset: 73115:b81f400b2f88 parent: 73114:82f720480ae1 parent: 73113:b0aabf83afb6 user: Benjamin Peterson date: Tue Oct 25 00:07:05 2011 -0400 summary: merge 3.2 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 08:23:50 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 08:23:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2313251=3A_update_string_d?= =?utf8?q?escription_in_datamodel=2Erst=2E?= Message-ID: http://hg.python.org/cpython/rev/11d18ebb2dd1 changeset: 73116:11d18ebb2dd1 user: Ezio Melotti date: Tue Oct 25 09:23:42 2011 +0300 summary: #13251: update string description in datamodel.rst. files: Doc/reference/datamodel.rst | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -276,16 +276,16 @@ single: integer single: Unicode - The items of a string object are Unicode code units. A Unicode code - unit is represented by a string object of one item and can hold either - a 16-bit or 32-bit value representing a Unicode ordinal (the maximum - value for the ordinal is given in ``sys.maxunicode``, and depends on - how Python is configured at compile time). Surrogate pairs may be - present in the Unicode object, and will be reported as two separate - items. The built-in functions :func:`chr` and :func:`ord` convert - between code units and nonnegative integers representing the Unicode - ordinals as defined in the Unicode Standard 3.0. Conversion from and to - other encodings are possible through the string method :meth:`encode`. + A string is a sequence of values that represent Unicode codepoints. + All the codepoints in range ``U+0000 - U+10FFFF`` can be represented + in a string. Python doesn't have a :c:type:`chr` type, and + every characters in the string is represented as a string object + with length ``1``. The built-in function :func:`chr` converts a + character to its codepoint (as an integer); :func:`ord` converts + an integer in range ``0 - 10FFFF`` to the corresponding character. + :meth:`str.encode` can be used to convert a :class:`str` to + :class:`bytes` using the given encoding, and :meth:`bytes.decode` can + be used to achieve the opposite. Tuples .. index:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 08:33:07 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 08:33:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_mention_of_narrow/wi?= =?utf8?q?de_builds_from_ord/chr_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/e03784770ae1 changeset: 73117:e03784770ae1 user: Ezio Melotti date: Tue Oct 25 09:32:34 2011 +0300 summary: Remove mention of narrow/wide builds from ord/chr doc. files: Doc/library/functions.rst | 9 +-------- 1 files changed, 1 insertions(+), 8 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -152,10 +152,6 @@ 1,114,111 (0x10FFFF in base 16). :exc:`ValueError` will be raised if *i* is outside that range. - Note that on narrow Unicode builds, the result is a string of - length two for *i* greater than 65,535 (0xFFFF in hexadecimal). - - .. function:: classmethod(function) @@ -919,14 +915,11 @@ .. XXX works for bytes too, but should it? .. function:: ord(c) - Given a string representing one Uncicode character, return an integer + Given a string representing one Unicode character, return an integer representing the Unicode code point of that character. For example, ``ord('a')`` returns the integer ``97`` and ``ord('\u2020')`` returns ``8224``. This is the inverse of :func:`chr`. - On wide Unicode builds, if the argument length is not one, a - :exc:`TypeError` will be raised. On narrow Unicode builds, strings - of length two are accepted when they form a UTF-16 surrogate pair. .. function:: pow(x, y[, z]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 08:42:09 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 08:42:09 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogRml4IHR5cG8u?= Message-ID: http://hg.python.org/cpython/rev/acaca0975a41 changeset: 73118:acaca0975a41 branch: 3.2 parent: 73113:b0aabf83afb6 user: Ezio Melotti date: Tue Oct 25 09:41:13 2011 +0300 summary: Fix typo. files: Doc/library/functions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -916,7 +916,7 @@ .. XXX works for bytes too, but should it? .. function:: ord(c) - Given a string representing one Uncicode character, return an integer + Given a string representing one Unicode character, return an integer representing the Unicode code point of that character. For example, ``ord('a')`` returns the integer ``97`` and ``ord('\u2020')`` returns ``8224``. This is the inverse of :func:`chr`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 08:42:10 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 08:42:10 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/a50f080c22ca changeset: 73119:a50f080c22ca parent: 73117:e03784770ae1 parent: 73118:acaca0975a41 user: Ezio Melotti date: Tue Oct 25 09:42:01 2011 +0300 summary: Null merge with 3.2. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 09:05:43 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 09:05:43 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_mention_of_narrow/wi?= =?utf8?q?de_builds_and_update_array_doc=2C_add_a_test=2E?= Message-ID: http://hg.python.org/cpython/rev/98c0265cf7b9 changeset: 73120:98c0265cf7b9 user: Ezio Melotti date: Tue Oct 25 10:05:34 2011 +0300 summary: Remove mention of narrow/wide builds and update array doc, add a test. files: Doc/library/array.rst | 10 +++------- Lib/test/test_array.py | 3 ++- Modules/arraymodule.c | 5 +---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/Doc/library/array.rst b/Doc/library/array.rst --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -21,7 +21,7 @@ +-----------+--------------------+-------------------+-----------------------+-------+ | ``'B'`` | unsigned char | int | 1 | | +-----------+--------------------+-------------------+-----------------------+-------+ -| ``'u'`` | Py_UNICODE | Unicode character | 2 | \(1) | +| ``'u'`` | Py_UCS4 | Unicode character | 4 | | +-----------+--------------------+-------------------+-----------------------+-------+ | ``'h'`` | signed short | int | 2 | | +-----------+--------------------+-------------------+-----------------------+-------+ @@ -35,9 +35,9 @@ +-----------+--------------------+-------------------+-----------------------+-------+ | ``'L'`` | unsigned long | int | 4 | | +-----------+--------------------+-------------------+-----------------------+-------+ -| ``'q'`` | signed long long | int | 8 | \(2) | +| ``'q'`` | signed long long | int | 8 | \(1) | +-----------+--------------------+-------------------+-----------------------+-------+ -| ``'Q'`` | unsigned long long | int | 8 | \(2) | +| ``'Q'`` | unsigned long long | int | 8 | \(1) | +-----------+--------------------+-------------------+-----------------------+-------+ | ``'f'`` | float | float | 4 | | +-----------+--------------------+-------------------+-----------------------+-------+ @@ -47,10 +47,6 @@ Notes: (1) - The ``'u'`` type code corresponds to Python's unicode character. On narrow - Unicode builds this is 2-bytes, on wide builds this is 4-bytes. - -(2) The ``'q'`` and ``'Q'`` type codes are available only if the platform C compiler used to build Python supports C :c:type:`long long`, or, on Windows, :c:type:`__int64`. diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1015,7 +1015,7 @@ smallerexample = '\x01\u263a\x00\ufefe' biggerexample = '\x01\u263a\x01\ufeff' outside = str('\x33') - minitemsize = 2 + minitemsize = 4 def test_unicode(self): self.assertRaises(TypeError, array.array, 'b', 'foo') @@ -1027,6 +1027,7 @@ a.fromunicode('\x11abc\xff\u1234') s = a.tounicode() self.assertEqual(s, '\xa0\xc2\u1234 \x11abc\xff\u1234') + self.assertEqual(a.itemsize, 4) s = '\x00="\'a\\b\x80\xff\u0000\u0001\u1234' a = array.array('u', s) diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2593,7 +2593,7 @@ Type code C Type Minimum size in bytes \n\ 'b' signed integer 1 \n\ 'B' unsigned integer 1 \n\ - 'u' Unicode character 2 (see note) \n\ + 'u' Unicode character 4 \n\ 'h' signed integer 2 \n\ 'H' unsigned integer 2 \n\ 'i' signed integer 2 \n\ @@ -2605,9 +2605,6 @@ 'f' floating point 4 \n\ 'd' floating point 8 \n\ \n\ -NOTE: The 'u' type code corresponds to Python's unicode character. On \n\ -narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\ -\n\ NOTE: The 'q' and 'Q' type codes are only available if the platform \n\ C compiler used to build Python supports 'long long', or, on Windows, \n\ '__int64'.\n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 09:30:28 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 09:30:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_mention_of_narrow/wi?= =?utf8?q?de_builds_in_the_codecs_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/fba06e791d62 changeset: 73121:fba06e791d62 user: Ezio Melotti date: Tue Oct 25 10:30:19 2011 +0300 summary: Remove mention of narrow/wide builds in the codecs doc. files: Doc/library/codecs.rst | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -787,11 +787,9 @@ Encodings and Unicode --------------------- -Strings are stored internally as sequences of codepoints (to be precise -as :c:type:`Py_UNICODE` arrays). Depending on the way Python is compiled (either -via ``--without-wide-unicode`` or ``--with-wide-unicode``, with the -former being the default) :c:type:`Py_UNICODE` is either a 16-bit or 32-bit data -type. Once a string object is used outside of CPU and memory, CPU endianness +Strings are stored internally as sequences of codepoints in range ``0 - 10FFFF`` +(see :pep:`393` for more details about the implementation). +Once a string object is used outside of CPU and memory, CPU endianness and how these arrays are stored as bytes become an issue. Transforming a string object into a sequence of bytes is called encoding and recreating the string object from the sequence of bytes is known as decoding. There are many -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 09:46:31 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 09:46:31 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Refactor_a_bit_?= =?utf8?q?the_codecs_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/03ef6108beae changeset: 73122:03ef6108beae branch: 3.2 parent: 73118:acaca0975a41 user: Ezio Melotti date: Tue Oct 25 10:40:38 2011 +0300 summary: Refactor a bit the codecs doc. files: Doc/library/codecs.rst | 40 +++++++++++++++-------------- 1 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -810,27 +810,28 @@ Windows). There's a string constant with 256 characters that shows you which character is mapped to which byte value. -All of these encodings can only encode 256 of the 65536 (or 1114111) codepoints +All of these encodings can only encode 256 of the 1114112 codepoints defined in Unicode. A simple and straightforward way that can store each Unicode -code point, is to store each codepoint as two consecutive bytes. There are two -possibilities: Store the bytes in big endian or in little endian order. These -two encodings are called UTF-16-BE and UTF-16-LE respectively. Their -disadvantage is that if e.g. you use UTF-16-BE on a little endian machine you -will always have to swap bytes on encoding and decoding. UTF-16 avoids this -problem: Bytes will always be in natural endianness. When these bytes are read +code point, is to store each codepoint as four consecutive bytes. There are two +possibilities: store the bytes in big endian or in little endian order. These +two encodings are called ``UTF-32-BE`` and ``UTF-32-LE`` respectively. Their +disadvantage is that if e.g. you use ``UTF-32-BE`` on a little endian machine you +will always have to swap bytes on encoding and decoding. ``UTF-32`` avoids this +problem: bytes will always be in natural endianness. When these bytes are read by a CPU with a different endianness, then bytes have to be swapped though. To -be able to detect the endianness of a UTF-16 byte sequence, there's the so -called BOM (the "Byte Order Mark"). This is the Unicode character ``U+FEFF``. -This character will be prepended to every UTF-16 byte sequence. The byte swapped -version of this character (``0xFFFE``) is an illegal character that may not -appear in a Unicode text. So when the first character in an UTF-16 byte sequence +be able to detect the endianness of a ``UTF-16`` or ``UTF-32`` byte sequence, +there's the so called BOM ("Byte Order Mark"). This is the Unicode character +``U+FEFF``. This character can be prepended to every ``UTF-16`` or ``UTF-32`` +byte sequence. The byte swapped version of this character (``0xFFFE``) is an +illegal character that may not appear in a Unicode text. So when the +first character in an ``UTF-16`` or ``UTF-32`` byte sequence appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. -Unfortunately upto Unicode 4.0 the character ``U+FEFF`` had a second purpose as -a ``ZERO WIDTH NO-BREAK SPACE``: A character that has no width and doesn't allow +Unfortunately the character ``U+FEFF`` had a second purpose as +a ``ZERO WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow a word to be split. It can e.g. be used to give hints to a ligature algorithm. With Unicode 4.0 using ``U+FEFF`` as a ``ZERO WIDTH NO-BREAK SPACE`` has been deprecated (with ``U+2060`` (``WORD JOINER``) assuming this role). Nevertheless -Unicode software still must be able to handle ``U+FEFF`` in both roles: As a BOM +Unicode software still must be able to handle ``U+FEFF`` in both roles: as a BOM it's a device to determine the storage layout of the encoded bytes, and vanishes once the byte sequence has been decoded into a string; as a ``ZERO WIDTH NO-BREAK SPACE`` it's a normal character that will be decoded like any other. @@ -838,7 +839,7 @@ There's another encoding that is able to encoding the full range of Unicode characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two -parts: Marker bits (the most significant bits) and payload bits. The marker bits +parts: marker bits (the most significant bits) and payload bits. The marker bits are a sequence of zero to four ``1`` bits followed by a ``0`` bit. Unicode characters are encoded like this (with x being payload bits, which when concatenated give the Unicode character): @@ -877,13 +878,14 @@ | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK | INVERTED QUESTION MARK -in iso-8859-1), this increases the probability that a utf-8-sig encoding can be +in iso-8859-1), this increases the probability that a ``utf-8-sig`` encoding can be correctly guessed from the byte sequence. So here the BOM is not used to be able to determine the byte order used for generating the byte sequence, but as a signature that helps in guessing the encoding. On encoding the utf-8-sig codec will write ``0xef``, ``0xbb``, ``0xbf`` as the first three bytes to the file. On -decoding utf-8-sig will skip those three bytes if they appear as the first three -bytes in the file. +decoding ``utf-8-sig`` will skip those three bytes if they appear as the first +three bytes in the file. In UTF-8, the use of the BOM is discouraged and +should generally be avoided. .. _standard-encodings: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 09:46:32 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 09:46:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_the_codecs_doc_refactoring_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/3c4b7ecc2db7 changeset: 73123:3c4b7ecc2db7 parent: 73121:fba06e791d62 parent: 73122:03ef6108beae user: Ezio Melotti date: Tue Oct 25 10:41:37 2011 +0300 summary: Merge the codecs doc refactoring with 3.2. files: Doc/library/codecs.rst | 40 +++++++++++++++-------------- 1 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -809,27 +809,28 @@ Windows). There's a string constant with 256 characters that shows you which character is mapped to which byte value. -All of these encodings can only encode 256 of the 65536 (or 1114111) codepoints +All of these encodings can only encode 256 of the 1114112 codepoints defined in Unicode. A simple and straightforward way that can store each Unicode -code point, is to store each codepoint as two consecutive bytes. There are two -possibilities: Store the bytes in big endian or in little endian order. These -two encodings are called UTF-16-BE and UTF-16-LE respectively. Their -disadvantage is that if e.g. you use UTF-16-BE on a little endian machine you -will always have to swap bytes on encoding and decoding. UTF-16 avoids this -problem: Bytes will always be in natural endianness. When these bytes are read +code point, is to store each codepoint as four consecutive bytes. There are two +possibilities: store the bytes in big endian or in little endian order. These +two encodings are called ``UTF-32-BE`` and ``UTF-32-LE`` respectively. Their +disadvantage is that if e.g. you use ``UTF-32-BE`` on a little endian machine you +will always have to swap bytes on encoding and decoding. ``UTF-32`` avoids this +problem: bytes will always be in natural endianness. When these bytes are read by a CPU with a different endianness, then bytes have to be swapped though. To -be able to detect the endianness of a UTF-16 byte sequence, there's the so -called BOM (the "Byte Order Mark"). This is the Unicode character ``U+FEFF``. -This character will be prepended to every UTF-16 byte sequence. The byte swapped -version of this character (``0xFFFE``) is an illegal character that may not -appear in a Unicode text. So when the first character in an UTF-16 byte sequence +be able to detect the endianness of a ``UTF-16`` or ``UTF-32`` byte sequence, +there's the so called BOM ("Byte Order Mark"). This is the Unicode character +``U+FEFF``. This character can be prepended to every ``UTF-16`` or ``UTF-32`` +byte sequence. The byte swapped version of this character (``0xFFFE``) is an +illegal character that may not appear in a Unicode text. So when the +first character in an ``UTF-16`` or ``UTF-32`` byte sequence appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. -Unfortunately upto Unicode 4.0 the character ``U+FEFF`` had a second purpose as -a ``ZERO WIDTH NO-BREAK SPACE``: A character that has no width and doesn't allow +Unfortunately the character ``U+FEFF`` had a second purpose as +a ``ZERO WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow a word to be split. It can e.g. be used to give hints to a ligature algorithm. With Unicode 4.0 using ``U+FEFF`` as a ``ZERO WIDTH NO-BREAK SPACE`` has been deprecated (with ``U+2060`` (``WORD JOINER``) assuming this role). Nevertheless -Unicode software still must be able to handle ``U+FEFF`` in both roles: As a BOM +Unicode software still must be able to handle ``U+FEFF`` in both roles: as a BOM it's a device to determine the storage layout of the encoded bytes, and vanishes once the byte sequence has been decoded into a string; as a ``ZERO WIDTH NO-BREAK SPACE`` it's a normal character that will be decoded like any other. @@ -837,7 +838,7 @@ There's another encoding that is able to encoding the full range of Unicode characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two -parts: Marker bits (the most significant bits) and payload bits. The marker bits +parts: marker bits (the most significant bits) and payload bits. The marker bits are a sequence of zero to four ``1`` bits followed by a ``0`` bit. Unicode characters are encoded like this (with x being payload bits, which when concatenated give the Unicode character): @@ -876,13 +877,14 @@ | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK | INVERTED QUESTION MARK -in iso-8859-1), this increases the probability that a utf-8-sig encoding can be +in iso-8859-1), this increases the probability that a ``utf-8-sig`` encoding can be correctly guessed from the byte sequence. So here the BOM is not used to be able to determine the byte order used for generating the byte sequence, but as a signature that helps in guessing the encoding. On encoding the utf-8-sig codec will write ``0xef``, ``0xbb``, ``0xbf`` as the first three bytes to the file. On -decoding utf-8-sig will skip those three bytes if they appear as the first three -bytes in the file. +decoding ``utf-8-sig`` will skip those three bytes if they appear as the first +three bytes in the file. In UTF-8, the use of the BOM is discouraged and +should generally be avoided. .. _standard-encodings: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 09:46:32 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 09:46:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Refactor_a_bit_?= =?utf8?q?the_codecs_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/6cfee8de0dea changeset: 73124:6cfee8de0dea branch: 2.7 parent: 73109:fc91e02f305e user: Ezio Melotti date: Tue Oct 25 10:46:22 2011 +0300 summary: Refactor a bit the codecs doc. files: Doc/library/codecs.rst | 40 +++++++++++++++-------------- 1 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -782,27 +782,28 @@ Windows). There's a string constant with 256 characters that shows you which character is mapped to which byte value. -All of these encodings can only encode 256 of the 65536 (or 1114111) codepoints +All of these encodings can only encode 256 of the 1114112 codepoints defined in unicode. A simple and straightforward way that can store each Unicode -code point, is to store each codepoint as two consecutive bytes. There are two -possibilities: Store the bytes in big endian or in little endian order. These -two encodings are called UTF-16-BE and UTF-16-LE respectively. Their -disadvantage is that if e.g. you use UTF-16-BE on a little endian machine you -will always have to swap bytes on encoding and decoding. UTF-16 avoids this -problem: Bytes will always be in natural endianness. When these bytes are read +code point, is to store each codepoint as four consecutive bytes. There are two +possibilities: store the bytes in big endian or in little endian order. These +two encodings are called ``UTF-32-BE`` and ``UTF-32-LE`` respectively. Their +disadvantage is that if e.g. you use ``UTF-32-BE`` on a little endian machine you +will always have to swap bytes on encoding and decoding. ``UTF-32`` avoids this +problem: bytes will always be in natural endianness. When these bytes are read by a CPU with a different endianness, then bytes have to be swapped though. To -be able to detect the endianness of a UTF-16 byte sequence, there's the so -called BOM (the "Byte Order Mark"). This is the Unicode character ``U+FEFF``. -This character will be prepended to every UTF-16 byte sequence. The byte swapped -version of this character (``0xFFFE``) is an illegal character that may not -appear in a Unicode text. So when the first character in an UTF-16 byte sequence +be able to detect the endianness of a ``UTF-16`` or ``UTF-32`` byte sequence, +there's the so called BOM ("Byte Order Mark"). This is the Unicode character +``U+FEFF``. This character can be prepended to every ``UTF-16`` or ``UTF-32`` +byte sequence. The byte swapped version of this character (``0xFFFE``) is an +illegal character that may not appear in a Unicode text. So when the +first character in an ``UTF-16`` or ``UTF-32`` byte sequence appears to be a ``U+FFFE`` the bytes have to be swapped on decoding. -Unfortunately upto Unicode 4.0 the character ``U+FEFF`` had a second purpose as -a ``ZERO WIDTH NO-BREAK SPACE``: A character that has no width and doesn't allow +Unfortunately the character ``U+FEFF`` had a second purpose as +a ``ZERO WIDTH NO-BREAK SPACE``: a character that has no width and doesn't allow a word to be split. It can e.g. be used to give hints to a ligature algorithm. With Unicode 4.0 using ``U+FEFF`` as a ``ZERO WIDTH NO-BREAK SPACE`` has been deprecated (with ``U+2060`` (``WORD JOINER``) assuming this role). Nevertheless -Unicode software still must be able to handle ``U+FEFF`` in both roles: As a BOM +Unicode software still must be able to handle ``U+FEFF`` in both roles: as a BOM it's a device to determine the storage layout of the encoded bytes, and vanishes once the byte sequence has been decoded into a Unicode string; as a ``ZERO WIDTH NO-BREAK SPACE`` it's a normal character that will be decoded like any other. @@ -810,7 +811,7 @@ There's another encoding that is able to encoding the full range of Unicode characters: UTF-8. UTF-8 is an 8-bit encoding, which means there are no issues with byte order in UTF-8. Each byte in a UTF-8 byte sequence consists of two -parts: Marker bits (the most significant bits) and payload bits. The marker bits +parts: marker bits (the most significant bits) and payload bits. The marker bits are a sequence of zero to four ``1`` bits followed by a ``0`` bit. Unicode characters are encoded like this (with x being payload bits, which when concatenated give the Unicode character): @@ -849,13 +850,14 @@ | RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK | INVERTED QUESTION MARK -in iso-8859-1), this increases the probability that a utf-8-sig encoding can be +in iso-8859-1), this increases the probability that a ``utf-8-sig`` encoding can be correctly guessed from the byte sequence. So here the BOM is not used to be able to determine the byte order used for generating the byte sequence, but as a signature that helps in guessing the encoding. On encoding the utf-8-sig codec will write ``0xef``, ``0xbb``, ``0xbf`` as the first three bytes to the file. On -decoding utf-8-sig will skip those three bytes if they appear as the first three -bytes in the file. +decoding ``utf-8-sig`` will skip those three bytes if they appear as the first +three bytes in the file. In UTF-8, the use of the BOM is discouraged and +should generally be avoided. .. _standard-encodings: -- Repository URL: http://hg.python.org/cpython From ezio.melotti at gmail.com Tue Oct 25 09:52:22 2011 From: ezio.melotti at gmail.com (Ezio Melotti) Date: Tue, 25 Oct 2011 10:52:22 +0300 Subject: [Python-checkins] cpython (2.7): Closes #13232: Handle multiple encodings in exception logging. In-Reply-To: References: Message-ID: <4EA66AB6.4000500@gmail.com> Hi, On 25/10/2011 1.26, vinay.sajip wrote: > http://hg.python.org/cpython/rev/4bb1dc4e2cec > changeset: 73108:4bb1dc4e2cec > branch: 2.7 > user: Vinay Sajip > date: Mon Oct 24 23:23:02 2011 +0100 > summary: > Closes #13232: Handle multiple encodings in exception logging. > > files: > Lib/logging/__init__.py | 8 ++++++-- > 1 files changed, 6 insertions(+), 2 deletions(-) > > > diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py > --- a/Lib/logging/__init__.py > +++ b/Lib/logging/__init__.py > @@ -478,8 +478,12 @@ > except UnicodeError: > # Sometimes filenames have non-ASCII chars, which can lead > # to errors when s is Unicode and record.exc_text is str > - # See issue 8924 > - s = s + record.exc_text.decode(sys.getfilesystemencoding()) > + # See issue 8924. > + # We also use replace for when there are multiple > + # encodings, e.g. UTF-898 for the filesystem and latin-1 UTF-898? > + # for a script. See issue 13232. > + s = s + record.exc_text.decode(sys.getfilesystemencoding(), > + 'replace') > return s > > # > Best Regards, Ezio Melotti From python-checkins at python.org Tue Oct 25 12:11:25 2011 From: python-checkins at python.org (vinay.sajip) Date: Tue, 25 Oct 2011 12:11:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Corrected_typo_?= =?utf8?q?in_comment=2E?= Message-ID: http://hg.python.org/cpython/rev/a7191ec811c6 changeset: 73125:a7191ec811c6 branch: 2.7 user: Vinay Sajip date: Tue Oct 25 11:10:54 2011 +0100 summary: Corrected typo in comment. files: Lib/logging/__init__.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -480,7 +480,7 @@ # to errors when s is Unicode and record.exc_text is str # See issue 8924. # We also use replace for when there are multiple - # encodings, e.g. UTF-898 for the filesystem and latin-1 + # encodings, e.g. UTF-8 for the filesystem and latin-1 # for a script. See issue 13232. s = s + record.exc_text.decode(sys.getfilesystemencoding(), 'replace') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 13:07:20 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 25 Oct 2011 13:07:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_=2310278=3A_Add_clock?= =?utf8?q?=5Fgetres=28=29=2C_clock=5Fgettime=28=29_and_CLOCK=5Fxxx_constan?= =?utf8?q?ts_to?= Message-ID: http://hg.python.org/cpython/rev/35e4b7c4bafa changeset: 73126:35e4b7c4bafa parent: 73123:3c4b7ecc2db7 user: Victor Stinner date: Tue Oct 25 13:06:09 2011 +0200 summary: Close #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a monotonic clock files: Doc/library/time.rst | 48 ++ Doc/whatsnew/3.3.rst | 10 + Lib/test/test_time.py | 21 + Misc/NEWS | 4 + Modules/timemodule.c | 72 +++ configure | 713 ++++++++++++++++++----------- configure.in | 14 + pyconfig.h.in | 9 + setup.py | 12 +- 9 files changed, 615 insertions(+), 288 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -136,6 +136,54 @@ microsecond. +.. function:: clock_getres(clk_id) + + Return the resolution (precision) of the specified clock *clk_id*. + + .. versionadded:: 3.3 + +.. function:: clock_gettime(clk_id) + + Return the time of the specified clock *clk_id*. + + .. versionadded:: 3.3 + +.. data:: CLOCK_REALTIME + + System-wide real-time clock. Setting this clock requires appropriate + privileges. + + .. versionadded:: 3.3 + +.. data:: CLOCK_MONOTONIC + + Clock that cannot be set and represents monotonic time since some + unspecified starting point. + + .. versionadded:: 3.3 + +.. data:: CLOCK_MONOTONIC_RAW + + Similar to :data:`CLOCK_MONOTONIC`, but provides access to a raw + hardware-based time that is not subject to NTP adjustments. + + Availability: Linux 2.6.28 or later. + + .. versionadded:: 3.3 + +.. data:: CLOCK_PROCESS_CPUTIME_ID + + High-resolution per-process timer from the CPU. + + .. versionadded:: 3.3 + +.. data:: CLOCK_THREAD_CPUTIME_ID + + Thread-specific CPU-time clock. + + .. versionadded:: 3.3 + + .. function:: ctime([secs]) Convert a time expressed in seconds since the epoch to a string representing diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -272,6 +272,16 @@ * :envvar:`PYTHONFAULTHANDLER` * :option:`-X` ``faulthandler`` +time +---- + +* The :mod:`time` module has new :func:`~time.clock_getres` and + :func:`~time.clock_gettime` functions and ``CLOCK_xxx`` constants. + :func:`~time.clock_gettime` can be used with :data:`time.CLOCK_MONOTONIC` to + get a monotonic clock. + + (Contributed by Victor Stinner in :issue:`10278`) + ftplib ------ diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -20,6 +20,27 @@ def test_clock(self): time.clock() + @unittest.skipUnless(hasattr(time, 'clock_gettime'), + 'need time.clock_gettime()') + def test_clock_realtime(self): + time.clock_gettime(time.CLOCK_REALTIME) + + @unittest.skipUnless(hasattr(time, 'clock_gettime'), + 'need time.clock_gettime()') + @unittest.skipUnless(hasattr(time, 'CLOCK_MONOTONIC'), + 'need time.CLOCK_MONOTONIC') + def test_clock_monotonic(self): + a = time.clock_gettime(time.CLOCK_MONOTONIC) + b = time.clock_gettime(time.CLOCK_MONOTONIC) + self.assertLessEqual(a, b) + + @unittest.skipUnless(hasattr(time, 'clock_getres'), + 'need time.clock_getres()') + def test_clock_getres(self): + res = time.clock_getres(time.CLOCK_REALTIME) + self.assertGreater(res, 0.0) + self.assertLessEqual(res, 1.0) + def test_conversions(self): self.assertEqual(time.ctime(self.t), time.asctime(time.localtime(self.t))) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,10 @@ Library ------- +- Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to + the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a + monotonic clock + - Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -135,6 +135,54 @@ records."); #endif +#ifdef HAVE_CLOCK_GETTIME +static PyObject * +time_clock_gettime(PyObject *self, PyObject *args) +{ + int ret; + clockid_t clk_id; + struct timespec tp; + + if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) + return NULL; + + ret = clock_gettime((clockid_t)clk_id, &tp); + if (ret != 0) + PyErr_SetFromErrno(PyExc_IOError); + + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); +} + +PyDoc_STRVAR(clock_gettime_doc, +"clock_gettime(clk_id) -> floating point number\n\ +\n\ +Return the time of the specified clock clk_id."); +#endif + +#ifdef HAVE_CLOCK_GETRES +static PyObject * +time_clock_getres(PyObject *self, PyObject *args) +{ + int ret; + clockid_t clk_id; + struct timespec tp; + + if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id)) + return NULL; + + ret = clock_getres((clockid_t)clk_id, &tp); + if (ret != 0) + PyErr_SetFromErrno(PyExc_IOError); + + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); +} + +PyDoc_STRVAR(clock_getres_doc, +"clock_getres(clk_id) -> floating point number\n\ +\n\ +Return the resolution (precision) of the specified clock clk_id."); +#endif + static PyObject * time_sleep(PyObject *self, PyObject *args) { @@ -786,6 +834,24 @@ Py_BuildValue("(zz)", _tzname[0], _tzname[1])); #endif /* __CYGWIN__ */ #endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/ + +#if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_CLOCK_GETRES) +#ifdef CLOCK_REALTIME + PyModule_AddIntMacro(m, CLOCK_REALTIME); +#endif +#ifdef CLOCK_MONOTONIC + PyModule_AddIntMacro(m, CLOCK_MONOTONIC); +#endif +#ifdef CLOCK_MONOTONIC_RAW + PyModule_AddIntMacro(m, CLOCK_MONOTONIC_RAW); +#endif +#ifdef CLOCK_PROCESS_CPUTIME_ID + PyModule_AddIntMacro(m, CLOCK_PROCESS_CPUTIME_ID); +#endif +#ifdef CLOCK_THREAD_CPUTIME_ID + PyModule_AddIntMacro(m, CLOCK_THREAD_CPUTIME_ID); +#endif +#endif /* HAVE_CLOCK_GETTIME */ } @@ -794,6 +860,12 @@ #if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) {"clock", time_clock, METH_NOARGS, clock_doc}, #endif +#ifdef HAVE_CLOCK_GETTIME + {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc}, +#endif +#ifdef HAVE_CLOCK_GETRES + {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc}, +#endif {"sleep", time_sleep, METH_VARARGS, sleep_doc}, {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc}, {"localtime", time_localtime, METH_VARARGS, localtime_doc}, diff --git a/configure b/configure --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for python 3.3. +# Generated by GNU Autoconf 2.68 for python 3.3. # # Report bugs to . # @@ -91,6 +91,7 @@ IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. +as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -216,11 +217,18 @@ # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. + # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} + case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; + esac + exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : @@ -1174,7 +1182,7 @@ $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac @@ -1510,7 +1518,7 @@ if $ac_init_version; then cat <<\_ACEOF python configure 3.3 -generated by GNU Autoconf 2.67 +generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation @@ -1556,7 +1564,7 @@ ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile @@ -1602,7 +1610,7 @@ # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link @@ -1639,7 +1647,7 @@ ac_retval=1 fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp @@ -1652,10 +1660,10 @@ ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : + if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 @@ -1722,7 +1730,7 @@ esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" @@ -1731,7 +1739,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel @@ -1772,7 +1780,7 @@ ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run @@ -1786,7 +1794,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -1804,7 +1812,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile @@ -1817,7 +1825,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1858,7 +1866,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type @@ -1871,7 +1879,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uint$2_t" >&5 $as_echo_n "checking for uint$2_t... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1911,7 +1919,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_uintX_t @@ -1924,7 +1932,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for int$2_t" >&5 $as_echo_n "checking for int$2_t... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" @@ -1985,7 +1993,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_find_intX_t @@ -2162,7 +2170,7 @@ rm -f conftest.val fi - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_compute_int @@ -2175,7 +2183,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2230,7 +2238,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func @@ -2243,7 +2251,7 @@ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } -if eval "test \"\${$4+set}\"" = set; then : +if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2287,7 +2295,7 @@ eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member @@ -2302,7 +2310,7 @@ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 $as_echo_n "checking whether $as_decl_name is declared... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : +if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -2333,7 +2341,7 @@ eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } - eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_decl cat >config.log <<_ACEOF @@ -2341,7 +2349,7 @@ running configure, to aid debugging if configure makes a mistake. It was created by python $as_me 3.3, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2599,7 +2607,7 @@ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi done @@ -2699,7 +2707,7 @@ set dummy hg; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_HAS_HG+set}" = set; then : +if ${ac_cv_prog_HAS_HG+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_HG"; then @@ -3248,7 +3256,7 @@ set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3288,7 +3296,7 @@ set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3341,7 +3349,7 @@ set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3381,7 +3389,7 @@ set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3440,7 +3448,7 @@ set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CC+set}" = set; then : +if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then @@ -3484,7 +3492,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : +if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then @@ -3539,7 +3547,7 @@ test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3654,7 +3662,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -3697,7 +3705,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -3756,7 +3764,7 @@ $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi fi fi @@ -3767,7 +3775,7 @@ ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } -if test "${ac_cv_objext+set}" = set; then : +if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -3808,7 +3816,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -3818,7 +3826,7 @@ ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } -if test "${ac_cv_c_compiler_gnu+set}" = set; then : +if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -3855,7 +3863,7 @@ ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } -if test "${ac_cv_prog_cc_g+set}" = set; then : +if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag @@ -3933,7 +3941,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } -if test "${ac_cv_prog_cc_c89+set}" = set; then : +if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no @@ -4068,7 +4076,7 @@ set dummy g++; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CXX+set}" = set; then : +if ${ac_cv_path_CXX+:} false; then : $as_echo_n "(cached) " >&6 else case $CXX in @@ -4109,7 +4117,7 @@ set dummy c++; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CXX+set}" = set; then : +if ${ac_cv_path_CXX+:} false; then : $as_echo_n "(cached) " >&6 else case $CXX in @@ -4160,7 +4168,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then : +if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then @@ -4261,7 +4269,7 @@ CPP= fi if test -z "$CPP"; then - if test "${ac_cv_prog_CPP+set}" = set; then : + if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded @@ -4377,7 +4385,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -4389,7 +4397,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then : +if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then @@ -4452,7 +4460,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then : +if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 @@ -4519,7 +4527,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4648,7 +4656,7 @@ ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" -if test "x$ac_cv_header_minix_config_h" = x""yes; then : +if test "x$ac_cv_header_minix_config_h" = xyes; then : MINIX=yes else MINIX= @@ -4670,7 +4678,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 $as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } -if test "${ac_cv_safe_to_define___extensions__+set}" = set; then : +if ${ac_cv_safe_to_define___extensions__+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -4863,7 +4871,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } -if test "${ac_cv_c_inline+set}" = set; then : +if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no @@ -5059,7 +5067,7 @@ set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then : +if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then @@ -5099,7 +5107,7 @@ set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then @@ -5153,7 +5161,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AR+set}" = set; then : +if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then @@ -5204,7 +5212,7 @@ set dummy python; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_HAS_PYTHON+set}" = set; then : +if ${ac_cv_prog_HAS_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$HAS_PYTHON"; then @@ -5298,7 +5306,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then : +if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -5490,7 +5498,7 @@ ac_save_cc="$CC" CC="$CC -fno-strict-aliasing" save_CFLAGS="$CFLAGS" - if test "${ac_cv_no_strict_aliasing+set}" = set; then : + if ${ac_cv_no_strict_aliasing+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5556,7 +5564,7 @@ ac_save_cc="$CC" CC="$CC -Wunused-result -Werror" save_CFLAGS="$CFLAGS" - if test "${ac_cv_disable_unused_result_warning+set}" = set; then : + if ${ac_cv_disable_unused_result_warning+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -5783,7 +5791,7 @@ # options before we can check whether -Kpthread improves anything. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads are available without options" >&5 $as_echo_n "checking whether pthreads are available without options... " >&6; } -if test "${ac_cv_pthread_is_default+set}" = set; then : +if ${ac_cv_pthread_is_default+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -5836,7 +5844,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kpthread" >&5 $as_echo_n "checking whether $CC accepts -Kpthread... " >&6; } -if test "${ac_cv_kpthread+set}" = set; then : +if ${ac_cv_kpthread+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -5885,7 +5893,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -Kthread" >&5 $as_echo_n "checking whether $CC accepts -Kthread... " >&6; } -if test "${ac_cv_kthread+set}" = set; then : +if ${ac_cv_kthread+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -5934,7 +5942,7 @@ # function available. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -pthread" >&5 $as_echo_n "checking whether $CC accepts -pthread... " >&6; } -if test "${ac_cv_thread+set}" = set; then : +if ${ac_cv_thread+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cc="$CC" @@ -6019,7 +6027,7 @@ # checks for header files { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } -if test "${ac_cv_header_stdc+set}" = set; then : +if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6158,7 +6166,7 @@ as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } -if eval "test \"\${$as_ac_Header+set}\"" = set; then : +if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6198,7 +6206,7 @@ if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then : +if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -6232,11 +6240,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then : + if ${ac_cv_search_opendir+:} false; then : break fi done -if test "${ac_cv_search_opendir+set}" = set; then : +if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no @@ -6255,7 +6263,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } -if test "${ac_cv_search_opendir+set}" = set; then : +if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -6289,11 +6297,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test "${ac_cv_search_opendir+set}" = set; then : + if ${ac_cv_search_opendir+:} false; then : break fi done -if test "${ac_cv_search_opendir+set}" = set; then : +if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no @@ -6313,7 +6321,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/types.h defines makedev" >&5 $as_echo_n "checking whether sys/types.h defines makedev... " >&6; } -if test "${ac_cv_header_sys_types_h_makedev+set}" = set; then : +if ${ac_cv_header_sys_types_h_makedev+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6341,7 +6349,7 @@ if test $ac_cv_header_sys_types_h_makedev = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/mkdev.h" "ac_cv_header_sys_mkdev_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_mkdev_h" = x""yes; then : +if test "x$ac_cv_header_sys_mkdev_h" = xyes; then : $as_echo "#define MAJOR_IN_MKDEV 1" >>confdefs.h @@ -6351,7 +6359,7 @@ if test $ac_cv_header_sys_mkdev_h = no; then ac_fn_c_check_header_mongrel "$LINENO" "sys/sysmacros.h" "ac_cv_header_sys_sysmacros_h" "$ac_includes_default" -if test "x$ac_cv_header_sys_sysmacros_h" = x""yes; then : +if test "x$ac_cv_header_sys_sysmacros_h" = xyes; then : $as_echo "#define MAJOR_IN_SYSMACROS 1" >>confdefs.h @@ -6379,7 +6387,7 @@ #endif " -if test "x$ac_cv_header_net_if_h" = x""yes; then : +if test "x$ac_cv_header_net_if_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_NET_IF_H 1 _ACEOF @@ -6399,7 +6407,7 @@ #endif " -if test "x$ac_cv_header_term_h" = x""yes; then : +if test "x$ac_cv_header_term_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_TERM_H 1 _ACEOF @@ -6421,7 +6429,7 @@ #endif " -if test "x$ac_cv_header_linux_netlink_h" = x""yes; then : +if test "x$ac_cv_header_linux_netlink_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_NETLINK_H 1 _ACEOF @@ -6577,7 +6585,7 @@ # Type availability checks ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default" -if test "x$ac_cv_type_mode_t" = x""yes; then : +if test "x$ac_cv_type_mode_t" = xyes; then : else @@ -6588,7 +6596,7 @@ fi ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default" -if test "x$ac_cv_type_off_t" = x""yes; then : +if test "x$ac_cv_type_off_t" = xyes; then : else @@ -6599,7 +6607,7 @@ fi ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" -if test "x$ac_cv_type_pid_t" = x""yes; then : +if test "x$ac_cv_type_pid_t" = xyes; then : else @@ -6615,7 +6623,7 @@ _ACEOF ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" -if test "x$ac_cv_type_size_t" = x""yes; then : +if test "x$ac_cv_type_size_t" = xyes; then : else @@ -6627,7 +6635,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } -if test "${ac_cv_type_uid_t+set}" = set; then : +if ${ac_cv_type_uid_t+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -6706,7 +6714,7 @@ esac ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" -if test "x$ac_cv_type_ssize_t" = x""yes; then : +if test "x$ac_cv_type_ssize_t" = xyes; then : $as_echo "#define HAVE_SSIZE_T 1" >>confdefs.h @@ -6721,7 +6729,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 $as_echo_n "checking size of int... " >&6; } -if test "${ac_cv_sizeof_int+set}" = set; then : +if ${ac_cv_sizeof_int+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : @@ -6731,7 +6739,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi @@ -6754,7 +6762,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 $as_echo_n "checking size of long... " >&6; } -if test "${ac_cv_sizeof_long+set}" = set; then : +if ${ac_cv_sizeof_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : @@ -6764,7 +6772,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long=0 fi @@ -6787,7 +6795,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 $as_echo_n "checking size of void *... " >&6; } -if test "${ac_cv_sizeof_void_p+set}" = set; then : +if ${ac_cv_sizeof_void_p+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then : @@ -6797,7 +6805,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (void *) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_void_p=0 fi @@ -6820,7 +6828,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 $as_echo_n "checking size of short... " >&6; } -if test "${ac_cv_sizeof_short+set}" = set; then : +if ${ac_cv_sizeof_short+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : @@ -6830,7 +6838,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi @@ -6853,7 +6861,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of float" >&5 $as_echo_n "checking size of float... " >&6; } -if test "${ac_cv_sizeof_float+set}" = set; then : +if ${ac_cv_sizeof_float+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (float))" "ac_cv_sizeof_float" "$ac_includes_default"; then : @@ -6863,7 +6871,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (float) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_float=0 fi @@ -6886,7 +6894,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of double" >&5 $as_echo_n "checking size of double... " >&6; } -if test "${ac_cv_sizeof_double+set}" = set; then : +if ${ac_cv_sizeof_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (double))" "ac_cv_sizeof_double" "$ac_includes_default"; then : @@ -6896,7 +6904,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (double) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_double=0 fi @@ -6919,7 +6927,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of fpos_t" >&5 $as_echo_n "checking size of fpos_t... " >&6; } -if test "${ac_cv_sizeof_fpos_t+set}" = set; then : +if ${ac_cv_sizeof_fpos_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (fpos_t))" "ac_cv_sizeof_fpos_t" "$ac_includes_default"; then : @@ -6929,7 +6937,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (fpos_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_fpos_t=0 fi @@ -6952,7 +6960,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of size_t" >&5 $as_echo_n "checking size of size_t... " >&6; } -if test "${ac_cv_sizeof_size_t+set}" = set; then : +if ${ac_cv_sizeof_size_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (size_t))" "ac_cv_sizeof_size_t" "$ac_includes_default"; then : @@ -6962,7 +6970,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (size_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_size_t=0 fi @@ -6985,7 +6993,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pid_t" >&5 $as_echo_n "checking size of pid_t... " >&6; } -if test "${ac_cv_sizeof_pid_t+set}" = set; then : +if ${ac_cv_sizeof_pid_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pid_t))" "ac_cv_sizeof_pid_t" "$ac_includes_default"; then : @@ -6995,7 +7003,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pid_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_pid_t=0 fi @@ -7045,7 +7053,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 $as_echo_n "checking size of long long... " >&6; } -if test "${ac_cv_sizeof_long_long+set}" = set; then : +if ${ac_cv_sizeof_long_long+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : @@ -7055,7 +7063,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long long) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_long=0 fi @@ -7106,7 +7114,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long double" >&5 $as_echo_n "checking size of long double... " >&6; } -if test "${ac_cv_sizeof_long_double+set}" = set; then : +if ${ac_cv_sizeof_long_double+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long double))" "ac_cv_sizeof_long_double" "$ac_includes_default"; then : @@ -7116,7 +7124,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (long double) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_long_double=0 fi @@ -7168,7 +7176,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of _Bool" >&5 $as_echo_n "checking size of _Bool... " >&6; } -if test "${ac_cv_sizeof__Bool+set}" = set; then : +if ${ac_cv_sizeof__Bool+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (_Bool))" "ac_cv_sizeof__Bool" "$ac_includes_default"; then : @@ -7178,7 +7186,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (_Bool) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof__Bool=0 fi @@ -7204,7 +7212,7 @@ #include #endif " -if test "x$ac_cv_type_uintptr_t" = x""yes; then : +if test "x$ac_cv_type_uintptr_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINTPTR_T 1 @@ -7216,7 +7224,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of uintptr_t" >&5 $as_echo_n "checking size of uintptr_t... " >&6; } -if test "${ac_cv_sizeof_uintptr_t+set}" = set; then : +if ${ac_cv_sizeof_uintptr_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (uintptr_t))" "ac_cv_sizeof_uintptr_t" "$ac_includes_default"; then : @@ -7226,7 +7234,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (uintptr_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_uintptr_t=0 fi @@ -7252,7 +7260,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of off_t" >&5 $as_echo_n "checking size of off_t... " >&6; } -if test "${ac_cv_sizeof_off_t+set}" = set; then : +if ${ac_cv_sizeof_off_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (off_t))" "ac_cv_sizeof_off_t" " @@ -7267,7 +7275,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (off_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_off_t=0 fi @@ -7311,7 +7319,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5 $as_echo_n "checking size of time_t... " >&6; } -if test "${ac_cv_sizeof_time_t+set}" = set; then : +if ${ac_cv_sizeof_time_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" " @@ -7329,7 +7337,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (time_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_time_t=0 fi @@ -7386,7 +7394,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of pthread_t" >&5 $as_echo_n "checking size of pthread_t... " >&6; } -if test "${ac_cv_sizeof_pthread_t+set}" = set; then : +if ${ac_cv_sizeof_pthread_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (pthread_t))" "ac_cv_sizeof_pthread_t" " @@ -7401,7 +7409,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (pthread_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_pthread_t=0 fi @@ -7832,7 +7840,7 @@ # checks for libraries { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in -lsendfile" >&5 $as_echo_n "checking for sendfile in -lsendfile... " >&6; } -if test "${ac_cv_lib_sendfile_sendfile+set}" = set; then : +if ${ac_cv_lib_sendfile_sendfile+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7866,7 +7874,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sendfile_sendfile" >&5 $as_echo "$ac_cv_lib_sendfile_sendfile" >&6; } -if test "x$ac_cv_lib_sendfile_sendfile" = x""yes; then : +if test "x$ac_cv_lib_sendfile_sendfile" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSENDFILE 1 _ACEOF @@ -7877,7 +7885,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } -if test "${ac_cv_lib_dl_dlopen+set}" = set; then : +if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7911,7 +7919,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } -if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF @@ -7922,7 +7930,7 @@ # Dynamic linking for SunOS/Solaris and SYSV { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } -if test "${ac_cv_lib_dld_shl_load+set}" = set; then : +if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -7956,7 +7964,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } -if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDLD 1 _ACEOF @@ -7970,7 +7978,7 @@ if test "$with_threads" = "yes" -o -z "$with_threads"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing sem_init" >&5 $as_echo_n "checking for library containing sem_init... " >&6; } -if test "${ac_cv_search_sem_init+set}" = set; then : +if ${ac_cv_search_sem_init+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS @@ -8004,11 +8012,11 @@ fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext - if test "${ac_cv_search_sem_init+set}" = set; then : + if ${ac_cv_search_sem_init+:} false; then : break fi done -if test "${ac_cv_search_sem_init+set}" = set; then : +if ${ac_cv_search_sem_init+:} false; then : else ac_cv_search_sem_init=no @@ -8031,7 +8039,7 @@ # check if we need libintl for locale functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for textdomain in -lintl" >&5 $as_echo_n "checking for textdomain in -lintl... " >&6; } -if test "${ac_cv_lib_intl_textdomain+set}" = set; then : +if ${ac_cv_lib_intl_textdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8065,7 +8073,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_textdomain" >&5 $as_echo "$ac_cv_lib_intl_textdomain" >&6; } -if test "x$ac_cv_lib_intl_textdomain" = x""yes; then : +if test "x$ac_cv_lib_intl_textdomain" = xyes; then : $as_echo "#define WITH_LIBINTL 1" >>confdefs.h @@ -8112,7 +8120,7 @@ # Most SVR4 platforms (e.g. Solaris) need -lsocket and -lnsl. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for t_open in -lnsl" >&5 $as_echo_n "checking for t_open in -lnsl... " >&6; } -if test "${ac_cv_lib_nsl_t_open+set}" = set; then : +if ${ac_cv_lib_nsl_t_open+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8146,13 +8154,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_t_open" >&5 $as_echo "$ac_cv_lib_nsl_t_open" >&6; } -if test "x$ac_cv_lib_nsl_t_open" = x""yes; then : +if test "x$ac_cv_lib_nsl_t_open" = xyes; then : LIBS="-lnsl $LIBS" fi # SVR4 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5 $as_echo_n "checking for socket in -lsocket... " >&6; } -if test "${ac_cv_lib_socket_socket+set}" = set; then : +if ${ac_cv_lib_socket_socket+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8186,7 +8194,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5 $as_echo "$ac_cv_lib_socket_socket" >&6; } -if test "x$ac_cv_lib_socket_socket" = x""yes; then : +if test "x$ac_cv_lib_socket_socket" = xyes; then : LIBS="-lsocket $LIBS" fi # SVR4 sockets @@ -8212,7 +8220,7 @@ set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : +if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in @@ -8255,7 +8263,7 @@ set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in @@ -8551,7 +8559,7 @@ LIBS=$_libs ac_fn_c_check_func "$LINENO" "pthread_detach" "ac_cv_func_pthread_detach" -if test "x$ac_cv_func_pthread_detach" = x""yes; then : +if test "x$ac_cv_func_pthread_detach" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8560,7 +8568,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthreads" >&5 $as_echo_n "checking for pthread_create in -lpthreads... " >&6; } -if test "${ac_cv_lib_pthreads_pthread_create+set}" = set; then : +if ${ac_cv_lib_pthreads_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8594,7 +8602,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_create" >&5 $as_echo "$ac_cv_lib_pthreads_pthread_create" >&6; } -if test "x$ac_cv_lib_pthreads_pthread_create" = x""yes; then : +if test "x$ac_cv_lib_pthreads_pthread_create" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8604,7 +8612,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 $as_echo_n "checking for pthread_create in -lc_r... " >&6; } -if test "${ac_cv_lib_c_r_pthread_create+set}" = set; then : +if ${ac_cv_lib_c_r_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8638,7 +8646,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } -if test "x$ac_cv_lib_c_r_pthread_create" = x""yes; then : +if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8648,7 +8656,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_create_system in -lpthread" >&5 $as_echo_n "checking for __pthread_create_system in -lpthread... " >&6; } -if test "${ac_cv_lib_pthread___pthread_create_system+set}" = set; then : +if ${ac_cv_lib_pthread___pthread_create_system+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8682,7 +8690,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_create_system" >&5 $as_echo "$ac_cv_lib_pthread___pthread_create_system" >&6; } -if test "x$ac_cv_lib_pthread___pthread_create_system" = x""yes; then : +if test "x$ac_cv_lib_pthread___pthread_create_system" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8692,7 +8700,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lcma" >&5 $as_echo_n "checking for pthread_create in -lcma... " >&6; } -if test "${ac_cv_lib_cma_pthread_create+set}" = set; then : +if ${ac_cv_lib_cma_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8726,7 +8734,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cma_pthread_create" >&5 $as_echo "$ac_cv_lib_cma_pthread_create" >&6; } -if test "x$ac_cv_lib_cma_pthread_create" = x""yes; then : +if test "x$ac_cv_lib_cma_pthread_create" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h posix_threads=yes @@ -8752,7 +8760,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usconfig in -lmpc" >&5 $as_echo_n "checking for usconfig in -lmpc... " >&6; } -if test "${ac_cv_lib_mpc_usconfig+set}" = set; then : +if ${ac_cv_lib_mpc_usconfig+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8786,7 +8794,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mpc_usconfig" >&5 $as_echo "$ac_cv_lib_mpc_usconfig" >&6; } -if test "x$ac_cv_lib_mpc_usconfig" = x""yes; then : +if test "x$ac_cv_lib_mpc_usconfig" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h LIBS="$LIBS -lmpc" @@ -8798,7 +8806,7 @@ if test "$posix_threads" != "yes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for thr_create in -lthread" >&5 $as_echo_n "checking for thr_create in -lthread... " >&6; } -if test "${ac_cv_lib_thread_thr_create+set}" = set; then : +if ${ac_cv_lib_thread_thr_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -8832,7 +8840,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_thread_thr_create" >&5 $as_echo "$ac_cv_lib_thread_thr_create" >&6; } -if test "x$ac_cv_lib_thread_thr_create" = x""yes; then : +if test "x$ac_cv_lib_thread_thr_create" = xyes; then : $as_echo "#define WITH_THREAD 1" >>confdefs.h LIBS="$LIBS -lthread" @@ -8868,7 +8876,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PTHREAD_SCOPE_SYSTEM is supported" >&5 $as_echo_n "checking if PTHREAD_SCOPE_SYSTEM is supported... " >&6; } - if test "${ac_cv_pthread_system_supported+set}" = set; then : + if ${ac_cv_pthread_system_supported+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -8911,7 +8919,7 @@ for ac_func in pthread_sigmask do : ac_fn_c_check_func "$LINENO" "pthread_sigmask" "ac_cv_func_pthread_sigmask" -if test "x$ac_cv_func_pthread_sigmask" = x""yes; then : +if test "x$ac_cv_func_pthread_sigmask" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_SIGMASK 1 _ACEOF @@ -9303,7 +9311,7 @@ $as_echo "$with_valgrind" >&6; } if test "$with_valgrind" != no; then ac_fn_c_check_header_mongrel "$LINENO" "valgrind/valgrind.h" "ac_cv_header_valgrind_valgrind_h" "$ac_includes_default" -if test "x$ac_cv_header_valgrind_valgrind_h" = x""yes; then : +if test "x$ac_cv_header_valgrind_valgrind_h" = xyes; then : $as_echo "#define WITH_VALGRIND 1" >>confdefs.h @@ -9325,7 +9333,7 @@ for ac_func in dlopen do : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" -if test "x$ac_cv_func_dlopen" = x""yes; then : +if test "x$ac_cv_func_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLOPEN 1 _ACEOF @@ -9392,7 +9400,8 @@ getgrouplist getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getresuid getresgid getpwent getspnam getspent getsid getwd \ if_nameindex \ - initgroups kill killpg lchmod lchown lockf linkat lstat lutimes mbrtowc mkdirat mkfifo \ + initgroups kill killpg lchmod lchown lockf linkat lstat lutimes memrchr \ + mbrtowc mkdirat mkfifo \ mkfifoat mknod mknodat mktime mremap nice openat pathconf pause pipe2 plock poll \ posix_fallocate posix_fadvise pread \ pthread_init pthread_kill putenv pwrite readlink readlinkat readv realpath renameat \ @@ -9659,7 +9668,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock declaration" >&5 $as_echo_n "checking for flock declaration... " >&6; } -if test "${ac_cv_flock_decl+set}" = set; then : +if ${ac_cv_flock_decl+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -9689,7 +9698,7 @@ for ac_func in flock do : ac_fn_c_check_func "$LINENO" "flock" "ac_cv_func_flock" -if test "x$ac_cv_func_flock" = x""yes; then : +if test "x$ac_cv_func_flock" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FLOCK 1 _ACEOF @@ -9697,7 +9706,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flock in -lbsd" >&5 $as_echo_n "checking for flock in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_flock+set}" = set; then : +if ${ac_cv_lib_bsd_flock+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9731,7 +9740,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_flock" >&5 $as_echo "$ac_cv_lib_bsd_flock" >&6; } -if test "x$ac_cv_lib_bsd_flock" = x""yes; then : +if test "x$ac_cv_lib_bsd_flock" = xyes; then : $as_echo "#define HAVE_FLOCK 1" >>confdefs.h @@ -9808,7 +9817,7 @@ set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_TRUE+set}" = set; then : +if ${ac_cv_prog_TRUE+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$TRUE"; then @@ -9848,7 +9857,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lc" >&5 $as_echo_n "checking for inet_aton in -lc... " >&6; } -if test "${ac_cv_lib_c_inet_aton+set}" = set; then : +if ${ac_cv_lib_c_inet_aton+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9882,12 +9891,12 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_inet_aton" >&5 $as_echo "$ac_cv_lib_c_inet_aton" >&6; } -if test "x$ac_cv_lib_c_inet_aton" = x""yes; then : +if test "x$ac_cv_lib_c_inet_aton" = xyes; then : $ac_cv_prog_TRUE else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5 $as_echo_n "checking for inet_aton in -lresolv... " >&6; } -if test "${ac_cv_lib_resolv_inet_aton+set}" = set; then : +if ${ac_cv_lib_resolv_inet_aton+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -9921,7 +9930,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5 $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; } -if test "x$ac_cv_lib_resolv_inet_aton" = x""yes; then : +if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRESOLV 1 _ACEOF @@ -9938,7 +9947,7 @@ # exit Python { $as_echo "$as_me:${as_lineno-$LINENO}: checking for chflags" >&5 $as_echo_n "checking for chflags... " >&6; } -if test "${ac_cv_have_chflags+set}" = set; then : +if ${ac_cv_have_chflags+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -9972,7 +9981,7 @@ $as_echo "$ac_cv_have_chflags" >&6; } if test "$ac_cv_have_chflags" = cross ; then ac_fn_c_check_func "$LINENO" "chflags" "ac_cv_func_chflags" -if test "x$ac_cv_func_chflags" = x""yes; then : +if test "x$ac_cv_func_chflags" = xyes; then : ac_cv_have_chflags="yes" else ac_cv_have_chflags="no" @@ -9987,7 +9996,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lchflags" >&5 $as_echo_n "checking for lchflags... " >&6; } -if test "${ac_cv_have_lchflags+set}" = set; then : +if ${ac_cv_have_lchflags+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -10021,7 +10030,7 @@ $as_echo "$ac_cv_have_lchflags" >&6; } if test "$ac_cv_have_lchflags" = cross ; then ac_fn_c_check_func "$LINENO" "lchflags" "ac_cv_func_lchflags" -if test "x$ac_cv_func_lchflags" = x""yes; then : +if test "x$ac_cv_func_lchflags" = xyes; then : ac_cv_have_lchflags="yes" else ac_cv_have_lchflags="no" @@ -10045,7 +10054,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflateCopy in -lz" >&5 $as_echo_n "checking for inflateCopy in -lz... " >&6; } -if test "${ac_cv_lib_z_inflateCopy+set}" = set; then : +if ${ac_cv_lib_z_inflateCopy+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10079,7 +10088,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_inflateCopy" >&5 $as_echo "$ac_cv_lib_z_inflateCopy" >&6; } -if test "x$ac_cv_lib_z_inflateCopy" = x""yes; then : +if test "x$ac_cv_lib_z_inflateCopy" = xyes; then : $as_echo "#define HAVE_ZLIB_COPY 1" >>confdefs.h @@ -10222,7 +10231,7 @@ for ac_func in openpty do : ac_fn_c_check_func "$LINENO" "openpty" "ac_cv_func_openpty" -if test "x$ac_cv_func_openpty" = x""yes; then : +if test "x$ac_cv_func_openpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_OPENPTY 1 _ACEOF @@ -10230,7 +10239,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lutil" >&5 $as_echo_n "checking for openpty in -lutil... " >&6; } -if test "${ac_cv_lib_util_openpty+set}" = set; then : +if ${ac_cv_lib_util_openpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10264,13 +10273,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_openpty" >&5 $as_echo "$ac_cv_lib_util_openpty" >&6; } -if test "x$ac_cv_lib_util_openpty" = x""yes; then : +if test "x$ac_cv_lib_util_openpty" = xyes; then : $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h LIBS="$LIBS -lutil" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for openpty in -lbsd" >&5 $as_echo_n "checking for openpty in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_openpty+set}" = set; then : +if ${ac_cv_lib_bsd_openpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10304,7 +10313,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_openpty" >&5 $as_echo "$ac_cv_lib_bsd_openpty" >&6; } -if test "x$ac_cv_lib_bsd_openpty" = x""yes; then : +if test "x$ac_cv_lib_bsd_openpty" = xyes; then : $as_echo "#define HAVE_OPENPTY 1" >>confdefs.h LIBS="$LIBS -lbsd" fi @@ -10319,7 +10328,7 @@ for ac_func in forkpty do : ac_fn_c_check_func "$LINENO" "forkpty" "ac_cv_func_forkpty" -if test "x$ac_cv_func_forkpty" = x""yes; then : +if test "x$ac_cv_func_forkpty" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FORKPTY 1 _ACEOF @@ -10327,7 +10336,7 @@ else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lutil" >&5 $as_echo_n "checking for forkpty in -lutil... " >&6; } -if test "${ac_cv_lib_util_forkpty+set}" = set; then : +if ${ac_cv_lib_util_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10361,13 +10370,13 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_util_forkpty" >&5 $as_echo "$ac_cv_lib_util_forkpty" >&6; } -if test "x$ac_cv_lib_util_forkpty" = x""yes; then : +if test "x$ac_cv_lib_util_forkpty" = xyes; then : $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h LIBS="$LIBS -lutil" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for forkpty in -lbsd" >&5 $as_echo_n "checking for forkpty in -lbsd... " >&6; } -if test "${ac_cv_lib_bsd_forkpty+set}" = set; then : +if ${ac_cv_lib_bsd_forkpty+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -10401,7 +10410,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_forkpty" >&5 $as_echo "$ac_cv_lib_bsd_forkpty" >&6; } -if test "x$ac_cv_lib_bsd_forkpty" = x""yes; then : +if test "x$ac_cv_lib_bsd_forkpty" = xyes; then : $as_echo "#define HAVE_FORKPTY 1" >>confdefs.h LIBS="$LIBS -lbsd" fi @@ -10418,7 +10427,7 @@ for ac_func in memmove do : ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove" -if test "x$ac_cv_func_memmove" = x""yes; then : +if test "x$ac_cv_func_memmove" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MEMMOVE 1 _ACEOF @@ -10442,7 +10451,7 @@ ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2" -if test "x$ac_cv_func_dup2" = x""yes; then : +if test "x$ac_cv_func_dup2" = xyes; then : $as_echo "#define HAVE_DUP2 1" >>confdefs.h else @@ -10455,7 +10464,7 @@ fi ac_fn_c_check_func "$LINENO" "getcwd" "ac_cv_func_getcwd" -if test "x$ac_cv_func_getcwd" = x""yes; then : +if test "x$ac_cv_func_getcwd" = xyes; then : $as_echo "#define HAVE_GETCWD 1" >>confdefs.h else @@ -10468,7 +10477,7 @@ fi ac_fn_c_check_func "$LINENO" "strdup" "ac_cv_func_strdup" -if test "x$ac_cv_func_strdup" = x""yes; then : +if test "x$ac_cv_func_strdup" = xyes; then : $as_echo "#define HAVE_STRDUP 1" >>confdefs.h else @@ -10484,7 +10493,7 @@ for ac_func in getpgrp do : ac_fn_c_check_func "$LINENO" "getpgrp" "ac_cv_func_getpgrp" -if test "x$ac_cv_func_getpgrp" = x""yes; then : +if test "x$ac_cv_func_getpgrp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETPGRP 1 _ACEOF @@ -10512,7 +10521,7 @@ for ac_func in setpgrp do : ac_fn_c_check_func "$LINENO" "setpgrp" "ac_cv_func_setpgrp" -if test "x$ac_cv_func_setpgrp" = x""yes; then : +if test "x$ac_cv_func_setpgrp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETPGRP 1 _ACEOF @@ -10540,7 +10549,7 @@ for ac_func in gettimeofday do : ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday" -if test "x$ac_cv_func_gettimeofday" = x""yes; then : +if test "x$ac_cv_func_gettimeofday" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETTIMEOFDAY 1 _ACEOF @@ -10569,6 +10578,125 @@ done +for ac_func in clock_gettime +do : + ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime" +if test "x$ac_cv_func_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETTIME 1 +_ACEOF + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : + + $as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h + + +$as_echo "#define TIMEMODULE_LIB rt" >>confdefs.h + + +fi + + +fi +done + + +for ac_func in clock_getres +do : + ac_fn_c_check_func "$LINENO" "clock_getres" "ac_cv_func_clock_getres" +if test "x$ac_cv_func_clock_getres" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_GETRES 1 +_ACEOF + +else + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_getres in -lrt" >&5 +$as_echo_n "checking for clock_getres in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_getres+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_getres (); +int +main () +{ +return clock_getres (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_getres=yes +else + ac_cv_lib_rt_clock_getres=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_getres" >&5 +$as_echo "$ac_cv_lib_rt_clock_getres" >&6; } +if test "x$ac_cv_lib_rt_clock_getres" = xyes; then : + + $as_echo "#define HAVE_CLOCK_GETRES 1" >>confdefs.h + + +fi + + +fi +done + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for major" >&5 $as_echo_n "checking for major... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10642,7 +10770,7 @@ then { $as_echo "$as_me:${as_lineno-$LINENO}: checking getaddrinfo bug" >&5 $as_echo_n "checking getaddrinfo bug... " >&6; } - if test "${ac_cv_buggy_getaddrinfo+set}" = set; then : + if ${ac_cv_buggy_getaddrinfo+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -10771,7 +10899,7 @@ for ac_func in getnameinfo do : ac_fn_c_check_func "$LINENO" "getnameinfo" "ac_cv_func_getnameinfo" -if test "x$ac_cv_func_getnameinfo" = x""yes; then : +if test "x$ac_cv_func_getnameinfo" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETNAMEINFO 1 _ACEOF @@ -10783,7 +10911,7 @@ # checks for structures { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } -if test "${ac_cv_header_time+set}" = set; then : +if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10818,7 +10946,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } -if test "${ac_cv_struct_tm+set}" = set; then : +if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10855,7 +10983,7 @@ #include <$ac_cv_struct_tm> " -if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then : +if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 @@ -10871,7 +10999,7 @@ else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " -if test "x$ac_cv_have_decl_tzname" = x""yes; then : +if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 @@ -10883,7 +11011,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } -if test "${ac_cv_var_tzname+set}" = set; then : +if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -10919,7 +11047,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_rdev" "ac_cv_member_struct_stat_st_rdev" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_rdev" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_rdev" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_RDEV 1 @@ -10929,7 +11057,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blksize" "ac_cv_member_struct_stat_st_blksize" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blksize" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_blksize" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLKSIZE 1 @@ -10939,7 +11067,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_flags" "ac_cv_member_struct_stat_st_flags" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_flags" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_flags" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_FLAGS 1 @@ -10949,7 +11077,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_gen" "ac_cv_member_struct_stat_st_gen" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_gen" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_gen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_GEN 1 @@ -10959,7 +11087,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_birthtime" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BIRTHTIME 1 @@ -10969,7 +11097,7 @@ fi ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default" -if test "x$ac_cv_member_struct_stat_st_blocks" = x""yes; then : +if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_STAT_ST_BLOCKS 1 @@ -10991,7 +11119,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for time.h that defines altzone" >&5 $as_echo_n "checking for time.h that defines altzone... " >&6; } -if test "${ac_cv_header_time_altzone+set}" = set; then : +if ${ac_cv_header_time_altzone+:} false; then : $as_echo_n "(cached) " >&6 else @@ -11055,7 +11183,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for addrinfo" >&5 $as_echo_n "checking for addrinfo... " >&6; } -if test "${ac_cv_struct_addrinfo+set}" = set; then : +if ${ac_cv_struct_addrinfo+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11087,7 +11215,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sockaddr_storage" >&5 $as_echo_n "checking for sockaddr_storage... " >&6; } -if test "${ac_cv_struct_sockaddr_storage+set}" = set; then : +if ${ac_cv_struct_sockaddr_storage+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11123,7 +11251,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether char is unsigned" >&5 $as_echo_n "checking whether char is unsigned... " >&6; } -if test "${ac_cv_c_char_unsigned+set}" = set; then : +if ${ac_cv_c_char_unsigned+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11155,7 +11283,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } -if test "${ac_cv_c_const+set}" = set; then : +if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -11443,7 +11571,7 @@ ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r" -if test "x$ac_cv_func_gethostbyname_r" = x""yes; then : +if test "x$ac_cv_func_gethostbyname_r" = xyes; then : $as_echo "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h @@ -11574,7 +11702,7 @@ for ac_func in gethostbyname do : ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" -if test "x$ac_cv_func_gethostbyname" = x""yes; then : +if test "x$ac_cv_func_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETHOSTBYNAME 1 _ACEOF @@ -11596,12 +11724,12 @@ # Linux requires this for correct f.p. operations ac_fn_c_check_func "$LINENO" "__fpu_control" "ac_cv_func___fpu_control" -if test "x$ac_cv_func___fpu_control" = x""yes; then : +if test "x$ac_cv_func___fpu_control" = xyes; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __fpu_control in -lieee" >&5 $as_echo_n "checking for __fpu_control in -lieee... " >&6; } -if test "${ac_cv_lib_ieee___fpu_control+set}" = set; then : +if ${ac_cv_lib_ieee___fpu_control+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -11635,7 +11763,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee___fpu_control" >&5 $as_echo "$ac_cv_lib_ieee___fpu_control" >&6; } -if test "x$ac_cv_lib_ieee___fpu_control" = x""yes; then : +if test "x$ac_cv_lib_ieee___fpu_control" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBIEEE 1 _ACEOF @@ -11729,7 +11857,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are little-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are little-endian IEEE 754 binary64... " >&6; } -if test "${ac_cv_little_endian_double+set}" = set; then : +if ${ac_cv_little_endian_double+:} false; then : $as_echo_n "(cached) " >&6 else @@ -11771,7 +11899,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are big-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are big-endian IEEE 754 binary64... " >&6; } -if test "${ac_cv_big_endian_double+set}" = set; then : +if ${ac_cv_big_endian_double+:} false; then : $as_echo_n "(cached) " >&6 else @@ -11817,7 +11945,7 @@ # conversions work. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C doubles are ARM mixed-endian IEEE 754 binary64" >&5 $as_echo_n "checking whether C doubles are ARM mixed-endian IEEE 754 binary64... " >&6; } -if test "${ac_cv_mixed_endian_double+set}" = set; then : +if ${ac_cv_mixed_endian_double+:} false; then : $as_echo_n "(cached) " >&6 else @@ -11987,7 +12115,7 @@ ac_fn_c_check_decl "$LINENO" "isinf" "ac_cv_have_decl_isinf" "#include " -if test "x$ac_cv_have_decl_isinf" = x""yes; then : +if test "x$ac_cv_have_decl_isinf" = xyes; then : ac_have_decl=1 else ac_have_decl=0 @@ -11998,7 +12126,7 @@ _ACEOF ac_fn_c_check_decl "$LINENO" "isnan" "ac_cv_have_decl_isnan" "#include " -if test "x$ac_cv_have_decl_isnan" = x""yes; then : +if test "x$ac_cv_have_decl_isnan" = xyes; then : ac_have_decl=1 else ac_have_decl=0 @@ -12009,7 +12137,7 @@ _ACEOF ac_fn_c_check_decl "$LINENO" "isfinite" "ac_cv_have_decl_isfinite" "#include " -if test "x$ac_cv_have_decl_isfinite" = x""yes; then : +if test "x$ac_cv_have_decl_isfinite" = xyes; then : ac_have_decl=1 else ac_have_decl=0 @@ -12024,7 +12152,7 @@ # -0. on some architectures. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether tanh preserves the sign of zero" >&5 $as_echo_n "checking whether tanh preserves the sign of zero... " >&6; } -if test "${ac_cv_tanh_preserves_zero_sign+set}" = set; then : +if ${ac_cv_tanh_preserves_zero_sign+:} false; then : $as_echo_n "(cached) " >&6 else @@ -12072,7 +12200,7 @@ # -0. See issue #9920. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether log1p drops the sign of negative zero" >&5 $as_echo_n "checking whether log1p drops the sign of negative zero... " >&6; } - if test "${ac_cv_log1p_drops_zero_sign+set}" = set; then : + if ${ac_cv_log1p_drops_zero_sign+:} false; then : $as_echo_n "(cached) " >&6 else @@ -12124,7 +12252,7 @@ # sem_open results in a 'Signal 12' error. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether POSIX semaphores are enabled" >&5 $as_echo_n "checking whether POSIX semaphores are enabled... " >&6; } -if test "${ac_cv_posix_semaphores_enabled+set}" = set; then : +if ${ac_cv_posix_semaphores_enabled+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -12175,7 +12303,7 @@ # Multiprocessing check for broken sem_getvalue { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken sem_getvalue" >&5 $as_echo_n "checking for broken sem_getvalue... " >&6; } -if test "${ac_cv_broken_sem_getvalue+set}" = set; then : +if ${ac_cv_broken_sem_getvalue+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -12240,7 +12368,7 @@ 15|30) ;; *) - as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value should be 15 or 30" "$LINENO" 5 ;; + as_fn_error $? "bad value $enable_big_digits for --enable-big-digits; value should be 15 or 30" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_big_digits" >&5 $as_echo "$enable_big_digits" >&6; } @@ -12258,7 +12386,7 @@ # check for wchar.h ac_fn_c_check_header_mongrel "$LINENO" "wchar.h" "ac_cv_header_wchar_h" "$ac_includes_default" -if test "x$ac_cv_header_wchar_h" = x""yes; then : +if test "x$ac_cv_header_wchar_h" = xyes; then : $as_echo "#define HAVE_WCHAR_H 1" >>confdefs.h @@ -12281,7 +12409,7 @@ # This bug is HP SR number 8606223364. { $as_echo "$as_me:${as_lineno-$LINENO}: checking size of wchar_t" >&5 $as_echo_n "checking size of wchar_t... " >&6; } -if test "${ac_cv_sizeof_wchar_t+set}" = set; then : +if ${ac_cv_sizeof_wchar_t+:} false; then : $as_echo_n "(cached) " >&6 else if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (wchar_t))" "ac_cv_sizeof_wchar_t" "#include @@ -12292,7 +12420,7 @@ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (wchar_t) -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_wchar_t=0 fi @@ -12347,7 +12475,7 @@ # check whether wchar_t is signed or not { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether wchar_t is signed" >&5 $as_echo_n "checking whether wchar_t is signed... " >&6; } - if test "${ac_cv_wchar_t_signed+set}" = set; then : + if ${ac_cv_wchar_t_signed+:} false; then : $as_echo_n "(cached) " >&6 else @@ -12397,7 +12525,7 @@ # check for endianness { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } -if test "${ac_cv_c_bigendian+set}" = set; then : +if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown @@ -12616,7 +12744,7 @@ ;; #( *) as_fn_error $? "unknown endianness - presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac @@ -12688,7 +12816,7 @@ # or fills with zeros (like the Cray J90, according to Tim Peters). { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether right shift extends the sign bit" >&5 $as_echo_n "checking whether right shift extends the sign bit... " >&6; } -if test "${ac_cv_rshift_extends_sign+set}" = set; then : +if ${ac_cv_rshift_extends_sign+:} false; then : $as_echo_n "(cached) " >&6 else @@ -12727,7 +12855,7 @@ # check for getc_unlocked and related locking functions { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getc_unlocked() and friends" >&5 $as_echo_n "checking for getc_unlocked() and friends... " >&6; } -if test "${ac_cv_have_getc_unlocked+set}" = set; then : +if ${ac_cv_have_getc_unlocked+:} false; then : $as_echo_n "(cached) " >&6 else @@ -12825,7 +12953,7 @@ # check for readline 2.1 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_callback_handler_install in -lreadline" >&5 $as_echo_n "checking for rl_callback_handler_install in -lreadline... " >&6; } -if test "${ac_cv_lib_readline_rl_callback_handler_install+set}" = set; then : +if ${ac_cv_lib_readline_rl_callback_handler_install+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12859,7 +12987,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_callback_handler_install" >&5 $as_echo "$ac_cv_lib_readline_rl_callback_handler_install" >&6; } -if test "x$ac_cv_lib_readline_rl_callback_handler_install" = x""yes; then : +if test "x$ac_cv_lib_readline_rl_callback_handler_install" = xyes; then : $as_echo "#define HAVE_RL_CALLBACK 1" >>confdefs.h @@ -12911,7 +13039,7 @@ # check for readline 4.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_pre_input_hook in -lreadline" >&5 $as_echo_n "checking for rl_pre_input_hook in -lreadline... " >&6; } -if test "${ac_cv_lib_readline_rl_pre_input_hook+set}" = set; then : +if ${ac_cv_lib_readline_rl_pre_input_hook+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12945,7 +13073,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_pre_input_hook" >&5 $as_echo "$ac_cv_lib_readline_rl_pre_input_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_pre_input_hook" = x""yes; then : +if test "x$ac_cv_lib_readline_rl_pre_input_hook" = xyes; then : $as_echo "#define HAVE_RL_PRE_INPUT_HOOK 1" >>confdefs.h @@ -12955,7 +13083,7 @@ # also in 4.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_display_matches_hook in -lreadline" >&5 $as_echo_n "checking for rl_completion_display_matches_hook in -lreadline... " >&6; } -if test "${ac_cv_lib_readline_rl_completion_display_matches_hook+set}" = set; then : +if ${ac_cv_lib_readline_rl_completion_display_matches_hook+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -12989,7 +13117,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_display_matches_hook" >&5 $as_echo "$ac_cv_lib_readline_rl_completion_display_matches_hook" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = x""yes; then : +if test "x$ac_cv_lib_readline_rl_completion_display_matches_hook" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h @@ -12999,7 +13127,7 @@ # check for readline 4.2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } -if test "${ac_cv_lib_readline_rl_completion_matches+set}" = set; then : +if ${ac_cv_lib_readline_rl_completion_matches+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS @@ -13033,7 +13161,7 @@ fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_completion_matches" >&5 $as_echo "$ac_cv_lib_readline_rl_completion_matches" >&6; } -if test "x$ac_cv_lib_readline_rl_completion_matches" = x""yes; then : +if test "x$ac_cv_lib_readline_rl_completion_matches" = xyes; then : $as_echo "#define HAVE_RL_COMPLETION_MATCHES 1" >>confdefs.h @@ -13074,7 +13202,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken nice()" >&5 $as_echo_n "checking for broken nice()... " >&6; } -if test "${ac_cv_broken_nice+set}" = set; then : +if ${ac_cv_broken_nice+:} false; then : $as_echo_n "(cached) " >&6 else @@ -13115,7 +13243,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken poll()" >&5 $as_echo_n "checking for broken poll()... " >&6; } -if test "${ac_cv_broken_poll+set}" = set; then : +if ${ac_cv_broken_poll+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13170,7 +13298,7 @@ #include <$ac_cv_struct_tm> " -if test "x$ac_cv_member_struct_tm_tm_zone" = x""yes; then : +if test "x$ac_cv_member_struct_tm_tm_zone" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRUCT_TM_TM_ZONE 1 @@ -13186,7 +13314,7 @@ else ac_fn_c_check_decl "$LINENO" "tzname" "ac_cv_have_decl_tzname" "#include " -if test "x$ac_cv_have_decl_tzname" = x""yes; then : +if test "x$ac_cv_have_decl_tzname" = xyes; then : ac_have_decl=1 else ac_have_decl=0 @@ -13198,7 +13326,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tzname" >&5 $as_echo_n "checking for tzname... " >&6; } -if test "${ac_cv_var_tzname+set}" = set; then : +if ${ac_cv_var_tzname+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13237,7 +13365,7 @@ # check tzset(3) exists and works like we expect it to { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working tzset()" >&5 $as_echo_n "checking for working tzset()... " >&6; } -if test "${ac_cv_working_tzset+set}" = set; then : +if ${ac_cv_working_tzset+:} false; then : $as_echo_n "(cached) " >&6 else @@ -13334,7 +13462,7 @@ # Look for subsecond timestamps in struct stat { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec in struct stat" >&5 $as_echo_n "checking for tv_nsec in struct stat... " >&6; } -if test "${ac_cv_stat_tv_nsec+set}" = set; then : +if ${ac_cv_stat_tv_nsec+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13371,7 +13499,7 @@ # Look for BSD style subsecond timestamps in struct stat { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tv_nsec2 in struct stat" >&5 $as_echo_n "checking for tv_nsec2 in struct stat... " >&6; } -if test "${ac_cv_stat_tv_nsec2+set}" = set; then : +if ${ac_cv_stat_tv_nsec2+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13408,7 +13536,7 @@ # On HP/UX 11.0, mvwdelch is a block with a return statement { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mvwdelch is an expression" >&5 $as_echo_n "checking whether mvwdelch is an expression... " >&6; } -if test "${ac_cv_mvwdelch_is_expression+set}" = set; then : +if ${ac_cv_mvwdelch_is_expression+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13445,7 +13573,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether WINDOW has _flags" >&5 $as_echo_n "checking whether WINDOW has _flags... " >&6; } -if test "${ac_cv_window_has_flags+set}" = set; then : +if ${ac_cv_window_has_flags+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext @@ -13593,7 +13721,7 @@ then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %lld and %llu printf() format support" >&5 $as_echo_n "checking for %lld and %llu printf() format support... " >&6; } - if test "${ac_cv_have_long_long_format+set}" = set; then : + if ${ac_cv_have_long_long_format+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13663,7 +13791,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for %zd printf() format support" >&5 $as_echo_n "checking for %zd printf() format support... " >&6; } -if test "${ac_cv_have_size_t_format+set}" = set; then : +if ${ac_cv_have_size_t_format+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13736,7 +13864,7 @@ #endif " -if test "x$ac_cv_type_socklen_t" = x""yes; then : +if test "x$ac_cv_type_socklen_t" = xyes; then : else @@ -13747,7 +13875,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken mbstowcs" >&5 $as_echo_n "checking for broken mbstowcs... " >&6; } -if test "${ac_cv_broken_mbstowcs+set}" = set; then : +if ${ac_cv_broken_mbstowcs+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13787,7 +13915,7 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports computed gotos" >&5 $as_echo_n "checking whether $CC supports computed gotos... " >&6; } -if test "${ac_cv_computed_gotos+set}" = set; then : +if ${ac_cv_computed_gotos+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : @@ -13954,10 +14082,21 @@ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && + if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} @@ -13990,7 +14129,7 @@ -: ${CONFIG_STATUS=./config.status} +: "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" @@ -14091,6 +14230,7 @@ IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. +as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -14398,7 +14538,7 @@ # values after options handling. ac_log=" This file was extended by python $as_me 3.3, which was -generated by GNU Autoconf 2.67. Invocation command line was +generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS @@ -14460,7 +14600,7 @@ ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ python config.status 3.3 -configured by $0, generated by GNU Autoconf 2.67, +configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. @@ -14591,7 +14731,7 @@ "Misc/python.pc") CONFIG_FILES="$CONFIG_FILES Misc/python.pc" ;; "Modules/ld_so_aix") CONFIG_FILES="$CONFIG_FILES Modules/ld_so_aix" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -14613,9 +14753,10 @@ # after its creation but before its name has been assigned to `$tmp'. $debug || { - tmp= + tmp= ac_tmp= trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } @@ -14623,12 +14764,13 @@ { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" + test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. @@ -14650,7 +14792,7 @@ ac_cs_awk_cr=$ac_cr fi -echo 'BEGIN {' >"$tmp/subs1.awk" && +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF @@ -14678,7 +14820,7 @@ rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h @@ -14726,7 +14868,7 @@ rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK -cat >>"\$tmp/subs1.awk" <<_ACAWK && +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" @@ -14758,7 +14900,7 @@ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat -fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF @@ -14792,7 +14934,7 @@ # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then -cat >"$tmp/defines.awk" <<\_ACAWK || +cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF @@ -14804,8 +14946,8 @@ # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do - ac_t=`sed -n "/$ac_delim/p" confdefs.h` - if test -z "$ac_t"; then + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 @@ -14906,7 +15048,7 @@ esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -14925,7 +15067,7 @@ for ac_f do case $ac_f in - -) ac_f="$tmp/stdin";; + -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. @@ -14934,7 +15076,7 @@ [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -14960,8 +15102,8 @@ esac case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac @@ -15091,21 +15233,22 @@ s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} - rm -f "$tmp/stdin" + rm -f "$ac_tmp/stdin" case $ac_file in - -) cat "$tmp/out" && rm -f "$tmp/out";; - *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; @@ -15116,20 +15259,20 @@ if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" - } >"$tmp/config.h" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" - mv "$tmp/config.h" "$ac_file" \ + mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ - && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -2856,6 +2856,20 @@ ]) ) +AC_CHECK_FUNCS(clock_gettime, [], [ + AC_CHECK_LIB(rt, clock_gettime, [ + AC_DEFINE(HAVE_CLOCK_GETTIME, 1) + AC_DEFINE(TIMEMODULE_LIB, [rt], + [Library needed by timemodule.c: librt may be needed for clock_gettime()]) + ]) +]) + +AC_CHECK_FUNCS(clock_getres, [], [ + AC_CHECK_LIB(rt, clock_getres, [ + AC_DEFINE(HAVE_CLOCK_GETRES, 1) + ]) +]) + AC_MSG_CHECKING(for major, minor, and makedev) AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if defined(MAJOR_IN_MKDEV) diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -110,6 +110,12 @@ /* Define to 1 if you have the `clock' function. */ #undef HAVE_CLOCK +/* Define to 1 if you have the `clock_getres' function. */ +#undef HAVE_CLOCK_GETRES + +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME + /* Define if the C compiler supports computed gotos. */ #undef HAVE_COMPUTED_GOTOS @@ -1199,6 +1205,9 @@ /* Define if tanh(-0.) is -0., or if platform doesn't have signed zeros */ #undef TANH_PRESERVES_ZERO_SIGN +/* Library needed by timemodule.c: librt may be needed for clock_gettime() */ +#undef TIMEMODULE_LIB + /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -504,11 +504,17 @@ exts.append( Extension('math', ['mathmodule.c', '_math.c'], depends=['_math.h'], libraries=math_libs) ) + + # time libraries: librt may be needed for clock_gettime() + time_libs = [] + lib = sysconfig.get_config_var('TIMEMODULE_LIB') + if lib: + time_libs.append(lib) + # time operations and variables exts.append( Extension('time', ['timemodule.c', '_time.c'], - libraries=math_libs) ) - exts.append( Extension('_datetime', ['_datetimemodule.c', '_time.c'], - libraries=math_libs) ) + libraries=time_libs) ) + exts.append( Extension('_datetime', ['_datetimemodule.c', '_time.c']) ) # random number generator implemented in C exts.append( Extension("_random", ["_randommodule.c"]) ) # bisect -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 13:34:07 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 25 Oct 2011 13:34:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313226=3A_Add_RTLD?= =?utf8?q?=5Fxxx_constants_to_the_os_module=2E_These_constants_can_by?= Message-ID: http://hg.python.org/cpython/rev/c75427c0da06 changeset: 73127:c75427c0da06 user: Victor Stinner date: Tue Oct 25 13:34:04 2011 +0200 summary: Issue #13226: Add RTLD_xxx constants to the os module. These constants can by used with sys.setdlopenflags(). files: Doc/library/os.rst | 13 +++++++++++++ Doc/library/sys.rst | 10 +++++----- Lib/test/test_posix.py | 7 +++++++ Misc/NEWS | 3 +++ Modules/posixmodule.c | 26 ++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1393,6 +1393,19 @@ the C library. +.. data:: RTLD_LAZY + RTLD_NOW + RTLD_GLOBAL + RTLD_LOCAL + RTLD_NODELETE + RTLD_NOLOAD + RTLD_DEEPBIND + + See the Unix manual page :manpage:`dlopen(3)`. + + .. versionadded:: 3.3 + + .. _os-file-dir: Files and Directories diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -801,11 +801,11 @@ the interpreter loads extension modules. Among other things, this will enable a lazy resolving of symbols when importing a module, if called as ``sys.setdlopenflags(0)``. To share symbols across extension modules, call as - ``sys.setdlopenflags(ctypes.RTLD_GLOBAL)``. Symbolic names for the - flag modules can be either found in the :mod:`ctypes` module, or in the :mod:`DLFCN` - module. If :mod:`DLFCN` is not available, it can be generated from - :file:`/usr/include/dlfcn.h` using the :program:`h2py` script. Availability: - Unix. + ``sys.setdlopenflags(os.RTLD_GLOBAL)``. Symbolic names for the flag modules + can be found in the :mod:`os` module (``RTLD_xxx`` constants, e.g. + :data:`os.RTLD_LAZY`). + + Availability: Unix. .. function:: setprofile(profilefunc) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -984,6 +984,13 @@ self.assertIs(b, l) self.assertEqual(l.count(), 3) + def test_rtld_constants(self): + # check presence of major RTLD_* constants + posix.RTLD_LAZY + posix.RTLD_NOW + posix.RTLD_GLOBAL + posix.RTLD_LOCAL + class PosixGroupsTester(unittest.TestCase): def setUp(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,9 @@ Library ------- +- Issue #13226: Add RTLD_xxx constants to the os module. These constants can by + used with sys.setdlopenflags(). + - Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a monotonic clock diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -121,6 +121,10 @@ #endif #endif +#ifdef HAVE_DLFCN_H +#include +#endif + /* Various compilers have only certain posix functions */ /* XXX Gosh I wish these were all moved into pyconfig.h */ #if defined(PYCC_VACPP) && defined(PYOS_OS2) @@ -11423,6 +11427,28 @@ if (ins(d, "XATTR_SIZE_MAX", (long)XATTR_SIZE_MAX)) return -1; #endif +#ifdef RTLD_LAZY + if (PyModule_AddIntMacro(d, RTLD_LAZY)) return -1; +#endif +#ifdef RTLD_NOW + if (PyModule_AddIntMacro(d, RTLD_NOW)) return -1; +#endif +#ifdef RTLD_GLOBAL + if (PyModule_AddIntMacro(d, RTLD_GLOBAL)) return -1; +#endif +#ifdef RTLD_LOCAL + if (PyModule_AddIntMacro(d, RTLD_LOCAL)) return -1; +#endif +#ifdef RTLD_NODELETE + if (PyModule_AddIntMacro(d, RTLD_NODELETE)) return -1; +#endif +#ifdef RTLD_NOLOAD + if (PyModule_AddIntMacro(d, RTLD_NOLOAD)) return -1; +#endif +#ifdef RTLD_DEEPBIND + if (PyModule_AddIntMacro(d, RTLD_DEEPBIND)) return -1; +#endif + #if defined(PYOS_OS2) if (insertvalues(d)) return -1; #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 13:45:50 2011 From: python-checkins at python.org (victor.stinner) Date: Tue, 25 Oct 2011 13:45:50 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312619=3A_Expose_so?= =?utf8?q?cket=2ESO=5FBINDTODEVICE_constant?= Message-ID: http://hg.python.org/cpython/rev/6159311f0f44 changeset: 73128:6159311f0f44 user: Victor Stinner date: Tue Oct 25 13:45:48 2011 +0200 summary: Issue #12619: Expose socket.SO_BINDTODEVICE constant files: Modules/socketmodule.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -5772,6 +5772,9 @@ #ifdef LOCAL_PEERCRED PyModule_AddIntConstant(m, "LOCAL_PEERCRED", LOCAL_PEERCRED); #endif +#ifdef SO_BINDTODEVICE + PyModule_AddIntMacro(m, SO_BINDTODEVICE); +#endif /* Maximum number of connections for "listen" */ #ifdef SOMAXCONN -- Repository URL: http://hg.python.org/cpython From petri at digip.org Tue Oct 25 14:45:24 2011 From: petri at digip.org (Petri Lehtinen) Date: Tue, 25 Oct 2011 15:45:24 +0300 Subject: [Python-checkins] cpython: #13251: update string description in datamodel.rst. In-Reply-To: References: Message-ID: <20111025124524.GB15772@p16> Hi, ezio.melotti wrote: > http://hg.python.org/cpython/rev/11d18ebb2dd1 > changeset: 73116:11d18ebb2dd1 > user: Ezio Melotti > date: Tue Oct 25 09:23:42 2011 +0300 > summary: > #13251: update string description in datamodel.rst. > > files: > Doc/reference/datamodel.rst | 20 ++++++++++---------- > 1 files changed, 10 insertions(+), 10 deletions(-) > > > diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst > --- a/Doc/reference/datamodel.rst > +++ b/Doc/reference/datamodel.rst > @@ -276,16 +276,16 @@ > single: integer > single: Unicode > > - The items of a string object are Unicode code units. A Unicode code > - unit is represented by a string object of one item and can hold either > - a 16-bit or 32-bit value representing a Unicode ordinal (the maximum > - value for the ordinal is given in ``sys.maxunicode``, and depends on > - how Python is configured at compile time). Surrogate pairs may be > - present in the Unicode object, and will be reported as two separate > - items. The built-in functions :func:`chr` and :func:`ord` convert > - between code units and nonnegative integers representing the Unicode > - ordinals as defined in the Unicode Standard 3.0. Conversion from and to > - other encodings are possible through the string method :meth:`encode`. > + A string is a sequence of values that represent Unicode codepoints. > + All the codepoints in range ``U+0000 - U+10FFFF`` can be represented > + in a string. Python doesn't have a :c:type:`chr` type, and > + every characters in the string is represented as a string object typo ^ Should be "character", right? > + with length ``1``. The built-in function :func:`chr` converts a > + character to its codepoint (as an integer); :func:`ord` converts > + an integer in range ``0 - 10FFFF`` to the corresponding character. Actually chr() converts an integer to a string and ord() converts a string to an integer. chr and ord are swapped in your text. > + :meth:`str.encode` can be used to convert a :class:`str` to > + :class:`bytes` using the given encoding, and :meth:`bytes.decode` can > + be used to achieve the opposite. Petri From petri at digip.org Tue Oct 25 14:50:44 2011 From: petri at digip.org (Petri Lehtinen) Date: Tue, 25 Oct 2011 15:50:44 +0300 Subject: [Python-checkins] cpython: Issue #13226: Add RTLD_xxx constants to the os module. These constants can by In-Reply-To: References: Message-ID: <20111025125044.GC15772@p16> Hi, victor.stinner wrote: > http://hg.python.org/cpython/rev/c75427c0da06 > changeset: 73127:c75427c0da06 > user: Victor Stinner > date: Tue Oct 25 13:34:04 2011 +0200 > summary: > Issue #13226: Add RTLD_xxx constants to the os module. These constants can by > used with sys.setdlopenflags(). > > files: > Doc/library/os.rst | 13 +++++++++++++ > Doc/library/sys.rst | 10 +++++----- > Lib/test/test_posix.py | 7 +++++++ > Misc/NEWS | 3 +++ > Modules/posixmodule.c | 26 ++++++++++++++++++++++++++ > 5 files changed, 54 insertions(+), 5 deletions(-) [snip] > diff --git a/Misc/NEWS b/Misc/NEWS > --- a/Misc/NEWS > +++ b/Misc/NEWS > @@ -341,6 +341,9 @@ > Library > ------- > > +- Issue #13226: Add RTLD_xxx constants to the os module. These constants can by Typo: s/by/be/ > + used with sys.setdlopenflags(). > + > - Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to > the time module. time.clock_gettime(time.CLOCK_MONOTONIC) provides a > monotonic clock Petri From python-checkins at python.org Tue Oct 25 16:22:48 2011 From: python-checkins at python.org (ezio.melotti) Date: Tue, 25 Oct 2011 16:22:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typos=2E?= Message-ID: http://hg.python.org/cpython/rev/cfe0588f32b9 changeset: 73129:cfe0588f32b9 user: Ezio Melotti date: Tue Oct 25 17:22:22 2011 +0300 summary: Fix typos. files: Doc/reference/datamodel.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -279,9 +279,9 @@ A string is a sequence of values that represent Unicode codepoints. All the codepoints in range ``U+0000 - U+10FFFF`` can be represented in a string. Python doesn't have a :c:type:`chr` type, and - every characters in the string is represented as a string object - with length ``1``. The built-in function :func:`chr` converts a - character to its codepoint (as an integer); :func:`ord` converts + every character in the string is represented as a string object + with length ``1``. The built-in function :func:`ord` converts a + character to its codepoint (as an integer); :func:`chr` converts an integer in range ``0 - 10FFFF`` to the corresponding character. :meth:`str.encode` can be used to convert a :class:`str` to :class:`bytes` using the given encoding, and :meth:`bytes.decode` can -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Oct 25 23:36:37 2011 From: python-checkins at python.org (guido.van.rossum) Date: Tue, 25 Oct 2011 23:36:37 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_Updated_PEP_335=2C_posted_25-O?= =?utf8?q?ct-2011=2E?= Message-ID: http://hg.python.org/peps/rev/e197b2e8e14c changeset: 3971:e197b2e8e14c user: Guido van Rossum date: Tue Oct 25 14:36:29 2011 -0700 summary: Updated PEP 335, posted 25-Oct-2011. files: pep-0335.txt | 388 +++++++++++++++++++------------------- 1 files changed, 198 insertions(+), 190 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -2,13 +2,13 @@ Title: Overloadable Boolean Operators Version: $Revision$ Last-Modified: $Date$ -Author: Gregory Ewing +Author: Gregory Ewing Status: Draft Type: Standards Track Content-Type: text/x-rst Created: 29-Aug-2004 Python-Version: 3.3 -Post-History: 05-Sep-2004, 30-Sep-2011 +Post-History: 05-Sep-2004, 30-Sep-2011, 25-Oct-2011 Abstract @@ -66,13 +66,23 @@ A workaround often suggested is to use the bitwise operators '&', '|' and '~' in place of 'and', 'or' and 'not', but this has some -drawbacks. The precedence of these is different in relation to the -other operators, and they may already be in use for other purposes (as -in example 1). There is also the aesthetic consideration of forcing -users to use something other than the most obvious syntax for what -they are trying to express. This would be particularly acute in the -case of example 3, considering that boolean operations are a staple of -SQL queries. +drawbacks: + +* The precedence of these is different in relation to the other operators, + and they may already be in use for other purposes (as in example 1). + +* It is aesthetically displeasing to force users to use something other + than the most obvious syntax for what they are trying to express. This + would be particularly acute in the case of example 3, considering that + boolean operations are a staple of SQL queries. + +* Bitwise operators do not provide a solution to the problem of + chained comparisons such as 'a < b < c' which involve an implicit + 'and' operation. Such expressions currently cannot be used at all + on data types such as NumPy arrays where the result of a comparison + cannot be treated as having normal boolean semantics; they must be + expanded into something like (a < b) & (b < c), losing a considerable + amount of clarity. Rationale @@ -208,7 +218,7 @@ PyObject *PyObject_LogicalAnd1(PyObject *); PyObject *PyObject_LogicalOr1(PyObject *); PyObject *PyObject_LogicalAnd2(PyObject *, PyObject *); - + PyObject *PyObject_LogicalOr2(PyObject *, PyObject *); Alternatives and Optimisations @@ -242,40 +252,40 @@ :: - if a and b: - statement1 - else: - statement2 + if a and b: + statement1 + else: + statement2 generates :: - LOAD_GLOBAL a - POP_JUMP_IF_FALSE false_branch - LOAD_GLOBAL b - POP_JUMP_IF_FALSE false_branch - - JUMP_FORWARD end_branch - false_branch: - - end_branch: + LOAD_GLOBAL a + POP_JUMP_IF_FALSE false_branch + LOAD_GLOBAL b + POP_JUMP_IF_FALSE false_branch + + JUMP_FORWARD end_branch + false_branch: + + end_branch: Under this proposal as described so far, it would become something like :: - LOAD_GLOBAL a - LOGICAL_AND_1 test - LOAD_GLOBAL b - LOGICAL_AND_2 - test: - POP_JUMP_IF_FALSE false_branch - - JUMP_FORWARD end_branch - false_branch: - - end_branch: + LOAD_GLOBAL a + LOGICAL_AND_1 test + LOAD_GLOBAL b + LOGICAL_AND_2 + test: + POP_JUMP_IF_FALSE false_branch + + JUMP_FORWARD end_branch + false_branch: + + end_branch: This involves executing one extra bytecode in the short-circuiting case and two extra bytecodes in the non-short-circuiting case. @@ -286,16 +296,16 @@ :: - LOAD_GLOBAL a - AND1_JUMP true_branch, false_branch - LOAD_GLOBAL b - AND2_JUMP_IF_FALSE false_branch - true_branch: - - JUMP_FORWARD end_branch - false_branch: - - end_branch: + LOAD_GLOBAL a + AND1_JUMP true_branch, false_branch + LOAD_GLOBAL b + AND2_JUMP_IF_FALSE false_branch + true_branch: + + JUMP_FORWARD end_branch + false_branch: + + end_branch: Here, AND1_JUMP performs phase 1 processing as above, and then examines the result. If there is a result, it is popped @@ -350,58 +360,58 @@ :: - #----------------------------------------------------------------- - # - # This example creates a subclass of numpy array to which - # 'and', 'or' and 'not' can be applied, producing an array - # of booleans. - # - #----------------------------------------------------------------- - - from numpy import array, ndarray - - class BArray(ndarray): - - def __str__(self): - return "barray(%s)" % ndarray.__str__(self) - - def __and2__(self, other): - return self & other - - def __or2__(self, other): - return self & other - - def __not__(self): - return self == 0 - - def barray(*args, **kwds): - return array(*args, **kwds).view(type=BArray) - - a0 = barray([0, 1, 2, 4]) - a1 = barray([1, 2, 3, 4]) - a2 = barray([5, 6, 3, 4]) - a3 = barray([5, 1, 2, 4]) - - print("a0:", a0) - print("a1:", a1) - print("a2:", a2) - print("a3:", a3) - print("not a0:", not a0) - print("a0 == a1 and a2 == a3:", a0 == a1 and a2 == a3) - print("a0 == a1 or a2 == a3:", a0 == a1 or a2 == a3) + #----------------------------------------------------------------- + # + # This example creates a subclass of numpy array to which + # 'and', 'or' and 'not' can be applied, producing an array + # of booleans. + # + #----------------------------------------------------------------- + + from numpy import array, ndarray + + class BArray(ndarray): + + def __str__(self): + return "barray(%s)" % ndarray.__str__(self) + + def __and2__(self, other): + return (self & other) + + def __or2__(self, other): + return (self & other) + + def __not__(self): + return (self == 0) + + def barray(*args, **kwds): + return array(*args, **kwds).view(type = BArray) + + a0 = barray([0, 1, 2, 4]) + a1 = barray([1, 2, 3, 4]) + a2 = barray([5, 6, 3, 4]) + a3 = barray([5, 1, 2, 4]) + + print "a0:", a0 + print "a1:", a1 + print "a2:", a2 + print "a3:", a3 + print "not a0:", not a0 + print "a0 == a1 and a2 == a3:", a0 == a1 and a2 == a3 + print "a0 == a1 or a2 == a3:", a0 == a1 or a2 == a3 Example 1 Output ---------------- :: - a0: barray([0 1 2 4]) - a1: barray([1 2 3 4]) - a2: barray([5 6 3 4]) - a3: barray([5 1 2 4]) - not a0: barray([ True False False False]) - a0 == a1 and a2 == a3: barray([False False False True]) - a0 == a1 or a2 == a3: barray([False False False True]) + a0: barray([0 1 2 4]) + a1: barray([1 2 3 4]) + a2: barray([5 6 3 4]) + a3: barray([5 1 2 4]) + not a0: barray([ True False False False]) + a0 == a1 and a2 == a3: barray([False False False True]) + a0 == a1 or a2 == a3: barray([False False False True]) Example 2: Database Queries @@ -409,112 +419,110 @@ :: - #----------------------------------------------------------------- - # - # This example demonstrates the creation of a DSL for database - # queries allowing 'and' and 'or' operators to be used to - # formulate the query. - # - #----------------------------------------------------------------- - - class SQLNode: - - def __and2__(self, other): - return SQLBinop("and", self, other) - - def __rand2__(self, other): - return SQLBinop("and", other, self) - - def __eq__(self, other): - return SQLBinop("=", self, other) - - - class Table(SQLNode): - - def __init__(self, name): - self.__tablename__ = name - - def __getattr__(self, name): - return SQLAttr(self, name) - - def __sql__(self): - return self.__tablename__ - - - class SQLBinop(SQLNode): - - def __init__(self, op, opnd1, opnd2): - self.op = op.upper() - self.opnd1 = opnd1 - self.opnd2 = opnd2 - - def __sql__(self): - return "(%s %s %s)" % (sql(self.opnd1), self.op, sql(self.opnd2)) - - - class SQLAttr(SQLNode): - - def __init__(self, table, name): - self.table = table - self.name = name - - def __sql__(self): - return "%s.%s" % (sql(self.table), self.name) - - - class SQLSelect(SQLNode): - - def __init__(self, targets): - self.targets = targets - self.where_clause = None - - def where(self, expr): - self.where_clause = expr - return self - - def __sql__(self): - result = "SELECT %s" % ", ".join(sql(target) for target in self.targets) - if self.where_clause: - result = "%s WHERE %s" % (result, sql(self.where_clause)) - return result - - - def sql(expr): - if isinstance(expr, SQLNode): - return expr.__sql__() - elif isinstance(expr, str): - return "'%s'" % expr.replace("'", "''") - else: - return str(expr) - - - def select(*targets): - return SQLSelect(targets) - - -#-------------------------------------------------------------------------------- - -:: - dishes = Table("dishes") - customers = Table("customers") - orders = Table("orders") - - query = select(customers.name, dishes.price, orders.amount).where( - customers.cust_id == orders.cust_id and orders.dish_id == dishes.dish_id - and dishes.name == "Spam, Eggs, Sausages and Spam") - - print(repr(query)) - print(sql(query)) + #----------------------------------------------------------------- + # + # This example demonstrates the creation of a DSL for database + # queries allowing 'and' and 'or' operators to be used to + # formulate the query. + # + #----------------------------------------------------------------- + + class SQLNode(object): + + def __and2__(self, other): + return SQLBinop("and", self, other) + + def __rand2__(self, other): + return SQLBinop("and", other, self) + + def __eq__(self, other): + return SQLBinop("=", self, other) + + + class Table(SQLNode): + + def __init__(self, name): + self.__tablename__ = name + + def __getattr__(self, name): + return SQLAttr(self, name) + + def __sql__(self): + return self.__tablename__ + + + class SQLBinop(SQLNode): + + def __init__(self, op, opnd1, opnd2): + self.op = op.upper() + self.opnd1 = opnd1 + self.opnd2 = opnd2 + + def __sql__(self): + return "(%s %s %s)" % (sql(self.opnd1), self.op, sql(self.opnd2)) + + + class SQLAttr(SQLNode): + + def __init__(self, table, name): + self.table = table + self.name = name + + def __sql__(self): + return "%s.%s" % (sql(self.table), self.name) + + + class SQLSelect(SQLNode): + + def __init__(self, targets): + self.targets = targets + self.where_clause = None + + def where(self, expr): + self.where_clause = expr + return self + + def __sql__(self): + result = "SELECT %s" % ", ".join([sql(target) for target in self.targets]) + if self.where_clause: + result = "%s WHERE %s" % (result, sql(self.where_clause)) + return result + + + def sql(expr): + if isinstance(expr, SQLNode): + return expr.__sql__() + elif isinstance(expr, str): + return "'%s'" % expr.replace("'", "''") + else: + return str(expr) + + + def select(*targets): + return SQLSelect(targets) + + #----------------------------------------------------------------- + + dishes = Table("dishes") + customers = Table("customers") + orders = Table("orders") + + query = select(customers.name, dishes.price, orders.amount).where( + customers.cust_id == orders.cust_id and orders.dish_id == dishes.dish_id + and dishes.name == "Spam, Eggs, Sausages and Spam") + + print repr(query) + print sql(query) Example 2 Output ---------------- :: - <__main__.SQLSelect object at 0x1cc830> - SELECT customers.name, dishes.price, orders.amount WHERE - (((customers.cust_id = orders.cust_id) AND (orders.dish_id = - dishes.dish_id)) AND (dishes.name = 'Spam, Eggs, Sausages and Spam')) + <__main__.SQLSelect object at 0x1cc830> + SELECT customers.name, dishes.price, orders.amount WHERE + (((customers.cust_id = orders.cust_id) AND (orders.dish_id = + dishes.dish_id)) AND (dishes.name = 'Spam, Eggs, Sausages and Spam')) Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Oct 26 01:41:22 2011 From: python-checkins at python.org (victor.stinner) Date: Wed, 26 Oct 2011 01:41:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo_in_NEWS?= Message-ID: http://hg.python.org/cpython/rev/fbba3ecc92dc changeset: 73130:fbba3ecc92dc user: Victor Stinner date: Wed Oct 26 01:42:30 2011 +0200 summary: Fix typo in NEWS files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,7 +341,7 @@ Library ------- -- Issue #13226: Add RTLD_xxx constants to the os module. These constants can by +- Issue #13226: Add RTLD_xxx constants to the os module. These constants can be used with sys.setdlopenflags(). - Issue #10278: Add clock_getres(), clock_gettime() and CLOCK_xxx constants to -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Oct 26 05:33:51 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 26 Oct 2011 05:33:51 +0200 Subject: [Python-checkins] Daily reference leaks (fbba3ecc92dc): sum=0 Message-ID: results for fbba3ecc92dc on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogLgEeQQ', '-x'] From python-checkins at python.org Wed Oct 26 10:45:41 2011 From: python-checkins at python.org (ezio.melotti) Date: Wed, 26 Oct 2011 10:45:41 +0200 (CEST) Subject: [Python-checkins] r88914 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3ST4gT603mzP7n@mail.python.org> Author: ezio.melotti Date: Wed Oct 26 10:45:41 2011 New Revision: 88914 Log: Mark automated messages with a different background. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Wed Oct 26 10:45:41 2011 @@ -313,3 +313,14 @@ if (link.length != 0) link.attr('href', link.attr('href').split('?')[0]); }); + + +$(document).ready(function() { + /* Mark automated messages with a different background */ + $('table.messages th:nth-child(2)').each(function (i, e) { + var e = $(e); + if (/\(python-dev\)$/.test(e.text())) + e.parent().next().find('td.content').css( + 'background-color', '#efeff9'); + }); +}); From berker.peksag at gmail.com Wed Oct 26 11:39:06 2011 From: berker.peksag at gmail.com (=?UTF-8?Q?Berker_Peksa=C4=9F?=) Date: Wed, 26 Oct 2011 12:39:06 +0300 Subject: [Python-checkins] r88914 - tracker/instances/python-dev/html/issue.item.js In-Reply-To: <3ST4gT603mzP7n@mail.python.org> References: <3ST4gT603mzP7n@mail.python.org> Message-ID: Hi, On Wed, Oct 26, 2011 at 11:45 AM, ezio.melotti wrote: > Author: ezio.melotti > Date: Wed Oct 26 10:45:41 2011 > New Revision: 88914 > > Log: > Mark automated messages with a different background. > > Modified: > ? tracker/instances/python-dev/html/issue.item.js > > Modified: tracker/instances/python-dev/html/issue.item.js > ============================================================================== > --- tracker/instances/python-dev/html/issue.item.js ? ? (original) > +++ tracker/instances/python-dev/html/issue.item.js ? ? Wed Oct 26 10:45:41 2011 > @@ -313,3 +313,14 @@ > ? ? if (link.length != 0) > ? ? ? ? link.attr('href', link.attr('href').split('?')[0]); > ?}); > + > + > +$(document).ready(function() { > + ? ?/* Mark automated messages with a different background */ > + ? ?$('table.messages th:nth-child(2)').each(function (i, e) { > + ? ? ? ?var e = $(e); > + ? ? ? ?if (/\(python-dev\)$/.test(e.text())) > + ? ? ? ? ? ?e.parent().next().find('td.content').css( > + ? ? ? ? ? ? ? ?'background-color', '#efeff9'); > + ? ?}); > +}); I think this is shorter than $(document).ready(); $(function() { // ... }); See: http://stackoverflow.com/questions/3528509/document-readyfunction-vs-function/3528528#3528528 --Berker > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From python-checkins at python.org Wed Oct 26 13:06:17 2011 From: python-checkins at python.org (nick.coghlan) Date: Wed, 26 Oct 2011 13:06:17 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMjM3?= =?utf8?q?=3A_further_updates_to_subprocess_documentation?= Message-ID: http://hg.python.org/cpython/rev/0b4df6701c4d changeset: 73131:0b4df6701c4d branch: 2.7 parent: 73125:a7191ec811c6 user: Nick Coghlan date: Wed Oct 26 21:05:56 2011 +1000 summary: Issue #13237: further updates to subprocess documentation files: Doc/library/subprocess.rst | 154 +++++++++++++++--------- 1 files changed, 97 insertions(+), 57 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -31,12 +31,12 @@ Using the subprocess Module --------------------------- -The recommended interface to this module is to use the following convenience -functions for all use cases they can handle. For more advanced use cases, the -underlying :class:`Popen` interface can be used directly. +The recommended approach to invoking subprocesses is to use the following +convenience functions for all use cases they can handle. For more advanced +use cases, the underlying :class:`Popen` interface can be used directly. -.. function:: call(args, *, stdin=None, stdout=None, stderr=None) +.. function:: call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Run the command described by *args*. Wait for command to complete, then return the :attr:`returncode` attribute. @@ -51,15 +51,15 @@ >>> subprocess.call(["ls", "-l"]) 0 - >>> subprocess.call(["python", "-c", "import sys; sys.exit(1)"]) + >>> subprocess.call("exit 1", shell=True) 1 .. warning:: - Like :meth:`Popen.wait`, this will deadlock when using - ``stdout=PIPE`` and/or ``stderr=PIPE`` and the child process - generates enough output to a pipe such that it blocks waiting - for the OS pipe buffer to accept more data. + Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. As + the pipes are not being read in the current process, the child + process may block if it generates enough output to a pipe to fill up + the OS pipe buffer. .. function:: check_call(*callargs, **kwargs) @@ -74,10 +74,10 @@ >>> subprocess.check_call(["ls", "-l"]) 0 - >>> subprocess.check_call(["python", "-c", "import sys; sys.exit(1)"]) + >>> subprocess.check_call("exit 1", shell=True) Traceback (most recent call last): ... - subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 .. versionadded:: 2.5 @@ -95,27 +95,46 @@ :attr:`returncode` attribute and any output in the :attr:`output` attribute. + The arguments are the same as for :func:`call`, except that *stdout* is + not permitted as it is used internally. + Examples:: - >>> subprocess.check_output(["ls", "-l", "/dev/null"]) - 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' + >>> subprocess.check_output(["echo", "Hello World!"]) + b'Hello World!\n' - >>> subprocess.check_output(["python", "-c", "import sys; sys.exit(1)"]) + >>> subprocess.check_output(["echo", "Hello World!"], universal_newlines=True) + 'Hello World!\n' + + >>> subprocess.check_output("exit 1", shell=True) Traceback (most recent call last): ... - subprocess.CalledProcessError: Command '['python', '-c', 'import sys; sys.exit(1)']' returned non-zero exit status 1 + subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 - The arguments are the same as for :func:`call`, except that *stdout* is - not allowed as it is used internally. To also capture standard error in - the result, use ``stderr=subprocess.STDOUT``:: + By default, this function will return the data as encoded bytes. The actual + encoding of the output data may depend on the command being invoked, so the + decoding to text will often need to be handled at the application level. + + This behaviour may be overridden by setting *universal_newlines* to + :const:`True` as described below in :ref:`frequently-used-arguments`. + + To also capture standard error in the result, use + ``stderr=subprocess.STDOUT``:: >>> subprocess.check_output( - ... ["/bin/sh", "-c", "ls non_existent_file; exit 0"], - ... stderr=subprocess.STDOUT) + ... "ls non_existent_file; exit 0", + ... stderr=subprocess.STDOUT, + ... shell=True) 'ls: non_existent_file: No such file or directory\n' .. versionadded:: 2.7 + .. warning:: + + Do not use ``stderr=PIPE`` with this function. As the pipe is not being + read in the current process, the child process may block if it + generates enough output to the pipe to fill up the OS pipe buffer. + .. data:: PIPE @@ -141,10 +160,13 @@ most typical use cases, many of these arguments can be safely left at their default values. The arguments that are most commonly needed are: - *args* should be a string, or a sequence of program arguments. Providing - a sequence of arguments is generally preferred, as it allows the module to - take care of any required escaping and quoting of arguments (e.g. to permit - spaces in file names) + *args* is required for all calls and should be a string, or a sequence of + program arguments. Providing a sequence of arguments is generally + preferred, as it allows the module to take care of any required escaping + and quoting of arguments (e.g. to permit spaces in file names). If passing + a single string, either *shell* must be :const:`True` (see below) or else + the string must simply name the program to be executed without specifying + any arguments. *stdin*, *stdout* and *stderr* specify the executed program's standard input, standard output and standard error file handles, respectively. Valid values @@ -156,6 +178,37 @@ the stderr data from the child process should be captured into the same file handle as for stdout. + When *stdout* or *stderr* are pipes and *universal_newlines* is + :const:`True` then the output data is assumed to be encoded as UTF-8 and + will automatically be decoded to text. All line endings will be converted + to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to :func:`open`. + + If *shell* is :const:`True`, the specified command will be executed through + the shell. This can be useful if you are using Python primarily for the + enhanced control flow it offers over most system shells and still want + access to other shell features such as filename wildcards, shell pipes and + environment variable expansion. + + .. warning:: + + Executing shell commands that incorporate unsanitized input from an + untrusted source makes a program vulnerable to `shell injection + `_, + a serious security flaw which can result in arbitrary command execution. + For this reason, the use of *shell=True* is **strongly discouraged** in cases + where the command string is constructed from external input:: + + >>> from subprocess import call + >>> filename = input("What file would you like to display?\n") + What file would you like to display? + non_existent; rm -rf / # + >>> call("cat " + filename, shell=True) # Uh-oh. This will end badly... + + ``shell=False`` disables all shell based features, but does not suffer + from this vulnerability; see the Note in the :class:`Popen` constructor + documentation for helpful hints in getting ``shell=False`` to work. + These options, along with all of the other options, are described in more detail in the :class:`Popen` constructor documentation. @@ -216,24 +269,6 @@ Popen(['/bin/sh', '-c', args[0], args[1], ...]) - .. warning:: - - Executing shell commands that incorporate unsanitized input from an - untrusted source makes a program vulnerable to `shell injection - `_, - a serious security flaw which can result in arbitrary command execution. - For this reason, the use of *shell=True* is **strongly discouraged** in cases - where the command string is constructed from external input:: - - >>> from subprocess import call - >>> filename = input("What file would you like to display?\n") - What file would you like to display? - non_existent; rm -rf / # - >>> call("cat " + filename, shell=True) # Uh-oh. This will end badly... - - *shell=False* does not suffer from this vulnerability; the above Note may be - helpful in getting code using *shell=False* to work. - On Windows: the :class:`Popen` class uses CreateProcess() to execute the child child program, which operates on strings. If *args* is a sequence, it will be converted to a string in a manner described in @@ -335,16 +370,19 @@ A :exc:`ValueError` will be raised if :class:`Popen` is called with invalid arguments. -check_call() will raise :exc:`CalledProcessError`, if the called process returns -a non-zero return code. +:func:`check_call` and :func:`check_output` will raise +:exc:`CalledProcessError` if the called process returns a non-zero return +code. Security ^^^^^^^^ -Unlike some other popen functions, this implementation will never call /bin/sh -implicitly. This means that all characters, including shell metacharacters, can -safely be passed to child processes. +Unlike some other popen functions, this implementation will never call a +system shell implicitly. This means that all characters, including shell +metacharacters, can safely be passed to child processes. Obviously, if the +shell is invoked explicitly, then it is the application's responsibility to +all that all whitespace and metacharacters are quoted appropriately. Popen Objects @@ -582,14 +620,17 @@ .. note:: - All functions in this section fail (more or less) silently if the executed - program cannot be found; this module raises an :exc:`OSError` exception. In - addition, the replacements using :func:`check_output` will fail with a + All "a" functions in this section fail (more or less) silently if the + executed program cannot be found; the "b" replacements raise :exc:`OSError` + instead. + + In addition, the replacements using :func:`check_output` will fail with a :exc:`CalledProcessError` if the requested operation produces a non-zero - return code. + return code. The output is still available as the ``output`` attribute of + the raised exception. -In the following examples, we assume that the subprocess module is imported with -"from subprocess import \*". +In the following examples, we assume that the relevant functions have already +been imported from the subprocess module. Replacing /bin/sh shell backquote @@ -617,8 +658,8 @@ The p1.stdout.close() call after starting the p2 is important in order for p1 to receive a SIGPIPE if p2 exits before p1. -Alternatively, for trusted input, the shell's pipeline may still be used -directly: +Alternatively, for trusted input, the shell's own pipeline support may still +be used directly: output=`dmesg | grep hda` # becomes @@ -638,8 +679,6 @@ * Calling the program through the shell is usually not required. -* It's easier to look at the :attr:`returncode` attribute than the exit status. - A more realistic example would look like this:: try: @@ -784,6 +823,7 @@ * popen2 closes all file descriptors by default, but you have to specify ``close_fds=True`` with :class:`Popen`. + Notes ----- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 13:16:05 2011 From: python-checkins at python.org (nick.coghlan) Date: Wed, 26 Oct 2011 13:16:05 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMjM3?= =?utf8?q?=3A_remove_some_details_that_only_apply_to_the_3=2Ex_version_of_?= =?utf8?q?this?= Message-ID: http://hg.python.org/cpython/rev/f445c125aca3 changeset: 73132:f445c125aca3 branch: 2.7 user: Nick Coghlan date: Wed Oct 26 21:15:53 2011 +1000 summary: Issue #13237: remove some details that only apply to the 3.x version of this module and cross reference the relocated warning about the dangers of invoking the shell with untrusted input files: Doc/library/subprocess.rst | 22 ++++++++-------------- 1 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -101,9 +101,6 @@ Examples:: >>> subprocess.check_output(["echo", "Hello World!"]) - b'Hello World!\n' - - >>> subprocess.check_output(["echo", "Hello World!"], universal_newlines=True) 'Hello World!\n' >>> subprocess.check_output("exit 1", shell=True) @@ -111,13 +108,6 @@ ... subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1 - By default, this function will return the data as encoded bytes. The actual - encoding of the output data may depend on the command being invoked, so the - decoding to text will often need to be handled at the application level. - - This behaviour may be overridden by setting *universal_newlines* to - :const:`True` as described below in :ref:`frequently-used-arguments`. - To also capture standard error in the result, use ``stderr=subprocess.STDOUT``:: @@ -179,10 +169,8 @@ handle as for stdout. When *stdout* or *stderr* are pipes and *universal_newlines* is - :const:`True` then the output data is assumed to be encoded as UTF-8 and - will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument - to :func:`open`. + :const:`True` then all line endings will be converted to ``'\n'`` as + described for the universal newlines `'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through the shell. This can be useful if you are using Python primarily for the @@ -318,6 +306,12 @@ If *shell* is :const:`True`, the specified command will be executed through the shell. + .. note:: + + Enabling this option can be a security hazard if combined with untrusted + input. See the warning under :ref:`frequently-used-arguments` + for details. + If *cwd* is not ``None``, the child's current directory will be changed to *cwd* before it is executed. Note that this directory is not considered when searching the executable, so you can't specify the program's path relative to -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 13:34:38 2011 From: python-checkins at python.org (nick.coghlan) Date: Wed, 26 Oct 2011 13:34:38 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMjM3?= =?utf8?q?=3A_fix_typo?= Message-ID: http://hg.python.org/cpython/rev/5dfe6d7f7c61 changeset: 73133:5dfe6d7f7c61 branch: 2.7 user: Nick Coghlan date: Wed Oct 26 21:34:26 2011 +1000 summary: Issue #13237: fix typo files: Doc/library/subprocess.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -376,7 +376,7 @@ system shell implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Obviously, if the shell is invoked explicitly, then it is the application's responsibility to -all that all whitespace and metacharacters are quoted appropriately. +ensure that all whitespace and metacharacters are quoted appropriately. Popen Objects -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 14:17:26 2011 From: python-checkins at python.org (vinay.sajip) Date: Wed, 26 Oct 2011 14:17:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Changed_warn=28=29_to_warni?= =?utf8?q?ng=28=29_in_logging_tests=2E?= Message-ID: http://hg.python.org/cpython/rev/5611acf6917c changeset: 73134:5611acf6917c parent: 73130:fbba3ecc92dc user: Vinay Sajip date: Wed Oct 26 13:17:20 2011 +0100 summary: Changed warn() to warning() in logging tests. files: Lib/test/test_logging.py | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -196,17 +196,17 @@ INF.log(logging.CRITICAL, m()) INF.error(m()) - INF.warn(m()) + INF.warning(m()) INF.info(m()) DEB.log(logging.CRITICAL, m()) DEB.error(m()) - DEB.warn (m()) - DEB.info (m()) + DEB.warning(m()) + DEB.info(m()) DEB.debug(m()) # These should not log. - ERR.warn(m()) + ERR.warning(m()) ERR.info(m()) ERR.debug(m()) @@ -240,7 +240,7 @@ INF_ERR.error(m()) # These should not log. - INF_ERR.warn(m()) + INF_ERR.warning(m()) INF_ERR.info(m()) INF_ERR.debug(m()) @@ -264,14 +264,14 @@ # These should log. INF_UNDEF.log(logging.CRITICAL, m()) INF_UNDEF.error(m()) - INF_UNDEF.warn(m()) + INF_UNDEF.warning(m()) INF_UNDEF.info(m()) INF_ERR_UNDEF.log(logging.CRITICAL, m()) INF_ERR_UNDEF.error(m()) # These should not log. INF_UNDEF.debug(m()) - INF_ERR_UNDEF.warn(m()) + INF_ERR_UNDEF.warning(m()) INF_ERR_UNDEF.info(m()) INF_ERR_UNDEF.debug(m()) @@ -974,7 +974,7 @@ self.mem_logger.info(self.next_message()) self.assert_log_lines([]) # This will flush because the level is >= logging.WARNING - self.mem_logger.warn(self.next_message()) + self.mem_logger.warning(self.next_message()) lines = [ ('DEBUG', '1'), ('INFO', '2'), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 17:58:13 2011 From: python-checkins at python.org (jesus.cea) Date: Wed, 26 Oct 2011 17:58:13 +0200 Subject: [Python-checkins] =?utf8?q?devguide=3A_Close_=2313269=3A_Document?= =?utf8?q?_that_=22Remote_hg_repo=22_accepts_remote_branches?= Message-ID: http://hg.python.org/devguide/rev/7fbd2fe8c13c changeset: 460:7fbd2fe8c13c user: Jesus Cea date: Wed Oct 26 17:58:01 2011 +0200 summary: Close #13269: Document that "Remote hg repo" accepts remote branches files: triaging.rst | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/triaging.rst b/triaging.rst --- a/triaging.rst +++ b/triaging.rst @@ -256,10 +256,12 @@ Mercurial Repository '''''''''''''''''''' HTTP link to a Mercurial repository that contains a patch for the issue. -The patch should be in the default branch of that repository. The -`Create Patch` button will then compute a diff for the head revision +The `Create Patch` button will then compute a diff for the head revision of the remote branch, and attach the diff to the issue. +If you don't indicate a remote branch, ``default`` is used. You can +indicate a remote branch adding ``#BRANCH`` at the end of the URL. + Generating Special Links in a Comment ------------------------------------- Comments can automatically generate a link to various web pages if formatted -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Wed Oct 26 20:30:57 2011 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 26 Oct 2011 20:30:57 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEwODYw?= =?utf8?q?=3A_Skip_the_new_test_if_HTTPS_is_not_available?= Message-ID: http://hg.python.org/cpython/rev/e0499b2b28aa changeset: 73135:e0499b2b28aa branch: 2.7 parent: 73133:5dfe6d7f7c61 user: Petri Lehtinen date: Wed Oct 26 21:25:56 2011 +0300 summary: Issue #10860: Skip the new test if HTTPS is not available files: Lib/test/test_httplib.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -441,6 +441,7 @@ h = httplib.HTTPSConnection(HOST, TimeoutTest.PORT, timeout=30) self.assertEqual(h.timeout, 30) + @unittest.skipIf(not hasattr(httplib, 'HTTPS'), 'httplib.HTTPS not available') def test_host_port(self): # Check invalid host_port -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 20:30:58 2011 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 26 Oct 2011 20:30:58 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwODYw?= =?utf8?q?=3A_Skip_the_new_test_if_HTTPS_is_not_available?= Message-ID: http://hg.python.org/cpython/rev/a3939c2f6727 changeset: 73136:a3939c2f6727 branch: 3.2 parent: 73122:03ef6108beae user: Petri Lehtinen date: Wed Oct 26 21:29:15 2011 +0300 summary: Issue #10860: Skip the new test if HTTPS is not available files: Lib/test/test_httplib.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -541,6 +541,8 @@ resp = h.getresponse() self.assertEqual(resp.status, 404) + @unittest.skipIf(not hasattr(client, 'HTTPSConnection'), + 'http.client.HTTPSConnection not available') def test_host_port(self): # Check invalid host_port -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Oct 26 20:30:58 2011 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 26 Oct 2011 20:30:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310860=3A_Skip_the_new_test_if_HTTPS_is_not_availabl?= =?utf8?q?e?= Message-ID: http://hg.python.org/cpython/rev/2dd106799aa9 changeset: 73137:2dd106799aa9 parent: 73134:5611acf6917c parent: 73136:a3939c2f6727 user: Petri Lehtinen date: Wed Oct 26 21:29:54 2011 +0300 summary: Issue #10860: Skip the new test if HTTPS is not available files: Lib/test/test_httplib.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -541,6 +541,8 @@ self.assertEqual(resp.status, 404) del server + @unittest.skipIf(not hasattr(client, 'HTTPSConnection'), + 'http.client.HTTPSConnection not available') def test_host_port(self): # Check invalid host_port -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 01:39:16 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 27 Oct 2011 01:39:16 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_=2313247=3A_Add_cp650?= =?utf8?q?01_codec=2C_the_Windows_UTF-8_=28CP=5FUTF8=29?= Message-ID: http://hg.python.org/cpython/rev/2cad20e2e588 changeset: 73138:2cad20e2e588 user: Victor Stinner date: Thu Oct 27 01:38:56 2011 +0200 summary: Close #13247: Add cp65001 codec, the Windows UTF-8 (CP_UTF8) files: Doc/library/codecs.rst | 5 + Doc/whatsnew/3.3.rst | 5 + Lib/encodings/cp65001.py | 40 ++++++ Lib/test/test_codecs.py | 176 +++++++++++++++++--------- Misc/NEWS | 2 + 5 files changed, 168 insertions(+), 60 deletions(-) diff --git a/Doc/library/codecs.rst b/Doc/library/codecs.rst --- a/Doc/library/codecs.rst +++ b/Doc/library/codecs.rst @@ -1011,6 +1011,11 @@ +-----------------+--------------------------------+--------------------------------+ | cp1258 | windows-1258 | Vietnamese | +-----------------+--------------------------------+--------------------------------+ +| cp65001 | | Windows only: Windows UTF-8 | +| | | (``CP_UTF8``) | +| | | | +| | | .. versionadded:: 3.3 | ++-----------------+--------------------------------+--------------------------------+ | euc_jp | eucjp, ujis, u-jis | Japanese | +-----------------+--------------------------------+--------------------------------+ | euc_jis_2004 | jisx0213, eucjis2004 | Japanese | diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -225,6 +225,11 @@ :mod:`~encodings.mbcs` codec is now supporting all error handlers, instead of only ``replace`` to encode and ``ignore`` to decode. +A new Windows-only codec has been added: ``cp65001`` (:issue:`13247`). It is +the Windows code page 65001 (Windows UTF-8, ``CP_UTF8``). For example, it is +used by ``sys.stdout`` if the console output code page is set to cp65001 (e.g. +using ``chcp 65001`` command). + Multibyte CJK decoders now resynchronize faster. They only ignore the first byte of an invalid byte sequence. For example, ``b'\xff\n'.decode('gb2312', 'replace')`` now returns a ``\n`` after the replacement character. diff --git a/Lib/encodings/cp65001.py b/Lib/encodings/cp65001.py new file mode 100644 --- /dev/null +++ b/Lib/encodings/cp65001.py @@ -0,0 +1,40 @@ +""" +Code page 65001: Windows UTF-8 (CP_UTF8). +""" + +import codecs +import functools + +if not hasattr(codecs, 'code_page_encode'): + raise LookupError("cp65001 encoding is only available on Windows") + +### Codec APIs + +encode = functools.partial(codecs.code_page_encode, 65001) +decode = functools.partial(codecs.code_page_decode, 65001) + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return encode(input, self.errors)[0] + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + _buffer_decode = decode + +class StreamWriter(codecs.StreamWriter): + encode = encode + +class StreamReader(codecs.StreamReader): + decode = decode + +### encodings module API + +def getregentry(): + return codecs.CodecInfo( + name='cp65001', + encode=encode, + decode=decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, + ) diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -4,6 +4,11 @@ import locale import sys, _testcapi, io +if sys.platform == 'win32': + VISTA_OR_LATER = (sys.getwindowsversion().major >= 6) +else: + VISTA_OR_LATER = False + try: import ctypes except ImportError: @@ -636,6 +641,107 @@ "\U00010fff\uD800") self.assertTrue(codecs.lookup_error("surrogatepass")) + at unittest.skipUnless(sys.platform == 'win32', + 'cp65001 is a Windows-only codec') +class CP65001Test(ReadTest): + encoding = "cp65001" + + def test_encode(self): + tests = [ + ('abc', 'strict', b'abc'), + ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), + ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), + ] + if VISTA_OR_LATER: + tests.extend(( + ('\udc80', 'strict', None), + ('\udc80', 'ignore', b''), + ('\udc80', 'replace', b'?'), + ('\udc80', 'backslashreplace', b'\\udc80'), + ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), + )) + else: + tests.append(('\udc80', 'strict', b'\xed\xb2\x80')) + for text, errors, expected in tests: + if expected is not None: + try: + encoded = text.encode('cp65001', errors) + except UnicodeEncodeError as err: + self.fail('Unable to encode %a to cp65001 with ' + 'errors=%r: %s' % (text, errors, err)) + self.assertEqual(encoded, expected, + '%a.encode("cp65001", %r)=%a != %a' + % (text, errors, encoded, expected)) + else: + self.assertRaises(UnicodeEncodeError, + text.encode, "cp65001", errors) + + def test_decode(self): + tests = [ + (b'abc', 'strict', 'abc'), + (b'\xc3\xa9\xe2\x82\xac', 'strict', '\xe9\u20ac'), + (b'\xf4\x8f\xbf\xbf', 'strict', '\U0010ffff'), + (b'\xef\xbf\xbd', 'strict', '\ufffd'), + (b'[\xc3\xa9]', 'strict', '[\xe9]'), + # invalid bytes + (b'[\xff]', 'strict', None), + (b'[\xff]', 'ignore', '[]'), + (b'[\xff]', 'replace', '[\ufffd]'), + (b'[\xff]', 'surrogateescape', '[\udcff]'), + ] + if VISTA_OR_LATER: + tests.extend(( + (b'[\xed\xb2\x80]', 'strict', None), + (b'[\xed\xb2\x80]', 'ignore', '[]'), + (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), + )) + else: + tests.extend(( + (b'[\xed\xb2\x80]', 'strict', '[\udc80]'), + )) + for raw, errors, expected in tests: + if expected is not None: + try: + decoded = raw.decode('cp65001', errors) + except UnicodeDecodeError as err: + self.fail('Unable to decode %a from cp65001 with ' + 'errors=%r: %s' % (raw, errors, err)) + self.assertEqual(decoded, expected, + '%a.decode("cp65001", %r)=%a != %a' + % (raw, errors, decoded, expected)) + else: + self.assertRaises(UnicodeDecodeError, + raw.decode, 'cp65001', errors) + + @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later') + def test_lone_surrogates(self): + self.assertRaises(UnicodeEncodeError, "\ud800".encode, "cp65001") + self.assertRaises(UnicodeDecodeError, b"\xed\xa0\x80".decode, "cp65001") + self.assertEqual("[\uDC80]".encode("cp65001", "backslashreplace"), + b'[\\udc80]') + self.assertEqual("[\uDC80]".encode("cp65001", "xmlcharrefreplace"), + b'[�]') + self.assertEqual("[\uDC80]".encode("cp65001", "surrogateescape"), + b'[\x80]') + self.assertEqual("[\uDC80]".encode("cp65001", "ignore"), + b'[]') + self.assertEqual("[\uDC80]".encode("cp65001", "replace"), + b'[?]') + + @unittest.skipUnless(VISTA_OR_LATER, 'require Windows Vista or later') + def test_surrogatepass_handler(self): + self.assertEqual("abc\ud800def".encode("cp65001", "surrogatepass"), + b"abc\xed\xa0\x80def") + self.assertEqual(b"abc\xed\xa0\x80def".decode("cp65001", "surrogatepass"), + "abc\ud800def") + self.assertEqual("\U00010fff\uD800".encode("cp65001", "surrogatepass"), + b"\xf0\x90\xbf\xbf\xed\xa0\x80") + self.assertEqual(b"\xf0\x90\xbf\xbf\xed\xa0\x80".decode("cp65001", "surrogatepass"), + "\U00010fff\uD800") + self.assertTrue(codecs.lookup_error("surrogatepass")) + + + class UTF7Test(ReadTest): encoding = "utf-7" @@ -1747,11 +1853,9 @@ @unittest.skipUnless(sys.platform == 'win32', 'code pages are specific to Windows') class CodePageTest(unittest.TestCase): + # CP_UTF8 is already tested by CP65001Test CP_UTF8 = 65001 - def vista_or_later(self): - return (sys.getwindowsversion().major >= 6) - def test_invalid_code_page(self): self.assertRaises(ValueError, codecs.code_page_encode, -1, 'a') self.assertRaises(ValueError, codecs.code_page_decode, -1, b'a') @@ -1804,19 +1908,22 @@ self.check_encode(932, ( ('abc', 'strict', b'abc'), ('\uff44\u9a3e', 'strict', b'\x82\x84\xe9\x80'), - # not encodable + # test error handlers ('\xff', 'strict', None), ('[\xff]', 'ignore', b'[]'), ('[\xff]', 'replace', b'[y]'), ('[\u20ac]', 'replace', b'[?]'), + ('[\xff]', 'backslashreplace', b'[\\xff]'), + ('[\xff]', 'xmlcharrefreplace', b'[ÿ]'), )) self.check_decode(932, ( (b'abc', 'strict', 'abc'), (b'\x82\x84\xe9\x80', 'strict', '\uff44\u9a3e'), # invalid bytes - (b'\xff', 'strict', None), - (b'\xff', 'ignore', ''), - (b'\xff', 'replace', '\ufffd'), + (b'[\xff]', 'strict', None), + (b'[\xff]', 'ignore', '[]'), + (b'[\xff]', 'replace', '[\ufffd]'), + (b'[\xff]', 'surrogateescape', '[\udcff]'), (b'\x81\x00abc', 'strict', None), (b'\x81\x00abc', 'ignore', '\x00abc'), (b'\x81\x00abc', 'replace', '\ufffd\x00abc'), @@ -1857,58 +1964,6 @@ (b'[\xff]', 'strict', '[\xff]'), )) - def test_cp_utf8(self): - cp = self.CP_UTF8 - - tests = [ - ('abc', 'strict', b'abc'), - ('\xe9\u20ac', 'strict', b'\xc3\xa9\xe2\x82\xac'), - ('\U0010ffff', 'strict', b'\xf4\x8f\xbf\xbf'), - ] - if self.vista_or_later(): - tests.append(('\udc80', 'strict', None)) - tests.append(('\udc80', 'ignore', b'')) - tests.append(('\udc80', 'replace', b'?')) - else: - tests.append(('\udc80', 'strict', b'\xed\xb2\x80')) - self.check_encode(cp, tests) - - tests = [ - (b'abc', 'strict', 'abc'), - (b'\xc3\xa9\xe2\x82\xac', 'strict', '\xe9\u20ac'), - (b'\xf4\x8f\xbf\xbf', 'strict', '\U0010ffff'), - (b'\xef\xbf\xbd', 'strict', '\ufffd'), - (b'[\xc3\xa9]', 'strict', '[\xe9]'), - # invalid bytes - (b'[\xff]', 'strict', None), - (b'[\xff]', 'ignore', '[]'), - (b'[\xff]', 'replace', '[\ufffd]'), - ] - if self.vista_or_later(): - tests.extend(( - (b'[\xed\xb2\x80]', 'strict', None), - (b'[\xed\xb2\x80]', 'ignore', '[]'), - (b'[\xed\xb2\x80]', 'replace', '[\ufffd\ufffd\ufffd]'), - )) - else: - tests.extend(( - (b'[\xed\xb2\x80]', 'strict', '[\udc80]'), - )) - self.check_decode(cp, tests) - - def test_error_handlers(self): - self.check_encode(932, ( - ('\xff', 'backslashreplace', b'\\xff'), - ('\xff', 'xmlcharrefreplace', b'ÿ'), - )) - self.check_decode(932, ( - (b'\xff', 'surrogateescape', '\udcff'), - )) - if self.vista_or_later(): - self.check_encode(self.CP_UTF8, ( - ('\udc80', 'surrogatepass', b'\xed\xb2\x80'), - )) - def test_multibyte_encoding(self): self.check_decode(932, ( (b'\x84\xe9\x80', 'ignore', '\u9a3e'), @@ -1918,7 +1973,7 @@ (b'\xff\xf4\x8f\xbf\xbf', 'ignore', '\U0010ffff'), (b'\xff\xf4\x8f\xbf\xbf', 'replace', '\ufffd\U0010ffff'), )) - if self.vista_or_later(): + if VISTA_OR_LATER: self.check_encode(self.CP_UTF8, ( ('[\U0010ffff\uDC80]', 'ignore', b'[\xf4\x8f\xbf\xbf]'), ('[\U0010ffff\uDC80]', 'replace', b'[\xf4\x8f\xbf\xbf?]'), @@ -1951,6 +2006,7 @@ UTF16BETest, UTF8Test, UTF8SigTest, + CP65001Test, UTF7Test, UTF16ExTest, ReadBufferTest, diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,8 @@ Library ------- +- Issue #13247: Add cp65001 codec, the Windows UTF-8 (CP_UTF8). + - Issue #13226: Add RTLD_xxx constants to the os module. These constants can be used with sys.setdlopenflags(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 01:42:38 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 27 Oct 2011 01:42:38 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_the_issue_number_of_my_?= =?utf8?q?cp65001_commit=3A_13247_=3D=3E_issue_=2313216?= Message-ID: http://hg.python.org/cpython/rev/0eac706d82d1 changeset: 73139:0eac706d82d1 user: Victor Stinner date: Thu Oct 27 01:43:48 2011 +0200 summary: Fix the issue number of my cp65001 commit: 13247 => issue #13216 files: Doc/whatsnew/3.3.rst | 2 +- Misc/NEWS | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -225,7 +225,7 @@ :mod:`~encodings.mbcs` codec is now supporting all error handlers, instead of only ``replace`` to encode and ``ignore`` to decode. -A new Windows-only codec has been added: ``cp65001`` (:issue:`13247`). It is +A new Windows-only codec has been added: ``cp65001`` (:issue:`13216`). It is the Windows code page 65001 (Windows UTF-8, ``CP_UTF8``). For example, it is used by ``sys.stdout`` if the console output code page is set to cp65001 (e.g. using ``chcp 65001`` command). diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,7 +341,7 @@ Library ------- -- Issue #13247: Add cp65001 codec, the Windows UTF-8 (CP_UTF8). +- Issue #13216: Add cp65001 codec, the Windows UTF-8 (CP_UTF8). - Issue #13226: Add RTLD_xxx constants to the os module. These constants can be used with sys.setdlopenflags(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 01:55:22 2011 From: python-checkins at python.org (victor.stinner) Date: Thu, 27 Oct 2011 01:55:22 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FFSDecoder=28=29?= =?utf8?q?_ensures_that_the_decoded_string_is_ready?= Message-ID: http://hg.python.org/cpython/rev/e7340f2a42eb changeset: 73140:e7340f2a42eb user: Victor Stinner date: Thu Oct 27 01:56:33 2011 +0200 summary: PyUnicode_FSDecoder() ensures that the decoded string is ready files: Objects/unicodeobject.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -3318,6 +3318,10 @@ return 0; } } + if (PyUnicode_READY(output) < 0) { + Py_DECREF(output); + return 0; + } if (findchar(PyUnicode_DATA(output), PyUnicode_KIND(output), PyUnicode_GET_LENGTH(output), 0, 1) >= 0) { PyErr_SetString(PyExc_TypeError, "embedded NUL character"); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Oct 27 05:34:37 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 27 Oct 2011 05:34:37 +0200 Subject: [Python-checkins] Daily reference leaks (e7340f2a42eb): sum=0 Message-ID: results for e7340f2a42eb on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogpcdxDf', '-x'] From ezio.melotti at gmail.com Thu Oct 27 06:06:02 2011 From: ezio.melotti at gmail.com (Ezio Melotti) Date: Thu, 27 Oct 2011 07:06:02 +0300 Subject: [Python-checkins] r88914 - tracker/instances/python-dev/html/issue.item.js In-Reply-To: References: <3ST4gT603mzP7n@mail.python.org> Message-ID: <4EA8D8AA.8090000@gmail.com> Hi, On 26/10/2011 12.39, Berker Peksa? wrote: > Hi, > I think this is shorter than $(document).ready(); > > $(function() { > // ... > }); > > See: http://stackoverflow.com/questions/3528509/document-readyfunction-vs-function/3528528#3528528 Thanks a lot for the review, I didn't know about this shortcut! However I think I'll just leave $(document).ready(...); because, even if longer, is more explicit and readable. Best Regards, Ezio Melotti > --Berker > From python-checkins at python.org Thu Oct 27 07:31:35 2011 From: python-checkins at python.org (ezio.melotti) Date: Thu, 27 Oct 2011 07:31:35 +0200 (CEST) Subject: [Python-checkins] r88915 - tracker/instances/python-dev/html/issue.item.js Message-ID: <3STcK36S7wzNZ0@mail.python.org> Author: ezio.melotti Date: Thu Oct 27 07:31:35 2011 New Revision: 88915 Log: Use $(document).ready instead of window.onload. Modified: tracker/instances/python-dev/html/issue.item.js Modified: tracker/instances/python-dev/html/issue.item.js ============================================================================== --- tracker/instances/python-dev/html/issue.item.js (original) +++ tracker/instances/python-dev/html/issue.item.js Thu Oct 27 07:31:35 2011 @@ -1,4 +1,4 @@ -window.onload = function () { +$(document).ready(function () { // create the input button and use it to replace the span/placeholder -- // users without javascript won't notice anything. // This might eventually be replaced by jquery @@ -17,7 +17,7 @@ add_me_button.style.display = 'inline'; add_me_parent.replaceChild(add_me_button, add_me_span); add_me_button.id = node_id; -} +}) function add_to_nosy(user) { From python-checkins at python.org Thu Oct 27 09:55:43 2011 From: python-checkins at python.org (nick.coghlan) Date: Thu, 27 Oct 2011 09:55:43 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMjM3?= =?utf8?q?=3A_Make_the_subprocess_convenience_helper_documentation?= Message-ID: http://hg.python.org/cpython/rev/2a2df6a72ccb changeset: 73141:2a2df6a72ccb branch: 2.7 parent: 73135:e0499b2b28aa user: Nick Coghlan date: Thu Oct 27 17:55:13 2011 +1000 summary: Issue #13237: Make the subprocess convenience helper documentation self-contained aside from the shared parameter description. Downgrade the pipe warnings at that level to notes (since those pipes are hidden, people are unlikely to even try it) files: Doc/library/subprocess.rst | 52 +++++++++++++++++++++----- 1 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -42,9 +42,10 @@ return the :attr:`returncode` attribute. The arguments shown above are merely the most common ones, described below - in :ref:`frequently-used-arguments`. The full function signature is the - same as that of the :class:`Popen` constructor - the convenience functions - pass all supplied arguments directly through to that interface. + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is the same as + that of the :class:`Popen` constructor - this functions passes all + supplied arguments directly through to that interface. Examples:: @@ -56,20 +57,32 @@ .. warning:: + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + + .. note:: + Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. As the pipes are not being read in the current process, the child process may block if it generates enough output to a pipe to fill up the OS pipe buffer. -.. function:: check_call(*callargs, **kwargs) +.. function:: check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Run command with arguments. Wait for command to complete. If the return code was zero then return, otherwise raise :exc:`CalledProcessError`. The :exc:`CalledProcessError` object will have the return code in the :attr:`returncode` attribute. - The arguments are the same as for :func:`call`. Examples:: + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is the same as + that of the :class:`Popen` constructor - this functions passes all + supplied arguments directly through to that interface. + + Examples:: >>> subprocess.check_call(["ls", "-l"]) 0 @@ -83,10 +96,19 @@ .. warning:: - See the warning for :func:`call`. + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + .. note:: -.. function:: check_output(*callargs, **kwargs) + Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. As + the pipes are not being read in the current process, the child + process may block if it generates enough output to a pipe to fill up + the OS pipe buffer. + + +.. function:: check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) Run command with arguments and return its output as a byte string. @@ -95,8 +117,12 @@ :attr:`returncode` attribute and any output in the :attr:`output` attribute. - The arguments are the same as for :func:`call`, except that *stdout* is - not permitted as it is used internally. + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is largely the + same as that of the :class:`Popen` constructor, except that *stdout* is + not permitted as it is used internally. All other supplied arguments are + passed directly through to the :class:`Popen` constructor. Examples:: @@ -121,6 +147,12 @@ .. warning:: + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + + .. note:: + Do not use ``stderr=PIPE`` with this function. As the pipe is not being read in the current process, the child process may block if it generates enough output to the pipe to fill up the OS pipe buffer. @@ -306,7 +338,7 @@ If *shell* is :const:`True`, the specified command will be executed through the shell. - .. note:: + .. warning:: Enabling this option can be a security hazard if combined with untrusted input. See the warning under :ref:`frequently-used-arguments` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 14:24:53 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 27 Oct 2011 14:24:53 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_add_a_test_for_?= =?utf8?q?an_assertion_with_tuple_msg?= Message-ID: http://hg.python.org/cpython/rev/67bfadf4f954 changeset: 73142:67bfadf4f954 branch: 2.7 parent: 73135:e0499b2b28aa user: Benjamin Peterson date: Thu Oct 27 08:20:01 2011 -0400 summary: add a test for an assertion with tuple msg files: Lib/test/test_exceptions.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -473,6 +473,12 @@ with self.assertRaises(TypeError): raise MyException + def test_assert_with_tuple_arg(self): + try: + assert False, (3,) + except AssertionError as e: + self.assertEqual(str(e), "(3,)") + # Helper class used by TestSameStrAndUnicodeMsg class ExcWithOverriddenStr(Exception): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 14:24:54 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 27 Oct 2011 14:24:54 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_don=27t_let_a_t?= =?utf8?q?uple_msg_be_interpreted_as_arguments_to_AssertionError_=28closes?= Message-ID: http://hg.python.org/cpython/rev/7bef55ae5753 changeset: 73143:7bef55ae5753 branch: 2.7 user: Benjamin Peterson date: Thu Oct 27 08:21:59 2011 -0400 summary: don't let a tuple msg be interpreted as arguments to AssertionError (closes #13268) files: Misc/NEWS | 2 ++ Python/compile.c | 6 ++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,8 @@ Core and Builtins ----------------- +- Issue #13268: Fix the assert statement when a tuple is passed as the message. + - Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. diff --git a/Python/compile.c b/Python/compile.c --- a/Python/compile.c +++ b/Python/compile.c @@ -2079,11 +2079,9 @@ ADDOP_O(c, LOAD_GLOBAL, assertion_error, names); if (s->v.Assert.msg) { VISIT(c, expr, s->v.Assert.msg); - ADDOP_I(c, RAISE_VARARGS, 2); + ADDOP_I(c, CALL_FUNCTION, 1); } - else { - ADDOP_I(c, RAISE_VARARGS, 1); - } + ADDOP_I(c, RAISE_VARARGS, 1); compiler_use_next_block(c, end); return 1; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 14:24:54 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 27 Oct 2011 14:24:54 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/e39390fbd2aa changeset: 73144:e39390fbd2aa branch: 2.7 parent: 73143:7bef55ae5753 parent: 73141:2a2df6a72ccb user: Benjamin Peterson date: Thu Oct 27 08:22:27 2011 -0400 summary: merge heads files: Doc/library/subprocess.rst | 52 +++++++++++++++++++++----- 1 files changed, 42 insertions(+), 10 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -42,9 +42,10 @@ return the :attr:`returncode` attribute. The arguments shown above are merely the most common ones, described below - in :ref:`frequently-used-arguments`. The full function signature is the - same as that of the :class:`Popen` constructor - the convenience functions - pass all supplied arguments directly through to that interface. + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is the same as + that of the :class:`Popen` constructor - this functions passes all + supplied arguments directly through to that interface. Examples:: @@ -56,20 +57,32 @@ .. warning:: + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + + .. note:: + Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. As the pipes are not being read in the current process, the child process may block if it generates enough output to a pipe to fill up the OS pipe buffer. -.. function:: check_call(*callargs, **kwargs) +.. function:: check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False) Run command with arguments. Wait for command to complete. If the return code was zero then return, otherwise raise :exc:`CalledProcessError`. The :exc:`CalledProcessError` object will have the return code in the :attr:`returncode` attribute. - The arguments are the same as for :func:`call`. Examples:: + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is the same as + that of the :class:`Popen` constructor - this functions passes all + supplied arguments directly through to that interface. + + Examples:: >>> subprocess.check_call(["ls", "-l"]) 0 @@ -83,10 +96,19 @@ .. warning:: - See the warning for :func:`call`. + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + .. note:: -.. function:: check_output(*callargs, **kwargs) + Do not use ``stdout=PIPE`` or ``stderr=PIPE`` with this function. As + the pipes are not being read in the current process, the child + process may block if it generates enough output to a pipe to fill up + the OS pipe buffer. + + +.. function:: check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False) Run command with arguments and return its output as a byte string. @@ -95,8 +117,12 @@ :attr:`returncode` attribute and any output in the :attr:`output` attribute. - The arguments are the same as for :func:`call`, except that *stdout* is - not permitted as it is used internally. + The arguments shown above are merely the most common ones, described below + in :ref:`frequently-used-arguments` (hence the slightly odd notation in + the abbreviated signature). The full function signature is largely the + same as that of the :class:`Popen` constructor, except that *stdout* is + not permitted as it is used internally. All other supplied arguments are + passed directly through to the :class:`Popen` constructor. Examples:: @@ -121,6 +147,12 @@ .. warning:: + Invoking the system shell with ``shell=True`` can be a security hazard + if combined with untrusted input. See the warning under + :ref:`frequently-used-arguments` for details. + + .. note:: + Do not use ``stderr=PIPE`` with this function. As the pipe is not being read in the current process, the child process may block if it generates enough output to the pipe to fill up the OS pipe buffer. @@ -306,7 +338,7 @@ If *shell* is :const:`True`, the specified command will be executed through the shell. - .. note:: + .. warning:: Enabling this option can be a security hazard if combined with untrusted input. See the warning under :ref:`frequently-used-arguments` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 14:24:55 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 27 Oct 2011 14:24:55 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_add_a_test_for_an_assertion?= =?utf8?q?_with_tuple_msg?= Message-ID: http://hg.python.org/cpython/rev/d264804aa3f6 changeset: 73145:d264804aa3f6 parent: 73140:e7340f2a42eb user: Benjamin Peterson date: Thu Oct 27 08:20:01 2011 -0400 summary: add a test for an assertion with tuple msg files: Lib/test/test_raise.py | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -130,6 +130,13 @@ with self.assertRaises(TypeError): raise MyException + def test_assert_with_tuple_arg(self): + try: + assert False, (3,) + except AssertionError as e: + self.assertEqual(str(e), "(3,)") + + class TestCause(unittest.TestCase): def test_invalid_cause(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 14:53:39 2011 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 27 Oct 2011 14:53:39 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_adjust_for_chan?= =?utf8?q?ge_in_assert_bytecode?= Message-ID: http://hg.python.org/cpython/rev/595ad43fdd94 changeset: 73146:595ad43fdd94 branch: 2.7 parent: 73144:e39390fbd2aa user: Benjamin Peterson date: Thu Oct 27 08:53:32 2011 -0400 summary: adjust for change in assert bytecode files: Lib/test/test_dis.py | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -54,7 +54,7 @@ dis_bug1333982 = """\ %-4d 0 LOAD_CONST 1 (0) - 3 POP_JUMP_IF_TRUE 38 + 3 POP_JUMP_IF_TRUE 41 6 LOAD_GLOBAL 0 (AssertionError) 9 BUILD_LIST 0 12 LOAD_FAST 0 (x) @@ -67,10 +67,11 @@ %-4d >> 31 LOAD_CONST 2 (1) 34 BINARY_ADD - 35 RAISE_VARARGS 2 + 35 CALL_FUNCTION 1 + 38 RAISE_VARARGS 1 - %-4d >> 38 LOAD_CONST 0 (None) - 41 RETURN_VALUE + %-4d >> 41 LOAD_CONST 0 (None) + 44 RETURN_VALUE """%(bug1333982.func_code.co_firstlineno + 1, bug1333982.func_code.co_firstlineno + 2, bug1333982.func_code.co_firstlineno + 3) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 18:53:27 2011 From: python-checkins at python.org (vinay.sajip) Date: Thu, 27 Oct 2011 18:53:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Added_lost_docu?= =?utf8?q?mentation_cross-reference=2E?= Message-ID: http://hg.python.org/cpython/rev/5c57d1b29f20 changeset: 73147:5c57d1b29f20 branch: 3.2 parent: 73136:a3939c2f6727 user: Vinay Sajip date: Thu Oct 27 17:50:55 2011 +0100 summary: Added lost documentation cross-reference. files: Doc/howto/logging-cookbook.rst | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -674,9 +674,10 @@ to have all the processes log to a :class:`SocketHandler`, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing -processes to perform this function.) The following section documents this -approach in more detail and includes a working socket receiver which can be -used as a starting point for you to adapt in your own applications. +processes to perform this function.) :ref:`This section ` +documents this approach in more detail and includes a working socket receiver +which can be used as a starting point for you to adapt in your own +applications. If you are using a recent version of Python which includes the :mod:`multiprocessing` module, you could write your own handler which uses the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 18:53:28 2011 From: python-checkins at python.org (vinay.sajip) Date: Thu, 27 Oct 2011 18:53:28 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Added_lost_docu?= =?utf8?q?mentation_cross-reference=2E?= Message-ID: http://hg.python.org/cpython/rev/0bdf1906c2ea changeset: 73148:0bdf1906c2ea branch: 2.7 parent: 73146:595ad43fdd94 user: Vinay Sajip date: Thu Oct 27 17:51:13 2011 +0100 summary: Added lost documentation cross-reference. files: Doc/howto/logging-cookbook.rst | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -610,9 +610,10 @@ to have all the processes log to a :class:`SocketHandler`, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing -processes to perform this function.) The following section documents this -approach in more detail and includes a working socket receiver which can be -used as a starting point for you to adapt in your own applications. +processes to perform this function.) :ref:`This section ` +documents this approach in more detail and includes a working socket receiver +which can be used as a starting point for you to adapt in your own +applications. If you are using a recent version of Python which includes the :mod:`multiprocessing` module, you could write your own handler which uses the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Oct 27 18:53:29 2011 From: python-checkins at python.org (vinay.sajip) Date: Thu, 27 Oct 2011 18:53:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_documentation_fix_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/52b35dae22d1 changeset: 73149:52b35dae22d1 parent: 73145:d264804aa3f6 parent: 73147:5c57d1b29f20 user: Vinay Sajip date: Thu Oct 27 17:53:19 2011 +0100 summary: Merged documentation fix from 3.2. files: Doc/howto/logging-cookbook.rst | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -674,9 +674,10 @@ to have all the processes log to a :class:`SocketHandler`, and have a separate process which implements a socket server which reads from the socket and logs to file. (If you prefer, you can dedicate one thread in one of the existing -processes to perform this function.) The following section documents this -approach in more detail and includes a working socket receiver which can be -used as a starting point for you to adapt in your own applications. +processes to perform this function.) :ref:`This section ` +documents this approach in more detail and includes a working socket receiver +which can be used as a starting point for you to adapt in your own +applications. If you are using a recent version of Python which includes the :mod:`multiprocessing` module, you could write your own handler which uses the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 00:01:05 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 28 Oct 2011 00:01:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2311183=3A_Add_finer?= =?utf8?q?-grained_exceptions_to_the_ssl_module=2C_so_that?= Message-ID: http://hg.python.org/cpython/rev/2c4a9c778bb3 changeset: 73150:2c4a9c778bb3 user: Antoine Pitrou date: Thu Oct 27 23:56:55 2011 +0200 summary: Issue #11183: Add finer-grained exceptions to the ssl module, so that you don't have to inspect the exception's attributes in the common case. files: Doc/library/ssl.rst | 42 ++++++++++++++++++++++ Lib/ssl.py | 6 ++- Lib/test/test_ssl.py | 33 ++++++---------- Misc/NEWS | 3 + Modules/_ssl.c | 60 ++++++++++++++++++++++++++++++- 5 files changed, 120 insertions(+), 24 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -59,6 +59,48 @@ .. versionchanged:: 3.3 :exc:`SSLError` used to be a subtype of :exc:`socket.error`. +.. exception:: SSLZeroReturnError + + A subclass of :exc:`SSLError` raised when trying to read or write and + the SSL connection has been closed cleanly. Note that this doesn't + mean that the underlying transport (read TCP) has been closed. + + .. versionadded:: 3.3 + +.. exception:: SSLWantReadError + + A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket + ` when trying to read or write data, but more data needs + to be received on the underlying TCP transport before the request can be + fulfilled. + + .. versionadded:: 3.3 + +.. exception:: SSLWantWriteError + + A subclass of :exc:`SSLError` raised by a :ref:`non-blocking SSL socket + ` when trying to read or write data, but more data needs + to be sent on the underlying TCP transport before the request can be + fulfilled. + + .. versionadded:: 3.3 + +.. exception:: SSLSyscallError + + A subclass of :exc:`SSLError` raised when a system error was encountered + while trying to fulfill an operation on a SSL socket. Unfortunately, + there is no easy way to inspect the original errno number. + + .. versionadded:: 3.3 + +.. exception:: SSLEOFError + + A subclass of :exc:`SSLError` raised when the SSL connection has been + terminated abrupted. Generally, you shouldn't try to reuse the underlying + transport when this error is encountered. + + .. versionadded:: 3.3 + .. exception:: CertificateError Raised to signal an error with a certificate (such as mismatching diff --git a/Lib/ssl.py b/Lib/ssl.py --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -60,7 +60,11 @@ import _ssl # if we can't import it, let the error propagate from _ssl import OPENSSL_VERSION_NUMBER, OPENSSL_VERSION_INFO, OPENSSL_VERSION -from _ssl import _SSLContext, SSLError +from _ssl import _SSLContext +from _ssl import ( + SSLError, SSLZeroReturnError, SSLWantReadError, SSLWantWriteError, + SSLSyscallError, SSLEOFError, + ) from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED from _ssl import OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1 from _ssl import RAND_status, RAND_egd, RAND_add, RAND_bytes, RAND_pseudo_bytes diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -619,13 +619,10 @@ try: s.do_handshake() break - except ssl.SSLError as err: - if err.args[0] == ssl.SSL_ERROR_WANT_READ: - select.select([s], [], [], 5.0) - elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE: - select.select([], [s], [], 5.0) - else: - raise + except ssl.SSLWantReadError: + select.select([s], [], [], 5.0) + except ssl.SSLWantWriteError: + select.select([], [s], [], 5.0) # SSL established self.assertTrue(s.getpeercert()) finally: @@ -745,13 +742,10 @@ count += 1 s.do_handshake() break - except ssl.SSLError as err: - if err.args[0] == ssl.SSL_ERROR_WANT_READ: - select.select([s], [], []) - elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE: - select.select([], [s], []) - else: - raise + except ssl.SSLWantReadError: + select.select([s], [], []) + except ssl.SSLWantWriteError: + select.select([], [s], []) s.close() if support.verbose: sys.stdout.write("\nNeeded %d calls to do_handshake() to establish session.\n" % count) @@ -1030,12 +1024,11 @@ def _do_ssl_handshake(self): try: self.socket.do_handshake() - except ssl.SSLError as err: - if err.args[0] in (ssl.SSL_ERROR_WANT_READ, - ssl.SSL_ERROR_WANT_WRITE): - return - elif err.args[0] == ssl.SSL_ERROR_EOF: - return self.handle_close() + except (ssl.SSLWantReadError, ssl.SSLWantWriteError): + return + except ssl.SSLEOFError: + return self.handle_close() + except ssl.SSLError: raise except socket.error as err: if err.args[0] == errno.ECONNABORTED: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,9 @@ Library ------- +- Issue #11183: Add finer-grained exceptions to the ssl module, so that + you don't have to inspect the exception's attributes in the common case. + - Issue #13216: Add cp65001 codec, the Windows UTF-8 (CP_UTF8). - Issue #13226: Add RTLD_xxx constants to the os module. These constants can be diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -99,6 +99,11 @@ /* SSL error object */ static PyObject *PySSLErrorObject; +static PyObject *PySSLZeroReturnErrorObject; +static PyObject *PySSLWantReadErrorObject; +static PyObject *PySSLWantWriteErrorObject; +static PyObject *PySSLSyscallErrorObject; +static PyObject *PySSLEOFErrorObject; #ifdef WITH_THREAD @@ -191,6 +196,7 @@ PySSL_SetError(PySSLSocket *obj, int ret, char *filename, int lineno) { PyObject *v; + PyObject *type = PySSLErrorObject; char buf[2048]; char *errstr; int err; @@ -203,15 +209,18 @@ switch (err) { case SSL_ERROR_ZERO_RETURN: - errstr = "TLS/SSL connection has been closed"; + errstr = "TLS/SSL connection has been closed (EOF)"; + type = PySSLZeroReturnErrorObject; p = PY_SSL_ERROR_ZERO_RETURN; break; case SSL_ERROR_WANT_READ: errstr = "The operation did not complete (read)"; + type = PySSLWantReadErrorObject; p = PY_SSL_ERROR_WANT_READ; break; case SSL_ERROR_WANT_WRITE: p = PY_SSL_ERROR_WANT_WRITE; + type = PySSLWantWriteErrorObject; errstr = "The operation did not complete (write)"; break; case SSL_ERROR_WANT_X509_LOOKUP: @@ -230,6 +239,7 @@ = (PySocketSockObject *) PyWeakref_GetObject(obj->Socket); if (ret == 0 || (((PyObject *)s) == Py_None)) { p = PY_SSL_ERROR_EOF; + type = PySSLEOFErrorObject; errstr = "EOF occurred in violation of protocol"; } else if (ret == -1) { /* underlying BIO reported an I/O error */ @@ -240,6 +250,7 @@ return v; } else { /* possible? */ p = PY_SSL_ERROR_SYSCALL; + type = PySSLSyscallErrorObject; errstr = "Some I/O error occurred"; } } else { @@ -272,7 +283,7 @@ ERR_clear_error(); v = Py_BuildValue("(is)", p, buf); if (v != NULL) { - PyErr_SetObject(PySSLErrorObject, v); + PyErr_SetObject(type, v); Py_DECREF(v); } return NULL; @@ -2300,6 +2311,23 @@ PyDoc_STRVAR(SSLError_doc, "An error occurred in the SSL implementation."); +PyDoc_STRVAR(SSLZeroReturnError_doc, +"SSL/TLS session closed cleanly."); + +PyDoc_STRVAR(SSLWantReadError_doc, +"Non-blocking SSL socket needs to read more data\n" +"before the requested operation can be completed."); + +PyDoc_STRVAR(SSLWantWriteError_doc, +"Non-blocking SSL socket needs to write more data\n" +"before the requested operation can be completed."); + +PyDoc_STRVAR(SSLSyscallError_doc, +"System error when attempting SSL operation."); + +PyDoc_STRVAR(SSLEOFError_doc, +"SSL/TLS connection terminated abruptly."); + PyMODINIT_FUNC PyInit__ssl(void) @@ -2343,7 +2371,33 @@ NULL); if (PySSLErrorObject == NULL) return NULL; - if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0) + PySSLZeroReturnErrorObject = PyErr_NewExceptionWithDoc( + "ssl.SSLZeroReturnError", SSLZeroReturnError_doc, + PySSLErrorObject, NULL); + PySSLWantReadErrorObject = PyErr_NewExceptionWithDoc( + "ssl.SSLWantReadError", SSLWantReadError_doc, + PySSLErrorObject, NULL); + PySSLWantWriteErrorObject = PyErr_NewExceptionWithDoc( + "ssl.SSLWantWriteError", SSLWantWriteError_doc, + PySSLErrorObject, NULL); + PySSLSyscallErrorObject = PyErr_NewExceptionWithDoc( + "ssl.SSLSyscallError", SSLSyscallError_doc, + PySSLErrorObject, NULL); + PySSLEOFErrorObject = PyErr_NewExceptionWithDoc( + "ssl.SSLEOFError", SSLEOFError_doc, + PySSLErrorObject, NULL); + if (PySSLZeroReturnErrorObject == NULL + || PySSLWantReadErrorObject == NULL + || PySSLWantWriteErrorObject == NULL + || PySSLSyscallErrorObject == NULL + || PySSLEOFErrorObject == NULL) + return NULL; + if (PyDict_SetItemString(d, "SSLError", PySSLErrorObject) != 0 + || PyDict_SetItemString(d, "SSLZeroReturnError", PySSLZeroReturnErrorObject) != 0 + || PyDict_SetItemString(d, "SSLWantReadError", PySSLWantReadErrorObject) != 0 + || PyDict_SetItemString(d, "SSLWantWriteError", PySSLWantWriteErrorObject) != 0 + || PyDict_SetItemString(d, "SSLSyscallError", PySSLSyscallErrorObject) != 0 + || PyDict_SetItemString(d, "SSLEOFError", PySSLEOFErrorObject) != 0) return NULL; if (PyDict_SetItemString(d, "_SSLContext", (PyObject *)&PySSLContext_Type) != 0) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 00:03:12 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 28 Oct 2011 00:03:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_example_of_non-block?= =?utf8?q?ing_SSL_code_for_the_new_finer-grained_exceptions?= Message-ID: http://hg.python.org/cpython/rev/dfeea8cb1910 changeset: 73151:dfeea8cb1910 user: Antoine Pitrou date: Thu Oct 27 23:59:03 2011 +0200 summary: Update example of non-blocking SSL code for the new finer-grained exceptions files: Doc/library/ssl.rst | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1044,13 +1044,10 @@ try: sock.do_handshake() break - except ssl.SSLError as err: - if err.args[0] == ssl.SSL_ERROR_WANT_READ: - select.select([sock], [], []) - elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE: - select.select([], [sock], []) - else: - raise + except ssl.SSLWantReadError: + select.select([sock], [], []) + except ssl.SSLWantWriteError: + select.select([], [sock], []) .. _ssl-security: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 00:05:12 2011 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 28 Oct 2011 00:05:12 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo?= Message-ID: http://hg.python.org/cpython/rev/0d5f17872e06 changeset: 73152:0d5f17872e06 user: Antoine Pitrou date: Fri Oct 28 00:01:03 2011 +0200 summary: Fix typo files: Doc/library/ssl.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -96,7 +96,7 @@ .. exception:: SSLEOFError A subclass of :exc:`SSLError` raised when the SSL connection has been - terminated abrupted. Generally, you shouldn't try to reuse the underlying + terminated abruptly. Generally, you shouldn't try to reuse the underlying transport when this error is encountered. .. versionadded:: 3.3 -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Oct 28 05:33:52 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 28 Oct 2011 05:33:52 +0200 Subject: [Python-checkins] Daily reference leaks (0d5f17872e06): sum=0 Message-ID: results for 0d5f17872e06 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogca6kmR', '-x'] From python-checkins at python.org Fri Oct 28 11:23:55 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 11:23:55 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogRml4ZXMgIzEzMjcw?= =?utf8?q?=3A_obsolete_reference_to_old-style/new-style_classes=2E?= Message-ID: http://hg.python.org/cpython/rev/54abca0ab03b changeset: 73153:54abca0ab03b branch: 3.2 parent: 73147:5c57d1b29f20 user: Florent Xicluna date: Fri Oct 28 11:21:19 2011 +0200 summary: Fixes #13270: obsolete reference to old-style/new-style classes. files: Doc/library/argparse.rst | 2 +- Doc/library/stdtypes.rst | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -703,7 +703,7 @@ >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) - Namespace(types=[, ]) + Namespace(types=[, ]) * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2785,8 +2785,6 @@ The name of the class or type. -The following attributes are only supported by :term:`new-style class`\ es. - .. attribute:: class.__mro__ This attribute is a tuple of classes that are considered when looking for @@ -2802,12 +2800,12 @@ .. method:: class.__subclasses__ - Each new-style class keeps a list of weak references to its immediate - subclasses. This method returns a list of all those references still alive. + Each class keeps a list of weak references to its immediate subclasses. This + method returns a list of all those references still alive. Example:: >>> int.__subclasses__() - [] + [] .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 11:23:56 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 11:23:56 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/8d85dda39663 changeset: 73154:8d85dda39663 parent: 73152:0d5f17872e06 parent: 73153:54abca0ab03b user: Florent Xicluna date: Fri Oct 28 11:23:25 2011 +0200 summary: Merge 3.2 files: Doc/library/argparse.rst | 2 +- Doc/library/stdtypes.rst | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -722,7 +722,7 @@ >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) - Namespace(types=[, ]) + Namespace(types=[, ]) * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2808,8 +2808,6 @@ The name of the class or type. -The following attributes are only supported by :term:`new-style class`\ es. - .. attribute:: class.__mro__ This attribute is a tuple of classes that are considered when looking for @@ -2825,12 +2823,12 @@ .. method:: class.__subclasses__ - Each new-style class keeps a list of weak references to its immediate - subclasses. This method returns a list of all those references still alive. + Each class keeps a list of weak references to its immediate subclasses. This + method returns a list of all those references still alive. Example:: >>> int.__subclasses__() - [] + [] .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 11:33:46 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 11:33:46 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMjc4OiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/3e72de3c8ad5 changeset: 73155:3e72de3c8ad5 branch: 2.7 parent: 73148:0bdf1906c2ea user: Ezio Melotti date: Fri Oct 28 12:22:25 2011 +0300 summary: #13278: fix typo. files: Doc/library/sched.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -95,7 +95,7 @@ .. method:: scheduler.enter(delay, priority, action, argument) - Schedule an event for *delay* more time units. Other then the relative time, the + Schedule an event for *delay* more time units. Other than the relative time, the other arguments, the effect and the return value are the same as those for :meth:`enterabs`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 11:33:47 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 11:33:47 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMjc4OiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/9c4b62f67a28 changeset: 73156:9c4b62f67a28 branch: 3.2 parent: 73147:5c57d1b29f20 user: Ezio Melotti date: Fri Oct 28 12:22:25 2011 +0300 summary: #13278: fix typo. files: Doc/library/sched.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -95,7 +95,7 @@ .. method:: scheduler.enter(delay, priority, action, argument) - Schedule an event for *delay* more time units. Other then the relative time, the + Schedule an event for *delay* more time units. Other than the relative time, the other arguments, the effect and the return value are the same as those for :meth:`enterabs`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 11:33:48 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 11:33:48 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge_heads=2E?= Message-ID: http://hg.python.org/cpython/rev/d1c2b62ff80c changeset: 73157:d1c2b62ff80c branch: 3.2 parent: 73156:9c4b62f67a28 parent: 73153:54abca0ab03b user: Ezio Melotti date: Fri Oct 28 12:32:53 2011 +0300 summary: Merge heads. files: Doc/library/argparse.rst | 2 +- Doc/library/stdtypes.rst | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -703,7 +703,7 @@ >>> parser.add_argument('--str', dest='types', action='append_const', const=str) >>> parser.add_argument('--int', dest='types', action='append_const', const=int) >>> parser.parse_args('--str --int'.split()) - Namespace(types=[, ]) + Namespace(types=[, ]) * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2785,8 +2785,6 @@ The name of the class or type. -The following attributes are only supported by :term:`new-style class`\ es. - .. attribute:: class.__mro__ This attribute is a tuple of classes that are considered when looking for @@ -2802,12 +2800,12 @@ .. method:: class.__subclasses__ - Each new-style class keeps a list of weak references to its immediate - subclasses. This method returns a list of all those references still alive. + Each class keeps a list of weak references to its immediate subclasses. This + method returns a list of all those references still alive. Example:: >>> int.__subclasses__() - [] + [] .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 11:33:48 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 11:33:48 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313278=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/64b2efa5009f changeset: 73158:64b2efa5009f parent: 73154:8d85dda39663 parent: 73157:d1c2b62ff80c user: Ezio Melotti date: Fri Oct 28 12:33:27 2011 +0300 summary: #13278: merge with 3.2. files: Doc/library/sched.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sched.rst b/Doc/library/sched.rst --- a/Doc/library/sched.rst +++ b/Doc/library/sched.rst @@ -95,7 +95,7 @@ .. method:: scheduler.enter(delay, priority, action, argument) - Schedule an event for *delay* more time units. Other then the relative time, the + Schedule an event for *delay* more time units. Other than the relative time, the other arguments, the effect and the return value are the same as those for :meth:`enterabs`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 12:24:07 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 12:24:07 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMjczOiBmaXgg?= =?utf8?q?a_bug_that_prevented_HTMLParser_to_properly_detect_some_tags_whe?= =?utf8?q?n?= Message-ID: http://hg.python.org/cpython/rev/41d41776aa6d changeset: 73159:41d41776aa6d branch: 3.2 parent: 73157:d1c2b62ff80c user: Ezio Melotti date: Fri Oct 28 13:21:09 2011 +0300 summary: #13273: fix a bug that prevented HTMLParser to properly detect some tags when strict=False. files: Lib/html/parser.py | 5 +-- Lib/test/test_htmlparser.py | 33 +++++++++++++++++++++++++ Misc/NEWS | 3 ++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -30,7 +30,7 @@ r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') attrfind_tolerant = re.compile( - r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' + r',?\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^>\s]*))?') locatestarttagend = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name @@ -277,12 +277,11 @@ assert match, 'unexpected call to parse_starttag()' k = match.end() self.lasttag = tag = rawdata[i+1:k].lower() - while k < endpos: if self.strict: m = attrfind.match(rawdata, k) else: - m = attrfind_tolerant.search(rawdata, k) + m = attrfind_tolerant.match(rawdata, k) if not m: break attrname, rest, attrvalue = m.group(1, 2, 3) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -373,6 +373,39 @@ [('action', 'bogus|&#()value')])], collector = self.collector) + def test_issue13273(self): + html = ('
    The rain ' + '
    in Spain
    ') + expected = [ + ('starttag', 'div', [('style', '')]), + ('starttag', 'b', []), + ('data', 'The '), + ('starttag', 'a', [('href', 'some_url')]), + ('data', 'rain'), + ('endtag', 'a'), + ('data', ' '), + ('startendtag', 'br', []), + ('data', ' in '), + ('starttag', 'span', []), + ('data', 'Spain'), + ('endtag', 'span'), + ('endtag', 'b'), + ('endtag', 'div') + ] + self._run_check(html, expected, collector=self.collector) + + def test_issue13273_2(self): + html = '
    The rain' + expected = [ + ('starttag', 'div', [('style', ''), ('foo', 'bar')]), + ('starttag', 'b', []), + ('data', 'The '), + ('starttag', 'a', [('href', 'some_url')]), + ('data', 'rain'), + ('endtag', 'a'), + ] + self._run_check(html, expected, collector=self.collector) + def test_unescape_function(self): p = html.parser.HTMLParser() self.assertEqual(p.unescape('&#bad;'),'&#bad;') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,9 @@ Library ------- +- Issue #13273: fix a bug that prevented HTMLParser to properly detect some + tags when strict=False. + - Issue #10332: multiprocessing: fix a race condition when a Pool is closed before all tasks have completed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 12:24:08 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 12:24:08 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313273=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/b194117f176c changeset: 73160:b194117f176c parent: 73158:64b2efa5009f parent: 73159:41d41776aa6d user: Ezio Melotti date: Fri Oct 28 13:23:57 2011 +0300 summary: #13273: merge with 3.2. files: Lib/html/parser.py | 5 +-- Lib/test/test_htmlparser.py | 33 +++++++++++++++++++++++++ Misc/NEWS | 3 ++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -30,7 +30,7 @@ r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') attrfind_tolerant = re.compile( - r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' + r',?\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^>\s]*))?') locatestarttagend = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name @@ -277,12 +277,11 @@ assert match, 'unexpected call to parse_starttag()' k = match.end() self.lasttag = tag = rawdata[i+1:k].lower() - while k < endpos: if self.strict: m = attrfind.match(rawdata, k) else: - m = attrfind_tolerant.search(rawdata, k) + m = attrfind_tolerant.match(rawdata, k) if not m: break attrname, rest, attrvalue = m.group(1, 2, 3) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -373,6 +373,39 @@ [('action', 'bogus|&#()value')])], collector = self.collector) + def test_issue13273(self): + html = ('
    The rain ' + '
    in Spain
    ') + expected = [ + ('starttag', 'div', [('style', '')]), + ('starttag', 'b', []), + ('data', 'The '), + ('starttag', 'a', [('href', 'some_url')]), + ('data', 'rain'), + ('endtag', 'a'), + ('data', ' '), + ('startendtag', 'br', []), + ('data', ' in '), + ('starttag', 'span', []), + ('data', 'Spain'), + ('endtag', 'span'), + ('endtag', 'b'), + ('endtag', 'div') + ] + self._run_check(html, expected, collector=self.collector) + + def test_issue13273_2(self): + html = '
    The rain' + expected = [ + ('starttag', 'div', [('style', ''), ('foo', 'bar')]), + ('starttag', 'b', []), + ('data', 'The '), + ('starttag', 'a', [('href', 'some_url')]), + ('data', 'rain'), + ('endtag', 'a'), + ] + self._run_check(html, expected, collector=self.collector) + def test_unescape_function(self): p = html.parser.HTMLParser() self.assertEqual(p.unescape('&#bad;'),'&#bad;') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,9 @@ Library ------- +- Issue #13273: fix a bug that prevented HTMLParser to properly detect some + tags when strict=False. + - Issue #11183: Add finer-grained exceptions to the ssl module, so that you don't have to inspect the exception's attributes in the common case. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 13:36:23 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 13:36:23 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Improve_HTMLPar?= =?utf8?q?ser_example_in_the_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/07a46bb5ee3c changeset: 73161:07a46bb5ee3c branch: 2.7 parent: 73155:3e72de3c8ad5 user: Ezio Melotti date: Fri Oct 28 14:14:34 2011 +0300 summary: Improve HTMLParser example in the doc. files: Doc/library/htmlparser.rst | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Doc/library/htmlparser.rst b/Doc/library/htmlparser.rst --- a/Doc/library/htmlparser.rst +++ b/Doc/library/htmlparser.rst @@ -186,16 +186,21 @@ Example HTML Parser Application ------------------------------- -As a basic example, below is a very basic HTML parser that uses the -:class:`HTMLParser` class to print out tags as they are encountered:: +As a basic example, below is a simple HTML parser that uses the +:class:`HTMLParser` class to print out start tags, end tags and data +as they are encountered:: from HTMLParser import HTMLParser class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print "Encountered a start tag:", tag + def handle_endtag(self, tag): + print "Encountered an end tag:", tag + def handle_data(self, data): + print "Encountered some data:", data - def handle_starttag(self, tag, attrs): - print "Encountered the beginning of a %s tag" % tag - def handle_endtag(self, tag): - print "Encountered the end of a %s tag" % tag - + parser = MyHTMLParser() + parser.feed('Test' + '

    Parse me!

    ') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 13:36:24 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 13:36:24 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Minor_fixes_to_?= =?utf8?q?the_HTMLParser_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/9a6699a8aee9 changeset: 73162:9a6699a8aee9 branch: 2.7 user: Ezio Melotti date: Fri Oct 28 14:20:08 2011 +0300 summary: Minor fixes to the HTMLParser doc. files: Doc/library/htmlparser.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/htmlparser.rst b/Doc/library/htmlparser.rst --- a/Doc/library/htmlparser.rst +++ b/Doc/library/htmlparser.rst @@ -8,8 +8,8 @@ .. note:: The :mod:`HTMLParser` module has been renamed to :mod:`html.parser` in Python - 3.0. The :term:`2to3` tool will automatically adapt imports when converting - your sources to 3.0. + 3. The :term:`2to3` tool will automatically adapt imports when converting + your sources to Python 3. .. versionadded:: 2.2 @@ -109,9 +109,9 @@ .. method:: HTMLParser.handle_startendtag(tag, attrs) Similar to :meth:`handle_starttag`, but called when the parser encounters an - XHTML-style empty tag (````). This method may be overridden by + XHTML-style empty tag (````). This method may be overridden by subclasses which require this particular lexical information; the default - implementation simple calls :meth:`handle_starttag` and :meth:`handle_endtag`. + implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. .. method:: HTMLParser.handle_endtag(tag) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 13:36:25 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 13:36:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improve_HTMLPar?= =?utf8?q?ser_example_in_the_doc_and_fix_a_couple_minor_things=2E?= Message-ID: http://hg.python.org/cpython/rev/9ddcb6d44bb4 changeset: 73163:9ddcb6d44bb4 branch: 3.2 parent: 73159:41d41776aa6d user: Ezio Melotti date: Fri Oct 28 14:34:56 2011 +0300 summary: Improve HTMLParser example in the doc and fix a couple minor things. files: Doc/library/html.parser.rst | 40 +++++++++++------------- 1 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -101,9 +101,9 @@ .. method:: HTMLParser.handle_startendtag(tag, attrs) Similar to :meth:`handle_starttag`, but called when the parser encounters an - XHTML-style empty tag (````). This method may be overridden by + XHTML-style empty tag (````). This method may be overridden by subclasses which require this particular lexical information; the default - implementation simple calls :meth:`handle_starttag` and :meth:`handle_endtag`. + implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. .. method:: HTMLParser.handle_endtag(tag) @@ -178,27 +178,23 @@ Example HTML Parser Application ------------------------------- -As a basic example, below is a very basic HTML parser that uses the -:class:`HTMLParser` class to print out tags as they are encountered:: +As a basic example, below is a simple HTML parser that uses the +:class:`HTMLParser` class to print out start tags, end tags, and data +as they are encountered:: - >>> from html.parser import HTMLParser - >>> - >>> class MyHTMLParser(HTMLParser): - ... def handle_starttag(self, tag, attrs): - ... print("Encountered a {} start tag".format(tag)) - ... def handle_endtag(self, tag): - ... print("Encountered a {} end tag".format(tag)) - ... - >>> page = """

    Title

    I'm a paragraph!

    """ - >>> - >>> myparser = MyHTMLParser() - >>> myparser.feed(page) - Encountered a html start tag - Encountered a h1 start tag - Encountered a h1 end tag - Encountered a p start tag - Encountered a p end tag - Encountered a html end tag + from html.parser import HTMLParser + + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print("Encountered a start tag:", tag) + def handle_endtag(self, tag): + print("Encountered an end tag:", tag) + def handle_data(self, data): + print("Encountered some data:", data) + + parser = MyHTMLParser() + parser.feed('Test' + '

    Parse me!

    ') .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 13:36:25 2011 From: python-checkins at python.org (ezio.melotti) Date: Fri, 28 Oct 2011 13:36:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_HTMLParser_doc_changes_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/2cb611aaca68 changeset: 73164:2cb611aaca68 parent: 73160:b194117f176c parent: 73163:9ddcb6d44bb4 user: Ezio Melotti date: Fri Oct 28 14:36:11 2011 +0300 summary: Merge HTMLParser doc changes from 3.2. files: Doc/library/html.parser.rst | 40 +++++++++++------------- 1 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -101,9 +101,9 @@ .. method:: HTMLParser.handle_startendtag(tag, attrs) Similar to :meth:`handle_starttag`, but called when the parser encounters an - XHTML-style empty tag (``
    ``). This method may be overridden by + XHTML-style empty tag (````). This method may be overridden by subclasses which require this particular lexical information; the default - implementation simple calls :meth:`handle_starttag` and :meth:`handle_endtag`. + implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. .. method:: HTMLParser.handle_endtag(tag) @@ -178,27 +178,23 @@ Example HTML Parser Application ------------------------------- -As a basic example, below is a very basic HTML parser that uses the -:class:`HTMLParser` class to print out tags as they are encountered:: +As a basic example, below is a simple HTML parser that uses the +:class:`HTMLParser` class to print out start tags, end tags, and data +as they are encountered:: - >>> from html.parser import HTMLParser - >>> - >>> class MyHTMLParser(HTMLParser): - ... def handle_starttag(self, tag, attrs): - ... print("Encountered a {} start tag".format(tag)) - ... def handle_endtag(self, tag): - ... print("Encountered a {} end tag".format(tag)) - ... - >>> page = """

    Title

    I'm a paragraph!

    """ - >>> - >>> myparser = MyHTMLParser() - >>> myparser.feed(page) - Encountered a html start tag - Encountered a h1 start tag - Encountered a h1 end tag - Encountered a p start tag - Encountered a p end tag - Encountered a html end tag + from html.parser import HTMLParser + + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print("Encountered a start tag:", tag) + def handle_endtag(self, tag): + print("Encountered an end tag:", tag) + def handle_data(self, data): + print("Encountered some data:", data) + + parser = MyHTMLParser() + parser.feed('Test' + '

    Parse me!

    ') .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 14:53:35 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 14:53:35 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Closes_=2313258?= =?utf8?q?=3A_Use_callable=28=29_built-in_in_the_standard_library=2E?= Message-ID: http://hg.python.org/cpython/rev/8e57b5d8f58f changeset: 73165:8e57b5d8f58f branch: 3.2 parent: 73163:9ddcb6d44bb4 user: Florent Xicluna date: Fri Oct 28 14:45:05 2011 +0200 summary: Closes #13258: Use callable() built-in in the standard library. files: Lib/argparse.py | 10 +++------- Lib/copyreg.py | 4 ++-- Lib/distutils/dist.py | 2 +- Lib/encodings/__init__.py | 11 +++++------ Lib/fileinput.py | 9 +++++---- Lib/hmac.py | 2 +- Lib/idlelib/rpc.py | 4 ++-- Lib/logging/config.py | 4 ++-- Lib/multiprocessing/managers.py | 4 ++-- Lib/multiprocessing/pool.py | 2 +- Lib/optparse.py | 2 +- Lib/pickle.py | 2 +- Lib/pydoc.py | 4 ++-- Lib/re.py | 2 +- Lib/rlcompleter.py | 2 +- Lib/shutil.py | 4 ++-- Lib/test/test_nntplib.py | 3 +-- Lib/timeit.py | 6 +++--- Lib/tkinter/__init__.py | 8 ++++---- Lib/tkinter/tix.py | 2 +- Lib/unittest/loader.py | 4 ++-- Lib/unittest/suite.py | 2 +- Lib/warnings.py | 2 +- Lib/xmlrpc/server.py | 2 +- Misc/NEWS | 2 ++ 25 files changed, 48 insertions(+), 51 deletions(-) diff --git a/Lib/argparse.py b/Lib/argparse.py --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -92,10 +92,6 @@ from gettext import gettext as _, ngettext -def _callable(obj): - return hasattr(obj, '__call__') or hasattr(obj, '__bases__') - - SUPPRESS = '==SUPPRESS==' OPTIONAL = '?' @@ -1286,13 +1282,13 @@ # create the action object, and add it to the parser action_class = self._pop_action_class(kwargs) - if not _callable(action_class): + if not callable(action_class): raise ValueError('unknown action "%s"' % (action_class,)) action = action_class(**kwargs) # raise an error if the action type is not callable type_func = self._registry_get('type', action.type, action.type) - if not _callable(type_func): + if not callable(type_func): raise ValueError('%r is not callable' % (type_func,)) # raise an error if the metavar does not match the type @@ -2240,7 +2236,7 @@ def _get_value(self, action, arg_string): type_func = self._registry_get('type', action.type, action.type) - if not _callable(type_func): + if not callable(type_func): msg = _('%r is not callable') raise ArgumentError(action, msg % type_func) diff --git a/Lib/copyreg.py b/Lib/copyreg.py --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -10,7 +10,7 @@ dispatch_table = {} def pickle(ob_type, pickle_function, constructor_ob=None): - if not hasattr(pickle_function, '__call__'): + if not callable(pickle_function): raise TypeError("reduction functions must be callable") dispatch_table[ob_type] = pickle_function @@ -20,7 +20,7 @@ constructor(constructor_ob) def constructor(object): - if not hasattr(object, '__call__'): + if not callable(object): raise TypeError("constructors must be callable") # Example: provide pickling support for complex numbers. diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py --- a/Lib/distutils/dist.py +++ b/Lib/distutils/dist.py @@ -537,7 +537,7 @@ for (help_option, short, desc, func) in cmd_class.help_options: if hasattr(opts, parser.get_attr_name(help_option)): help_option_found=1 - if hasattr(func, '__call__'): + if callable(func): func() else: raise DistutilsClassError( diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -120,12 +120,11 @@ if not 4 <= len(entry) <= 7: raise CodecRegistryError('module "%s" (%s) failed to register' % (mod.__name__, mod.__file__)) - if not hasattr(entry[0], '__call__') or \ - not hasattr(entry[1], '__call__') or \ - (entry[2] is not None and not hasattr(entry[2], '__call__')) or \ - (entry[3] is not None and not hasattr(entry[3], '__call__')) or \ - (len(entry) > 4 and entry[4] is not None and not hasattr(entry[4], '__call__')) or \ - (len(entry) > 5 and entry[5] is not None and not hasattr(entry[5], '__call__')): + if not callable(entry[0]) or not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): raise CodecRegistryError('incompatible codecs in module "%s" (%s)' % (mod.__name__, mod.__file__)) if len(entry)<7 or entry[6] is None: diff --git a/Lib/fileinput.py b/Lib/fileinput.py --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -225,10 +225,11 @@ raise ValueError("FileInput opening mode must be one of " "'r', 'rU', 'U' and 'rb'") self._mode = mode - if inplace and openhook: - raise ValueError("FileInput cannot use an opening hook in inplace mode") - elif openhook and not hasattr(openhook, '__call__'): - raise ValueError("FileInput openhook must be callable") + if openhook: + if inplace: + raise ValueError("FileInput cannot use an opening hook in inplace mode") + if not callable(openhook): + raise ValueError("FileInput openhook must be callable") self._openhook = openhook def __del__(self): diff --git a/Lib/hmac.py b/Lib/hmac.py --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -39,7 +39,7 @@ import hashlib digestmod = hashlib.md5 - if hasattr(digestmod, '__call__'): + if callable(digestmod): self.digest_cons = digestmod else: self.digest_cons = lambda d=b'': digestmod.new(d) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -570,7 +570,7 @@ # Adds names to dictionary argument 'methods' for name in dir(obj): attr = getattr(obj, name) - if hasattr(attr, '__call__'): + if callable(attr): methods[name] = 1 if isinstance(obj, type): for super in obj.__bases__: @@ -579,7 +579,7 @@ def _getattributes(obj, attributes): for name in dir(obj): attr = getattr(obj, name) - if not hasattr(attr, '__call__'): + if not callable(attr): attributes[name] = 1 class MethodProxy(object): diff --git a/Lib/logging/config.py b/Lib/logging/config.py --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -471,7 +471,7 @@ def configure_custom(self, config): """Configure an object with a user-supplied factory.""" c = config.pop('()') - if not hasattr(c, '__call__'): + if not callable(c): c = self.resolve(c) props = config.pop('.', None) # Check for valid identifiers @@ -690,7 +690,7 @@ filters = config.pop('filters', None) if '()' in config: c = config.pop('()') - if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType: + if not callable(c): c = self.resolve(c) factory = c else: diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -134,7 +134,7 @@ temp = [] for name in dir(obj): func = getattr(obj, name) - if hasattr(func, '__call__'): + if callable(func): temp.append(name) return temp @@ -510,7 +510,7 @@ ''' assert self._state.value == State.INITIAL - if initializer is not None and not hasattr(initializer, '__call__'): + if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') # pipe over which we will retrieve address of server diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -151,7 +151,7 @@ if processes < 1: raise ValueError("Number of processes must be at least 1") - if initializer is not None and not hasattr(initializer, '__call__'): + if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') self._processes = processes diff --git a/Lib/optparse.py b/Lib/optparse.py --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -705,7 +705,7 @@ def _check_callback(self): if self.action == "callback": - if not hasattr(self.callback, '__call__'): + if not callable(self.callback): raise OptionError( "callback not callable: %r" % self.callback, self) if (self.callback_args is not None and diff --git a/Lib/pickle.py b/Lib/pickle.py --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -364,7 +364,7 @@ raise PicklingError("args from save_reduce() should be a tuple") # Assert that func is callable - if not hasattr(func, '__call__'): + if not callable(func): raise PicklingError("func from save_reduce() should be callable") save = self.save diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -775,7 +775,7 @@ push(msg) for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) - if hasattr(value, '__call__') or inspect.isdatadescriptor(value): + if callable(value) or inspect.isdatadescriptor(value): doc = getattr(value, "__doc__", None) else: doc = None @@ -1199,7 +1199,7 @@ hr.maybe() push(msg) for name, kind, homecls, value in ok: - if hasattr(value, '__call__') or inspect.isdatadescriptor(value): + if callable(value) or inspect.isdatadescriptor(value): doc = getdoc(value) else: doc = None diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -326,7 +326,7 @@ if i == j: break action = self.lexicon[m.lastindex-1][1] - if hasattr(action, "__call__"): + if callable(action): self.match = m action = action(self, m.group()) if action is not None: diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -87,7 +87,7 @@ return None def _callable_postfix(self, val, word): - if hasattr(val, '__call__'): + if callable(val): word = word + "(" return word diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -523,7 +523,7 @@ """ if extra_args is None: extra_args = [] - if not isinstance(function, collections.Callable): + if not callable(function): raise TypeError('The %s object is not callable' % function) if not isinstance(extra_args, (tuple, list)): raise TypeError('extra_args needs to be a sequence') @@ -616,7 +616,7 @@ raise RegistryError(msg % (extension, existing_extensions[extension])) - if not isinstance(function, collections.Callable): + if not callable(function): raise TypeError('The registered function must be a callable') diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -4,7 +4,6 @@ import unittest import functools import contextlib -import collections from test import support from nntplib import NNTP, GroupInfo, _have_ssl import nntplib @@ -246,7 +245,7 @@ if not name.startswith('test_'): continue meth = getattr(cls, name) - if not isinstance(meth, collections.Callable): + if not callable(meth): continue # Need to use a closure so that meth remains bound to its current # value diff --git a/Lib/timeit.py b/Lib/timeit.py --- a/Lib/timeit.py +++ b/Lib/timeit.py @@ -127,7 +127,7 @@ if isinstance(setup, str): setup = reindent(setup, 4) src = template % {'stmt': stmt, 'setup': setup} - elif hasattr(setup, '__call__'): + elif callable(setup): src = template % {'stmt': stmt, 'setup': '_setup()'} ns['_setup'] = setup else: @@ -136,13 +136,13 @@ code = compile(src, dummy_src_name, "exec") exec(code, globals(), ns) self.inner = ns["inner"] - elif hasattr(stmt, '__call__'): + elif callable(stmt): self.src = None if isinstance(setup, str): _setup = setup def setup(): exec(_setup, globals(), ns) - elif not hasattr(setup, '__call__'): + elif not callable(setup): raise ValueError("setup is neither a string nor callable") self.inner = _template_func(setup, stmt) else: diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -1039,7 +1039,7 @@ for k, v in cnf.items(): if v is not None: if k[-1] == '_': k = k[:-1] - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) elif isinstance(v, (tuple, list)): nv = [] @@ -1608,7 +1608,7 @@ """Bind function FUNC to command NAME for this widget. Return the function bound to NAME if None is given. NAME could be e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".""" - if hasattr(func, '__call__'): + if callable(func): command = self._register(func) else: command = func @@ -3178,7 +3178,7 @@ elif kw: cnf = kw options = () for k, v in cnf.items(): - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) options = options + ('-'+k, v) self.tk.call(('image', 'create', imgtype, name,) + options) @@ -3201,7 +3201,7 @@ for k, v in _cnfmerge(kw).items(): if v is not None: if k[-1] == '_': k = k[:-1] - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) res = res + ('-'+k, v) self.tk.call((self.name, 'config') + res) diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -405,7 +405,7 @@ elif kw: cnf = kw options = () for k, v in cnf.items(): - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) options = options + ('-'+k, v) return master.tk.call(('image', 'create', imgtype,) + options) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -113,7 +113,7 @@ return self.suiteClass([inst]) elif isinstance(obj, suite.TestSuite): return obj - if hasattr(obj, '__call__'): + if callable(obj): test = obj() if isinstance(test, suite.TestSuite): return test @@ -138,7 +138,7 @@ def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix): return attrname.startswith(prefix) and \ - hasattr(getattr(testCaseClass, attrname), '__call__') + callable(getattr(testCaseClass, attrname)) testFnNames = testFnNames = list(filter(isTestMethod, dir(testCaseClass))) if self.sortTestMethodsUsing: diff --git a/Lib/unittest/suite.py b/Lib/unittest/suite.py --- a/Lib/unittest/suite.py +++ b/Lib/unittest/suite.py @@ -42,7 +42,7 @@ def addTest(self, test): # sanity checks - if not hasattr(test, '__call__'): + if not callable(test): raise TypeError("{} is not callable".format(repr(test))) if isinstance(test, type) and issubclass(test, (case.TestCase, TestSuite)): diff --git a/Lib/warnings.py b/Lib/warnings.py --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -259,7 +259,7 @@ raise RuntimeError( "Unrecognized action (%r) in warnings.filters:\n %s" % (action, item)) - if not hasattr(showwarning, "__call__"): + if not callable(showwarning): raise TypeError("warnings.showwarning() must be set to a " "function or method") # Print message and context diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -149,7 +149,7 @@ return [member for member in dir(obj) if not member.startswith('_') and - hasattr(getattr(obj, member), '__call__')] + callable(getattr(obj, member))] class SimpleXMLRPCDispatcher: """Mix-in class that dispatches XML-RPC requests. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -61,6 +61,8 @@ Library ------- +- Issue #13258: Use callable() built-in in the standard library. + - Issue #13273: fix a bug that prevented HTMLParser to properly detect some tags when strict=False. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 14:53:36 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 14:53:36 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/fb828a3b1bf8 changeset: 73166:fb828a3b1bf8 parent: 73164:2cb611aaca68 parent: 73165:8e57b5d8f58f user: Florent Xicluna date: Fri Oct 28 14:52:29 2011 +0200 summary: Merge 3.2 files: Lib/argparse.py | 10 +++------- Lib/copyreg.py | 4 ++-- Lib/distutils/dist.py | 2 +- Lib/encodings/__init__.py | 11 +++++------ Lib/fileinput.py | 9 +++++---- Lib/hmac.py | 2 +- Lib/idlelib/rpc.py | 4 ++-- Lib/logging/config.py | 4 ++-- Lib/multiprocessing/managers.py | 4 ++-- Lib/multiprocessing/pool.py | 2 +- Lib/optparse.py | 2 +- Lib/packaging/dist.py | 4 ++-- Lib/packaging/run.py | 2 +- Lib/pickle.py | 2 +- Lib/pydoc.py | 4 ++-- Lib/re.py | 2 +- Lib/rlcompleter.py | 2 +- Lib/shutil.py | 4 ++-- Lib/test/test_nntplib.py | 3 +-- Lib/timeit.py | 6 +++--- Lib/tkinter/__init__.py | 8 ++++---- Lib/tkinter/tix.py | 2 +- Lib/unittest/loader.py | 4 ++-- Lib/unittest/suite.py | 2 +- Lib/warnings.py | 2 +- Lib/xmlrpc/server.py | 2 +- Misc/NEWS | 2 ++ 27 files changed, 51 insertions(+), 54 deletions(-) diff --git a/Lib/argparse.py b/Lib/argparse.py --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -93,10 +93,6 @@ from gettext import gettext as _, ngettext -def _callable(obj): - return hasattr(obj, '__call__') or hasattr(obj, '__bases__') - - SUPPRESS = '==SUPPRESS==' OPTIONAL = '?' @@ -1311,13 +1307,13 @@ # create the action object, and add it to the parser action_class = self._pop_action_class(kwargs) - if not _callable(action_class): + if not callable(action_class): raise ValueError('unknown action "%s"' % (action_class,)) action = action_class(**kwargs) # raise an error if the action type is not callable type_func = self._registry_get('type', action.type, action.type) - if not _callable(type_func): + if not callable(type_func): raise ValueError('%r is not callable' % (type_func,)) # raise an error if the metavar does not match the type @@ -2260,7 +2256,7 @@ def _get_value(self, action, arg_string): type_func = self._registry_get('type', action.type, action.type) - if not _callable(type_func): + if not callable(type_func): msg = _('%r is not callable') raise ArgumentError(action, msg % type_func) diff --git a/Lib/copyreg.py b/Lib/copyreg.py --- a/Lib/copyreg.py +++ b/Lib/copyreg.py @@ -10,7 +10,7 @@ dispatch_table = {} def pickle(ob_type, pickle_function, constructor_ob=None): - if not hasattr(pickle_function, '__call__'): + if not callable(pickle_function): raise TypeError("reduction functions must be callable") dispatch_table[ob_type] = pickle_function @@ -20,7 +20,7 @@ constructor(constructor_ob) def constructor(object): - if not hasattr(object, '__call__'): + if not callable(object): raise TypeError("constructors must be callable") # Example: provide pickling support for complex numbers. diff --git a/Lib/distutils/dist.py b/Lib/distutils/dist.py --- a/Lib/distutils/dist.py +++ b/Lib/distutils/dist.py @@ -537,7 +537,7 @@ for (help_option, short, desc, func) in cmd_class.help_options: if hasattr(opts, parser.get_attr_name(help_option)): help_option_found=1 - if hasattr(func, '__call__'): + if callable(func): func() else: raise DistutilsClassError( diff --git a/Lib/encodings/__init__.py b/Lib/encodings/__init__.py --- a/Lib/encodings/__init__.py +++ b/Lib/encodings/__init__.py @@ -120,12 +120,11 @@ if not 4 <= len(entry) <= 7: raise CodecRegistryError('module "%s" (%s) failed to register' % (mod.__name__, mod.__file__)) - if not hasattr(entry[0], '__call__') or \ - not hasattr(entry[1], '__call__') or \ - (entry[2] is not None and not hasattr(entry[2], '__call__')) or \ - (entry[3] is not None and not hasattr(entry[3], '__call__')) or \ - (len(entry) > 4 and entry[4] is not None and not hasattr(entry[4], '__call__')) or \ - (len(entry) > 5 and entry[5] is not None and not hasattr(entry[5], '__call__')): + if not callable(entry[0]) or not callable(entry[1]) or \ + (entry[2] is not None and not callable(entry[2])) or \ + (entry[3] is not None and not callable(entry[3])) or \ + (len(entry) > 4 and entry[4] is not None and not callable(entry[4])) or \ + (len(entry) > 5 and entry[5] is not None and not callable(entry[5])): raise CodecRegistryError('incompatible codecs in module "%s" (%s)' % (mod.__name__, mod.__file__)) if len(entry)<7 or entry[6] is None: diff --git a/Lib/fileinput.py b/Lib/fileinput.py --- a/Lib/fileinput.py +++ b/Lib/fileinput.py @@ -225,10 +225,11 @@ raise ValueError("FileInput opening mode must be one of " "'r', 'rU', 'U' and 'rb'") self._mode = mode - if inplace and openhook: - raise ValueError("FileInput cannot use an opening hook in inplace mode") - elif openhook and not hasattr(openhook, '__call__'): - raise ValueError("FileInput openhook must be callable") + if openhook: + if inplace: + raise ValueError("FileInput cannot use an opening hook in inplace mode") + if not callable(openhook): + raise ValueError("FileInput openhook must be callable") self._openhook = openhook def __del__(self): diff --git a/Lib/hmac.py b/Lib/hmac.py --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -39,7 +39,7 @@ import hashlib digestmod = hashlib.md5 - if hasattr(digestmod, '__call__'): + if callable(digestmod): self.digest_cons = digestmod else: self.digest_cons = lambda d=b'': digestmod.new(d) diff --git a/Lib/idlelib/rpc.py b/Lib/idlelib/rpc.py --- a/Lib/idlelib/rpc.py +++ b/Lib/idlelib/rpc.py @@ -574,7 +574,7 @@ # Adds names to dictionary argument 'methods' for name in dir(obj): attr = getattr(obj, name) - if hasattr(attr, '__call__'): + if callable(attr): methods[name] = 1 if isinstance(obj, type): for super in obj.__bases__: @@ -583,7 +583,7 @@ def _getattributes(obj, attributes): for name in dir(obj): attr = getattr(obj, name) - if not hasattr(attr, '__call__'): + if not callable(attr): attributes[name] = 1 class MethodProxy(object): diff --git a/Lib/logging/config.py b/Lib/logging/config.py --- a/Lib/logging/config.py +++ b/Lib/logging/config.py @@ -471,7 +471,7 @@ def configure_custom(self, config): """Configure an object with a user-supplied factory.""" c = config.pop('()') - if not hasattr(c, '__call__'): + if not callable(c): c = self.resolve(c) props = config.pop('.', None) # Check for valid identifiers @@ -690,7 +690,7 @@ filters = config.pop('filters', None) if '()' in config: c = config.pop('()') - if not hasattr(c, '__call__') and hasattr(types, 'ClassType') and type(c) != types.ClassType: + if not callable(c): c = self.resolve(c) factory = c else: diff --git a/Lib/multiprocessing/managers.py b/Lib/multiprocessing/managers.py --- a/Lib/multiprocessing/managers.py +++ b/Lib/multiprocessing/managers.py @@ -134,7 +134,7 @@ temp = [] for name in dir(obj): func = getattr(obj, name) - if hasattr(func, '__call__'): + if callable(func): temp.append(name) return temp @@ -510,7 +510,7 @@ ''' assert self._state.value == State.INITIAL - if initializer is not None and not hasattr(initializer, '__call__'): + if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') # pipe over which we will retrieve address of server diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py --- a/Lib/multiprocessing/pool.py +++ b/Lib/multiprocessing/pool.py @@ -151,7 +151,7 @@ if processes < 1: raise ValueError("Number of processes must be at least 1") - if initializer is not None and not hasattr(initializer, '__call__'): + if initializer is not None and not callable(initializer): raise TypeError('initializer must be a callable') self._processes = processes diff --git a/Lib/optparse.py b/Lib/optparse.py --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -708,7 +708,7 @@ def _check_callback(self): if self.action == "callback": - if not hasattr(self.callback, '__call__'): + if not callable(self.callback): raise OptionError( "callback not callable: %r" % self.callback, self) if (self.callback_args is not None and diff --git a/Lib/packaging/dist.py b/Lib/packaging/dist.py --- a/Lib/packaging/dist.py +++ b/Lib/packaging/dist.py @@ -409,7 +409,7 @@ for help_option, short, desc, func in cmd_class.help_options: if hasattr(opts, help_option.replace('-', '_')): help_option_found = True - if hasattr(func, '__call__'): + if callable(func): func() else: raise PackagingClassError( @@ -733,7 +733,7 @@ else: hook_obj = hook - if not hasattr(hook_obj, '__call__'): + if not callable(hook_obj): raise PackagingOptionError('hook %r is not callable' % hook) logger.info('running %s %s for command %s', diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -500,7 +500,7 @@ for help_option, short, desc, func in cmd_class.help_options: if hasattr(opts, help_option.replace('-', '_')): help_option_found = True - if hasattr(func, '__call__'): + if callable(func): func() else: raise PackagingClassError( diff --git a/Lib/pickle.py b/Lib/pickle.py --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -362,7 +362,7 @@ raise PicklingError("args from save_reduce() should be a tuple") # Assert that func is callable - if not hasattr(func, '__call__'): + if not callable(func): raise PicklingError("func from save_reduce() should be callable") save = self.save diff --git a/Lib/pydoc.py b/Lib/pydoc.py --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -769,7 +769,7 @@ push(msg) for name, kind, homecls, value in ok: base = self.docother(getattr(object, name), name, mod) - if hasattr(value, '__call__') or inspect.isdatadescriptor(value): + if callable(value) or inspect.isdatadescriptor(value): doc = getattr(value, "__doc__", None) else: doc = None @@ -1196,7 +1196,7 @@ hr.maybe() push(msg) for name, kind, homecls, value in ok: - if hasattr(value, '__call__') or inspect.isdatadescriptor(value): + if callable(value) or inspect.isdatadescriptor(value): doc = getdoc(value) else: doc = None diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -325,7 +325,7 @@ if i == j: break action = self.lexicon[m.lastindex-1][1] - if hasattr(action, "__call__"): + if callable(action): self.match = m action = action(self, m.group()) if action is not None: diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py --- a/Lib/rlcompleter.py +++ b/Lib/rlcompleter.py @@ -87,7 +87,7 @@ return None def _callable_postfix(self, val, word): - if hasattr(val, '__call__'): + if callable(val): word = word + "(" return word diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -525,7 +525,7 @@ """ if extra_args is None: extra_args = [] - if not isinstance(function, collections.Callable): + if not callable(function): raise TypeError('The %s object is not callable' % function) if not isinstance(extra_args, (tuple, list)): raise TypeError('extra_args needs to be a sequence') @@ -618,7 +618,7 @@ raise RegistryError(msg % (extension, existing_extensions[extension])) - if not isinstance(function, collections.Callable): + if not callable(function): raise TypeError('The registered function must be a callable') diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -5,7 +5,6 @@ import unittest import functools import contextlib -import collections.abc from test import support from nntplib import NNTP, GroupInfo, _have_ssl import nntplib @@ -247,7 +246,7 @@ if not name.startswith('test_'): continue meth = getattr(cls, name) - if not isinstance(meth, collections.abc.Callable): + if not callable(meth): continue # Need to use a closure so that meth remains bound to its current # value diff --git a/Lib/timeit.py b/Lib/timeit.py --- a/Lib/timeit.py +++ b/Lib/timeit.py @@ -127,7 +127,7 @@ if isinstance(setup, str): setup = reindent(setup, 4) src = template.format(stmt=stmt, setup=setup) - elif hasattr(setup, '__call__'): + elif callable(setup): src = template.format(stmt=stmt, setup='_setup()') ns['_setup'] = setup else: @@ -136,13 +136,13 @@ code = compile(src, dummy_src_name, "exec") exec(code, globals(), ns) self.inner = ns["inner"] - elif hasattr(stmt, '__call__'): + elif callable(stmt): self.src = None if isinstance(setup, str): _setup = setup def setup(): exec(_setup, globals(), ns) - elif not hasattr(setup, '__call__'): + elif not callable(setup): raise ValueError("setup is neither a string nor callable") self.inner = _template_func(setup, stmt) else: diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -1037,7 +1037,7 @@ for k, v in cnf.items(): if v is not None: if k[-1] == '_': k = k[:-1] - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) elif isinstance(v, (tuple, list)): nv = [] @@ -1606,7 +1606,7 @@ """Bind function FUNC to command NAME for this widget. Return the function bound to NAME if None is given. NAME could be e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".""" - if hasattr(func, '__call__'): + if callable(func): command = self._register(func) else: command = func @@ -3176,7 +3176,7 @@ elif kw: cnf = kw options = () for k, v in cnf.items(): - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) options = options + ('-'+k, v) self.tk.call(('image', 'create', imgtype, name,) + options) @@ -3199,7 +3199,7 @@ for k, v in _cnfmerge(kw).items(): if v is not None: if k[-1] == '_': k = k[:-1] - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) res = res + ('-'+k, v) self.tk.call((self.name, 'config') + res) diff --git a/Lib/tkinter/tix.py b/Lib/tkinter/tix.py --- a/Lib/tkinter/tix.py +++ b/Lib/tkinter/tix.py @@ -405,7 +405,7 @@ elif kw: cnf = kw options = () for k, v in cnf.items(): - if hasattr(v, '__call__'): + if callable(v): v = self._register(v) options = options + ('-'+k, v) return master.tk.call(('image', 'create', imgtype,) + options) diff --git a/Lib/unittest/loader.py b/Lib/unittest/loader.py --- a/Lib/unittest/loader.py +++ b/Lib/unittest/loader.py @@ -113,7 +113,7 @@ return self.suiteClass([inst]) elif isinstance(obj, suite.TestSuite): return obj - if hasattr(obj, '__call__'): + if callable(obj): test = obj() if isinstance(test, suite.TestSuite): return test @@ -138,7 +138,7 @@ def isTestMethod(attrname, testCaseClass=testCaseClass, prefix=self.testMethodPrefix): return attrname.startswith(prefix) and \ - hasattr(getattr(testCaseClass, attrname), '__call__') + callable(getattr(testCaseClass, attrname)) testFnNames = testFnNames = list(filter(isTestMethod, dir(testCaseClass))) if self.sortTestMethodsUsing: diff --git a/Lib/unittest/suite.py b/Lib/unittest/suite.py --- a/Lib/unittest/suite.py +++ b/Lib/unittest/suite.py @@ -42,7 +42,7 @@ def addTest(self, test): # sanity checks - if not hasattr(test, '__call__'): + if not callable(test): raise TypeError("{} is not callable".format(repr(test))) if isinstance(test, type) and issubclass(test, (case.TestCase, TestSuite)): diff --git a/Lib/warnings.py b/Lib/warnings.py --- a/Lib/warnings.py +++ b/Lib/warnings.py @@ -259,7 +259,7 @@ raise RuntimeError( "Unrecognized action (%r) in warnings.filters:\n %s" % (action, item)) - if not hasattr(showwarning, "__call__"): + if not callable(showwarning): raise TypeError("warnings.showwarning() must be set to a " "function or method") # Print message and context diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -149,7 +149,7 @@ return [member for member in dir(obj) if not member.startswith('_') and - hasattr(getattr(obj, member), '__call__')] + callable(getattr(obj, member))] class SimpleXMLRPCDispatcher: """Mix-in class that dispatches XML-RPC requests. diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -341,6 +341,8 @@ Library ------- +- Issue #13258: Use callable() built-in in the standard library. + - Issue #13273: fix a bug that prevented HTMLParser to properly detect some tags when strict=False. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 15:07:01 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 15:07:01 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Remove_unused_v?= =?utf8?q?ariable=2E?= Message-ID: http://hg.python.org/cpython/rev/09d0510e1c50 changeset: 73167:09d0510e1c50 branch: 3.2 parent: 73165:8e57b5d8f58f user: Florent Xicluna date: Fri Oct 28 15:00:50 2011 +0200 summary: Remove unused variable. files: Python/bltinmodule.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -37,7 +37,7 @@ { PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *cell; PyObject *cls = NULL; - Py_ssize_t nargs, nbases; + Py_ssize_t nargs; int isclass; assert(args != NULL); @@ -62,7 +62,6 @@ bases = PyTuple_GetSlice(args, 2, nargs); if (bases == NULL) return NULL; - nbases = nargs - 2; if (kwds == NULL) { meta = NULL; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 15:07:02 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 15:07:02 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2_=28linked_to_issue_=231294232=29?= Message-ID: http://hg.python.org/cpython/rev/b9bb9340eb0c changeset: 73168:b9bb9340eb0c parent: 73166:fb828a3b1bf8 parent: 73167:09d0510e1c50 user: Florent Xicluna date: Fri Oct 28 15:06:13 2011 +0200 summary: Merge 3.2 (linked to issue #1294232) files: Python/bltinmodule.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -40,7 +40,7 @@ { PyObject *func, *name, *bases, *mkw, *meta, *winner, *prep, *ns, *cell; PyObject *cls = NULL; - Py_ssize_t nargs, nbases; + Py_ssize_t nargs; int isclass; _Py_IDENTIFIER(__prepare__); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 16:07:21 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 16:07:21 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_and_remove_few_dep?= =?utf8?q?endencies_on_=27errno=27=2C_thanks_to_PEP_3151=2E?= Message-ID: http://hg.python.org/cpython/rev/e4d44c2e8e81 changeset: 73169:e4d44c2e8e81 user: Florent Xicluna date: Fri Oct 28 16:06:23 2011 +0200 summary: Simplify and remove few dependencies on 'errno', thanks to PEP 3151. files: Lib/importlib/__init__.py | 3 +- Lib/importlib/_bootstrap.py | 16 ++------ Lib/tarfile.py | 6 +-- Lib/tempfile.py | 42 ++++++++++-------------- Lib/test/regrtest.py | 6 +-- 5 files changed, 28 insertions(+), 45 deletions(-) diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -81,11 +81,10 @@ except ImportError: raise ImportError('posix, nt, or os2 module required for importlib') _bootstrap._os = _os -import imp, sys, marshal, errno, _io +import imp, sys, marshal, _io _bootstrap.imp = imp _bootstrap.sys = sys _bootstrap.marshal = marshal -_bootstrap.errno = errno _bootstrap._io = _io import _warnings _bootstrap._warnings = _warnings diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -7,7 +7,7 @@ """ -# Injected modules are '_warnings', 'imp', 'sys', 'marshal', 'errno', '_io', +# Injected modules are '_warnings', 'imp', 'sys', 'marshal', '_io', # and '_os' (a.k.a. 'posix', 'nt' or 'os2'). # Injected attribute is path_sep. # @@ -503,19 +503,13 @@ parent = _path_join(parent, part) try: _os.mkdir(parent) - except OSError as exc: + except FileExistsError: # Probably another Python process already created the dir. - if exc.errno == errno.EEXIST: - continue - else: - raise - except IOError as exc: + continue + except PermissionError: # If can't get proper access, then just forget about writing # the data. - if exc.errno == errno.EACCES: - return - else: - raise + return try: _write_atomic(path, data) except (PermissionError, FileExistsError): diff --git a/Lib/tarfile.py b/Lib/tarfile.py --- a/Lib/tarfile.py +++ b/Lib/tarfile.py @@ -42,7 +42,6 @@ import os import shutil import stat -import errno import time import struct import copy @@ -2281,9 +2280,8 @@ # Use a safe mode for the directory, the real mode is set # later in _extract_member(). os.mkdir(targetpath, 0o700) - except EnvironmentError as e: - if e.errno != errno.EEXIST: - raise + except FileExistsError: + pass def makefile(self, tarinfo, targetpath): """Make a file called targetpath. diff --git a/Lib/tempfile.py b/Lib/tempfile.py --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -31,7 +31,6 @@ import sys as _sys import io as _io import os as _os -import errno as _errno from random import Random as _Random try: @@ -43,7 +42,7 @@ def _set_cloexec(fd): try: flags = _fcntl.fcntl(fd, _fcntl.F_GETFD, 0) - except IOError: + except OSError: pass else: # flags read successfully, modify @@ -85,19 +84,19 @@ elif hasattr(_os, "stat"): _stat = _os.stat else: - # Fallback. All we need is something that raises os.error if the + # Fallback. All we need is something that raises OSError if the # file doesn't exist. def _stat(fn): try: f = open(fn) - except IOError: - raise _os.error + except OSError: + raise OSError f.close() def _exists(fn): try: _stat(fn) - except _os.error: + except OSError: return False else: return True @@ -144,7 +143,7 @@ # As a last resort, the current directory. try: dirlist.append(_os.getcwd()) - except (AttributeError, _os.error): + except (AttributeError, OSError): dirlist.append(_os.curdir) return dirlist @@ -176,12 +175,11 @@ _os.unlink(filename) del fp, fd return dir - except (OSError, IOError) as e: - if e.args[0] != _errno.EEXIST: - break # no point trying more names in this directory + except FileExistsError: pass - raise IOError(_errno.ENOENT, - "No usable temporary directory found in %s" % dirlist) + except OSError: + break # no point trying more names in this directory + raise FileNotFoundError("No usable temporary directory found in %s" % dirlist) _name_sequence = None @@ -211,12 +209,10 @@ fd = _os.open(file, flags, 0o600) _set_cloexec(fd) return (fd, _os.path.abspath(file)) - except OSError as e: - if e.errno == _errno.EEXIST: - continue # try again - raise + except FileExistsError: + continue # try again - raise IOError(_errno.EEXIST, "No usable temporary file name found") + raise FileExistsError("No usable temporary file name found") # User visible interfaces. @@ -300,12 +296,10 @@ try: _os.mkdir(file, 0o700) return file - except OSError as e: - if e.errno == _errno.EEXIST: - continue # try again - raise + except FileExistsError: + continue # try again - raise IOError(_errno.EEXIST, "No usable temporary directory name found") + raise FileExistsError("No usable temporary directory name found") def mktemp(suffix="", prefix=template, dir=None): """User-callable function to return a unique temporary file name. The @@ -334,7 +328,7 @@ if not _exists(file): return file - raise IOError(_errno.EEXIST, "No usable temporary filename found") + raise FileExistsError("No usable temporary filename found") class _TemporaryFileWrapper: @@ -664,7 +658,7 @@ _islink = staticmethod(_os.path.islink) _remove = staticmethod(_os.remove) _rmdir = staticmethod(_os.rmdir) - _os_error = _os.error + _os_error = OSError _warn = _warnings.warn def _rmtree(self, path): diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -166,7 +166,6 @@ """ import builtins -import errno import faulthandler import getopt import io @@ -1721,9 +1720,8 @@ TEMPDIR = os.path.abspath(TEMPDIR) try: os.mkdir(TEMPDIR) - except OSError as e: - if e.errno != errno.EEXIST: - raise + except FileExistsError: + pass # Define a writable temp dir that will be used as cwd while running # the tests. The name of the dir includes the pid to allow parallel -- Repository URL: http://hg.python.org/cpython From tjreedy at udel.edu Fri Oct 28 20:30:55 2011 From: tjreedy at udel.edu (Terry Reedy) Date: Fri, 28 Oct 2011 14:30:55 -0400 Subject: [Python-checkins] cpython: Simplify and remove few dependencies on 'errno', thanks to PEP 3151. In-Reply-To: References: Message-ID: <4EAAF4DF.7020403@udel.edu> On 10/28/2011 10:07 AM, florent.xicluna wrote: > def _stat(fn): > try: > f = open(fn) > - except IOError: > - raise _os.error > + except OSError: > + raise OSError To me, the original two lines should have been deleted rather than replaced with a pair that seem equivalent to 'pass'. Am I missing some subtlety or is the above an artifact of two search and replaces? > f.close() That aside, this patch and previous changes convince me that the new exceptions are a definite improvement. Terry From python-checkins at python.org Fri Oct 28 21:59:20 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 21:59:20 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_no-op_code_from_prev?= =?utf8?q?ious_commit=2E?= Message-ID: http://hg.python.org/cpython/rev/5bd8a04206e8 changeset: 73170:5bd8a04206e8 user: Florent Xicluna date: Fri Oct 28 21:58:56 2011 +0200 summary: Remove no-op code from previous commit. files: Lib/tempfile.py | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/Lib/tempfile.py b/Lib/tempfile.py --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -87,10 +87,7 @@ # Fallback. All we need is something that raises OSError if the # file doesn't exist. def _stat(fn): - try: - f = open(fn) - except OSError: - raise OSError + f = open(fn) f.close() def _exists(fn): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 22:05:25 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 22:05:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_I_should_be_som?= =?utf8?q?eone?= Message-ID: http://hg.python.org/cpython/rev/6f56e81da8f6 changeset: 73171:6f56e81da8f6 branch: 3.2 parent: 73167:09d0510e1c50 user: Florent Xicluna date: Fri Oct 28 22:03:55 2011 +0200 summary: I should be someone files: Doc/library/urllib.request.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1257,11 +1257,11 @@ pair: HTTP; protocol pair: FTP; protocol -* Currently, only the following protocols are supported: HTTP, (versions 0.9 and - 1.0), FTP, and local files. +* Currently, only the following protocols are supported: HTTP (versions 0.9 and + 1.0), FTP, and local files. -* The caching feature of :func:`urlretrieve` has been disabled until I find the - time to hack proper processing of Expiration time headers. +* The caching feature of :func:`urlretrieve` has been disabled until someone find + the time to hack proper processing of Expiration time headers. * There should be a function to query whether a particular URL is in the cache. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 22:05:27 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 22:05:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/a100cb756cb8 changeset: 73172:a100cb756cb8 parent: 73170:5bd8a04206e8 parent: 73171:6f56e81da8f6 user: Florent Xicluna date: Fri Oct 28 22:05:12 2011 +0200 summary: Merge 3.2 files: Doc/library/urllib.request.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1288,11 +1288,11 @@ pair: HTTP; protocol pair: FTP; protocol -* Currently, only the following protocols are supported: HTTP, (versions 0.9 and - 1.0), FTP, and local files. +* Currently, only the following protocols are supported: HTTP (versions 0.9 and + 1.0), FTP, and local files. -* The caching feature of :func:`urlretrieve` has been disabled until I find the - time to hack proper processing of Expiration time headers. +* The caching feature of :func:`urlretrieve` has been disabled until someone find + the time to hack proper processing of Expiration time headers. * There should be a function to query whether a particular URL is in the cache. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 22:16:32 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 22:16:32 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Documentation_t?= =?utf8?q?ypo?= Message-ID: http://hg.python.org/cpython/rev/efd28631b2a5 changeset: 73173:efd28631b2a5 branch: 3.2 parent: 73171:6f56e81da8f6 user: Florent Xicluna date: Fri Oct 28 22:14:41 2011 +0200 summary: Documentation typo files: Doc/library/urllib.request.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1260,8 +1260,8 @@ * Currently, only the following protocols are supported: HTTP (versions 0.9 and 1.0), FTP, and local files. -* The caching feature of :func:`urlretrieve` has been disabled until someone find - the time to hack proper processing of Expiration time headers. +* The caching feature of :func:`urlretrieve` has been disabled until someone + finds the time to hack proper processing of Expiration time headers. * There should be a function to query whether a particular URL is in the cache. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 22:16:33 2011 From: python-checkins at python.org (florent.xicluna) Date: Fri, 28 Oct 2011 22:16:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/ae78a2250b4c changeset: 73174:ae78a2250b4c parent: 73172:a100cb756cb8 parent: 73173:efd28631b2a5 user: Florent Xicluna date: Fri Oct 28 22:16:23 2011 +0200 summary: Merge 3.2 files: Doc/library/urllib.request.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/urllib.request.rst b/Doc/library/urllib.request.rst --- a/Doc/library/urllib.request.rst +++ b/Doc/library/urllib.request.rst @@ -1291,8 +1291,8 @@ * Currently, only the following protocols are supported: HTTP (versions 0.9 and 1.0), FTP, and local files. -* The caching feature of :func:`urlretrieve` has been disabled until someone find - the time to hack proper processing of Expiration time headers. +* The caching feature of :func:`urlretrieve` has been disabled until someone + finds the time to hack proper processing of Expiration time headers. * There should be a function to query whether a particular URL is in the cache. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 23:08:25 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 28 Oct 2011 23:08:25 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_-_Issue_=231321?= =?utf8?q?8=3A_Fix_test=5Fssl_failures_on_Debian/Ubuntu=2E?= Message-ID: http://hg.python.org/cpython/rev/3c225f938dae changeset: 73175:3c225f938dae branch: 2.7 parent: 73162:9a6699a8aee9 user: Barry Warsaw date: Fri Oct 28 16:14:44 2011 -0400 summary: - Issue #13218: Fix test_ssl failures on Debian/Ubuntu. files: Lib/test/test_ssl.py | 6 ++++-- Misc/NEWS | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1025,7 +1025,8 @@ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv3, True, ssl.CERT_REQUIRED) if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv2, False) - try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_SSLv3) try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False) @skip_if_broken_ubuntu_ssl @@ -1039,7 +1040,8 @@ if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, False) try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3, False) - try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_TLSv1) def test_starttls(self): """Switching from clear text to encrypted and back again.""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,8 @@ Core and Builtins ----------------- +- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. + - Issue #13268: Fix the assert statement when a tuple is passed as the message. - Issue #13018: Fix reference leaks in error paths in dictobject.c. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 23:08:26 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 28 Oct 2011 23:08:26 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Oops=2C_put_fix?= =?utf8?q?_news_in_the_right_section=2E?= Message-ID: http://hg.python.org/cpython/rev/f17a6eff1fb6 changeset: 73176:f17a6eff1fb6 branch: 2.7 user: Barry Warsaw date: Fri Oct 28 16:16:58 2011 -0400 summary: Oops, put fix news in the right section. files: Misc/NEWS | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,8 +9,6 @@ Core and Builtins ----------------- -- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. - - Issue #13268: Fix the assert statement when a tuple is passed as the message. - Issue #13018: Fix reference leaks in error paths in dictobject.c. @@ -319,6 +317,8 @@ Tests ----- +- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. + - Issue #12821: Fix test_fcntl failures on OpenBSD 5. - Issue #12331: The test suite for lib2to3 can now run from an installed -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 23:08:27 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 28 Oct 2011 23:08:27 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_-_Issue_=231321?= =?utf8?q?8=3A_Fix_test=5Fssl_failures_on_Debian/Ubuntu=2E?= Message-ID: http://hg.python.org/cpython/rev/415e2c998e18 changeset: 73177:415e2c998e18 branch: 3.2 parent: 73167:09d0510e1c50 user: Barry Warsaw date: Fri Oct 28 16:52:17 2011 -0400 summary: - Issue #13218: Fix test_ssl failures on Debian/Ubuntu. files: Lib/test/test_ssl.py | 6 ++++-- Misc/NEWS | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1315,7 +1315,8 @@ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv3, True, ssl.CERT_REQUIRED) if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv2, False) - try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_SSLv3) try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False) if no_sslv2_implies_sslv3_hello(): # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs @@ -1333,7 +1334,8 @@ if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, False) try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3, False) - try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_TLSv1) def test_starttls(self): """Switching from clear text to encrypted and back again.""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -171,6 +171,8 @@ Tests ----- +- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. + - Issue #12821: Fix test_fcntl failures on OpenBSD 5. - Re-enable lib2to3's test_parser.py tests, though with an expected failure -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 23:08:28 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 28 Oct 2011 23:08:28 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_-_Issue_=2313218=3A_Fix_test=5Fssl_failures_on_Debian/Ubuntu=2E?= Message-ID: http://hg.python.org/cpython/rev/7a241bc34dd7 changeset: 73178:7a241bc34dd7 branch: 3.2 parent: 73173:efd28631b2a5 parent: 73177:415e2c998e18 user: Barry Warsaw date: Fri Oct 28 17:02:27 2011 -0400 summary: - Issue #13218: Fix test_ssl failures on Debian/Ubuntu. files: Lib/test/test_ssl.py | 6 ++++-- Misc/NEWS | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1315,7 +1315,8 @@ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv3, True, ssl.CERT_REQUIRED) if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv2, False) - try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_SSLv3) try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False) if no_sslv2_implies_sslv3_hello(): # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs @@ -1333,7 +1334,8 @@ if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, False) try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3, False) - try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_TLSv1) def test_starttls(self): """Switching from clear text to encrypted and back again.""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -171,6 +171,8 @@ Tests ----- +- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. + - Issue #12821: Fix test_fcntl failures on OpenBSD 5. - Re-enable lib2to3's test_parser.py tests, though with an expected failure -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Oct 28 23:08:29 2011 From: python-checkins at python.org (barry.warsaw) Date: Fri, 28 Oct 2011 23:08:29 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_-_Issue_=2313218=3A_Fix_test=5Fssl_failures_on_Debian/Ubuntu?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/472219ffa1d7 changeset: 73179:472219ffa1d7 parent: 73174:ae78a2250b4c parent: 73178:7a241bc34dd7 user: Barry Warsaw date: Fri Oct 28 17:08:12 2011 -0400 summary: - Issue #13218: Fix test_ssl failures on Debian/Ubuntu. files: Lib/test/test_ssl.py | 6 ++++-- Misc/NEWS | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1405,7 +1405,8 @@ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv3, True, ssl.CERT_REQUIRED) if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv2, False) - try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_SSLv3) try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False) if no_sslv2_implies_sslv3_hello(): # No SSLv2 => client will use an SSLv3 hello on recent OpenSSLs @@ -1423,7 +1424,8 @@ if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, False) try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3, False) - try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False) + try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False, + client_options=ssl.OP_NO_TLSv1) def test_starttls(self): """Switching from clear text to encrypted and back again.""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1500,6 +1500,8 @@ Tests ----- +- Issue #13218: Fix test_ssl failures on Debian/Ubuntu. + - Re-enable lib2to3's test_parser.py tests, though with an expected failure (see issue 13125). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 01:44:05 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 29 Oct 2011 01:44:05 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_bring_is=5Finte?= =?utf8?q?ger_into_tested_existence?= Message-ID: http://hg.python.org/cpython/rev/2098bd4eed21 changeset: 73180:2098bd4eed21 branch: 3.2 parent: 73178:7a241bc34dd7 user: Benjamin Peterson date: Fri Oct 28 19:42:48 2011 -0400 summary: bring is_integer into tested existence files: Lib/test/test_float.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -128,6 +128,12 @@ self.assertRaises(TypeError, float, Foo4(42)) self.assertAlmostEqual(float(FooStr('8')), 9.) + def test_is_integer(self): + self.assertFalse((1.1).is_integer()) + self.assertTrue((1.).is_integer()) + self.assertFalse(float("nan").is_integer()) + self.assertFalse(float("inf").is_integer()) + def test_floatasratio(self): for f, ratio in [ (0.875, (7, 8)), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 01:44:06 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 29 Oct 2011 01:44:06 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_bring_is=5Finte?= =?utf8?q?ger_into_tested_existence?= Message-ID: http://hg.python.org/cpython/rev/1b4ac37c2a37 changeset: 73181:1b4ac37c2a37 branch: 2.7 parent: 73176:f17a6eff1fb6 user: Benjamin Peterson date: Fri Oct 28 19:42:48 2011 -0400 summary: bring is_integer into tested existence files: Lib/test/test_float.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -164,6 +164,12 @@ self.assertAlmostEqual(float(FooUnicode('8')), 9.) self.assertAlmostEqual(float(FooStr('8')), 9.) + def test_is_integer(self): + self.assertFalse((1.1).is_integer()) + self.assertTrue((1.).is_integer()) + self.assertFalse(float("nan").is_integer()) + self.assertFalse(float("inf").is_integer()) + def test_floatasratio(self): for f, ratio in [ (0.875, (7, 8)), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 01:44:07 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 29 Oct 2011 01:44:07 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/d9ad109dd82e changeset: 73182:d9ad109dd82e parent: 73179:472219ffa1d7 parent: 73180:2098bd4eed21 user: Benjamin Peterson date: Fri Oct 28 19:44:00 2011 -0400 summary: merge 3.2 files: Lib/test/test_float.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_float.py b/Lib/test/test_float.py --- a/Lib/test/test_float.py +++ b/Lib/test/test_float.py @@ -128,6 +128,12 @@ self.assertRaises(TypeError, float, Foo4(42)) self.assertAlmostEqual(float(FooStr('8')), 9.) + def test_is_integer(self): + self.assertFalse((1.1).is_integer()) + self.assertTrue((1.).is_integer()) + self.assertFalse(float("nan").is_integer()) + self.assertFalse(float("inf").is_integer()) + def test_floatasratio(self): for f, ratio in [ (0.875, (7, 8)), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:00:58 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:00:58 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_last_references_to_t?= =?utf8?q?he_removed_Unicode_free_list?= Message-ID: http://hg.python.org/cpython/rev/085d3a2d4102 changeset: 73183:085d3a2d4102 user: Victor Stinner date: Sun Oct 23 19:43:33 2011 +0200 summary: Remove last references to the removed Unicode free list files: Objects/unicodeobject.c | 23 ----------------------- 1 files changed, 0 insertions(+), 23 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -50,29 +50,6 @@ # define DONT_MAKE_RESULT_READY #endif -/* Limit for the Unicode object free list */ - -#define PyUnicode_MAXFREELIST 1024 - -/* Limit for the Unicode object free list stay alive optimization. - - The implementation will keep allocated Unicode memory intact for - all objects on the free list having a size less than this - limit. This reduces malloc() overhead for small Unicode objects. - - At worst this will result in PyUnicode_MAXFREELIST * - (sizeof(PyUnicodeObject) + KEEPALIVE_SIZE_LIMIT + - malloc()-overhead) bytes of unused garbage. - - Setting the limit to 0 effectively turns the feature off. - - Note: This is an experimental feature ! If you get core dumps when - using Unicode objects, turn this feature off. - -*/ - -#define KEEPALIVE_SIZE_LIMIT 9 - /* Endianness switches; defaults to little endian */ #ifdef WORDS_BIGENDIAN -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:00:59 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:00:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_data_variable_in_=5FPyU?= =?utf8?q?nicode=5FDump=28=29_for_compact_ASCII?= Message-ID: http://hg.python.org/cpython/rev/a826ece1c29d changeset: 73184:a826ece1c29d user: Victor Stinner date: Sun Oct 23 19:47:19 2011 +0200 summary: Fix data variable in _PyUnicode_Dump() for compact ASCII files: Objects/unicodeobject.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -838,14 +838,22 @@ PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op; void *data; - printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length); + if (ascii->state.compact) - data = (compact + 1); + { + if (ascii->state.ascii) + data = (ascii + 1); + else + data = (compact + 1); + } else data = unicode->data.any; + printf("%s: len=%zu, ",unicode_kind_name(op), ascii->length); + if (ascii->wstr == data) printf("shared "); printf("wstr=%p", ascii->wstr); + if (!(ascii->state.ascii == 1 && ascii->state.compact == 1)) { printf(" (%zu), ", compact->wstr_length); if (!ascii->state.compact && compact->utf8 == unicode->data.any) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:00:59 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:00:59 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_PyUnicodeObject*_by?= =?utf8?q?_PyObject*_where_it_was_irrevelant?= Message-ID: http://hg.python.org/cpython/rev/f61db5671cc8 changeset: 73185:f61db5671cc8 user: Victor Stinner date: Sun Oct 23 20:04:37 2011 +0200 summary: Replace PyUnicodeObject* by PyObject* where it was irrevelant A Unicode string can now be a PyASCIIObject, PyCompactUnicodeObject or PyUnicodeObject. Aliasing a PyASCIIObject* or PyCompactUnicodeObject* to PyUnicodeObject* is wrong files: Include/unicodeobject.h | 2 +- Objects/stringlib/find.h | 8 +- Objects/unicodeobject.c | 275 ++++++++++++-------------- 3 files changed, 136 insertions(+), 149 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1828,7 +1828,7 @@ #ifndef Py_LIMITED_API /* Externally visible for str.strip(unicode) */ PyAPI_FUNC(PyObject *) _PyUnicode_XStrip( - PyUnicodeObject *self, + PyObject *self, int striptype, PyObject *sepobj ); diff --git a/Objects/stringlib/find.h b/Objects/stringlib/find.h --- a/Objects/stringlib/find.h +++ b/Objects/stringlib/find.h @@ -95,7 +95,7 @@ rindex) and for count, startswith and endswith, because they all have the same behaviour for the arguments. -It does not touch the variables received until it knows everything +It does not touch the variables received until it knows everything is ok. */ @@ -145,13 +145,13 @@ Note that we receive a pointer to the pointer of the substring object, so when we create that object in this function we don't DECREF it, -because it continues living in the caller functions (those functions, +because it continues living in the caller functions (those functions, after finishing using the substring, must DECREF it). */ Py_LOCAL_INLINE(int) STRINGLIB(parse_args_finds_unicode)(const char * function_name, PyObject *args, - PyUnicodeObject **substring, + PyObject **substring, Py_ssize_t *start, Py_ssize_t *end) { PyObject *tmp_substring; @@ -161,7 +161,7 @@ tmp_substring = PyUnicode_FromObject(tmp_substring); if (!tmp_substring) return 0; - *substring = (PyUnicodeObject *)tmp_substring; + *substring = tmp_substring; return 1; } return 0; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -585,7 +585,7 @@ } static int -resize_inplace(PyUnicodeObject *unicode, Py_ssize_t length) +resize_inplace(PyObject *unicode, Py_ssize_t length) { wchar_t *wstr; assert(!PyUnicode_IS_COMPACT(unicode)); @@ -675,17 +675,17 @@ return copy; } else { - PyUnicodeObject *w; + PyObject *w; assert(_PyUnicode_WSTR(unicode) != NULL); assert(_PyUnicode_DATA_ANY(unicode) == NULL); - w = _PyUnicode_New(length); + w = (PyObject*)_PyUnicode_New(length); if (w == NULL) return NULL; copy_length = _PyUnicode_WSTR_LENGTH(unicode); copy_length = Py_MIN(copy_length, length); Py_UNICODE_COPY(_PyUnicode_WSTR(w), _PyUnicode_WSTR(unicode), copy_length); - return (PyObject*)w; + return w; } } @@ -983,7 +983,7 @@ characters for a terminating null character. */ static void unicode_convert_wchar_to_ucs4(const wchar_t *begin, const wchar_t *end, - PyUnicodeObject *unicode) + PyObject *unicode) { const wchar_t *iter; Py_UCS4 *ucs4_out; @@ -1254,7 +1254,7 @@ static int unicode_ready(PyObject **p_obj, int replace) { - PyUnicodeObject *unicode; + PyObject *unicode; wchar_t *end; Py_UCS4 maxchar = 0; Py_ssize_t num_surrogates; @@ -1263,7 +1263,7 @@ #endif assert(p_obj != NULL); - unicode = (PyUnicodeObject *)*p_obj; + unicode = *p_obj; /* _PyUnicode_Ready() is only intended for old-style API usage where strings were created using _PyObject_New() and where no canonical @@ -1423,7 +1423,7 @@ } static void -unicode_dealloc(register PyUnicodeObject *unicode) +unicode_dealloc(register PyObject *unicode) { switch (PyUnicode_CHECK_INTERNED(unicode)) { case SSTATE_NOT_INTERNED: @@ -1526,7 +1526,7 @@ assert(_PyUnicode_CheckConsistency(*p_unicode, 0)); return 0; } - return resize_inplace((PyUnicodeObject*)unicode, length); + return resize_inplace(unicode, length); } int @@ -1566,7 +1566,7 @@ PyObject * PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size) { - PyUnicodeObject *unicode; + PyObject *unicode; Py_UCS4 maxchar = 0; Py_ssize_t num_surrogates; @@ -1593,7 +1593,7 @@ &maxchar, &num_surrogates) == -1) return NULL; - unicode = (PyUnicodeObject *) PyUnicode_New(size - num_surrogates, + unicode = PyUnicode_New(size - num_surrogates, maxchar); if (!unicode) return NULL; @@ -1626,14 +1626,12 @@ } assert(_PyUnicode_CheckConsistency(unicode, 1)); - return (PyObject *)unicode; + return unicode; } PyObject * PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size) { - PyUnicodeObject *unicode; - if (size < 0) { PyErr_SetString(PyExc_SystemError, "Negative size passed to PyUnicode_FromStringAndSize"); @@ -1660,11 +1658,7 @@ return PyUnicode_DecodeUTF8(u, size, NULL); } - unicode = _PyUnicode_New(size); - if (!unicode) - return NULL; - - return (PyObject *)unicode; + return (PyObject *)_PyUnicode_New(size); } PyObject * @@ -2650,14 +2644,14 @@ character) written into w. Write at most size wide characters (including the null character). */ static Py_ssize_t -unicode_aswidechar(PyUnicodeObject *unicode, +unicode_aswidechar(PyObject *unicode, wchar_t *w, Py_ssize_t size) { Py_ssize_t res; const wchar_t *wstr; - wstr = PyUnicode_AsUnicodeAndSize((PyObject *)unicode, &res); + wstr = PyUnicode_AsUnicodeAndSize(unicode, &res); if (wstr == NULL) return -1; @@ -2682,7 +2676,7 @@ PyErr_BadInternalCall(); return -1; } - return unicode_aswidechar((PyUnicodeObject*)unicode, w, size); + return unicode_aswidechar(unicode, w, size); } wchar_t* @@ -2697,7 +2691,7 @@ return NULL; } - buflen = unicode_aswidechar((PyUnicodeObject *)unicode, NULL, 0); + buflen = unicode_aswidechar(unicode, NULL, 0); if (buflen == -1) return NULL; if (PY_SSIZE_T_MAX / sizeof(wchar_t) < buflen) { @@ -2710,7 +2704,7 @@ PyErr_NoMemory(); return NULL; } - buflen = unicode_aswidechar((PyUnicodeObject *)unicode, buffer, buflen); + buflen = unicode_aswidechar(unicode, buffer, buflen); if (buflen == -1) return NULL; if (size != NULL) @@ -3322,13 +3316,12 @@ PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize) { PyObject *bytes; - PyUnicodeObject *u = (PyUnicodeObject *)unicode; if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; } - if (PyUnicode_READY(u) == -1) + if (PyUnicode_READY(unicode) == -1) return NULL; if (PyUnicode_UTF8(unicode) == NULL) { @@ -3336,13 +3329,15 @@ bytes = _PyUnicode_AsUTF8String(unicode, "strict"); if (bytes == NULL) return NULL; - _PyUnicode_UTF8(u) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); - if (_PyUnicode_UTF8(u) == NULL) { + _PyUnicode_UTF8(unicode) = PyObject_MALLOC(PyBytes_GET_SIZE(bytes) + 1); + if (_PyUnicode_UTF8(unicode) == NULL) { Py_DECREF(bytes); return NULL; } - _PyUnicode_UTF8_LENGTH(u) = PyBytes_GET_SIZE(bytes); - Py_MEMCPY(_PyUnicode_UTF8(u), PyBytes_AS_STRING(bytes), _PyUnicode_UTF8_LENGTH(u) + 1); + _PyUnicode_UTF8_LENGTH(unicode) = PyBytes_GET_SIZE(bytes); + Py_MEMCPY(_PyUnicode_UTF8(unicode), + PyBytes_AS_STRING(bytes), + _PyUnicode_UTF8_LENGTH(unicode) + 1); Py_DECREF(bytes); } @@ -3365,7 +3360,6 @@ Py_UNICODE * PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size) { - PyUnicodeObject *u; const unsigned char *one_byte; #if SIZEOF_WCHAR_T == 4 const Py_UCS2 *two_bytes; @@ -3381,20 +3375,19 @@ PyErr_BadArgument(); return NULL; } - u = (PyUnicodeObject*)unicode; - if (_PyUnicode_WSTR(u) == NULL) { + if (_PyUnicode_WSTR(unicode) == NULL) { /* Non-ASCII compact unicode object */ - assert(_PyUnicode_KIND(u) != 0); - assert(PyUnicode_IS_READY(u)); + assert(_PyUnicode_KIND(unicode) != 0); + assert(PyUnicode_IS_READY(unicode)); #ifdef Py_DEBUG ++unicode_as_unicode_calls; #endif - if (PyUnicode_KIND(u) == PyUnicode_4BYTE_KIND) { + if (PyUnicode_KIND(unicode) == PyUnicode_4BYTE_KIND) { #if SIZEOF_WCHAR_T == 2 - four_bytes = PyUnicode_4BYTE_DATA(u); - ucs4_end = four_bytes + _PyUnicode_LENGTH(u); + four_bytes = PyUnicode_4BYTE_DATA(unicode); + ucs4_end = four_bytes + _PyUnicode_LENGTH(unicode); num_surrogates = 0; for (; four_bytes < ucs4_end; ++four_bytes) { @@ -3402,17 +3395,17 @@ ++num_surrogates; } - _PyUnicode_WSTR(u) = (wchar_t *) PyObject_MALLOC( - sizeof(wchar_t) * (_PyUnicode_LENGTH(u) + 1 + num_surrogates)); - if (!_PyUnicode_WSTR(u)) { + _PyUnicode_WSTR(unicode) = (wchar_t *) PyObject_MALLOC( + sizeof(wchar_t) * (_PyUnicode_LENGTH(unicode) + 1 + num_surrogates)); + if (!_PyUnicode_WSTR(unicode)) { PyErr_NoMemory(); return NULL; } - _PyUnicode_WSTR_LENGTH(u) = _PyUnicode_LENGTH(u) + num_surrogates; - - w = _PyUnicode_WSTR(u); - wchar_end = w + _PyUnicode_WSTR_LENGTH(u); - four_bytes = PyUnicode_4BYTE_DATA(u); + _PyUnicode_WSTR_LENGTH(unicode) = _PyUnicode_LENGTH(unicode) + num_surrogates; + + w = _PyUnicode_WSTR(unicode); + wchar_end = w + _PyUnicode_WSTR_LENGTH(unicode); + four_bytes = PyUnicode_4BYTE_DATA(unicode); for (; four_bytes < ucs4_end; ++four_bytes, ++w) { if (*four_bytes > 0xFFFF) { /* encode surrogate pair in this case */ @@ -3435,35 +3428,35 @@ #endif } else { - _PyUnicode_WSTR(u) = (wchar_t *) PyObject_MALLOC(sizeof(wchar_t) * - (_PyUnicode_LENGTH(u) + 1)); - if (!_PyUnicode_WSTR(u)) { + _PyUnicode_WSTR(unicode) = (wchar_t *) PyObject_MALLOC(sizeof(wchar_t) * + (_PyUnicode_LENGTH(unicode) + 1)); + if (!_PyUnicode_WSTR(unicode)) { PyErr_NoMemory(); return NULL; } - if (!PyUnicode_IS_COMPACT_ASCII(u)) - _PyUnicode_WSTR_LENGTH(u) = _PyUnicode_LENGTH(u); - w = _PyUnicode_WSTR(u); - wchar_end = w + _PyUnicode_LENGTH(u); - - if (PyUnicode_KIND(u) == PyUnicode_1BYTE_KIND) { - one_byte = PyUnicode_1BYTE_DATA(u); + if (!PyUnicode_IS_COMPACT_ASCII(unicode)) + _PyUnicode_WSTR_LENGTH(unicode) = _PyUnicode_LENGTH(unicode); + w = _PyUnicode_WSTR(unicode); + wchar_end = w + _PyUnicode_LENGTH(unicode); + + if (PyUnicode_KIND(unicode) == PyUnicode_1BYTE_KIND) { + one_byte = PyUnicode_1BYTE_DATA(unicode); for (; w < wchar_end; ++one_byte, ++w) *w = *one_byte; /* null-terminate the wstr */ *w = 0; } - else if (PyUnicode_KIND(u) == PyUnicode_2BYTE_KIND) { + else if (PyUnicode_KIND(unicode) == PyUnicode_2BYTE_KIND) { #if SIZEOF_WCHAR_T == 4 - two_bytes = PyUnicode_2BYTE_DATA(u); + two_bytes = PyUnicode_2BYTE_DATA(unicode); for (; w < wchar_end; ++two_bytes, ++w) *w = *two_bytes; /* null-terminate the wstr */ *w = 0; #else /* sizeof(wchar_t) == 2 */ - PyObject_FREE(_PyUnicode_WSTR(u)); - _PyUnicode_WSTR(u) = NULL; + PyObject_FREE(_PyUnicode_WSTR(unicode)); + _PyUnicode_WSTR(unicode) = NULL; Py_FatalError("Impossible unicode object state, wstr " "and str should share memory already."); return NULL; @@ -3475,8 +3468,8 @@ } } if (size != NULL) - *size = PyUnicode_WSTR_LENGTH(u); - return _PyUnicode_WSTR(u); + *size = PyUnicode_WSTR_LENGTH(unicode); + return _PyUnicode_WSTR(unicode); } Py_UNICODE * @@ -9109,16 +9102,16 @@ Py_ssize_t end) { Py_ssize_t result; - PyUnicodeObject* str_obj; - PyUnicodeObject* sub_obj; + PyObject* str_obj; + PyObject* sub_obj; int kind1, kind2, kind; void *buf1 = NULL, *buf2 = NULL; Py_ssize_t len1, len2; - str_obj = (PyUnicodeObject*) PyUnicode_FromObject(str); + str_obj = PyUnicode_FromObject(str); if (!str_obj || PyUnicode_READY(str_obj) == -1) return -1; - sub_obj = (PyUnicodeObject*) PyUnicode_FromObject(substr); + sub_obj = PyUnicode_FromObject(substr); if (!sub_obj || PyUnicode_READY(sub_obj) == -1) { Py_DECREF(str_obj); return -1; @@ -9242,8 +9235,8 @@ } static int -tailmatch(PyUnicodeObject *self, - PyUnicodeObject *substring, +tailmatch(PyObject *self, + PyObject *substring, Py_ssize_t start, Py_ssize_t end, int direction) @@ -9327,8 +9320,7 @@ return -1; } - result = tailmatch((PyUnicodeObject *)str, - (PyUnicodeObject *)substr, + result = tailmatch(str, substr, start, end, direction); Py_DECREF(str); Py_DECREF(substr); @@ -10402,7 +10394,7 @@ normalized whitespace (all whitespace strings are replaced by ' ')."); static PyObject* -unicode_capwords(PyUnicodeObject *self) +unicode_capwords(PyObject *self) { PyObject *list; PyObject *item; @@ -10415,7 +10407,7 @@ /* Capitalize each word */ for (i = 0; i < PyList_GET_SIZE(list); i++) { - item = fixup((PyUnicodeObject *)PyList_GET_ITEM(list, i), + item = fixup(PyList_GET_ITEM(list, i), fixcapitalize); if (item == NULL) goto onError; @@ -10490,7 +10482,7 @@ /* This function assumes that str1 and str2 are readied by the caller. */ static int -unicode_compare(PyUnicodeObject *str1, PyUnicodeObject *str2) +unicode_compare(PyObject *str1, PyObject *str2) { int kind1, kind2; void *data1, *data2; @@ -10522,8 +10514,7 @@ if (PyUnicode_READY(left) == -1 || PyUnicode_READY(right) == -1) return -1; - return unicode_compare((PyUnicodeObject *)left, - (PyUnicodeObject *)right); + return unicode_compare(left, right); } PyErr_Format(PyExc_TypeError, "Can't compare %.100s and %.100s", @@ -10586,8 +10577,7 @@ if (left == right) result = 0; else - result = unicode_compare((PyUnicodeObject *)left, - (PyUnicodeObject *)right); + result = unicode_compare(left, right); /* Convert the return value to a Boolean */ switch (op) { @@ -10849,9 +10839,9 @@ interpreted as in slice notation."); static PyObject * -unicode_count(PyUnicodeObject *self, PyObject *args) -{ - PyUnicodeObject *substring; +unicode_count(PyObject *self, PyObject *args) +{ + PyObject *substring; Py_ssize_t start = 0; Py_ssize_t end = PY_SSIZE_T_MAX; PyObject *result; @@ -10931,7 +10921,7 @@ codecs.register_error that can handle UnicodeEncodeErrors."); static PyObject * -unicode_encode(PyUnicodeObject *self, PyObject *args, PyObject *kwargs) +unicode_encode(PyObject *self, PyObject *args, PyObject *kwargs) { static char *kwlist[] = {"encoding", "errors", 0}; char *encoding = NULL; @@ -10940,7 +10930,7 @@ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ss:encode", kwlist, &encoding, &errors)) return NULL; - return PyUnicode_AsEncodedString((PyObject *)self, encoding, errors); + return PyUnicode_AsEncodedString(self, encoding, errors); } PyDoc_STRVAR(expandtabs__doc__, @@ -10950,7 +10940,7 @@ If tabsize is not given, a tab size of 8 characters is assumed."); static PyObject* -unicode_expandtabs(PyUnicodeObject *self, PyObject *args) +unicode_expandtabs(PyObject *self, PyObject *args) { Py_ssize_t i, j, line_pos, src_len, incr; Py_UCS4 ch; @@ -11053,7 +11043,7 @@ static PyObject * unicode_find(PyObject *self, PyObject *args) { - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start; Py_ssize_t end; Py_ssize_t result; @@ -11091,7 +11081,7 @@ /* Believe it or not, this produces the same value for ASCII strings as bytes_hash(). */ static Py_hash_t -unicode_hash(PyUnicodeObject *self) +unicode_hash(PyObject *self) { Py_ssize_t len; Py_uhash_t x; @@ -11146,7 +11136,7 @@ unicode_index(PyObject *self, PyObject *args) { Py_ssize_t result; - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start; Py_ssize_t end; @@ -11183,7 +11173,7 @@ at least one cased character in S, False otherwise."); static PyObject* -unicode_islower(PyUnicodeObject *self) +unicode_islower(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11224,7 +11214,7 @@ at least one cased character in S, False otherwise."); static PyObject* -unicode_isupper(PyUnicodeObject *self) +unicode_isupper(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11267,7 +11257,7 @@ Return False otherwise."); static PyObject* -unicode_istitle(PyUnicodeObject *self) +unicode_istitle(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11321,7 +11311,7 @@ and there is at least one character in S, False otherwise."); static PyObject* -unicode_isspace(PyUnicodeObject *self) +unicode_isspace(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11357,7 +11347,7 @@ and there is at least one character in S, False otherwise."); static PyObject* -unicode_isalpha(PyUnicodeObject *self) +unicode_isalpha(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11392,7 +11382,7 @@ and there is at least one character in S, False otherwise."); static PyObject* -unicode_isalnum(PyUnicodeObject *self) +unicode_isalnum(PyObject *self) { int kind; void *data; @@ -11430,7 +11420,7 @@ False otherwise."); static PyObject* -unicode_isdecimal(PyUnicodeObject *self) +unicode_isdecimal(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11465,7 +11455,7 @@ and there is at least one character in S, False otherwise."); static PyObject* -unicode_isdigit(PyUnicodeObject *self) +unicode_isdigit(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11501,7 +11491,7 @@ False otherwise."); static PyObject* -unicode_isnumeric(PyUnicodeObject *self) +unicode_isnumeric(PyObject *self) { Py_ssize_t i, length; int kind; @@ -11623,7 +11613,7 @@ } static Py_ssize_t -unicode_length(PyUnicodeObject *self) +unicode_length(PyObject *self) { if (PyUnicode_READY(self) == -1) return -1; @@ -11678,7 +11668,7 @@ /* externally visible for str.strip(unicode) */ PyObject * -_PyUnicode_XStrip(PyUnicodeObject *self, int striptype, PyObject *sepobj) +_PyUnicode_XStrip(PyObject *self, int striptype, PyObject *sepobj) { void *data; int kind; @@ -11761,7 +11751,7 @@ } static PyObject * -do_strip(PyUnicodeObject *self, int striptype) +do_strip(PyObject *self, int striptype) { int kind; void *data; @@ -11794,7 +11784,7 @@ static PyObject * -do_argstrip(PyUnicodeObject *self, int striptype, PyObject *args) +do_argstrip(PyObject *self, int striptype, PyObject *args) { PyObject *sep = NULL; @@ -11824,7 +11814,7 @@ If chars is given and not None, remove characters in chars instead."); static PyObject * -unicode_strip(PyUnicodeObject *self, PyObject *args) +unicode_strip(PyObject *self, PyObject *args) { if (PyTuple_GET_SIZE(args) == 0) return do_strip(self, BOTHSTRIP); /* Common case */ @@ -11840,7 +11830,7 @@ If chars is given and not None, remove characters in chars instead."); static PyObject * -unicode_lstrip(PyUnicodeObject *self, PyObject *args) +unicode_lstrip(PyObject *self, PyObject *args) { if (PyTuple_GET_SIZE(args) == 0) return do_strip(self, LEFTSTRIP); /* Common case */ @@ -11856,7 +11846,7 @@ If chars is given and not None, remove characters in chars instead."); static PyObject * -unicode_rstrip(PyUnicodeObject *self, PyObject *args) +unicode_rstrip(PyObject *self, PyObject *args) { if (PyTuple_GET_SIZE(args) == 0) return do_strip(self, RIGHTSTRIP); /* Common case */ @@ -11866,9 +11856,9 @@ static PyObject* -unicode_repeat(PyUnicodeObject *str, Py_ssize_t len) -{ - PyUnicodeObject *u; +unicode_repeat(PyObject *str, Py_ssize_t len) +{ + PyObject *u; Py_ssize_t nchars, n; if (len < 1) { @@ -11892,7 +11882,7 @@ } nchars = len * PyUnicode_GET_LENGTH(str); - u = (PyUnicodeObject *)PyUnicode_New(nchars, PyUnicode_MAX_CHAR_VALUE(str)); + u = PyUnicode_New(nchars, PyUnicode_MAX_CHAR_VALUE(str)); if (!u) return NULL; assert(PyUnicode_KIND(u) == PyUnicode_KIND(str)); @@ -11923,7 +11913,7 @@ } assert(_PyUnicode_CheckConsistency(u, 1)); - return (PyObject*) u; + return u; } PyObject * @@ -12156,7 +12146,7 @@ static PyObject * unicode_rfind(PyObject *self, PyObject *args) { - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start; Py_ssize_t end; Py_ssize_t result; @@ -12190,7 +12180,7 @@ static PyObject * unicode_rindex(PyObject *self, PyObject *args) { - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start; Py_ssize_t end; Py_ssize_t result; @@ -12522,7 +12512,7 @@ is given and true."); static PyObject* -unicode_splitlines(PyUnicodeObject *self, PyObject *args, PyObject *kwds) +unicode_splitlines(PyObject *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"keepends", 0}; int keepends = 0; @@ -12531,7 +12521,7 @@ kwlist, &keepends)) return NULL; - return PyUnicode_Splitlines((PyObject *)self, keepends); + return PyUnicode_Splitlines(self, keepends); } static @@ -12570,7 +12560,7 @@ must be a string, whose characters will be mapped to None in the result."); static PyObject* -unicode_maketrans(PyUnicodeObject *null, PyObject *args) +unicode_maketrans(PyObject *null, PyObject *args) { PyObject *x, *y = NULL, *z = NULL; PyObject *new = NULL, *key, *value; @@ -12768,11 +12758,11 @@ prefix can also be a tuple of strings to try."); static PyObject * -unicode_startswith(PyUnicodeObject *self, +unicode_startswith(PyObject *self, PyObject *args) { PyObject *subobj; - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start = 0; Py_ssize_t end = PY_SSIZE_T_MAX; int result; @@ -12782,8 +12772,7 @@ if (PyTuple_Check(subobj)) { Py_ssize_t i; for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { - substring = (PyUnicodeObject *)PyUnicode_FromObject( - PyTuple_GET_ITEM(subobj, i)); + substring = PyUnicode_FromObject(PyTuple_GET_ITEM(subobj, i)); if (substring == NULL) return NULL; result = tailmatch(self, substring, start, end, -1); @@ -12795,7 +12784,7 @@ /* nothing matched */ Py_RETURN_FALSE; } - substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj); + substring = PyUnicode_FromObject(subobj); if (substring == NULL) { if (PyErr_ExceptionMatches(PyExc_TypeError)) PyErr_Format(PyExc_TypeError, "startswith first arg must be str or " @@ -12817,11 +12806,11 @@ suffix can also be a tuple of strings to try."); static PyObject * -unicode_endswith(PyUnicodeObject *self, +unicode_endswith(PyObject *self, PyObject *args) { PyObject *subobj; - PyUnicodeObject *substring; + PyObject *substring; Py_ssize_t start = 0; Py_ssize_t end = PY_SSIZE_T_MAX; int result; @@ -12831,7 +12820,7 @@ if (PyTuple_Check(subobj)) { Py_ssize_t i; for (i = 0; i < PyTuple_GET_SIZE(subobj); i++) { - substring = (PyUnicodeObject *)PyUnicode_FromObject( + substring = PyUnicode_FromObject( PyTuple_GET_ITEM(subobj, i)); if (substring == NULL) return NULL; @@ -12843,7 +12832,7 @@ } Py_RETURN_FALSE; } - substring = (PyUnicodeObject *)PyUnicode_FromObject(subobj); + substring = PyUnicode_FromObject(subobj); if (substring == NULL) { if (PyErr_ExceptionMatches(PyExc_TypeError)) PyErr_Format(PyExc_TypeError, "endswith first arg must be str or " @@ -12888,7 +12877,7 @@ Return a formatted version of S as described by format_spec."); static PyObject * -unicode__sizeof__(PyUnicodeObject *v) +unicode__sizeof__(PyObject *v) { Py_ssize_t size; @@ -13020,7 +13009,7 @@ }; static PyObject* -unicode_subscript(PyUnicodeObject* self, PyObject* item) +unicode_subscript(PyObject* self, PyObject* item) { if (PyUnicode_READY(self) == -1) return NULL; @@ -13031,7 +13020,7 @@ return NULL; if (i < 0) i += PyUnicode_GET_LENGTH(self); - return unicode_getitem((PyObject*)self, i); + return unicode_getitem(self, i); } else if (PySlice_Check(item)) { Py_ssize_t start, stop, step, slicelength, cur, i; PyObject *result; @@ -13050,9 +13039,9 @@ slicelength == PyUnicode_GET_LENGTH(self) && PyUnicode_CheckExact(self)) { Py_INCREF(self); - return (PyObject *)self; + return self; } else if (step == 1) { - return PyUnicode_Substring((PyObject*)self, + return PyUnicode_Substring(self, start, start + slicelength); } /* General case */ @@ -13195,7 +13184,7 @@ assert(count > 0); assert(PyUnicode_Check(obj)); if (count > 5) { - PyObject *repeated = unicode_repeat((PyUnicodeObject *) obj, count); + PyObject *repeated = unicode_repeat(obj, count); if (repeated == NULL) return -1; r = _PyAccu_Accumulate(acc, repeated); @@ -13224,7 +13213,7 @@ PyObject *dict = NULL; PyObject *temp = NULL; PyObject *second = NULL; - PyUnicodeObject *uformat; + PyObject *uformat; _PyAccu acc; static PyObject *plus, *minus, *blank, *zero, *percent; @@ -13243,7 +13232,7 @@ PyErr_BadInternalCall(); return NULL; } - uformat = (PyUnicodeObject*)PyUnicode_FromObject(format); + uformat = PyUnicode_FromObject(format); if (uformat == NULL || PyUnicode_READY(uformat) == -1) return NULL; if (_PyAccu_Init(&acc)) @@ -13732,7 +13721,7 @@ static PyObject * unicode_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { - PyUnicodeObject *unicode, *self; + PyObject *unicode, *self; Py_ssize_t length, char_size; int share_wstr, share_utf8; unsigned int kind; @@ -13740,14 +13729,14 @@ assert(PyType_IsSubtype(type, &PyUnicode_Type)); - unicode = (PyUnicodeObject *)unicode_new(&PyUnicode_Type, args, kwds); + unicode = unicode_new(&PyUnicode_Type, args, kwds); if (unicode == NULL) return NULL; assert(_PyUnicode_CHECK(unicode)); if (PyUnicode_READY(unicode)) return NULL; - self = (PyUnicodeObject *) type->tp_alloc(type, 0); + self = type->tp_alloc(type, 0); if (self == NULL) { Py_DECREF(unicode); return NULL; @@ -13955,7 +13944,7 @@ void PyUnicode_InternInPlace(PyObject **p) { - register PyUnicodeObject *s = (PyUnicodeObject *)(*p); + register PyObject *s = *p; PyObject *t; #ifdef Py_DEBUG assert(s != NULL); @@ -13974,7 +13963,7 @@ assert(0 && "_PyUnicode_READY_REPLACE fail in PyUnicode_InternInPlace"); return; } - s = (PyUnicodeObject *)(*p); + s = *p; if (interned == NULL) { interned = PyDict_New(); if (interned == NULL) { @@ -14035,7 +14024,7 @@ _Py_ReleaseInternedUnicodeStrings(void) { PyObject *keys; - PyUnicodeObject *s; + PyObject *s; Py_ssize_t i, n; Py_ssize_t immortal_size = 0, mortal_size = 0; @@ -14056,7 +14045,7 @@ fprintf(stderr, "releasing %" PY_FORMAT_SIZE_T "d interned strings\n", n); for (i = 0; i < n; i++) { - s = (PyUnicodeObject *) PyList_GET_ITEM(keys, i); + s = PyList_GET_ITEM(keys, i); if (PyUnicode_READY(s) == -1) { assert(0 && "could not ready string"); fprintf(stderr, "could not ready string\n"); @@ -14093,7 +14082,7 @@ typedef struct { PyObject_HEAD Py_ssize_t it_index; - PyUnicodeObject *it_seq; /* Set to NULL when iterator is exhausted */ + PyObject *it_seq; /* Set to NULL when iterator is exhausted */ } unicodeiterobject; static void @@ -14114,8 +14103,7 @@ static PyObject * unicodeiter_next(unicodeiterobject *it) { - PyUnicodeObject *seq; - PyObject *item; + PyObject *seq, *item; assert(it != NULL); seq = it->it_seq; @@ -14204,7 +14192,7 @@ return NULL; it->it_index = 0; Py_INCREF(seq); - it->it_seq = (PyUnicodeObject *)seq; + it->it_seq = seq; _PyObject_GC_TRACK(it); return (PyObject *)it; } @@ -14221,9 +14209,8 @@ #undef UNIOP_t Py_UNICODE* -PyUnicode_AsUnicodeCopy(PyObject *object) -{ - PyUnicodeObject *unicode = (PyUnicodeObject *)object; +PyUnicode_AsUnicodeCopy(PyObject *unicode) +{ Py_UNICODE *u, *copy; Py_ssize_t size; @@ -14231,7 +14218,7 @@ PyErr_BadArgument(); return NULL; } - u = PyUnicode_AsUnicode(object); + u = PyUnicode_AsUnicode(unicode); if (u == NULL) return NULL; /* Ensure we won't overflow the size. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:01:00 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:01:00 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Cast_directly_to_unsigned_c?= =?utf8?q?har=2C_instead_of_using_Py=5FCHARMASK?= Message-ID: http://hg.python.org/cpython/rev/60798098e863 changeset: 73186:60798098e863 user: Victor Stinner date: Sun Oct 23 20:06:00 2011 +0200 summary: Cast directly to unsigned char, instead of using Py_CHARMASK We don't need "& 0xff" on an unsigned char. files: Objects/unicodeobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1652,8 +1652,8 @@ /* Single characters are shared when using this constructor. Restrict to ASCII, since the input must be UTF-8. */ - if (size == 1 && Py_CHARMASK(*u) < 128) - return get_latin1_char(Py_CHARMASK(*u)); + if (size == 1 && (unsigned char)*u < 128) + return get_latin1_char((unsigned char)*u); return PyUnicode_DecodeUTF8(u, size, NULL); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:01:13 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:01:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_PyUnicode=5FInternImmor?= =?utf8?q?tal=28=29=3A_PyUnicode=5FInternInPlace=28=29_may_changes_*p?= Message-ID: http://hg.python.org/cpython/rev/d8c36928d35b changeset: 73187:d8c36928d35b user: Victor Stinner date: Sun Oct 23 20:07:00 2011 +0200 summary: Fix PyUnicode_InternImmortal(): PyUnicode_InternInPlace() may changes *p files: Objects/unicodeobject.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14001,11 +14001,9 @@ void PyUnicode_InternImmortal(PyObject **p) { - PyUnicodeObject *u = (PyUnicodeObject *)*p; - PyUnicode_InternInPlace(p); if (PyUnicode_CHECK_INTERNED(*p) != SSTATE_INTERNED_IMMORTAL) { - _PyUnicode_STATE(u).interned = SSTATE_INTERNED_IMMORTAL; + _PyUnicode_STATE(*p).interned = SSTATE_INTERNED_IMMORTAL; Py_INCREF(*p); } } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 02:01:13 2011 From: python-checkins at python.org (victor.stinner) Date: Sat, 29 Oct 2011 02:01:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FAsUnicodeCopy?= =?utf8?q?=28=29_uses_PyUnicode=5FAsUnicodeAndSize=28=29_to_get_directly_t?= =?utf8?q?he?= Message-ID: http://hg.python.org/cpython/rev/01df2267fc2d changeset: 73188:01df2267fc2d user: Victor Stinner date: Sun Oct 23 20:10:08 2011 +0200 summary: PyUnicode_AsUnicodeCopy() uses PyUnicode_AsUnicodeAndSize() to get directly the length files: Objects/unicodeobject.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14210,21 +14210,21 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode) { Py_UNICODE *u, *copy; - Py_ssize_t size; + Py_ssize_t len, size; if (!PyUnicode_Check(unicode)) { PyErr_BadArgument(); return NULL; } - u = PyUnicode_AsUnicode(unicode); + u = PyUnicode_AsUnicodeAndSize(unicode, &len); if (u == NULL) return NULL; /* Ensure we won't overflow the size. */ - if (PyUnicode_GET_SIZE(unicode) > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) { + if (len > ((PY_SSIZE_T_MAX / sizeof(Py_UNICODE)) - 1)) { PyErr_NoMemory(); return NULL; } - size = PyUnicode_GET_SIZE(unicode) + 1; /* copy the nul character */ + size = len + 1; /* copy the null character */ size *= sizeof(Py_UNICODE); copy = PyMem_Malloc(size); if (copy == NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 03:39:35 2011 From: python-checkins at python.org (florent.xicluna) Date: Sat, 29 Oct 2011 03:39:35 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogQ2xvc2VzICM3MzM0?= =?utf8?q?=3A_close_source_files_on_ElementTree=2Eparse_and_iterparse_=28p?= =?utf8?q?artial?= Message-ID: http://hg.python.org/cpython/rev/eceaa31252b3 changeset: 73189:eceaa31252b3 branch: 2.7 parent: 73181:1b4ac37c2a37 user: Florent Xicluna date: Sat Oct 29 03:38:56 2011 +0200 summary: Closes #7334: close source files on ElementTree.parse and iterparse (partial backport of issue #10093 from 3.2). files: Lib/xml/etree/ElementTree.py | 33 ++++++++++++++++-------- Misc/NEWS | 2 + Modules/_elementtree.c | 32 +++++++++++++++-------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -642,17 +642,23 @@ # @exception ParseError If the parser fails to parse the document. def parse(self, source, parser=None): + close_source = False if not hasattr(source, "read"): source = open(source, "rb") - if not parser: - parser = XMLParser(target=TreeBuilder()) - while 1: - data = source.read(65536) - if not data: - break - parser.feed(data) - self._root = parser.close() - return self._root + close_source = True + try: + if not parser: + parser = XMLParser(target=TreeBuilder()) + while 1: + data = source.read(65536) + if not data: + break + parser.feed(data) + self._root = parser.close() + return self._root + finally: + if close_source: + source.close() ## # Creates a tree iterator for the root element. The iterator loops @@ -1189,16 +1195,19 @@ # @return A (event, elem) iterator. def iterparse(source, events=None, parser=None): + close_source = False if not hasattr(source, "read"): source = open(source, "rb") + close_source = True if not parser: parser = XMLParser(target=TreeBuilder()) - return _IterParseIterator(source, events, parser) + return _IterParseIterator(source, events, parser, close_source) class _IterParseIterator(object): - def __init__(self, source, events, parser): + def __init__(self, source, events, parser, close_source=False): self._file = source + self._close_file = close_source self._events = [] self._index = 0 self.root = self._root = None @@ -1249,6 +1258,8 @@ except IndexError: if self._parser is None: self.root = self._root + if self._close_file: + self._file.close() raise StopIteration # load event buffer del self._events[:] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -71,6 +71,8 @@ Library ------- +- Issue #7334: close source files on ElementTree.parse and iterparse. + - Issue #13232: logging: Improved logging of exceptions in the presence of multiple encodings. diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -2915,19 +2915,25 @@ "class ElementTree(ET.ElementTree):\n" /* public */ " def parse(self, source, parser=None):\n" + " close_source = False\n" " if not hasattr(source, 'read'):\n" " source = open(source, 'rb')\n" - " if parser is not None:\n" - " while 1:\n" - " data = source.read(65536)\n" - " if not data:\n" - " break\n" - " parser.feed(data)\n" - " self._root = parser.close()\n" - " else:\n" - " parser = cElementTree.XMLParser()\n" - " self._root = parser._parse(source)\n" - " return self._root\n" + " close_source = False\n" + " try:\n" + " if parser is not None:\n" + " while 1:\n" + " data = source.read(65536)\n" + " if not data:\n" + " break\n" + " parser.feed(data)\n" + " self._root = parser.close()\n" + " else:\n" + " parser = cElementTree.XMLParser()\n" + " self._root = parser._parse(source)\n" + " return self._root\n" + " finally:\n" + " if close_source:\n" + " source.close()\n" "cElementTree.ElementTree = ElementTree\n" "def iter(node, tag=None):\n" /* helper */ @@ -2957,8 +2963,10 @@ "class iterparse(object):\n" " root = None\n" " def __init__(self, file, events=None):\n" + " self._close_file = False\n" " if not hasattr(file, 'read'):\n" " file = open(file, 'rb')\n" + " self._close_file = True\n" " self._file = file\n" " self._events = []\n" " self._index = 0\n" @@ -2973,6 +2981,8 @@ " except IndexError:\n" " if self._parser is None:\n" " self.root = self._root\n" + " if self._close_file:\n" + " self._file.close()\n" " raise StopIteration\n" " # load event buffer\n" " del self._events[:]\n" -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Oct 29 05:36:26 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 29 Oct 2011 05:36:26 +0200 Subject: [Python-checkins] Daily reference leaks (01df2267fc2d): sum=0 Message-ID: results for 01df2267fc2d on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogWVU85H', '-x'] From python-checkins at python.org Sat Oct 29 09:45:11 2011 From: python-checkins at python.org (ezio.melotti) Date: Sat, 29 Oct 2011 09:45:11 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzMjg5OiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/8ddd4c618b48 changeset: 73190:8ddd4c618b48 branch: 2.7 user: Ezio Melotti date: Sat Oct 29 10:40:20 2011 +0300 summary: #13289: fix typo. files: Lib/SocketServer.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/SocketServer.py b/Lib/SocketServer.py --- a/Lib/SocketServer.py +++ b/Lib/SocketServer.py @@ -82,7 +82,7 @@ data is stored externally (e.g. in the file system), a synchronous class will essentially render the service "deaf" while one request is being handled -- which may be for a very long time if a client is slow -to reqd all the data it has requested. Here a threading or forking +to read all the data it has requested. Here a threading or forking server is appropriate. In some cases, it may be appropriate to process part of a request -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 09:45:12 2011 From: python-checkins at python.org (ezio.melotti) Date: Sat, 29 Oct 2011 09:45:12 +0200 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzMjg5OiBmaXgg?= =?utf8?q?typo=2E?= Message-ID: http://hg.python.org/cpython/rev/fec8fdbccf3b changeset: 73191:fec8fdbccf3b branch: 3.2 parent: 73180:2098bd4eed21 user: Ezio Melotti date: Sat Oct 29 10:41:51 2011 +0300 summary: #13289: fix typo. files: Lib/socketserver.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/socketserver.py b/Lib/socketserver.py --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -82,7 +82,7 @@ data is stored externally (e.g. in the file system), a synchronous class will essentially render the service "deaf" while one request is being handled -- which may be for a very long time if a client is slow -to reqd all the data it has requested. Here a threading or forking +to read all the data it has requested. Here a threading or forking server is appropriate. In some cases, it may be appropriate to process part of a request -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 09:45:13 2011 From: python-checkins at python.org (ezio.melotti) Date: Sat, 29 Oct 2011 09:45:13 +0200 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313289=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/4411a59dc23c changeset: 73192:4411a59dc23c parent: 73188:01df2267fc2d parent: 73191:fec8fdbccf3b user: Ezio Melotti date: Sat Oct 29 10:44:59 2011 +0300 summary: #13289: merge with 3.2. files: Lib/socketserver.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/socketserver.py b/Lib/socketserver.py --- a/Lib/socketserver.py +++ b/Lib/socketserver.py @@ -82,7 +82,7 @@ data is stored externally (e.g. in the file system), a synchronous class will essentially render the service "deaf" while one request is being handled -- which may be for a very long time if a client is slow -to recv all the data it has requested. Here a threading or forking +to read all the data it has requested. Here a threading or forking server is appropriate. In some cases, it may be appropriate to process part of a request -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 12:42:41 2011 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 29 Oct 2011 12:42:41 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=235661=3A_Add_a_test?= =?utf8?q?_for_ECONNRESET/EPIPE_handling_to_test=5Fasyncore=2E_Patch?= Message-ID: http://hg.python.org/cpython/rev/bf1c4984d4e5 changeset: 73193:bf1c4984d4e5 user: Charles-Fran?ois Natali date: Sat Oct 29 12:45:56 2011 +0200 summary: Issue #5661: Add a test for ECONNRESET/EPIPE handling to test_asyncore. Patch by Xavier de Gaye. files: Lib/test/test_asyncore.py | 28 +++++++++++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 ++ 3 files changed, 32 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -632,6 +632,34 @@ client = TestClient(self.family, server.address) self.loop_waiting_for_flag(client) + def test_handle_close_after_conn_broken(self): + # Check that ECONNRESET/EPIPE is correctly handled (issues #5661 and + # #11265). + + data = b'\0' * 128 + + class TestClient(BaseClient): + + def handle_write(self): + self.send(data) + + def handle_close(self): + self.flag = True + self.close() + + class TestHandler(BaseTestHandler): + + def handle_read(self): + self.recv(len(data)) + self.close() + + def writable(self): + return False + + server = BaseServer(self.family, self.addr, TestHandler) + client = TestClient(self.family, server.address) + self.loop_waiting_for_flag(client) + @unittest.skipIf(sys.platform.startswith("sunos"), "OOB support is broken on Solaris") def test_handle_expt(self): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -225,6 +225,7 @@ Scott David Daniels Ben Darnell Jonathan Dasteel +Xavier de Gaye John DeGood Ned Deily Vincent Delft diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1500,6 +1500,9 @@ Tests ----- +- Issue #5661: Add a test for ECONNRESET/EPIPE handling to test_asyncore. Patch + by Xavier de Gaye. + - Issue #13218: Fix test_ssl failures on Debian/Ubuntu. - Re-enable lib2to3's test_parser.py tests, though with an expected failure -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Oct 29 14:26:33 2011 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 29 Oct 2011 14:26:33 +0200 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=235661=3A_on_EPIPE/E?= =?utf8?q?CONNRESET=2C_OS_X_returns_the_FD_with_the_POLLPRI_flag=2E=2E=2E?= Message-ID: http://hg.python.org/cpython/rev/507dfb0ceb3b changeset: 73194:507dfb0ceb3b user: Charles-Fran?ois Natali date: Sat Oct 29 14:29:39 2011 +0200 summary: Issue #5661: on EPIPE/ECONNRESET, OS X returns the FD with the POLLPRI flag... files: Lib/test/test_asyncore.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -647,6 +647,10 @@ self.flag = True self.close() + def handle_expt(self): + self.flag = True + self.close() + class TestHandler(BaseTestHandler): def handle_read(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 00:05:41 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 30 Oct 2011 00:05:41 +0200 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_3155_-_Qualified_name_for_?= =?utf8?q?classes_and_functions?= Message-ID: http://hg.python.org/peps/rev/460e0a1a004f changeset: 3972:460e0a1a004f user: Antoine Pitrou date: Sun Oct 30 00:01:30 2011 +0200 summary: PEP 3155 - Qualified name for classes and functions files: pep-3155.txt | 132 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 132 insertions(+), 0 deletions(-) diff --git a/pep-3155.txt b/pep-3155.txt new file mode 100644 --- /dev/null +++ b/pep-3155.txt @@ -0,0 +1,132 @@ +PEP: 3155 +Title: Qualified name for classes and functions +Version: $Revision$ +Last-Modified: $Date$ +Author: Antoine Pitrou +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 2011-10-29 +Python-Version: 3.3 +Post-History: +Resolution: TBD + + +Rationale +========= + +Python's introspection facilities have long had poor support for nested +classes. Given a class object, it is impossible to know whether it was +defined inside another class or at module top-level; and, if the former, +it is also impossible to know in which class it was defined. While +use of nested classes is often considered poor style, the only reason +for them to have second class introspection support is a lousy pun. + +Python 3 adds insult to injury by dropping what was formerly known as +unbound methods. In Python 2, given the following definition:: + + class C: + def f(): + pass + +you can then walk up from the ``C.f`` object to its defining class:: + + >>> C.f.im_class + + +This possibility is gone in Python 3:: + + >>> C.f.im_class + Traceback (most recent call last): + File "", line 1, in + AttributeError: 'function' object has no attribute 'im_class' + >>> dir(C.f) + ['__annotations__', '__call__', '__class__', '__closure__', '__code__', + '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', + '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', + '__globals__', '__gt__', '__hash__', '__init__', '__kwdefaults__', + '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', + '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', + '__str__', '__subclasshook__'] + +This limits again the introspection capabilities available to the user. +It can produce actual issues when porting software to Python 3, for example +Twisted Core where the issue of introspecting method objects came up +several times. It also limits pickling support [1]_. + + +Proposal +======== + +This PEP proposes the addition of a ``__qname__`` attribute to functions +and classes. For top-level functions and classes, the ``__qname__`` +attribute is equal to the ``__name__`` attribute. For nested classed, +methods, and nested functions, the ``__qname__`` attribute contains a +dotted path leading to the object from the module top-level. + +The repr() and str() of functions and classes is modified to use ``__qname__`` +rather than ``__name__``. + +Example with nested classes +--------------------------- + +>>> class C: +... def f(): pass +... class D: +... def g(): pass +... +>>> C.__qname__ +'C' +>>> C.f.__qname__ +'C.f' +>>> C.D.__qname__ +'C.D' +>>> C.D.g.__qname__ +'C.D.g' + +Example with nested functions +----------------------------- + +>>> def f(): +... def g(): pass +... return g +... +>>> f.__qname__ +'f' +>>> f().__qname__ +'f.g' + + +Limitations +=========== + +With nested functions (and classes defined inside functions), the dotted +path will not be walkable programmatically as a function's namespace is not +available from the outside. It will still be more helpful to the human +reader than the bare ``__name__``. + +As the ``__name__`` attribute, the ``__qname__`` attribute is computed +statically and it will not automatically follow rebinding. + + +References +========== + +.. [1] "pickle should support methods": + http://bugs.python.org/issue9276 + +Copyright +========= + +This document has been placed in the public domain. + + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sun Oct 30 05:36:53 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 30 Oct 2011 05:36:53 +0100 Subject: [Python-checkins] Daily reference leaks (507dfb0ceb3b): sum=0 Message-ID: results for 507dfb0ceb3b on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogKv9GuE', '-x'] From python-checkins at python.org Sun Oct 30 06:27:41 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 30 Oct 2011 06:27:41 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_PEP_index_generation_by_ma?= =?utf8?q?king_Greg=27s_email_address_consistent?= Message-ID: http://hg.python.org/peps/rev/c55ea331d5eb changeset: 3973:c55ea331d5eb user: Nick Coghlan date: Sun Oct 30 15:27:21 2011 +1000 summary: Fix PEP index generation by making Greg's email address consistent files: pep-0335.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0335.txt b/pep-0335.txt --- a/pep-0335.txt +++ b/pep-0335.txt @@ -2,7 +2,7 @@ Title: Overloadable Boolean Operators Version: $Revision$ Last-Modified: $Date$ -Author: Gregory Ewing +Author: Gregory Ewing Status: Draft Type: Standards Track Content-Type: text/x-rst -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 07:00:20 2011 From: python-checkins at python.org (nick.coghlan) Date: Sun, 30 Oct 2011 07:00:20 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_the_module_aliasing_pro?= =?utf8?q?posal_based_on_Antoine=27s_new_qualified_names_PEP?= Message-ID: http://hg.python.org/peps/rev/dc569d79bfba changeset: 3974:dc569d79bfba user: Nick Coghlan date: Sun Oct 30 16:00:10 2011 +1000 summary: Update the module aliasing proposal based on Antoine's new qualified names PEP files: pep-0395.txt | 81 ++++++++++++++++++++++++--------------- 1 files changed, 50 insertions(+), 31 deletions(-) diff --git a/pep-0395.txt b/pep-0395.txt --- a/pep-0395.txt +++ b/pep-0395.txt @@ -18,8 +18,7 @@ the unwary when dealing with Python's import system, the pickle module and introspection interfaces. - +It builds on the "Qualified Name" concept defined in PEP 3155. What's in a ``__name__``? @@ -76,7 +75,7 @@ interpreter actually has sufficient information available on the filesystem to make it work properly. - @@ -87,9 +86,10 @@ objects based on the ``__name__`` of the containing module. So objects defined in ``__main__`` are pickled that way, and won't be unpickled correctly by another python instance that only imported that module instead -of running it directly. Thus the advice from many Python veterans to do as -little as possible in the ``__main__`` module in any application that -involves any form of object serialisation and persistence. +of running it directly. This behaviour is the underlying reason for the +advice from many Python veterans to do as little as possible in the +``__main__`` module in any application that involves any form of object +serialisation and persistence. Similarly, when creating a pseudo-module\*, pickles rely on the name of the module where a class is actually defined, rather than the officially @@ -104,8 +104,8 @@ packages are documented as if they were single modules, but are in fact internally implemented as a package. This is *supposed* to be an implementation detail that users and other implementations don't need to worry -about, but, thanks to ``pickle``, the details are exposed and effectively -become part of the public API. +about, but, thanks to ``pickle`` (and serialisation in general), the details +are exposed and effectively become part of the public API. Where's the source? @@ -136,6 +136,10 @@ directories, are likely to make multiprocessing on Windows do the wrong thing (either quietly or noisily) when spawning a new process. +While this issue currently only affects Windows directly, it also impacts +any proposals to provide Windows-style "clean process" invocation via the +multiprocessing module on other platforms. + Proposed Changes ================ @@ -190,42 +194,57 @@ name (as calculated based on the original filename and the directories traversed while looking for a directory without an ``__init__`` file). +The two current PEPs for namespace packages (PEP 382 and PEP 402) would both +affect this part of the proposal. For PEP 382 (with its current suggestion of +"*.pyp" package directories, this check would instead just walk up the +supplied path, looking for the first non-package directory (this would not +require any filesystem stat calls). Since PEP 402 deliberately omits explicit +directory markers, it would need an alternative approach, based on checking +the supplied path against the contents of ``sys.path``. In both cases, the +direct execution behaviour can still be corrected. + Fixing pickling without breaking introspection ---------------------------------------------- -To fix this problem, it is proposed to add two optional module level -attributes: ``__source_name__`` and ``__pickle_name__``. +To fix this problem, it is proposed to add a new optional module level +attribute: ``__qname__``. This abbreviation of "qualified name" is taken +from PEP 3155, where it is used to store the naming path to a nested class +or function definition relative to the top level module. By default, +``__qname__`` will be the same as ``__name__``, which covers the typical +case where there is a one-to-one correspondence between the documented API +and the actual module implementation. -When setting the ``__module__`` attribute on a function or class, the -interpreter will be updated to use ``__source_name__`` if defined, falling -back to ``__name__`` otherwise. +Functions and classes will gain a corresponding ``__qmodule__`` attribute +that refers to their module's ``__qname__``. -In the main module, ``__source_name__`` will automatically be set to the main +Pseudo-modules that adjust ``__name__`` to point to the public namespace will +leave ``__qname__`` untouched, so the implementation location remains readily +accessible for introspection. + +In the main module, ``__qname__`` will automatically be set to the main module's "real" name (as described above under the fix to prevent duplicate -imports of the main module) by the interpreter. This will fix both pickling -and introspection for the main module. +imports of the main module) by the interpreter. -It is also proposed that the pickling mechanism for classes and functions be -updated to use an optional ``__pickle_module__`` attribute when deciding how -to pickle these objects (falling back to the existing ``__module__`` -attribute if the optional attribute is not defined). When a class or function -is defined, this optional attribute will be defined if ``__pickle_name__`` is -defined at the module level, and left out otherwise. This will allow -pseudo-modules to fix pickling without breaking introspection. +At the interactive prompt, both ``__name__`` and ``__qname__`` will be set +to ``"__main__"``. -Other serialisation schemes could add support for this new attribute -relatively easily by replacing ``x.__module__`` with ``getattr(x, -"__pickle_module__", x.__module__)``. +These changes on their own will fix most pickling and serialisation problems, +but one additional change is needed to fix the problem with serialisation of +items in ``__main__``: as a slight adjustment to the definition process for +functions and classes, in the ``__name__ == "__main__"`` case, the module +``__qname__`` attribute will be used to set ``__module__``. -``pydoc`` and ``inspect`` would also be updated to make appropriate use of -the new attributes for any cases not already covered by the above rules for -setting ``__module__``. +``pydoc`` and ``inspect`` would also be updated appropriately to: +- use ``__qname__`` instead of ``__name__`` and ``__qmodule__`` instead of + ``__module__``where appropriate (e.g. ``inspect.getsource()`` would prefer + the qualified variants) +- report both the public names and the qualified names for affected objects Fixing multiprocessing on Windows --------------------------------- -With ``__source_name__`` now available to tell ``multiprocessing`` the real +With ``__qname__`` now available to tell ``multiprocessing`` the real name of the main module, it should be able to simply include it in the serialised information passed to the child process, eliminating the need for dubious reverse engineering of the ``__file__`` attribute. @@ -234,7 +253,7 @@ Reference Implementation ======================== -None as yet. I'll probably be sprinting on this after Pycon. +None as yet. References -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 08:38:04 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 30 Oct 2011 08:38:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_a_button_to?= =?utf8?q?_the_code_examples_in_the_doc_to_show/hide_the_prompts_and?= Message-ID: http://hg.python.org/cpython/rev/18bbfed9aafa changeset: 73195:18bbfed9aafa branch: 2.7 parent: 73190:8ddd4c618b48 user: Ezio Melotti date: Sun Oct 30 09:19:33 2011 +0200 summary: Add a button to the code examples in the doc to show/hide the prompts and output. files: Doc/tools/sphinxext/layout.html | 1 + Doc/tools/sphinxext/static/copybutton.js | 56 ++++++++++++ 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,6 +6,7 @@ {% endblock %} {% block extrahead %} + {{ super() }} {% endblock %} {% block footer %} diff --git a/Doc/tools/sphinxext/static/copybutton.js b/Doc/tools/sphinxext/static/copybutton.js new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/static/copybutton.js @@ -0,0 +1,56 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and ouput'; + var show_text = 'Show the prompts and ouput'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').toggle( + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + }, + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + }); +}); + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 08:38:05 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 30 Oct 2011 08:38:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_a_button_to?= =?utf8?q?_the_code_examples_in_the_doc_to_show/hide_the_prompts_and?= Message-ID: http://hg.python.org/cpython/rev/c3bcd625dcd4 changeset: 73196:c3bcd625dcd4 branch: 3.2 parent: 73191:fec8fdbccf3b user: Ezio Melotti date: Sun Oct 30 09:20:19 2011 +0200 summary: Add a button to the code examples in the doc to show/hide the prompts and output. files: Doc/tools/sphinxext/layout.html | 1 + Doc/tools/sphinxext/static/copybutton.js | 56 ++++++++++++ 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,6 +6,7 @@ {% endblock %} {% block extrahead %} + {{ super() }} {% endblock %} {% block footer %} diff --git a/Doc/tools/sphinxext/static/copybutton.js b/Doc/tools/sphinxext/static/copybutton.js new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/static/copybutton.js @@ -0,0 +1,56 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and ouput'; + var show_text = 'Show the prompts and ouput'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').toggle( + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + }, + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + }); +}); + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 08:38:05 2011 From: python-checkins at python.org (ezio.melotti) Date: Sun, 30 Oct 2011 08:38:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_the_button_to_show/hide_the_prompts_and_output_from_3?= =?utf8?b?LjIu?= Message-ID: http://hg.python.org/cpython/rev/0dd008e0e537 changeset: 73197:0dd008e0e537 parent: 73194:507dfb0ceb3b parent: 73196:c3bcd625dcd4 user: Ezio Melotti date: Sun Oct 30 09:37:46 2011 +0200 summary: Merge the button to show/hide the prompts and output from 3.2. files: Doc/tools/sphinxext/layout.html | 1 + Doc/tools/sphinxext/static/copybutton.js | 56 ++++++++++++ 2 files changed, 57 insertions(+), 0 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,6 +6,7 @@ {% endblock %} {% block extrahead %} + {{ super() }} {% endblock %} {% block footer %} diff --git a/Doc/tools/sphinxext/static/copybutton.js b/Doc/tools/sphinxext/static/copybutton.js new file mode 100644 --- /dev/null +++ b/Doc/tools/sphinxext/static/copybutton.js @@ -0,0 +1,56 @@ +$(document).ready(function() { + /* Add a [>>>] button on the top-right corner of code samples to hide + * the >>> and ... prompts and the output and thus make the code + * copyable. */ + var div = $('.highlight-python .highlight,' + + '.highlight-python3 .highlight') + var pre = div.find('pre'); + + // get the styles from the current theme + pre.parent().parent().css('position', 'relative'); + var hide_text = 'Hide the prompts and ouput'; + var show_text = 'Show the prompts and ouput'; + var border_width = pre.css('border-top-width'); + var border_style = pre.css('border-top-style'); + var border_color = pre.css('border-top-color'); + var button_styles = { + 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0', + 'border-color': border_color, 'border-style': border_style, + 'border-width': border_width, 'color': border_color, 'text-size': '75%', + 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em' + } + + // create and add the button to all the code blocks that contain >>> + div.each(function(index) { + var jthis = $(this); + if (jthis.find('.gp').length > 0) { + var button = $('>>>'); + button.css(button_styles) + button.attr('title', hide_text); + jthis.prepend(button); + } + // tracebacks (.gt) contain bare text elements that need to be + // wrapped in a span to work with .nextUntil() (see later) + jthis.find('pre:has(.gt)').contents().filter(function() { + return ((this.nodeType == 3) && (this.data.trim().length > 0)); + }).wrap(''); + }); + + // define the behavior of the button when it's clicked + $('.copybutton').toggle( + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').hide(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden'); + button.css('text-decoration', 'line-through'); + button.attr('title', show_text); + }, + function() { + var button = $(this); + button.parent().find('.go, .gp, .gt').show(); + button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible'); + button.css('text-decoration', 'none'); + button.attr('title', hide_text); + }); +}); + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 09:07:13 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 30 Oct 2011 09:07:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Port_PyImport=5FReloadModul?= =?utf8?q?e_to_Unicode_API=2E?= Message-ID: http://hg.python.org/cpython/rev/a938d0258abe changeset: 73198:a938d0258abe user: Martin v. L?wis date: Sun Oct 30 09:07:07 2011 +0100 summary: Port PyImport_ReloadModule to Unicode API. files: Python/import.c | 60 ++++++++++++++++-------------------- 1 files changed, 26 insertions(+), 34 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -3359,8 +3359,8 @@ PyObject *modules_reloading = interp->modules_reloading; PyObject *modules = PyImport_GetModuleDict(); PyObject *path_list = NULL, *loader = NULL, *existing_m = NULL; - PyObject *nameobj, *bufobj, *subnameobj; - Py_UCS4 *name = NULL, *subname; + PyObject *name, *bufobj, *subname; + Py_ssize_t subname_start; struct filedescr *fdp; FILE *fp = NULL; PyObject *newm = NULL; @@ -3376,45 +3376,39 @@ "reload() argument must be module"); return NULL; } - nameobj = PyModule_GetNameObject(m); - if (nameobj == NULL || PyUnicode_READY(nameobj) == -1) + name = PyModule_GetNameObject(m); + if (name == NULL || PyUnicode_READY(name) == -1) return NULL; - if (m != PyDict_GetItem(modules, nameobj)) { + if (m != PyDict_GetItem(modules, name)) { PyErr_Format(PyExc_ImportError, "reload(): module %R not in sys.modules", - nameobj); - Py_DECREF(nameobj); + name); + Py_DECREF(name); return NULL; } - existing_m = PyDict_GetItem(modules_reloading, nameobj); + existing_m = PyDict_GetItem(modules_reloading, name); if (existing_m != NULL) { /* Due to a recursive reload, this module is already being reloaded. */ - Py_DECREF(nameobj); + Py_DECREF(name); Py_INCREF(existing_m); return existing_m; } - if (PyDict_SetItem(modules_reloading, nameobj, m) < 0) { - Py_DECREF(nameobj); + if (PyDict_SetItem(modules_reloading, name, m) < 0) { + Py_DECREF(name); return NULL; } - name = PyUnicode_AsUCS4Copy(nameobj); - if (!name) { - Py_DECREF(nameobj); - return NULL; - } - subname = Py_UCS4_strrchr(name, '.'); - if (subname == NULL) { - Py_INCREF(nameobj); - subnameobj = nameobj; + subname_start = PyUnicode_FindChar(name, '.', 0, + PyUnicode_GET_LENGTH(name), -1); + if (subname_start == -1) { + Py_INCREF(name); + subname = name; } else { PyObject *parentname, *parent; Py_ssize_t len; - len = subname - name; - parentname = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - name, len); + parentname = PyUnicode_Substring(name, 0, subname_start); if (parentname == NULL) { goto error; } @@ -3430,16 +3424,15 @@ path_list = _PyObject_GetAttrId(parent, &PyId___path__); if (path_list == NULL) PyErr_Clear(); - subname++; - len = PyUnicode_GET_LENGTH(nameobj) - (len + 1); - subnameobj = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - subname, len); + subname_start++; + len = PyUnicode_GET_LENGTH(name) - (subname_start + 1); + subname = PyUnicode_Substring(name, subname_start, len); } - if (subnameobj == NULL) + if (subname == NULL) goto error; - fdp = find_module(nameobj, subnameobj, path_list, + fdp = find_module(name, subname, path_list, &bufobj, &fp, &loader); - Py_DECREF(subnameobj); + Py_DECREF(subname); Py_XDECREF(path_list); if (fdp == NULL) { @@ -3447,7 +3440,7 @@ goto error; } - newm = load_module(nameobj, fp, bufobj, fdp->type, loader); + newm = load_module(name, fp, bufobj, fdp->type, loader); Py_XDECREF(bufobj); Py_XDECREF(loader); @@ -3459,13 +3452,12 @@ * going to return NULL in this case regardless of whether * replacing name succeeds, so the return value is ignored. */ - PyDict_SetItem(modules, nameobj, m); + PyDict_SetItem(modules, name, m); } error: imp_modules_reloading_clear(); - Py_DECREF(nameobj); - PyMem_Free(name); + Py_DECREF(name); return newm; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 10:55:23 2011 From: python-checkins at python.org (vinay.sajip) Date: Sun, 30 Oct 2011 10:55:23 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Added_PEP_404=3A_Python_Virtua?= =?utf8?q?l_Environments=2E?= Message-ID: http://hg.python.org/peps/rev/a55e028aceb7 changeset: 3975:a55e028aceb7 user: Vinay Sajip date: Sun Oct 30 09:55:07 2011 +0000 summary: Added PEP 404: Python Virtual Environments. files: pep-0404.txt | 661 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 661 insertions(+), 0 deletions(-) diff --git a/pep-0404.txt b/pep-0404.txt new file mode 100644 --- /dev/null +++ b/pep-0404.txt @@ -0,0 +1,661 @@ +PEP: 404 +Title: Python Virtual Environments +Version: $Revision$ +Last-Modified: $Date$ +Author: Carl Meyer +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 13-Jun-2011 +Python-Version: 3.3 +Post-History: 24-Oct-2011, 28-Oct-2011 + + +Abstract +======== + +This PEP proposes to add to Python a mechanism for lightweight +"virtual environments" with their own site directories, optionally +isolated from system site directories. Each virtual environment has +its own Python binary (allowing creation of environments with various +Python versions) and can have its own independent set of installed +Python packages in its site directories, but shares the standard +library with the base installed Python. + + +Motivation +========== + +The utility of Python virtual environments has already been well +established by the popularity of existing third-party +virtual-environment tools, primarily Ian Bicking's `virtualenv`_. +Virtual environments are already widely used for dependency management +and isolation, ease of installing and using Python packages without +system-administrator access, and automated testing of Python software +across multiple Python versions, among other uses. + +Existing virtual environment tools suffer from lack of support from +the behavior of Python itself. Tools such as `rvirtualenv`_, which do +not copy the Python binary into the virtual environment, cannot +provide reliable isolation from system site directories. Virtualenv, +which does copy the Python binary, is forced to duplicate much of +Python's ``site`` module and manually symlink/copy an ever-changing +set of standard-library modules into the virtual environment in order +to perform a delicate boot-strapping dance at every +startup. (Virtualenv copies the binary because symlinking it does not +provide isolation, as Python dereferences a symlinked executable +before searching for `sys.prefix`.) + +The ``PYTHONHOME`` environment variable, Python's only existing +built-in solution for virtual environments, requires +copying/symlinking the entire standard library into every +environment. Copying the whole standard library is not a lightweight +solution, and cross-platform support for symlinks remains inconsistent +(even on Windows platforms that do support them, creating them often +requires administrator privileges). + +A virtual environment mechanism integrated with Python and drawing on +years of experience with existing third-party tools can be lower +maintenance, more reliable, and more easily available to all Python +users. + +.. _virtualenv: http://www.virtualenv.org + +.. _rvirtualenv: https://github.com/kvbik/rvirtualenv + + +Specification +============= + +When the Python binary is executed, it attempts to determine its +prefix (which it stores in ``sys.prefix``), which is then used to find +the standard library and other key files, and by the ``site`` module +to determine the location of the site-package directories. Currently +the prefix is found (assuming ``PYTHONHOME`` is not set) by first +walking up the filesystem tree looking for a marker file (``os.py``) +that signifies the presence of the standard library, and if none is +found, falling back to the build-time prefix hardcoded in the binary. + +This PEP proposes to add a new first step to this search. If a +``pyvenv.cfg`` file is found either adjacent to the Python executable, +or one directory above it, this file is scanned for lines of the form +``key = value``. If a ``home`` key is found, this signifies that the +Python binary belongs to a virtual environment, and the value of the +``home`` key is the directory containing the Python executable used to +create this virtual environment. + +In this case, prefix-finding continues as normal using the value of +the ``home`` key as the effective Python binary location, which +results in ``sys.prefix`` being set to the system installation prefix, +while ``sys.site_prefix`` is set to the directory containing +``pyvenv.cfg``. + +(If ``pyvenv.cfg`` is not found or does not contain the ``home`` key, +prefix-finding continues normally, and ``sys.site_prefix`` will be +equal to ``sys.prefix``.) + +The ``site`` and ``sysconfig`` standard-library modules are modified +such that site-package directories ("purelib" and "platlib", in +``sysconfig`` terms) are found relative to ``sys.site_prefix``, while +other directories (the standard library, include files) are still +found relative to ``sys.prefix``. + +(Also, ``sys.site_exec_prefix`` is added, and handled similarly with +regard to ``sys.exec_prefix``.) + +Thus, a Python virtual environment in its simplest form would consist +of nothing more than a copy or symlink of the Python binary +accompanied by a ``pyvenv.cfg`` file and a site-packages +directory. + + +Isolation from system site-packages +----------------------------------- + +By default, a virtual environment is entirely isolated from the +system-level site-packages directories. + +If the ``pyvenv.cfg`` file also contains a key +``include-system-site-packages`` with a value of ``true`` (not case +sensitive), the ``site`` module will also add the system site +directories to ``sys.path`` after the virtual environment site +directories. Thus system-installed packages will still be importable, +but a package of the same name installed in the virtual environment +will take precedence. + +:pep:`370` user-level site-packages are considered part of the system +site-packages for venv purposes: they are not available from an +isolated venv, but are available from an +``include-system-site-packages = true`` venv. + + +Creating virtual environments +----------------------------- + +This PEP also proposes adding a new ``venv`` module to the standard +library which implements the creation of virtual environments. This +module can be executed using the ``-m`` flag:: + + python3 -m venv /path/to/new/virtual/environment + +A ``pyvenv`` installed script is also provided to make this more +convenient:: + + pyvenv /path/to/new/virtual/environment + +Running this command creates the target directory (creating any parent +directories that don't exist already) and places a ``pyvenv.cfg`` file +in it with a ``home`` key pointing to the Python installation the +command was run from. It also creates a ``bin/`` (or ``Scripts`` on +Windows) subdirectory containing a copy (or symlink) of the +``python3`` executable, and the ``pysetup3`` script from the +``packaging`` standard library module (to facilitate easy installation +of packages from PyPI into the new virtualenv). And it creates an +(initially empty) ``lib/pythonX.Y/site-packages`` (or +``Lib\site-packages`` on Windows) subdirectory. + +If the target directory already exists an error will be raised, unless +the ``--clear`` option was provided, in which case the target +directory will be deleted and virtual environment creation will +proceed as usual. + +The created ``pyvenv.cfg`` file also includes the +``include-system-site-packages`` key, set to ``true`` if ``venv`` is +run with the ``--system-site-packages`` option, ``false`` by default. + +Multiple paths can be given to ``pyvenv``, in which case an identical +virtualenv will be created, according to the given options, at each +provided path. + +The ``venv`` module also adds a ``pysetup3`` script into each venv. +In order to allow ``pysetup`` and other Python package managers to +install packages into the virtual environment the same way they would +install into a normal Python installation, and avoid special-casing +virtual environments in ``sysconfig`` beyond using ``sys.site_prefix`` +in place of ``sys.prefix``, the internal virtual environment layout +mimics the layout of the Python installation itself on each +platform. So a typical virtual environment layout on a POSIX system +would be:: + + pyvenv.cfg + bin/python3 + bin/python + bin/pysetup3 + lib/python3.3/site-packages/ + +While on a Windows system:: + + pyvenv.cfg + Scripts/python.exe + Scripts/python3.dll + Scripts/pysetup3.exe + Scripts/pysetup3-script.py + ... other DLLs and pyds... + Lib/site-packages/ + +Third-party packages installed into the virtual environment will have +their Python modules placed in the ``site-packages`` directory, and +their executables placed in ``bin/`` or ``Scripts\``. + +.. note:: + + On a normal Windows system-level installation, the Python binary + itself wouldn't go inside the "Scripts/" subdirectory, as it does + in the default venv layout. This is useful in a virtual + environment so that a user only has to add a single directory to + their shell PATH in order to effectively "activate" the virtual + environment. + +.. note:: + + On Windows, it is necessary to also copy or symlink DLLs and pyd + files from compiled stdlib modules into the env, because if the + venv is created from a non-system-wide Python installation, + Windows won't be able to find the Python installation's copies of + those files when Python is run from the venv. + + +Copies versus symlinks +---------------------- + +The technique in this PEP works equally well in general with a copied +or symlinked Python binary (and other needed DLLs on Windows). Some +users prefer a copied binary (for greater isolation from system +changes) and some prefer a symlinked one (so that e.g. security +updates automatically propagate to virtual environments). + +There are some cross-platform difficulties with symlinks: + +* Not all Windows versions support symlinks, and even on those that + do, creating them often requires administrator privileges. + +* On OSX framework builds of Python, sys.executable is just a stub + that executes the real Python binary. Symlinking this stub does not + work with the implementation in this PEP; it must be + copied. (Fortunately the stub is also small, so copying it is not an + issue). + +Because of these issues, this PEP proposes to copy the Python binary +by default, to maintain cross-platform consistency in the default +behavior. + +The ``pyvenv`` script accepts a ``--symlink`` option. If this option +is provided, the script will attempt to symlink instead of copy. If a +symlink fails (e.g. because they are not supported by the platform, or +additional privileges are needed), the script will warn the user and +fall back to a copy. + +On OSX framework builds, where a symlink of the executable would +succeed but create a non-functional virtual environment, the script +will fail with an error message that symlinking is not supported on +OSX framework builds. + + +API +--- + +The high-level method described above makes use of a simple API which +provides mechanisms for third-party virtual environment creators to +customize environment creation according to their needs. + +The ``venv`` module contains an ``EnvBuilder`` class which accepts the +following keyword arguments on instantiation:: + + * ``system_site_packages`` - A Boolean value indicating that the + system Python site-packages should be available to the + environment (defaults to ``False``). + + * ``clear`` - A Boolean value which, if True, will delete any + existing target directory instead of raising an exception + (defaults to ``False``). + + * ``use_symlinks`` - A Boolean value indicating whether to attempt + to symlink the Python binary (and any necessary DLLs or other + binaries, e.g. ``pythonw.exe``), rather than copying. Defaults to + ``False``. + +The returned env-builder is an object with a ``create`` method, which +takes as required argument the path (absolute or relative to the +current directory) of the target directory which is to contain the +virtual environment. The ``create`` method either creates the +environment in the specified directory, or raises an appropriate +exception. + +Creators of third-party virtual environment tools are free to use the +provided ``EnvBuilder`` class as a base class. + +The ``venv`` module also provides a module-level function as a +convenience:: + + def create(env_dir, + system_site_packages=False, clear=False, use_symlinks=False): + builder = EnvBuilder( + system_site_packages=system_site_packages, + clear=clear, + use_symlinks=use_symlinks) + builder.create(env_dir) + +The ``create`` method of the ``EnvBuilder`` class illustrates the +hooks available for customization: + + def create(self, env_dir): + """ + Create a virtualized Python environment in a directory. + + :param env_dir: The target directory to create an environment in. + + """ + env_dir = os.path.abspath(env_dir) + context = self.create_directories(env_dir) + self.create_configuration(context) + self.setup_python(context) + self.post_setup(context) + +Each of the methods ``create_directories``, ``create_configuration``, +``setup_python``, and ``post_setup`` can be +overridden. The functions of these methods are:: + + * ``create_directories`` - creates the environment directory and + all necessary directories, and returns a context object. This is + just a holder for attributes (such as paths), for use by the + other methods. + + * ``create_configuration`` - creates the ``pyvenv.cfg`` + configuration file in the environment. + + * ``setup_python`` - creates a copy of the Python executable (and, + under Windows, DLLs) in the environment. + + * ``post_setup`` - A (no-op by default) hook method which can be + overridden in third party implementations to pre-install packages + or install scripts in the virtual environment. + +In addition, ``EnvBuilder`` provides a utility method that can be +called from ``post_setup`` in subclasses to assist in installing +scripts into the virtual environment. The method ``install_scripts`` +accepts as arguments the ``context`` object (see above) and a +bytestring. The bytestring should be a base64-encoded zip file +containing directories "common", "posix", "nt", each containing +scripts destined for the bin directory in the environment. The +contents of "common" and the directory corresponding to ``os.name`` +are copied after doing some text replacement of placeholders: + + * ``__VENV_DIR__`` is replaced with absolute path of the + environment directory. + + * ``__VENV_NAME__`` is replaced with the environment + name (final path segment of environment directory). + + * ``__VENV_BIN_NAME__`` is replaced with the name of the bin + directory (either ``bin`` or ``Scripts``). + + * ``__VENV_PYTHON__`` is replaced with the absolute path of the + environment's executable. + + +The ``DistributeEnvBuilder`` subclass in the reference implementation +illustrates how the customization hook can be used in practice to +pre-install Distribute and shell activation scripts into the virtual +environment. It's not envisaged that ``DistributeEnvBuilder`` will be +actually added to Python core, but it makes the reference +implementation more immediately useful for testing and exploratory +purposes. + +The "shell activation scripts" provided by ``DistributeEnvBuilder`` +simply add the virtual environment's ``bin/`` (or ``Scripts\``) +directory to the front of the user's shell PATH. This is not strictly +necessary for use of a virtual environment (as an explicit path to the +venv's python binary or scripts can just as well be used), but it is +convenient. + +This PEP does not propose that the ``venv`` module in core Python will +add such activation scripts by default, as they are +shell-specific. Adding activation scripts for the wide variety of +possible shells is an added maintenance burden, and is left to +third-party extension tools. + +No doubt the process of PEP review will show up any customization +requirements which have not yet been considered. + + +Backwards Compatibility +======================= + +Splitting the meanings of ``sys.prefix`` +---------------------------------------- + +Any virtual environment tool along these lines (which attempts to +isolate site-packages, while still making use of the base Python's +standard library with no need for it to be symlinked into the virtual +environment) is proposing a split between two different meanings +(among others) that are currently both wrapped up in ``sys.prefix``: +the answers to the questions "Where is the standard library?" and +"Where is the site-packages location where third-party modules should +be installed?" + +This split could be handled by introducing a new ``sys`` attribute for +either the former prefix or the latter prefix. Either option +potentially introduces some backwards-incompatibility with software +written to assume the other meaning for ``sys.prefix``. (Such software +should preferably be using the APIs in the ``site`` and ``sysconfig`` +modules to answer these questions rather than using ``sys.prefix`` +directly, in which case there is no backwards-compatibility issue, but +in practice ``sys.prefix`` is sometimes used.) + +The `documentation`__ for ``sys.prefix`` describes it as "A string +giving the site-specific directory prefix where the platform +independent Python files are installed," and specifically mentions the +standard library and header files as found under ``sys.prefix``. It +does not mention ``site-packages``. + +__ http://docs.python.org/dev/library/sys.html#sys.prefix + +This PEP currently proposes to leave ``sys.prefix`` pointing to the +base system installation (which is where the standard library and +header files are found), and introduce a new value in ``sys`` +(``sys.site_prefix``) to point to the prefix for +``site-packages``. This maintains the documented semantics of +``sys.prefix``, but risks breaking isolation if third-party code uses +``sys.prefix`` rather than ``sys.site_prefix`` or the appropriate +``site`` API to find site-packages directories. + +The most notable case is probably `setuptools`_ and its fork +`distribute`_, which mostly use ``distutils``/``sysconfig`` APIs, but +do use ``sys.prefix`` directly to build up a list of site directories +for pre-flight checking where ``pth`` files can usefully be placed. +It would be trivial to modify these tools (currently only +`distribute`_ is Python 3 compatible) to check ``sys.site_prefix`` and +fall back to ``sys.prefix`` if it doesn't exist (for earlier versions +of Python). If Distribute is modified in this way and released before +Python 3.3 is released with the ``venv`` module, there would be no +likely reason for an older version of Distribute to ever be installed +in a virtual environment. + +In terms of other third-party usage, a `Google Code Search`_ turns up +what appears to be a roughly even mix of usage between packages using +``sys.prefix`` to build up a site-packages path and packages using it +to e.g. eliminate the standard-library from code-execution +tracing. Either choice that's made here will require one or the other +of these uses to be updated. + +.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools +.. _distribute: http://packages.python.org/distribute/ +.. _Google Code Search: http://www.google.com/codesearch#search/&q=sys\.prefix&p=1&type=cs + + +Open Questions +============== + +Naming of the new ``sys`` prefix attributes +------------------------------------------- + +The name ``sys.site_prefix`` was chosen with the following +considerations in mind: + +* Inasmuch as "site" has a meaning in Python, it means a combination + of Python version, standard library, and specific set of + site-packages. This is, fundamentally, what a venv is (although it + shares the standard library with its "base" site). + +* It is the Python ``site`` module which implements adding + site-packages directories to ``sys.path``, so ``sys.site_prefix`` is + a prefix used (and set) primarily by the ``site`` module. + +A concern has been raised that the term ``site`` in Python is already +overloaded and of unclear meaning, and this usage will increase the +overload. + +One proposed alternative is ``sys.venv_prefix``, which has the +advantage of being clearly related to the venv implementation. The +downside of this proposal is that it implies the attribute is only +useful/relevant when in a venv and should be absent or ``None`` when +not in a venv. This imposes an unnecessary extra burden on code using +the attribute: ``sys.venv_prefix if sys.venv_prefix else +sys.prefix``. The prefix attributes are more usable and general if +they are always present and set, and split by meaning (stdlib vs +site-packages, roughly), rather than specifically tied to venv. Also, +third-party code should be encouraged to not know or care whether it +is running in a virtual environment or not; this option seems to work +against that goal. + +Another option would be ``sys.local_prefix``, which has both the +advantage and disadvantage, depending on perspective, that it +introduces the new term "local" rather than drawing on existing +associations with the term "site". + + +Why not modify sys.prefix? +-------------------------- + +As discussed above under `Backwards Compatibility`_, this PEP proposes +to add ``sys.site_prefix`` as "the prefix relative to which +site-package directories are found". This maintains compatibility with +the documented meaning of ``sys.prefix`` (as the location relative to +which the standard library can be found), but means that code assuming +that site-packages directories are found relative to ``sys.prefix`` +will not respect the virtual environment correctly. + +Since it is unable to modify ``distutils``/``sysconfig``, +`virtualenv`_ is forced to instead re-point ``sys.prefix`` at the +virtual environment. + +An argument could be made that this PEP should follow virtualenv's +lead here (and introduce something like ``sys.base_prefix`` to point +to the standard library and header files), since virtualenv already +does this and it doesn't appear to have caused major problems with +existing code. + +Another argument in favor of this is that it would be preferable to +err on the side of greater, rather than lesser, isolation. Changing +``sys.prefix`` to point to the virtual environment and introducing a +new ``sys.base_prefix`` attribute would err on the side of greater +isolation in the face of existing code's use of ``sys.prefix``. + + +What about include files? +------------------------- + +For example, ZeroMQ installs zmq.h and zmq_utils.h in $VE/include, +whereas SIP (part of PyQt4) installs sip.h by default in +$VE/include/pythonX.Y. With virtualenv, everything works because the +PythonX.Y include is symlinked, so everything that's needed is in +$VE/include. At the moment the reference implementation doesn't do +anything with include files, besides creating the include directory; +this might need to change, to copy/symlink $VE/include/pythonX.Y. + +As in Python there's no abstraction for a site-specific include +directory, other than for platform-specific stuff, then the user +expectation would seem to be that all include files anyone could ever +want should be found in one of just two locations, with sysconfig +labels "include" & "platinclude". + +There's another issue: what if includes are Python-version-specific? +For example, SIP installs by default into $VE/include/pythonX.Y rather +than $VE/include, presumably because there's version-specific stuff in +there - but even if that's not the case with SIP, it could be the case +with some other package. And the problem that gives is that you can't +just symlink the include/pythonX.Y directory, but actually have to +provide a writable directory and symlink/copy the contents from the +system include/pythonX.Y. Of course this is not hard to do, but it +does seem inelegant. OTOH it's really because there's no supporting +concept in Python/sysconfig. + + +Interface with packaging tools +------------------------------ + +Some work will be needed in packaging tools (Python 3.3 packaging, +Distribute) to support implementation of this PEP. For example: + +* How Distribute and packaging use sys.prefix and/or sys.site_prefix. Clearly, + in practice we'll need to use Distribute for a while, until packages have + migrated over to usage of setup.cfg. + +* How packaging and Distribute set up shebang lines in scripts which they + install in virtual environments. + + +Testability and Source Build Issues +----------------------------------- + +Currently in the reference implementation, virtual environments must +be created with an installed Python, rather than a source build, as +the base installation. In order to be able to fully test the ``venv`` +module in the Python regression test suite, some anomalies in how +sysconfig data is configured in source builds will need to be +removed. For example, sysconfig.get_paths() in a source build gives +(partial output):: + + { + 'include': '/home/vinay/tools/pythonv/Include', + 'libdir': '/usr/lib ; or /usr/lib64 on a multilib system', + 'platinclude': '/home/vinay/tools/pythonv', + 'platlib': '/usr/local/lib/python3.3/site-packages', + 'platstdlib': '/usr/local/lib/python3.3', + 'purelib': '/usr/local/lib/python3.3/site-packages', + 'stdlib': '/usr/local/lib/python3.3' + } + + +Need for ``install_name_tool`` on OSX? +-------------------------------------- + +`Virtualenv uses`_ ``install_name_tool``, a tool provided in the Xcode +developer tools, to modify the copied executable on OSX. We need input +from OSX developers on whether this is actually necessary in this +PEP's implementation of virtual environments, and if so, if there is +an alternative to ``install_name_tool`` that would allow ``venv`` to +not require that Xcode is installed. + +.. _Virtualenv uses: https://github.com/pypa/virtualenv/issues/168 + + +Activation and Utility Scripts +------------------------------ + +Virtualenv provides shell "activation" scripts as a user convenience, +to put the virtual environment's Python binary first on the shell +PATH. This is a maintenance burden, as separate activation scripts +need to be provided and maintained for every supported shell. For this +reason, this PEP proposes to leave such scripts to be provided by +third-party extensions; virtual environments created by the core +functionality would be used by directly invoking the environment's +Python binary or scripts. + +If we are going to rely on external code to provide these +conveniences, we need to check with existing third-party projects in +this space (virtualenv, zc.buildout) and ensure that the proposed API +meets their needs. + +(Virtualenv would be fine with the proposed API; it would become a +relatively thin wrapper with a subclass of the env builder that adds +shell activation and automatic installation of ``pip`` inside the +virtual environment). + + +Provide a mode that is isolated only from user site packages? +------------------------------------------------------------- + +Is there sufficient rationale for providing a mode that isolates the +venv from :pep:`370` user site packages, but not from the system-level +site-packages? + + +Other Python implementations? +----------------------------- + +We should get feedback from Jython, IronPython, and PyPy about whether +there's anything in this PEP that they foresee as a difficulty for +their implementation. + + +Reference Implementation +======================== + +The in-progress reference implementation is found in `a clone of the +CPython Mercurial repository`_. To test it, build and install it (the +virtual environment tool currently does not run from a source +tree). From the installed Python, run ``bin/pyvenv +/path/to/new/virtualenv`` to create a virtual environment. + +The reference implementation (like this PEP!) is a work in progress. + +.. _a clone of the CPython Mercurial repository: https://bitbucket.org/vinay.sajip/pythonv + + +Copyright +========= + +This document has been placed in the public domain. + + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: + -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 11:40:44 2011 From: python-checkins at python.org (georg.brandl) Date: Sun, 30 Oct 2011 11:40:44 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix-up_formatting=2E?= Message-ID: http://hg.python.org/peps/rev/0fa6bd556f05 changeset: 3976:0fa6bd556f05 user: Georg Brandl date: Sun Oct 30 12:40:47 2011 +0100 summary: Fix-up formatting. files: pep-0404.txt | 257 +++++++++++++++++++------------------- 1 files changed, 127 insertions(+), 130 deletions(-) diff --git a/pep-0404.txt b/pep-0404.txt --- a/pep-0404.txt +++ b/pep-0404.txt @@ -37,22 +37,22 @@ Existing virtual environment tools suffer from lack of support from the behavior of Python itself. Tools such as `rvirtualenv`_, which do not copy the Python binary into the virtual environment, cannot -provide reliable isolation from system site directories. Virtualenv, +provide reliable isolation from system site directories. Virtualenv, which does copy the Python binary, is forced to duplicate much of Python's ``site`` module and manually symlink/copy an ever-changing set of standard-library modules into the virtual environment in order -to perform a delicate boot-strapping dance at every -startup. (Virtualenv copies the binary because symlinking it does not -provide isolation, as Python dereferences a symlinked executable -before searching for `sys.prefix`.) +to perform a delicate boot-strapping dance at every startup. +(Virtualenv copies the binary because symlinking it does not provide +isolation, as Python dereferences a symlinked executable before +searching for `sys.prefix`.) The ``PYTHONHOME`` environment variable, Python's only existing built-in solution for virtual environments, requires -copying/symlinking the entire standard library into every -environment. Copying the whole standard library is not a lightweight -solution, and cross-platform support for symlinks remains inconsistent -(even on Windows platforms that do support them, creating them often -requires administrator privileges). +copying/symlinking the entire standard library into every environment. +Copying the whole standard library is not a lightweight solution, and +cross-platform support for symlinks remains inconsistent (even on +Windows platforms that do support them, creating them often requires +administrator privileges). A virtual environment mechanism integrated with Python and drawing on years of experience with existing third-party tools can be lower @@ -79,7 +79,7 @@ This PEP proposes to add a new first step to this search. If a ``pyvenv.cfg`` file is found either adjacent to the Python executable, or one directory above it, this file is scanned for lines of the form -``key = value``. If a ``home`` key is found, this signifies that the +``key = value``. If a ``home`` key is found, this signifies that the Python binary belongs to a virtual environment, and the value of the ``home`` key is the directory containing the Python executable used to create this virtual environment. @@ -105,8 +105,7 @@ Thus, a Python virtual environment in its simplest form would consist of nothing more than a copy or symlink of the Python binary -accompanied by a ``pyvenv.cfg`` file and a site-packages -directory. +accompanied by a ``pyvenv.cfg`` file and a site-packages directory. Isolation from system site-packages @@ -173,9 +172,8 @@ install into a normal Python installation, and avoid special-casing virtual environments in ``sysconfig`` beyond using ``sys.site_prefix`` in place of ``sys.prefix``, the internal virtual environment layout -mimics the layout of the Python installation itself on each -platform. So a typical virtual environment layout on a POSIX system -would be:: +mimics the layout of the Python installation itself on each platform. +So a typical virtual environment layout on a POSIX system would be:: pyvenv.cfg bin/python3 @@ -201,7 +199,7 @@ On a normal Windows system-level installation, the Python binary itself wouldn't go inside the "Scripts/" subdirectory, as it does - in the default venv layout. This is useful in a virtual + in the default venv layout. This is useful in a virtual environment so that a user only has to add a single directory to their shell PATH in order to effectively "activate" the virtual environment. @@ -219,7 +217,7 @@ ---------------------- The technique in this PEP works equally well in general with a copied -or symlinked Python binary (and other needed DLLs on Windows). Some +or symlinked Python binary (and other needed DLLs on Windows). Some users prefer a copied binary (for greater isolation from system changes) and some prefer a symlinked one (so that e.g. security updates automatically propagate to virtual environments). @@ -230,16 +228,15 @@ do, creating them often requires administrator privileges. * On OSX framework builds of Python, sys.executable is just a stub - that executes the real Python binary. Symlinking this stub does not - work with the implementation in this PEP; it must be - copied. (Fortunately the stub is also small, so copying it is not an - issue). + that executes the real Python binary. Symlinking this stub does not + work with the implementation in this PEP; it must be copied. + (Fortunately the stub is also small, so copying it is not an issue). Because of these issues, this PEP proposes to copy the Python binary by default, to maintain cross-platform consistency in the default behavior. -The ``pyvenv`` script accepts a ``--symlink`` option. If this option +The ``pyvenv`` script accepts a ``--symlink`` option. If this option is provided, the script will attempt to symlink instead of copy. If a symlink fails (e.g. because they are not supported by the platform, or additional privileges are needed), the script will warn the user and @@ -259,25 +256,24 @@ customize environment creation according to their needs. The ``venv`` module contains an ``EnvBuilder`` class which accepts the -following keyword arguments on instantiation:: +following keyword arguments on instantiation: - * ``system_site_packages`` - A Boolean value indicating that the - system Python site-packages should be available to the - environment (defaults to ``False``). +* ``system_site_packages`` - A Boolean value indicating that the + system Python site-packages should be available to the environment. + Defaults to ``False``. - * ``clear`` - A Boolean value which, if True, will delete any - existing target directory instead of raising an exception - (defaults to ``False``). +* ``clear`` - A Boolean value which, if true, will delete any existing + target directory instead of raising an exception. Defaults to + ``False``. - * ``use_symlinks`` - A Boolean value indicating whether to attempt - to symlink the Python binary (and any necessary DLLs or other - binaries, e.g. ``pythonw.exe``), rather than copying. Defaults to - ``False``. +* ``use_symlinks`` - A Boolean value indicating whether to attempt to + symlink the Python binary (and any necessary DLLs or other binaries, + e.g. ``pythonw.exe``), rather than copying. Defaults to ``False``. The returned env-builder is an object with a ``create`` method, which takes as required argument the path (absolute or relative to the current directory) of the target directory which is to contain the -virtual environment. The ``create`` method either creates the +virtual environment. The ``create`` method either creates the environment in the specified directory, or raises an appropriate exception. @@ -296,7 +292,7 @@ builder.create(env_dir) The ``create`` method of the ``EnvBuilder`` class illustrates the -hooks available for customization: +hooks available for customization:: def create(self, env_dir): """ @@ -312,67 +308,65 @@ self.post_setup(context) Each of the methods ``create_directories``, ``create_configuration``, -``setup_python``, and ``post_setup`` can be -overridden. The functions of these methods are:: +``setup_python``, and ``post_setup`` can be overridden. The functions +of these methods are: - * ``create_directories`` - creates the environment directory and - all necessary directories, and returns a context object. This is - just a holder for attributes (such as paths), for use by the - other methods. +* ``create_directories`` - creates the environment directory and all + necessary directories, and returns a context object. This is just a + holder for attributes (such as paths), for use by the other methods. - * ``create_configuration`` - creates the ``pyvenv.cfg`` - configuration file in the environment. +* ``create_configuration`` - creates the ``pyvenv.cfg`` configuration + file in the environment. - * ``setup_python`` - creates a copy of the Python executable (and, - under Windows, DLLs) in the environment. +* ``setup_python`` - creates a copy of the Python executable (and, + under Windows, DLLs) in the environment. - * ``post_setup`` - A (no-op by default) hook method which can be - overridden in third party implementations to pre-install packages - or install scripts in the virtual environment. +* ``post_setup`` - A (no-op by default) hook method which can be + overridden in third party implementations to pre-install packages or + install scripts in the virtual environment. In addition, ``EnvBuilder`` provides a utility method that can be called from ``post_setup`` in subclasses to assist in installing scripts into the virtual environment. The method ``install_scripts`` accepts as arguments the ``context`` object (see above) and a -bytestring. The bytestring should be a base64-encoded zip file +bytestring. The bytestring should be a base64-encoded zip file containing directories "common", "posix", "nt", each containing -scripts destined for the bin directory in the environment. The +scripts destined for the bin directory in the environment. The contents of "common" and the directory corresponding to ``os.name`` are copied after doing some text replacement of placeholders: - * ``__VENV_DIR__`` is replaced with absolute path of the - environment directory. +* ``__VENV_DIR__`` is replaced with absolute path of the environment + directory. - * ``__VENV_NAME__`` is replaced with the environment - name (final path segment of environment directory). +* ``__VENV_NAME__`` is replaced with the environment name (final path + segment of environment directory). - * ``__VENV_BIN_NAME__`` is replaced with the name of the bin - directory (either ``bin`` or ``Scripts``). +* ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory + (either ``bin`` or ``Scripts``). - * ``__VENV_PYTHON__`` is replaced with the absolute path of the - environment's executable. - +* ``__VENV_PYTHON__`` is replaced with the absolute path of the + environment's executable. The ``DistributeEnvBuilder`` subclass in the reference implementation illustrates how the customization hook can be used in practice to pre-install Distribute and shell activation scripts into the virtual -environment. It's not envisaged that ``DistributeEnvBuilder`` will be +environment. It's not envisaged that ``DistributeEnvBuilder`` will be actually added to Python core, but it makes the reference implementation more immediately useful for testing and exploratory purposes. The "shell activation scripts" provided by ``DistributeEnvBuilder`` simply add the virtual environment's ``bin/`` (or ``Scripts\``) -directory to the front of the user's shell PATH. This is not strictly +directory to the front of the user's shell PATH. This is not strictly necessary for use of a virtual environment (as an explicit path to the venv's python binary or scripts can just as well be used), but it is convenient. This PEP does not propose that the ``venv`` module in core Python will -add such activation scripts by default, as they are -shell-specific. Adding activation scripts for the wide variety of -possible shells is an added maintenance burden, and is left to -third-party extension tools. +add such activation scripts by default, as they are shell-specific. +Adding activation scripts for the wide variety of possible shells is +an added maintenance burden, and is left to third-party extension +tools. No doubt the process of PEP review will show up any customization requirements which have not yet been considered. @@ -396,11 +390,12 @@ This split could be handled by introducing a new ``sys`` attribute for either the former prefix or the latter prefix. Either option potentially introduces some backwards-incompatibility with software -written to assume the other meaning for ``sys.prefix``. (Such software -should preferably be using the APIs in the ``site`` and ``sysconfig`` -modules to answer these questions rather than using ``sys.prefix`` -directly, in which case there is no backwards-compatibility issue, but -in practice ``sys.prefix`` is sometimes used.) +written to assume the other meaning for ``sys.prefix``. (Such +software should preferably be using the APIs in the ``site`` and +``sysconfig`` modules to answer these questions rather than using +``sys.prefix`` directly, in which case there is no +backwards-compatibility issue, but in practice ``sys.prefix`` is +sometimes used.) The `documentation`__ for ``sys.prefix`` describes it as "A string giving the site-specific directory prefix where the platform @@ -413,11 +408,11 @@ This PEP currently proposes to leave ``sys.prefix`` pointing to the base system installation (which is where the standard library and header files are found), and introduce a new value in ``sys`` -(``sys.site_prefix``) to point to the prefix for -``site-packages``. This maintains the documented semantics of -``sys.prefix``, but risks breaking isolation if third-party code uses -``sys.prefix`` rather than ``sys.site_prefix`` or the appropriate -``site`` API to find site-packages directories. +(``sys.site_prefix``) to point to the prefix for ``site-packages``. +This maintains the documented semantics of ``sys.prefix``, but risks +breaking isolation if third-party code uses ``sys.prefix`` rather than +``sys.site_prefix`` or the appropriate ``site`` API to find +site-packages directories. The most notable case is probably `setuptools`_ and its fork `distribute`_, which mostly use ``distutils``/``sysconfig`` APIs, but @@ -426,7 +421,7 @@ It would be trivial to modify these tools (currently only `distribute`_ is Python 3 compatible) to check ``sys.site_prefix`` and fall back to ``sys.prefix`` if it doesn't exist (for earlier versions -of Python). If Distribute is modified in this way and released before +of Python). If Distribute is modified in this way and released before Python 3.3 is released with the ``venv`` module, there would be no likely reason for an older version of Distribute to ever be installed in a virtual environment. @@ -434,9 +429,9 @@ In terms of other third-party usage, a `Google Code Search`_ turns up what appears to be a roughly even mix of usage between packages using ``sys.prefix`` to build up a site-packages path and packages using it -to e.g. eliminate the standard-library from code-execution -tracing. Either choice that's made here will require one or the other -of these uses to be updated. +to e.g. eliminate the standard-library from code-execution tracing. +Either choice that's made here will require one or the other of these +uses to be updated. .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools .. _distribute: http://packages.python.org/distribute/ @@ -454,7 +449,7 @@ * Inasmuch as "site" has a meaning in Python, it means a combination of Python version, standard library, and specific set of - site-packages. This is, fundamentally, what a venv is (although it + site-packages. This is, fundamentally, what a venv is (although it shares the standard library with its "base" site). * It is the Python ``site`` module which implements adding @@ -466,17 +461,17 @@ overload. One proposed alternative is ``sys.venv_prefix``, which has the -advantage of being clearly related to the venv implementation. The +advantage of being clearly related to the venv implementation. The downside of this proposal is that it implies the attribute is only useful/relevant when in a venv and should be absent or ``None`` when -not in a venv. This imposes an unnecessary extra burden on code using -the attribute: ``sys.venv_prefix if sys.venv_prefix else -sys.prefix``. The prefix attributes are more usable and general if -they are always present and set, and split by meaning (stdlib vs -site-packages, roughly), rather than specifically tied to venv. Also, -third-party code should be encouraged to not know or care whether it -is running in a virtual environment or not; this option seems to work -against that goal. +not in a venv. This imposes an unnecessary extra burden on code using +the attribute: ``sys.venv_prefix if sys.venv_prefix else sys.prefix``. +The prefix attributes are more usable and general if they are always +present and set, and split by meaning (stdlib vs site-packages, +roughly), rather than specifically tied to venv. Also, third-party +code should be encouraged to not know or care whether it is running in +a virtual environment or not; this option seems to work against that +goal. Another option would be ``sys.local_prefix``, which has both the advantage and disadvantage, depending on perspective, that it @@ -489,11 +484,11 @@ As discussed above under `Backwards Compatibility`_, this PEP proposes to add ``sys.site_prefix`` as "the prefix relative to which -site-package directories are found". This maintains compatibility with -the documented meaning of ``sys.prefix`` (as the location relative to -which the standard library can be found), but means that code assuming -that site-packages directories are found relative to ``sys.prefix`` -will not respect the virtual environment correctly. +site-package directories are found". This maintains compatibility +with the documented meaning of ``sys.prefix`` (as the location +relative to which the standard library can be found), but means that +code assuming that site-packages directories are found relative to +``sys.prefix`` will not respect the virtual environment correctly. Since it is unable to modify ``distutils``/``sysconfig``, `virtualenv`_ is forced to instead re-point ``sys.prefix`` at the @@ -506,7 +501,7 @@ existing code. Another argument in favor of this is that it would be preferable to -err on the side of greater, rather than lesser, isolation. Changing +err on the side of greater, rather than lesser, isolation. Changing ``sys.prefix`` to point to the virtual environment and introducing a new ``sys.base_prefix`` attribute would err on the side of greater isolation in the face of existing code's use of ``sys.prefix``. @@ -515,13 +510,14 @@ What about include files? ------------------------- -For example, ZeroMQ installs zmq.h and zmq_utils.h in $VE/include, -whereas SIP (part of PyQt4) installs sip.h by default in -$VE/include/pythonX.Y. With virtualenv, everything works because the -PythonX.Y include is symlinked, so everything that's needed is in -$VE/include. At the moment the reference implementation doesn't do -anything with include files, besides creating the include directory; -this might need to change, to copy/symlink $VE/include/pythonX.Y. +For example, ZeroMQ installs ``zmq.h`` and ``zmq_utils.h`` in +``$VE/include``, whereas SIP (part of PyQt4) installs sip.h by default +in ``$VE/include/pythonX.Y``. With virtualenv, everything works +because the PythonX.Y include is symlinked, so everything that's +needed is in ``$VE/include``. At the moment the reference +implementation doesn't do anything with include files, besides +creating the include directory; this might need to change, to +copy/symlink ``$VE/include/pythonX.Y``. As in Python there's no abstraction for a site-specific include directory, other than for platform-specific stuff, then the user @@ -530,26 +526,27 @@ labels "include" & "platinclude". There's another issue: what if includes are Python-version-specific? -For example, SIP installs by default into $VE/include/pythonX.Y rather -than $VE/include, presumably because there's version-specific stuff in -there - but even if that's not the case with SIP, it could be the case -with some other package. And the problem that gives is that you can't -just symlink the include/pythonX.Y directory, but actually have to -provide a writable directory and symlink/copy the contents from the -system include/pythonX.Y. Of course this is not hard to do, but it -does seem inelegant. OTOH it's really because there's no supporting -concept in Python/sysconfig. +For example, SIP installs by default into ``$VE/include/pythonX.Y`` +rather than ``$VE/include``, presumably because there's +version-specific stuff in there - but even if that's not the case with +SIP, it could be the case with some other package. And the problem +that gives is that you can't just symlink the ``include/pythonX.Y`` +directory, but actually have to provide a writable directory and +symlink/copy the contents from the system ``include/pythonX.Y``. Of +course this is not hard to do, but it does seem inelegant. OTOH it's +really because there's no supporting concept in ``Python/sysconfig``. Interface with packaging tools ------------------------------ Some work will be needed in packaging tools (Python 3.3 packaging, -Distribute) to support implementation of this PEP. For example: +Distribute) to support implementation of this PEP. For example: -* How Distribute and packaging use sys.prefix and/or sys.site_prefix. Clearly, - in practice we'll need to use Distribute for a while, until packages have - migrated over to usage of setup.cfg. +* How Distribute and packaging use ``sys.prefix`` and/or + ``sys.site_prefix``. Clearly, in practice we'll need to use + Distribute for a while, until packages have migrated over to usage + of setup.cfg. * How packaging and Distribute set up shebang lines in scripts which they install in virtual environments. @@ -560,10 +557,10 @@ Currently in the reference implementation, virtual environments must be created with an installed Python, rather than a source build, as -the base installation. In order to be able to fully test the ``venv`` +the base installation. In order to be able to fully test the ``venv`` module in the Python regression test suite, some anomalies in how -sysconfig data is configured in source builds will need to be -removed. For example, sysconfig.get_paths() in a source build gives +sysconfig data is configured in source builds will need to be removed. +For example, ``sysconfig.get_paths()`` in a source build gives (partial output):: { @@ -581,11 +578,11 @@ -------------------------------------- `Virtualenv uses`_ ``install_name_tool``, a tool provided in the Xcode -developer tools, to modify the copied executable on OSX. We need input -from OSX developers on whether this is actually necessary in this -PEP's implementation of virtual environments, and if so, if there is -an alternative to ``install_name_tool`` that would allow ``venv`` to -not require that Xcode is installed. +developer tools, to modify the copied executable on OSX. We need +input from OSX developers on whether this is actually necessary in +this PEP's implementation of virtual environments, and if so, if there +is an alternative to ``install_name_tool`` that would allow ``venv`` +to not require that Xcode is installed. .. _Virtualenv uses: https://github.com/pypa/virtualenv/issues/168 @@ -595,9 +592,9 @@ Virtualenv provides shell "activation" scripts as a user convenience, to put the virtual environment's Python binary first on the shell -PATH. This is a maintenance burden, as separate activation scripts -need to be provided and maintained for every supported shell. For this -reason, this PEP proposes to leave such scripts to be provided by +PATH. This is a maintenance burden, as separate activation scripts +need to be provided and maintained for every supported shell. For +this reason, this PEP proposes to leave such scripts to be provided by third-party extensions; virtual environments created by the core functionality would be used by directly invoking the environment's Python binary or scripts. @@ -634,9 +631,9 @@ The in-progress reference implementation is found in `a clone of the CPython Mercurial repository`_. To test it, build and install it (the -virtual environment tool currently does not run from a source -tree). From the installed Python, run ``bin/pyvenv -/path/to/new/virtualenv`` to create a virtual environment. +virtual environment tool currently does not run from a source tree). +From the installed Python, run ``bin/pyvenv /path/to/new/virtualenv`` +to create a virtual environment. The reference implementation (like this PEP!) is a work in progress. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 11:45:16 2011 From: python-checkins at python.org (georg.brandl) Date: Sun, 30 Oct 2011 11:45:16 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_More_formatting_and_fill-colum?= =?utf8?q?n_fixes=2E?= Message-ID: http://hg.python.org/peps/rev/01720a11ec36 changeset: 3977:01720a11ec36 user: Georg Brandl date: Sun Oct 30 12:45:18 2011 +0100 summary: More formatting and fill-column fixes. files: pep-0404.txt | 2 +- pep-3153.txt | 178 +++++++++++++++++++------------------- pep-3154.txt | 107 ++++++++++++----------- pep-3155.txt | 45 +++++---- 4 files changed, 171 insertions(+), 161 deletions(-) diff --git a/pep-0404.txt b/pep-0404.txt --- a/pep-0404.txt +++ b/pep-0404.txt @@ -44,7 +44,7 @@ to perform a delicate boot-strapping dance at every startup. (Virtualenv copies the binary because symlinking it does not provide isolation, as Python dereferences a symlinked executable before -searching for `sys.prefix`.) +searching for ``sys.prefix``.) The ``PYTHONHOME`` environment variable, Python's only existing built-in solution for virtual environments, requires diff --git a/pep-3153.txt b/pep-3153.txt --- a/pep-3153.txt +++ b/pep-3153.txt @@ -25,37 +25,37 @@ People who want to write asynchronous code in Python right now have a few options: - - ``asyncore`` and ``asynchat`` - - something bespoke, most likely based on the ``select`` module - - using a third party library, such as Twisted_ or gevent_ +- ``asyncore`` and ``asynchat`` +- something bespoke, most likely based on the ``select`` module +- using a third party library, such as Twisted_ or gevent_ Unfortunately, each of these options has its downsides, which this PEP tries to address. -Despite having been part of the Python standard library for a long time, -the asyncore module suffers from fundamental flaws following from -an inflexible API that does not stand up to the expectations of -a modern asynchronous networking module. +Despite having been part of the Python standard library for a long +time, the asyncore module suffers from fundamental flaws following +from an inflexible API that does not stand up to the expectations of a +modern asynchronous networking module. -Moreover, its approach is too simplistic to provide developers with all -the tools they need in order to fully exploit the potential of asynchronous -networking. +Moreover, its approach is too simplistic to provide developers with +all the tools they need in order to fully exploit the potential of +asynchronous networking. The most popular solution right now used in production involves the -use of third party libraries. These often provide satisfactory +use of third party libraries. These often provide satisfactory solutions, but there is a lack of compatibility between these libraries, which tends to make codebases very tightly coupled to the library they use. This current lack of portability between different asynchronous IO libraries causes a lot of duplicated effort for third party library -developers. A sufficiently powerful abstraction could mean that +developers. A sufficiently powerful abstraction could mean that asynchronous code gets written once, but used everywhere. An eventual added goal would be for standard library implementations of wire and network protocols to evolve towards being real protocol implementations, as opposed to standalone libraries that do everything -including calling ``recv()`` blockingly. This means they could be +including calling ``recv()`` blockingly. This means they could be easily reused for both synchronous and asynchronous code. .. _Twisted: http://www.twistedmatrix.com/ @@ -71,103 +71,104 @@ bytes to different kinds of connections. Transports in this PEP are always ordered, reliable, bidirectional, stream-oriented two-endpoint connections. This might be a TCP socket, an SSL connection, a pipe -(named or otherwise), a serial port... It may abstract a file descriptor -on POSIX platforms or a Handle on Windows or some other data structure -appropriate to a particular platform. It encapsulates all of the -particular implementation details of using that platform data structure -and presents a uniform interface for application developers. +(named or otherwise), a serial port... It may abstract a file +descriptor on POSIX platforms or a Handle on Windows or some other +data structure appropriate to a particular platform. It encapsulates +all of the particular implementation details of using that platform +data structure and presents a uniform interface for application +developers. -Transports talk to two things: the other side of the connection on -one hand, and a protocol on the other. It's a bridge between the -specific underlying transfer mechanism and the protocol. Its job can -be described as allowing the protocol to just send and receive bytes, -taking care of all of the magic that needs to happen to those bytes -to be eventually sent across the wire. +Transports talk to two things: the other side of the connection on one +hand, and a protocol on the other. It's a bridge between the specific +underlying transfer mechanism and the protocol. Its job can be +described as allowing the protocol to just send and receive bytes, +taking care of all of the magic that needs to happen to those bytes to +be eventually sent across the wire. The primary feature of a transport is sending bytes to a protocol and -receiving bytes from the underlying protocol. Writing to the transport -is done using the ``write`` and ``write_sequence`` methods. The latter -method is a performance optimization, to allow software to take -advantage of specific capabilities in some transport -mechanisms. Specifically, this allows transports to use writev_ -instead of write_ or send_, also known as scatter/gather IO. +receiving bytes from the underlying protocol. Writing to the +transport is done using the ``write`` and ``write_sequence`` methods. +The latter method is a performance optimization, to allow software to +take advantage of specific capabilities in some transport mechanisms. +Specifically, this allows transports to use writev_ instead of write_ +or send_, also known as scatter/gather IO. -A transport can be paused and resumed. This will cause it to buffer +A transport can be paused and resumed. This will cause it to buffer data coming from protocols and stop sending received data to the protocol. -A transport can also be closed, half-closed and aborted. A closed +A transport can also be closed, half-closed and aborted. A closed transport will finish writing all of the data queued in it to the -underlying mechanism, and will then stop reading or writing -data. Aborting a transport stops it, closing the connection without -sending any data that is still queued. +underlying mechanism, and will then stop reading or writing data. +Aborting a transport stops it, closing the connection without sending +any data that is still queued. -Further writes will result in exceptions being thrown. A half-closed +Further writes will result in exceptions being thrown. A half-closed transport may not be written to anymore, but will still accept incoming data. Protocols --------- -Protocols are probably more familiar to new users. The terminology is +Protocols are probably more familiar to new users. The terminology is consistent with what you would expect from something called a protocol: the protocols most people think of first, like HTTP, IRC, SMTP... are all examples of something that would be implemented in a protocol. The shortest useful definition of a protocol is a (usually two-way) -bridge between the transport and the rest of the application logic. A +bridge between the transport and the rest of the application logic. A protocol will receive bytes from a transport and translates that information into some behavior, typically resulting in some method -calls on an object. Similarly, application logic calls some methods on -the protocol, which the protocol translates into bytes and +calls on an object. Similarly, application logic calls some methods +on the protocol, which the protocol translates into bytes and communicates to the transport. One of the simplest protocols is a line-based protocol, where data is -delimited by ``\r\n``. The protocol will receive bytes from the -transport and buffer them until there is at least one complete -line. Once that's done, it will pass this line along to some -object. Ideally that would be accomplished using a callable or even a +delimited by ``\r\n``. The protocol will receive bytes from the +transport and buffer them until there is at least one complete line. +Once that's done, it will pass this line along to some object. +Ideally that would be accomplished using a callable or even a completely separate object composed by the protocol, but it could also be implemented by subclassing (as is the case with Twisted's -``LineReceiver``). For the other direction, the protocol could have a +``LineReceiver``). For the other direction, the protocol could have a ``write_line`` method, which adds the required ``\r\n`` and passes the new bytes buffer on to the transport. This PEP suggests a generalized ``LineReceiver`` called ``ChunkProtocol``, where a "chunk" is a message in a stream, delimited -by the specified delimiter. Instances take a delimiter and a callable +by the specified delimiter. Instances take a delimiter and a callable that will be called with a chunk of data once it's received (as -opposed to Twisted's subclassing behavior). ``ChunkProtocol`` also has -a ``write_chunk`` method analogous to the ``write_line`` method +opposed to Twisted's subclassing behavior). ``ChunkProtocol`` also +has a ``write_chunk`` method analogous to the ``write_line`` method described above. Why separate protocols and transports? -------------------------------------- This separation between protocol and transport often confuses people -who first come across it. In fact, the standard library itself does +who first come across it. In fact, the standard library itself does not make this distinction in many cases, particularly not in the API it provides to users. -It is nonetheless a very useful distinction. In the worst case, it -simplifies the implementation by clear separation of -concerns. However, it often serves the far more useful purpose of -being able to reuse protocols across different transports. +It is nonetheless a very useful distinction. In the worst case, it +simplifies the implementation by clear separation of concerns. +However, it often serves the far more useful purpose of being able to +reuse protocols across different transports. -Consider a simple RPC protocol. The same bytes may be transferred -across many different transports, for example pipes or sockets. To -help with this, we separate the protocol out from the transport. The +Consider a simple RPC protocol. The same bytes may be transferred +across many different transports, for example pipes or sockets. To +help with this, we separate the protocol out from the transport. The protocol just reads and writes bytes, and doesn't really care what mechanism is used to eventually transfer those bytes. This also allows for protocols to be stacked or nested easily, -allowing for even more code reuse. A common example of this is +allowing for even more code reuse. A common example of this is JSON-RPC: according to the specification, it can be used across both -sockets and HTTP[#jsonrpc]_ . In practice, it tends to be primarily -encapsulated in HTTP. The protocol-transport abstraction allows us to +sockets and HTTP[#jsonrpc]_ . In practice, it tends to be primarily +encapsulated in HTTP. The protocol-transport abstraction allows us to build a stack of protocols and transports that allow you to use HTTP -as if it were a transport. For JSON-RPC, that might get you a stack +as if it were a transport. For JSON-RPC, that might get you a stack somewhat like this: 1. TCP socket transport @@ -182,16 +183,16 @@ Consumers --------- -Consumers consume bytes produced by producers. Together with +Consumers consume bytes produced by producers. Together with producers, they make flow control possible. -Consumers primarily play a passive role in flow control. They get -called whenever a producer has some data available. They then process +Consumers primarily play a passive role in flow control. They get +called whenever a producer has some data available. They then process that data, and typically yield control back to the producer. -Consumers typically implement buffers of some sort. They make flow +Consumers typically implement buffers of some sort. They make flow control possible by telling their producer about the current status of -those buffers. A consumer can instruct a producer to stop producing +those buffers. A consumer can instruct a producer to stop producing entirely, stop producing temporarily, or resume producing if it has been told to pause previously. @@ -204,23 +205,23 @@ Where consumers consume bytes, producers produce them. Producers are modeled after the IPushProducer_ interface found in -Twisted. Although there is an IPullProducer_ as well, it is on the +Twisted. Although there is an IPullProducer_ as well, it is on the whole far less interesting and therefore probably out of the scope of this PEP. Although producers can be told to stop producing entirely, the two -most interesting methods they have are ``pause`` and ``resume``. These -are usually called by the consumer, to signify whether it is ready to -process ("consume") more data or not. Consumers and producers -cooperate to make flow control possible. +most interesting methods they have are ``pause`` and ``resume``. +These are usually called by the consumer, to signify whether it is +ready to process ("consume") more data or not. Consumers and +producers cooperate to make flow control possible. In addition to the Twisted IPushProducer_ interface, producers have a ``half_register`` method which is called with the consumer when the -consumer tries to register that producer. In most cases, this will +consumer tries to register that producer. In most cases, this will just be a case of setting ``self.consumer = consumer``, but some producers may require more complex preconditions or behavior when a -consumer is registered. End-users are not supposed to call this method -directly. +consumer is registered. End-users are not supposed to call this +method directly. =========================== Considered API alternatives @@ -229,41 +230,42 @@ Generators as producers ~~~~~~~~~~~~~~~~~~~~~~~ -Generators have been suggested as way to implement producers. However, -there appear to be a few problems with this. +Generators have been suggested as way to implement producers. +However, there appear to be a few problems with this. -First of all, there is a conceptual problem. A generator, in a sense, -is "passive". It needs to be told, through a method call, to take -action. A producer is "active": it initiates those method calls. A -real producer has a symmetric relationship with it's consumer. In the +First of all, there is a conceptual problem. A generator, in a sense, +is "passive". It needs to be told, through a method call, to take +action. A producer is "active": it initiates those method calls. A +real producer has a symmetric relationship with it's consumer. In the case of a generator-turned-producer, only the consumer would have a reference, and the producer is blissfully unaware of the consumer's existence. This conceptual problem translates into a few technical issues as -well. After a successful ``write`` method call on its consumer, a -(push) producer is free to take action once more. In the case of a +well. After a successful ``write`` method call on its consumer, a +(push) producer is free to take action once more. In the case of a generator, it would need to be told, either by asking for the next object through the iteration protocol (a process which could block indefinitely), or perhaps by throwing some kind of signal exception into it. This signaling setup may provide a technically feasible solution, but -it is still unsatisfactory. For one, this introduces unwarranted +it is still unsatisfactory. For one, this introduces unwarranted complexity in the consumer, which now not only needs to understand how to receive and process data, but also how to ask for new data and deal with the case of no new data being available. -This latter edge case is particularly problematic. It needs to be -taken care of, since the entire operation is not allowed to -block. However, generators can not raise an exception on iteration -without terminating, thereby losing the state of the generator. As a -result, signaling a lack of available data would have to be done using -a sentinel value, instead of being done using th exception mechanism. +This latter edge case is particularly problematic. It needs to be +taken care of, since the entire operation is not allowed to block. +However, generators can not raise an exception on iteration without +terminating, thereby losing the state of the generator. As a result, +signaling a lack of available data would have to be done using a +sentinel value, instead of being done using th exception mechanism. Last but not least, nobody produced actually working code demonstrating how they could be used. + References ========== diff --git a/pep-3154.txt b/pep-3154.txt --- a/pep-3154.txt +++ b/pep-3154.txt @@ -16,28 +16,30 @@ ======== Data serialized using the pickle module must be portable across Python -versions. It should also support the latest language features as well as -implementation-specific features. For this reason, the pickle module knows -about several protocols (currently numbered from 0 to 3), each of which -appeared in a different Python version. Using a low-numbered protocol -version allows to exchange data with old Python versions, while using a -high-numbered protocol allows access to newer features and sometimes more -efficient resource use (both CPU time required for (de)serializing, and -disk size / network bandwidth required for data transfer). +versions. It should also support the latest language features as well +as implementation-specific features. For this reason, the pickle +module knows about several protocols (currently numbered from 0 to 3), +each of which appeared in a different Python version. Using a +low-numbered protocol version allows to exchange data with old Python +versions, while using a high-numbered protocol allows access to newer +features and sometimes more efficient resource use (both CPU time +required for (de)serializing, and disk size / network bandwidth +required for data transfer). Rationale ========= -The latest current protocol, coincidentally named protocol 3, appeared with -Python 3.0 and supports the new incompatible features in the language -(mainly, unicode strings by default and the new bytes object). The -opportunity was not taken at the time to improve the protocol in other ways. +The latest current protocol, coincidentally named protocol 3, appeared +with Python 3.0 and supports the new incompatible features in the +language (mainly, unicode strings by default and the new bytes +object). The opportunity was not taken at the time to improve the +protocol in other ways. -This PEP is an attempt to foster a number of small incremental improvements -in a future new protocol version. The PEP process is used in order to gather -as many improvements as possible, because the introduction of a new protocol -version should be a rare occurrence. +This PEP is an attempt to foster a number of small incremental +improvements in a future new protocol version. The PEP process is +used in order to gather as many improvements as possible, because the +introduction of a new protocol version should be a rare occurrence. Improvements in discussion @@ -46,67 +48,69 @@ 64-bit compatibility for large objects -------------------------------------- -Current protocol versions export object sizes for various built-in types -(str, bytes) as 32-bit ints. This forbids serialization of large data [1]_. -New opcodes are required to support very large bytes and str objects. +Current protocol versions export object sizes for various built-in +types (str, bytes) as 32-bit ints. This forbids serialization of +large data [1]_. New opcodes are required to support very large bytes +and str objects. Native opcodes for sets and frozensets -------------------------------------- -Many common built-in types (such as str, bytes, dict, list, tuple) have -dedicated opcodes to improve resource consumption when serializing and -deserializing them; however, sets and frozensets don't. Adding such opcodes -would be an obvious improvement. Also, dedicated set support could help -remove the current impossibility of pickling self-referential sets -[2]_. +Many common built-in types (such as str, bytes, dict, list, tuple) +have dedicated opcodes to improve resource consumption when +serializing and deserializing them; however, sets and frozensets +don't. Adding such opcodes would be an obvious improvement. Also, +dedicated set support could help remove the current impossibility of +pickling self-referential sets [2]_. Calling __new__ with keyword arguments -------------------------------------- -Currently, classes whose __new__ mandates the use of keyword-only arguments -can not be pickled (or, rather, unpickled) [3]_. Both a new special method -(``__getnewargs_ex__`` ?) and a new opcode (NEWOBJEX ?) are needed. +Currently, classes whose __new__ mandates the use of keyword-only +arguments can not be pickled (or, rather, unpickled) [3]_. Both a new +special method (``__getnewargs_ex__`` ?) and a new opcode (NEWOBJEX ?) +are needed. Serializing more callable objects --------------------------------- -Currently, only module-global functions are serializable. Multiprocessing -has custom support for pickling other callables such as bound methods [4]_. -This support could be folded in the protocol, and made more efficient -through a new GETATTR opcode. +Currently, only module-global functions are serializable. +Multiprocessing has custom support for pickling other callables such +as bound methods [4]_. This support could be folded in the protocol, +and made more efficient through a new GETATTR opcode. Serializing "pseudo-global" objects ----------------------------------- -Objects which are not module-global, but should be treated in a similar -fashion -- such as unbound methods [5]_ or nested classes -- cannot currently -be pickled (or, rather, unpickled) because the pickle protocol does not -correctly specify how to retrieve them. One solution would be through the -adjunction of a ``__namespace__`` (or ``__qualname__``) to all class and -function objects, specifying the full "path" by which they can be retrieved. -For globals, this would generally be ``"{}.{}".format(obj.__module__, obj.__name__)``. -Then a new opcode can resolve that path and push the object on the stack, +Objects which are not module-global, but should be treated in a +similar fashion -- such as unbound methods [5]_ or nested classes -- +cannot currently be pickled (or, rather, unpickled) because the pickle +protocol does not correctly specify how to retrieve them. One +solution would be through the adjunction of a ``__namespace__`` (or +``__qualname__``) to all class and function objects, specifying the +full "path" by which they can be retrieved. For globals, this would +generally be ``"{}.{}".format(obj.__module__, obj.__name__)``. Then a +new opcode can resolve that path and push the object on the stack, similarly to the GLOBAL opcode. Binary encoding for all opcodes ------------------------------- -The GLOBAL opcode, which is still used in protocol 3, uses the so-called -"text" mode of the pickle protocol, which involves looking for newlines -in the pickle stream. Looking for newlines is difficult to optimize on -a non-seekable stream, and therefore a new version of GLOBAL (BINGLOBAL?) -could use a binary encoding instead. +The GLOBAL opcode, which is still used in protocol 3, uses the +so-called "text" mode of the pickle protocol, which involves looking +for newlines in the pickle stream. Looking for newlines is difficult +to optimize on a non-seekable stream, and therefore a new version of +GLOBAL (BINGLOBAL?) could use a binary encoding instead. -It seems that all other opcodes emitted when using protocol 3 already use -binary encoding. +It seems that all other opcodes emitted when using protocol 3 already +use binary encoding. Better string encoding ---------------------- -Short str objects currently have their length coded as a 4-bytes integer, -which is wasteful. A specific opcode with a 1-byte length would make -many pickles smaller. - +Short str objects currently have their length coded as a 4-bytes +integer, which is wasteful. A specific opcode with a 1-byte length +would make many pickles smaller. Acknowledgments @@ -133,6 +137,7 @@ .. [5] "pickle should support methods": http://bugs.python.org/issue9276 + Copyright ========= diff --git a/pep-3155.txt b/pep-3155.txt --- a/pep-3155.txt +++ b/pep-3155.txt @@ -15,12 +15,13 @@ Rationale ========= -Python's introspection facilities have long had poor support for nested -classes. Given a class object, it is impossible to know whether it was -defined inside another class or at module top-level; and, if the former, -it is also impossible to know in which class it was defined. While -use of nested classes is often considered poor style, the only reason -for them to have second class introspection support is a lousy pun. +Python's introspection facilities have long had poor support for +nested classes. Given a class object, it is impossible to know +whether it was defined inside another class or at module top-level; +and, if the former, it is also impossible to know in which class it +was defined. While use of nested classes is often considered poor +style, the only reason for them to have second class introspection +support is a lousy pun. Python 3 adds insult to injury by dropping what was formerly known as unbound methods. In Python 2, given the following definition:: @@ -49,23 +50,24 @@ '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] -This limits again the introspection capabilities available to the user. -It can produce actual issues when porting software to Python 3, for example -Twisted Core where the issue of introspecting method objects came up -several times. It also limits pickling support [1]_. +This limits again the introspection capabilities available to the +user. It can produce actual issues when porting software to Python 3, +for example Twisted Core where the issue of introspecting method +objects came up several times. It also limits pickling support [1]_. Proposal ======== -This PEP proposes the addition of a ``__qname__`` attribute to functions -and classes. For top-level functions and classes, the ``__qname__`` -attribute is equal to the ``__name__`` attribute. For nested classed, -methods, and nested functions, the ``__qname__`` attribute contains a -dotted path leading to the object from the module top-level. +This PEP proposes the addition of a ``__qname__`` attribute to +functions and classes. For top-level functions and classes, the +``__qname__`` attribute is equal to the ``__name__`` attribute. For +nested classed, methods, and nested functions, the ``__qname__`` +attribute contains a dotted path leading to the object from the module +top-level. -The repr() and str() of functions and classes is modified to use ``__qname__`` -rather than ``__name__``. +The repr() and str() of functions and classes is modified to use +``__qname__`` rather than ``__name__``. Example with nested classes --------------------------- @@ -100,10 +102,10 @@ Limitations =========== -With nested functions (and classes defined inside functions), the dotted -path will not be walkable programmatically as a function's namespace is not -available from the outside. It will still be more helpful to the human -reader than the bare ``__name__``. +With nested functions (and classes defined inside functions), the +dotted path will not be walkable programmatically as a function's +namespace is not available from the outside. It will still be more +helpful to the human reader than the bare ``__name__``. As the ``__name__`` attribute, the ``__qname__`` attribute is computed statically and it will not automatically follow rebinding. @@ -115,6 +117,7 @@ .. [1] "pickle should support methods": http://bugs.python.org/issue9276 + Copyright ========= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 11:47:20 2011 From: python-checkins at python.org (georg.brandl) Date: Sun, 30 Oct 2011 11:47:20 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Formatting_fixes=3B_use_=22=3A?= =?utf8?q?=3A=22_shortcuts=2E?= Message-ID: http://hg.python.org/peps/rev/8cfc3835e115 changeset: 3978:8cfc3835e115 user: Georg Brandl date: Sun Oct 30 12:46:47 2011 +0100 summary: Formatting fixes; use "::" shortcuts. files: pep-3152.txt | 95 ++++++++++++++++++--------------------- 1 files changed, 44 insertions(+), 51 deletions(-) diff --git a/pep-3152.txt b/pep-3152.txt --- a/pep-3152.txt +++ b/pep-3152.txt @@ -14,16 +14,17 @@ Abstract ======== -A syntax is proposed for defining and calling a special type of generator -called a 'cofunction'. It is designed to provide a streamlined way of -writing generator-based coroutines, and allow the early detection of -certain kinds of error that are easily made when writing such code, which -otherwise tend to cause hard-to-diagnose symptoms. +A syntax is proposed for defining and calling a special type of +generator called a 'cofunction'. It is designed to provide a +streamlined way of writing generator-based coroutines, and allow the +early detection of certain kinds of error that are easily made when +writing such code, which otherwise tend to cause hard-to-diagnose +symptoms. -This proposal builds on the 'yield from' mechanism described in PEP 380, -and describes some of the semantics of cofunctions in terms of it. However, -it would be possible to define and implement cofunctions independently of -PEP 380 if so desired. +This proposal builds on the 'yield from' mechanism described in PEP +380, and describes some of the semantics of cofunctions in terms of +it. However, it would be possible to define and implement cofunctions +independently of PEP 380 if so desired. Specification @@ -32,29 +33,26 @@ Cofunction definitions ---------------------- -A new keyword ``codef`` is introduced which is used in place of ``def`` to -define a cofunction. A cofunction is a special kind of generator having the -following characteristics: +A new keyword ``codef`` is introduced which is used in place of +``def`` to define a cofunction. A cofunction is a special kind of +generator having the following characteristics: -1. A cofunction is always a generator, even if it does not contain any +1. A cofunction is always a generator, even if it does not contain any ``yield`` or ``yield from`` expressions. -2. A cofunction cannot be called the same way as an ordinary function. An - exception is raised if an ordinary call to a cofunction is attempted. +2. A cofunction cannot be called the same way as an ordinary function. + An exception is raised if an ordinary call to a cofunction is + attempted. Cocalls ------- Calls from one cofunction to another are made by marking the call with -a new keyword ``cocall``. The expression - -:: +a new keyword ``cocall``. The expression :: cocall f(*args, **kwds) -is semantically equivalent to - -:: +is semantically equivalent to :: yield from f.__cocall__(*args, **kwds) @@ -62,48 +60,43 @@ iterator, so the step of calling iter() on it is skipped. The full syntax of a cocall expression is described by the following -grammar lines: - -:: +grammar lines:: atom: cocall | cocall: 'cocall' atom cotrailer* '(' [arglist] ')' cotrailer: '[' subscriptlist ']' | '.' NAME -The ``cocall`` keyword is syntactically valid only inside a cofunction. -A SyntaxError will result if it is used in any other context. +The ``cocall`` keyword is syntactically valid only inside a +cofunction. A SyntaxError will result if it is used in any other +context. Objects which implement __cocall__ are expected to return an object -obeying the iterator protocol. Cofunctions respond to __cocall__ the +obeying the iterator protocol. Cofunctions respond to __cocall__ the same way as ordinary generator functions respond to __call__, i.e. by returning a generator-iterator. -Certain objects that wrap other callable objects, notably bound methods, -will be given __cocall__ implementations that delegate to the underlying -object. +Certain objects that wrap other callable objects, notably bound +methods, will be given __cocall__ implementations that delegate to the +underlying object. New builtins, attributes and C API functions -------------------------------------------- To facilitate interfacing cofunctions with non-coroutine code, there will -be a built-in function ``costart`` whose definition is equivalent to - -:: +be a built-in function ``costart`` whose definition is equivalent to :: def costart(obj, *args, **kwds): return obj.__cocall__(*args, **kwds) -There will also be a corresponding C API function - -:: +There will also be a corresponding C API function :: PyObject *PyObject_CoCall(PyObject *obj, PyObject *args, PyObject *kwds) It is left unspecified for now whether a cofunction is a distinct type of object or, like a generator function, is simply a specially-marked -function instance. If the latter, a read-only boolean attribute -``__iscofunction__`` should be provided to allow testing whether a given -function object is a cofunction. +function instance. If the latter, a read-only boolean attribute +``__iscofunction__`` should be provided to allow testing whether a +given function object is a cofunction. Motivation and Rationale @@ -111,32 +104,32 @@ The ``yield from`` syntax is reasonably self-explanatory when used for the purpose of delegating part of the work of a generator to another -function. It can also be used to good effect in the implementation of +function. It can also be used to good effect in the implementation of generator-based coroutines, but it reads somewhat awkwardly when used for that purpose, and tends to obscure the true intent of the code. Furthermore, using generators as coroutines is somewhat error-prone. -If one forgets to use ``yield from`` when it should have been used, -or uses it when it shouldn't have, the symptoms that result can be +If one forgets to use ``yield from`` when it should have been used, or +uses it when it shouldn't have, the symptoms that result can be obscure and confusing. Finally, sometimes there is a need for a function to be a coroutine even though it does not yield anything, and in these cases it is -necessary to resort to kludges such as ``if 0: yield`` to force it -to be a generator. +necessary to resort to kludges such as ``if 0: yield`` to force it to +be a generator. The ``codef`` and ``cocall`` constructs address the first issue by making the syntax directly reflect the intent, that is, that the function forms part of a coroutine. -The second issue is addressed -by making it impossible to mix coroutine and non-coroutine code in -ways that don't make sense. If the rules are violated, an exception -is raised that points out exactly what and where the problem is. +The second issue is addressed by making it impossible to mix coroutine +and non-coroutine code in ways that don't make sense. If the rules +are violated, an exception is raised that points out exactly what and +where the problem is. -Lastly, the need for dummy yields is eliminated by making the -form of definition determine whether the function is a coroutine, -rather than what it contains. +Lastly, the need for dummy yields is eliminated by making the form of +definition determine whether the function is a coroutine, rather than +what it contains. Prototype Implementation -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Oct 30 13:05:53 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:05:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Avoid_unnecessa?= =?utf8?q?ry_recursive_function_calls_=28closes_=2310519=29?= Message-ID: http://hg.python.org/cpython/rev/72de2ac8bb4f changeset: 73199:72de2ac8bb4f branch: 2.7 parent: 73195:18bbfed9aafa user: Petri Lehtinen date: Sun Oct 30 13:55:02 2011 +0200 summary: Avoid unnecessary recursive function calls (closes #10519) files: Objects/setobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1871,7 +1871,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return -1; - rv = set_contains(so, tmpkey); + rv = set_contains_key(so, tmpkey); Py_DECREF(tmpkey); } return rv; @@ -1936,7 +1936,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard(so, tmpkey); + result = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 13:05:54 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:05:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Avoid_unnecessa?= =?utf8?q?ry_recursive_function_calls_=28closes_=2310519=29?= Message-ID: http://hg.python.org/cpython/rev/664bf4f3a820 changeset: 73200:664bf4f3a820 branch: 3.2 parent: 73196:c3bcd625dcd4 user: Petri Lehtinen date: Sun Oct 30 13:56:41 2011 +0200 summary: Avoid unnecessary recursive function calls (closes #10519) files: Objects/setobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1877,7 +1877,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return -1; - rv = set_contains(so, tmpkey); + rv = set_contains_key(so, tmpkey); Py_DECREF(tmpkey); } return rv; @@ -1942,7 +1942,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard(so, tmpkey); + result = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 13:05:55 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:05:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Avoid_unnecessary_recursive_function_calls_=28=23closes_=231?= =?utf8?q?0519=29?= Message-ID: http://hg.python.org/cpython/rev/a5c4ae15b59d changeset: 73201:a5c4ae15b59d parent: 73198:a938d0258abe parent: 73200:664bf4f3a820 user: Petri Lehtinen date: Sun Oct 30 13:57:45 2011 +0200 summary: Avoid unnecessary recursive function calls (#closes #10519) files: Objects/setobject.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1852,7 +1852,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return -1; - rv = set_contains(so, tmpkey); + rv = set_contains_key(so, tmpkey); Py_DECREF(tmpkey); } return rv; @@ -1917,7 +1917,7 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard(so, tmpkey); + result = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 13:38:33 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:38:33 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_the_return_?= =?utf8?q?value_of_set=5Fdiscard_=28issue_=2310519=29?= Message-ID: http://hg.python.org/cpython/rev/7ddc7b339a8b changeset: 73202:7ddc7b339a8b branch: 2.7 parent: 73199:72de2ac8bb4f user: Petri Lehtinen date: Sun Oct 30 14:31:27 2011 +0200 summary: Fix the return value of set_discard (issue #10519) files: Objects/setobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1936,9 +1936,10 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard_key(so, tmpkey); + rv = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); - return result; + if (rv == -1) + return NULL; } Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 13:38:34 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:38:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_the_return_?= =?utf8?q?value_of_set=5Fdiscard_=28issue_=2310519=29?= Message-ID: http://hg.python.org/cpython/rev/b643458a0108 changeset: 73203:b643458a0108 branch: 3.2 parent: 73200:664bf4f3a820 user: Petri Lehtinen date: Sun Oct 30 14:31:27 2011 +0200 summary: Fix the return value of set_discard (issue #10519) files: Objects/setobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1942,9 +1942,10 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard_key(so, tmpkey); + rv = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); - return result; + if (rv == -1) + return NULL; } Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 13:38:35 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 13:38:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Fix_the_return_value_of_set=5Fdiscard_=28issue_=2310519=29?= Message-ID: http://hg.python.org/cpython/rev/f634102aca01 changeset: 73204:f634102aca01 parent: 73201:a5c4ae15b59d parent: 73203:b643458a0108 user: Petri Lehtinen date: Sun Oct 30 14:35:39 2011 +0200 summary: Fix the return value of set_discard (issue #10519) files: Objects/setobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1917,9 +1917,10 @@ tmpkey = make_new_set(&PyFrozenSet_Type, key); if (tmpkey == NULL) return NULL; - result = set_discard_key(so, tmpkey); + rv = set_discard_key(so, tmpkey); Py_DECREF(tmpkey); - return result; + if (rv == -1) + return NULL; } Py_RETURN_NONE; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 19:19:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 30 Oct 2011 19:19:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwMzYz?= =?utf8?q?=3A_Deallocate_global_locks_in_Py=5FFinalize=28=29=2E?= Message-ID: http://hg.python.org/cpython/rev/608975eafe86 changeset: 73205:608975eafe86 branch: 3.2 parent: 73203:b643458a0108 user: Antoine Pitrou date: Sun Oct 30 19:13:55 2011 +0100 summary: Issue #10363: Deallocate global locks in Py_Finalize(). files: Misc/NEWS | 2 ++ Python/import.c | 25 +++++++++++++++---------- Python/pystate.c | 6 ++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #10363: Deallocate global locks in Py_Finalize(). + - Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -252,16 +252,6 @@ Py_DECREF(path_hooks); } -void -_PyImport_Fini(void) -{ - Py_XDECREF(extensions); - extensions = NULL; - PyMem_DEL(_PyImport_Filetab); - _PyImport_Filetab = NULL; -} - - /* Locking primitives to prevent parallel imports of the same module in different threads to return with a partially loaded module. These calls are serialized by the global interpreter lock. */ @@ -374,6 +364,21 @@ return Py_None; } +void +_PyImport_Fini(void) +{ + Py_XDECREF(extensions); + extensions = NULL; + PyMem_DEL(_PyImport_Filetab); + _PyImport_Filetab = NULL; +#ifdef WITH_THREAD + if (import_lock != NULL) { + PyThread_free_lock(import_lock); + import_lock = NULL; + } +#endif +} + static void imp_modules_reloading_clear(void) { diff --git a/Python/pystate.c b/Python/pystate.c --- a/Python/pystate.c +++ b/Python/pystate.c @@ -150,6 +150,12 @@ *p = interp->next; HEAD_UNLOCK(); free(interp); +#ifdef WITH_THREAD + if (interp_head == NULL && head_mutex != NULL) { + PyThread_free_lock(head_mutex); + head_mutex = NULL; + } +#endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 19:19:48 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 30 Oct 2011 19:19:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310363=3A_Deallocate_global_locks_in_Py=5FFinalize?= =?utf8?b?KCku?= Message-ID: http://hg.python.org/cpython/rev/728595c16acd changeset: 73206:728595c16acd parent: 73204:f634102aca01 parent: 73205:608975eafe86 user: Antoine Pitrou date: Sun Oct 30 19:14:46 2011 +0100 summary: Issue #10363: Deallocate global locks in Py_Finalize(). files: Misc/NEWS | 2 ++ Python/import.c | 25 +++++++++++++++---------- Python/pystate.c | 6 ++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Issue #10363: Deallocate global locks in Py_Finalize(). + - Issue #13018: Fix reference leaks in error paths in dictobject.c. Patch by Suman Saha. diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -268,16 +268,6 @@ Py_DECREF(path_hooks); } -void -_PyImport_Fini(void) -{ - Py_XDECREF(extensions); - extensions = NULL; - PyMem_DEL(_PyImport_Filetab); - _PyImport_Filetab = NULL; -} - - /* Locking primitives to prevent parallel imports of the same module in different threads to return with a partially loaded module. These calls are serialized by the global interpreter lock. */ @@ -390,6 +380,21 @@ return Py_None; } +void +_PyImport_Fini(void) +{ + Py_XDECREF(extensions); + extensions = NULL; + PyMem_DEL(_PyImport_Filetab); + _PyImport_Filetab = NULL; +#ifdef WITH_THREAD + if (import_lock != NULL) { + PyThread_free_lock(import_lock); + import_lock = NULL; + } +#endif +} + static void imp_modules_reloading_clear(void) { diff --git a/Python/pystate.c b/Python/pystate.c --- a/Python/pystate.c +++ b/Python/pystate.c @@ -150,6 +150,12 @@ *p = interp->next; HEAD_UNLOCK(); free(interp); +#ifdef WITH_THREAD + if (interp_head == NULL && head_mutex != NULL) { + PyThread_free_lock(head_mutex); + head_mutex = NULL; + } +#endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 19:25:04 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 30 Oct 2011 19:25:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_remove_unused_v?= =?utf8?q?ariable?= Message-ID: http://hg.python.org/cpython/rev/cdd9a97f3d28 changeset: 73207:cdd9a97f3d28 branch: 3.2 parent: 73205:608975eafe86 user: Benjamin Peterson date: Sun Oct 30 14:24:44 2011 -0400 summary: remove unused variable files: Objects/setobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1931,7 +1931,7 @@ static PyObject * set_discard(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; + PyObject *tmpkey; int rv; rv = set_discard_key(so, key); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 19:25:05 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 30 Oct 2011 19:25:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_remove_unused_v?= =?utf8?q?ariable?= Message-ID: http://hg.python.org/cpython/rev/eef42c4f295d changeset: 73208:eef42c4f295d branch: 2.7 parent: 73202:7ddc7b339a8b user: Benjamin Peterson date: Sun Oct 30 14:24:44 2011 -0400 summary: remove unused variable files: Objects/setobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1925,7 +1925,7 @@ static PyObject * set_discard(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; + PyObject *tmpkey; int rv; rv = set_discard_key(so, key); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 19:25:06 2011 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 30 Oct 2011 19:25:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/d4860087f664 changeset: 73209:d4860087f664 parent: 73206:728595c16acd parent: 73207:cdd9a97f3d28 user: Benjamin Peterson date: Sun Oct 30 14:24:59 2011 -0400 summary: merge 3.2 files: Objects/setobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/setobject.c b/Objects/setobject.c --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -1906,7 +1906,7 @@ static PyObject * set_discard(PySetObject *so, PyObject *key) { - PyObject *tmpkey, *result; + PyObject *tmpkey; int rv; rv = set_discard_key(so, key); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:22:57 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 20:22:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_Misc/NEWS_e?= =?utf8?q?ntry_for_issue_=2310519?= Message-ID: http://hg.python.org/cpython/rev/3bda54275817 changeset: 73211:3bda54275817 branch: 2.7 parent: 73208:eef42c4f295d user: Petri Lehtinen date: Sun Oct 30 20:59:10 2011 +0200 summary: Add Misc/NEWS entry for issue #10519 files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #10519: Avoid unnecessary recursive function calls in + setobject.c. + - Issue #13268: Fix the assert statement when a tuple is passed as the message. - Issue #13018: Fix reference leaks in error paths in dictobject.c. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:22:57 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 20:22:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_Misc/NEWS_e?= =?utf8?q?ntry_for_issue_=2310519?= Message-ID: http://hg.python.org/cpython/rev/5c17394b0b95 changeset: 73210:5c17394b0b95 branch: 3.2 parent: 73207:cdd9a97f3d28 user: Petri Lehtinen date: Sun Oct 30 20:59:10 2011 +0200 summary: Add Misc/NEWS entry for issue #10519 files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #10519: Avoid unnecessary recursive function calls in + setobject.c. + - Issue #10363: Deallocate global locks in Py_Finalize(). - Issue #13018: Fix reference leaks in error paths in dictobject.c. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:22:58 2011 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 30 Oct 2011 20:22:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Add_Misc/NEWS_entry_for_issue_=2310519?= Message-ID: http://hg.python.org/cpython/rev/a912ea48dd4c changeset: 73212:a912ea48dd4c parent: 73209:d4860087f664 parent: 73210:5c17394b0b95 user: Petri Lehtinen date: Sun Oct 30 21:18:25 2011 +0200 summary: Add Misc/NEWS entry for issue #10519 files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #10519: Avoid unnecessary recursive function calls in + setobject.c. + - Issue #10363: Deallocate global locks in Py_Finalize(). - Issue #13018: Fix reference leaks in error paths in dictobject.c. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:47 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Closes_=2313291?= =?utf8?q?=3A_NameError_in_xmlrpc_package=2E?= Message-ID: http://hg.python.org/cpython/rev/f3d454b20b35 changeset: 73213:f3d454b20b35 branch: 3.2 parent: 73207:cdd9a97f3d28 user: Florent Xicluna date: Sun Oct 30 20:18:50 2011 +0100 summary: Closes #13291: NameError in xmlrpc package. files: Lib/test/test_xmlrpc.py | 58 ++++++++++++++++++++++++---- Lib/xmlrpc/client.py | 2 +- Lib/xmlrpc/server.py | 7 ++- Misc/NEWS | 2 + 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -66,15 +66,6 @@ (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23')) - def test_cmp_datetime_DateTime(self): - now = datetime.datetime.now() - dt = xmlrpclib.DateTime(now.timetuple()) - self.assertTrue(dt == now) - self.assertTrue(now == dt) - then = now + datetime.timedelta(seconds=4) - self.assertTrue(then >= dt) - self.assertTrue(dt < then) - def test_bug_1164912 (self): d = xmlrpclib.DateTime() ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), @@ -233,6 +224,45 @@ t2 = xmlrpclib._datetime(d) self.assertEqual(t1, tref) + def test_comparison(self): + now = datetime.datetime.now() + dtime = xmlrpclib.DateTime(now.timetuple()) + + # datetime vs. DateTime + self.assertTrue(dtime == now) + self.assertTrue(now == dtime) + then = now + datetime.timedelta(seconds=4) + self.assertTrue(then >= dtime) + self.assertTrue(dtime < then) + + # str vs. DateTime + dstr = now.strftime("%Y%m%dT%H:%M:%S") + self.assertTrue(dtime == dstr) + self.assertTrue(dstr == dtime) + dtime_then = xmlrpclib.DateTime(then.timetuple()) + self.assertTrue(dtime_then >= dstr) + self.assertTrue(dstr < dtime_then) + + # some other types + dbytes = dstr.encode('ascii') + dtuple = now.timetuple() + with self.assertRaises(TypeError): + dtime == 1970 + with self.assertRaises(TypeError): + dtime != dbytes + with self.assertRaises(TypeError): + dtime == bytearray(dbytes) + with self.assertRaises(TypeError): + dtime != dtuple + with self.assertRaises(TypeError): + dtime < float(1970) + with self.assertRaises(TypeError): + dtime > dbytes + with self.assertRaises(TypeError): + dtime <= bytearray(dbytes) + with self.assertRaises(TypeError): + dtime >= dtuple + class BinaryTestCase(unittest.TestCase): # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff" @@ -346,6 +376,10 @@ class MyRequestHandler(requestHandler): rpc_paths = [] + class BrokenDispatcher: + def _marshaled_dispatch(self, data, dispatch_method=None, path=None): + raise RuntimeError("broken dispatcher") + serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler, logRequests=False, bind_and_activate=False) serv.socket.settimeout(3) @@ -366,6 +400,7 @@ d.register_multicall_functions() serv.get_dispatcher(paths[0]).register_function(pow) serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add') + serv.add_dispatcher("/is/broken", BrokenDispatcher()) evt.set() # handle up to 'numrequests' requests @@ -595,11 +630,16 @@ p = xmlrpclib.ServerProxy(URL+"/foo") self.assertEqual(p.pow(6,8), 6**8) self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + def test_path2(self): p = xmlrpclib.ServerProxy(URL+"/foo/bar") self.assertEqual(p.add(6,8), 6+8) self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) + def test_path3(self): + p = xmlrpclib.ServerProxy(URL+"/is/broken") + self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism #does indeed serve subsequent requests on the same connection class BaseKeepaliveServerTestCase(BaseServerTestCase): diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -302,7 +302,7 @@ elif datetime and isinstance(other, datetime.datetime): s = self.value o = other.strftime("%Y%m%dT%H:%M:%S") - elif isinstance(other, (str, unicode)): + elif isinstance(other, str): s = self.value o = other elif hasattr(other, "timetuple"): diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -602,7 +602,7 @@ encoding, bind_and_activate) self.dispatchers = {} self.allow_none = allow_none - self.encoding = encoding + self.encoding = encoding or 'utf-8' def add_dispatcher(self, path, dispatcher): self.dispatchers[path] = dispatcher @@ -620,9 +620,10 @@ # (each dispatcher should have handled their own # exceptions) exc_type, exc_value = sys.exc_info()[:2] - response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)), + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), encoding=self.encoding, allow_none=self.allow_none) + response = response.encode(self.encoding) return response class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -63,6 +63,8 @@ Library ------- +- Issue #13291: NameError in xmlrpc package. + - Issue #13258: Use callable() built-in in the standard library. - Issue #13273: fix a bug that prevented HTMLParser to properly detect some -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:48 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Cleanup_xmlrpc?= =?utf8?q?=3A_remove_obsolete_comments=2C_unused_imports=2E_Add_test_for_b?= =?utf8?q?ytes?= Message-ID: http://hg.python.org/cpython/rev/e88e7ef6b53d changeset: 73214:e88e7ef6b53d branch: 3.2 user: Florent Xicluna date: Sun Oct 30 20:19:32 2011 +0100 summary: Cleanup xmlrpc: remove obsolete comments, unused imports. Add test for bytes marshalling. files: Lib/test/test_xmlrpc.py | 5 ++++- Lib/xmlrpc/client.py | 24 ++++++------------------ Lib/xmlrpc/server.py | 3 +-- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -140,6 +140,9 @@ ('host.tld', [('Authorization', 'Basic dXNlcg==')], {})) + def test_dump_bytes(self): + self.assertRaises(TypeError, xmlrpclib.dumps, (b"my dog has fleas",)) + def test_ssl_presence(self): try: import ssl @@ -177,7 +180,7 @@ self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s) def test_dotted_attribute(self): - # this will raise AttirebuteError because code don't want us to use + # this will raise AttributeError because code don't want us to use # private methods self.assertRaises(AttributeError, xmlrpc.server.resolve_dotted_attribute, str, '__add') diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -85,11 +85,6 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- -# -# things to look into some day: - -# TODO: sort out True/False/boolean issues for Python 2.3 - """ An XML-RPC client interface for Python. @@ -120,8 +115,7 @@ Exported constants: - True - False + (none) Exported functions: @@ -133,7 +127,8 @@ name (None if not present). """ -import re, time, operator +import base64 +import time import http.client from xml.parsers import expat import socket @@ -230,7 +225,7 @@ ## # Indicates an XML-RPC fault response package. This exception is # raised by the unmarshalling layer, if the XML-RPC response contains -# a fault string. This exception can also used as a class, to +# a fault string. This exception can also be used as a class, to # generate a fault XML-RPC message. # # @param faultCode The XML-RPC fault code. @@ -243,10 +238,7 @@ self.faultCode = faultCode self.faultString = faultString def __repr__(self): - return ( - "" % - (self.faultCode, repr(self.faultString)) - ) + return "" % (self.faultCode, self.faultString) # -------------------------------------------------------------------- # Special values @@ -352,7 +344,7 @@ return self.value def __repr__(self): - return "" % (repr(self.value), id(self)) + return "" % (self.value, id(self)) def decode(self, data): self.value = str(data).strip() @@ -378,9 +370,6 @@ # # @param data An 8-bit string containing arbitrary data. -import base64 -import io - class Binary: """Wrapper for binary data.""" @@ -1198,7 +1187,6 @@ auth, host = urllib.parse.splituser(host) if auth: - import base64 auth = urllib.parse.unquote_to_bytes(auth) auth = base64.encodebytes(auth).decode("utf-8") auth = "".join(auth.split()) # get rid of whitespace diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -329,7 +329,6 @@ if method is None: return "" else: - import pydoc return pydoc.getdoc(method) def system_multicall(self, call_list): @@ -560,7 +559,7 @@ Simple XML-RPC server that allows functions and a single instance to be installed to handle requests. The default implementation attempts to dispatch XML-RPC calls to the functions or instance - installed in the server. Override the _dispatch method inhereted + installed in the server. Override the _dispatch method inherited from SimpleXMLRPCDispatcher to change this behavior. """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:49 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:49 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMjkz?= =?utf8?q?=3A_Better_error_message_when_trying_to_marshal_bytes_using?= Message-ID: http://hg.python.org/cpython/rev/013d2881beb5 changeset: 73215:013d2881beb5 branch: 3.2 user: Florent Xicluna date: Sun Oct 30 20:22:25 2011 +0100 summary: Issue #13293: Better error message when trying to marshal bytes using xmlrpc.client. files: Lib/xmlrpc/client.py | 10 +--------- Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -503,9 +503,7 @@ f = self.dispatch[type(value)] except KeyError: # check if this object can be marshalled as a structure - try: - value.__dict__ - except: + if not hasattr(value, '__dict__'): raise TypeError("cannot marshal %s objects" % type(value)) # check if this class is a sub-class of a basic type, # because we don't know how to marshal these types @@ -553,12 +551,6 @@ write("\n") dispatch[float] = dump_double - def dump_string(self, value, write, escape=escape): - write("") - write(escape(value)) - write("\n") - dispatch[bytes] = dump_string - def dump_unicode(self, value, write, escape=escape): write("") write(escape(value)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -63,6 +63,9 @@ Library ------- +- Issue #13293: Better error message when trying to marshal bytes using + xmlrpc.client. + - Issue #13291: NameError in xmlrpc package. - Issue #13258: Use callable() built-in in the standard library. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:49 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/908791916611 changeset: 73216:908791916611 parent: 73209:d4860087f664 parent: 73215:013d2881beb5 user: Florent Xicluna date: Sun Oct 30 20:24:40 2011 +0100 summary: Merge 3.2 files: Lib/test/test_xmlrpc.py | 63 ++++++++++++++++++++++++---- Lib/xmlrpc/client.py | 36 +++------------ Lib/xmlrpc/server.py | 10 ++-- Misc/NEWS | 6 ++ 4 files changed, 72 insertions(+), 43 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -66,15 +66,6 @@ (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23')) - def test_cmp_datetime_DateTime(self): - now = datetime.datetime.now() - dt = xmlrpclib.DateTime(now.timetuple()) - self.assertTrue(dt == now) - self.assertTrue(now == dt) - then = now + datetime.timedelta(seconds=4) - self.assertTrue(then >= dt) - self.assertTrue(dt < then) - def test_bug_1164912 (self): d = xmlrpclib.DateTime() ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), @@ -149,6 +140,9 @@ ('host.tld', [('Authorization', 'Basic dXNlcg==')], {})) + def test_dump_bytes(self): + self.assertRaises(TypeError, xmlrpclib.dumps, (b"my dog has fleas",)) + def test_ssl_presence(self): try: import ssl @@ -186,7 +180,7 @@ self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s) def test_dotted_attribute(self): - # this will raise AttirebuteError because code don't want us to use + # this will raise AttributeError because code don't want us to use # private methods self.assertRaises(AttributeError, xmlrpc.server.resolve_dotted_attribute, str, '__add') @@ -233,6 +227,45 @@ t2 = xmlrpclib._datetime(d) self.assertEqual(t1, tref) + def test_comparison(self): + now = datetime.datetime.now() + dtime = xmlrpclib.DateTime(now.timetuple()) + + # datetime vs. DateTime + self.assertTrue(dtime == now) + self.assertTrue(now == dtime) + then = now + datetime.timedelta(seconds=4) + self.assertTrue(then >= dtime) + self.assertTrue(dtime < then) + + # str vs. DateTime + dstr = now.strftime("%Y%m%dT%H:%M:%S") + self.assertTrue(dtime == dstr) + self.assertTrue(dstr == dtime) + dtime_then = xmlrpclib.DateTime(then.timetuple()) + self.assertTrue(dtime_then >= dstr) + self.assertTrue(dstr < dtime_then) + + # some other types + dbytes = dstr.encode('ascii') + dtuple = now.timetuple() + with self.assertRaises(TypeError): + dtime == 1970 + with self.assertRaises(TypeError): + dtime != dbytes + with self.assertRaises(TypeError): + dtime == bytearray(dbytes) + with self.assertRaises(TypeError): + dtime != dtuple + with self.assertRaises(TypeError): + dtime < float(1970) + with self.assertRaises(TypeError): + dtime > dbytes + with self.assertRaises(TypeError): + dtime <= bytearray(dbytes) + with self.assertRaises(TypeError): + dtime >= dtuple + class BinaryTestCase(unittest.TestCase): # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff" @@ -346,6 +379,10 @@ class MyRequestHandler(requestHandler): rpc_paths = [] + class BrokenDispatcher: + def _marshaled_dispatch(self, data, dispatch_method=None, path=None): + raise RuntimeError("broken dispatcher") + serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler, logRequests=False, bind_and_activate=False) serv.socket.settimeout(3) @@ -366,6 +403,7 @@ d.register_multicall_functions() serv.get_dispatcher(paths[0]).register_function(pow) serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add') + serv.add_dispatcher("/is/broken", BrokenDispatcher()) evt.set() # handle up to 'numrequests' requests @@ -595,11 +633,16 @@ p = xmlrpclib.ServerProxy(URL+"/foo") self.assertEqual(p.pow(6,8), 6**8) self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + def test_path2(self): p = xmlrpclib.ServerProxy(URL+"/foo/bar") self.assertEqual(p.add(6,8), 6+8) self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) + def test_path3(self): + p = xmlrpclib.ServerProxy(URL+"/is/broken") + self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism #does indeed serve subsequent requests on the same connection class BaseKeepaliveServerTestCase(BaseServerTestCase): diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -85,11 +85,6 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- -# -# things to look into some day: - -# TODO: sort out True/False/boolean issues for Python 2.3 - """ An XML-RPC client interface for Python. @@ -120,8 +115,7 @@ Exported constants: - True - False + (none) Exported functions: @@ -133,7 +127,8 @@ name (None if not present). """ -import re, time, operator +import base64 +import time import http.client from xml.parsers import expat import socket @@ -230,7 +225,7 @@ ## # Indicates an XML-RPC fault response package. This exception is # raised by the unmarshalling layer, if the XML-RPC response contains -# a fault string. This exception can also used as a class, to +# a fault string. This exception can also be used as a class, to # generate a fault XML-RPC message. # # @param faultCode The XML-RPC fault code. @@ -243,10 +238,7 @@ self.faultCode = faultCode self.faultString = faultString def __repr__(self): - return ( - "" % - (self.faultCode, repr(self.faultString)) - ) + return "" % (self.faultCode, self.faultString) # -------------------------------------------------------------------- # Special values @@ -302,7 +294,7 @@ elif datetime and isinstance(other, datetime.datetime): s = self.value o = other.strftime("%Y%m%dT%H:%M:%S") - elif isinstance(other, (str, unicode)): + elif isinstance(other, str): s = self.value o = other elif hasattr(other, "timetuple"): @@ -352,7 +344,7 @@ return self.value def __repr__(self): - return "" % (repr(self.value), id(self)) + return "" % (self.value, id(self)) def decode(self, data): self.value = str(data).strip() @@ -378,9 +370,6 @@ # # @param data An 8-bit string containing arbitrary data. -import base64 -import io - class Binary: """Wrapper for binary data.""" @@ -514,9 +503,7 @@ f = self.dispatch[type(value)] except KeyError: # check if this object can be marshalled as a structure - try: - value.__dict__ - except: + if not hasattr(value, '__dict__'): raise TypeError("cannot marshal %s objects" % type(value)) # check if this class is a sub-class of a basic type, # because we don't know how to marshal these types @@ -558,12 +545,6 @@ write("\n") dispatch[float] = dump_double - def dump_string(self, value, write, escape=escape): - write("") - write(escape(value)) - write("\n") - dispatch[bytes] = dump_string - def dump_unicode(self, value, write, escape=escape): write("") write(escape(value)) @@ -1192,7 +1173,6 @@ auth, host = urllib.parse.splituser(host) if auth: - import base64 auth = urllib.parse.unquote_to_bytes(auth) auth = base64.encodebytes(auth).decode("utf-8") auth = "".join(auth.split()) # get rid of whitespace diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -329,7 +329,6 @@ if method is None: return "" else: - import pydoc return pydoc.getdoc(method) def system_multicall(self, call_list): @@ -560,7 +559,7 @@ Simple XML-RPC server that allows functions and a single instance to be installed to handle requests. The default implementation attempts to dispatch XML-RPC calls to the functions or instance - installed in the server. Override the _dispatch method inhereted + installed in the server. Override the _dispatch method inherited from SimpleXMLRPCDispatcher to change this behavior. """ @@ -602,7 +601,7 @@ encoding, bind_and_activate) self.dispatchers = {} self.allow_none = allow_none - self.encoding = encoding + self.encoding = encoding or 'utf-8' def add_dispatcher(self, path, dispatcher): self.dispatchers[path] = dispatcher @@ -620,9 +619,10 @@ # (each dispatcher should have handled their own # exceptions) exc_type, exc_value = sys.exc_info()[:2] - response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)), + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), encoding=self.encoding, allow_none=self.allow_none) + response = response.encode(self.encoding) return response class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -340,9 +340,15 @@ - Issue #12380: The rjust, ljust and center methods of bytes and bytearray now accept a bytearray argument. + Library ------- +- Issue #13293: Better error message when trying to marshal bytes using + xmlrpc.client. + +- Issue #13291: NameError in xmlrpc package. + - Issue #13258: Use callable() built-in in the standard library. - Issue #13273: fix a bug that prevented HTMLParser to properly detect some -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:50 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge_heads?= Message-ID: http://hg.python.org/cpython/rev/0aa52d845caa changeset: 73217:0aa52d845caa parent: 73216:908791916611 parent: 73212:a912ea48dd4c user: Florent Xicluna date: Sun Oct 30 20:25:29 2011 +0100 summary: Merge heads files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #10519: Avoid unnecessary recursive function calls in + setobject.c. + - Issue #10363: Deallocate global locks in Py_Finalize(). - Issue #13018: Fix reference leaks in error paths in dictobject.c. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:26:51 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:26:51 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge_heads?= Message-ID: http://hg.python.org/cpython/rev/d60e48cae52d changeset: 73218:d60e48cae52d branch: 3.2 parent: 73210:5c17394b0b95 parent: 73215:013d2881beb5 user: Florent Xicluna date: Sun Oct 30 20:26:28 2011 +0100 summary: Merge heads files: Lib/test/test_xmlrpc.py | 63 ++++++++++++++++++++++++---- Lib/xmlrpc/client.py | 36 +++------------ Lib/xmlrpc/server.py | 10 ++-- Misc/NEWS | 5 ++ 4 files changed, 71 insertions(+), 43 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -66,15 +66,6 @@ (newdt,), m = xmlrpclib.loads(s, use_datetime=0) self.assertEqual(newdt, xmlrpclib.DateTime('00010210T11:41:23')) - def test_cmp_datetime_DateTime(self): - now = datetime.datetime.now() - dt = xmlrpclib.DateTime(now.timetuple()) - self.assertTrue(dt == now) - self.assertTrue(now == dt) - then = now + datetime.timedelta(seconds=4) - self.assertTrue(then >= dt) - self.assertTrue(dt < then) - def test_bug_1164912 (self): d = xmlrpclib.DateTime() ((new_d,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((d,), @@ -149,6 +140,9 @@ ('host.tld', [('Authorization', 'Basic dXNlcg==')], {})) + def test_dump_bytes(self): + self.assertRaises(TypeError, xmlrpclib.dumps, (b"my dog has fleas",)) + def test_ssl_presence(self): try: import ssl @@ -186,7 +180,7 @@ self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s) def test_dotted_attribute(self): - # this will raise AttirebuteError because code don't want us to use + # this will raise AttributeError because code don't want us to use # private methods self.assertRaises(AttributeError, xmlrpc.server.resolve_dotted_attribute, str, '__add') @@ -233,6 +227,45 @@ t2 = xmlrpclib._datetime(d) self.assertEqual(t1, tref) + def test_comparison(self): + now = datetime.datetime.now() + dtime = xmlrpclib.DateTime(now.timetuple()) + + # datetime vs. DateTime + self.assertTrue(dtime == now) + self.assertTrue(now == dtime) + then = now + datetime.timedelta(seconds=4) + self.assertTrue(then >= dtime) + self.assertTrue(dtime < then) + + # str vs. DateTime + dstr = now.strftime("%Y%m%dT%H:%M:%S") + self.assertTrue(dtime == dstr) + self.assertTrue(dstr == dtime) + dtime_then = xmlrpclib.DateTime(then.timetuple()) + self.assertTrue(dtime_then >= dstr) + self.assertTrue(dstr < dtime_then) + + # some other types + dbytes = dstr.encode('ascii') + dtuple = now.timetuple() + with self.assertRaises(TypeError): + dtime == 1970 + with self.assertRaises(TypeError): + dtime != dbytes + with self.assertRaises(TypeError): + dtime == bytearray(dbytes) + with self.assertRaises(TypeError): + dtime != dtuple + with self.assertRaises(TypeError): + dtime < float(1970) + with self.assertRaises(TypeError): + dtime > dbytes + with self.assertRaises(TypeError): + dtime <= bytearray(dbytes) + with self.assertRaises(TypeError): + dtime >= dtuple + class BinaryTestCase(unittest.TestCase): # XXX What should str(Binary(b"\xff")) return? I'm chosing "\xff" @@ -346,6 +379,10 @@ class MyRequestHandler(requestHandler): rpc_paths = [] + class BrokenDispatcher: + def _marshaled_dispatch(self, data, dispatch_method=None, path=None): + raise RuntimeError("broken dispatcher") + serv = MyXMLRPCServer(("localhost", 0), MyRequestHandler, logRequests=False, bind_and_activate=False) serv.socket.settimeout(3) @@ -366,6 +403,7 @@ d.register_multicall_functions() serv.get_dispatcher(paths[0]).register_function(pow) serv.get_dispatcher(paths[1]).register_function(lambda x,y: x+y, 'add') + serv.add_dispatcher("/is/broken", BrokenDispatcher()) evt.set() # handle up to 'numrequests' requests @@ -595,11 +633,16 @@ p = xmlrpclib.ServerProxy(URL+"/foo") self.assertEqual(p.pow(6,8), 6**8) self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + def test_path2(self): p = xmlrpclib.ServerProxy(URL+"/foo/bar") self.assertEqual(p.add(6,8), 6+8) self.assertRaises(xmlrpclib.Fault, p.pow, 6, 8) + def test_path3(self): + p = xmlrpclib.ServerProxy(URL+"/is/broken") + self.assertRaises(xmlrpclib.Fault, p.add, 6, 8) + #A test case that verifies that a server using the HTTP/1.1 keep-alive mechanism #does indeed serve subsequent requests on the same connection class BaseKeepaliveServerTestCase(BaseServerTestCase): diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -85,11 +85,6 @@ # OF THIS SOFTWARE. # -------------------------------------------------------------------- -# -# things to look into some day: - -# TODO: sort out True/False/boolean issues for Python 2.3 - """ An XML-RPC client interface for Python. @@ -120,8 +115,7 @@ Exported constants: - True - False + (none) Exported functions: @@ -133,7 +127,8 @@ name (None if not present). """ -import re, time, operator +import base64 +import time import http.client from xml.parsers import expat import socket @@ -230,7 +225,7 @@ ## # Indicates an XML-RPC fault response package. This exception is # raised by the unmarshalling layer, if the XML-RPC response contains -# a fault string. This exception can also used as a class, to +# a fault string. This exception can also be used as a class, to # generate a fault XML-RPC message. # # @param faultCode The XML-RPC fault code. @@ -243,10 +238,7 @@ self.faultCode = faultCode self.faultString = faultString def __repr__(self): - return ( - "" % - (self.faultCode, repr(self.faultString)) - ) + return "" % (self.faultCode, self.faultString) # -------------------------------------------------------------------- # Special values @@ -302,7 +294,7 @@ elif datetime and isinstance(other, datetime.datetime): s = self.value o = other.strftime("%Y%m%dT%H:%M:%S") - elif isinstance(other, (str, unicode)): + elif isinstance(other, str): s = self.value o = other elif hasattr(other, "timetuple"): @@ -352,7 +344,7 @@ return self.value def __repr__(self): - return "" % (repr(self.value), id(self)) + return "" % (self.value, id(self)) def decode(self, data): self.value = str(data).strip() @@ -378,9 +370,6 @@ # # @param data An 8-bit string containing arbitrary data. -import base64 -import io - class Binary: """Wrapper for binary data.""" @@ -514,9 +503,7 @@ f = self.dispatch[type(value)] except KeyError: # check if this object can be marshalled as a structure - try: - value.__dict__ - except: + if not hasattr(value, '__dict__'): raise TypeError("cannot marshal %s objects" % type(value)) # check if this class is a sub-class of a basic type, # because we don't know how to marshal these types @@ -564,12 +551,6 @@ write("\n") dispatch[float] = dump_double - def dump_string(self, value, write, escape=escape): - write("") - write(escape(value)) - write("\n") - dispatch[bytes] = dump_string - def dump_unicode(self, value, write, escape=escape): write("") write(escape(value)) @@ -1198,7 +1179,6 @@ auth, host = urllib.parse.splituser(host) if auth: - import base64 auth = urllib.parse.unquote_to_bytes(auth) auth = base64.encodebytes(auth).decode("utf-8") auth = "".join(auth.split()) # get rid of whitespace diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -329,7 +329,6 @@ if method is None: return "" else: - import pydoc return pydoc.getdoc(method) def system_multicall(self, call_list): @@ -560,7 +559,7 @@ Simple XML-RPC server that allows functions and a single instance to be installed to handle requests. The default implementation attempts to dispatch XML-RPC calls to the functions or instance - installed in the server. Override the _dispatch method inhereted + installed in the server. Override the _dispatch method inherited from SimpleXMLRPCDispatcher to change this behavior. """ @@ -602,7 +601,7 @@ encoding, bind_and_activate) self.dispatchers = {} self.allow_none = allow_none - self.encoding = encoding + self.encoding = encoding or 'utf-8' def add_dispatcher(self, path, dispatcher): self.dispatchers[path] = dispatcher @@ -620,9 +619,10 @@ # (each dispatcher should have handled their own # exceptions) exc_type, exc_value = sys.exc_info()[:2] - response = xmlrpclib.dumps( - xmlrpclib.Fault(1, "%s:%s" % (exc_type, exc_value)), + response = dumps( + Fault(1, "%s:%s" % (exc_type, exc_value)), encoding=self.encoding, allow_none=self.allow_none) + response = response.encode(self.encoding) return response class CGIXMLRPCRequestHandler(SimpleXMLRPCDispatcher): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,11 @@ Library ------- +- Issue #13293: Better error message when trying to marshal bytes using + xmlrpc.client. + +- Issue #13291: NameError in xmlrpc package. + - Issue #13258: Use callable() built-in in the standard library. - Issue #13273: fix a bug that prevented HTMLParser to properly detect some -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 20:40:03 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 20:40:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_User-Agent_for_the_xmlr?= =?utf8?q?pc=2Eclient=2C_and_catch_KeyboardInterrupt_for_the?= Message-ID: http://hg.python.org/cpython/rev/197d703fb23e changeset: 73219:197d703fb23e parent: 73217:0aa52d845caa user: Florent Xicluna date: Sun Oct 30 20:39:24 2011 +0100 summary: Fix User-Agent for the xmlrpc.client, and catch KeyboardInterrupt for the standalone xmlrpc.server. files: Lib/xmlrpc/client.py | 7 ++++--- Lib/xmlrpc/server.py | 9 +++++++-- Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -128,6 +128,7 @@ """ import base64 +import sys import time import http.client from xml.parsers import expat @@ -152,7 +153,8 @@ s = s.replace("<", "<") return s.replace(">", ">",) -__version__ = "1.0.1" +# used in User-Agent header sent +__version__ = sys.version[:3] # xmlrpc integer limits MAXINT = 2**31-1 @@ -408,7 +410,6 @@ out.write("\n") encoded = base64.encodebytes(self.data) out.write(encoded.decode('ascii')) - out.write('\n') out.write("\n") def _binary(data): @@ -1079,7 +1080,7 @@ """Handles an HTTP transaction to an XML-RPC server.""" # client identifier (may be overridden) - user_agent = "xmlrpclib.py/%s (by www.pythonware.com)" % __version__ + user_agent = "Python-xmlrpc/%s" % __version__ #if true, we'll request gzip encoding accept_gzip_encoding = True diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -956,8 +956,13 @@ if __name__ == '__main__': - print('Running XML-RPC server on port 8000') server = SimpleXMLRPCServer(("localhost", 8000)) server.register_function(pow) server.register_function(lambda x,y: x+y, 'add') - server.serve_forever() + print('Serving XML-RPC on localhost port 8000') + try: + server.serve_forever() + except KeyboardInterrupt: + print("\nKeyboard interrupt received, exiting.") + server.server_close() + sys.exit(0) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -347,6 +347,9 @@ Library ------- +- Fix the xmlrpc.client user agent to return something similar to + urllib.request user agent: "Python-xmlrpc/3.3". + - Issue #13293: Better error message when trying to marshal bytes using xmlrpc.client. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 21:35:47 2011 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 30 Oct 2011 21:35:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Remove_unstable?= =?utf8?q?_SSL_tests_in_the_absence_of_ssl=2EOP=5FNO=5F=7BSSLv2=2CSSLv3=2C?= =?utf8?q?TLSv1=7D?= Message-ID: http://hg.python.org/cpython/rev/5a080ebd311c changeset: 73220:5a080ebd311c branch: 2.7 parent: 73211:3bda54275817 user: Antoine Pitrou date: Sun Oct 30 21:31:34 2011 +0100 summary: Remove unstable SSL tests in the absence of ssl.OP_NO_{SSLv2,SSLv3,TLSv1} files: Lib/test/test_ssl.py | 14 ++------------ 1 files changed, 2 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -983,6 +983,8 @@ """Connecting to an SSLv2 server with various client options""" if test_support.verbose: sys.stdout.write("\n") + if not hasattr(ssl, 'PROTOCOL_SSLv2'): + self.skipTest("PROTOCOL_SSLv2 needed") try_protocol_combo(ssl.PROTOCOL_SSLv2, ssl.PROTOCOL_SSLv2, True) try_protocol_combo(ssl.PROTOCOL_SSLv2, ssl.PROTOCOL_SSLv2, True, ssl.CERT_OPTIONAL) try_protocol_combo(ssl.PROTOCOL_SSLv2, ssl.PROTOCOL_SSLv2, True, ssl.CERT_REQUIRED) @@ -995,14 +997,6 @@ """Connecting to an SSLv23 server with various client options""" if test_support.verbose: sys.stdout.write("\n") - try: - try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv2, True) - except (ssl.SSLError, socket.error), x: - # this fails on some older versions of OpenSSL (0.9.7l, for instance) - if test_support.verbose: - sys.stdout.write( - " SSL2 client to SSL23 server test unexpectedly failed:\n %s\n" - % str(x)) try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv3, True) try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_SSLv23, True) try_protocol_combo(ssl.PROTOCOL_SSLv23, ssl.PROTOCOL_TLSv1, True) @@ -1025,8 +1019,6 @@ try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv3, True, ssl.CERT_REQUIRED) if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv2, False) - try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_SSLv23, False, - client_options=ssl.OP_NO_SSLv3) try_protocol_combo(ssl.PROTOCOL_SSLv3, ssl.PROTOCOL_TLSv1, False) @skip_if_broken_ubuntu_ssl @@ -1040,8 +1032,6 @@ if hasattr(ssl, 'PROTOCOL_SSLv2'): try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv2, False) try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv3, False) - try_protocol_combo(ssl.PROTOCOL_TLSv1, ssl.PROTOCOL_SSLv23, False, - client_options=ssl.OP_NO_TLSv1) def test_starttls(self): """Switching from clear text to encrypted and back again.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 22:29:17 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 22:29:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue_13274=3A_?= =?utf8?q?_Make_the_pure_python_code_for_heapq_more_closely_match_the_C?= Message-ID: http://hg.python.org/cpython/rev/57f73b0f921c changeset: 73221:57f73b0f921c branch: 2.7 user: Raymond Hettinger date: Sun Oct 30 14:29:06 2011 -0700 summary: Issue 13274: Make the pure python code for heapq more closely match the C implementation for an undefined corner case. files: Lib/heapq.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/heapq.py b/Lib/heapq.py --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -193,6 +193,8 @@ Equivalent to: sorted(iterable, reverse=True)[:n] """ + if n < 0: + return [] it = iter(iterable) result = list(islice(it, n)) if not result: @@ -209,6 +211,8 @@ Equivalent to: sorted(iterable)[:n] """ + if n < 0: + return [] if hasattr(iterable, '__len__') and n * 10 <= len(iterable): # For smaller values of n, the bisect method is faster than a minheap. # It is also memory efficient, consuming only n elements of space. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 22:33:52 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 22:33:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_13274=3A_?= =?utf8?q?_Make_the_pure_python_code_for_heapq_more_closely_match_the_C?= Message-ID: http://hg.python.org/cpython/rev/155e57a449b5 changeset: 73222:155e57a449b5 branch: 3.2 parent: 73218:d60e48cae52d user: Raymond Hettinger date: Sun Oct 30 14:32:54 2011 -0700 summary: Issue 13274: Make the pure python code for heapq more closely match the C implementation for an undefined corner case. files: Lib/heapq.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/heapq.py b/Lib/heapq.py --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -185,6 +185,8 @@ Equivalent to: sorted(iterable, reverse=True)[:n] """ + if n < 0: + return [] it = iter(iterable) result = list(islice(it, n)) if not result: @@ -201,6 +203,8 @@ Equivalent to: sorted(iterable)[:n] """ + if n < 0: + return [] if hasattr(iterable, '__len__') and n * 10 <= len(iterable): # For smaller values of n, the bisect method is faster than a minheap. # It is also memory efficient, consuming only n elements of space. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 22:33:53 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 22:33:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/e475064fd1ed changeset: 73223:e475064fd1ed parent: 73219:197d703fb23e parent: 73222:155e57a449b5 user: Raymond Hettinger date: Sun Oct 30 14:33:31 2011 -0700 summary: Merge files: Lib/heapq.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/heapq.py b/Lib/heapq.py --- a/Lib/heapq.py +++ b/Lib/heapq.py @@ -185,6 +185,8 @@ Equivalent to: sorted(iterable, reverse=True)[:n] """ + if n < 0: + return [] it = iter(iterable) result = list(islice(it, n)) if not result: @@ -201,6 +203,8 @@ Equivalent to: sorted(iterable)[:n] """ + if n < 0: + return [] if hasattr(iterable, '__len__') and n * 10 <= len(iterable): # For smaller values of n, the bisect method is faster than a minheap. # It is also memory efficient, consuming only n elements of space. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 22:53:26 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 22:53:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Improve_itertoo?= =?utf8?q?ls_docs_with_clearer_examples_of_pure_python_equivalent_code=2E?= Message-ID: http://hg.python.org/cpython/rev/b0065b9087ef changeset: 73224:b0065b9087ef branch: 2.7 parent: 73221:57f73b0f921c user: Raymond Hettinger date: Sun Oct 30 14:53:17 2011 -0700 summary: Improve itertools docs with clearer examples of pure python equivalent code. files: Doc/library/itertools.rst | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -433,9 +433,9 @@ def izip(*iterables): # izip('ABCD', 'xy') --> Ax By - iterables = map(iter, iterables) - while iterables: - yield tuple(map(next, iterables)) + iterators = map(iter, iterables) + while iterators: + yield tuple(map(next, iterators)) .. versionchanged:: 2.4 When no iterables are specified, returns a zero length iterator instead of @@ -456,17 +456,24 @@ iterables are of uneven length, missing values are filled-in with *fillvalue*. Iteration continues until the longest iterable is exhausted. Equivalent to:: + class ZipExhausted(Exception): + pass + def izip_longest(*args, **kwds): # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- fillvalue = kwds.get('fillvalue') - def sentinel(counter = ([fillvalue]*(len(args)-1)).pop): - yield counter() # yields the fillvalue, or raises IndexError + counter = [len(args) - 1] + def sentinel(): + if not counter[0]: + raise ZipExhausted + counter[0] -= 1 + yield fillvalue fillers = repeat(fillvalue) - iters = [chain(it, sentinel(), fillers) for it in args] + iterators = [chain(it, sentinel(), fillers) for it in args] try: - for tup in izip(*iters): - yield tup - except IndexError: + while iterators: + yield tuple(map(next, iterators)) + except ZipExhausted: pass If one of the iterables is potentially infinite, then the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 23:07:09 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 23:07:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improve_itertoo?= =?utf8?q?ls_docs_with_clearer_examples_of_pure_python_equivalent_code=2E?= Message-ID: http://hg.python.org/cpython/rev/0effb28d52e2 changeset: 73225:0effb28d52e2 branch: 3.2 parent: 73222:155e57a449b5 user: Raymond Hettinger date: Sun Oct 30 15:06:14 2011 -0700 summary: Improve itertools docs with clearer examples of pure python equivalent code. files: Doc/library/functions.rst | 6 +++--- Doc/library/itertools.rst | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1367,10 +1367,10 @@ def zip(*iterables): # zip('ABCD', 'xy') --> Ax By sentinel = object() - iterables = [iter(it) for it in iterables] - while iterables: + iterators = [iter(it) for it in iterables] + while iterators: result = [] - for it in iterables: + for it in iterators: elem = next(it, sentinel) if elem is sentinel: return diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -557,16 +557,25 @@ iterables are of uneven length, missing values are filled-in with *fillvalue*. Iteration continues until the longest iterable is exhausted. Equivalent to:: - def zip_longest(*args, fillvalue=None): + class ZipExhausted(Exception): + pass + + def zip_longest(*args, **kwds): # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- - def sentinel(counter = ([fillvalue]*(len(args)-1)).pop): - yield counter() # yields the fillvalue, or raises IndexError + fillvalue = kwds.get('fillvalue') + counter = len(args) - 1 + def sentinel(): + nonlocal counter + if not counter: + raise ZipExhausted + counter -= 1 + yield fillvalue fillers = repeat(fillvalue) - iters = [chain(it, sentinel(), fillers) for it in args] + iterators = [chain(it, sentinel(), fillers) for it in args] try: - for tup in zip(*iters): - yield tup - except IndexError: + while iterators: + yield tuple(map(next, iterators)) + except ZipExhausted: pass If one of the iterables is potentially infinite, then the :func:`zip_longest` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 23:07:10 2011 From: python-checkins at python.org (raymond.hettinger) Date: Sun, 30 Oct 2011 23:07:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/9ab4b5b63f4b changeset: 73226:9ab4b5b63f4b parent: 73223:e475064fd1ed parent: 73225:0effb28d52e2 user: Raymond Hettinger date: Sun Oct 30 15:07:01 2011 -0700 summary: Merge files: Doc/library/functions.rst | 6 +++--- Doc/library/itertools.rst | 23 ++++++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1375,10 +1375,10 @@ def zip(*iterables): # zip('ABCD', 'xy') --> Ax By sentinel = object() - iterables = [iter(it) for it in iterables] - while iterables: + iterators = [iter(it) for it in iterables] + while iterators: result = [] - for it in iterables: + for it in iterators: elem = next(it, sentinel) if elem is sentinel: return diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -595,16 +595,25 @@ iterables are of uneven length, missing values are filled-in with *fillvalue*. Iteration continues until the longest iterable is exhausted. Equivalent to:: - def zip_longest(*args, fillvalue=None): + class ZipExhausted(Exception): + pass + + def zip_longest(*args, **kwds): # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D- - def sentinel(counter = ([fillvalue]*(len(args)-1)).pop): - yield counter() # yields the fillvalue, or raises IndexError + fillvalue = kwds.get('fillvalue') + counter = len(args) - 1 + def sentinel(): + nonlocal counter + if not counter: + raise ZipExhausted + counter -= 1 + yield fillvalue fillers = repeat(fillvalue) - iters = [chain(it, sentinel(), fillers) for it in args] + iterators = [chain(it, sentinel(), fillers) for it in args] try: - for tup in zip(*iters): - yield tup - except IndexError: + while iterators: + yield tuple(map(next, iterators)) + except ZipExhausted: pass If one of the iterables is potentially infinite, then the :func:`zip_longest` -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 23:51:51 2011 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 30 Oct 2011 23:51:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Port_import=5Fmodule=5Fleve?= =?utf8?q?l_to_Unicode_API=2E?= Message-ID: http://hg.python.org/cpython/rev/941c67762fd8 changeset: 73227:941c67762fd8 user: Martin v. L?wis date: Sun Oct 30 23:50:02 2011 +0100 summary: Port import_module_level to Unicode API. files: Python/import.c | 170 +++++++++++++---------------------- 1 files changed, 64 insertions(+), 106 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -2753,8 +2753,7 @@ int level); static PyObject *load_next(PyObject *mod, PyObject *altmod, PyObject *inputname, PyObject **p_outputname, - Py_UCS4 *buf, Py_ssize_t *p_buflen, - Py_ssize_t bufsize); + PyObject **p_prefix); static int mark_miss(PyObject *name); static int ensure_fromlist(PyObject *mod, PyObject *fromlist, PyObject *buf, int recursive); @@ -2767,11 +2766,11 @@ import_module_level(PyObject *name, PyObject *globals, PyObject *locals, PyObject *fromlist, int level) { - Py_UCS4 buf[MAXPATHLEN+1]; - Py_ssize_t buflen; - Py_ssize_t bufsize = MAXPATHLEN+1; - PyObject *parent, *head, *next, *tail, *inputname, *outputname; - PyObject *parent_name, *ensure_name; + PyObject *parent, *next, *inputname, *outputname; + PyObject *head = NULL; + PyObject *tail = NULL; + PyObject *prefix = NULL; + PyObject *result = NULL; Py_ssize_t sep, altsep; if (PyUnicode_READY(name)) @@ -2794,26 +2793,18 @@ return NULL; } - parent = get_parent(globals, &parent_name, level); + parent = get_parent(globals, &prefix, level); if (parent == NULL) { return NULL; } - if (PyUnicode_READY(parent_name)) + if (PyUnicode_READY(prefix)) return NULL; - buflen = PyUnicode_GET_LENGTH(parent_name); - if (!PyUnicode_AsUCS4(parent_name, buf, Py_ARRAY_LENGTH(buf), 1)) { - Py_DECREF(parent_name); - PyErr_SetString(PyExc_ValueError, - "Module name too long"); - return NULL; - } - Py_DECREF(parent_name); head = load_next(parent, level < 0 ? Py_None : parent, name, &outputname, - buf, &buflen, bufsize); + &prefix); if (head == NULL) - return NULL; + goto out; tail = head; Py_INCREF(tail); @@ -2822,13 +2813,11 @@ while (1) { inputname = outputname; next = load_next(tail, tail, inputname, &outputname, - buf, &buflen, bufsize); - Py_DECREF(tail); - Py_DECREF(inputname); - if (next == NULL) { - Py_DECREF(head); - return NULL; - } + &prefix); + Py_CLEAR(tail); + Py_CLEAR(inputname); + if (next == NULL) + goto out; tail = next; if (outputname == NULL) { @@ -2840,10 +2829,8 @@ /* If tail is Py_None, both get_parent and load_next found an empty module name: someone called __import__("") or doctored faulty bytecode */ - Py_DECREF(tail); - Py_DECREF(head); PyErr_SetString(PyExc_ValueError, "Empty module name"); - return NULL; + goto out; } if (fromlist != NULL) { @@ -2852,26 +2839,21 @@ } if (fromlist == NULL) { - Py_DECREF(tail); - return head; + result = head; + Py_INCREF(result); + goto out; } - Py_DECREF(head); - - ensure_name = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - buf, Py_UCS4_strlen(buf)); - if (ensure_name == NULL) { - Py_DECREF(tail); - return NULL; - } - if (!ensure_fromlist(tail, fromlist, ensure_name, 0)) { - Py_DECREF(tail); - Py_DECREF(ensure_name); - return NULL; - } - Py_DECREF(ensure_name); - - return tail; + if (!ensure_fromlist(tail, fromlist, prefix, 0)) + goto out; + + result = tail; + Py_INCREF(result); + out: + Py_XDECREF(head); + Py_XDECREF(tail); + Py_XDECREF(prefix); + return result; } PyObject * @@ -3083,91 +3065,67 @@ static PyObject * load_next(PyObject *mod, PyObject *altmod, PyObject *inputname, PyObject **p_outputname, - Py_UCS4 *buf, Py_ssize_t *p_buflen, Py_ssize_t bufsize) + PyObject **p_prefix) { - Py_UCS4 *dot; + Py_ssize_t dot; Py_ssize_t len; - Py_UCS4 *p; - PyObject *fullname, *name, *result, *mark_name; - Py_UCS4 *nameuni; + PyObject *fullname, *name = NULL, *result; *p_outputname = NULL; - if (PyUnicode_GET_LENGTH(inputname) == 0) { + len = PyUnicode_GET_LENGTH(inputname); + if (len == 0) { /* completely empty module name should only happen in 'from . import' (or '__import__("")')*/ Py_INCREF(mod); return mod; } - nameuni = PyUnicode_AsUCS4Copy(inputname); - if (nameuni == NULL) - return NULL; - - dot = Py_UCS4_strchr(nameuni, '.'); - if (dot != NULL) { - len = dot - nameuni; + + dot = PyUnicode_FindChar(inputname, '.', 0, len, 1); + if (dot >= 0) { + len = dot; if (len == 0) { PyErr_SetString(PyExc_ValueError, "Empty module name"); goto error; } } - else - len = PyUnicode_GET_LENGTH(inputname); - - if (*p_buflen+len+1 >= bufsize) { - PyErr_SetString(PyExc_ValueError, - "Module name too long"); + + /* name = inputname[:len] */ + name = PyUnicode_Substring(inputname, 0, len); + if (name == NULL) goto error; + + if (PyUnicode_GET_LENGTH(*p_prefix)) { + /* fullname = prefix + "." + name */ + fullname = PyUnicode_FromFormat("%U.%U", *p_prefix, name); + if (fullname == NULL) + goto error; } - - p = buf + *p_buflen; - if (p != buf) { - *p++ = '.'; - *p_buflen += 1; + else { + fullname = name; + Py_INCREF(fullname); } - Py_UCS4_strncpy(p, nameuni, len); - p[len] = '\0'; - *p_buflen += len; - - fullname = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - buf, *p_buflen); - if (fullname == NULL) - goto error; - name = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - p, len); - if (name == NULL) { - Py_DECREF(fullname); - goto error; - } + result = import_submodule(mod, name, fullname); - Py_DECREF(fullname); + Py_DECREF(*p_prefix); + /* Transfer reference. */ + *p_prefix = fullname; if (result == Py_None && altmod != mod) { Py_DECREF(result); /* Here, altmod must be None and mod must not be None */ result = import_submodule(altmod, name, name); - Py_DECREF(name); if (result != NULL && result != Py_None) { - mark_name = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - buf, *p_buflen); - if (mark_name == NULL) { + if (mark_miss(*p_prefix) != 0) { Py_DECREF(result); goto error; } - if (mark_miss(mark_name) != 0) { - Py_DECREF(result); - Py_DECREF(mark_name); - goto error; - } - Py_DECREF(mark_name); - Py_UCS4_strncpy(buf, nameuni, len); - buf[len] = '\0'; - *p_buflen = len; + Py_DECREF(*p_prefix); + *p_prefix = name; + Py_INCREF(*p_prefix); } } - else - Py_DECREF(name); if (result == NULL) goto error; @@ -3178,20 +3136,20 @@ goto error; } - if (dot != NULL) { - *p_outputname = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - dot+1, Py_UCS4_strlen(dot+1)); + if (dot >= 0) { + *p_outputname = PyUnicode_Substring(inputname, dot+1, + PyUnicode_GET_LENGTH(inputname)); if (*p_outputname == NULL) { Py_DECREF(result); goto error; } } - PyMem_Free(nameuni); + Py_DECREF(name); return result; error: - PyMem_Free(nameuni); + Py_XDECREF(name); return NULL; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Oct 30 23:54:29 2011 From: python-checkins at python.org (florent.xicluna) Date: Sun, 30 Oct 2011 23:54:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Let=27s_assume_that_the_dat?= =?utf8?q?etime_module_is_always_available=2E?= Message-ID: http://hg.python.org/cpython/rev/2096158376e5 changeset: 73228:2096158376e5 user: Florent Xicluna date: Sun Oct 30 23:54:17 2011 +0100 summary: Let's assume that the datetime module is always available. files: Lib/xmlrpc/client.py | 33 +++++++++---------------------- 1 files changed, 10 insertions(+), 23 deletions(-) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -130,6 +130,7 @@ import base64 import sys import time +from datetime import datetime import http.client from xml.parsers import expat import socket @@ -143,11 +144,6 @@ # -------------------------------------------------------------------- # Internal stuff -try: - import datetime -except ImportError: - datetime = None - def escape(s): s = s.replace("&", "&") s = s.replace("<", "<") @@ -264,11 +260,8 @@ # tuple, or a integer time value. def _strftime(value): - if datetime: - if isinstance(value, datetime.datetime): - return "%04d%02d%02dT%02d:%02d:%02d" % ( - value.year, value.month, value.day, - value.hour, value.minute, value.second) + if isinstance(value, datetime): + return value.strftime("%Y%m%dT%H:%M:%S") if not isinstance(value, (tuple, time.struct_time)): if value == 0: @@ -293,7 +286,7 @@ if isinstance(other, DateTime): s = self.value o = other.value - elif datetime and isinstance(other, datetime.datetime): + elif isinstance(other, datetime): s = self.value o = other.strftime("%Y%m%dT%H:%M:%S") elif isinstance(other, str): @@ -363,8 +356,7 @@ return value def _datetime_type(data): - t = time.strptime(data, "%Y%m%dT%H:%M:%S") - return datetime.datetime(*tuple(t)[:6]) + return datetime.strptime(data, "%Y%m%dT%H:%M:%S") ## # Wrapper for binary data. This can be used to transport any kind @@ -584,12 +576,11 @@ del self.memo[i] dispatch[dict] = dump_struct - if datetime: - def dump_datetime(self, value, write): - write("") - write(_strftime(value)) - write("\n") - dispatch[datetime.datetime] = dump_datetime + def dump_datetime(self, value, write): + write("") + write(_strftime(value)) + write("\n") + dispatch[datetime] = dump_datetime def dump_instance(self, value, write): # check for special wrappers @@ -632,8 +623,6 @@ self._encoding = "utf-8" self.append = self._stack.append self._use_datetime = use_datetime - if use_datetime and not datetime: - raise ValueError("the datetime module is not available") def close(self): # return response tuple and target method @@ -862,8 +851,6 @@ Create an instance of the fastest available parser, and attach it to an unmarshalling object. Return both objects. """ - if use_datetime and not datetime: - raise ValueError("the datetime module is not available") if FastParser and FastUnmarshaller: if use_datetime: mkdatetime = _datetime_type -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 02:44:15 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 02:44:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_caught_is_the_r?= =?utf8?q?ight_pp_of_catch=3B_thanks_to_Don_Bennett_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/b7e966b7c880 changeset: 73229:b7e966b7c880 branch: 2.7 parent: 73224:b0065b9087ef user: Sandro Tosi date: Mon Oct 31 02:40:26 2011 +0100 summary: caught is the right pp of catch; thanks to Don Bennett from docs@ files: Doc/includes/sqlite3/ctx_manager.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/includes/sqlite3/ctx_manager.py b/Doc/includes/sqlite3/ctx_manager.py --- a/Doc/includes/sqlite3/ctx_manager.py +++ b/Doc/includes/sqlite3/ctx_manager.py @@ -8,7 +8,7 @@ con.execute("insert into person(firstname) values (?)", ("Joe",)) # con.rollback() is called after the with block finishes with an exception, the -# exception is still raised and must be catched +# exception is still raised and must be caught try: with con: con.execute("insert into person(firstname) values (?)", ("Joe",)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 02:44:16 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 02:44:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_caught_is_the_r?= =?utf8?q?ight_pp_of_catch=3B_thanks_to_Don_Bennett_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/bc16d1300ee1 changeset: 73230:bc16d1300ee1 branch: 3.2 parent: 73225:0effb28d52e2 user: Sandro Tosi date: Mon Oct 31 02:41:06 2011 +0100 summary: caught is the right pp of catch; thanks to Don Bennett from docs@ files: Doc/includes/sqlite3/ctx_manager.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/includes/sqlite3/ctx_manager.py b/Doc/includes/sqlite3/ctx_manager.py --- a/Doc/includes/sqlite3/ctx_manager.py +++ b/Doc/includes/sqlite3/ctx_manager.py @@ -8,7 +8,7 @@ con.execute("insert into person(firstname) values (?)", ("Joe",)) # con.rollback() is called after the with block finishes with an exception, the -# exception is still raised and must be catched +# exception is still raised and must be caught try: with con: con.execute("insert into person(firstname) values (?)", ("Joe",)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 02:44:16 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 02:44:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/66c16de4ab9d changeset: 73231:66c16de4ab9d parent: 73228:2096158376e5 parent: 73230:bc16d1300ee1 user: Sandro Tosi date: Mon Oct 31 02:42:06 2011 +0100 summary: merge with 3.2 files: Doc/includes/sqlite3/ctx_manager.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/includes/sqlite3/ctx_manager.py b/Doc/includes/sqlite3/ctx_manager.py --- a/Doc/includes/sqlite3/ctx_manager.py +++ b/Doc/includes/sqlite3/ctx_manager.py @@ -8,7 +8,7 @@ con.execute("insert into person(firstname) values (?)", ("Joe",)) # con.rollback() is called after the with block finishes with an exception, the -# exception is still raised and must be catched +# exception is still raised and must be caught try: with con: con.execute("insert into person(firstname) values (?)", ("Joe",)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 04:06:22 2011 From: python-checkins at python.org (ned.deily) Date: Mon, 31 Oct 2011 04:06:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue_13296=3A_?= =?utf8?q?Fix_IDLE_to_clear_compile_=5F=5Ffuture=5F=5F_flags_on_shell_rest?= =?utf8?q?art=2E?= Message-ID: http://hg.python.org/cpython/rev/87251608cb64 changeset: 73232:87251608cb64 branch: 2.7 parent: 73229:b7e966b7c880 user: Ned Deily date: Sun Oct 30 19:58:04 2011 -0700 summary: Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) files: Lib/idlelib/PyShell.py | 2 ++ Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -344,6 +344,7 @@ self.restarting = False self.subprocess_arglist = None self.port = PORT + self.original_compiler_flags = self.compile.compiler.flags rpcclt = None rpcpid = None @@ -459,6 +460,7 @@ gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt) # reload remote debugger breakpoints for all PyShellEditWindows debug.load_breakpoints() + self.compile.compiler.flags = self.original_compiler_flags self.restarting = False return self.rpcclt diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,9 @@ Library ------- +- Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. + (Patch by Roger Serwy) + - Issue #7334: close source files on ElementTree.parse and iterparse. - Issue #13232: logging: Improved logging of exceptions in the presence of -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 04:06:22 2011 From: python-checkins at python.org (ned.deily) Date: Mon, 31 Oct 2011 04:06:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_13296=3A_?= =?utf8?q?Fix_IDLE_to_clear_compile_=5F=5Ffuture=5F=5F_flags_on_shell_rest?= =?utf8?q?art=2E?= Message-ID: http://hg.python.org/cpython/rev/9fbf79d6be56 changeset: 73233:9fbf79d6be56 branch: 3.2 parent: 73230:bc16d1300ee1 user: Ned Deily date: Sun Oct 30 20:01:35 2011 -0700 summary: Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) files: Lib/idlelib/PyShell.py | 2 ++ Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -340,6 +340,7 @@ self.restarting = False self.subprocess_arglist = None self.port = PORT + self.original_compiler_flags = self.compile.compiler.flags rpcclt = None rpcsubproc = None @@ -447,6 +448,7 @@ gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt) # reload remote debugger breakpoints for all PyShellEditWindows debug.load_breakpoints() + self.compile.compiler.flags = self.original_compiler_flags self.restarting = False return self.rpcclt diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,9 @@ Library ------- +- Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. + (Patch by Roger Serwy) + - Issue #13293: Better error message when trying to marshal bytes using xmlrpc.client. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 04:06:23 2011 From: python-checkins at python.org (ned.deily) Date: Mon, 31 Oct 2011 04:06:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_13296=3A_Fix_IDLE_to_clear_compile_=5F=5Ffuture=5F=5F_?= =?utf8?q?flags_on_shell_restart=2E?= Message-ID: http://hg.python.org/cpython/rev/d8acd4344ce9 changeset: 73234:d8acd4344ce9 parent: 73231:66c16de4ab9d parent: 73233:9fbf79d6be56 user: Ned Deily date: Sun Oct 30 20:05:30 2011 -0700 summary: Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) files: Lib/idlelib/PyShell.py | 2 ++ Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -340,6 +340,7 @@ self.restarting = False self.subprocess_arglist = None self.port = PORT + self.original_compiler_flags = self.compile.compiler.flags rpcclt = None rpcsubproc = None @@ -447,6 +448,7 @@ gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt) # reload remote debugger breakpoints for all PyShellEditWindows debug.load_breakpoints() + self.compile.compiler.flags = self.original_compiler_flags self.restarting = False return self.rpcclt diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -347,6 +347,9 @@ Library ------- +- Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. + (Patch by Roger Serwy) + - Fix the xmlrpc.client user agent to return something similar to urllib.request user agent: "Python-xmlrpc/3.3". -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Oct 31 05:26:43 2011 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 31 Oct 2011 05:26:43 +0100 Subject: [Python-checkins] Daily reference leaks (66c16de4ab9d): sum=0 Message-ID: results for 66c16de4ab9d on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7A0Fr2', '-x'] From python-checkins at python.org Mon Oct 31 08:33:45 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 08:33:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Replace_Py=5FUCS4=5F_API_wi?= =?utf8?q?th_Unicode_API=2E?= Message-ID: http://hg.python.org/cpython/rev/6d19a7c713a8 changeset: 73235:6d19a7c713a8 user: Martin v. L?wis date: Mon Oct 31 08:33:37 2011 +0100 summary: Replace Py_UCS4_ API with Unicode API. files: Modules/zipimport.c | 220 +++++++++++++------------------ 1 files changed, 90 insertions(+), 130 deletions(-) diff --git a/Modules/zipimport.c b/Modules/zipimport.c --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -63,115 +63,110 @@ static int zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds) { - PyObject *pathobj, *files; - Py_UCS4 *path, *p, *prefix, buf[MAXPATHLEN+2]; - Py_ssize_t len; + PyObject *path, *files, *tmp; + PyObject *filename = NULL; + Py_ssize_t len, flen; +#ifdef ALTSEP + _Py_IDENTIFIER(replace); +#endif if (!_PyArg_NoKeywords("zipimporter()", kwds)) return -1; if (!PyArg_ParseTuple(args, "O&:zipimporter", - PyUnicode_FSDecoder, &pathobj)) + PyUnicode_FSDecoder, &path)) return -1; - if (PyUnicode_READY(pathobj) == -1) + if (PyUnicode_READY(path) == -1) return -1; - /* copy path to buf */ - len = PyUnicode_GET_LENGTH(pathobj); + len = PyUnicode_GET_LENGTH(path); if (len == 0) { PyErr_SetString(ZipImportError, "archive path is empty"); goto error; } - if (len >= MAXPATHLEN) { - PyErr_SetString(ZipImportError, - "archive path too long"); - goto error; - } - if (!PyUnicode_AsUCS4(pathobj, buf, Py_ARRAY_LENGTH(buf), 1)) - goto error; #ifdef ALTSEP - for (p = buf; *p; p++) { - if (*p == ALTSEP) - *p = SEP; - } + tmp = PyObject_CallMethodId(path, &PyId_replace, "CC", + ALTSEP, SEP); + if (!tmp) + goto error; + Py_DECREF(path); + path = tmp; #endif - path = NULL; - prefix = NULL; + filename = path; + Py_INCREF(filename); + flen = len; for (;;) { struct stat statbuf; int rv; - if (pathobj == NULL) { - pathobj = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - buf, len); - if (pathobj == NULL) - goto error; - } - rv = _Py_stat(pathobj, &statbuf); + rv = _Py_stat(filename, &statbuf); if (rv == 0) { /* it exists */ - if (S_ISREG(statbuf.st_mode)) - /* it's a file */ - path = buf; + if (!S_ISREG(statbuf.st_mode)) + /* it's a not file */ + Py_CLEAR(filename); break; } else if (PyErr_Occurred()) goto error; + Py_CLEAR(filename); /* back up one path element */ - p = Py_UCS4_strrchr(buf, SEP); - if (prefix != NULL) - *prefix = SEP; - if (p == NULL) + flen = PyUnicode_FindChar(path, SEP, 0, flen, -1); + if (flen == -1) break; - *p = '\0'; - len = p - buf; - prefix = p; - Py_CLEAR(pathobj); + filename = PyUnicode_Substring(path, 0, flen); } - if (path == NULL) { + if (filename == NULL) { PyErr_SetString(ZipImportError, "not a Zip file"); goto error; } - files = PyDict_GetItem(zip_directory_cache, pathobj); + if (PyUnicode_READY(filename) < 0) + goto error; + + files = PyDict_GetItem(zip_directory_cache, filename); if (files == NULL) { - files = read_directory(pathobj); + files = read_directory(filename); if (files == NULL) goto error; - if (PyDict_SetItem(zip_directory_cache, pathobj, files) != 0) + if (PyDict_SetItem(zip_directory_cache, filename, files) != 0) goto error; } else Py_INCREF(files); self->files = files; - self->archive = pathobj; - pathobj = NULL; + /* Transfer reference */ + self->archive = filename; + filename = NULL; - if (prefix != NULL) { - prefix++; - len = Py_UCS4_strlen(prefix); - if (prefix[len-1] != SEP) { + /* Check if there is a prefix directory following the filename. */ + if (flen != len) { + tmp = PyUnicode_Substring(path, flen+1, + PyUnicode_GET_LENGTH(path)); + if (tmp == NULL) + goto error; + self->prefix = tmp; + if (PyUnicode_READ_CHAR(path, len-1) != SEP) { /* add trailing SEP */ - prefix[len] = SEP; - prefix[len + 1] = '\0'; - len++; + tmp = PyUnicode_FromFormat("%U%c", self->prefix, SEP); + if (tmp == NULL) + goto error; + Py_DECREF(self->prefix); + self->prefix = tmp; } } else - len = 0; - self->prefix = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - prefix, len); - if (self->prefix == NULL) - goto error; - + self->prefix = PyUnicode_New(0, 0); + Py_DECREF(path); return 0; error: - Py_XDECREF(pathobj); + Py_DECREF(path); + Py_XDECREF(filename); return -1; } @@ -211,26 +206,16 @@ static PyObject * get_subname(PyObject *fullname) { - Py_ssize_t len; - Py_UCS4 *subname, *fullname_ucs4; - fullname_ucs4 = PyUnicode_AsUCS4Copy(fullname); - if (!fullname_ucs4) + Py_ssize_t len, dot; + if (PyUnicode_READY(fullname) < 0) return NULL; - subname = Py_UCS4_strrchr(fullname_ucs4, '.'); - if (subname == NULL) { - PyMem_Free(fullname_ucs4); + len = PyUnicode_GET_LENGTH(fullname); + dot = PyUnicode_FindChar(fullname, '.', 0, len, -1); + if (dot == -1) { Py_INCREF(fullname); return fullname; - } else { - PyObject *result; - subname++; - len = PyUnicode_GET_LENGTH(fullname); - len -= subname - fullname_ucs4; - result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - subname, len); - PyMem_Free(fullname_ucs4); - return result; - } + } else + return PyUnicode_Substring(fullname, dot+1, len); } /* Given a (sub)modulename, write the potential file path in the @@ -453,58 +438,51 @@ zipimporter_get_data(PyObject *obj, PyObject *args) { ZipImporter *self = (ZipImporter *)obj; - PyObject *pathobj, *key; - const Py_UCS4 *path; + PyObject *path, *key; #ifdef ALTSEP - Py_UCS4 *p; + PyObject *tmp; + _Py_IDENTIFIER(replace); #endif PyObject *toc_entry; - Py_ssize_t path_len, len; - Py_UCS4 buf[MAXPATHLEN + 1], archive[MAXPATHLEN + 1]; + Py_ssize_t path_start, path_len, len; - if (!PyArg_ParseTuple(args, "U:zipimporter.get_data", &pathobj)) + if (!PyArg_ParseTuple(args, "U:zipimporter.get_data", &path)) return NULL; - if (PyUnicode_READY(pathobj) == -1) +#ifdef ALTSEP + path = PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP); + if (!path) return NULL; +#else + Py_INCREF(path); +#endif + if (PyUnicode_READY(path) == -1) + goto error; - path_len = PyUnicode_GET_LENGTH(pathobj); - if (path_len >= MAXPATHLEN) { - PyErr_SetString(ZipImportError, "path too long"); - return NULL; - } - if (!PyUnicode_AsUCS4(pathobj, buf, Py_ARRAY_LENGTH(buf), 1)) - return NULL; - path = buf; -#ifdef ALTSEP - for (p = buf; *p; p++) { - if (*p == ALTSEP) - *p = SEP; - } -#endif + path_len = PyUnicode_GET_LENGTH(path); + len = PyUnicode_GET_LENGTH(self->archive); - if ((size_t)len < Py_UCS4_strlen(path)) { - if (!PyUnicode_AsUCS4(self->archive, archive, Py_ARRAY_LENGTH(archive), 1)) - return NULL; - if (Py_UCS4_strncmp(path, archive, len) == 0 && - path[len] == SEP) { - path += len + 1; - path_len -= len + 1; - } + path_start = 0; + if (PyUnicode_Tailmatch(path, self->archive, 0, len, -1) + && PyUnicode_READ_CHAR(path, len) == SEP) { + path_start = len + 1; } - key = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - path, path_len); + key = PyUnicode_Substring(path, path_start, path_len); if (key == NULL) - return NULL; + goto error; toc_entry = PyDict_GetItem(self->files, key); if (toc_entry == NULL) { PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, key); Py_DECREF(key); - return NULL; + goto error; } Py_DECREF(key); + Py_DECREF(path); return get_data(self->archive, toc_entry); + error: + Py_DECREF(path); + return NULL; } static PyObject * @@ -756,24 +734,14 @@ long header_offset, name_size, header_size, header_position; long l, count; Py_ssize_t i; - size_t length; - Py_UCS4 path[MAXPATHLEN + 5]; char name[MAXPATHLEN + 5]; PyObject *nameobj = NULL; char *p, endof_central_dir[22]; long arc_offset; /* offset from beginning of file to start of zip-archive */ - PyObject *pathobj; + PyObject *path; const char *charset; int bootstrap; - if (PyUnicode_GET_LENGTH(archive) > MAXPATHLEN) { - PyErr_SetString(PyExc_OverflowError, - "Zip path name is too long"); - return NULL; - } - if (!PyUnicode_AsUCS4(archive, path, Py_ARRAY_LENGTH(path), 1)) - return NULL; - fp = _Py_fopen(archive, "rb"); if (fp == NULL) { PyErr_Format(ZipImportError, "can't open Zip file: %R", archive); @@ -802,9 +770,6 @@ if (files == NULL) goto error; - length = Py_UCS4_strlen(path); - path[length] = SEP; - /* Start of Central Directory */ count = 0; for (;;) { @@ -868,15 +833,10 @@ PY_MAJOR_VERSION, PY_MINOR_VERSION); goto error; } - for (i = 0; (i < (MAXPATHLEN - (Py_ssize_t)length - 1)) && - (i < PyUnicode_GET_LENGTH(nameobj)); i++) - path[length + 1 + i] = PyUnicode_READ_CHAR(nameobj, i); - path[length + 1 + i] = 0; - pathobj = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, - path, Py_UCS4_strlen(path)); - if (pathobj == NULL) + path = PyUnicode_FromFormat("%U%c%U", archive, SEP, nameobj); + if (path == NULL) goto error; - t = Py_BuildValue("Niiiiiii", pathobj, compress, data_size, + t = Py_BuildValue("Niiiiiii", path, compress, data_size, file_size, file_offset, time, date, crc); if (t == NULL) goto error; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 08:41:08 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 08:41:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Drop_Py=5FUCS4=5F_functions?= =?utf8?q?=2E_Closes_=2313246=2E?= Message-ID: http://hg.python.org/cpython/rev/80a7ab9ac29f changeset: 73236:80a7ab9ac29f user: Martin v. L?wis date: Mon Oct 31 08:40:56 2011 +0100 summary: Drop Py_UCS4_ functions. Closes #13246. files: Include/unicodeobject.h | 37 ---------- Objects/unicodeobject.c | 100 +++++++++++++++++++++++++-- Objects/uniops.h | 91 ------------------------- 3 files changed, 90 insertions(+), 138 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1984,43 +1984,6 @@ Py_UNICODE c ); -PyAPI_FUNC(size_t) Py_UCS4_strlen( - const Py_UCS4 *u - ); - -PyAPI_FUNC(Py_UCS4*) Py_UCS4_strcpy( - Py_UCS4 *s1, - const Py_UCS4 *s2); - -PyAPI_FUNC(Py_UCS4*) Py_UCS4_strcat( - Py_UCS4 *s1, const Py_UCS4 *s2); - -PyAPI_FUNC(Py_UCS4*) Py_UCS4_strncpy( - Py_UCS4 *s1, - const Py_UCS4 *s2, - size_t n); - -PyAPI_FUNC(int) Py_UCS4_strcmp( - const Py_UCS4 *s1, - const Py_UCS4 *s2 - ); - -PyAPI_FUNC(int) Py_UCS4_strncmp( - const Py_UCS4 *s1, - const Py_UCS4 *s2, - size_t n - ); - -PyAPI_FUNC(Py_UCS4*) Py_UCS4_strchr( - const Py_UCS4 *s, - Py_UCS4 c - ); - -PyAPI_FUNC(Py_UCS4*) Py_UCS4_strrchr( - const Py_UCS4 *s, - Py_UCS4 c - ); - /* Create a copy of a unicode string ending with a nul character. Return NULL and raise a MemoryError exception on memory allocation failure, otherwise return a new allocated buffer (use PyMem_Free() to free the buffer). */ diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -14195,16 +14195,96 @@ return (PyObject *)it; } -#define UNIOP(x) Py_UNICODE_##x -#define UNIOP_t Py_UNICODE -#include "uniops.h" -#undef UNIOP -#undef UNIOP_t -#define UNIOP(x) Py_UCS4_##x -#define UNIOP_t Py_UCS4 -#include "uniops.h" -#undef UNIOP -#undef UNIOP_t + +size_t +Py_UNICODE_strlen(const Py_UNICODE *u) +{ + int res = 0; + while(*u++) + res++; + return res; +} + +Py_UNICODE* +Py_UNICODE_strcpy(Py_UNICODE *s1, const Py_UNICODE *s2) +{ + Py_UNICODE *u = s1; + while ((*u++ = *s2++)); + return s1; +} + +Py_UNICODE* +Py_UNICODE_strncpy(Py_UNICODE *s1, const Py_UNICODE *s2, size_t n) +{ + Py_UNICODE *u = s1; + while ((*u++ = *s2++)) + if (n-- == 0) + break; + return s1; +} + +Py_UNICODE* +Py_UNICODE_strcat(Py_UNICODE *s1, const Py_UNICODE *s2) +{ + Py_UNICODE *u1 = s1; + u1 += Py_UNICODE_strlen(u1); + Py_UNICODE_strcpy(u1, s2); + return s1; +} + +int +Py_UNICODE_strcmp(const Py_UNICODE *s1, const Py_UNICODE *s2) +{ + while (*s1 && *s2 && *s1 == *s2) + s1++, s2++; + if (*s1 && *s2) + return (*s1 < *s2) ? -1 : +1; + if (*s1) + return 1; + if (*s2) + return -1; + return 0; +} + +int +Py_UNICODE_strncmp(const Py_UNICODE *s1, const Py_UNICODE *s2, size_t n) +{ + register Py_UNICODE u1, u2; + for (; n != 0; n--) { + u1 = *s1; + u2 = *s2; + if (u1 != u2) + return (u1 < u2) ? -1 : +1; + if (u1 == '\0') + return 0; + s1++; + s2++; + } + return 0; +} + +Py_UNICODE* +Py_UNICODE_strchr(const Py_UNICODE *s, Py_UNICODE c) +{ + const Py_UNICODE *p; + for (p = s; *p; p++) + if (*p == c) + return (Py_UNICODE*)p; + return NULL; +} + +Py_UNICODE* +Py_UNICODE_strrchr(const Py_UNICODE *s, Py_UNICODE c) +{ + const Py_UNICODE *p; + p = s + Py_UNICODE_strlen(s); + while (p != s) { + p--; + if (*p == c) + return (Py_UNICODE*)p; + } + return NULL; +} Py_UNICODE* PyUnicode_AsUnicodeCopy(PyObject *unicode) diff --git a/Objects/uniops.h b/Objects/uniops.h deleted file mode 100644 --- a/Objects/uniops.h +++ /dev/null @@ -1,91 +0,0 @@ - -size_t -UNIOP(strlen)(const UNIOP_t *u) -{ - int res = 0; - while(*u++) - res++; - return res; -} - -UNIOP_t* -UNIOP(strcpy)(UNIOP_t *s1, const UNIOP_t *s2) -{ - UNIOP_t *u = s1; - while ((*u++ = *s2++)); - return s1; -} - -UNIOP_t* -UNIOP(strncpy)(UNIOP_t *s1, const UNIOP_t *s2, size_t n) -{ - UNIOP_t *u = s1; - while ((*u++ = *s2++)) - if (n-- == 0) - break; - return s1; -} - -UNIOP_t* -UNIOP(strcat)(UNIOP_t *s1, const UNIOP_t *s2) -{ - UNIOP_t *u1 = s1; - u1 += UNIOP(strlen(u1)); - UNIOP(strcpy(u1, s2)); - return s1; -} - -int -UNIOP(strcmp)(const UNIOP_t *s1, const UNIOP_t *s2) -{ - while (*s1 && *s2 && *s1 == *s2) - s1++, s2++; - if (*s1 && *s2) - return (*s1 < *s2) ? -1 : +1; - if (*s1) - return 1; - if (*s2) - return -1; - return 0; -} - -int -UNIOP(strncmp)(const UNIOP_t *s1, const UNIOP_t *s2, size_t n) -{ - register UNIOP_t u1, u2; - for (; n != 0; n--) { - u1 = *s1; - u2 = *s2; - if (u1 != u2) - return (u1 < u2) ? -1 : +1; - if (u1 == '\0') - return 0; - s1++; - s2++; - } - return 0; -} - -UNIOP_t* -UNIOP(strchr)(const UNIOP_t *s, UNIOP_t c) -{ - const UNIOP_t *p; - for (p = s; *p; p++) - if (*p == c) - return (UNIOP_t*)p; - return NULL; -} - -UNIOP_t* -UNIOP(strrchr)(const UNIOP_t *s, UNIOP_t c) -{ - const UNIOP_t *p; - p = s + UNIOP(strlen)(s); - while (p != s) { - p--; - if (*p == c) - return (UNIOP_t*)p; - } - return NULL; -} - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 09:01:29 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 09:01:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo=2E?= Message-ID: http://hg.python.org/cpython/rev/4df454a9753f changeset: 73237:4df454a9753f user: Martin v. L?wis date: Mon Oct 31 09:01:22 2011 +0100 summary: Fix typo. files: Modules/zipimport.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/zipimport.c b/Modules/zipimport.c --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -87,8 +87,7 @@ } #ifdef ALTSEP - tmp = PyObject_CallMethodId(path, &PyId_replace, "CC", - ALTSEP, SEP); + tmp = _PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP); if (!tmp) goto error; Py_DECREF(path); @@ -450,7 +449,7 @@ return NULL; #ifdef ALTSEP - path = PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP); + path = _PyObject_CallMethodId(path, &PyId_replace, "CC", ALTSEP, SEP); if (!path) return NULL; #else -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 09:05:18 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 09:05:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Drop_unused_variable=2E?= Message-ID: http://hg.python.org/cpython/rev/101919aba8d6 changeset: 73238:101919aba8d6 user: Martin v. L?wis date: Mon Oct 31 09:05:10 2011 +0100 summary: Drop unused variable. files: Modules/zipimport.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Modules/zipimport.c b/Modules/zipimport.c --- a/Modules/zipimport.c +++ b/Modules/zipimport.c @@ -439,7 +439,6 @@ ZipImporter *self = (ZipImporter *)obj; PyObject *path, *key; #ifdef ALTSEP - PyObject *tmp; _Py_IDENTIFIER(replace); #endif PyObject *toc_entry; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 10:16:51 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 10:16:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_document_turtle?= =?utf8?q?_mainloop=28=29/done=28=29_functions=3B_thanks_to_Csaba_Szepesva?= =?utf8?q?ri_from?= Message-ID: http://hg.python.org/cpython/rev/1588b678d634 changeset: 73239:1588b678d634 branch: 2.7 parent: 73232:87251608cb64 user: Sandro Tosi date: Mon Oct 31 10:08:14 2011 +0100 summary: document turtle mainloop()/done() functions; thanks to Csaba Szepesvari from docs@ files: Doc/library/turtle.rst | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -157,6 +157,7 @@ | :func:`onclick` | :func:`onrelease` | :func:`ondrag` + | :func:`mainloop` | :func:`done` Special Turtle methods | :func:`begin_poly` @@ -1291,6 +1292,15 @@ the screen thereby producing handdrawings (if pen is down). +.. function:: mainloop() + done() + + Starts event loop - calling Tkinter's mainloop function. Must be the last + statement in a turtle graphics program. + + >>> turtle.mainloop() + + Special Turtle methods ---------------------- -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 10:16:51 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 10:16:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_document_turtle?= =?utf8?q?_done=28=29_function=3B_thanks_to_Csaba_Szepesvari_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/e23baae539f7 changeset: 73240:e23baae539f7 branch: 3.2 parent: 73233:9fbf79d6be56 user: Sandro Tosi date: Mon Oct 31 10:12:43 2011 +0100 summary: document turtle done() function; thanks to Csaba Szepesvari from docs@ files: Doc/library/turtle.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -204,7 +204,7 @@ | :func:`onkeypress` | :func:`onclick` | :func:`onscreenclick` | :func:`ontimer` - | :func:`mainloop` + | :func:`mainloop` | :func:`done` Settings and special methods | :func:`mode` @@ -1773,6 +1773,7 @@ .. function:: mainloop() + done() Starts event loop - calling Tkinter's mainloop function. Must be the last statement in a turtle graphics program. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 10:16:52 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 10:16:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/c7963dff98fa changeset: 73241:c7963dff98fa parent: 73238:101919aba8d6 parent: 73240:e23baae539f7 user: Sandro Tosi date: Mon Oct 31 10:13:30 2011 +0100 summary: merge with 3.2 files: Doc/library/turtle.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -204,7 +204,7 @@ | :func:`onkeypress` | :func:`onclick` | :func:`onscreenclick` | :func:`ontimer` - | :func:`mainloop` + | :func:`mainloop` | :func:`done` Settings and special methods | :func:`mode` @@ -1773,6 +1773,7 @@ .. function:: mainloop() + done() Starts event loop - calling Tkinter's mainloop function. Must be the last statement in a turtle graphics program. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 11:05:00 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 31 Oct 2011 11:05:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_test=5Fasyncore=3A_Enable_t?= =?utf8?q?ests_of_Unix_domain_sockets_with_poll=28=29=2E?= Message-ID: http://hg.python.org/cpython/rev/a293cc899c7b changeset: 73242:a293cc899c7b user: Charles-Fran?ois Natali date: Mon Oct 31 12:08:09 2011 +0100 summary: test_asyncore: Enable tests of Unix domain sockets with poll(). files: Lib/test/test_asyncore.py | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_asyncore.py b/Lib/test/test_asyncore.py --- a/Lib/test/test_asyncore.py +++ b/Lib/test/test_asyncore.py @@ -792,7 +792,6 @@ if HAS_UNIX_SOCKETS: family = socket.AF_UNIX addr = support.TESTFN - use_poll = False def tearDown(self): unlink(self.addr) @@ -812,11 +811,19 @@ class TestAPI_UseIPv6Poll(TestAPI_UseIPv6Sockets): use_poll = True +class TestAPI_UseUnixSocketsSelect(TestAPI_UseUnixSockets): + use_poll = False + + at unittest.skipUnless(hasattr(select, 'poll'), 'select.poll required') +class TestAPI_UseUnixSocketsPoll(TestAPI_UseUnixSockets): + use_poll = True + def test_main(): tests = [HelperFunctionTests, DispatcherTests, DispatcherWithSendTests, DispatcherWithSendTests_UsePoll, FileWrapperTest, TestAPI_UseIPv4Select, TestAPI_UseIPv4Poll, TestAPI_UseIPv6Select, - TestAPI_UseIPv6Poll, TestAPI_UseUnixSockets] + TestAPI_UseIPv6Poll, TestAPI_UseUnixSocketsSelect, + TestAPI_UseUnixSocketsPoll] run_unittest(*tests) if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 11:50:25 2011 From: python-checkins at python.org (victor.stinner) Date: Mon, 31 Oct 2011 11:50:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313226=3A_Update_sy?= =?utf8?q?s=2Esetdlopenflags=28=29_docstring?= Message-ID: http://hg.python.org/cpython/rev/05e2bdc00c0c changeset: 73243:05e2bdc00c0c user: Victor Stinner date: Mon Oct 31 11:48:09 2011 +0100 summary: Issue #13226: Update sys.setdlopenflags() docstring Refer to os.RTLD_xxx constants instead of ctypes and DLFCN modules. files: Python/sysmodule.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -775,9 +775,7 @@ a lazy resolving of symbols when importing a module, if called as\n\ sys.setdlopenflags(0). To share symbols across extension modules, call as\n\ sys.setdlopenflags(ctypes.RTLD_GLOBAL). Symbolic names for the flag modules\n\ -can be either found in the ctypes module, or in the DLFCN module. If DLFCN\n\ -is not available, it can be generated from /usr/include/dlfcn.h using the\n\ -h2py script."); +can be found in the os module (RTLD_xxx constants, e.g. os.RTLD_LAZY)."); static PyObject * sys_getdlopenflags(PyObject *self, PyObject *args) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 12:41:32 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 12:41:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E5=29=3A_2=2E5_is_no_lon?= =?utf8?q?ger_maintained?= Message-ID: http://hg.python.org/cpython/rev/b48e1b48e670 changeset: 73244:b48e1b48e670 branch: 2.5 parent: 70459:0072a98566c7 user: Martin v. L?wis date: Mon Oct 31 12:38:50 2011 +0100 summary: 2.5 is no longer maintained files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 12:41:33 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 12:41:33 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi41IC0+IDIuNik6?= =?utf8?q?_merge_closing_of_2=2E5_branch?= Message-ID: http://hg.python.org/cpython/rev/62fa61f2ee7d changeset: 73245:62fa61f2ee7d branch: 2.6 parent: 71579:b9a95ce2692c parent: 73244:b48e1b48e670 user: Martin v. L?wis date: Mon Oct 31 12:39:25 2011 +0100 summary: merge closing of 2.5 branch files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 12:41:34 2011 From: python-checkins at python.org (martin.v.loewis) Date: Mon, 31 Oct 2011 12:41:34 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_closing_of_2=2E5_branch?= Message-ID: http://hg.python.org/cpython/rev/a6712411c37d changeset: 73246:a6712411c37d branch: 2.7 parent: 73239:1588b678d634 parent: 73245:62fa61f2ee7d user: Martin v. L?wis date: Mon Oct 31 12:40:25 2011 +0100 summary: merge closing of 2.5 branch files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 16:05:46 2011 From: python-checkins at python.org (jesus.cea) Date: Mon, 31 Oct 2011 16:05:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Closes_=2313283?= =?utf8?q?=3A_removal_of_two_unused_variable_in_locale=2Epy?= Message-ID: http://hg.python.org/cpython/rev/0694ebb5db99 changeset: 73247:0694ebb5db99 branch: 2.7 user: Jesus Cea date: Mon Oct 31 16:02:12 2011 +0100 summary: Closes #13283: removal of two unused variable in locale.py files: Lib/locale.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -135,8 +135,6 @@ grouping = conv[monetary and 'mon_grouping' or 'grouping'] if not grouping: return (s, 0) - result = "" - seps = 0 if s[-1] == ' ': stripped = s.rstrip() right_spaces = s[len(stripped):] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 16:05:47 2011 From: python-checkins at python.org (jesus.cea) Date: Mon, 31 Oct 2011 16:05:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Closes_=2313283?= =?utf8?q?=3A_removal_of_two_unused_variable_in_locale=2Epy?= Message-ID: http://hg.python.org/cpython/rev/a479aad0231e changeset: 73248:a479aad0231e branch: 3.2 parent: 73240:e23baae539f7 user: Jesus Cea date: Mon Oct 31 16:03:34 2011 +0100 summary: Closes #13283: removal of two unused variable in locale.py files: Lib/locale.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -142,8 +142,6 @@ grouping = conv[monetary and 'mon_grouping' or 'grouping'] if not grouping: return (s, 0) - result = "" - seps = 0 if s[-1] == ' ': stripped = s.rstrip() right_spaces = s[len(stripped):] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 16:05:48 2011 From: python-checkins at python.org (jesus.cea) Date: Mon, 31 Oct 2011 16:05:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_MERGE=3A_Closes_=2313283=3A_removal_of_two_unused_variable_i?= =?utf8?q?n_locale=2Epy?= Message-ID: http://hg.python.org/cpython/rev/a228890c624d changeset: 73249:a228890c624d parent: 73243:05e2bdc00c0c parent: 73248:a479aad0231e user: Jesus Cea date: Mon Oct 31 16:04:12 2011 +0100 summary: MERGE: Closes #13283: removal of two unused variable in locale.py files: Lib/locale.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -142,8 +142,6 @@ grouping = conv[monetary and 'mon_grouping' or 'grouping'] if not grouping: return (s, 0) - result = "" - seps = 0 if s[-1] == ' ': stripped = s.rstrip() right_spaces = s[len(stripped):] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:18:07 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:18:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_remove_confusin?= =?utf8?q?g_paragraph_=28as_part_of_r87523=29=3B_thanks_to_AJ_Hill_from_do?= =?utf8?b?Y3NA?= Message-ID: http://hg.python.org/cpython/rev/aba380a9d8f3 changeset: 73250:aba380a9d8f3 branch: 2.7 parent: 73247:0694ebb5db99 user: Sandro Tosi date: Mon Oct 31 17:15:03 2011 +0100 summary: remove confusing paragraph (as part of r87523); thanks to AJ Hill from docs@ files: Doc/tutorial/interpreter.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -60,8 +60,7 @@ When a script file is used, it is sometimes useful to be able to run the script and enter interactive mode afterwards. This can be done by passing :option:`-i` -before the script. (This does not work if the script is read from standard -input, for the same reason as explained in the previous paragraph.) +before the script. .. _tut-argpassing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:18:08 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:18:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_remove_confusin?= =?utf8?q?g_paragraph_=28as_part_of_r87523=29=3B_thanks_to_AJ_Hill_from_do?= =?utf8?b?Y3NA?= Message-ID: http://hg.python.org/cpython/rev/7a2877d12d52 changeset: 73251:7a2877d12d52 branch: 3.2 parent: 73248:a479aad0231e user: Sandro Tosi date: Mon Oct 31 17:15:39 2011 +0100 summary: remove confusing paragraph (as part of r87523); thanks to AJ Hill from docs@ files: Doc/tutorial/interpreter.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -60,8 +60,7 @@ When a script file is used, it is sometimes useful to be able to run the script and enter interactive mode afterwards. This can be done by passing :option:`-i` -before the script. (This does not work if the script is read from standard -input, for the same reason as explained in the previous paragraph.) +before the script. .. _tut-argpassing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:18:09 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:18:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/6b5a58836dae changeset: 73252:6b5a58836dae parent: 73249:a228890c624d parent: 73251:7a2877d12d52 user: Sandro Tosi date: Mon Oct 31 17:16:03 2011 +0100 summary: merge with 3.2 files: Doc/tutorial/interpreter.rst | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Doc/tutorial/interpreter.rst b/Doc/tutorial/interpreter.rst --- a/Doc/tutorial/interpreter.rst +++ b/Doc/tutorial/interpreter.rst @@ -60,8 +60,7 @@ When a script file is used, it is sometimes useful to be able to run the script and enter interactive mode afterwards. This can be done by passing :option:`-i` -before the script. (This does not work if the script is read from standard -input, for the same reason as explained in the previous paragraph.) +before the script. .. _tut-argpassing: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:48:26 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:48:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_use_diveintopyt?= =?utf8?q?hon=2Enet_now_that_DIP=2Eorg_returns_410=3B_thanks_to_Josh_Gachn?= =?utf8?q?ang?= Message-ID: http://hg.python.org/cpython/rev/7ce3b719306e changeset: 73253:7ce3b719306e branch: 2.7 parent: 73250:aba380a9d8f3 user: Sandro Tosi date: Mon Oct 31 17:45:09 2011 +0100 summary: use diveintopython.net now that DIP.org returns 410; thanks to Josh Gachnang from docs@ files: Doc/using/windows.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -47,9 +47,9 @@ "7 Minutes to "Hello World!"" by Richard Dooling, 2006 - `Installing on Windows `_ + `Installing on Windows `_ in "`Dive into Python: Python from novice to pro - `_" + `_" by Mark Pilgrim, 2004, ISBN 1-59059-356-1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:48:27 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:48:27 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_use_diveintopyt?= =?utf8?q?hon=2Enet_now_that_DIP=2Eorg_returns_410=3B_thanks_to_Josh_Gachn?= =?utf8?q?ang?= Message-ID: http://hg.python.org/cpython/rev/9263ebeebdbd changeset: 73254:9263ebeebdbd branch: 3.2 parent: 73251:7a2877d12d52 user: Sandro Tosi date: Mon Oct 31 17:46:04 2011 +0100 summary: use diveintopython.net now that DIP.org returns 410; thanks to Josh Gachnang from docs@ files: Doc/using/windows.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -45,9 +45,9 @@ "7 Minutes to "Hello World!"" by Richard Dooling, 2006 - `Installing on Windows `_ + `Installing on Windows `_ in "`Dive into Python: Python from novice to pro - `_" + `_" by Mark Pilgrim, 2004, ISBN 1-59059-356-1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 17:48:28 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 17:48:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/c14e00680a99 changeset: 73255:c14e00680a99 parent: 73252:6b5a58836dae parent: 73254:9263ebeebdbd user: Sandro Tosi date: Mon Oct 31 17:46:25 2011 +0100 summary: merge with 3.2 files: Doc/using/windows.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -45,9 +45,9 @@ "7 Minutes to "Hello World!"" by Richard Dooling, 2006 - `Installing on Windows `_ + `Installing on Windows `_ in "`Dive into Python: Python from novice to pro - `_" + `_" by Mark Pilgrim, 2004, ISBN 1-59059-356-1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 18:40:08 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 31 Oct 2011 18:40:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_issue_10817?= =?utf8?q?_-_Fix_urlretrieve_function_to_raise_ContentTooShortError?= Message-ID: http://hg.python.org/cpython/rev/2ca415cbf2ac changeset: 73256:2ca415cbf2ac branch: 3.2 parent: 73254:9263ebeebdbd user: Senthil Kumaran date: Tue Nov 01 01:35:17 2011 +0800 summary: Fix issue 10817 - Fix urlretrieve function to raise ContentTooShortError even when reporthook is None. Patch by Jyrki Pulliainen. files: Lib/test/test_urllib.py | 109 +++++++++++++++++++++------ Lib/urllib/request.py | 4 +- Misc/NEWS | 3 + 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -36,6 +36,44 @@ else: return opener.open(url, data) + +class FakeHTTPMixin(object): + def fakehttp(self, fakedata): + class FakeSocket(io.BytesIO): + io_refs = 1 + + def sendall(self, str): + pass + + def makefile(self, *args, **kwds): + self.io_refs += 1 + return self + + def read(self, amt=None): + if self.closed: + return b"" + return io.BytesIO.read(self, amt) + + def readline(self, length=None): + if self.closed: + return b"" + return io.BytesIO.readline(self, length) + + def close(self): + self.io_refs -= 1 + if self.io_refs == 0: + io.BytesIO.close(self) + + class FakeHTTPConnection(http.client.HTTPConnection): + def connect(self): + self.sock = FakeSocket(fakedata) + self._connection_class = http.client.HTTPConnection + http.client.HTTPConnection = FakeHTTPConnection + + def unfakehttp(self): + http.client.HTTPConnection = self._connection_class + + class urlopen_FileTests(unittest.TestCase): """Test urlopen() opening a temporary file. @@ -139,35 +177,9 @@ self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com') self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com')) -class urlopen_HttpTests(unittest.TestCase): +class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin): """Test urlopen() opening a fake http connection.""" - def fakehttp(self, fakedata): - class FakeSocket(io.BytesIO): - io_refs = 1 - def sendall(self, str): pass - def makefile(self, *args, **kwds): - self.io_refs += 1 - return self - def read(self, amt=None): - if self.closed: return b"" - return io.BytesIO.read(self, amt) - def readline(self, length=None): - if self.closed: return b"" - return io.BytesIO.readline(self, length) - def close(self): - self.io_refs -= 1 - if self.io_refs == 0: - io.BytesIO.close(self) - class FakeHTTPConnection(http.client.HTTPConnection): - def connect(self): - self.sock = FakeSocket(fakedata) - self._connection_class = http.client.HTTPConnection - http.client.HTTPConnection = FakeHTTPConnection - - def unfakehttp(self): - http.client.HTTPConnection = self._connection_class - def check_read(self, ver): self.fakehttp(b"HTTP/" + ver + b" 200 OK\r\n\r\nHello!") try: @@ -394,6 +406,48 @@ self.assertEqual(report[0][1], 8192) self.assertEqual(report[0][2], 8193) + +class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin): + """Test urllib.urlretrieve() using fake http connections""" + + def test_short_content_raises_ContentTooShortError(self): + self.fakehttp(b'''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + + def _reporthook(par1, par2, par3): + pass + + with self.assertRaises(urllib.error.ContentTooShortError): + try: + urllib.request.urlretrieve('http://example.com/', + reporthook=_reporthook) + finally: + self.unfakehttp() + + def test_short_content_raises_ContentTooShortError_without_reporthook(self): + self.fakehttp(b'''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + with self.assertRaises(urllib.error.ContentTooShortError): + try: + urllib.request.urlretrieve('http://example.com/') + finally: + self.unfakehttp() + + class QuotingTests(unittest.TestCase): """Tests for urllib.quote() and urllib.quote_plus() @@ -1164,6 +1218,7 @@ urlopen_FileTests, urlopen_HttpTests, urlretrieve_FileTests, + urlretrieve_HttpTests, ProxyTests, QuotingTests, UnquotingTests, diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1589,9 +1589,9 @@ size = -1 read = 0 blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) if reporthook: - if "content-length" in headers: - size = int(headers["Content-Length"]) reporthook(blocknum, bs, size) while 1: block = fp.read(bs) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -66,6 +66,9 @@ Library ------- +- Issue 10817: Fix urlretrieve function to raise ContentTooShortError even + when reporthook is None. Patch by Jyrki Pulliainen. + - Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 18:40:09 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 31 Oct 2011 18:40:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2_-_Fix_issue_10817_-_Fix_urlretrieve_functio?= =?utf8?q?n_to_raise?= Message-ID: http://hg.python.org/cpython/rev/e3e5b6f03f79 changeset: 73257:e3e5b6f03f79 parent: 73255:c14e00680a99 parent: 73256:2ca415cbf2ac user: Senthil Kumaran date: Tue Nov 01 01:39:49 2011 +0800 summary: merge from 3.2 - Fix issue 10817 - Fix urlretrieve function to raise ContentTooShortError even when reporthook is None. Patch by Jyrki Pulliainen. files: Lib/test/test_urllib.py | 109 +++++++++++++++++++++------ Lib/urllib/request.py | 4 +- Misc/NEWS | 3 + 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -36,6 +36,44 @@ else: return opener.open(url, data) + +class FakeHTTPMixin(object): + def fakehttp(self, fakedata): + class FakeSocket(io.BytesIO): + io_refs = 1 + + def sendall(self, str): + pass + + def makefile(self, *args, **kwds): + self.io_refs += 1 + return self + + def read(self, amt=None): + if self.closed: + return b"" + return io.BytesIO.read(self, amt) + + def readline(self, length=None): + if self.closed: + return b"" + return io.BytesIO.readline(self, length) + + def close(self): + self.io_refs -= 1 + if self.io_refs == 0: + io.BytesIO.close(self) + + class FakeHTTPConnection(http.client.HTTPConnection): + def connect(self): + self.sock = FakeSocket(fakedata) + self._connection_class = http.client.HTTPConnection + http.client.HTTPConnection = FakeHTTPConnection + + def unfakehttp(self): + http.client.HTTPConnection = self._connection_class + + class urlopen_FileTests(unittest.TestCase): """Test urlopen() opening a temporary file. @@ -139,35 +177,9 @@ self.env.set('NO_PROXY', 'localhost, anotherdomain.com, newdomain.com') self.assertTrue(urllib.request.proxy_bypass_environment('anotherdomain.com')) -class urlopen_HttpTests(unittest.TestCase): +class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin): """Test urlopen() opening a fake http connection.""" - def fakehttp(self, fakedata): - class FakeSocket(io.BytesIO): - io_refs = 1 - def sendall(self, str): pass - def makefile(self, *args, **kwds): - self.io_refs += 1 - return self - def read(self, amt=None): - if self.closed: return b"" - return io.BytesIO.read(self, amt) - def readline(self, length=None): - if self.closed: return b"" - return io.BytesIO.readline(self, length) - def close(self): - self.io_refs -= 1 - if self.io_refs == 0: - io.BytesIO.close(self) - class FakeHTTPConnection(http.client.HTTPConnection): - def connect(self): - self.sock = FakeSocket(fakedata) - self._connection_class = http.client.HTTPConnection - http.client.HTTPConnection = FakeHTTPConnection - - def unfakehttp(self): - http.client.HTTPConnection = self._connection_class - def check_read(self, ver): self.fakehttp(b"HTTP/" + ver + b" 200 OK\r\n\r\nHello!") try: @@ -394,6 +406,48 @@ self.assertEqual(report[0][1], 8192) self.assertEqual(report[0][2], 8193) + +class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin): + """Test urllib.urlretrieve() using fake http connections""" + + def test_short_content_raises_ContentTooShortError(self): + self.fakehttp(b'''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + + def _reporthook(par1, par2, par3): + pass + + with self.assertRaises(urllib.error.ContentTooShortError): + try: + urllib.request.urlretrieve('http://example.com/', + reporthook=_reporthook) + finally: + self.unfakehttp() + + def test_short_content_raises_ContentTooShortError_without_reporthook(self): + self.fakehttp(b'''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + with self.assertRaises(urllib.error.ContentTooShortError): + try: + urllib.request.urlretrieve('http://example.com/') + finally: + self.unfakehttp() + + class QuotingTests(unittest.TestCase): """Tests for urllib.quote() and urllib.quote_plus() @@ -1186,6 +1240,7 @@ urlopen_FileTests, urlopen_HttpTests, urlretrieve_FileTests, + urlretrieve_HttpTests, ProxyTests, QuotingTests, UnquotingTests, diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1605,9 +1605,9 @@ size = -1 read = 0 blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) if reporthook: - if "content-length" in headers: - size = int(headers["Content-Length"]) reporthook(blocknum, bs, size) while 1: block = fp.read(bs) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -347,6 +347,9 @@ Library ------- +- Issue 10817: Fix urlretrieve function to raise ContentTooShortError even + when reporthook is None. Patch by Jyrki Pulliainen. + - Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 19:09:01 2011 From: python-checkins at python.org (barry.warsaw) Date: Mon, 31 Oct 2011 19:09:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_test=5Fprotocol?= =?utf8?q?=5Fsslv2=28=29=3A_Skip_this_test_if_ssl=2EPROTOCOL=5FSSLv2_is_no?= =?utf8?q?t?= Message-ID: http://hg.python.org/cpython/rev/1de4d92cd6a4 changeset: 73258:1de4d92cd6a4 branch: 2.7 parent: 73253:7ce3b719306e user: Barry Warsaw date: Mon Oct 31 14:08:15 2011 -0400 summary: test_protocol_sslv2(): Skip this test if ssl.PROTOCOL_SSLv2 is not defined (as is the case with Ubuntu 11.10). files: Lib/test/test_ssl.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -981,6 +981,8 @@ @skip_if_broken_ubuntu_ssl def test_protocol_sslv2(self): """Connecting to an SSLv2 server with various client options""" + if not hasattr(ssl, 'PROTOCOL_SSLv2'): + raise unittest.SkipTest('No SSLv2 available') if test_support.verbose: sys.stdout.write("\n") if not hasattr(ssl, 'PROTOCOL_SSLv2'): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 19:24:16 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 19:24:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_really_use_back?= =?utf8?q?ticks_in_string_conversion_definition=3B_thanks_to_Jonathan_Blak?= =?utf8?q?es?= Message-ID: http://hg.python.org/cpython/rev/3a126a459b6f changeset: 73259:3a126a459b6f branch: 2.7 parent: 73253:7ce3b719306e user: Sandro Tosi date: Mon Oct 31 19:19:26 2011 +0100 summary: really use backticks in string conversion definition; thanks to Jonathan Blakes from docs@ files: Doc/reference/expressions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -347,7 +347,7 @@ quotes: .. productionlist:: - string_conversion: "'" `expression_list` "'" + string_conversion: "`" `expression_list` "`" A string conversion evaluates the contained expression list and converts the resulting object into a string according to rules specific to its type. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 19:24:17 2011 From: python-checkins at python.org (sandro.tosi) Date: Mon, 31 Oct 2011 19:24:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/7f4aaa9c4588 changeset: 73260:7f4aaa9c4588 branch: 2.7 parent: 73258:1de4d92cd6a4 parent: 73259:3a126a459b6f user: Sandro Tosi date: Mon Oct 31 19:23:25 2011 +0100 summary: merge heads files: Doc/reference/expressions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -347,7 +347,7 @@ quotes: .. productionlist:: - string_conversion: "'" `expression_list` "'" + string_conversion: "`" `expression_list` "`" A string conversion evaluates the contained expression list and converts the resulting object into a string according to rules specific to its type. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 19:34:23 2011 From: python-checkins at python.org (ross.lagerwall) Date: Mon, 31 Oct 2011 19:34:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312797=3A_Added_cus?= =?utf8?q?tom_opener_parameter_to_builtin_open=28=29_and_FileIO=2Eopen=28?= =?utf8?b?KS4=?= Message-ID: http://hg.python.org/cpython/rev/0d64d9ac2b78 changeset: 73261:0d64d9ac2b78 parent: 73257:e3e5b6f03f79 user: Ross Lagerwall date: Mon Oct 31 20:34:46 2011 +0200 summary: Issue #12797: Added custom opener parameter to builtin open() and FileIO.open(). files: Doc/library/functions.rst | 11 +++++- Doc/library/io.rst | 11 +++++- Lib/_pyio.py | 10 ++++- Lib/test/test_io.py | 9 ++++ Misc/NEWS | 3 + Modules/_io/_iomodule.c | 18 ++++++--- Modules/_io/fileio.c | 49 ++++++++++++++++++++------ 7 files changed, 89 insertions(+), 22 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -776,7 +776,7 @@ :meth:`__index__` method that returns an integer. -.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) +.. function:: open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) Open *file* and return a corresponding stream. If the file cannot be opened, an :exc:`OSError` is raised. @@ -883,6 +883,15 @@ closed. If a filename is given *closefd* has no effect and must be ``True`` (the default). + A custom opener can be used by passing a callable as *opener*. The underlying + file descriptor for the file object is then obtained by calling *opener* with + (*file*, *flags*). *opener* must return an open file descriptor (passing + :mod:`os.open` as *opener* results in functionality similar to passing + ``None``). + + .. versionchanged:: 3.3 + The *opener* parameter was added. + The type of file object returned by the :func:`open` function depends on the mode. When :func:`open` is used to open a file in a text mode (``'w'``, ``'r'``, ``'wt'``, ``'rt'``, etc.), it returns a subclass of diff --git a/Doc/library/io.rst b/Doc/library/io.rst --- a/Doc/library/io.rst +++ b/Doc/library/io.rst @@ -458,7 +458,7 @@ Raw File I/O ^^^^^^^^^^^^ -.. class:: FileIO(name, mode='r', closefd=True) +.. class:: FileIO(name, mode='r', closefd=True, opener=None) :class:`FileIO` represents an OS-level file containing bytes data. It implements the :class:`RawIOBase` interface (and therefore the @@ -479,6 +479,15 @@ The :meth:`read` (when called with a positive argument), :meth:`readinto` and :meth:`write` methods on this class will only make one system call. + A custom opener can be used by passing a callable as *opener*. The underlying + file descriptor for the file object is then obtained by calling *opener* with + (*name*, *flags*). *opener* must return an open file descriptor (passing + :mod:`os.open` as *opener* results in functionality similar to passing + ``None``). + + .. versionchanged:: 3.3 + The *opener* parameter was added. + In addition to the attributes and methods from :class:`IOBase` and :class:`RawIOBase`, :class:`FileIO` provides the following data attributes and methods: diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -27,7 +27,7 @@ def open(file, mode="r", buffering=-1, encoding=None, errors=None, - newline=None, closefd=True): + newline=None, closefd=True, opener=None): r"""Open file and return a stream. Raise IOError upon failure. @@ -122,6 +122,12 @@ be kept open when the file is closed. This does not work when a file name is given and must be True in that case. + A custom opener can be used by passing a callable as *opener*. The + underlying file descriptor for the file object is then obtained by calling + *opener* with (*file*, *flags*). *opener* must return an open file + descriptor (passing os.open as *opener* results in functionality similar to + passing None). + open() returns a file object whose type depends on the mode, and through which the standard file operations such as reading and writing are performed. When open() is used to open a file in a text mode ('w', @@ -176,7 +182,7 @@ (writing and "w" or "") + (appending and "a" or "") + (updating and "+" or ""), - closefd) + closefd, opener=opener) line_buffering = False if buffering == 1 or buffering < 0 and raw.isatty(): buffering = -1 diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -621,6 +621,15 @@ for obj in test: self.assertTrue(hasattr(obj, "__dict__")) + def test_opener(self): + with self.open(support.TESTFN, "w") as f: + f.write("egg\n") + fd = os.open(support.TESTFN, os.O_RDONLY) + def opener(path, flags): + return fd + with self.open("non-existent", "r", opener=opener) as f: + self.assertEqual(f.read(), "egg\n") + class CIOTest(IOTest): def test_IOBase_finalize(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #12797: Added custom opener parameter to builtin open() and + FileIO.open(). + - Issue #10519: Avoid unnecessary recursive function calls in setobject.c. diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -95,7 +95,7 @@ */ PyDoc_STRVAR(open_doc, "open(file, mode='r', buffering=-1, encoding=None,\n" -" errors=None, newline=None, closefd=True) -> file object\n" +" errors=None, newline=None, closefd=True, opener=None) -> file object\n" "\n" "Open file and return a stream. Raise IOError upon failure.\n" "\n" @@ -190,6 +190,12 @@ "when the file is closed. This does not work when a file name is given\n" "and must be True in that case.\n" "\n" +"A custom opener can be used by passing a callable as *opener*. The\n" +"underlying file descriptor for the file object is then obtained by\n" +"calling *opener* with (*file*, *flags*). *opener* must return an open\n" +"file descriptor (passing os.open as *opener* results in functionality\n" +"similar to passing None).\n" +"\n" "open() returns a file object whose type depends on the mode, and\n" "through which the standard file operations such as reading and writing\n" "are performed. When open() is used to open a file in a text mode ('w',\n" @@ -210,8 +216,8 @@ { char *kwlist[] = {"file", "mode", "buffering", "encoding", "errors", "newline", - "closefd", NULL}; - PyObject *file; + "closefd", "opener", NULL}; + PyObject *file, *opener = Py_None; char *mode = "r"; int buffering = -1, closefd = 1; char *encoding = NULL, *errors = NULL, *newline = NULL; @@ -228,10 +234,10 @@ _Py_IDENTIFIER(isatty); _Py_IDENTIFIER(fileno); - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzziO:open", kwlist, &file, &mode, &buffering, &encoding, &errors, &newline, - &closefd)) { + &closefd, &opener)) { return NULL; } @@ -331,7 +337,7 @@ /* Create the Raw file stream */ raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type, - "Osi", file, rawmode, closefd); + "OsiO", file, rawmode, closefd, opener); if (raw == NULL) return NULL; diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c --- a/Modules/_io/fileio.c +++ b/Modules/_io/fileio.c @@ -212,9 +212,9 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) { fileio *self = (fileio *) oself; - static char *kwlist[] = {"file", "mode", "closefd", NULL}; + static char *kwlist[] = {"file", "mode", "closefd", "opener", NULL}; const char *name = NULL; - PyObject *nameobj, *stringobj = NULL; + PyObject *nameobj, *stringobj = NULL, *opener = Py_None; char *mode = "r"; char *s; #ifdef MS_WINDOWS @@ -233,8 +233,9 @@ return -1; } - if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio", - kwlist, &nameobj, &mode, &closefd)) + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|siO:fileio", + kwlist, &nameobj, &mode, &closefd, + &opener)) return -1; if (PyFloat_Check(nameobj)) { @@ -363,15 +364,35 @@ goto error; } - Py_BEGIN_ALLOW_THREADS errno = 0; + if (opener == Py_None) { + Py_BEGIN_ALLOW_THREADS #ifdef MS_WINDOWS - if (widename != NULL) - self->fd = _wopen(widename, flags, 0666); - else + if (widename != NULL) + self->fd = _wopen(widename, flags, 0666); + else #endif - self->fd = open(name, flags, 0666); - Py_END_ALLOW_THREADS + self->fd = open(name, flags, 0666); + Py_END_ALLOW_THREADS + } else { + PyObject *fdobj = PyObject_CallFunction( + opener, "Oi", nameobj, flags); + if (fdobj == NULL) + goto error; + if (!PyLong_Check(fdobj)) { + Py_DECREF(fdobj); + PyErr_SetString(PyExc_TypeError, + "expected integer from opener"); + goto error; + } + + self->fd = PyLong_AsLong(fdobj); + Py_DECREF(fdobj); + if (self->fd == -1) { + goto error; + } + } + if (self->fd < 0) { #ifdef MS_WINDOWS if (widename != NULL) @@ -1017,13 +1038,17 @@ PyDoc_STRVAR(fileio_doc, -"file(name: str[, mode: str]) -> file IO object\n" +"file(name: str[, mode: str][, opener: None]) -> file IO object\n" "\n" "Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n" "writing or appending. The file will be created if it doesn't exist\n" "when opened for writing or appending; it will be truncated when\n" "opened for writing. Add a '+' to the mode to allow simultaneous\n" -"reading and writing."); +"reading and writing. A custom opener can be used by passing a\n" +"callable as *opener*. The underlying file descriptor for the file\n" +"object is then obtained by calling opener with (*name*, *flags*).\n" +"*opener* must return an open file descriptor (passing os.open as\n" +"*opener* results in functionality similar to passing None)."); PyDoc_STRVAR(read_doc, "read(size: int) -> bytes. read at most size bytes, returned as bytes.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 19:45:18 2011 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 31 Oct 2011 19:45:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Port_to_2=2E7_-?= =?utf8?q?_issue_10817_-_Fix_urlretrieve_function_to_raise?= Message-ID: http://hg.python.org/cpython/rev/1ef30d6429db changeset: 73262:1ef30d6429db branch: 2.7 parent: 73260:7f4aaa9c4588 user: Senthil Kumaran date: Tue Nov 01 02:44:45 2011 +0800 summary: Port to 2.7 - issue 10817 - Fix urlretrieve function to raise ContentTooShortError even when reporthook is None. Patch by Jyrki Pulliainen. files: Lib/test/test_urllib.py | 91 ++++++++++++++++++++++------ Lib/urllib.py | 4 +- Misc/NEWS | 3 + 3 files changed, 76 insertions(+), 22 deletions(-) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -17,6 +17,36 @@ hex_repr = "0%s" % hex_repr return "%" + hex_repr + +class FakeHTTPMixin(object): + def fakehttp(self, fakedata): + class FakeSocket(StringIO.StringIO): + + def sendall(self, str): + pass + def makefile(self, *args, **kwds): + return self + + def read(self, amt=None): + if self.closed: + return "" + return StringIO.StringIO.read(self, amt) + + def readline(self, length=None): + if self.closed: + return "" + return StringIO.StringIO.readline(self, length) + + class FakeHTTPConnection(httplib.HTTPConnection): + def connect(self): + self.sock = FakeSocket(fakedata) + assert httplib.HTTP._connection_class == httplib.HTTPConnection + httplib.HTTP._connection_class = FakeHTTPConnection + + def unfakehttp(self): + httplib.HTTP._connection_class = httplib.HTTPConnection + + class urlopen_FileTests(unittest.TestCase): """Test urlopen() opening a temporary file. @@ -119,28 +149,9 @@ self.assertTrue(urllib.proxy_bypass_environment('anotherdomain.com')) -class urlopen_HttpTests(unittest.TestCase): +class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin): """Test urlopen() opening a fake http connection.""" - def fakehttp(self, fakedata): - class FakeSocket(StringIO.StringIO): - def sendall(self, str): pass - def makefile(self, mode, name): return self - def read(self, amt=None): - if self.closed: return '' - return StringIO.StringIO.read(self, amt) - def readline(self, length=None): - if self.closed: return '' - return StringIO.StringIO.readline(self, length) - class FakeHTTPConnection(httplib.HTTPConnection): - def connect(self): - self.sock = FakeSocket(fakedata) - assert httplib.HTTP._connection_class == httplib.HTTPConnection - httplib.HTTP._connection_class = FakeHTTPConnection - - def unfakehttp(self): - httplib.HTTP._connection_class = httplib.HTTPConnection - def test_read(self): self.fakehttp('Hello!') try: @@ -330,6 +341,45 @@ self.assertEqual(report[0][1], 8192) self.assertEqual(report[0][2], 8193) + +class urlretrieve_HttpTests(unittest.TestCase, FakeHTTPMixin): + """Test urllib.urlretrieve() using fake http connections""" + + def test_short_content_raises_ContentTooShortError(self): + self.fakehttp('''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + + def _reporthook(par1, par2, par3): + pass + + try: + self.assertRaises(urllib.ContentTooShortError, urllib.urlretrieve, + 'http://example.com', reporthook=_reporthook) + finally: + self.unfakehttp() + + def test_short_content_raises_ContentTooShortError_without_reporthook(self): + self.fakehttp('''HTTP/1.1 200 OK +Date: Wed, 02 Jan 2008 03:03:54 GMT +Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e +Connection: close +Content-Length: 100 +Content-Type: text/html; charset=iso-8859-1 + +FF +''') + try: + self.assertRaises(urllib.ContentTooShortError, urllib.urlretrieve, 'http://example.com/') + finally: + self.unfakehttp() + class QuotingTests(unittest.TestCase): """Tests for urllib.quote() and urllib.quote_plus() @@ -774,6 +824,7 @@ urlopen_FileTests, urlopen_HttpTests, urlretrieve_FileTests, + urlretrieve_HttpTests, ProxyTests, QuotingTests, UnquotingTests, diff --git a/Lib/urllib.py b/Lib/urllib.py --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -257,9 +257,9 @@ size = -1 read = 0 blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) if reporthook: - if "content-length" in headers: - size = int(headers["Content-Length"]) reporthook(blocknum, bs, size) while 1: block = fp.read(bs) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,9 @@ Library ------- +- Issue 10817: Fix urlretrieve function to raise ContentTooShortError even + when reporthook is None. Patch by Jyrki Pulliainen. + - Issue 13296: Fix IDLE to clear compile __future__ flags on shell restart. (Patch by Roger Serwy) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 20:27:15 2011 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 31 Oct 2011 20:27:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Backout_redunda?= =?utf8?q?nt_changeset_1de4d92cd6a4?= Message-ID: http://hg.python.org/cpython/rev/848210b179ab changeset: 73263:848210b179ab branch: 2.7 user: Antoine Pitrou date: Mon Oct 31 20:23:00 2011 +0100 summary: Backout redundant changeset 1de4d92cd6a4 files: Lib/test/test_ssl.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -981,8 +981,6 @@ @skip_if_broken_ubuntu_ssl def test_protocol_sslv2(self): """Connecting to an SSLv2 server with various client options""" - if not hasattr(ssl, 'PROTOCOL_SSLv2'): - raise unittest.SkipTest('No SSLv2 available') if test_support.verbose: sys.stdout.write("\n") if not hasattr(ssl, 'PROTOCOL_SSLv2'): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Oct 31 20:48:45 2011 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 31 Oct 2011 20:48:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313303=3A_Fix_a_rac?= =?utf8?q?e_condition_in_the_bytecode_file_creation=2E?= Message-ID: http://hg.python.org/cpython/rev/740baff4f169 changeset: 73264:740baff4f169 parent: 73261:0d64d9ac2b78 user: Charles-Fran?ois Natali date: Mon Oct 31 20:47:31 2011 +0100 summary: Issue #13303: Fix a race condition in the bytecode file creation. files: Lib/importlib/_bootstrap.py | 7 +- Python/import.c | 52 ++++-------------------- 2 files changed, 13 insertions(+), 46 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -85,10 +85,11 @@ Be prepared to handle a FileExistsError if concurrent writing of the temporary file is attempted.""" if not sys.platform.startswith('win'): - # On POSIX-like platforms, renaming is atomic - path_tmp = path + '.tmp' + # On POSIX-like platforms, renaming is atomic. id() is used to generate + # a pseudo-random filename. + path_tmp = '{}.{}'.format(path, id(path)) + fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY) try: - fd = _os.open(path_tmp, _os.O_EXCL | _os.O_CREAT | _os.O_WRONLY) with _io.FileIO(fd, 'wb') as file: file.write(data) _os.rename(path_tmp, path) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -1183,42 +1183,6 @@ return co; } -/* Helper to open a bytecode file for writing in exclusive mode */ - -#ifndef MS_WINDOWS -static FILE * -open_exclusive(char *filename, mode_t mode) -{ -#if defined(O_EXCL)&&defined(O_CREAT)&&defined(O_WRONLY)&&defined(O_TRUNC) - /* Use O_EXCL to avoid a race condition when another process tries to - write the same file. When that happens, our open() call fails, - which is just fine (since it's only a cache). - XXX If the file exists and is writable but the directory is not - writable, the file will never be written. Oh well. - */ - int fd; - (void) unlink(filename); - fd = open(filename, O_EXCL|O_CREAT|O_WRONLY|O_TRUNC -#ifdef O_BINARY - |O_BINARY /* necessary for Windows */ -#endif -#ifdef __VMS - , mode, "ctxt=bin", "shr=nil" -#else - , mode -#endif - ); - if (fd < 0) - return NULL; - return fdopen(fd, "wb"); -#else - /* Best we can do -- on Windows this can't happen anyway */ - return fopen(filename, "wb"); -#endif -} -#endif - - /* Write a compiled module to a file, placing the time of last modification of its source into the header. Errors are ignored, if a write error occurs an attempt is made to @@ -1234,15 +1198,13 @@ #ifdef MS_WINDOWS /* since Windows uses different permissions */ mode_t mode = srcstat->st_mode & ~S_IEXEC; #else - mode_t mode = srcstat->st_mode & ~S_IXUSR & ~S_IXGRP & ~S_IXOTH; mode_t dirmode = (srcstat->st_mode | S_IXUSR | S_IXGRP | S_IXOTH | S_IWUSR | S_IWGRP | S_IWOTH); PyObject *dirbytes; #endif -#ifdef MS_WINDOWS int fd; -#else +#ifndef MS_WINDOWS PyObject *cpathbytes, *cpathbytes_tmp; Py_ssize_t cpathbytes_len; #endif @@ -1313,7 +1275,7 @@ return; } cpathbytes_len = PyBytes_GET_SIZE(cpathbytes); - cpathbytes_tmp = PyBytes_FromStringAndSize(NULL, cpathbytes_len + 4); + cpathbytes_tmp = PyBytes_FromStringAndSize(NULL, cpathbytes_len + 6); if (cpathbytes_tmp == NULL) { Py_DECREF(cpathbytes); PyErr_Clear(); @@ -1321,9 +1283,13 @@ } memcpy(PyBytes_AS_STRING(cpathbytes_tmp), PyBytes_AS_STRING(cpathbytes), cpathbytes_len); - memcpy(PyBytes_AS_STRING(cpathbytes_tmp) + cpathbytes_len, ".tmp", 4); - - fp = open_exclusive(PyBytes_AS_STRING(cpathbytes_tmp), mode); + memcpy(PyBytes_AS_STRING(cpathbytes_tmp) + cpathbytes_len, "XXXXXX", 6); + + fd = mkstemp(PyBytes_AS_STRING(cpathbytes_tmp)); + if (0 <= fd) + fp = fdopen(fd, "wb"); + else + fp = NULL; #endif if (fp == NULL) { if (Py_VerboseFlag) -- Repository URL: http://hg.python.org/cpython From amauryfa at gmail.com Mon Oct 3 11:10:12 2011 From: amauryfa at gmail.com (Amaury Forgeot d'Arc) Date: Mon, 03 Oct 2011 09:10:12 -0000 Subject: [Python-checkins] cpython: pyexpat uses the new Unicode API Message-ID: > changeset: 72548:a1be34457ccf > user: Victor Stinner > date: Sat Oct 01 01:05:40 2011 +0200 > summary: > pyexat uses the new Unicode API > > files: > Modules/pyexpat.c | 12 +++++++----- > 1 files changed, 7 insertions(+), 5 deletions(-) > > > diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c > --- a/Modules/pyexpat.c > +++ b/Modules/pyexpat.c > @@ -1234,11 +1234,13 @@ > static PyObject * > xmlparse_getattro(xmlparseobject *self, PyObject *nameobj) > { > - const Py_UNICODE *name; > + Py_UCS4 first_char; > int handlernum = -1; > > if (!PyUnicode_Check(nameobj)) > goto generic; > + if (PyUnicode_READY(nameobj)) > + return NULL; Why is this PyUnicode_READY necessary? Can tp_getattro pass unfinished unicode objects? I hope we don't have to update all extension modules? -- Amaury Forgeot d'Arc From amauryfa at gmail.com Mon Oct 10 22:08:31 2011 From: amauryfa at gmail.com (Amaury Forgeot d'Arc) Date: Mon, 10 Oct 2011 20:08:31 -0000 Subject: [Python-checkins] cpython: Use identifier API for PyObject_GetAttrString. Message-ID: Hi, I carefully read changeset 72848:81380082d216, and I have two remarks: - In Modules/_json.c, line 1126, _Py_identifier(strict) is declared but not used, and there are 5 other possible replacements. - In Objects/typeobject.c, line 6318, it seems that _PyObject_GetAttrId could be used directly -- Amaury Forgeot d'Arc